自适应网站欣赏,医联体网站建设,电子工程师自学视频,商务网站的功能文章目录 前言提出动机模型猜想模型提出模型结构模型参数 模型预训练训练的目标训练方式训练参数预训练数据集预训练疑问点 模型微调模型输入范式模型训练微调建议微调疑问点 实验结果分析 前言
首先想感慨一波
这是当下最流行的大模型的的开篇之作#xff0c;由OpenAI提出。… 文章目录 前言提出动机模型猜想模型提出模型结构模型参数 模型预训练训练的目标训练方式训练参数预训练数据集预训练疑问点 模型微调模型输入范式模型训练微调建议微调疑问点 实验结果分析 前言
首先想感慨一波
这是当下最流行的大模型的的开篇之作由OpenAI提出。虽然【预训练微调】的训练范式最初不是由GPT-1提出但是基于transformer的【预训练微调】是由GPT-1提出这也是现在大模型所用的范式。这篇论文出自18年比google公司出的bert要早几个月你去看bert的论文之后发现其实bert的思路有大部分是来自GPT-1的。
细品一下虽然当时这篇论文平平无奇但是历史见证它的后劲很强大。下面会一一的记录一下我看了这篇论文后的理解。
提出动机
首先我们来回顾一下在自然语言任务中尤其是自然语言理解任务中大概有以下的几种任务包括文本蕴含、问题回答、语义相似度评估和文档分类等。
那如何通过AI算法的手段去解决和完成这些NLI任务呢
在传统的AI算法开发的过程中一般是利用标注好的数据去训练一个模型然后再将训练好的模型应用于具体的业务领域下面就以NLP中的情感分类来举例子
数据集构建 构建情感分类数据集
数据feature标签label你真的狗阿负面小明的表现还是很不错的负面。。。。。。
模型构建 构建一个深度学习或者机器学习的二分类模型用来实现情感分类模型训练训练好后的模型就可以完成情感分类任务了。
但是以上的这种传统的做法还是存在着一些局限如
训练的数据集需要人为的标注且数据集要足够大这样就要求原始预料足够多同时标注的人力也要足够大。训练好后的模型只能完成单一的任务且在这个单一任务上未来要预测的数据的分布情况要和训练数据集的分布情况大致保持一致如果不一致模型效果就会变差这很好理解也就是说你训练的数据集是一种分布形式那么模型学到的就是这种分布形式的规律所以未来要预测的数据同样要符合这个规律如果规律不一样那么效果就不会太好。这就是风控领域的PSI技术原理。训练好后的模型只能完成单一任务。如果这个模型是基于情感分类数据集来训练的那么训练好后的模型就只能完成情感分类任务。
其实这就为现实的发展增加了不少的阻碍最明显的地方在于有些领域的原始数据语料本身就特别少那这种有监督式的训练就不能够sota了。
所以探索一种能够在少样本下sota的模型变得有现实意义。
模型猜想
以上已经描述了监督学习在NLI任务上可能存在的阻碍那到底该如何改善呢该怎么做呢作者最先想到的点子就是
能不能在一些未标注且不缺分领域的海量数据上去训练得到一个模型学习得到一些通用知识。这个模型具有一些基础的能力诸如词的embedding表示能力等预训练。然后在这个基础模型的基础上再利用少量的特有领域的标注数据对模型进行二次训练这样就可以完成在特定领域的工作微调。
我们写过论文的都知道既然你在论文中提出来了这个假设自然肯定是能实现了哈哈同样的作者提出的这种思想在很多地方也找到了佐证。最典型的就是词向量的表示。
还记得以前的word2vec是如何工作的吗先训练好word2vec然后单词通过模型之后就会得到词向量有了词向量就可以做很多的事情通常情况下不会直接来使用这个词向量来完成具体的NLI任务当然了它也完不成一般情况是将词经过word2vec向量化表示然后接着利用向量化后的特征来训练其他的模型来完成具体的NLI任务。这是不是有点验证了作者提出的猜想呢
word2vec的训练类似于作者提出的第一阶段的训练二次训练其他的模型类似于作者提出的二次训练
此外还有一些例子也验证作者的猜想诸如在GPT-1之前就有人提出了以LSTM作为基座实现训练一个LSTM模型然后在二次微调去完成具体的NLI任务。
以上的两种工作模式被证明有一定的效果。
基于以上的种种作者提出的这种两段式训练预训练微调。打开了未来的大门。
模型提出
接着作者在论文中分析了基于LSTM这种两段式的训练有一个问题LSTM很难处理一些长文本信息这是循环神经网络不可避免的问题所以作者提出了一种新的模型就是基于transformer的decoder模型架构。以这种架构来完成模型的预训练和微调。
模型结构
transformer结构
作者提出的GPT-1的结构其实就是基于transformer的解码器的简单的堆叠那么我们先来看看transformer是怎么样的。 以上就是transformer的结构左边是编码器右边是解码器解码器块和编码器块的差别其实就在于解码器块多了一个掩码机制Masked Multi-Head Attention。这个掩码机制会将要预测token的未来token进行掩码。避免信息穿越。具体关于transformer的内容会在transformer论文中分享这里只做最简单的介绍。
GPT-1结构
GPT-1的模型结构非常简单其实就是基于transformer的decoder部分做了一个12层的堆叠下面我先绘制一个GPT-1的结构图 可以看出这就是基于transformer的decoder部分来设计的但是还是有了一些简单的修改具体一些在架构上显著的修改我用红色的标注出来了。下面我大概描述一下。
位置编码Positional Embedding部分采用了和input Embeddingg一样的可学习的embedding模块而不是transformer的正余弦计算原理。LayerNorm部分被提前了原始的transformer部分是先进行多头注意力计算然后进行layerNorm而在GPT-1这里则被提前了。少了一个Mutil-Head Attention模块只保留了Masked Mutil-Head Attention。第三部分则是激活函数的变化原始的transformer用的是relu而GPT-1用的是GELU。
关于GPT-1的结构以及和transformer的差别就是这么多这也就可以理解为啥当初论文发出来之后响应没那么大这放到现在的研究生论文中可能也会被质疑创新不足吧哈哈。
模型参数
前面都介绍了模型的具体的结构了下面就只需要说说结构里面具体的参数设定了
解码器块12层多头注意力12头词embedding768维前馈神经网络隐藏层维度3072维
有这些参数就可以具体确定这个模型了如果不懂这些参数对应什么强烈建议看看transformer的原理后期我也会补一篇关于transformer论文的分析。
虽然我们已经有了模型但是我们该如何训练呢而训练很大程度是由训练目标决定的比如我们的训练目标是二分类那么我就知道模型该如何训练了。所以我们接下来就要知道预训练和微调阶段的各自训练目标是啥。
模型预训练
训练的目标
前面已经说了作者看了很多论文之后提出了这种预训练微调的两段式训练范式。而在预训练阶段是通过在未标注数据上进行大量训练。而这里就有一个疑问了
在未标记的语料上训练模型到底该选择什么样的训练目标呢到底是以情感分类为目标呢还是以实体识别问分类目标呢还是其他的NLI任务
前面都说了如果是以具体的任务为目标那么这个数据是要人去标注的根据作者的假设这显然是第二阶段要做的那这个阶段该如何做呢首先从数据上看这个阶段有的都是一些未标注的大量文本数据其次从之前所得到的启发来看以往的这种两段式训练范式在第一段中都是通过学习词的embedding表示来捕获词或者短语级别的信息。诸如word2vec。所以作者受到启发就是利用预训练来获得词的通用embedding表示既然是学习词的通用embedding表示那训练时候数据该如何组织呢这些都是一些未标注的数据阿作者这里采用的训练思想就是预测下一个词的出现概率。利用出现的词来预测出现未出现的词这就是训练的目标。
训练方式
这样所有的都解决了阿所有的未标注的数据都可以用起来啦。我还是举一个例子吧以“你是一个打不死的码农”为例
特征feature标签label你是你是一你是一个你是一个打你是一个打不你是一个打不死。。。。。。
将特征输入到模型来预测标签当然表格中的特征长度虽然是不一样的但是实际情况下是会把输入都padding到同一个长度的这也就是下面要提的“最长文本输入”的概念。
训练参数
而在具体的训练中有一些具体的细节参数还是需要留意的下面我把主要的参数进行罗列
文本的字节编码用bpe也就是说用bpe去对文本做token切分。单词输入最长文本为512个token这就是说一次输入的最长的文本只能是512如果不够512也会把它补齐padding到512如果超过512也会截断只保留512个token。单个batch为64个文本序列如果把第1点输入的512看作一句话的长度那么这里就是说一次输入到模型中为64句话。优化器选择用adam学习率最开始设置为2.5x10^-4在前2000个step的时候学习率恒定不变2000个step之后学习率会动态减小直到为0。用到dropout的地方丢弃概率参数为0.1总共训练100个epoch训练时采用L2正则。
预训练数据集
数据集这一块主要是用到了两个数据集
booksCorpus这是一些书籍数据。1B Word Benchmark 这是一些连续文本内容。
现在有了模型、有了优化目标、有了具体模型参数和训练参数、还有了数据。就可以做模型的预训练了预训练结束后的模型就会学到词的通用embedding表示啦。
预训练疑问点
在原始论文中给出了一个计算的公式 从上面可以看得出来最终自注意力块的输出之后还要和原始输入的词的embedding转置进行相乘这就是我的疑问点所在。
以我对transformer的decoder的理解以及在看了minGPT的实现之后得到的结果时最后的这个We的转置其实本身就不是We而是会额外的加入一个线性层进行学习。
注minGPT工程是一个大神对GPT的实现。
模型微调
在预训练阶段模型学到了如何利用出现的词来预测下一个词。按理来说要让他做具体的自然语言理解NLI任务是不太可能的所以也就有了微调这一步在微调阶段模型只需要在少量的具体任务的标注数据就可以达到sota。那对于每一个NLI任务具体该怎么做呢
模型输入范式
自然语言理解任务NLI其实是有很多种的诸如情感分析、文本蕴含、相似度计算、多项选择、摘要总结等。对于这么多的任务输入部分是可大致总结为有两种输入的形式
单文本输入诸如情感分类这样的任务其实就是单句话输入进去判别情感类别。多文本输入诸如文本蕴含、多项选择他们是多个连续文本的输入然后做最终的目标计算。
所以针对这么多的NLI任务GPT-1统一了输入的范式
输入的序列可以是单个或多个以s开头。输入序列是多个时序列质检用$符号做分隔。输入序列的结尾用e作为结束。
以上就是关于输入的范式规定下面我给出一张官方的图就一目了然了。 模型训练
在微调部分的训练其实就是标准的有监督学习自然要先计算loss然后根据loss来进行反向BP优化参数。下面我会根据上图来挨个讲解不同NLI任务大概是如何训练的。 单句子分类任务
上图中的分类任务是单句子的二分类任务诸如情感分类。
数据准备句子开头添加s句子结尾添加e模型修改在原有模型上添加二分类头数据训练数据输入到模型中预测二分类根据loss反向BP更新模型参数 多句子分类任务
上图中的分类任务是多句子的二分类任务诸如文本蕴含就是预测一个句子是否含在另一个句子中。
数据准备句子开头添加s句子结尾添加e句子与句子之间用$分隔模型修改在原有模型上添加二分类头数据训练数据输入到模型中预测二分类根据loss反向BP更新模型参数 相似度计算任务 这类任务其实也可以看作是一个二分类任务以概率来表示他们的相似程度。 5. 数据准备句子开头添加s句子结尾添加e句子与句子之间用$分隔 6. 在原有模型上添加二分类头 7. 数据训练数据输入到模型中预测二分类根据loss反向BP更新模型参数
注在数据输入部分由于是两段文本所以谁在前都行既然谁在前都行官方的做法就是分别让每一句话都在前一次然后分别输入到模型最后将两次的结果进行相加进行二分类的概率预测。 多项选择任务 多项选择原理上是一个多分类任务所以同样是用概率来表示选谁区别与之前的任务的地方在于别的是用sigmoid做二分类任务而这里是用softmax做多分类任务。但是这里的softmax并不是直接在线性层上去叠加的。
数据准备句子开头添加s句子结尾添加e句子与句子之间用$分隔分别将问题和答案做组合多个选择就会有多组数据在原有模型上添加二分类头并不是直接添加多分类头数据训练多组数据分别输入到模型中预测二分类最后根据多组的二分类输出结果做最终的softmax再根据loss反向BP更新模型参数。
注这里最重要的就是在模型的设计上加入多分类头诸如4选项的任务并不是直接在输出添加一个输出维度为4的线性层然后再softmax而是添加了一个二分类头每一个数据都分别进入模型得到一个二分类的概率结果然后再在这4个二分类结果上用softmax归一化用最终的softmax结果计算loss。
微调建议
官方论文给出了关于一些微调时候训练参数的建议
学习率为6.25 x 10^-5每个batch为32训练3个epoch
微调疑问点
这个疑问点来自于微调阶段的loss的计算在原始论文中给出了一个公式
L3为微调时计算的总的lossL2表示微调时具体任务的loss如二分类任务loss表示二分类结果和真实结果的差距L1表示文本生成的loss也就是说你输入了一句话这里时会计算文本生成的loss的这也就是预训练阶段优化的依据但是这里的这个文本生成的loss并不会计算所有文本的loss而是只算开始符号s、结尾符号e和分隔符$的loss。
总的loss时L1和L2的相加。但是在minGPT中以及现在流行的大模型中其实都不这么做都是只使用L2来计算loss然后反向BP。包括在minGPT工程中也是只用了L2。 这就是我的疑问点大家可以留意。
实验结果分析
作者在很多的NLIL任务上做了多次的实验得出了两个很重要的结论。
增加transformer的decoder层数会对NLI的理解任务有提升。零样本能力预训练好后的模型本身不需要微调就具有了一定的NLI解决能力。
从现在来看以上的两个结果指导着当下2024年大模型的发展OpenAI牛逼。
关于GPT-1的讲解就到这也强烈建议大家看一下论文Improving Language Understanding by Generative Pre-Training 还有一个是文中提到的minGPT他是由一个国外的大佬开发的关于GPT的系列实现通俗易懂推荐阅读。