本文详细解析了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、BERT

Bert是一个双向的,想要通过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个heads,dv*A=d(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*A=d(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*d=8d^2。

把这三个加起来,差不多是一个12d^2的参数量,这个就是整个encoder block里面一个参数大概的量级。这里面如果有归一化层,还会有一些少量参数。这里的d也就这里的H,也可以写成12H^2。

Bertbase和Bertlarge的参数量也就是这么计算出来的。如果把这里面的L、H和A带进去,前面要乘一个L,d也就是H,A不用管它在计算里面已经把它算进去了。如果把这两个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和dog,my和cute,my和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都用的是EA,EA在预训练的时候已经学过了,对句子做分类任务的时候,只取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大模型课程由清华大学-加州理工双料博士、吴文俊人工智能奖得主鲁为民教授领衔研发。

资料内容涵盖了从入门到进阶的各类视频教程和实战项目,无论你是小白还是有些技术基础的技术人员,这份资料都绝对能帮助你提升薪资待遇,转行大模型岗位。
在这里插入图片描述
在这里插入图片描述

以上全套大模型资料如何领取?

在这里插入图片描述

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐