Word2Vec 到 BERT 有怎样的改进?
Word2Vec 到 BERT 有怎样的改进?
这道题考的是词向量技术的演进逻辑,从 Word2Vec 的静态词向量到 BERT 的动态语境感知词向量,背后是一整套 NLP 范式的升级。面试官想看你能不能说清楚:为什么 Word2Vec 不够用、BERT 做了什么、预训练-微调模式为什么有效。
我从四个方面来讲:Word2Vec 的硬伤、BERT 的核心改进、预训练-微调范式的意义、BERT 如何适配下游任务。
Word2Vec 的"硬伤"在哪里
Word2Vec 2013 年出来的时候,大家觉得挺香的——终于有个办法把词变成向量了,而且语义相近的词在向量空间里离得近。
但它有两个致命问题。
第一个:一词多义搞不定。
"bank"这个词,在"我去银行存钱"和"我在河边坐坐"里,意思完全不一样。但 Word2Vec 给每个词只生成一个向量,不管上下文怎么变,这个词的向量永远是一样的。
就像字典里同一个词永远只有同一个解释。你查"bank",永远只有一个答案。但现实中这个词就是有多个意思,你怎么根据语境区分?Word2Vec 做不到。
第二个:单向窗口,视野有限。
Word2Vec 用的是 CBOW 或者 Skip-gram,本质上都是用窗口内的词预测目标词。窗口就那么大,通常就五六个词。
这意味着模型只能"看到"目标词附近的内容,无法建立长距离的语义依赖。比如一篇文章开头说"今天天气真好",结尾说"所以我们决定去野餐",这两句话的关系 Word2Vec 根本捕捉不到。
这两个问题加在一起,决定了 Word2Vec 只能做浅层的语义表示,上限就在那里。
BERT 的三大核心改进
BERT 2018 年出来,横扫了 NLP 各项榜单。它做了三件关键的事。
改进一:双向语言模型
Word2Vec 是单向的——要么用上文预测词,要么用下文预测词。BERT 同时看上下文。
举个例子,"我喜欢吃苹果"这句话,"苹果"到底是水果还是手机品牌?
单向模型只能看到"我喜欢吃",只能猜是个水果。但 BERT 训练的时候,同时看到"我喜欢吃"和"苹果"后面有没有别的词,综合判断。这个区别看起来简单,但效果差距巨大。
为什么能做到?因为 BERT 用的是 Transformer 架构,不是 RNN。Transformer 通过 Self-Attention 机制,每个位置都能直接看到序列里所有其他位置的信息,不像 RNN 那样需要一步步传递。
这解决了 Word2Vec 窗口太小的问题,长距离依赖也能建模了。
改进二:动态词向量
这是 BERT 解决一词多义问题的关键。
Word2Vec 给每个词分配一个固定的向量表,查表得到。BERT 不一样——每个词的向量是根据它当前所处的上下文动态生成的。
"bank"在"bank account"里,和在"river bank"里,生成的向量完全不同。因为 Attention 机制会考虑上下文词的影响,距离近的词影响大,距离远的词影响小,但都会有贡献。
同一个词在不同的句子、甚至同一句话的不同位置,生成的向量都可能不一样。
这就是语境感知(Contextualized)的含义。
改进三:MLM + NSP 多任务预训练
BERT 的训练分两个任务。
Masked Language Model(MLM):随机把 15% 的词替换成 [MASK] 标记,让模型根据上下文预测被遮住的词。这让 BERT 学会双向上下文建模。
Next Sentence Prediction(NSP):给模型两个句子,让它判断第二个句子是不是第一个句子的下一句。这让 BERT 学会理解句子之间的关系,对问答、推理这类任务很有帮助。
两个任务一起训练,模型既能理解词级语义,又能理解句级语义。
预训练-微调范式的革命性意义
BERT 之前,NLP 模型基本是针对每个任务从头训练。需要大量标注数据,而且不同任务之间完全无法共享。
BERT 开创的预训练-微调范式彻底改变了这个局面。
预训练阶段:在海量无标注文本(Wikipedia、BooksCorpus)上,用自监督学习(MLM、NSP)训练一个通用语言模型。模型学到的是通用的语言表示——词法、句法、语义、甚至一些常识。
微调阶段:把预训练好的模型接到下游任务的输出层,用少量标注数据针对具体任务(比如情感分类、命名实体识别)做训练。因为预训练已经给了模型一个很好的起点,微调只需要很少的数据和训练时间。
打个比方:预训练就像一个人在大学里系统学习了语文、逻辑、常识各门课,打下了扎实的语言功底。微调就像针对具体工作(做销售、写文案、翻译)做短期培训。因为基础好,培训效果又快又好。
这个范式为什么革命性?因为它把 NLP 任务的门槛大幅降低了。之前需要几百万标注数据才能训一个模型,现在可能几千条就够了。预训练模型学到的通用知识可以迁移到任何下游任务。
BERT 如何适配下游任务
BERT 是通用的,但下游任务各式各样。BERT 通过改造输入和输出层,适配四种常见任务。
分类任务:在句子开头加一个 [CLS] 标记,这个位置对应的输出向量作为整个句子的表示,接一个分类层就完事了。[CLS] 向量聚合了整句信息,直接用于分类。
序列标注任务:每个词的位置都有对应的输出向量。NER(命名实体识别)就是典型的序列标注,给每个词标注它是人名、地名还是机构名。BERT 用每个位置的输出向量接一个分类层,对每个词做预测。
问答任务:给定一个问题和一个段落,让模型从段落里找出答案的起始和结束位置。BERT 用问题开头和段落开头各加一个标记,然后计算段落中每个词作为答案起始和结束位置的得分,取得分最高的位置作为答案。
句子关系任务:判断两个句子的关系,比如是否语义相似、是否矛盾。类似分类任务,把两个句子拼接,中间加 [SEP] 分隔,用 [CLS] 向量判断关系。
同一种架构,通过不同的输入输出改造,就能处理完全不同的任务。这是 BERT 厉害的地方——通用性强,适配灵活。
面试怎么答
基础版(可以直接背)
Word2Vec 有两个核心问题:一是静态词向量,同一个词不管在什么语境下向量都相同,解决不了一词多义;二是单向窗口模型,只能看到局部信息,长距离依赖建模能力弱。
BERT 做了三个关键改进。第一是双向语言模型,用 Transformer 替代 RNN,同时看到上下文。第二是动态词向量,根据上下文动态生成每个词的表示,"bank"在银行场景和河岸场景下向量完全不同。第三是 MLM 加 NSP 的多任务预训练,让模型既理解词级语义又理解句间关系。
更重要的是 BERT 开创的预训练-微调范式:在海量无标注文本上预训练学习通用语言表示,然后用少量标注数据针对具体任务微调。这把 NLP 任务的门槛大幅降低,不同任务之间可以共享预训练学到的知识。
一句话:从"查字典"升级到"读句子理解"。
加分版(能拉开差距)
能画出来技术演进路径:NNLM → Word2Vec → Seq2Seq+Attention → Transformer → BERT。这条线串起来,才算真正理解了 NLP 这几年的发展脉络。
能说清楚 BERT 掩码策略的精妙设计:80% 替换成 [MASK]、10% 替换成随机词、10% 保持不变。这样做是为了缓解预训练和微调阶段不一致的问题——微调时输入不会有 [MASK],完全替换会导致模型不适应真实输入。
能对比 GPT:GPT 是单向自回归模型,只用上文预测下一个词,适合生成任务;BERT 是双向的,适合理解类任务。这是两种不同的技术路线,各有优势。
一句话总结
Word2Vec 用固定向量"查字典",BERT 用上下文"读句子理解"——这是从静态到动态、从单向到双向、从任务定制到预训练迁移的范式升级。
