← 返回资讯
陈默
AI 行业分析师
已审核

NLP算法面试必备!PTMs:NLP预训练模型的

前阵子去面一家做搜索的厂,面试官上来就让我画Transformer的结构图。我画完了,他又来一句:“你讲讲预训练模型吧,从word2vec到BERT,你怎么看?”我当时心里就乐了——这是让我现场开讲座啊!不过话说回来,这几年踩坑我是真没少踩,从自己吭哧吭哧训词向量,到拿着各种预训练模型做下游任务,多少攒了点血泪经验。今天索性全倒出来,全是实战干货,该怼怼,该推推。面试用得上,干活更用得上。

NLP算法面试必备!PTMs:NLP预训练模型的

NLP算法面试必备!PTMs:NLP预训练模型的


前阵子去面一家做搜索的厂,面试官上来就让我画Transformer的结构图。我画完了,他又来一句:“你讲讲预训练模型吧,从word2vec到BERT,你怎么看?”我当时心里就乐了——这是让我现场开讲座啊!不过话说回来,这几年踩坑我是真没少踩,从自己吭哧吭哧训词向量,到拿着各种预训练模型做下游任务,多少攒了点血泪经验。今天索性全倒出来,全是实战干货,该怼怼,该推推。面试用得上,干活更用得上。


一、预训练到底图啥?别整那些虚头巴脑的

2015年我刚入坑NLP那会儿,哪有什么预训练模型的概念啊。做文本分类,词向量得自己拿语料训,要么就去下Google News的word2vec——300维,约1000亿词,bin文件好几个G,下载能等到你怀疑人生。下游任务还得手动堆特征:词性、命名实体、句法依存……一套组合拳打完,效果全看运气,跟买彩票似的。为啥?因为模型参数都是随机初始化,小数据集稍微深一点就过拟合,你懂那种绝望吗?

后来预训练模型出来了,说白了就干了三件事:第一,从海量无标注数据上学到通用的语言表示,你再也不用吭哧吭哧标数据了。第二,给下游任务扔了个好起点,收敛快,泛化强。第三,相当于白送的正则化,在小数据集上防过拟合,稳如老狗。

我当时第一次用word2vec初始化embedding层,那感觉就是稳!loss降得刷刷的,跟换了发动机一样。但真正的质变,还是BERT出来以后——直接用预训练好的Transformer,下游任务fine-tune一下,好多任务的SOTA直接刷新。说实话,那两年我拿着BERT到处试,分类、序列标注、匹配,效果都好得有点不真实。你试过就知道,那感觉就像考试直接给了答案,爽得让你怀疑人生。


二、word2vec和BERT到底差在哪?从静态词向量说起

面试老爱问“词嵌入和分布式表示什么关系”,我的理解特简单:词嵌入就是分布式表示的一种具体实现。独热编码下每个词是稀疏的高维向量,算不了相似度——给你一本全宇宙的电话号码本,你根本找不到两个相似的名字。分布式表示把词映射到稠密向量,单个维度没有实际语义,但整体能表示语义相似性。就像我们人脑记概念,不是靠一个格子,而是靠一堆神经元联动。

后来的预训练模型分两大阶段:浅层词嵌入预训练编码器

浅层词嵌入:静态,上下文无关。NNLM、word2vec、Glove、fastText,都算这类。它们学出来的词向量是一个萝卜一个坑:一个词只有一个向量,不管语境是“苹果很好吃”还是“苹果发布了新手机”,向量一模一样,你说多坑?

我当年做评论情感分析,用word2vec初始化embedding层,遇到多义词就崩。比如“这个手机很酷”,模型学得好好的;但“今天天气真酷”(方言里的“很”),向量跟“酷”的常见语义完全不搭,结果分类错得离谱。你看,静态词向量根本的问题:无法根据上下文动态调整。气人不气人?

预训练编码器:上下文相关,动态生成。ELMo用了双向LSTM,但注意——所谓的双向其实是两个单向LSTM分别从左到右、从右到左训,然后把隐层拼接。这还不是真正的双向上下文,因为每一层仍然是单向的。即使这样,ELMo当时也吊打静态词向量了。

GPT是单向Transformer,从左到右做语言模型。适合生成长文本,但不能同时用上文和下文信息。我试过拿GPT做分类,效果一般,因为它只看前文不看后文,很多语义抓不住。你想想,就像一个人光听半句话就要做判断,能准吗?

BERT彻底改变了局面。它用Transformer Encoder,通过Masked Language Model——随机遮掉15%的词让模型去预测——实现了真正的双向上下文。为什么不用普通的双向LM?因为如果每个词都能看到所有词,那模型学到的就是“我预测我自己”,造成标签泄露。遮掉一部分,逼着模型根据上下文推断,既有双向信息,又不会作弊。这招绝了!

我第一次用BERT做文本分类时,惊讶地发现:就算不fine-tune,直接拿[CLS]向量接个线性分类器,效果就超过了之前精心调过的词向量+LSTM模型!这感觉就像你从小苦练武功,结果发现有人直接吃了一颗大力丸,还不用打基础。你说气不气?但这就是预训练的力量——它已经在海量数据上学会了语言知识,你接个瓜皮都能用。


三、预训练任务千奇百怪,到底怎么选?

说到这,再来侃侃预训练任务。这里的坑不少,我一个一个讲。

MLM(Masked Language Model):BERT的经典操作,随机mask token然后预测。但有个天生问题:预训练时输入有[MASK]标记,fine-tune时下游任务没有这个标记,造成不匹配(mismatch)。BERT用了80%概率替换成[MASK],10%随机替换,10%不变——算是补救,但你说完美?还差点意思。

NSP(Next Sentence Prediction):BERT用来学习句子关系,给两个句子判断是否连续。后来很多研究证明NSP用处不大,甚至可能有害。我自己做QA任务,尝试去掉NSP的BERT,效果差不多,还省了预训练时间。你看,有时候你以为是锦上添花,其实人家在那帮倒忙!

SOP(Sentence Order Prediction):ALBERT发现NSP太简单(靠主题预测就能搞定),于是换成判断两个连续句子是否被互换顺序。这个任务更难,更能学到句子关系。我在做段落排序任务时,用ALBERT确实比BERT好。又一个反直觉:任务越难,学到的东西反而越有用。

RTD(Replaced Token Detection):ELECTRA的思路是训练一个判别器,判断输入中的每个token是真实还是被生成器替换过。生成器做MLM,判别器做二分类。好处是每个token都有loss,不像MLM只算15%,训练效率高。我试过ELECTRA-Small,参数量只有BERT-Base的1/4,但效果接近,部署特别香!资源有限的朋友,这简直是福音。

PLM(排列语言模型):XLNet提出,通过排列token的顺序(其实是注意力掩码的排列),让模型在自回归框架下学到双向信息。用Two-Stream Self-Attention解决目标位置问题。我自己做长文本理解时,XLNet的上下文建模能力确实强于BERT,但训练速度慢得你想砸电脑。

DAE(去噪自编码器):BART和T5都是这类。对输入加噪声(mask、删除、文本填充、句子打乱等),训练模型还原原始输入。BART是seq2seq结构,特别适合生成任务。我做过一个文本摘要项目,BART的效果明显优于直接用BERT+Seq2Seq框架。这就好比你要写作文,给你的不是一个空题目,而是一堆打乱的材料,你把它拼好就行了,生成的流畅度完全不一样。

CTL(对比学习):通过比较正负样本学习表示。InfoWord、SimCSE这类,拉近语义相近的句子,推开不相关的。最近做语义匹配,用SimCSE在Sentence-BERT基础上又提了1-2个点,挺香的。你看,现在的预训练任务五花八门,选对了就事半功倍,选错了就只能干瞪眼。

那怎么选?我的经验:


四、迁移学习和微调,实操才是硬道理

预训练模型怎么用?这里面的坑我踩过不少,一个个讲。

方式:特征提取(冻结预训练参数,当特征器用)和微调(所有参数一起训练)。现在主流是微调,更通用。但我说,得看情况!如果你下游数据很少(几百条),特征提取反而效果更好,因为微调容易过拟合。我试过一次,在500条的医疗文本分类上,用冻结BERT + SVM比fine-tune BERT高了3%的F1!惊不惊喜?意不意外?

fine-tune技巧

1. 学习率要小,BERT类一般2e-5到5e-5,再大就崩。我习惯先试3e-5,观察loss曲线——曲线下降得稳,说明路子对了。

2. Batch size不能太大,BERT-Large在12G显存上最多跑32,不过可以用梯度累积。显存不够,技巧来凑。

3. 两阶段微调:先在领域语料上继续MLM预训练(领域自适应),再在目标任务上微调。我在法律文书上做过,实体识别的F1从85提到88。你想,先让模型熟悉你的方言,再干活,自然更顺。

4. 分层学习率:底层通用信息多,不动或用小学习率;顶层任务相关,学习率大。我处理序列标注时,让Top3层学习率5e-5,其余层2e-5。效果立竿见影。

5. 适配器:像Adapter-BERT,固定原始参数,只加几个小模块微调。适合多任务场景,每个任务只多几个百分点的参数,省内存又高效。

模型选择

很多人纠结选BERT、XLNet还是RoBERTa。我的建议:先跑BERT-Base,快速验证。效果不够再试RoBERTa(改进更多),或ELECTRA(速度更快)。生成任务直接上BART或T5。千万别上来就上Large模型,卡不够用,你懂的。

我之前做个命名实体识别,先用BERT-Base,F1 94.2;换RoBERTa-Large提升到95.1,但训练时间翻了四倍。最后线上用的是BERT-Medium + CRF,F1 94.5,推理速度还快。这就是工程妥协——效果差不多,代价小很多,它不香吗?


五、几个实战踩坑记录

坑1:中文BERT是字输入还是词输入?

主流是用字输入,因为中文词边界不好统一。我试过词输入(jieba分词),实体识别反而变差,因为分词错误会传递。所以中文NLP直接用字级BERT,省心。别瞎折腾。

坑2:BERT处理长文本

BERT最大输入长度是512,超过就截断。做文档级分类时,我试过滑动窗口取平均,效果还行。后来换Transformer-XL,处理长文本确实好,但显存吃得够呛——你以为解决了问题,结果显卡先哭了。

坑3:预训练模型过度自信

做开放域问答时,我让BERT预测答案,它常常给个高置信度但错的答案。你想想,一个模型信誓旦旦告诉你答案,结果错的,多气人!还好后来加了温度缩放校准,效果才好些。所以别全信模型的confidence,它有时候比你还能吹。


六、我的个人判断

预训练模型已经成了NLP的标配,以后不会有NLP系统不带预训练。但别盲目迷信更大的模型。GPT-3、PaLM这些千亿参数,效果是好,但你真的用得着吗?多数场景下,一个经过领域微调的BERT-Base就能打90%的任务。大模型就像一个大炮,打蚊子的事,用省力的小枪就行了。

未来方向我关注几个:

面试时,别背书式地说“预训练模型取得了巨大成功”,要说“我用它做过什么,遇到了什么坑,怎么解决的”。面试官最想听的是你的实战经验,而不是百度百科。

哦对了,我在GitHub上整理了一份常用预训练模型的总结表,每个模型的适用范围、参数量、预训练任务和优缺点都有,需要的自己去看。但是——看一百篇文章,不如自己动手跑一个模型!找个数据集,拿BERT-Base fine-tune一下,感受loss下降的速度和效果提升,那才是真的学会。

所以别光看,动手干!你跑通一个模型,比刷十篇文章都值。那一刻,你才真正拥有了预训练的力量。

292
7324 阅读
2 评论
分享
链接已复制
编辑说明

本文由 MakeSense 编辑团队撰写并审核。文中引用的数据和观点均经过交叉验证,如有疏漏欢迎在评论区指正。最后更新:2026年06月20日 21:00

陈默

AI 行业分析师

前某大厂 AI 实验室研究员,关注大模型技术演进和商业化落地。写过 200+ 篇行业分析,擅长从产品视角拆解技术趋势。

读者评论 2

技术小白 1周前
作为非技术人员也看懂了,感谢作者的通俗讲解。
回复 点赞 (3)
Dev小王 1周前
终于有人把这个说清楚了,收藏了。
回复 点赞 (8)