CMU 10423 Generative AI:lec3(Learning Large Language Models)
文章目录
- 1 概述
- 2 内容摘录
- 2.1 面向对象编程在自动微分系统中的应用和优势
- 1\. 自动微分在深度学习中的重要性
- 2\. 面向对象编程(OOP)如何简化自动微分的实现
- 3\. 展示这种实现方式的优越性
- 2.2 RNN 语言模型的工作流程
- 1. **将所有之前的单词转换为固定长度向量**
- 2. **基于隐状态向量预测下一个单词**
- 3. **模型结构**
- 4. **序列处理方式**
- 2.3 Transformer 语言模型的工作流程
- 核心思想:
- 模型结构:
- 优势:
- 2.4 如何从语言模型中进行采样并有哪些常用策略?
- 1. **基本原理**:
- 2. **采样策略**:
- 3. **采样流程**:
- 4. **采样中的挑战**:
- 总结:
- 2.5 如何通过最大似然估计(MLE)学习 n-gram 语言模型和深度神经网络语言模型的参数,并且两者有何区别?
- 第一张图:n-gram 模型的学习
- 第二张图:深度神经网络语言模型的学习(如RNN-LM, Transformer-LM)
- 重点对比:
- 2.6 RNN 与 Transformer 语言模型的训练与学习对比
- 1. **RNN-LM + Loss**:
- 2. **学习RNN-LM**:
- 缺点:
- 3\. 学习Transformer LM
- 模型结构:
- 目标函数:
- 优势:
- 总结:
- 2.7 语言模型的精度进展历史
- 1. **旁注 (An aside)**:
- 2. **Penn Treebank 数据集上的语言建模测试**:
- 3. **困惑度(Perplexity)的含义**:
- 4. **模型性能的演变**:
- 总结:
- 2.8 为什么计算效率很重要?transformer如何提高计算效率的?
- 1. **为什么效率很重要**:
- 2. **并行化提升效率**:
- 3. **批处理:填充和截断(Padding and Truncation)**:
- 2.9 Tokenization(将文本数据转换为模型可处理的格式)策略与优缺点分析
- 1. **基于单词的Tokenization(Word-based Tokenizer)**:
- 2. **基于字符的Tokenization(Character-based Tokenizer)**:
- 3. **基于子词的Tokenization(Subword-based Tokenizer)**:
- 总结:
- 3 阅读材料(RNN, LSTM,GPT 1,GPT 2)
- 3.1 Generating Sequences With Recurrent Neural Networks(2014)
- 3.2 Recurrent neural network based language model (2010)
- 1. **引言**:
- 2. **递归神经网络 vs 前馈神经网络**:
- 3. **模型描述**:
- 4. **模型对比**:
- 5. **实验结果**:
- 6. **扩展与未来工作**:
- 7. **主要结论**:
- 3.3 GPT1 、GPT2
1 概述
文件的主要内容是关于大型语言模型(LLMs)的学习过程,涵盖了预训练、微调和解码的各个方面。以下是一些关键主题的概述:
- 大型语言模型的学习框架:该讲义从深度学习和语言建模的基本概念出发,介绍了语言模型的训练步骤,包括如何计算梯度以及如何通过优化目标函数进行训练。
- 递归神经网络(RNN)和Transformer模型:讲解了RNN语言模型和Transformer语言模型的工作原理,包括前向传播和反向传播算法,以及如何利用这些模型进行文本的生成和预测。
- 损失函数和SGD训练:讨论了如何定义神经网络中的损失函数,以及如何通过随机梯度下降(SGD)来优化模型参数。
- Transformer的高效并行化:该部分重点介绍了Transformer模型中如何通过并行化技术(如批处理、矩阵乘法等)提高训练效率,这是Transformers成功的关键之一。
- 分词技术:讲述了不同类型的分词器(如基于单词、字符和子词的分词器)的优缺点,以及在语言模型中如何进行有效的分词。
- 贪婪解码和采样技术:介绍了语言模型中的解码策略,包括贪婪搜索和采样方法,用于生成合理的输出序列。
文件以深度学习和语言建模为基础,探讨了如何通过先进的优化和并行化技术来提升模型的训练效率。
2 内容摘录
2.1 面向对象编程在自动微分系统中的应用和优势
1. 自动微分在深度学习中的重要性
- 自动微分(AutoDiff)是深度学习中计算梯度的核心工具。作者强调了自动微分在神经网络训练中的关键作用,即它通过前向传播计算输出,然后通过反向传播计算梯度,帮助优化网络参数。
2. 面向对象编程(OOP)如何简化自动微分的实现
- 作者展示了如何通过面向对象的编程思想,简化神经网络模块(如激活函数、全连接层、损失函数)的实现。每个模块都有自己的前向传播和反向传播方法,通过封装每个模块的行为,自动生成计算图,并通过拓扑排序执行反向传播,省去手动实现复杂的梯度计算。
3. 展示这种实现方式的优越性
- 最后,作者通过这种模块化设计,展示了如何自动化反向传播计算,极大地简化了深度学习模型的构建和训练流程。这种方法提高了代码的可读性、可维护性,同时减少了手动计算梯度时可能出现的错误。
总结来说,作者希望通过这个部分向读者传达:面向对象的自动微分实现不仅能够有效地处理复杂的计算图,还能提高深度学习框架的灵活性和可扩展性。
2.2 RNN 语言模型的工作流程
其关键思想如下:
1. 将所有之前的单词转换为固定长度向量
- RNN 通过递归的方式,将输入序列(如句子中的每个单词)转换为一个固定长度的隐状态向量 h t h_t ht。这些隐状态向量累积了前面的所有单词信息。
2. 基于隐状态向量预测下一个单词
- 该模型根据前一时刻的隐状态向量 h t h_t ht,定义条件概率分布 p ( w t ∣ f θ ( w t − 1 , . . . , w 1 ) ) p(w_t | f_{\theta}(w_{t-1}, ..., w_1)) p(wt∣fθ(wt−1,...,w1)),从而预测当前时刻 t t t下的单词。
3. 模型结构
- 在图片中,每个单词从句子的起点 S T A R T START START依次输入到网络中,生成相应的隐状态 h 1 , h 2 , . . . , h 7 h_1, h_2, ..., h_7 h1,h2,...,h7。
- 每个隐状态都被用来预测下一个单词的概率分布,从而逐步生成整个句子。
4. 序列处理方式
- RNN 模型将序列中的每个词进行处理,并使用过去的词来更新当前的隐状态。通过这种方式,模型能够处理不定长度的输入文本,同时保留之前上下文信息,用于后续预测。
简而言之,RNN语言模型的关键是将序列中的所有前置词汇转换为固定长度的向量,并通过这个向量来预测当前的词汇,使得模型能够基于上下文进行语言建模。
2.3 Transformer 语言模型的工作流程
Transformer Language Model 是对序列建模的一种改进模型,它相较于 RNN 语言模型,提供了更好的并行计算能力和处理长距离依赖的能力。
核心思想:
- 每一层由多个子层组成:
-
自注意力机制(Self-Attention):每个单词的表示不仅依赖于其前面的单词,还依赖于整个序列中的所有单词。通过这种机制,模型能够捕获序列中任意两个词之间的关系,而无需按顺序处理。
-
前馈神经网络(Feed-Forward Neural Network, FFN):在每个时间步,使用标准的前馈神经网络对每个位置的表示进行独立的处理。
-
层归一化(Layer Normalization):对每一层的输出进行归一化,以确保模型训练更稳定。
-
残差连接(Residual Connections):在每层自注意力机制和前馈神经网络之间使用残差连接,以防止梯度消失并加速训练。
-
并行处理序列:
- 与 RNN 不同,Transformer 可以并行处理输入序列中的所有单词,而不是逐个处理每个单词。这一特性大大提升了计算效率。
- 每个隐藏向量不仅能够"看"到当前时间步的信息,还能够通过自注意力机制,"看到"前后时间步的信息,从而捕获序列中的长距离依赖。
-
解码过程中每个词依赖于之前的词:
- 虽然在训练过程中,所有单词是并行处理的,但在解码过程中,模型在生成每个词时依然需要依赖之前生成的词。
模型结构:
在 Transformer 中,输入序列首先通过嵌入层,将每个单词转换为向量表示,然后经过多个 Transformer 层(通常为多层堆叠的注意力和前馈层)。每层中的注意力机制帮助模型关注序列中的不同位置,前馈层进一步处理这些信息。
优势:
- 更高的并行化:由于 Transformer 不是像 RNN 那样依赖序列顺序,因此可以同时处理输入序列中的所有单词,提升了并行化计算的效率。
- 处理长距离依赖:通过自注意力机制,模型能够轻松捕捉到远距离单词之间的关系,而不受像 RNN 那样的梯度消失问题的困扰。
总的来说,Transformer 模型通过引入自注意力机制和并行计算,大幅度提升了模型处理长序列和复杂依赖关系的能力,成为目前语言模型的主流架构。
2.4 如何从语言模型中进行采样并有哪些常用策略?
Sampling from a Language Model 指的是从训练好的语言模型中生成文本或序列。这个过程的关键在于如何从模型的条件概率分布中选择下一个单词(或字符)。以下是采样过程的详细介绍:
1. 基本原理:
- 语言模型通过条件概率分布 p ( w t ∣ w 1 , w 2 , … , w t − 1 ) p(w_t | w_1, w_2, \dots, w_{t-1}) p(wt∣w1,w2,…,wt−1)来生成下一个词 w t w_t wt,其中 w 1 , w 2 , … , w t − 1 w_1, w_2, \dots, w_{t-1} w1,w2,…,wt−1是已经生成的词汇。
- 采样就是从这个条件概率分布中选取一个词汇作为当前步骤的输出。然后,将生成的词汇作为输入继续生成下一个词。
2. 采样策略:
有几种常用的策略来决定从语言模型中采样下一个词:
-
贪婪搜索(Greedy Search):
- 每次选择概率分布中概率最大的词。
- 优点:简单,能够生成合理的句子。
- 缺点:可能会导致模型总是选择常见词,导致生成的文本缺乏多样性和创造性。
-
随机采样(Random Sampling):
- 按照条件概率分布直接采样下一个词,即每个词被选择的概率与其预测的概率成正比。
- 优点:能生成更具创造性的内容,保留文本的多样性。
- 缺点:由于完全是随机采样,可能生成不合理的句子或不连贯的内容。
-
束搜索(Beam Search):
- 在每个时间步保留多个可能的词(而非一个),并追踪这些路径的总概率,最终选择概率最高的完整序列。
- 优点:通过保留多种路径,能够在生成时保持合理性和多样性之间的平衡。
- 缺点:计算量较大,随着束的大小增加,计算成本也增加。
-
温度调节(Temperature Sampling):
- 引入温度参数 T T T来控制采样的多样性。通过将条件概率分布中的每个概率值 p ( w t ) p(w_t) p(wt)替换为 p ( w t ) 1 / T p(w_t)^{1/T} p(wt)1/T,然后重新归一化。
- 温度较低(如接近0):更接近贪婪搜索,模型趋向于选择概率最大的词,生成的句子更保守。
- 温度较高(如大于1):增加生成的不确定性,模型可能选择低概率的词,生成更多样化但可能不连贯的文本。
-
Top-k采样和Top-p采样:
- Top-k采样:只从前k个最高概率的词汇中随机选择,而忽略其他词。
- Top-p(核采样):动态选择前若干个词,使这些词的概率总和达到阈值 p p p,从而只从这些最可能的词中采样。
- 优点:这两种策略都可以平衡生成的多样性和合理性,避免生成低概率、不合理的词汇。
3. 采样流程:
- 初始输入为特殊的起始标记(如
START
),模型基于这个输入生成第一个单词的条件概率分布。 - 通过某种采样策略选择第一个单词。
- 将生成的第一个单词作为输入,再次生成下一个单词的概率分布,重复这个过程,直到生成结束标记(如
END
),或者达到最大序列长度。
4. 采样中的挑战:
- 生成质量与多样性之间的权衡:贪婪搜索可能生成常见的句子,缺乏创新,而纯随机采样可能会生成不连贯的内容。结合如温度调节、Top-k和Top-p采样的方法有助于平衡生成的多样性和连贯性。
- 长序列依赖:在生成较长的序列时,模型需要保留上下文信息,否则可能会生成不连贯的句子。像Transformer这样的模型由于其自注意力机制,较好地解决了这个问题。
总结:
从语言模型采样是一种生成文本的过程,通过各种策略可以生成不同风格的文本。不同的采样方法有各自的优缺点,具体使用哪种方法取决于生成内容的场景需求以及对文本质量和多样性的要求。
2.5 如何通过最大似然估计(MLE)学习 n-gram 语言模型和深度神经网络语言模型的参数,并且两者有何区别?
这两张图详细介绍了如何学习语言模型,尤其是通过最大似然估计(MLE)来优化语言模型的参数。图中对比了n-gram语言模型和**深度神经网络语言模型(如RNN-LM、Transformer-LM)**的学习方式。
第一张图:n-gram 模型的学习
- 问题:如何学习 n-gram 模型的概率?
-
我们需要知道给定上下文时,某个单词出现的概率。n-gram 模型通过上下文(如前面两个词)来预测当前词的概率。
-
回答:从数据中学习!
- n-gram 模型通过统计大量语料中 n-gram 出现的频率来学习概率分布。例如:
- 如果我们有句子 “cows eat grass”,那么上下文 “cows eat” 可以对应多个可能的下一个词,如 “grass” 或 “corn”。
- 我们通过计数所有类似上下文中的下一个词出现的次数,计算这些词的概率。
- n-gram 模型通过统计大量语料中 n-gram 出现的频率来学习概率分布。例如:
-
示例:给定上下文 cows eat
- 通过统计,我们可以知道以下词的概率:
- “corn” 出现了 4 次,概率为 4 11 \frac{4}{11} 114。
- “grass” 出现了 3 次,概率为 3 11 \frac{3}{11} 113。
- 其他单词如 “hay”、“if”、“which” 也有各自的概率。
- 因此,在模型中给定 “cows eat” 的情况下,模型会根据这些概率决定下一个词可能是什么。
- 通过统计,我们可以知道以下词的概率:
-
MLE(最大似然估计)方法:
- MLE 是一种统计方法,旨在找到使观测数据最有可能的参数值。在 n-gram 模型中,我们通过以下步骤得到最大似然估计:
- 写出 n-gram 模型下句子的似然函数(即给定上下文下词语出现的概率)。
- 对这个似然函数求导数,并设置为0,求得最优的概率分布。
- 解决概率分布使得所有概率之和为1的约束条件,最后得到n-gram的模型参数。
- MLE 是一种统计方法,旨在找到使观测数据最有可能的参数值。在 n-gram 模型中,我们通过以下步骤得到最大似然估计:
第二张图:深度神经网络语言模型的学习(如RNN-LM, Transformer-LM)
- 问题:如何学习深度神经网络语言模型的概率?
-
深度神经网络语言模型(如 RNN-LM 和 Transformer-LM)也试图预测下一个词的概率。然而,与 n-gram 模型不同,深度神经网络能够学习到更加复杂的上下文依赖关系,并且不只局限于两个词的上下文(n-gram的限制)。
-
回答:依然使用 MLE,但步骤不同!
- 在深度神经网络语言模型中,我们依然可以使用最大似然估计(MLE)来学习模型的参数。
- 然而,与 n-gram 模型不同,深度神经网络模型的似然函数不能通过简单的计数得到闭合形式解(即不能直接通过数学公式解决)。
- 因此,我们使用不同的步骤来找到模型的参数:
-
深度神经网络语言模型的 MLE 步骤:
- 写出似然函数:我们写出深度神经网络下每个句子的似然函数,类似于 n-gram 模型,但这是基于复杂的神经网络结构。
- 计算梯度:由于无法直接求解似然函数的最大值,我们使用自动微分(AutoDiff)来计算似然函数相对于模型参数的梯度。自动微分帮助我们反向传播误差并更新模型的权重。
- 使用优化器更新参数:我们沿着负梯度方向更新模型参数,常用的方法是小批量随机梯度下降(Mini-batch SGD)。这是深度学习中常见的优化过程。
-
总结:与 n-gram 模型的不同:
- 在 n-gram 模型中,所有的概率分布可以通过简单的计数得到,并且通过设置似然函数的导数为零来直接解决参数。
- 而在深度神经网络语言模型中,由于模型的复杂性,参数不能通过闭合形式直接求解。我们必须通过梯度下降法和自动微分技术逐步调整模型的参数,使其拟合训练数据。
重点对比:
- n-gram 模型:通过统计词频来计算最大似然估计,得到词汇出现的概率。步骤比较直接,使用简单的计数方法。
- 深度神经网络模型:使用神经网络和复杂的梯度下降方法,无法直接统计得到概率,而是通过反向传播和自动微分来学习模型参数。
这两张图的核心就是解释如何通过最大似然估计(MLE)来优化 n-gram 语言模型和深度神经网络语言模型的参数,并展示了它们在实现方式上的差异。
2.6 RNN 与 Transformer 语言模型的训练与学习对比
1. RNN-LM + Loss:
RNN语言模型(RNN-LM)用于基于之前的词汇序列来预测下一个词。模型的主要思想是生成隐藏状态 h t h_t ht并使用该状态预测当前词的条件概率。
步骤:
- 输入序列:例如,输入一个句子 “The bat made noise at night”。
- 生成隐藏状态:RNN根据之前时间步的隐藏状态 h t − 1 h_{t-1} ht−1和当前输入词 x t x_t xt,生成新的隐藏状态 h t h_t ht。
h t = σ ( W h x ⋅ x t + W h h ⋅ h t − 1 + b h ) h_t = \sigma(W_{hx} \cdot x_t + W_{hh} \cdot h_{t-1} + b_h) ht=σ(Whx⋅xt+Whh⋅ht−1+bh)
其中, σ \sigma σ是激活函数。
- 计算输出概率:通过 softmax 函数计算当前词的概率分布:
y t = softmax ( W h y ⋅ h t + b y ) y_t = \text{softmax}(W_{hy} \cdot h_t + b_y) yt=softmax(Why⋅ht+by)
- 交叉熵损失:使用交叉熵损失函数度量模型的预测输出与真实标签之间的差距:
ℓ t = − ∑ k = 1 K y t ∗ ( k ) log ( y t ( k ) ) \ell_t = - \sum_{k=1}^{K} y^*_t(k) \log(y_t(k)) ℓt=−k=1∑Kyt∗(k)log(yt(k))
其中, y t ( k ) y_t(k) yt(k)是模型预测的类别 k k k的概率, y t ∗ ( k ) y_t^*(k) yt∗(k)是真实标签。
- 总损失:对所有时间步的损失进行求和,得到句子的总损失:
ℓ = ∑ t = 1 T ℓ t \ell = \sum_{t=1}^{T} \ell_t ℓ=t=1∑Tℓt
这个总损失将用于模型的反向传播和参数优化 。
2. 学习RNN-LM:
为了学习RNN-LM,我们的目标是最大化给定训练数据下的似然函数。训练数据 D D D通常是包含多个句子的序列集合,例如 D = { w ( 1 ) , w ( 2 ) , … , w ( N ) } D = \{w^{(1)}, w^{(2)}, \dots, w^{(N)}\} D={w(1),w(2),…,w(N)}。
目标函数:
- 对于RNN-LM,目标函数通常是训练样本的对数似然,也就是对每个句子的概率取对数求和:
J ( θ ) = ∑ i = 1 N log p θ ( w ( i ) ) J(\theta) = \sum_{i=1}^{N} \log p_\theta(w^{(i)}) J(θ)=i=1∑Nlogpθ(w(i))
其中, θ \theta θ是模型参数, w ( i ) w^{(i)} w(i)是训练数据中的第 i i i个句子。
训练过程:
- 使用随机梯度下降(SGD)或其他优化器来更新模型参数,逐步最小化损失。每次小批量训练样本被输入模型,计算其对应的损失,并使用反向传播计算梯度,更新参数。
- Log-likelihood的分解:由于每个句子的概率可以分解为每个时间步下的条件概率,因此目标函数的计算可以通过递归的方式进行:
log p ( w ) = log p ( w 1 ∣ h 1 ) + log p ( w 2 ∣ h 2 ) + ⋯ + log p ( w T ∣ h T ) \log p(w) = \log p(w_1 | h_1) + \log p(w_2 | h_2) + \dots + \log p(w_T | h_T) logp(w)=logp(w1∣h1)+logp(w2∣h2)+⋯+logp(wT∣hT)
其中 h t h_t ht是第 t t t个时间步的隐藏状态。
- 优化过程:通过 mini-batch SGD 或其他优化算法,迭代调整模型参数,最大化对数似然,提升模型性能 。
缺点:
- RNN 依赖于顺序处理,难以并行化,并且在处理长序列时,容易出现梯度消失或爆炸问题。
3. 学习Transformer LM
Transformer 语言模型通过并行处理整个输入序列,不像 RNN-LM 逐步处理,因此在训练效率和捕捉长距离依赖方面表现更优。
模型结构:
- 自注意力机制:Transformer 使用自注意力机制,使得每个词都能与序列中的其他词交互。这种机制允许模型捕捉长距离依赖,并行处理输入序列。
- 前馈神经网络:在每层中,Transformer 还包含一个前馈神经网络,用于进一步处理词的表示。
目标函数:
- 与 RNN-LM 类似,Transformer-LM 通过最大化对数似然来训练模型:
log p ( w ) = log p ( w 1 ∣ h 1 ) + log p ( w 2 ∣ h 2 ) + ⋯ + log p ( w T ∣ h T ) \log p(w) = \log p(w_1 | h_1) + \log p(w_2 | h_2) + \dots + \log p(w_T | h_T) logp(w)=logp(w1∣h1)+logp(w2∣h2)+⋯+logp(wT∣hT)
- 损失函数:同样使用交叉熵损失来衡量预测的概率分布与真实标签之间的差异。
优势:
- 并行处理:Transformer 可以同时处理输入序列中的所有词,因此训练速度更快。
- 长距离依赖:自注意力机制能够有效捕捉长距离依赖,而不会像 RNN 那样出现梯度消失的问题。
总结:
- **RNN-LM **通过顺序处理来预测下一个词的概率,使用递归结构生成隐藏状态,但无法很好地并行化,处理长序列时可能性能下降。
- **Transformer-LM **使用自注意力机制和前馈神经网络并行处理整个输入序列,能够高效捕捉长距离依赖关系,并且具有更高的训练效率。
2.7 语言模型的精度进展历史
这张图片展示了语言模型的发展,尤其是Transformer 模型的兴起,并通过在 Penn Treebank 数据集上的测试困惑度(test perplexity)来衡量模型的表现。以下是图片的主要内容和解释:
1. 旁注 (An aside):
- 当前最先进的语言模型(State-of-the-art language models):当前的先进语言模型大多依赖于 Transformer 网络,例如 GPT-2 和 GPT-3。这表明 Transformer 架构在语言建模任务中的主导地位。
- 早期的语言模型(RNN-LMs):早期的语言模型大多基于递归神经网络(如 LSTM),这些早期模型为当前的先进架构奠定了基础。
2. Penn Treebank 数据集上的语言建模测试:
- 该图展示了不同语言模型在 Penn Treebank 数据集上的测试结果,特别是关注模型的困惑度(perplexity)。困惑度越低,表示模型在预测下一个词时的表现越好。
- 图中从 2014 年的 LSTM 到 2020 年的 GPT-3,可以看到困惑度逐渐下降,反映了语言模型性能的稳步提升。图中的不同点代表了不同模型的性能:
- LSTM(2014 年):这是较早期的递归神经网络模型。
- AWD-LSTM、GPT-2、BERT:随着时间推移,基于 Transformer 的模型逐渐取代了传统的 RNN 模型。
- GPT-3:作为目前最先进的语言模型之一,GPT-3(特别是 Zero-Shot 版本)展示了极低的困惑度,说明它具有强大的语言理解和生成能力。
3. 困惑度(Perplexity)的含义:
- 困惑度衡量的是语言模型对测试数据的预测能力。它与对数似然相关,较低的困惑度表示模型在给定上下文时更能准确地预测下一个词。
- 困惑度公式与对数似然的关系可以在左侧看到,图中标注了“ − log p ( w ) -\log p(w) −logp(w)”的公式,它表示的是预测一个单词的对数概率的负数,反映了模型的不确定性。
4. 模型性能的演变:
- 从图中可以看出,随着时间的推移,语言模型的困惑度逐渐降低,特别是从 2017 年 Transformer 出现之后,性能有了显著提升。RNN 模型曾经占据主导地位,但随着 Transformer 模型的引入,基于自注意力机制的模型显著提高了语言建模的性能。
总结:
这张图片说明了语言模型从早期的 RNN-LM(如 LSTM)逐渐演变为以 Transformer 为主的模型(如 GPT 系列),并展示了这些模型在 Penn Treebank 数据集上的困惑度测试结果。随着 Transformer 架构的引入,语言模型的性能显著提升,困惑度显著下降,反映了现代语言模型的高效性和准确性。
2.8 为什么计算效率很重要?transformer如何提高计算效率的?
Efficient Transformers(高效Transformer) 这一部分主要介绍了使Transformer模型在大规模训练时更加高效的策略。这些技术对处理像GPT-3这样拥有数十亿参数的大型模型至关重要,因为这些模型需要处理海量数据和复杂的计算。以下是详细介绍:
1. 为什么效率很重要:
-
现代大型语言模型(如GPT-3)的规模极其庞大,GPT-3拥有:
- 5000亿个训练样本(tokens)
- 1750亿个参数
- 需要50 petaflop/s-days(50百万亿次浮点运算)的计算量
-
为了能够在合理的时间内完成如此庞大的计算,提升模型的计算效率是至关重要的。
2. 并行化提升效率:
- Transformer的结构天生适合并行计算,允许在多个计算单元中同时处理不同的任务。以下是一些关键的并行化技术:
- 批处理(Batching):与一次处理一个句子不同,Transformer可以同时处理一个批次(B个句子)的数据。每个句子在批次中的处理方式是相同的,这样可以方便地实现并行计算。
- 缩放点积注意力机制(Scaled Dot-Product Attention):在注意力机制中,不同时间步的注意力分数是独立计算的,因此可以并行化操作。
- 多头注意力机制(Multi-headed Attention):每个注意力头(head)都是独立计算的,这进一步提高了并行计算的效率。
- 矩阵乘法:注意力机制的核心操作是矩阵乘法,现代硬件(如GPU和TPU)对矩阵乘法有很强的优化支持,因此能够非常高效地完成。
- 模型并行化(Model Parallelism):对于像GPT-3这样的大模型,模型可以被分割到多个GPU或机器上进行计算,从而分摊计算负荷。
- 键值缓存(Key-value Caching):在自回归解码任务中(如文本生成),注意力机制会缓存并复用已经计算过的键和值向量,但查询向量、相似度分数和注意力权重则不缓存,这样减少了存储和计算负担。
3. 批处理:填充和截断(Padding and Truncation):
- 在批处理多个句子时,不同的句子长度通常不同,因此在批处理之前需要进行以下操作:
- 截断:对于超出最大长度的句子,进行截断处理。
- 填充:对于长度较短的句子,使用填充标记(如
<PAD>
)补齐长度,使得一个批次中的所有句子长度相同,从而方便并行计算。
2.9 Tokenization(将文本数据转换为模型可处理的格式)策略与优缺点分析
1. 基于单词的Tokenization(Word-based Tokenizer):
- 优点:简单、直观。每个单词都会成为一个独立的token。
- 缺点:
- 词汇表规模问题:词汇表会很大,难以计算和处理。
- 相似单词表示不同:例如,“transformers” 和 “transformer” 虽然是相似的词,但可能被分配了完全不同的表示。
- OOV问题:拼写错误或未收录的单词(out-of-vocabulary,OOV)无法处理,会被标记为未知()。
示例:输入句子“Henry is giving a lecture on transformers”被标记为:
["henry", "is", "giving", "a", "lecture", "on", "transformers"]
OOV示例:句子“Henry is givin’ a lectrue on transformers”会包含OOV标记:
["henry", "is", <OOV>, "a", <OOV>, "on", "transformers"]
2. 基于字符的Tokenization(Character-based Tokenizer):
-
优点:词汇表大大减少,适合处理拼写错误等问题。
-
缺点:
- 丢失了很多语义信息,因为每个字符成为一个token,导致序列变得非常长。
- 计算开销大,特别是在处理长句子时。
-
示例:句子“Henry is givin’ a lectrue on transformers”被标记为:
["h", "e", "n", "r", "y", "i", "s", "g", "i", "v", "i", "n", "’", "a", "l", "e", "c", "t", "r", "u", "e", "o", "n", "t", "r", "a", "n", "s", "f", "o", "r", "m", "e", "r", "s"]
3. 基于子词的Tokenization(Subword-based Tokenizer):
-
优点:
- 能够将长或罕见的单词分割为更小的、语义上有意义的子词。
- 没有OOV问题,任何单词都可以通过组合其他子词构造出来。
-
示例算法:常见的子词分割算法有Byte-Pair-Encoding(BPE)、WordPiece、SentencePiece。
-
示例:句子“Henry is givin’ a lectrue on transformers”被标记为:
["henry", "is", "giv", "##in", "‘", "a", "lec", "##true", "on", "transform", "##ers"]
总结:
不同的tokenization策略适合不同的应用场景。基于单词的方式简单易用,但有词汇表规模和OOV问题;基于字符的方式解决了OOV问题,但丢失了太多语义信息;基于子词的方式在效率和词汇覆盖之间达到了平衡,是现代NLP模型中最常用的策略。
3 阅读材料(RNN, LSTM,GPT 1,GPT 2)
3.1 Generating Sequences With Recurrent Neural Networks(2014)
https://arxiv.org/pdf/1308.0850
**《使用递归神经网络生成序列》**由 Alex Graves 撰写,探讨了如何有效利用长短期记忆(LSTM)网络进行序列生成。以下是每个主要章节的概述:
- 介绍:介绍了递归神经网络(RNN),尤其是LSTM,在处理文本和手写生成任务中的优势,解决了长程依赖问题。
- 预测网络:解释了LSTM架构及其在处理长程依赖中的角色,模型通过递归结构逐步学习输入数据来预测序列。
- 文本预测:侧重于文本生成任务,比较了单词级和字符级模型。实验展示了LSTM在 Penn Treebank 和 Wikipedia 数据集上学习文本结构并预测长序列的能力。字符级模型允许更具创造性的输出,包括生成新词。
- 手写预测:探讨了真实值序列预测,模型能够生成逼真的手写样本。LSTM 在 IAM 手写数据集上训练,显示出不仅可以学习字母,还能学习个人写作风格。
- 手写合成:扩展网络,通过将模型与文本输入结合,生成手写体样式。该部分讨论了生成连笔手写体,系统能够灵活生成不同的手写风格。
该论文展示了LSTM在长程序列预测任务中的优势,并探讨了动态评估和正则化技术的应用,以提高模型的泛化能力。
3.2 Recurrent neural network based language model (2010)
https://pdfs.semanticscholar.org/bba8/a2c9b9121e7c78e91ea2a68630e77c0ad20f.pdf
**《基于递归神经网络的语言模型》**由 Tomas Mikolov 撰写,详细描述了递归神经网络(RNN)如何超越传统的 N-gram 语言模型,尤其是在长序列的语言建模中。以下是论文的详细整理:
1. 引言:
- 神经网络语言模型优于传统的 N-gram 模型,因为它能自动将词映射到低维空间,类似的词会被自动聚类在一起。
- 通过反向传播进行训练,平滑操作在模型内部隐式完成。
2. 递归神经网络 vs 前馈神经网络:
- 在前馈神经网络中,历史是通过固定的 N-1 词上下文表示,类似于 N-gram 模型。
- 递归神经网络通过循环连接的神经元表示历史,其历史长度理论上是无限的。
- RNN 可以学习将整个历史压缩到低维空间,而前馈网络只能压缩单词上下文。
- RNN 具有短期记忆的能力,能够更好地处理位置不变性(如词语顺序的变化),这在前馈网络中是无法实现的。
3. 模型描述:
- RNN 的基本架构由输入层 x x x、隐藏层 s s s(也称为上下文层或状态)和输出层 y y y组成。
- 输入向量 x ( t ) x(t) x(t)是当前词汇的向量与上一个时间步的隐藏层输出 s ( t − 1 ) s(t-1) s(t−1)的组合。
- 为了提高性能,通常将低频词汇合并成一个通用的token。
4. 模型对比:
- PPL (Perplexity) 是衡量语言模型性能的标准。实验结果显示:
- 5-gram 模型:93.7
- 前馈神经网络:85.1
- 递归神经网络:80.0
- 组合多个 RNN 模型和 5-gram 模型:73.5
5. 实验结果:
-
在 Wall Street Journal 数据集上的实验显示,较大规模的 RNN 网络取得了最佳效果。具体结果为:
- RNN + KN (Kneser-Ney 平滑) 组合比单独的 RNN 或 KN 模型表现更好。
-
在语音识别(ASR)任务中,动态和静态的 RNN 组合也带来了显著的性能提升。
6. 扩展与未来工作:
- 动态语言模型:论文提出了一种动态语言模型,模型在测试过程中能够自适应地更新参数。这种方法在开发集上提升了性能,但在评估集上略有退步,推测是因为测试数据需要保持句子的自然顺序。
- 字符级语言模型:实验表明,简单的RNN能够学习更长的上下文信息,但超过5-6个词的上下文时性能开始下降。通过时间反向传播(BPTT)算法,RNN 的性能得到了显著提升。
- 未来工作:包括加速训练的词汇聚类技术、并行计算的实现以及更大规模的数据集实验。
7. 主要结论:
- RNN 是当前最简单、最智能的语言模型之一,尤其在 ASR 和机器翻译任务中有显著优势。
- 该研究为机器学习、数据压缩和语言建模之间的联系提供了新的理解,并展示了 RNN 模型在训练速度和性能上的潜力。
通过这篇论文,Mikolov 展示了 RNN 在语言建模任务中的强大能力,并探讨了其未来发展的方向。
3.3 GPT1 、GPT2
这个2篇阅读材料是GPT1和GPT2的原论文,这个有点重要,后续专精整理一下。