Transformer大模型应用解析:Bert与GPT的对比及收藏学习攻略

张开发
2026/4/20 19:49:07 15 分钟阅读

分享文章

Transformer大模型应用解析:Bert与GPT的对比及收藏学习攻略
本文详细解析了Transformer在大模型中的两个代表性应用Bert和GPT。Bert采用双向Transformer编码器擅长文本理解通过预训练微调的方式学习文本表示GPT则采用单向Transformer解码器专注于生成任务通过因果掩码实现文本生成。文章还介绍了BERT的输入结构、预训练过程以及下游任务的微调方法并强调了预训练的自监督特性和微调的有监督特性。1、Transformer的应用两个Transformer最有代表性的应用一个是Bert一个是GPT。Transformer原论文里面的结构Bert和GPT分别是怎么去应用Transformer的Bert是取了它左边的encoder部分也就说Bert只取了它的编码器把右边这部分给丢掉了。而GPT与之相反只取了decoder的部分把encoder给丢掉了。bert自称为一个双向的Transformer。它取的是一个encoder在encoder里面它和decoder最大的区别是它没有因果掩码也就是它每一个位置的每一个token都可以去看到它前后两个方向的token并且对它们做注意力所以Bert 称为一个叫双向Transformer。Bert擅长文本理解当我们去理解一个文本里面某一个词或者某一个段落的时候需要参考它的前文和后文的内容的。比如对于多义词想要理解多义词的话要关注的是这个多义词前后文章讲了什么所以Bert这种双向的Transformer双向注意力的操作让它在文本理解的部分做得非常的好。GPT不同的一点是GPT的G是生成式的意思Generative也就是GPT是一个生成模型。如果想要去生成一个文本首先是一个一个的生成每生成一个的时候只能看到前面的内容因为前面的是已经生成好的那未来会生成什么是不可能看到的所以GPT选择了decoder它在里面增加了因果掩码它希望每一个token都只能看到前面的内容不能看到后面的内容。这个设定让它去做训练这个任务就会比Bert要难一点因为Bert是综合了前文和后文的内容去对当前的这个token去做注意力GPT它只能看到前文的内容因为它取的是decoder这个模块虽然任务变得更难了但是这个结构能够帮助它更好地去做生成任务。Bert去做生成任务是比较困难的因为这个结构所限。上图左边是Bert双向每一个位置都能看前后所有的token并没有对它做一个任何因果掩码这一类的操作。右边GPT是一个单向的因为它有因果掩码每一个位置都只能看到前面的token以及当前token的内容后面是不允许它在这里看到未来的信息这一块都被因果掩码给遮盖掉了。2、BERTBert是一个双向的想要通过Transformer的encoder 去学到文本的一个表示这个表示不像之前word2vec一样是一个静态的表示这个文本的表示融合了它的上下文的每个token经过Transformer encoder的输出得到的都是一个融合了上下文语义的一个表示。第一个关键词它是一个pre-training预训练。这个模型在NLP里面一个特点是它采用了迁移学习这种预训练微调的方式。它是在大量的文本上去做预训练对于这种下游的小任务比如说去做一个词性标注做一个主体识别那么在这种下游的任务上再用这种小的经过标注的数据去对它进行一些微调。CV图视觉方面的模型都是经过在大型的图像数据集上经过预训练之后再去下游任务上做微调的。Bert算是在NLP里面第一次成功的应用预训练微调的方式所以它第一个点是用了Pre training的这种方式。第二个点就是它用的是一个双向的并且是一个深度的Transformer的模型。Bert是怎么设计它的模型。Bert就是取了Transformer的encoder它设置了一个叫encoder block每经过一个encoder block输入和输出的维度是一样的如果算力支持并且数据量够的话可以继续往深里面去堆叠这个n可以设置它为10也可以设置它为100去不断地堆叠block因为它的输入输出的维度是一致的堆叠多少个都是可以的。在Bert它其实是采用了两种模型一个叫BERTbase一个叫BERTlarge这几个字母的含义L就是Transformer图左面的这个n就是它的层数它堆叠了多少个encoder block可以把它理解为一个深度。H就是每一个输入每一个token代表的一个低维它输出的每个token还是一个低维的H也就是隐向量维度有时候也把它称之为宽度当堆叠很多个block之后d也代表传递的一个宽度堆叠的block越多它也就越深。A就是在encoder里面每一个attention都是一个多头的注意力A也就是head的数量。这些参数设计好之后就可以得到大概这么一个encoder模型的参数量大概110兆差不多是一个亿。Bertbase设置这个其实是为了跟前面的一个工作做对比真正认为效果好的肯定是一个更大的模型也就是Bert large模型可以看到它的深度更深宽度也相应做了一个提升头的数量也做了一个增加我们希望使用多头注意力之后每一个头每一个head的输出是一个dv维一共有A个headsdv*Ad(model)的宽度一样。H如果做了提升增加的话每个head输出的dv假设不变的话A也是要跟着提高。对于一个encoder block它的参数量一个encoder block它里面主要包括两个部分第一个部分是self attention第二部分就是前馈网络self attention里面它还是一个多头的attention对于每一个头都要经过一个QKV。这里的QKV都是一个d(model)*dv的矩阵也就是QKV(WQ WK WV)的这个线性映射都是可学习的参数经过这个线性投影之后得到QKV在这里面去做线性注意力计算在注意力计算这一层实际上它是没有参数的它只是去做一个求内积、 Softmax以及加权求和的操作这里没有可学习的参数出来之后有A个头那么A个头再把他们进行拼接之后拼接的这一步也是没有可训练参数的但是在拼接之后还做了一个线性变换出来的是A个dv把它们进行拼接得到了一个长的向量其实这个也就等于d(model)。 后面再接一个线性层目的是让它们更好的融合把不同head的输出进行一个更好的融合这个线性层是不对它的维度做变化的也就是说还是一个从d(model)到d(model)的这么一个线性变化这里面一共有多少参数呢。对于每一个QKV来说都是d(model)乘以dv一共有A个乘以3那么dv*Ad(model)也就是3(dm)^2这个是QKV的线性投影A个head QKV线性投影得到的参数量。在最后多头注意力输出的部分对它进行一个线性投影这个线性投影是从d到d维也就是一个(dm)^2。 在做多头注意力这一部分也就是一个4(dm)^2的一个参数量。第二个看到的就是前馈神经网络它是做了一个先升维再降维的操作。在Transformer的设定里这个升维是把它从原先的维度升到4倍假设是d(model)先升到4d再降回到d那么它的一个参数量其实也就是8d^2因为d*4d 4d*d8d^2。把这三个加起来差不多是一个12d^2的参数量这个就是整个encoder block里面一个参数大概的量级。这里面如果有归一化层还会有一些少量参数。这里的d也就这里的H也可以写成12H^2。Bertbase和Bertlarge的参数量也就是这么计算出来的。如果把这里面的L、H和A带进去前面要乘一个Ld也就是HA不用管它在计算里面已经把它算进去了。如果把这两个L和H带入计算的话差不多就可以算出后面这个参数量级是110和340如果有一点差值是因为它前面还有一个嵌入层的参数量嵌入层的参数量由一个词表的大小再乘以一个d (model)或者说是上面的这个H这就是整个Bert里面会参与训练的所有参数。其实就是这三个QKV投影层的参数加上最后这一个线性变换的参数线性投影的参数再加上前馈网络的参数就这三大部分。3、BERT的输入在迁移学习里面除了微调之外还有一个方式叫**特征提取。**经过预训练的模型拿过来之后可以把它当成一个单纯的特征提取器也可以对它进行微调。这两个区别在CNN里面特征提取就是把整个卷积拿过来把它冷冻住这里面的参数不参与更新只在后面缀一个刚刚初始化过新的线性层这个线性层作为一个分类头预训练过的这些参数作为特征提取器这里面的所有参数不参与更新只是去调整最后新加的这个线性层的参数去做下游的任务这就是一个特征提取的方式。微调就是全量的对于拿过来经过预训练的参数以及后面的这个分类头全量的对它们进行参数的更新也有可能是冷冻其中的一小部分解冻其中的另一部分对它们进行参数更新在Bert里面其实也是尝试了这两种方法经过实验认为通过微调的方式会更好。经过预训练之后会得到一个所有训练好的参数那么对于这个参数来说它原封不动的拿过来那么这里面的每一个参数都没有冻住所有参数都可以继续参与训练。除此之外它会根据现有任务在外面加一些小的线性层适应不同下游任务的输出它是对于拿过来已经经过训练的参数和新的线性层的参数都需要做参数更新。Transformer里的输入有两部分构成一个是token的embedding也就是word embedding词经过嵌入之后得到的向量。另外一部分是代表位置的一个编码也就是词编码位置的编码。在bert里面它还提到了一个新的编码叫segment embeddings它只有两个H长度的向量也就是EA和EB因为Bert无论是在预训练还是微调的时候它输入的时候都有可能是两个句子会对句子段做一些处理。开始的时候有一个clas特殊的标识符每一个输入进来的token都会对它进行编码在Bert里面clas的编码就认为它编码的是全局的信息每一个token都会编码自己这一部分结合上下文信息的内容clas这个token把它放在整个输入的第一位希望它输出的是一个全局的信息。另外一个特殊标识符叫Sep它是一个分隔符的意思输入如果是一个句子它就会在句子的末尾。输入两个句子在两个句子中间也会加一个Sep让模型知道前后是两个不同的句子。正因输入的是两个句子除了Sep之外希望模型能够意识到这两个句子之间的区别。让它去学两个句子之间关系的时候首先得知道哪个词来自哪个句子通过两个叫segment embeddings逐位加到输入向量里面以此让模型来区分。输入如果是一个句子就可以只用EA它就知道所有都是来自于EA这个句子。如果输入的是两个句子第一个句子标EA第二句子标EB让模型知道前后每个单词有一个是属于第一个句子有一些属于第二个句子。Bert这里用的这个位置编码它是一个可学习的参数如果有最大允许它的输入长度是Maxlen隐空间的维度是H学的是Maxlen*H的这么一个矩阵。比如说第i个位置就取第i行作为它的位置编码这里面的每一个参数都可以通过梯度下降去学习EA EB也是一样的也是可以学习的参数。Bert输入的构造是对预训练和微调都统一的一个输入的形式。4、BERT的预训练Bert预训练的操作首先BERT预训练设置两个目标函数目标函数就是希望最小化的损失。第一个使用一个叫Masked language model用前n个词去预测当前词。bert采用的是一个双向的不能用原始language model的训练方式所以它通过遮盖掉一些部分提出了一个叫MLM的一种训练方式。它做的是一个完形填空跟language model的训练方法不一样拿到整个句子之后以一定的概率去遮盖掉上面的一些词比如现在要遮掉is和play这两个词遮掉这些词之后希望这个模型能通过整个句子里其他内容学到这两个词。遮掉is和play它整个模型给设置的目标函数就是让这个模型去做一个完形填空用上下文去预测被遮住的词。在masked里面它把遮挡的概率设为15%也就是说一个长度为n的句子输入进来就会有15%*n个单词可能会被遮盖掉遮盖哪一个词都是随机的。遮盖是用一个特殊的标识符MASK这些特殊的符号跟my dog一样都是在词向量矩阵里学的对于词向量矩阵学习的过程clas和my是没有区别的它们都是这里面的一些词只不过clas不存在自然语言之中我们人平时说的话里面不包含mask、 clas这一类的词但是对于机器来说它们都算是一个词要去学怎么表示它。对于is和play来说想要遮住它就把它原来的词换成mask这个特殊的标识符代表这个地方给挡上了模型知道挡上之后它就会通过前后文去猜这个词通过上下文的关系去猜这个词应该是什么。 但这么一个设置会有一个小的问题预训练的时候采用MLM去遮掉一些词把这些词换成mask这么一个特殊的标记模型看到这个特殊的标记就知道得去学这个标记代表什么但这个模型很有可能会泛滥因为最后计算损失去做优化也只是在遮挡住的这些位置去计算损失模型就可能会学到看到mask之后。我知道这是你给我出的题我就会去学mask这个位置它表示的是什么但是对于没有mask的位置这些根本不是题就会直接把它原封不动地照抄输出根本不会去学my和dogmy和cutemy和hey之间的关系这肯定不是我们希望看到的一个场景我们希望它对于input里面每一个词都能够学到当前token以及它上下文表示综合起来的一个信息。如果要mask一些值在这些值上去做计算有可能这个模型就会只在遇到mask的时候它才会努力工作遇到这种正常的单词它就会原封不动地把输入输出去。为了避免这个问题出现在遮挡的这15%里面它还是在选好要遮挡的这15%这么多词里面再取80%把它替换成mask这么一个特殊的标记符剩下10%里面有一半是把给它维持不变维持不变还是会去计算预测的结果虽然没有给挡上但是它还是考题再剩下的10%会用一些随机的单词去替换比如可能随机替换成一个big从词表里面随便取一个词放到这里把is给替换掉放到输入里面我希望它输出的时候它能知道这个位置不是big而是给预测一个is。这样一定程度缓解了刚刚说的那个问题因为这个时候模型不是只有mask这个标记才是考题有可能看到一个不变的词看到一个正常的词要去对它进行一个上下文注意力计算它可能也是你给我出的考题之一有可能这些正常的词里面还会出现一些错字比如不应该出现big给随机换掉。模型也应该意识到big有可能是一个错的要通过上下文去把它修复回来。这个时候模型就会学到上面每一个token就更有可能学到上面每一个token应该的表示那么这个80%、10%和15%这些概率它是做了一些Bert模型做了一些对比实验去选到这么一个比例。MLM是它训练的第一个目标第二个目标叫NSP就是要去预测next sentence prediction要去预测b句子是不是a句子的下一句也就说输入两个句子比如有a句子和b句子NSP就是一个二分类操作要去判断b是不是就是a的下一句。a和b这些句子应该都是从一个很长的文章里面摘取出来的有可能摘取了相邻两句放进来训练的时候采取了50%真的是上下句50%是根本不相连的句子。因为在前面这个完型填空的任务里面Bert认为它只学到词级别的一些表示Bert希望模型能够学到整个句子的意思两个句子是什么关系学到这种句子级别的能力那么它在下游做这种句子级别任务时候可能就会表现的更好。比如输入第一个句子my dog is cute第二个he likes playing这两个看起来就很有可能是一个正常的前后句我们希望它输出的NSP就是一个true或者是一个更接近1的一个值。在Bert预训练的时候融合了这两个目标函数NSP其实就是一个二分类问题那MLM就是在每一个被遮挡的词元上面都去做一个v分类的预测。假设词表里一共有v个词其实就是要去做一个v分类的问题把所有的这些损失加起来一起去做梯度下降去优化整个Bert里面的参数。5、BERT下游任务微调Bert的预训练部分就是两个目标函数预训练好一个Bert模型希望它能够适配不同的NLP任务。下游任务就需要对它做一个微调因为Bert输出的是每一个token对应的一个表示在微调的时候对于不同类别的任务Bert也可以非常简单不用做特别大的一个改动就能去适应不同类别的任务。比如整个Bert下面这些都是不变的一个clas的特殊标记最后输出output就认为是一个全局信息表示再做一些句子级别的任务。①.比如做一个句子对分类两个句子是什么关系比如是矛盾关系还是互相支持关系这可能就是一个二分类问题这种关于句子对的分类任务把clas label拿出来经过一个线性层比如它的输出本应该是H把它映射到两维去计算一个softmax。实际上也可以把H直接映射成一个标量对标量做一个sigmoid就知道这两个句子到底是哪一个分类。②.比如三分类问题用一个H把它映射成一个k分类问题映射成一个k维的输出。k维的输出去做一个softmax训练的时候经过softmax之后去计算它的交叉熵损失。这是对句子对做分类的时候。③.比如单一句子做分类也是一样的比如对一家饭店在网络上有很多评论哪些评论是负向的哪些评论是正向的这也是一个二分类的问题同样可以取clas输出 clas这个特殊 token输出的这么一个表示去对它做分类这里因为只有一个句子它所有的embedding都用的是EAEA在预训练的时候已经学过了对句子做分类任务的时候只取clas这一个token对应的输出去对它做线性变换经过softmax就可以通过交叉熵进行微调。④.比如问答任务这些任务不是句子类型、句子级别的。首先给你一个问题“我爱吃什么“这是第一个句子第二个句子“我爱吃苹果我讨厌香蕉“这个任务是我告诉你我前面有一个问题并且知道前面这个问题的答案一定在我后面给你的第二个句子里不需要对它进行任何改变和总结只需要框选出来这个答案的位置。比如想要知道这个句子里面的第四个字到第五个字是我这个问题的答案那么你只需要告诉我它是第4~5 这么一个范围就ok了。这个任务在这种任务类型的数据集上我们想要的输出是一个范围对每一个分类、每一个token都去判断两个事情一个是这个范围的开始以及这个范围的结束。它就是学两个向量用s (start)和e(end)去表达这两个向量它学的是两个向量这个向量的维度是跟每个token的输出是一样的也就是向量也是一个H维的向量就直接去计算每个token是不是开始和结束去计算它的相似度比如对于第二个token它开始的概率有多大就用一个softmax去计算它和这个的内积经过一个Softmax作为它的概率对于这个也是一样的希望学到的两个向量去通过内积经过Softmax相似度去表示能让它知道哪一个token更像这个答案的开始哪一个token更像是答案的结束。找到一个区间i到j作为前面这个问题的答案这个区间是开始它这个区间正确的概率开始正确的概率结束正确的概率所以i是开始的概率加上j是结束的概率。还要保证一个事情就是i得在j前面经过这样一个计算就知道每一个i和j它正确的概率是多少。对于真正正确那个i和j这个是推理时候的操作真正正确的i和j就是去学习s和e。⑤.还有一个任务对于一个输入对于每一个token都对它进行一个标注这叫命名实体识别ner也就是输入的一个句子比如小明去上海希望能够识别出这里面的命名实体或者说希望能够识别出这个句子里面哪些token属于人名、地名或者一些专有名词、机构的名称这种类似的命名实体。那么它的输出其实也就是小明是一个人名人名它可能还会有两种类型我要知道这个命名实体的开始还是在命名实体的中间它既不是人名也不是地名什么都不是就标志为o也就是outside的意思。上海它是一个地名上是这个地名的第一个字海是这个地名的中间的token。比如有五个类型的标注只标注人名、地名和什么都不是这就是一个五分类的问题对于每一个token输出的output首先把它进行一个线性变换从H维度投影到一个五分类的问题再去计算交叉熵就ok。如果是去做这个任务的话每一个token的线性变换它用的都是同一组参数因为输入的序列是不一定长度的这就是Bert做预训练和微调这两个步骤做的事情。Bert预训练和微调还有一个很大不同点是它预训练的时候不需要人为标注因为MLP****和NSP对于一个句子来说它的答案就是显而易见的一个句子是不是相连以及抠掉了哪个词这些称之为自监督的训练就是它真实标签都包含在它原本的数据里面而它下游这些任务做微调的时候都是需要人去标注的。比如想要知道我爱吃苹果这个苹果是答案只有人才能先把这标上苹果是答案小明去上海哪个是人名哪个是地名。这些标准答案也都是人写出来的所以微调的时候用的是有标注的数据而预训练的时候用的是大量没有标注的数据标注的意思就是有没有用人工人手去写它的标准答案人写的标准答案让模型去学标准答案。如何学习大模型 AI 由于新岗位的生产效率要优于被取代岗位的生产效率所以实际上整个社会的生产效率是提升的。但是具体到个人只能说是“最先掌握AI的人将会比较晚掌握AI的人有竞争优势”。这句话放在计算机、互联网、移动互联网的开局时期都是一样的道理。我在一线科技企业深耕十二载见证过太多因技术卡位而跃迁的案例。那些率先拥抱 AI 的同事早已在效率与薪资上形成代际优势我意识到有很多经验和知识值得分享给大家也可以通过我们的能力和经验解答大家在大模型的学习中的很多困惑。我们整理出这套AI 大模型突围资料包✅ 从零到一的 AI 学习路径图✅ 大模型调优实战手册附医疗/金融等大厂真实案例✅ 百度/阿里专家闭门录播课✅ 大模型当下最新行业报告✅ 真实大厂面试真题✅ 2026 最新岗位需求图谱所有资料 ⚡️ 朋友们如果有需要《AI大模型入门进阶学习资源包》下方扫码获取~① 全套AI大模型应用开发视频教程包含提示工程、RAG、LangChain、Agent、模型微调与部署、DeepSeek等技术点② 大模型系统化学习路线作为学习AI大模型技术的新手方向至关重要。 正确的学习路线可以为你节省时间少走弯路方向不对努力白费。这里我给大家准备了一份最科学最系统的学习成长路线图和学习规划带你从零基础入门到精通③ 大模型学习书籍文档学习AI大模型离不开书籍文档我精选了一系列大模型技术的书籍和学习文档电子版它们由领域内的顶尖专家撰写内容全面、深入、详尽为你学习大模型提供坚实的理论基础。④ AI大模型最新行业报告2025最新行业报告针对不同行业的现状、趋势、问题、机会等进行系统地调研和评估以了解哪些行业更适合引入大模型的技术和应用以及在哪些方面可以发挥大模型的优势。⑤ 大模型项目实战配套源码学以致用在项目实战中检验和巩固你所学到的知识同时为你找工作就业和职业发展打下坚实的基础。⑥ 大模型大厂面试真题面试不仅是技术的较量更需要充分的准备。在你已经掌握了大模型技术之后就需要开始准备面试我精心整理了一份大模型面试题库涵盖当前面试中可能遇到的各种技术问题让你在面试中游刃有余。以上资料如何领取为什么大家都在学大模型最近科技巨头英特尔宣布裁员2万人传统岗位不断缩减但AI相关技术岗疯狂扩招有3-5年经验大厂薪资就能给到50K*20薪不出1年“有AI项目经验”将成为投递简历的门槛。风口之下与其像“温水煮青蛙”一样坐等被行业淘汰不如先人一步掌握AI大模型原理应用技术项目实操经验“顺风”翻盘这些资料真的有用吗这份资料由我和鲁为民博士(北京清华大学学士和美国加州理工学院博士)共同整理现任上海殷泊信息科技CEO其创立的MoPaaS云平台获Forrester全球’强劲表现者’认证服务航天科工、国家电网等1000企业以第一作者在IEEE Transactions发表论文50篇获NASA JPL火星探测系统强化学习专利等35项中美专利。本套AI大模型课程由清华大学-加州理工双料博士、吴文俊人工智能奖得主鲁为民教授领衔研发。资料内容涵盖了从入门到进阶的各类视频教程和实战项目无论你是小白还是有些技术基础的技术人员这份资料都绝对能帮助你提升薪资待遇转行大模型岗位。以上全套大模型资料如何领取

更多文章