GPT模型总结【模型结构及计算过程_详细说明】

GPT模型

GPT模型:生成式预训练模型(Generative Pre-Training)

总体结构:

无监督的预训练
有监督的下游任务精调
![在这里插入图片描述](https://img-
blog.csdnimg.cn/294c69bf8c69429b904e85b288dbc86c.png?x-oss-
process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTU3Nzg2NA==,size_16,color_FFFFFF,t_70)

核心结构:中间部分主要由12个Transformer Decoder的block堆叠而成

下面这张图更直观地反映了模型的整体结构:
![在这里插入图片描述](https://img-
blog.csdnimg.cn/399ad1a0feed43bd9b98c244d19b4453.png?x-oss-
process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTU3Nzg2NA==,size_16,color_FFFFFF,t_70)

模型描述

GPT 使用 Transformer的 Decoder 结构,并对
Transformer Decoder 进行了一些改动,原本的 Decoder 包含了两个 Multi-Head Attention 结构,GPT 只保留了
Mask Multi-Head Attention,如下图所示。
(很多资料上说类似于decoder结构,因为采用了decoder的mask机制,不过抛开这一点,其实感觉和encoder会更像,所以实现时有时反而是调encoder实现
[莫烦Python GPT实现代码](https://github.com/MorvanZhou/NLP-
Tutorials/blob/master/GPT.py))
在这里插入图片描述

对比原有transformer的结构
![在这里插入图片描述](https://img-
blog.csdnimg.cn/611bf7f5626145098af19553cd2bc953.png?x-oss-
process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTU3Nzg2NA==,size_16,color_FFFFFF,t_70)

阶段描述

预训练阶段:

![在这里插入图片描述](https://img-
blog.csdnimg.cn/677f7b01e50f4646b23167a083d43cb4.png?x-oss-
process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTU3Nzg2NA==,size_16,color_FFFFFF,t_70)
![对于长度为k的窗口词序列x’=x](https://img-
blog.csdnimg.cn/f9b797e8f9b641109e0a793f50b7bbb7.png)
![在这里插入图片描述](https://img-
blog.csdnimg.cn/6526647673964f7ca6c23d9f80239b0a.png?x-oss-
process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTU3Nzg2NA==,size_16,color_FFFFFF,t_70)

预训练阶段为文本预测,即根据已有的历史词预测当前时刻的词,7-2,7-3,7-4三个式子对应之前的GPT结构图,输出P(x)为输出,每个词被预测到的概率,再利用7-1式,计算最大似然函数,据此构造损失函数,即可以对该语言模型进行优化。

下游任务精调阶段

![在这里插入图片描述](https://img-
blog.csdnimg.cn/0874c25466b24312b0dfde391116c2b7.png?x-oss-
process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTU3Nzg2NA==,size_16,color_FFFFFF,t_70)

损失函数

下游任务与上游任务损失的线性组合
![在这里插入图片描述](https://img-
blog.csdnimg.cn/4d9fce17d72846d8b25bc8960500cee5.png?x-oss-
process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTU3Nzg2NA==,size_16,color_FFFFFF,t_70)

计算过程:

  1. 输入
  2. Embedding
  3. 多层transformer的block
  4. 拿到两个输出端结果
  5. 计算损失
  6. 反向传播
  7. 更新参数

一个具体的GPT实例代码:
可以看到GPT模型的forward函数中,首先进行Embedding操作,然后经过12层transformer的block中进行运算,然后分别经过两个线性变换得到最终计算值(一个用于文本预测,一个用于任务分类器),代码与最开始展示的模型结构图保持一致。
[参考:莫烦Python GPT实现代码](https://github.com/MorvanZhou/NLP-
Tutorials/blob/master/pytorch/GPT.py)
![在这里插入图片描述](https://img-
blog.csdnimg.cn/54cfb8a85dda4c99b399c3f94b8370f1.png?x-oss-
process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTU3Nzg2NA==,size_16,color_FFFFFF,t_70)
下面我们着重关注计算步骤2, 3

计算细节:

【Embedding层】:

查表操作
Embedding层就是以one hot为输入、中间层节点为字向量维数的全连接层。而这个全连接层的参数,就是一个“字向量表”。
在这里插入图片描述
one
hot型的矩阵相乘,就像是相当于查表,于是它直接用查表作为操作,而不写成矩阵再运算,这大大降低了运算量。再次强调,降低了运算量不是因为词向量的出现,而是因为把one
hot型的矩阵运算简化为了查表操作。

【GPT中类似transformer的decoder层】:

在这里插入图片描述
每个decoder层包含两个子层

  1. sublayer1: mask的多头注意力层
  2. sublayer2: ffn (feed-forward network)前馈网络(多层感知机)
sublayer1:mask的多头注意力层

输入: q, k, v, mask
计算注意力:Linear(矩阵乘法)→Scaled Dot-Product Attention→Concat(多个注意力的结果, reshape
)→Linear(矩阵乘法)

残差连接和归一化操作:Dropout操作→残差连接→层归一化操作
![在这里插入图片描述](https://img-
blog.csdnimg.cn/3eaa28ca1adf46949c7397e95d2593a6.png?x-oss-
process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTU3Nzg2NA==,size_16,color_FFFFFF,t_70)

计算过程:

下面这段内容介绍了计算注意力的整体过程:
![在这里插入图片描述](https://img-
blog.csdnimg.cn/19f2228cbc8b42479f15a46bf86d81b3.png?x-oss-
process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTU3Nzg2NA==,size_16,color_FFFFFF,t_70)

分解说明:
Mask Multi-head Attention
1.矩阵乘法:

将输入的q,k,v进行变换
在这里插入图片描述

2.Scaled Dot-Product Attention

主要就是进行attention的计算以及mask的操作
在这里插入图片描述
在这里插入图片描述
Mask操作:masked_fill_(mask, value)
掩码操作,用value填充tensor中与mask中值为1位置相对应的元素。mask的形状必须与要填充的tensor形状一致。(这里采用-
inf填充,从而softmax之后变成0,相当于看不见后面的词)
transformer中的mask操作

mask后可视化矩阵:
直观理解是每个词只能看到它之前的词(因为目的就是要预测未来的词嘛,要是看到了就不用预测了)
![在这里插入图片描述](https://img-
blog.csdnimg.cn/578153edf2e446bca1ccca50d2c287bf.png?x-oss-
process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTU3Nzg2NA==,size_16,color_FFFFFF,t_70)

3.Concat操作:

综合多个注意力头的结果,实际上是对矩阵做变换:permute,reshape操作,降维。(如下图红框中所示)
在这里插入图片描述

4.矩阵乘法:一个Linear层,对注意力结果线性变换

整个mask多头注意力层的代码
![在这里插入图片描述](https://img-
blog.csdnimg.cn/30d3d1ded097413fbd6c522a5fe97fb5.png?x-oss-
process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTU3Nzg2NA==,size_16,color_FFFFFF,t_70)
注意到:上述代码中后面几行是对注意力结果进行残差连接和归一化操作
下说明这一过程:

残差连接和归一化操作:
5.Dropout层
6.矩阵加法
7.层归一化

批量归一化是不同训练数据之间对单个神经元的归一化,层归一化是单个训练数据对某一层所有神经元之间的归一化。
输入归一化、批量归一化(BN)与层归一化(LN)

代码展示
在这里插入图片描述

sublayer2: ffn (feed-forward network)前馈网络
1.线性层(矩阵乘法)
2.relu函数激活
3.线性层(矩阵乘法)
4.Dropout操作
5.层归一化

![在这里插入图片描述](https://img-
blog.csdnimg.cn/81a92c010b624ec29a792e70d8febad9.png?x-oss-
process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTU3Nzg2NA==,size_16,color_FFFFFF,t_70)

【线性层】:

多层block的输出结果放到两个线性层中进行变换,比较简单,不做赘述。

补充:注意力层流程图示

![在这里插入图片描述](https://img-
blog.csdnimg.cn/c61b0f5d53c7476abda5c426f41f0064.png?x-oss-
process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTU3Nzg2NA==,size_16,color_FFFFFF,t_70)

参考资料

1.参考论文:Radford et al. 《Improving Language Undersatnding by Generative Pre-
Training"》
2.参考书籍:《自然语言处理 基于预训练模型的方法》车万翔,郭江,崔一鸣
3.本文中代码来源:[莫烦Python GPT实现代码](https://github.com/MorvanZhou/NLP-
Tutorials/blob/master/pytorch/GPT.py)
4.其它参考链接(博文中已提到部分):
[word embedding计算过程剖析
](https://blog.csdn.net/qq_37262929/article/details/108135296?utm_medium=distribute.pc_relevant.none-
task-
blog-2defaultBlogCommendFromBaidu~default-5.baidujsUnder6&depth_1-utm_source=distribute.pc_relevant.none-
task-
blog-2defaultBlogCommendFromBaidu~default-5.baidujsUnder6)Transformer的矩阵维度分析和Mask详解

👉AI大模型学习路线汇总👈

大模型学习路线图,整体分为7个大的阶段:(全套教程文末领取哈)

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

👉大模型实战案例👈

光学理论是没用的,要学会跟着一起做,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

在这里插入图片描述

👉大模型视频和PDF合集👈

观看零基础学习书籍和视频,看书籍和视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
在这里插入图片描述
在这里插入图片描述

👉学会后的收获:👈

• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

👉获取方式:

😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

在这里插入图片描述

  • 27
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值