跳到主要内容

三道门 — 让信息沿时间近似直着走

这一章讲三件事: 上一章那条状态为什么保不住远处的信息;三道门各管什么; 以及把一堆长短不一的英文影评喂进模型,中间要过几道工序。

它在全书链条里的位置: 第 10 章把「记不远」这件事量了出来。 这一章给出结构上的解法,并顺手把文本任务的全部工程细节走一遍。

需要的基础: 第 10 章的隐状态与数字求和任务;第 06 章那条 S 形曲线。

1. 先看现象:那条状态每走一步就被挤压一次

回看第 10 章那条更新式:每一步都是「线性映射、相加、再过一道非线性」。

问题出在最后那道非线性上。 它把结果压进 −1 到 1 之间; 而下一步又要拿这个结果去做同样的事。 走三十步,就被压了三十次。

上一章那条路径 信息的下场
───────────────────────────── ─────────────────────
h₁ = 挤压(…h₀…) 第 1 步的信息被压 1 次
h₂ = 挤压(…h₁…) 被压 2 次

h₃₀ = 挤压(…h₂₉…) 被压 30 次 → 基本没了

书里给的解法有两点改造1:

  1. 引入一条额外的内部状态,让信息能沿时间近似线性地向后流动, 不再像上一章那样反复经历乘性压缩;
  2. 加入一组门控机制 —— 输入门过滤当前输入、遗忘门选择性丢弃历史、 输出门决定向下游暴露多少,让网络自己学会「记什么、忘什么、说什么」

这一族循环单元叫长短期记忆网络,通常简称 LSTM。 名字里那个「长短期」说的正是这件事:短期记忆(那条隐状态)之外,再挂一条能存得久的。

全章主走查:同一条序列 [6, 7, 0, 0, 1, 0, 0, 0, 0, 0] 过三道门
═══════════════════════════════════════════════════════════════════
§3 ① 三道门各算一个 0 到 1 之间的数(每一维一个)
§4 ② 候选状态:这一步「想写进去」的内容
§4 ③ 内部状态 = 遗忘门 × 旧的 + 输入门 × 候选
§4 ④ 隐状态 = 输出门 × 压缩后的内部状态
§5 ⑤ 同一批长度实验重跑:成绩稳定在 0.4 左右
§6 ⑥ 热图:遇到 0 时输入门稳定,数字 1 出现后遗忘门部分维度下降
═══════════════════════════════════════════════════════════════════

2. 那条近似直着走的线

结论先行:新加的那条内部状态,每一步只做「乘一个 0 到 1 的数,再加一点新东西」。

内部状态的更新(这是这一章最要紧的一行)
────────────────────────────────────────────────
C_t = F_t ⊙ C_{t-1} + I_t ⊙ 候选_t
└ 遗忘门决定 └ 上一步的 └ 输入门决定 └ 这一步想写的
留多少 内部状态 写多少
────────────────────────────────────────────────
⚠ 注意这里没有非线性 —— 只有一次逐元素乘和一次加

书里的说法是:关键看 C 这条线,它沿时间维度几乎以「加法」方式传递, 遗忘门决定加多少旧、输入门决定加多少新—— 长程梯度不再被反复的乘性收缩压垮,远距离依赖也就有了存留空间2

为什么加法比乘法好? 回到第 09 章第 2 节那条规则:加法的反向是原样分给两边。 所以只要遗忘门接近 1,梯度沿这条线回传时几乎不衰减。

这和第 09 章那条直连边是同一个思路的两种形态:

第 09 章的直连边这一章的内部状态
越过什么空间上的几层时间上的几步
怎么越输入直接加到输出上旧状态乘一个门再加上新内容
梯度为什么不衰减加法原样分发同上,只多乘一个接近 1 的门

3. 三道门:三个一模一样的算式,三个不同的用途

结论先行:三道门的算式完全相同,区别只在各自的一组参数,以及算出来的数用在哪里。

书里给的三个式子,形状一样3:

输入门 I_t = σ(X_t·W_i + H_{t-1}·U_i + b_i)
遗忘门 F_t = σ(X_t·W_f + H_{t-1}·U_f + b_f)
输出门 O_t = σ(X_t·W_o + H_{t-1}·U_o + b_o)
────────────────────────────────────────────────
σ 就是第 05 章那条 S 形曲线,把每个门的取值压到 0 到 1 之间
书里的说法:相当于一个软性的「开关」

「软性开关」这四个字要拆开说。 一个硬开关只有 0 和 1 两种状态; 而这里每一维都可以是 0.3、0.87 这样的数——它不是开或关,是「开多少」。

而且每一维是独立的: 隐状态有 32 维,那么每道门也有 32 个数, 第 7 维可以开 0.9、第 8 维可以开 0.1。 这就是「让网络自己学会记什么、忘什么」的机制载体。

三道门各自的去向4:

  • 输入门 —— 乘在「这一步想写的内容」上,决定写多少进去;
  • 遗忘门 —— 乘在上一步的内部状态上,决定留多少;
  • 输出门 —— 乘在压缩后的内部状态上,决定向下游暴露多少。

注意这三道门都是从「当前输入 + 上一时刻隐状态」算出来的。 换句话说:开多少,取决于此刻看到了什么、以及此前记住了什么。 书里的原话是:门控的开合程度由数据驱动学出来,网络据此在不同上下文中决定保留什么、丢弃什么5

4. 主走查:一步之内,四个动作

书里把一步拆成三个阶段,我们展开成四个动作。

时刻 t 的完整一步(输入是数字 7 的向量,上一步刚读完数字 6)
═══════════════════════════════════════════════════════════════
① 算三道门 三个式子各跑一遍
得到 I_t、F_t、O_t,每个都是 32 个 0 到 1 之间的数

② 算候选状态 候选_t = tanh(X_t·W_c + H_{t-1}·U_c + b_c)
形状 [批大小, 32],取值在 −1 到 1 之间
⚠ 这一步用的是另一组参数,与三道门相区别,但同样在各时间步间共享

③ 更新内部状态 C_t = F_t ⊙ C_{t-1} + I_t ⊙ 候选_t
假设遗忘门在某一维是 0.95、输入门是 0.6:
那一维 = 0.95 × 旧值 + 0.6 × 候选值

④ 算隐状态 H_t = O_t ⊙ tanh(C_t)
内部状态先压到 −1 到 1,再由输出门决定放多少出去
═══════════════════════════════════════════════════════════════
一步进出:(C_{t-1}, H_{t-1}) 进,(C_t, H_t) 出

候选状态那一行的公式和三道门长得几乎一样,只有两处不同: 它用的是 tanh 而不是那条 S 形曲线(所以取值可正可负), 而且它用的是一组独立的参数6

为什么候选要能取负值? 因为「写进去的内容」既可能是「加上某个特征」, 也可能是「减掉某个特征」;而三道门是开关,只能在 0 到 1 之间。

数一数参数: 三道门各三组、候选一组,一共四组「输入侧权重 + 状态侧权重 + 偏置」所以这一版循环单元的参数量,恰好是第 10 章那一版的四倍。

5. 同一批实验重跑:从「随长度下滑」变成「稳定在 0.4 左右」

书里为了公平对比,超参数与第 10 章完全一致:每步挪 0.001、训 500 轮、按长度加载对应数据集7

先看损失曲线。 书里的描述是:随着序列变长,这一版同样面临记忆压力, 但与上一章相比,它在长序列上的收敛要稳定许多,验证损失增长也更平缓8

再看成绩。 书里把两条线画在一张图上,给的结论是9:

上一章那一版 随序列变长总体下降(个别长度仍有起伏)
这一章这一版 基本稳定在 0.4 左右
─────────────────────────────────────────────────
每个长度上都优于上一章那一版(最短长度处两者接近)
长序列上的优势尤为明显

「基本稳定在 0.4 左右」这句话值得掂量: 它的价值不在 0.4 这个绝对值(19 类任务里这仍然不算高), 而在于「稳定」——曲线不再随长度往下掉。

对照上一章那两个从图上读的数:长度 10 约 0.35、长度 35 约 0.15。 在长度 35 处,0.4 对 0.15,差了 2.7 倍。 这就是那条近似直着走的线带来的差别。

6. 热图说明了什么,没说明什么

书里画了一张热图:一条数字序列过一遍,把三道门和内部状态的激活值逐维画出来。

输入序列是 [6, 7, 0, 0, 1, 0, 0, 0, 0, 0], 横轴是序列位置、纵轴是门/状态向量的维度、颜色越深表示数值越大10

书里读出了三条10:

  • 输入门遇到 0 时输出相对稳定,相当于对「无信息位」使用了一致的过滤;
  • 遗忘门在数字 1 出现后某些维度的取值下降,意味着对部分历史信息进行了遗忘;
  • 输出门与内部状态则随序列推进在不同维度上深浅交错,变化的花样并不固定。

判断(我们的,不是书里的):这张图能证明的比它看起来的少。 它证明了门确实在动——不同位置、不同维度上的取值确实不一样, 这排除了「门学成了常数、退化成上一章那一版」的可能。 但它证不出「网络学会了记住前两个数字」—— 书里读出的三条里,只有遗忘门那一条带有「它在干什么」的解读,而那也只是「某些维度下降」。 如果错,会错在: 如果读者本来就只把这张图当成「机制在运转」的存在性证据, 那它完全够用。判据是:书里在这张图之后有没有据此得出任何关于任务表现的结论 ——答案是没有。

7. 案例前半:一堆长短不一的英文影评,要过几道工序

从这一节起换任务:判断一段影评是好评还是差评。 这类「把一段文字判定为积极或消极」的任务叫情感分析,本质上还是把文本分成两类11

数据: 两万五千条训练、两万五千条测试;评分大于等于 7 标记为积极、小于等于 4 标记为消极12。 书里把原测试集一比一切成验证集与新测试集13

第一道工序:把词变成数。 书里的说法是: 神经网络只能消化数值张量,无法直接读取文本,因此第一步要把词转成向量; 这种映射称为词嵌入,而得到的那些向量,俗称就叫词向量14

具体做法分两步: 先准备一张词表——把每个词映射成一个整数编号; 再走第 10 章那条查表的路径换成向量14

词表里还要留一个特殊符号当兜底:遇到表外的词一律用它代替14这类词表里没有的词,统称就叫未登录词。 这不是可选项——真实文本里永远会出现你没见过的词。

第二道工序:截断与补齐。 书里列了两条理由15:

  • 长度限制 —— 评论长短不一,过长样本会拖慢训练并稀释信号,要截到上限以内;
  • 长度补齐 —— 同一批的序列必须等长才能拼成一个张量,所以短序列要填充到本批最长长度。
书里给的例子
────────────────────────────────────────────────────────────
句子1: This movie was craptacular
句子2: I got stuck in traffic on the way to the theater
────────────────────────────────────────────────────────────
补齐后
句子1: This movie was craptacular [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD]
句子2: I got stuck in traffic on the way to the theater

这一章的上限取 256,每步喂 128 条16

第三道工序,也是最容易漏的一道:记下每条序列的真实长度。 书里的说法是:补齐会引入一批无意义的占位位置,文本分类阶段需要绕开它们, 所以这一步同时返回一个长度向量,记录每条序列在占位符之前的真实长度17

「绕开」两个字具体怎么做,下一节说。

8. 案例后半:双向读一遍,再把补出来的位置掩掉

模型分四段18:

① 嵌入层 词编号 → 词向量;把占位符那一行固定为零、且不回传梯度
② 双向循环层 正着读一遍、反着读一遍,两端隐状态拼起来
③ 汇聚层 对各时刻的隐状态取平均,压成一个句向量
④ 线性层 句向量 → 两个类别得分

第 ② 段那个「双向」是这一节的新东西。 它的动机很朴素: 只正着读,处理到第 3 个词时看不到后面;而一句话的意思常常要读完才定得下来。 做法是跑两遍——一遍从左到右、一遍从右到左,把两端的结果拼在一起。 代价是参数量和计算量都翻倍。

第 ③ 段那个「取平均」正是把补出来的位置掩掉的地方。 书里的做法是:先根据真实长度生成一个掩码矩阵屏蔽占位位置, 再对剩余位置求和、按真实长度归一化19

为什么不能直接对全部位置取平均
────────────────────────────────────────────────────
一条真实长度 4、补到 11 的句子
直接取平均 = (4 个真值 + 7 个零) ÷ 11 ← 被稀释了近三倍
掩掉再取 = (4 个真值) ÷ 4 ← 正确
────────────────────────────────────────────────────

这里有一处书里主动交代的取舍,值得抄下来: 框架提供了一种「打包变长序列」的写法,循环层内部确实会跳过占位位置; 但解包还原时会在占位位置写入零向量。 为了让汇聚层与序列模型保持独立可替换,书里仍按真实长度做了一次显式掩蔽, 而不是依赖打包语义(语义,即一段话所承载的意思)20

这是一条工程判断:宁可多做一次显式的事,也不要让两个模块之间产生隐式依赖。

训练:每步挪 0.001、训 3 轮,并打开第 10 章那个按模截断,阈值取 1.021

训练曲线书里给了一个明确的读法:训练损失持续下降, 但验证损失在约 200 步之后由降转升——这是典型的过拟合信号; 应对策略是用「验证集上表现最佳」的那份快照来评估,而不是最后一轮的模型22

结果23:

Evaluate on test set, Accuracy: 0.85
(书里注明:不同机器 / 随机性下约在 0.85 上下)

再做一次单条预测:输入 this movie is so great. I watched it three times already, 输出「积极情绪」24

0.85 怎么读? 两类任务随机猜是 0.5,所以 0.85 是真学到了东西。 但这份数据集上,一个用大规模预训练模型做起点的方案能到 0.95 以上。 差距的来源是:这个模型从零起步、只训了 3 轮、而且只有两万五千条训练数据。

这个 0.85 会在第 15 章被反复引用——那一章会在同一份数据、同一个双向循环层上 再叠一层注意力,看叠了之后能涨多少。 第 15 章第 1 节会先说清这一节「一视同仁地取平均」的毛病在哪。

9. 作者的判断与证据

书里给了证据的:

  • 成绩稳定在 0.4 左右、每个长度都更优——两条线画在同一张图上9;
  • 过拟合信号——训练损失与验证损失在同一张图上分道扬镳,约 200 步处转折22;
  • 测试成绩 0.85——实际打印,并且书里主动注明了「不同机器约在 0.85 上下」23

属于作者的解读、证据偏弱的:

  • 热图的三条读法——见第 6 节的判断块10

书里给了做法但没做实验的:

  • 多层堆叠会怎样——留成了动手练习,并要求观察收益递减的拐点25;
  • 门控循环单元的对比——同样是练习,没有给出成绩26;
  • 双向模式下占位符对反向那一遍的影响——书里以思考题的形式提出, 并在题干里给了标准做法(打包 / 解包),但正文没有做对照实验20

10. 边界与局限

这一章没覆盖的:

没讲什么依据 / 为什么值得知道
词表是怎么建出来的书里直接从文件加载现成词表,没讲统计词频、定词表大小(编号表一共收多少个词条)这些步骤
更细的切分单位全书到第 20 章才讲把词切得更碎那一套
用别人训好的词向量实际项目里的常见做法,这一章的嵌入表是从零学的
多层堆叠留成了练习25
门控循环单元同上26

出门会撞见的名字:

  • LSTM(long short-term memory) —— 这一章这一族循环单元; 中文叫长短期记忆网络,注意断句是「长的短期记忆」;

  • nn.LSTM —— 框架内置的这一层;加一个开关就变成双向18;

  • padding_idx —— 嵌入层里指定「哪个编号是占位符」的参数; 指定之后那一行输出固定为零、梯度也不回传18;

  • pack_padded_sequence / pad_packed_sequence —— 第 8 节那对打包与解包; 注意书里提醒:传给打包函数的长度向量必须在处理器的内存里20;

  • 掩码(mask) —— 第 8 节那个「哪些位置算数、哪些不算」的布尔表; 它在第 15、16、20 章还会以三种不同的用途出现。

11. 可带走的

  1. 上一章那条状态每步被非线性压一次,走三十步就什么都不剩;
  2. 这一章加一条几乎只做加法的内部状态,让梯度沿它回传时几乎不衰减;
  3. 三道门的算式完全一样,区别只在参数和用途:写多少、留多少、说多少;
  4. 门是「软」的:每一维独立取 0 到 1 之间的数,不是开或关;
  5. 候选状态用 tanh 而不是 S 形曲线,因为写进去的内容既可能是加也可能是减;
  6. 参数量是上一章那一版的四倍(三道门 + 一组候选);
  7. 成绩从「随长度下滑」变成「稳定在 0.4 左右」,长度 35 处是 0.4 对 0.15;
  8. 热图只能证明门在动,证不出网络学会了什么;
  9. 文本任务有三道必做工序:换成编号、截断补齐、记下真实长度;
  10. 汇聚时必须把补出来的位置掩掉,否则句向量被零稀释;
  11. 验证损失由降转升就是过拟合的信号,该用最佳快照而不是最后一轮。

12. 原文地图

主题原书章原文位置
两点改造第6章 循环神经网络text/07-ch06.txt:743(搜「核心做了两点改造」)
三道门与候选状态第6章 循环神经网络text/07-ch06.txt:774(搜「同时算出输入门」) · text/07-ch06.txt:786(搜「先算出候选内部状态」)
那条近似加法的线第6章 循环神经网络text/07-ch06.txt:802(搜「关键看」)
同一批实验的对比第6章 循环神经网络text/07-ch06.txt:932(搜「在长序列上的收敛要稳定许多」) · text/07-ch06.txt:985(搜「基本稳定在」)
热图第6章 循环神经网络text/07-ch06.txt:1008(搜「各门和内部状态的激活值热图」)
影评数据与词表第6章 循环神经网络text/07-ch06.txt:1063(搜「评分」) · text/07-ch06.txt:1077(搜「只能消化数值张量」)
截断、补齐、真实长度第6章 循环神经网络text/07-ch06.txt:1174(搜「文本任务比前几章多两步预处理」) · text/07-ch06.txt:1189(搜「记录每条序列」)
四段结构与掩蔽第6章 循环神经网络text/07-ch06.txt:1239(搜「模型分为四段」) · text/07-ch06.txt:1277(搜「仍按真实长度做一次显式掩码」)
训练与成绩第7章 网络优化与正则化text/08-ch07.txt:57(搜「继续沿用」) · text/08-ch07.txt:82(搜「训练损失持续下降」) · text/08-ch07.txt:109(搜「Accuracy: 0.85」)

Footnotes

  1. 出处:「第6章 循环神经网络」第 743 段(text/07-ch06.txt:743,搜「核心做了两点改造」)。原文两点:第一,引入额外的内部状态,让信息能沿时间近似线性地向后流动,不再像 SRN 那样反复经历乘性压缩;第二,加入一组门控机制——输入门过滤当前输入、遗忘门选择性丢弃历史、输出门决定向下游暴露多少,让网络可以自己学会「记什么、忘什么、说什么」。

  2. 出处:「第6章 循环神经网络」第 802 段(text/07-ch06.txt:802,搜「关键看」)。原话:关键看 C 这条线,它沿时间维度几乎以「加法」方式传递,遗忘门决定加多少旧、输入门决定加多少新——长程梯度不再被反复的乘性收缩压垮,远距离依赖也就有了存留空间。

  3. 出处:「第6章 循环神经网络」第 774 段(text/07-ch06.txt:774,搜「同时算出输入门」)。原文接着说明 σ 为 Logistic 函数,把每个门的取值压到 (0, 1),相当于一个软性的「开关」。

  4. 出处:「第6章 循环神经网络」第 791 段(text/07-ch06.txt:791,搜「用遗忘门控制上一时刻状态」)。原文:用遗忘门控制上一时刻状态的保留比例,用输入门控制候选状态的写入比例;输出状态见第 797 段(text/07-ch06.txt:797,搜「计算输出状态」)。

  5. 出处:「第6章 循环神经网络」第 805 段(text/07-ch06.txt:805,搜「门控的开合程度由数据驱动学出来」)。原文:网络据此在不同上下文中决定保留什么、丢弃什么。

  6. 出处:「第6章 循环神经网络」第 786 段(text/07-ch06.txt:786,搜「先算出候选内部状态」)。原文写明:候选内部状态有它特有的一组可学习参数(与三个门相区别),同样在各时间步间共享。

  7. 出处:「第6章 循环神经网络」第 880 段(text/07-ch06.txt:880,搜「为了与 SRN 对比公平」)。原文:超参数保持一致——Adam 优化器(学习率 0.001),训练 500 个回合,按长度加载对应数据集。

  8. 出处:「第6章 循环神经网络」第 932 段(text/07-ch06.txt:932,搜「在长序列上的收敛要稳定许多」)。原文:随着序列变长,LSTM 同样面临记忆压力,但与 SRN 相比,它在长序列上的收敛要稳定许多,验证损失增长也更平缓。

  9. 出处:「第6章 循环神经网络」第 985 段(text/07-ch06.txt:985,搜「基本稳定在」)。原话:SRN 的准确率随序列变长总体下降(个别长度仍有起伏),LSTM 则基本稳定在 0.4 左右;LSTM 在每个长度上都优于 SRN(最短长度处两者接近),且长序列上的优势尤为明显,验证了门控机制对长程记忆的提升。 2

  10. 出处:「第6章 循环神经网络」第 1008 段(text/07-ch06.txt:1008,搜「各门和内部状态的激活值热图」)。原文三条读法:输入门遇到 0 时输出相对稳定,相当于对「无信息位」使用了一致的过滤;遗忘门在数字 1 出现后某些维度的取值下降,意味着对部分历史信息进行了遗忘;输出门与内部状态则随序列推进在不同维度上深浅交错,激活模式并不固定。 2 3

  11. 出处:「第6章 循环神经网络」第 1057 段(text/07-ch06.txt:1057,搜「情感分析」)。原文:情感分析的目标就是把一段文本判定为积极或消极倾向,本质上还是文本分类。

  12. 出处:「第6章 循环神经网络」第 1063 段(text/07-ch06.txt:1063,搜「评分」)。原文:评分 ⩾ 7 被标记为积极,⩽ 4 被标记为消极;训练集和测试集各 25 000 条。

  13. 出处:「第6章 循环神经网络」第 1085 段(text/07-ch06.txt:1085,搜「我们把原测试集按一比一切分」)。

  14. 出处:「第6章 循环神经网络」第 1077 段(text/07-ch06.txt:1077,搜「只能消化数值张量」)。原文接着说:为了让转换流程更高效,常见做法是先准备一张词表把每个词映射成一个整数 ID,再走查表路径换成向量;词表里还需要留一个特殊符号作为兜底,遇到表外词一律用它代替。 2 3

  15. 出处:「第6章 循环神经网络」第 1174 段(text/07-ch06.txt:1174,搜「文本任务比前几章多两步预处理」)。两条依次是长度限制与长度补齐。

  16. 出处:「第6章 循环神经网络」第 1213 段(text/07-ch06.txt:1213,搜「最大序列长度」)。代码里 max_seq_len = 256、batch_size = 128。

  17. 出处:「第6章 循环神经网络」第 1189 段(text/07-ch06.txt:1189,搜「记录每条序列」)。原文:填充会引入一批无意义的占位位置,文本分类阶段需要绕开它们,所以整形函数同时返回一个长度向量,记录每条序列在占位符之前的真实长度。

  18. 出处:「第6章 循环神经网络」第 1239 段(text/07-ch06.txt:1239,搜「模型分为四段」)。嵌入层里那个「指定占位符编号」的参数说明见第 1249 段(text/07-ch06.txt:1249,搜「遇到该 ID 时对应位置的输出固」);双向的开关见第 1252 段(text/07-ch06.txt:1252,搜「双向 LSTM 层」)。 2 3

  19. 出处:「第7章 网络优化与正则化」第 6 段(text/08-ch07.txt:6,搜「生成掩码矩阵」)。这是汇聚层的实现:先根据长度生成掩码矩阵屏蔽补齐位置,再对序列中的向量取均值。注意这一段正文因为转码时的章节边界错位,落在了 text/08-ch07.txt 的开头。

  20. 出处:「第6章 循环神经网络」第 1277 段(text/07-ch06.txt:1277,搜「仍按真实长度做一次显式掩码」)。原文:打包后的序列在 LSTM 内部确实会跳过占位位置,但解包还原时会在占位位置写入零向量;为了让汇聚层与序列模型保持独立可替换,本节仍按真实长度做一次显式掩码而不是依赖打包语义。关于打包 / 解包的标准做法与「长度需要在 CPU 上」这条提醒,见第 1257 段(text/07-ch06.txt:1257,搜「占位符 [PAD] 是否会对 LSTM 参数梯度的更新有影响」)。 2 3

  21. 出处:「第7章 网络优化与正则化」第 57 段(text/08-ch07.txt:57,搜「继续沿用」)。原文:让 Runner 训练 3 个 epoch;为防止前面观察到的梯度爆炸卷土重来,这里同时打开截断参数,阈值为 1.0;优化器为 Adam、学习率 0.001。

  22. 出处:「第7章 网络优化与正则化」第 82 段(text/08-ch07.txt:82,搜「训练损失持续下降」)。原话:训练损失持续下降,但验证损失在约 200 步之后由降转升——这是典型的过拟合信号;应对策略是使用默认保存的「验证集上表现最佳」的检查点,后续评估直接基于该检查点而非最后一轮的模型。 2

  23. 出处:「第7章 网络优化与正则化」第 109 段(text/08-ch07.txt:109,搜「Accuracy: 0.85」)。原文在贴出输出前注明「不同机器/随机性下约在 0.85 上下」。 2

  24. 出处:「第7章 网络优化与正则化」第 116 段(text/08-ch07.txt:116,搜「积极情绪」)。

  25. 出处:「第7章 网络优化与正则化」第 137 段(text/08-ch07.txt:137,搜「多层堆叠的形式使用」)。这是动手练习 6.9,要求观察验证集准确率随层数如何变化,并给出收益递减乃至下降时的可能改进方向。 2

  26. 出处:「第6章 循环神经网络」第 1004 段(text/07-ch06.txt:1004,搜「仿照 LSTM 算子的实现写一个」)。这是动手练习 6.7。 2