跳到主要内容

从 RNN 到 BERT:让机器记住上下文

这一章讲三件事: 语言为什么逼着神经网络「长出记忆」; RNN→LSTM→注意力→Transformer→BERT 这条线的每一步在解决什么; 以及网上最热的「LSTM 预测股价」为什么被作者亲手拆穿。 本章是全书文字算法的主干,也是「微调」模式在 NLP 的翻版。

1. 问题的根:语言需要记忆

书里给了一个准确的起点:文字的推断不但要看上下文,还要靠记忆力——像提到治水就想到大禹,时间久远也忘不掉1。而前面所有模型(Dense、CNN)都假设输入的各部分互相独立,这对「词序就是语义」的语言不成立。于是整章的演进只有一个主题:怎么把「之前读过的内容」带到现在这一步

2. RNN:把上一步的输出接回下一步

循环神经网络(RNN)的改动只有一处:普通回归是 Y=WX+b;RNN 的隐藏状态是 h_t = W·h_(t−1) + U·x_t + b——上一时间点的 h 也作为本步的输入2。每读一个词,网络带着「之前读到的一切」的摘要往前走一格。

工程上,RNN 系模型的第一层必须是嵌入层(Embedding):把词的整数编号转成稠密向量(第 11 章的词向量在这里进网络)。书里的实测:输入 (32,10) 的词编号,嵌入层输出 (32,10,64)——每词变成 64 维向量3

情绪分析实战(IMDB 影评):只用嵌入+Dense 只有 80%,加上一层简单 RNN 直接到 100%(示例任务),词序信息确实是关键4。但书里立刻补了一个使用细节:IMDB 的影评都很长,拿短句 "I like the movie" 去测训好的模型,得不到正确预测——模型学的是「长影评的统计规律」,不是词典5

3. LSTM:给 RNN 装上记忆线

RNN 的死穴还是老相识——梯度消失。RNN 权值共享,梯度回传时带着 W 的 n 次方:W<1 越乘越小,前面的层影响力趋零(记不住远处的词);W>1 越乘越大,训练不收敛6。第 07 章 BatchNorm 那节讲过同一对病症,这里换了发生场景:RNN 的「层」是时间步。

LSTM(长短期记忆网络,Hochreiter & Schmidhuber 1997)的处方:在隐藏状态之外额外维护一条记忆线(Cell State),由三个「阀门」控制记忆的读写7:

  • 遗忘阀:旧的记忆要不要删(sigmoid 输出 0=删,1=留);
  • 输入阀:当前输入里有多少新信息值得写进记忆;
  • 输出阀:记忆里有多少要用来产生当前输出。

(更新阀描述的是记忆线的更新动作:旧记忆+新信息。)GRU 是它的精简版:砍掉独立的记忆线,两个阀门合并成一个更新阀,省时省内存——但作者实测两者的效果差异并不明显,业界主流仍是 LSTM8

参数行为要专门学,因为 LSTM 有几个反直觉的开关9:return_sequences=True 才会把每个时间步的输出传给下一层(两层 LSTM 串联时,前一层必须开);stateful=True 让上一批的最后状态接到下一批。开不开,输出的形状完全不同(书里逐个打印了输出张量)。

主走查:航空营收预测——五个配置的「复杂度惩罚」

书里用同一份 1949–1960 年的月度航空营收数据,连跑五种 LSTM 配置,结果是一份「更复杂不等于更好」的完整对照表10:

配置测试 RMSE说明
前 1 期作特征47.63基准
前 3 期作特征62.55多期平均了信号,曲线变平缓,反而钝
落后 3 期作时步66.19更差
stateful 分批训练51.74略好,不明显(主要为演示参数)
Stacked LSTM(多层堆叠)86.85数据简单,模型越复杂越差

这五行数字是本章最值得带走的实测:数据只有 144 个月、模式单一,任何加码(更多特征、更深层)都在把噪声当知识学。两个工程细节随表附送:两层 LSTM 串联前层必须 return_sequences=True;训练与预测之间要 reset_states,别把训练时的状态「串场」到预测里。

拆穿股价预测

网上最热的「LSTM 预测股价」,书里也实测了,并当场拆穿一个视觉魔术:把训练集+测试集全画在一张图上,预测线看起来贴合得漂亮——「但其实只是镜头拉远的效果」;只拉近看测试段,预测就露馅了(移动窗口之间画线连成的假象)11。书里给的三个冷静理由12:股价非稳态(均值方差(波动幅度)随时间漂移,常规做法是转成收益率);波动太大,用长期历史预测不合理;预测 1 天还算准但没有意义(涨跌幅度本来就小),预测多天又不准。

4. 注意力:废除「按顺序读」

RNN/LSTM 都在「排队读」:词按顺序过,越靠近预测目标的词权重越大。注意力机制(Attention)拆掉这个约束:预测每个词时,直接回看全句,按「相关程度」加权取用——就像人读文章会盯住标题、人名、强烈的形容词,而不是匀速扫过13

落地场景是机器翻译的 Seq2Seq 架构:编码器读入原句压成上下文向量,译码器逐词生成译文;注意力让译码器每写一个词,都能回头查原句,权重经全连接层+softmax 算出(Luong 乘法版/Bahdanau 加法版)14。实测的验证方式很直观:画注意力热图,译文与原文逐词对应时,最亮的格子落在对角线上15。这一节还顺带给了 Seq2Seq 的五种形态(一对一/一对多/多对一/多对多/同步多对多),分别对应影像分类、看图说话、情绪分析、翻译、视频逐帧打标——后面好几章的应用都挂在这张表上16

5. Transformer:自注意力 + 全并行

Vaswani 等人 2017 年把注意力推到极致:Transformer。动机仍然是速度——RNN 系必须逐词串行训练,而自注意力机制(Self-Attention)能并行计算所有输出17

自注意力的算账过程(每个词都做一遍):

① 每个词派生三个角色:
Q(Query,我在找什么) K(Key,我能被怎么查) V(Value,我的内容)
② Q×K 点积:我和每个词有多相关
③ 除以 √d_k 缩放(维度 64 时即 ÷8,防点积过大)
④ softmax 转成权重(全句加起来=1)
⑤ 权重 × V 求和:我的新表示 = 按相关度把全句的信息各取一点
⑥ 这套机制并列 8 个头(Multi-Head),各看各的相关性,再串联

图说:书里配了原论文的运算图;数值例见「it=animal」那句。

书里选的例句是理解自注意力的钥匙:「The animal didn't cross the street because it was too tired」——it 指的是 animal 还是 street?自注意力算出 it 与 animal 关联度最高,代词的指代问题变成了可计算的权重问题18。性能坐标:8 颗 P100 训 3.5 天,英德翻译 BLEU 28.4 分(BLEU 是翻译质量的 n-gram 重合度评分)19

6. BERT:上下文相关的词向量 + 两阶段微调

第 11 章留的问题在这里收口:Word2Vec/GloVe 一词一向量,解不了 Apple(水果/公司)的一词多义。BERT 是「上下文相关」的:输入是一个句子,同一个词在不同句子里向量不同——书里的一对例句:We go to the river bank(岸边)vs I need to go to bank to make a deposit(银行)20

BERT 怎么练出来?不用人工标注,靠两个自监督任务21:

  • Masked LM:随机把 15% 的词遮成 [MASK],让模型用其余部分猜被遮的词——相当于「完形填空」,这逼它学会双向上下文;
  • Next Sentence Prediction:给两句,判断第二句是不是第一句的下文;输入要加三类标记(Token/Sentence/Position 嵌入)。

成本核算很直白:BERT 用 4~16 个 TPU 要训 4 天——所以照第 07 章的剧本:下载预训练模型,自己只做微调(分类/问答/命名实体识别(标出人名/地名/机构)三类任务书里都给了入口)22

Transformers 库把预训练模型变成三行代码的调用。书里的实测有两个亮点23:

  • 否定句:RNN/LSTM/GRU 时代模型碰到否定句全军覆没;BERT 系全对,连「don't hate(不讨厌)≠喜欢」这种中性态都能给出 0.5 的分数;
  • 文字生成的变化开关:GPT-2 的 do_sample=False 每次生成一模一样,True 则每次不同——聊天机器人要的是后者(「How are you」有时答 I am fine 有时答 Great)。

库的功能清单里还包括问答、克漏字、摘要、翻译与特征提取(类似词向量,把文字转为向量)23——第 11 章 Doc2Vec 做得不理想的句子比对,到这里由问答与语义类任务接管,「换 BERT 会好很多」的预告在此兑现。

规模终局:BERT 变形统称 BERTology,轻量版 ALBERT/TinyBERT 到 GPT-3 的 1750 亿参数24。原书 2022 年的判断:项目应用优先采用 BERT 系25

判断(我们的,不是书里的): 本章两个「拆穿」值得当成一样的教训:股价预测的「准」是画图错觉,Stacked LSTM 的「深」是过拟合——序列模型领域,「看起来有效」与「真的有效」之间隔着回测与留出集。作者作为统计出身写这两节时的克制,比模型本身更值钱。 如果错,会错在: 如果任务本身是高信噪比的长程依赖(如 genuine 时间序列),更复杂的模型确实可能更好;判断依据永远是留出集表现,而不是模型复杂度。

7. 可带走的

  1. RNN 的一处改动:h_t=W·h_(t−1)+U·x_t+b——上一步的隐藏状态参与本步;嵌入层是 RNN 系的第一层标配;
  2. 梯度消失在时间轴上重演(权值共享→Wⁿ);LSTM 用记忆线+遗忘/输入/输出三个阀门保长程记忆;GRU 更简,但实测差异不明显;
  3. 两层 LSTM 串联,前层必须 return_sequences=True;批次间用 stateful,周期间 reset_states;
  4. 主走查五连测:47.63→62.55→66.19→51.74→86.85——数据简单时,每一分复杂度都是负资产;
  5. 股价预测的「准」是镜头拉远的错觉:非稳态数据+有限波动,「预测 1 天准而无意义,预测多天不准」;
  6. 注意力=按相关度回看全句,热图对角线验证逐词对上了位;Seq2Seq 五形态对应五类任务;
  7. Transformer=自注意力(Q/K/V,÷√d_k,softmax,8 头)+全并行;「it=animal」是它的招牌演示;
  8. BERT=15% 挖空(Masked LM)+接句判断(NSP)自监督预训练;bank 两岸(岸边/银行)终结一词一向量;否定句是它对 RNN 系的碾压局;
  9. 项目应用优先 BERT 系(原书结论);GPT-3 已到 1750 亿参数——规模竞赛在书出版时已经发令。

8. 原文地图

主题原书章原文位置
记忆力与大禹第12章 自然语言处理的算法text/97-ch12.txt:9(搜「记忆力」)
嵌入层 (32,10,64)、unroll12-1 循环神经网络text/98-ch12-12-1.txt:43(搜「第一层必须为嵌入层」) · text/98-ch12-12-1.txt:75(搜「unroll=True」)
IMDB 86.63、短句失效12-2 长短期记忆网络text/99-ch12-12-2.txt:101(搜「86.63」) · text/99-ch12-12-2.txt:103(搜「I like the movie」)
权值共享与梯度消失12-2 长短期记忆网络text/99-ch12-12-2.txt:7(搜「权值共享(Shared Weights」) · text/99-ch12-12-2.txt:31(搜「梯度消失」)
三个阀门12-2 长短期记忆网络text/99-ch12-12-2.txt:59(搜「遗忘阀」) · text/99-ch12-12-2.txt:71(搜「更新阀」) · text/99-ch12-12-2.txt:77(搜「输出阀」)
return_sequences/stateful12-3 LSTM重要参数与多层LSTMtext/100-ch12-12-3-lstm-lstm.txt:9(搜「return_sequences」) · text/100-ch12-12-3-lstm-lstm.txt:15(搜「stateful=True」)
航空五连测 RMSE(主走查)12-3 LSTM重要参数与多层LSTMtext/100-ch12-12-3-lstm-lstm.txt:87(搜「RMSE分别为22.84」) · text/100-ch12-12-3-lstm-lstm.txt:101(搜「22.83、62.55」) · text/100-ch12-12-3-lstm-lstm.txt:115(搜「27.19、66.19」) · text/100-ch12-12-3-lstm-lstm.txt:127(搜「25.91、51.74」) · text/100-ch12-12-3-lstm-lstm.txt:137(搜「24.28、86.85」)
GRU 实测差异不大12-4 Gate Recurrent Unittext/101-ch12-12-4-gate-recurrent-unit.txt:23(搜「差异并不明显」)
股价:镜头拉远、非稳态12-5 股价预测text/102-ch12-12-5.txt:71(搜「镜头拉远」) · text/102-ch12-12-5.txt:85(搜「非稳态」)
注意力定义与热图12-6 注意力机制text/103-ch12-12-6.txt:5(搜「注意力机制(Attention Mechanism」) · text/103-ch12-12-6.txt:129(搜「热图的对角线」) · text/103-ch12-12-6.txt:25(搜「Bahdanau」)
Seq2Seq 五形态12-6 注意力机制text/103-ch12-12-6.txt:143(搜「one to one」)
Transformer 起源、并行12-7 Transformer架构text/104-ch12-12-7-transformer.txt:5(搜「Vaswani」) · text/104-ch12-12-7-transformer.txt:15(搜「并行计算」)
Q/K/V、缩放、8 头12-7 Transformer架构text/104-ch12-12-7-transformer.txt:19(搜「Key Vector」) · text/104-ch12-12-7-transformer.txt:33(搜「维度开根号」) · text/104-ch12-12-7-transformer.txt:51(搜「8个头」)
it=animal、BLEU12-7 Transformer架构text/104-ch12-12-7-transformer.txt:71(搜「it是代表animal」) · text/104-ch12-12-7-transformer.txt:83(搜「BLEU」)
BERT 双任务12-8 BERTtext/105-ch12-12-8-bert.txt:27(搜「Masked LM(MLM」) · text/105-ch12-12-8-bert.txt:33(搜「15%的词汇先以」) · text/105-ch12-12-8-bert.txt:53(搜「Token embedding」)
bank 两义、TPU 成本12-8 BERTtext/105-ch12-12-8-bert.txt:9(搜「上下文相关(Context Dependent」) · text/105-ch12-12-8-bert.txt:79(搜「4~16个TPU」)
否定句、do_sample12-9 Transformers库text/106-ch12-12-9-transformers.txt:45(搜「否定句也可以正确分类」) · text/106-ch12-12-9-transformers.txt:49(搜「don't hate」) · text/106-ch12-12-9-transformers.txt:119(搜「do_sample=False」)
BERTology、GPT-3 规模12-9 Transformers库text/106-ch12-12-9-transformers.txt:309(搜「BERTology」)
优先 BERT 结论12-10 总结text/107-ch12-12-10.txt:5(搜「建议应优先采用BERT」)

Footnotes

  1. 出处:「第12章 自然语言处理的算法」第 9 段(text/97-ch12.txt:9,搜「记忆力」)。

  2. 出处:「12-1 循环神经网络」第 5 段(text/98-ch12-12-1.txt:5,搜「Auto-regression」)。RNN 公式在同段。

  3. 出处:「12-1 循环神经网络」第 43 段(text/98-ch12-12-1.txt:43,搜「第一层必须为嵌入层」)与第 55 段(text/98-ch12-12-1.txt:55,搜「(32, 10, 64)」)。

  4. 出处:「12-1 循环神经网络」第 69 段(text/98-ch12-12-1.txt:69,搜「准确率为80%」)与第 77 段(text/98-ch12-12-1.txt:77,搜「准确率为100%」)。

  5. 出处:「12-2 长短期记忆网络」第 103 段(text/99-ch12-12-2.txt:103,搜「I like the movie」)。

  6. 出处:「12-2 长短期记忆网络」第 7 段(text/99-ch12-12-2.txt:7,搜「权值共享(Shared Weights」)与第 31、35 段(text/99-ch12-12-2.txt:31,搜「梯度消失」)。

  7. 出处:「12-2 长短期记忆网络」第 49 段(text/99-ch12-12-2.txt:49,搜「记忆线(Cell State」)、第 57 段(text/99-ch12-12-2.txt:57,搜「遗忘阀」)、第 65 段(text/99-ch12-12-2.txt:65,搜「输入阀」)、第 71 段(text/99-ch12-12-2.txt:71,搜「更新阀」)与第 77 段(text/99-ch12-12-2.txt:77,搜「输出阀」)。

  8. 出处:「12-4 Gate Recurrent Unit」第 7 段(text/101-ch12-12-4-gate-recurrent-unit.txt:7,搜「改良LSTM的缺陷」)与第 23 段(text/101-ch12-12-4-gate-recurrent-unit.txt:23,搜「差异并不明显」)。

  9. 出处:「12-3 LSTM重要参数与多层LSTM」第 9 段(text/100-ch12-12-3-lstm-lstm.txt:9,搜「return_sequences」)与第 15 段(text/100-ch12-12-3-lstm-lstm.txt:15,搜「stateful=True」)。参数实测的输出张量在第 33~53 段。

  10. 出处:「12-3 LSTM重要参数与多层LSTM」第 87 段(text/100-ch12-12-3-lstm-lstm.txt:87,搜「RMSE分别为22.84」)、第 101 段(text/100-ch12-12-3-lstm-lstm.txt:101,搜「22.83、62.55」)、第 115 段(text/100-ch12-12-3-lstm-lstm.txt:115,搜「27.19、66.19」)、第 127 段(text/100-ch12-12-3-lstm-lstm.txt:127,搜「25.91、51.74」)与第 137 段(text/100-ch12-12-3-lstm-lstm.txt:137,搜「24.28、86.85」)。

  11. 出处:「12-5 股价预测」第 71 段(text/102-ch12-12-5.txt:71,搜「镜头拉远」)与第 77 段(text/102-ch12-12-5.txt:77,搜「画线就会造成错觉」)。

  12. 出处:「12-5 股价预测」第 83 段(text/102-ch12-12-5.txt:83,搜「并不准确」)与第 85 段(text/102-ch12-12-5.txt:85,搜「非稳态」)。

  13. 出处:「12-6 注意力机制」第 5 段(text/103-ch12-12-6.txt:5,搜「注意力机制(Attention Mechanism」)。

  14. 出处:「12-6 注意力机制」第 25 段(text/103-ch12-12-6.txt:25,搜「Bahdanau」)与第 15 段(text/103-ch12-12-6.txt:15,搜「Context Vector」)。

  15. 出处:「12-6 注意力机制」第 129 段(text/103-ch12-12-6.txt:129,搜「热图的对角线」)。

  16. 出处:「12-6 注意力机制」第 143 段(text/103-ch12-12-6.txt:143,搜「one to one」)。

  17. 出处:「12-7 Transformer架构」第 5 段(text/104-ch12-12-7-transformer.txt:5,搜「Vaswani」)与第 15 段(text/104-ch12-12-7-transformer.txt:15,搜「并行计算」)。

  18. 出处:「12-7 Transformer架构」第 71 段(text/104-ch12-12-7-transformer.txt:71,搜「it是代表animal」)。

  19. 出处:「12-7 Transformer架构」第 83 段(text/104-ch12-12-7-transformer.txt:83,搜「BLEU」)。

  20. 出处:「12-8 BERT」第 9 段(text/105-ch12-12-8-bert.txt:9,搜「上下文相关(Context Dependent」)与第 11 段(text/105-ch12-12-8-bert.txt:11,搜「river bank」)。

  21. 出处:「12-8 BERT」第 27 段(text/105-ch12-12-8-bert.txt:27,搜「Masked LM(MLM」)、第 33 段(text/105-ch12-12-8-bert.txt:33,搜「15%的词汇先以」)与第 29 段(text/105-ch12-12-8-bert.txt:29,搜「Next Sentence Prediction(NSP」)。

  22. 出处:「12-8 BERT」第 79 段(text/105-ch12-12-8-bert.txt:79,搜「4~16个TPU」)。

  23. 出处:「12-9 Transformers库」第 45 段(text/106-ch12-12-9-transformers.txt:45,搜「否定句也可以正确分类」)、第 49 段(text/106-ch12-12-9-transformers.txt:49,搜「don't hate」)与第 119 段(text/106-ch12-12-9-transformers.txt:119,搜「do_sample=False」)。功能清单(问答/克漏字/摘要/翻译/特征提取)见第 13~25 段(text/106-ch12-12-9-transformers.txt:25,搜「类似词向量」)。 2

  24. 出处:「12-9 Transformers库」第 309 段(text/106-ch12-12-9-transformers.txt:309,搜「BERTology」)。

  25. 出处:「12-10 总结」第 5 段(text/107-ch12-12-10.txt:5,搜「建议应优先采用BERT」)。