- 什么是大语言模型
- Transformer模型
encoder-decoder框架
attention机制与self-attention机制
BERT模型
GPT-2模型
一、大语言模型的定义
大语言模型指的是那些在大规模文本语料上训练、包含百亿级别(或更多)参数的语言模型,是一系列的人工智能模型,旨在理解和生成人类语言。它们在大量的文本数据上进行训练,可以执行广泛的任务,包括文本总结、翻译、情感分析等等。
LLM的特点是规模庞大,包含数十亿的参数,帮助它们学习语言数据中的复杂模式。这些模型通常基于深度学习架构,如转化器,这有助于它们在各种NLP任务上取得令人印象深刻的表现。
目前的大语言模型(如GPT和BERT)采用与小模型类似的Transformer架构和预训练目标(如 Language Modeling),与小模型的主要区别在于增加模型大小、训练数据和计算资源。拿 GPT 来说,GPT 其实出现了好几代,GPT-3 它有 45 tb 的训练数据,整个维基百科里面的数据只相当于他训练数据的 0. 6%。
二、Transformer
首先介绍 Transformer 的整体结构,下图是 Transformer 用于中英文翻译的整体结构:
Encoder-Decoder框架——attention机制——Transformer——BERT/GPT
2.1 Encoder-Decoder(编码-解码)
Encoder:将可变长度的输入序列编码成一个固定长度的向量;
Decoder:将固定长度的向量解码成一个可变长度的输出序列;
不同的任务可以选择不同的编码器和解码器 (RNN,CNN,LSTM,GRU)。
2.11 简单回顾RNN
假设时刻t时,输入为xt ,隐藏层状态为ht ,可以看到ht 与当前输入xt 和上一时刻的隐藏层状态有关
2.12 编码与解码
通过RNN进行编码,t时刻的ht 可以表示为ht=f(ht-1,xt),在获得各个时刻的隐藏状态后,最终在T时刻,将信息汇总生成最后的语义编码c
在解码过程中同样用RNN进行解码,用st来表示隐藏层状态,可以看到隐藏层的状态更新,不仅跟上一时刻的隐藏层输出st-1和当前时刻的输入c有关,还跟上一时刻的输出yt-1有关:
st=f(st-1,yt-1,c)
因此我们预测下一个输出yt:p(yt|{y1,y2,...,yt-1},c)=g(st,y1,c) ,这里g函数一般为softmax函数。
Encoder-Decoder结构可以忽略传统RNN模型对于语序的要求,但是也有局限性。最大的局限性就在于编码和解码之间的唯一联系就是一个固定长度的语义向量c。它能储存的信息就是有限的,当句子长度不断变长,由于后方的decoder网络的所有信息都来自中间状态,中间状态需要表达的信息就越来越多。
2.2 Attention 机制
简单的说,模型在产生输出的时候,需要让其产生一个“注意力范围”表示接下来输出的时候要重点关注输入序列中的哪些部分,然后根据关注的区域来产生下一个输出,如此往复。模型的大概示意图如下所示 :
对于Decoder的隐藏层,就变成了st=f(st-1,yt-1,ct),其中ct指的是在t时刻encoder模块的隐藏层ht加权平均的结果。
- Encoder网络按照原来的方法计算出h1,h2,...ht
- 计算Decoder网络,对于第k个输出词语,计算出得到ck所需要的h1,h2,...ht的权重αk,由此得到ck
- 将sk-1,yk-1,ck带入g(sk-1,yk-1,ck)得到sk,并带入网络得到输出yk
- 重复直到网络输出<end>。
(如何计算权重:设计一个以si,hj为输入的网络用softmax算概率作为权重)
2.21 self-attention
Query、Value 、Key
attention函数可以理解为利用向量key和value将一次查询进行映射的过程。
做法:针对某query,计算所有key对query的点乘,为了减少方差,除以sqrt(dk),并使用softmax归一化该权重,最后和value点乘得到输出。由于每个输出仅与所欲的输入有关,所以我们可以并行计算多个查询。多个query形成矩阵Q,同时多个key和value形成矩阵K、V,因此attention函数的计算公式:
2.3 transformer模型
:输入 + 中间部分(Multi-Head Attention + FeedForward + Add & Normalize)+ 输出
2.31 输入层
encoder的输入层和decoder的输入层是一样的结构,都是token embedding(词向量)+ positional embedding(位置向量),得到最终的输入向量。(为什么要用位置向量:因为 Transformer 不采用 RNN 的结构,而是使用全局信息,不能利用单词的顺序信息,而这部分信息对于 NLP 来说非常重要。所以 Transformer 中使用位置 Embedding 保存单词在序列中的相对或绝对位置。)token embedding 有很多种方式可以获取,例如可以采用 Word2Vec、Glove 等算法预训练得到,也可以在 Transformer 中训练得到。
2.32 Encoder
Multi-Head Attention
Add & Normalize
残差连接就是将输入向量加上输出向量后传给下一层。例如:假设一个输入向量x,经过一个网络结构,得到输出向量f(x),即:x->f(x),这时加上残差连接,相当于在输出向量中加入输入向量,输出结构变为f(x)+x。这样就避免了梯度消失的问题,因为对x求偏导时,总会有一个常数项1。
因此,Add & Normalize层的实质是,输出向量经过残差连接与输入向量相加然后通过LayerNorm进行归一化,将最后结果向量传给下一层。
Feed Forward
是一个两层的全连接层,第一层的激活函数为 Relu,第二层不使用激活函数。
通过上面描述的 Multi-Head Attention, Feed Forward, Add & Norm 就可以构造出一个 Encoder block,通过多个 Encoder block 叠加就可以组成 Encoder。
第一个 Encoder block 的输入为句子单词的表示向量矩阵,后续 Encoder block 的输入是前一个 Encoder block 的输出,最后一个 Encoder block 输出的矩阵就是编码信息矩阵 C,这一矩阵后续会用到 Decoder 中。
2.34 Decoder
与 Encoder block 相似,但是存在一些区别:包含两个 Multi-Head Attention 层。
- 第一个 Multi-Head Attention 层采用了 Masked 操作。
- 第二个 Multi-Head Attention 层的K, V矩阵使用 Encoder 的编码信息矩阵C进行计算,而Q使用上一个 Decoder block 的输出计算。
最后有一个 Softmax 层计算下一个翻译单词的概率。
流程总结:
- encoder层
- 每个词向量(token embedding)➕ 对应的位置向量(positional embedding)=> 每个词的输入向量x
- 输入向量通过多头自注意力机制(Multi-Head Attention)得到的向量与输入向量进行残差连接与归一化(Add & Normalize)向量向量
- 将归一化得到的每个词的向量继续做前向神经网络(Feed Forward)
- 最后再进行一次残差连接与归一化(Add & Normalize)
此时一层encoder层结束,将得到的结果向量当成输入向量继续传给第二层的encoder,依次传递计算,直到6层encoder计算结束,将最后结果向量保留,之后会传给decoder层计算。
- decoder层
- 当前词及之前词的词向量(token embedding)➕ 对应的位置向量(positional embedding)=> 当前词及之前词的输入向量x
- 输入向量x同样经过mask的多头自注意力机制(Multi-Head Attention)处理和残差连接与归一化
- 对归一化的输出继续进行Attention处理,这层的k、v是来自于encoder层的结果,而q是本身上一层的结果
- 接下来几步和上面encoder的步骤是一样的,最后得到结果向量,作为decoder第二层的输入向量。然后依次进行以上步骤,直到6层decoder全部计算结束。
3.linear和softmax输出