大语言模型的预训练[1]:基本概念原理、神经网络的语言模型、Transformer模型原理详解、Bert模型原理介绍
大语言模型的预训练[1]:基本概念原理、神经网络的语言模型、Transformer模型原理详解、Bert模型原理介绍
1.大语言模型的预训练
1.LLM预训练的基本概念
预训练属于迁移学习的范畴。现有的神经网络在进行训练时,一般基于反向传播(Back Propagation,BP)算法,先对网络中的参数进行随机初始化,再利用随机梯度下降(Stochastic Gradient Descent,SGD)等优化算法不断优化模型参数。而预训练的思想是,模型参数不再是随机初始化的,而是通过一些任务进行预先训练,得到一套模型参数,然后用这套参数对模型进行初始化,再进行训练。
预训练将大量低成本收集的训练数据放在一起,经过某种预训练的方法去学习其中的共性,然后将其中的共性 “移植” 到特定任务的模型中,再使用相关特定领域的少量标注数据进行 “微调”。因此,模型只需要从“共性” 出发,去 “学习” 该特定任务的 “特殊” 部分。
例如:让一个完全不懂英文的人去做英文法律文书的关键词提取的工作会完全无法进行,或者说他需要非常多的时间去学习,因为他现在根本看不懂英文。但是,如果让一个英语为母语但没接触过此类工作的人去做这项任务,他可能只需要相对比较短的时间学习如何去提取法律文书的关键词就可以上手这项任务。在这里,英文知识就属于 “共性” 的知识,这类知识不必要只通过英文法律文书的相关语料进行学习,而是可以通过大量英文语料,不管是小说、书籍,还是自媒体,都可以是学习资料的来源。在该例中,让完全不懂英文的人去完成这样的任务,这就对应了传统的直接训练方法,而完全不懂英文的人如果在早期系统学习了英文,再让他去做同样的任务,就对应了 “预训练 + 微调” 的思路,系统的学习英文即为 “预训练” 的过程。
大语言模型的预训练是指搭建一个大的神经网络模型并喂入海量的数据以某种方法去训练语言模型。大语言模型预训练的主要特点是训练语言模型所用的数据量够多、模型够大。
1.2 LLM预训练需求
预训练技术被广泛应用于各种机器学习任务,主要是为了解决以下问题:
- 数据稀缺性:在许多任务中,标记数据是很昂贵的,并且难以获取。例如,在自然语言处理领域,需要大量的标注数据才能训练模型。通过使用预训练技术,可以利用未标记的数据来训练模型,从而提高模型的性能和泛化能力;
- 先验知识问题:许多机器学习任务需要模型具备一定的先验知识和常识,例如自然语言处理中的语言结构和规则。通过使用预训练技术,可以让模型在未标记数据上学习这些知识,从而使其在各种任务上表现更好;
- 迁移学习问题:许多机器学习任务之间存在共性,例如自然语言处理中的语义理解和文本分类等。通过使用预训练技术,可以将模型从一个任务迁移到另一个任务,从而提高模型在新任务上的性能;
- 模型可解释性问题:预训练技术可以帮助模型学习抽象的特征,从而提高模型的可解释性。例如,在自然语言处理中,预训练技术可以使模型学习单词和短语的表示,从而提高模型的可解释性。
综上所述,预训练技术可以帮助机器学习模型解决数据稀缺性、先验知识和迁移学习等问题,从而提高模型的性能和可解释性,同时降低训练成本。
1.3 LLM预训练的基本原理
大语言模型预训练采用了 Transformer 模型的解码器部分,由于没有编码器部分,大语言模型去掉了中间的与编码器交互的多头注意力层。如下图所示,左边是 Transformer 模型的解码器,右边是大语言模型的预训练架构
1.3.1 方法
大语言模型预训练是通过上文的词来预测下一个词,属于无监督的预训练。比如,给定一个无监督的语料U={u1,...,un}
,而预训练语言模型是要使得下面式子最大化:
$L1(U)=ΣiP(ui∣ui−k,...,ui−1;Θ)$
即如下图所示,通过上文,来预测下一个单词,属于自回归模型,也叫做 AR 模型。
AR 模型,即指从左往右学习的模型。AR 模型从上文学习,并将上一步的结果作为回归模型的输入,以预测下一个词。在预测时,AR 模型只能看到上文的词,而无法知晓下文的词。AR 模型通常用于生成式任务,尤其是长文本的生成能力很强。
在大语言模型的预训练中,还采用了 in-context learning
技术。为了让模型能够理解人类的意图,与人类的思想对齐,会构造类似这样数据:在句子前加上一个任务(task),同时会给出完成该任务的几个示例。例如,向模型输入 “请将中文翻译成英文。你好,Hello,再见,goodbye,销售,”,然后让模型学习下一个输出 “sell”。通过示例的个数又可以分为:
- few-show learning: 允许输入数条示例和一则任务说明;
- one-shot learning: 只允许输入一条示例和一则任务说明;
- zero-shot learning: 不允许输入任何范例,只允许输入一则任务说明。
zero-shot learning 可以表示为:
p(output∣input,task)
通过引入 in-context learning 技术,使得预训练的大语言模型直接拥有完成特定任务的能力。
1.3.2 训练
下面对大语言模型预训练过程中的批量训练、学习率、优化器和训练稳定性等方面进行讲解。
- 批量训练:对于语言模型的预训练,通常将批量训练的大小(batch_size)设置为较大的数字来维持训练的稳定性。在最新的大语言模型训练中,采用了动态调整批量训练大小的方法,最终在训练期间批量训练大小达到百万规模。结果表明,动态调度批量训练的大小可以有效地稳定训练过程;
- 学习率:大语言模型训练的学习率通常采用预热和衰减的策略。学习率的预热是指模型在最初训练过程的 0.1% 到 0.5% 之间逐渐将学习率提高到最大值。学习率衰减策略在后续训练过程中逐步降低学习率使其达到最大值的 10% 左右或者模型收敛;
- 优化器:Adam 优化器和 AdamW 优化器是常用的训练大语言模型的优化方法,它们都是基于低阶自适应估计矩的一阶梯度优化。优化器的超参数通常设置为:
β1=0.9
、β2=0.95
以及ϵ=10−8
; - 训练稳定性:在大语言模型的预训练期间,经常会遇到训练不稳定的问题,可能导致模型无法继续训练下去。目前,解决这个问题通常采用的方法有正则化和梯度裁。梯度裁剪的阈值通常设为 1.0,正则化系数为 0.1。然而,随着大语言模型规模的扩大,模型的损失函数值更可能会发生突变,导致模型训练的不稳定性。为了解决大语言模型训练稳定性的问题,训练时在发生损失函数的突变后,回溯到上一个保存的模型(checkpoint),并跳过这一部分的训练数据继续进行模型的训练。
1.4LLM预训练的主要优势
大语言模型预训练是一种先通过海量数据进行预训练,然后再进行微调的技术,其目的是提高机器学习算法的性能和效率。大模型预训练的优势主要有以下几点:
- 提高模型的泛化能力:通过大规模预训练,模型可以学习到更多的数据和知识,从而提高其对未知数据的泛化能力;
- 减少训练时间和数据量:预训练可以大幅减少训练时间和数据量,因为预训练的结果可以直接应用到其它任务上,避免了重复训练;
- 提高算法的效率:预训练可以使得算法更加高效,因为预训练的结果可以作为其它任务的初始值,避免从头开始训练的时间和计算资源浪费;
- 支持多种自然语言处理任务:预训练可以应用于各种自然语言处理任务,如文本分类、情感分析、机器翻译等,提高了自然语言处理技术的通用性和可拓展性;
- 提高模型的精度:大模型预训练可以提高模型的精度和性能,从而使得机器学习算法在各种任务上得到更好的表现。
1.5 预训练后续阶段
大语言模型预训练是指采用大量数据喂入大规模模型去训练语言模型,得到初始化的模型参数。随着 ChatGPT 的出现,在完成大语言模型的预训练后,还会采用监督学习、奖励模型以及强化学习进行进一步的微调,叫做 RLHF。预训练后续阶段主要分为三个步骤(如下图所示):
- 步骤 1:SFT 监督微调,训练监督策略模型。在大语言模型的训练过程中,需要标记者参与监督过程;
- 步骤 2:奖励模型训练。借助标记者的人工标注,训练出合意的奖励模型,为监督策略建立评价标准;
- 步骤 3:PPO 强化学习模型训练,采用近端策略优化进行强化学习。通过监督学习策略生成 PPO 模型,将最优结果用于优化和迭代原有的 PPO 模型参数。
2.神经网络的语言模型知识
2.1 基于神经网络的语言模型
鉴于 n-gram 存在的问题,人们开始尝试用神经网络来建立语言模型,提出了如下图所示的前馈神经网络模型(FFNN Language Model,FFNNLM):
它通过学习词的分布式表示来解决维度灾难,使得一个词能够使用一个低维向量(称之为 embedding)表示。从整体上看,上述模型属于比较简单而传统的神经网络模型,主要由输入层 - 隐藏层 - 输出层组成,经过前向传播和反向传播来进行训练。
2.1.1 词向量处理
基于神经网络的语言模型的输入层为词向量,词语转化为数字的最简单的形式就是 One-hot(独热编码),简单来说就是假设有一个大小为 V 的固定排序的词表,里边包含 V 个词,假设第二个词是 “电视”,那么用一个维度为 V 的特征向量表达就是 $[0,1,0,0,⋯ ,0]$,即该词语在词表中的位置对应在特征向量中的位置的值为 1,其他位置都为 0。
但 One-hot 编码有一个最大的问题就是数据稀疏问题,当词表很大(比如现在有一个含 80000 个词的词表)时,数据稀疏会让整个计算量都变得很大,且词语之间的关联关系得不到表达。
词向量(Word Embedding)因此应运而生,它不用 One-hot 的稀疏向量来表征这个词,而是用一个低维度的向量来表征这个词,给定一个词表征的矩阵 C,矩阵 C 的维度是 V∗m,即 V 行,m 列。V 是词表的大小,即每一行代表了词表里的一个词;m 是自己定的词向量的维度,比如说对于一个 80000 个词的词表,One-hot 向量要用 80000 维来表征 “电视” 这个词,而词向量用一个 100 维的向量来表征,m 就是 100。
用 “电视” 的 One-hot 向量 $[0,1,0,0,⋯,0]$ 乘上面说的矩阵 C,将得到一个 m 维的向量,即词向量,下图为这个计算过程:
得到上面单个词向量之后,将 n − 1 个词向量做一个全连接,即把这 n − 1 个词向量首尾相接地拼起来得到最终的输入 x:
2.1.2 正向传播
从输入层到隐藏层:词向量 x 作为输入,权重 H 乘以输入加上偏置 d,再加 tanh 函数作激活函数,就得到了隐藏层:tanh(d+Hx)。
从隐藏层到输出层:先计算由隐藏层到输出层未归一化的输出值 y1,这里是一个简单的线性变化:$y1 = Utanh(d+Hx)+b1$。这里的 U 是隐藏层到输出层的参数,b1 代表这一部分的偏置项。
从输入层到输出层:从输入层到输出层的直连,也是一个线性变换。这一部分的输出值 y2 可以表示为: $y2=Wx+b2$。W 和 b2 分别是这一部分的权重和偏置项。
输出层:由上面的两部分输出值可以得到最终的 y:$y = y1+y2 = b+Wx+Utanh(d+Hx)$
再将 y 经过一个 $softmax$ 函数做概率归一化,便能得到一个维度为 V 的概率向量。
模型训练的目标是最大化以下似然函数:
其中$θ=(b,d,W,U,H,C)$,是模型的所有参数,R 是正则化项。
反向传播是根据 loss 值更新参数的过程,这里不再赘述。
2.1.3 模型评价
神经网络语言模型 (NNLM) 通过构建神经网络的方式来探索和建模自然语言内在的依赖关系。优缺点如下:
-
优点:
- 词向量是可以自定义维度的,维度并不会因为新扩展词而发生改变,词向量能够很好的根据特征距离度量词与词之间的相似性;
- 好的词向量能够提高模型泛化能力;
- 相比于 n-gram,通过词向量的降维,减小了参数空间,减少了计算量。
-
缺点:
- 参数较多,模型训练时间长;
- 可解释性较差。
2.2 循环神经网络概述
对于我们已经学过的传统神经网络,它们能够实现分类以及标注任务,但传统神经网络处理具有前后遗存关系的数据时,效果就不是十分理想了。这时不仅需要依赖当前的输入,还需要结合前一时刻或后一时刻的输入作为参考。
循环神经网络的主要用途是处理和预测序列数据。循环神经网络最初就是为了刻画一个序列当前的输出与之前信息的关系。从网络结构上来看,循环神经网络会记忆之前的信息,并利用之前的信息影响后面节点的输出。也就是说,循环神经网络的隐藏层之间的节点是有连接的,隐藏层的输入不仅包含输入层的输出,还包括上一时刻隐藏层的输出。
2.2.1 一般循环神经网络
传统的神经网络结构一般分为三层:输入层、隐藏层、输出层。输入层的输入经过加权计算输出到隐藏层,作为隐藏层的输入。隐藏层再对从输入层得到的输入进行加权计算输入到输出层,最后通过激活函数,由输出层输出最终的结果。
循环神经网络的结构与其十分的相似,都是由输入层、隐藏层和输出层构成,最大的区别在于循环神经网络的隐藏层多了一个自身到自身的环形连接,其结构如下图所示:
其中,x 表示输入层,s 表示隐藏层的输出,o 表示输出层的值。U 是输入 x 特征与隐藏层神经元全连接的权重矩阵,V 则是隐藏层与输出层全连接的权值矩阵。o 的输出由权值矩阵 V 和隐藏层输出 s 决定。s 的输出不仅仅由权值矩阵 U 以及输入 x 来决定,还要依赖于新的权值矩阵 W 以及上一次 s 的输出。其中,W 表示上一次隐藏层的输出到这一次隐藏层输入的权值矩阵,该层被称为循环层。
2.2.2 单向循环神经网络
将一般循环神经如下图所示展开便是单向循环神经网络:
对于单向循环神经网络的结构,你可以理解为网络的输入通过时间进行向后传播。当前隐藏层的输出 st 除了取决于当前的输入层的输入向量 xt 外,还受到上一时刻隐藏层的输出向量 st+1 的影响,因此,当前时刻隐藏层的输出信息包含了之前时刻的信息,表现出对之前信息记忆的能力。可以采用如下公式对单向循环神经网络进行表示:
其中 $ot$ 表示输出层的结果,g 为输出层的激活函数,V 为输出层的权值矩阵。$st$ 表示隐藏层的结果,它由当前时刻的输入层输入 $xt$ 以及上一时刻隐藏层输出 $st−1$ 共同决定,U 表示输入层到隐藏层的权值矩阵,W 为上一时刻的值 $st−1$ 到这一次输入的权值矩阵,f 为隐藏层的激活函数。循环神经网络的递归数学式如下所示:
2.2.3 基于循环神经网络的字符级语言模型
接下来,我们看一下如何使用循环神经网络来构建语言模型。 设小批量大小为 1,批量中的文本序列为 “machine”。为了简化后续部分的训练,我们考虑使用字符级语言模型(character-level language model), 将文本词元化为字符而不是单词。下图演示了如何通过基于字符级语言建模的循环神经网络,使用当前的和先前的字符预测下一个字符。
在训练过程中,对每个时间步的输出层的输出进行 softmax 操作,然后利用交叉熵损失计算模型输出和标签之间的误差。由于隐藏层中隐状态的循环计算上图中的第 3 个时间步的输出 O3 由文本序列 “m”,“a” 和“c”确定。由于训练数据中这个文本序列的下一个字符是 “h”,因此第 3 个时间步的损失将取决于下一个字符的概率分布,而下一个字符是基于特征序列“m”,“a”,“c” 和这个时间步的标签 “h” 生成的。
2.2.4 模型评价
RNN 的优点:
- 能够记忆上一时间的输入信息。
- 处理任意长度的输入。
- 模型形状不随输入长度增加改变形状。
- 权重随时间共享
RNN 的缺点:
- 计算速度慢。
- 难以获取很久以前的信息。
- 无法考虑当前状态的任何未来输入。
- 在 RNN 中经常遇到梯度消失和爆炸现象。
3.Transformer 语言模型实现过程
3.1 Transformer 语言模型简介
Transformer 模型使用 Self-Attention 结构取代在 NLP 任务中常用的 RNN 网络结构。相比 RNN 网络结构,其最大的优点是可以并行计算。Transformer 的整体模型架构如下图所示:
Transformer 本质上是一个 Encoder-Decoder 架构。Transformer 的中间部分可以分为两个部分:编码组件和解码组件。如下图所示:
词向量的输入
Transformer 输入是一个序列数据,以我爱你为例:Encoder 的 inputs 就是 "I LOVE YOU" 分词后的词向量。
输入 inputs embedding 后需要给每个 word 的词向量添加位置编码 positional encoding。
3.1.1 位置编码 positional encoding
一句话中同一个词,如果词语出现位置不同,意思可能发生翻天覆地的变化,例如:我欠他 100 和 他欠我 100。这两句话的意思一个地狱一个天堂。可见获取词语出现在句子中的位置信息是一件很重要的事情。但是 Transformer 的是完全基于 self-Attention,而 self-attention 无法获取词语位置信息,就算打乱一句话中词语的位置,每个词还是能与其他词之间计算 attention 值,就相当于是一个功能强大的词袋模型,对结果没有任何影响。因此在输入的时候需要给每一个词向量添加位置编码。
positional encoding 获取过程:
Transformer 使用的是正余弦位置编码。位置编码通过使用不同频率的正弦、余弦函数生成,然后和对应的位置的词向量相加,位置向量维度必须和词向量的维度一致。过程如上图,PE(positional encoding)计算公式如下:
pos 表示单词在句子中的绝对位置,pos=0,1,2…,例如:YOU 在 "I LOVE YOU" 中的 pos=2;dmodel 表示词向量的维度,在这里 dmodel=512;2i 和 2i+1 表示奇偶性,i 表示词向量中的第几维,例如这里 dmodel=512,故 i=0,1,2…255。
编码组件由多层编码器(Encoder)组成(在此处使用了 6 层编码器)。解码组件也是由相同层数的解码器(Decoder)组成(在此处使用了 6 层)。如下图所示:
3.1.2 Encoder
编码器层的作用:作为编码器的组成单元,每个编码器层完成一次对输入的特征提取过程,即编码过程。
编码器的作用:编码器用于对输入进行指定的特征提取过程也称为编码,由 N 个编码器层堆叠而成。
每个编码器层由两个子层组成:Self-Attention 层(自注意力层)和 Position-wise Feed Forward Network(前馈网络,缩写为 FFN)如下图所示。每个编码器的结构都是相同的,但是它们使用不同的权重参数。
编码器的输入会先流入 Self-Attention 层,它可以让编码器在对特定词进行编码时使用输入句子中的其他词的信息(当翻译一个词时,不仅只关注当前的词,而且还会关注其他词的信息)。然后 Self-Attention 层的输出会流入前馈网络。
解码器也有编码器中这两层,但是它们之间还有一个注意力层(即 Encoder-Decoder Attention),用来帮解码器关注输入句子的相关部分(类似于 seq2seq 模型中的注意力)。如下图所示:
3.1.3 多头注意力机制(Multi-head Attention)
通过添加一种多头注意力机制,进一步完善自注意力层。首先,通过 h 个不同的线性变换对 Query、Key 和 Value 进行映射;然后,将不同的 Attention 拼接起来;最后,再进行一次线性变换。基本结构如下图所示:
每一组注意力用于将输入映射到不同的子表示空间,这使得模型可以在不同子表示空间中关注不同的位置。整个计算过程可表示为:
在多头注意力下,将输入的 X 乘以 WQ、WK 和 WV 矩阵,从而为每组注意力单独生成不同的 Query、Key 和 Value 矩阵。如下图所示:
按照上面的方法,使用不同的权重矩阵进行 8 次自注意力计算,得到 8 个不同的 Z 矩阵。接下来将这 8 个矩阵整合为一个矩阵。具体流程如下:
-
把 8 个矩阵{Z0,Z1,⋯,Z7}拼接。
-
把拼接后的矩阵和一个权重矩阵 WO 相乘。
-
得到最终的矩阵 Z,这个矩阵包含了所有注意力头的信息。这个矩阵会输入到 FFN 层。
3.1.4 Feed-Forward Networks
全连接层是一个两层的神经网络,先线性变换,然后 ReLU 非线性,再线性变换。公式如下:
这里的 x 就是 Multi-Head Attention 的输出 Z,引用上面的例子,那么 Z 是 (2,64) 维的矩阵,假设 W1 是(64,1024),其中 W2 与 W1 维度相反(1024,64),那么按照上面的公式:
FFN(Z)=(2,64)x(64,1024)x(1024,64)=(2,64),发现维度没有发生变化,这两层网络就是为了将输入的 Z 映射到更加高维的空间中 (2,64)x(64,1024)=(2,1024),然后通过非线性函数 ReLU 进行筛选,筛选完后再变回原来的维度。然后经过 Add&Normalize,输入下一个 encoder 中,经过 6 个 encoder 后输入到 decoder。
3.1.5 Decoder
Decoder 的输入分为两类:
一种是训练时的输入,一种是预测时的输入。
训练时的输入:已经对准备好对应的 target 数据。例如翻译任务,Encoder 输入 "I LOVE YOU",Decoder 输入 "我爱你"。
预测时的输入:一开始输入的是起始符,然后每次输入是上一时刻 Transformer 的输出。例如,输入 "",输出"I",输入"I",输出"I LOVE",输入" 我爱 ",输出"I LOVE YOU",输入" 我爱你 ",输出" 我爱你 " 结束。
解码器层的作用:作为解码器的组成单元,每个解码器层根据给定的输入,向目标方向进行特征提取操作,即解码过程。
解码器的作用:根据编码器的结果以及. 上 - 次预测的结果,对下一次可能出现的 “值” 进行特征表示。
3.1.6 Mask(掩码)
Mask 表示掩码,它对某些值进行掩盖,使其在参数更新时不产生效果。Transformer 模型里面涉及两种 mask,分别是 Padding Mask 和 Sequence Mask。其中,Padding Mask 在所有的 scaled dot-product attention 里面都需要用到,而 Sequence Mask 只有在 Decoder 的 Self-Attention 里面用到。
Padding Mask: 由于每个批次输入序列长度不一样,所以要对输入序列进行对齐。具体来说,就是给在较短的序列后面填充 0。但由于填充的位置,对于语句无实际意义,attention 机制不应该把注意力放在这些位置上,所以需要进行一些处理。具体做法是,把这些位置的值加上一个非常大的负数 (负无穷),再经过 softmax,这些位置的概率就会接近 0。
Sequence Mask:Sequence Mask 是为了使得 Decoder 不能看见未来的信息。对于一个序列,在 t 时刻,解码输出只能依赖于 t 时刻之前的输出,而不能依赖 t 之后的输出。因此需要隐藏 t 之后的信息。实现过程为:产生一个上三角矩阵,上三角的值全为 0,将这个矩阵作用在每一个序列上。
3.2 模型评价
-
Transformer 优点:
-
长期依赖性建模:Transformer 模型通过使用自注意力机制(self-attention)可以更好地捕捉长期依赖关系,这对于处理长文本或具有远距离依赖性的任务非常重要。
-
并行计算:Transformer 模型中的自注意力机制和位置编码可以使输入序列的所有位置同时进行处理,这导致模型可以高效地并行计算,加快训练和推理速度。
-
可解释性:相对于传统的循环神经网络(RNN),Transformer 模型在处理序列数据时更具可解释性。由于自注意力机制可以指定每个位置与其他位置的相关性,因此可以更清晰地理解模型对输入的处理过程。
-
模块化架构:Transformer 模型以块(block)为基本单元构建,每个块包含多层自注意力机制和前馈神经网络层。这种模块化的架构使得 Transformer 模型易于修改、扩展和调整,研究人员和开发者可以根据需要自由组合和堆叠块。
-
多语言支持:Transformer 模型的设计使其能够轻松地适应不同的语言,无论是训练还是生成文本。这使得 Transformer 模型在机器翻译和跨语言任务中表现出色。
-
-
Transformer 缺点:
-
学习成本高:相对于传统的循环神经网络,Transformer 模型通常需要更大的计算资源和更长的训练时间。这限制了它在资源受限的环境中的应用。
-
过拟合风险:Transformer 模型通常具有大量的参数,当训练数据不足时容易发生过拟合。这需要使用正则化技术、更多的数据或其他方法来控制模型的泛化性能。
-
序列位置信息建模:尽管 Transformer 模型引入了位置编码来处理序列中的位置信息,但对于极长的序列,位置编码可能不足以准确地捕捉远距离的依赖关系,这可能影响模型的性能。
-
对输入序列长度的敏感性:Transformer 模型的自注意力机制对输入序列的长度非常敏感。较长的序列需要更多的计算资源,而较短的序列可能无法充分利用自注意力机制。因此,在设计模型时需要权衡输入序列的长度和计算效率之间的平衡。
-
4.Bert模型
BERT(Bidirectional Encoder Representations from Transformers)是一个预训练的语言表征模型。它强调了不再像以往一样采用传统的单向语言模型或者把两个单向语言模型进行浅层拼接的方法进行预训练,而是采用新的掩蔽语言模型(masked language model),以致能生成深度双向语言表征。
BERT 的特征抽取结构为双向的 Transformer,直接使用了 Transformer Encoder Block 结构,如上图所示。
4.1 Bert 词嵌入(Embedding)
Bert 的 Embedding 由三种 Embedding 求和而成,如下图所示:
-
Token embedding 层是要将各个词转换成固定维度的向量。在 BERT 中,每个词会被转换成 768 维的向量表示。输入文本在送入 token embeddings 层之前要先进行 tokenization 处理。假设输入文本是:“my dog is cute he likes playing”,会将两个特殊的 token 会插入到 tokenization 的结果的开头 ([CLS]) 和结尾 ([SEP]) 。这两个 token 为后面的分类任务和划分句子对服务。
-
tokenization 使用的方法是 WordPiece tokenization。这是一个数据驱动式的 tokenization 方法,旨在权衡词典大小和 oov 词(超出词表外的词)的个数。这种方法把例子中的 “playing” 切分成了 “play” 和“##ing”(此处不详细展开)。使用 WordPiece tokenization 让 BERT 在处理英文文本的时候仅需要存储 30,522 个词,而且很少遇到 oov 的词。
-
经过处理,上述句子被转换成 “[CLS] my dog is cute [SEP] he likes play ##ing [SEP]”,也就是 11 个 token。这样,例子中的 7 个词的句子就转换成了 11 个 token,然后接着得到了一个(11, 768) 的矩阵或者是(1, 11, 768) 的张量。
Segment Embeddings 层用来区别两种句子,预训练除了 LM,还需要做判断两个句子先后顺序的分类任务。
- 前一个句子的每个 token 都用 0 表示,后一个句子的每个 token 都用 1 表示。如 “[CLS] my dog is cute [SEP] he likes play ##ing [SEP]” 表示成 “0 0 0 0 0 0 1 1 1 1 1”。如果输入仅仅只有一个句子,那么它的 segment embedding 就是全 0。这也是一个(11, 768) 维的向量。
- Position Embeddings 层和 Transformer 的 Position Embeddings 不一样,在 Transformer 中使用的是公式法,在 Bert 中是通过训练得到的。加入 position embeddings 会让 BERT 理解 “I think, therefore I am” 中的第一个 “I”和第二个 “I” 应该有着不同的向量表示。
- BERT 能够处理最长 512 个 token 的输入序列。通过让 BERT 在各个位置上学习一个向量表示来讲序列顺序的信息编码进来。这意味着 Position Embeddings layer 实际上就是一个大小为 (512, 768) 的 lookup 表,表的第一行是代表第一个序列的第一个位置,第二行代表序列的第二个位置,以此类推。因此,如果有这样两个句子 “Hello world” 和“Hi there”,“Hello”和 “Hi” 会由完全相同的 position embeddings,因为他们都是句子的第一个词。同理,“world”和 “there” 也会有相同的 position embedding。
4.2 预训练任务(Pre-training Task)
第一个任务是采用 MaskLM(掩蔽语言模型)的方式来训练语言模型,通俗地说就是在输入一句话的时候,随机地选一些要预测的词,然后用一个特殊的符号 [MASK] 来代替它们,之后让模型根据所给的标签去学习这些地方该填的词。
第二个任务在双向语言模型的基础上额外增加了一个句子级别的连续性预测任务,即预测输入 BERT 的两段文本是否为连续的文本,引入这个任务可以更好地让模型学到连续的文本片段之间的关系。
BERT 使用了 Transformer 的 Encoder 模块,分别用 12 层和 24 层 Transformer Encoder 组装了两套 BERT 模型,分别是:
其中层的数量 (即,Transformer Encoder 块的数量) 为 L,隐藏层的维度为 H,自注意头的个数为 A。将前馈 / 过滤器 (Transformer Encoder 端的 feed-forward 层) 的维度设置为 4H,即当 H=768 时是 3072;当 H=1024 是 4096 。
4.3 优缺点
- 优点:效果好,能够解决 11 项 NLP 任务。Bert 微调下游任务的时候,即使数据集非常小(比如小于 5000 个标注样本),模型性能也有不错的提升。
- 缺点:1.BERT 的预训练任务 MLM 使得能够借助上下文对序列进行编码,但同时也使得其预训练过程与中的数据与微调的数据不匹配,难以适应生成式任务。 2.BERT 没有考虑预测 [MASK] 之间的相关性,是对语言模型联合概率的有偏估计。由于最大输入长度的限制,适合句子和段落级别的任务,不适用于文档级别的任务(如长文本分类)。
5.关键知识点
-
大语言模型预训练:1.大语言模型预训练是迁移学习的一种 2.模型预训练的最主要特点是模型参数不是随机初始化的,而是通过一些任务预训练过的 3.模型预训练可以提高模型的泛化能力 4.模型预训练后只需小量数据才能获得很好的效果
-
大语言模型预训练技术能帮助解决:1.在许多机器学习任务中缺乏先验知识 2.许多NLP任务泛化能力较差 3.标注数据太少等问题
-
ChatGPT模型的微调包括哪个阶段:训练监督策略模型、训练奖励模型、采用近端策略优化进行强化学习
-
基于神经网络的语言模型主要解决
自然语言生成
问题 -
在前馈神经网络中,为了减小梯度消失的影响,常常采用
梯度裁剪
的方法是 -
基于循环神经网络的语言模型通常具有特点:能够预测下一个词汇、能够生成连续的文本、能够理解自然语言
-
在基于循环神经网络的语言模型中,输入的词嵌入可以通过
预训练的词向量、随机初始化的矩阵
方式得到 -
Transformer 是一种基于
递归神经网络(Recursive Neural Network)
网络结构的模型 -
transformer 中的 Self-Attention 机制能够实现
学习到输入序列中每个位置的重要程度
-
在 Transformer 中,Encoder 和 Decoder 的区别在于:Encoder 包含多层 Self-Attention 和 Feed-Forward 层,而 Decoder 包含多层 Self-Attention、Encoder-Decoder Attention 和 Feed-Forward 层
更多优质内容请关注公号:汀丶人工智能;会提供一些相关的资源和优质文章,免费获取阅读。