预训练属于迁移学习的范畴。现有的神经网络在进行训练时,一般基于反向传播(Back Propagation,BP)算法,先对网络中的参数进行随机初始化,再利用随机梯度下降(Stochastic Gradient Descent,SGD)等优化算法不断优化模型参数。而预训练的思想是,模型参数不再是随机初始化的,而是通过一些任务进行预先训练,得到一套模型参数,然后用这套参数对模型进行初始化,再进行训练。
预训练将大量低成本收集的训练数据放在一起,经过某种预训练的方法去学习其中的共性,然后将其中的共性 “移植” 到特定任务的模型中,再使用相关特定领域的少量标注数据进行 “微调”。因此,模型只需要从“共性” 出发,去 “学习” 该特定任务的 “特殊” 部分。
例如:让一个完全不懂英文的人去做英文法律文书的关键词提取的工作会完全无法进行,或者说他需要非常多的时间去学习,因为他现在根本看不懂英文。但是,如果让一个英语为母语但没接触过此类工作的人去做这项任务,他可能只需要相对比较短的时间学习如何去提取法律文书的关键词就可以上手这项任务。在这里,英文知识就属于 “共性” 的知识,这类知识不必要只通过英文法律文书的相关语料进行学习,而是可以通过大量英文语料,不管是小说、书籍,还是自媒体,都可以是学习资料的来源。在该例中,让完全不懂英文的人去完成这样的任务,这就对应了传统的直接训练方法,而完全不懂英文的人如果在早期系统学习了英文,再让他去做同样的任务,就对应了 “预训练 + 微调” 的思路,系统的学习英文即为 “预训练” 的过程。
大语言模型的预训练是指搭建一个大的神经网络模型并喂入海量的数据以某种方法去训练语言模型。大语言模型预训练的主要特点是训练语言模型所用的数据量够多、模型够大。
预训练技术被广泛应用于各种机器学习任务,主要是为了解决以下问题:
综上所述,预训练技术可以帮助机器学习模型解决数据稀缺性、先验知识和迁移学习等问题,从而提高模型的性能和可解释性,同时降低训练成本。
大语言模型预训练采用了 Transformer 模型的解码器部分,由于没有编码器部分,大语言模型去掉了中间的与编码器交互的多头注意力层。如下图所示,左边是 Transformer 模型的解码器,右边是大语言模型的预训练架构
大语言模型预训练是通过上文的词来预测下一个词,属于无监督的预训练。比如,给定一个无监督的语料U={u1,...,un}
,而预训练语言模型是要使得下面式子最大化:
L 1 ( U ) = Σ i P ( u i ∣ u i − k , . . . , u i − 1 ; Θ ) L1(U)=ΣiP(ui∣ui−k,...,ui−1;Θ) L1(U)=ΣiP(ui∣ui−k,...,ui−1;Θ)
即如下图所示,通过上文,来预测下一个单词,属于自回归模型,也叫做 AR 模型。
AR 模型,即指从左往右学习的模型。AR 模型从上文学习,并将上一步的结果作为回归模型的输入,以预测下一个词。在预测时,AR 模型只能看到上文的词,而无法知晓下文的词。AR 模型通常用于生成式任务,尤其是长文本的生成能力很强。
在大语言模型的预训练中,还采用了 in-context learning
技术。为了让模型能够理解人类的意图,与人类的思想对齐,会构造类似这样数据:在句子前加上一个任务(task),同时会给出完成该任务的几个示例。例如,向模型输入 “请将中文翻译成英文。你好,Hello,再见,goodbye,销售,”,然后让模型学习下一个输出 “sell”。通过示例的个数又可以分为:
zero-shot learning 可以表示为:
p(output∣input,task)
通过引入 in-context learning 技术,使得预训练的大语言模型直接拥有完成特定任务的能力。
下面对大语言模型预训练过程中的批量训练、学习率、优化器和训练稳定性等方面进行讲解。
β1=0.9
、β2=0.95
以及ϵ=10−8
;大语言模型预训练是一种先通过海量数据进行预训练,然后再进行微调的技术,其目的是提高机器学习算法的性能和效率。大模型预训练的优势主要有以下几点:
大语言模型预训练是指采用大量数据喂入大规模模型去训练语言模型,得到初始化的模型参数。随着 ChatGPT 的出现,在完成大语言模型的预训练后,还会采用监督学习、奖励模型以及强化学习进行进一步的微调,叫做 RLHF。预训练后续阶段主要分为三个步骤(如下图所示):
鉴于 n-gram 存在的问题,人们开始尝试用神经网络来建立语言模型,提出了如下图所示的前馈神经网络模型(FFNN Language Model,FFNNLM):
它通过学习词的分布式表示来解决维度灾难,使得一个词能够使用一个低维向量(称之为 embedding)表示。从整体上看,上述模型属于比较简单而传统的神经网络模型,主要由输入层 - 隐藏层 - 输出层组成,经过前向传播和反向传播来进行训练。
基于神经网络的语言模型的输入层为词向量,词语转化为数字的最简单的形式就是 One-hot(独热编码),简单来说就是假设有一个大小为 V 的固定排序的词表,里边包含 V 个词,假设第二个词是 “电视”,那么用一个维度为 V 的特征向量表达就是 [ 0 , 1 , 0 , 0 , ⋯ , 0 ] [0,1,0,0,⋯ ,0] [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 ] [0,1,0,0,⋯,0] [0,1,0,0,⋯,0] 乘上面说的矩阵 C,将得到一个 m 维的向量,即词向量,下图为这个计算过程:
得到上面单个词向量之后,将 n − 1 个词向量做一个全连接,即把这 n − 1 个词向量首尾相接地拼起来得到最终的输入 x:
从输入层到隐藏层:词向量 x 作为输入,权重 H 乘以输入加上偏置 d,再加 tanh 函数作激活函数,就得到了隐藏层:tanh(d+Hx)。
从隐藏层到输出层:先计算由隐藏层到输出层未归一化的输出值 y1,这里是一个简单的线性变化: y 1 = U t a n h ( d + H x ) + b 1 y1 = Utanh(d+Hx)+b1 y1=Utanh(d+Hx)+b1。这里的 U 是隐藏层到输出层的参数,b1 代表这一部分的偏置项。
从输入层到输出层:从输入层到输出层的直连,也是一个线性变换。这一部分的输出值 y2 可以表示为: y 2 = W x + b 2 y2=Wx+b2 y2=Wx+b2。W 和 b2 分别是这一部分的权重和偏置项。
输出层:由上面的两部分输出值可以得到最终的 y: y = y 1 + y 2 = b + W x + U t a n h ( d + H x ) y = y1+y2 = b+Wx+Utanh(d+Hx) y=y1+y2=b+Wx+Utanh(d+Hx)
再将 y 经过一个 s o f t m a x softmax softmax 函数做概率归一化,便能得到一个维度为 V 的概率向量。
模型训练的目标是最大化以下似然函数:
其中 θ = ( b , d , W , U , H , C ) θ=(b,d,W,U,H,C) θ=(b,d,W,U,H,C),是模型的所有参数,R 是正则化项。
反向传播是根据 loss 值更新参数的过程,这里不再赘述。
神经网络语言模型 (NNLM) 通过构建神经网络的方式来探索和建模自然语言内在的依赖关系。优缺点如下:
优点:
缺点:
对于我们已经学过的传统神经网络,它们能够实现分类以及标注任务,但传统神经网络处理具有前后遗存关系的数据时,效果就不是十分理想了。这时不仅需要依赖当前的输入,还需要结合前一时刻或后一时刻的输入作为参考。
循环神经网络的主要用途是处理和预测序列数据。循环神经网络最初就是为了刻画一个序列当前的输出与之前信息的关系。从网络结构上来看,循环神经网络会记忆之前的信息,并利用之前的信息影响后面节点的输出。也就是说,循环神经网络的隐藏层之间的节点是有连接的,隐藏层的输入不仅包含输入层的输出,还包括上一时刻隐藏层的输出。
传统的神经网络结构一般分为三层:输入层、隐藏层、输出层。输入层的输入经过加权计算输出到隐藏层,作为隐藏层的输入。隐藏层再对从输入层得到的输入进行加权计算输入到输出层,最后通过激活函数,由输出层输出最终的结果。
循环神经网络的结构与其十分的相似,都是由输入层、隐藏层和输出层构成,最大的区别在于循环神经网络的隐藏层多了一个自身到自身的环形连接,其结构如下图所示:
其中,x 表示输入层,s 表示隐藏层的输出,o 表示输出层的值。U 是输入 x 特征与隐藏层神经元全连接的权重矩阵,V 则是隐藏层与输出层全连接的权值矩阵。o 的输出由权值矩阵 V 和隐藏层输出 s 决定。s 的输出不仅仅由权值矩阵 U 以及输入 x 来决定,还要依赖于新的权值矩阵 W 以及上一次 s 的输出。其中,W 表示上一次隐藏层的输出到这一次隐藏层输入的权值矩阵,该层被称为循环层。
将一般循环神经如下图所示展开便是单向循环神经网络:
对于单向循环神经网络的结构,你可以理解为网络的输入通过时间进行向后传播。当前隐藏层的输出 st 除了取决于当前的输入层的输入向量 xt 外,还受到上一时刻隐藏层的输出向量 st+1 的影响,因此,当前时刻隐藏层的输出信息包含了之前时刻的信息,表现出对之前信息记忆的能力。可以采用如下公式对单向循环神经网络进行表示:
其中 o t ot ot 表示输出层的结果,g 为输出层的激活函数,V 为输出层的权值矩阵。 s t st st 表示隐藏层的结果,它由当前时刻的输入层输入 x t xt xt 以及上一时刻隐藏层输出 s t − 1 st−1 st−1 共同决定,U 表示输入层到隐藏层的权值矩阵,W 为上一时刻的值 s t − 1 st−1 st−1 到这一次输入的权值矩阵,f 为隐藏层的激活函数。循环神经网络的递归数学式如下所示:
接下来,我们看一下如何使用循环神经网络来构建语言模型。 设小批量大小为 1,批量中的文本序列为 “machine”。为了简化后续部分的训练,我们考虑使用字符级语言模型(character-level language model), 将文本词元化为字符而不是单词。下图演示了如何通过基于字符级语言建模的循环神经网络,使用当前的和先前的字符预测下一个字符。
在训练过程中,对每个时间步的输出层的输出进行 softmax 操作,然后利用交叉熵损失计算模型输出和标签之间的误差。由于隐藏层中隐状态的循环计算上图中的第 3 个时间步的输出 O3 由文本序列 “m”,“a” 和“c”确定。由于训练数据中这个文本序列的下一个字符是 “h”,因此第 3 个时间步的损失将取决于下一个字符的概率分布,而下一个字符是基于特征序列“m”,“a”,“c” 和这个时间步的标签 “h” 生成的。
RNN 的优点:
RNN 的缺点:
Transformer 模型使用 Self-Attention 结构取代在 NLP 任务中常用的 RNN 网络结构。相比 RNN 网络结构,其最大的优点是可以并行计算。Transformer 的整体模型架构如下图所示:
Transformer 本质上是一个 Encoder-Decoder 架构。Transformer 的中间部分可以分为两个部分:编码组件和解码组件。如下图所示:
词向量的输入
Transformer 输入是一个序列数据,以我爱你为例:Encoder 的 inputs 就是 “I LOVE YOU” 分词后的词向量。
输入 inputs embedding 后需要给每个 word 的词向量添加位置编码 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 层)。如下图所示:
编码器层的作用:作为编码器的组成单元,每个编码器层完成一次对输入的特征提取过程,即编码过程。
编码器的作用:编码器用于对输入进行指定的特征提取过程也称为编码,由 N 个编码器层堆叠而成。
每个编码器层由两个子层组成:Self-Attention 层(自注意力层)和 Position-wise Feed Forward Network(前馈网络,缩写为 FFN)如下图所示。每个编码器的结构都是相同的,但是它们使用不同的权重参数。
编码器的输入会先流入 Self-Attention 层,它可以让编码器在对特定词进行编码时使用输入句子中的其他词的信息(当翻译一个词时,不仅只关注当前的词,而且还会关注其他词的信息)。然后 Self-Attention 层的输出会流入前馈网络。
解码器也有编码器中这两层,但是它们之间还有一个注意力层(即 Encoder-Decoder Attention),用来帮解码器关注输入句子的相关部分(类似于 seq2seq 模型中的注意力)。如下图所示:
通过添加一种多头注意力机制,进一步完善自注意力层。首先,通过 h 个不同的线性变换对 Query、Key 和 Value 进行映射;然后,将不同的 Attention 拼接起来;最后,再进行一次线性变换。基本结构如下图所示:
每一组注意力用于将输入映射到不同的子表示空间,这使得模型可以在不同子表示空间中关注不同的位置。整个计算过程可表示为:
在多头注意力下,将输入的 X 乘以 WQ、WK 和 WV 矩阵,从而为每组注意力单独生成不同的 Query、Key 和 Value 矩阵。如下图所示:
按照上面的方法,使用不同的权重矩阵进行 8 次自注意力计算,得到 8 个不同的 Z 矩阵。接下来将这 8 个矩阵整合为一个矩阵。具体流程如下:
全连接层是一个两层的神经网络,先线性变换,然后 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。
Decoder 的输入分为两类:
一种是训练时的输入,一种是预测时的输入。
训练时的输入:已经对准备好对应的 target 数据。例如翻译任务,Encoder 输入 “I LOVE YOU”,Decoder 输入 “我爱你”。
预测时的输入:一开始输入的是起始符,然后每次输入是上一时刻 Transformer 的输出。例如,输入 “”,输出"I",输入"I",输出"I LOVE",输入" 我爱 “,输出"I LOVE YOU”,输入" 我爱你 “,输出” 我爱你 " 结束。
解码器层的作用:作为解码器的组成单元,每个解码器层根据给定的输入,向目标方向进行特征提取操作,即解码过程。
解码器的作用:根据编码器的结果以及. 上 - 次预测的结果,对下一次可能出现的 “值” 进行特征表示。
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,将这个矩阵作用在每一个序列上。
Transformer 优点:
长期依赖性建模:Transformer 模型通过使用自注意力机制(self-attention)可以更好地捕捉长期依赖关系,这对于处理长文本或具有远距离依赖性的任务非常重要。
并行计算:Transformer 模型中的自注意力机制和位置编码可以使输入序列的所有位置同时进行处理,这导致模型可以高效地并行计算,加快训练和推理速度。
可解释性:相对于传统的循环神经网络(RNN),Transformer 模型在处理序列数据时更具可解释性。由于自注意力机制可以指定每个位置与其他位置的相关性,因此可以更清晰地理解模型对输入的处理过程。
模块化架构:Transformer 模型以块(block)为基本单元构建,每个块包含多层自注意力机制和前馈神经网络层。这种模块化的架构使得 Transformer 模型易于修改、扩展和调整,研究人员和开发者可以根据需要自由组合和堆叠块。
多语言支持:Transformer 模型的设计使其能够轻松地适应不同的语言,无论是训练还是生成文本。这使得 Transformer 模型在机器翻译和跨语言任务中表现出色。
Transformer 缺点:
学习成本高:相对于传统的循环神经网络,Transformer 模型通常需要更大的计算资源和更长的训练时间。这限制了它在资源受限的环境中的应用。
过拟合风险:Transformer 模型通常具有大量的参数,当训练数据不足时容易发生过拟合。这需要使用正则化技术、更多的数据或其他方法来控制模型的泛化性能。
序列位置信息建模:尽管 Transformer 模型引入了位置编码来处理序列中的位置信息,但对于极长的序列,位置编码可能不足以准确地捕捉远距离的依赖关系,这可能影响模型的性能。
对输入序列长度的敏感性:Transformer 模型的自注意力机制对输入序列的长度非常敏感。较长的序列需要更多的计算资源,而较短的序列可能无法充分利用自注意力机制。因此,在设计模型时需要权衡输入序列的长度和计算效率之间的平衡。
BERT(Bidirectional Encoder Representations from Transformers)是一个预训练的语言表征模型。它强调了不再像以往一样采用传统的单向语言模型或者把两个单向语言模型进行浅层拼接的方法进行预训练,而是采用新的掩蔽语言模型(masked language model),以致能生成深度双向语言表征。
BERT 的特征抽取结构为双向的 Transformer,直接使用了 Transformer Encoder Block 结构,如上图所示。
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,还需要做判断两个句子先后顺序的分类任务。
第一个任务是采用 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 。
大语言模型预训练: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 层
更多优质内容请关注公号:汀丶人工智能;会提供一些相关的资源和优质文章,免费获取阅读。
经网络的语言模型中,输入的词嵌入可以通过预训练的词向量、随机初始化的矩阵
方式得到
Transformer 是一种基于递归神经网络(Recursive Neural Network)
网络结构的模型
transformer 中的 Self-Attention 机制能够实现学习到输入序列中每个位置的重要程度
在 Transformer 中,Encoder 和 Decoder 的区别在于:Encoder 包含多层 Self-Attention 和 Feed-Forward 层,而 Decoder 包含多层 Self-Attention、Encoder-Decoder Attention 和 Feed-Forward 层
更多优质内容请关注公号:汀丶人工智能;会提供一些相关的资源和优质文章,免费获取阅读。