GPT模型总结:从结构到计算过程的详细解析
GPT模型总结:从结构到计算过程的详细解析
GPT模型(Generative Pre-Training)是一种基于Transformer架构的生成式预训练模型。本文详细介绍了GPT模型的结构和计算过程,包括总体结构、模型描述、阶段描述、计算过程和计算细节等多个方面。通过本文,读者可以深入了解GPT模型的工作原理,以及其在自然语言处理领域的应用。
GPT模型
GPT模型:生成式预训练模型(Generative Pre-Training)
总体结构
GPT模型采用无监督的预训练和有监督的下游任务精调相结合的方式。其核心结构由12个Transformer Decoder的block堆叠而成。
模型描述
GPT模型使用Transformer的Decoder结构,并对Transformer Decoder进行了一些改动。具体来说,GPT只保留了Mask Multi-Head Attention,去掉了原有的Decoder中的第二个Multi-Head Attention结构。
对比原有Transformer的结构:
阶段描述
预训练阶段
预训练阶段为文本预测,即根据已有的历史词预测当前时刻的词。通过计算最大似然函数来构造损失函数,从而对语言模型进行优化。
下游任务精调阶段
下游任务与上游任务损失的线性组合。
计算过程
- 输入
- Embedding
- 多层Transformer的block
- 拿到两个输出端结果
- 计算损失
- 反向传播
- 更新参数
计算细节
【Embedding层】
Embedding层就是以one hot为输入、中间层节点为字向量维数的全连接层。而这个全连接层的参数,就是一个“字向量表”。one hot型的矩阵相乘,就像是相当于查表,于是它直接用查表作为操作,而不写成矩阵再运算,这大大降低了运算量。
【GPT中类似Transformer的Decoder层】
每个Decoder层包含两个子层:
- sublayer1: mask的多头注意力层
- sublayer2: FFN (Feed-Forward Network)前馈网络(多层感知机)
sublayer1:mask的多头注意力层
输入:
- q, k, v, mask
计算注意力:
- Linear(矩阵乘法)→Scaled Dot-Product Attention→Concat(多个注意力的结果, reshape )→Linear(矩阵乘法)
残差连接和归一化操作:
- Dropout操作→残差连接→层归一化操作
计算过程:
下面这段内容介绍了计算注意力的整体过程:
分解说明:
Mask Multi-head Attention
- 矩阵乘法:将输入的q,k,v进行变换
- Scaled Dot-Product Attention:主要就是进行attention的计算以及mask的操作
- Mask操作:masked_fill_(mask, value):掩码操作,用value填充tensor中与mask中值为1位置相对应的元素。mask的形状必须与要填充的tensor形状一致。(这里采用-inf填充,从而softmax之后变成0,相当于看不见后面的词)
- Concat操作:综合多个注意力头的结果,实际上是对矩阵做变换:permute,reshape操作,降维。(如下图红框中所示)
- 矩阵乘法:一个Linear层,对注意力结果线性变换
整个mask多头注意力层的代码:
注意到:上述代码中后面几行是对注意力结果进行残差连接和归一化操作
下说明这一过程:
残差连接和归一化操作:
- Dropout层
- 矩阵加法
- 层归一化:批量归一化是不同训练数据之间对单个神经元的归一化,层归一化是单个训练数据对某一层所有神经元之间的归一化。
输入归一化、批量归一化(BN)与层归一化(LN)
代码展示:
sublayer2: FFN (Feed-Forward Network)前馈网络
- 线性层(矩阵乘法)
- ReLU函数激活
- 线性层(矩阵乘法)
- Dropout操作
- 层归一化
【线性层】
多层block的输出结果放到两个线性层中进行变换,比较简单,不做赘述。
补充:注意力层流程图示
参考资料
- 参考论文:Radford et al. 《Improving Language Understanding by Generative Pre-Training》
- 参考书籍:《自然语言处理 基于预训练模型的方法》车万翔,郭江,崔一鸣
- 本文中代码来源:莫烦Python GPT实现代码
- 其它参考链接(博文中已提到部分):
- word embedding计算过程剖析
- Transformer的矩阵维度分析和Mask详解