跳到主要内容

词怎么变成数 — 一张可训练的表,让意思变成距离

这一章讲三件事: 一个词怎么变成模型吃得下的数; 为什么最老实的那种做法一定会爆炸,以及换掉它之后省了多少; 还有第 06 章那块窗,怎么从图上搬到句子上。 它在全书链条里的位置: 上一章找回了顺序,但输入一直是现成的数(气温、气压)。 这一章换成文字——而文字连数都还不是。 一句提醒先摆在这里:这一章的模型没有一个能读懂句子的意思。

1. 先把话说死:它不理解你在说什么

书在开讲之前先写了一段免责声明,而且写得毫不含糊1:

这一章里的神经网络,没有一个能像人一样真正理解文本或语言背后的含义。 它们做的事只是把文字里的统计结构,映射到某个目标空间—— 那个空间可以是一个情感分数,可以是一个类别,也可以是另一段文字。

而书紧接着说:这对解决很多现实里的文本任务已经够用了。

书还把这件事和第 06 章接上了:处理文字的深度学习,是把模式识别用在字和词上, 和处理图像时把模式识别用在像素上,是同一回事1

这一段值得记住,因为它是全书最后一章那个结论的第一次预告。 第 22 章会把这句话推到底:整台机器都不理解任何事。

2. 麻烦在哪:字是离散的

前十二章的输入都是连续的数:花瓣长度、气温、气压。这些东西天生就能塞进张量。

文字不是。 书给的对照很干净2:

连续的量:0.13 和 0.14 之间还有无穷多个数
离散的量:字母 j 和 k 之间,**什么都没有**

图说:所以文字更像第 05 章那种「类别」,而不像第 03 章那种「读数」。

把文字变成一串数,这个动作书管它叫文本向量化2。这一章讲两种做法,一种老实,一种好用。

3. 做法一:一万个格子,只点亮一个

先给每个词编上号

收集英语里最常用的那一万来个词,排成一张有序的表(这张表书管它叫单词表), 每个词分到一个编号3

但不能直接把编号喂进去。 编号是数,而数天生带大小关系—— 第 5000 号词并不比第 3 号词「大两千倍」,可模型会当真。

所以要改成:一万个格子,只有该词对应的那个格子是 1,其余全是 03

单词表(假设只有 6 个词): the cat sat on a mat
「cat」的写法: [0, 1, 0, 0, 0, 0 ]

真实规模是一万个格子,只有一个是 1。

图说:格子之间没有大小关系 —— 这正是编号做不到的。

第 05 章处理三种鸢尾花时用过同一招,那时它是给「答案」用的;这一次它给「输入」用—— 名字也是同一个,叫 one-hot 编码(直译「仅一位有效」)3记住这个名字,下一节那个 multi-hot 就是照着它取的。

遇到表里没有的词怎么办

书专门给了这个问题一个位置:表外的所有生僻词、错别字,统统算作同一项, 这一项叫 OOV(超出单词表范围)4

代价是显然的:「魑魅」和「zzzqq」在模型眼里变成了同一个东西。 书提了一句更讲究的做法(设多个 OOV 类别、用散列函数分流),但没有展开。

句子怎么办:把词的写法叠起来

一句话就是一串词,把每个词那一万个格子叠成一摞,就得到了整句话的写法5

这个写法完美记录了有哪些词、以及它们的先后。然后它就炸了:

英语句子平均 18 个词,单词表 10 000 个格子

一句话 = 18 × 10 000 = **180 000 个数**

而这句话本身,写成字符也就一百来个字节。

图说:表示这句话花掉的空间,比句子本身多出几个数量级 ——
**而这还只是一句话,不是一段、不是一篇。**

4. 压扁它:出现过就点亮,长度从此固定

为了不爆炸,书给了一个很粗暴的办法:不叠了,全压进同一行格子里6

句子:「the cat sat on the mat」

叠起来的写法: 6 行 × 一万个格子 = 6 万个数
压扁的写法: 1 行 × 一万个格子 = 1 万个数
the、cat、sat、on、mat 这 5 个格子被点亮

⚠ 注意「the」出现了两次,但压扁之后只剩「出现过」这一个事实。

图说:这种一行里可以有多个 1 的写法,叫 **multi-hot 编码**。
好处是**不管句子多长,长度永远是一万**;代价是 —— **顺序全没了。**

这笔交易换来了什么、赔掉了什么,书说得很直白:解决了尺寸爆炸,代价是丢掉顺序信息6

5. 拿它跑一遍:0.89,以及它读不出的那句话

任务和数据

这一节的任务叫情感分析:给一段文字,判断它表达的是好评还是差评。

书用的是 IMDb 影评数据集:约 2.5 万条影评,每条标好「正面 / 负面」, 正负各占一半,长的两千多词、短的十来个词7

这是一个第 05 章那种二分类任务。 而且因为正负各半,准确率这把尺子在这里不会骗人—— 瞎猜只有 0.5。

模型和结果

压扁之后每条影评就是一万个数,后面接一个很朴素的模型: 两个 16 单元的隐藏层,最后一个单元输出「有多正面」8

验证准确率:约 0.89 瞎猜:0.5

图说:光看「出现过哪些词」就能到 0.89 —— 这不奇怪,
因为 enjoyable、sublime 这类词明显偏正面,sucks、bland 明显偏负面。

但有一句话它永远读不出来

书造了一个句子来说明这种做法的天花板9:

「Don't get me wrong, I hardly disagree this is an excellent film.」 (「不要误会,我不可能不觉得这是部优秀的作品。」)

这句话里有:don't、wrong、hardly、disagree —— 四个看起来很负面的词
excellent —— 一个正面词

压扁之后模型看到的就是这几个格子被点亮。**它没有任何办法知道
这些否定词是在互相抵消。**

图说:要读懂这句话,**必须知道词的先后**。而顺序在上一节被丢掉了。

所以这一章后半要回答的问题是:怎么在不爆炸的前提下,把顺序留住。

6. 承重节:词嵌入 — 不硬编码,让它自己学

这一节是本章的地基。它换掉的不是「怎么存」,是「谁来决定这些数是多少」。

换一个问法

一万个格子那种写法,每个词的数是按规则硬派下来的:你排在第 37 位,你的第 37 格就是 1。 规则是人定的,和这些词是什么意思毫无关系。

词嵌入把这件事整个颠倒过来:

给每个词配一行数,但这行数的具体值不由人定——它是可训练的权重, 和模型里其他权重一样,靠反向传播一点点调出来的。10

它长什么样

就是一张表(书管它叫嵌入矩阵),一行一个词10:

第1个数 第2个数 …… 第128个数
the 0.13 -0.42 …… 0.07
cat -0.88 0.31 …… -0.15
excellent 0.54 0.62 …… 0.29
……
(一万行)

用法:查表。看到「cat」,就把它那一行取出来。

⚠ 上面这些数是为演示编的,不是真实数值。

图说:词到行号的对照关系是模型外面的一份数据,**不属于这张表本身**[^10]。
一句话里出现两个「the」?那就把同一行取两遍,没有任何问题。

行数由单词表决定(一万),列数由你定(书这里定了 128)。

省了多少:6.4 万对 500 万

书给了一笔可以当场验算的账11:

一条 500 词的影评:

词嵌入: 500 × 128 = 64 000 个数
一万个格子: 500 × 10 000 = 5 000 000 个数

**差 78 倍。**

图说:关键在列数(128)和单词表大小(10 000)**没有关系** ——
单词表涨到十万,词嵌入这一行还是 128 个数。

这和第 07 章那笔账是同一种账。 那一章把一张图从十五万个数压成一万两千个, 这一章把一个词从一万个数压成 128 个。 「嵌入」这个名字第二次出现,第一次是给图用的,这次是给词用的。

训完之后发生了什么:意思变成了距离

这是词嵌入真正让人惊讶的地方。 训练结束后:

意思相近的词,它们那一行数也彼此接近。12 very 和 truly 靠得近,very 和 barely 离得远。

书给的解释很朴素,而且站得住:

把一条影评里的大量词换成意思相近的词,**模型应该输出同样的分类结果。**
而模型对这两条影评的后续处理是完全一样的运算。

→ 那就只有一种可能:**这些成对的词,取出来的那行数本来就很接近。**

图说:不是有人教它「very 和 truly 是近义词」。
是「换了词答案不该变」这个要求,把它们挤到了一起。

而且 128 个数不是一团糨糊,书说不同的列可以表示词的不同侧面13:

假想的某一列在这一列上靠得近的词
词性(是形容词还是名词这类)fast 和 warm(都是形容词)靠得近,house(名词)远
性别色彩actress 和 queen 靠得近,actor 远

书自己标明了这是「可以这样直观地理解」,不是实测出来的维度。

能亲眼看见

书给了一个能验的动作:把训练好的这张表导出来,用一个叫 Embedding Projector 的工具画出来14

128 列没法直接看,得先降到三维;工具提供了两种降维办法(t-SNE 和主成分分析), 书选了前者。画出来是一团点,一个点一个词:

excellent、inspiring、delightful 挤在一端;sucks、gross、pretentious 挤在另一端。

书的评价很克制:这个数据集不大,但已经足以说明词嵌入的威力14

不用自己训也行

词嵌入太常用了,所以有人拿几十亿个词训好、直接发出来给大家用,最有名的一份叫 GloVe15

好处两条:不用再训这张表,省算力;而且它见过的词比你多几个数量级,质量更高。

书还给了一个精确的类比:预训练的词嵌入之于文字,就相当于第 07 章那个 MobileNet 之于图像。

7. 抓顺序的第二条路:把第 06 章那块窗改成一维

上一章说抓顺序要用循环层。这一节说还有一条路,而且更快。

同一个想法的第三次出现

第 06 章那块窗在图上上下左右地滑。把它改成只沿一个方向滑,就能滑过一个句子16

句子(每个词已经变成 128 个数):

[I ][like][it ][so ][much][and ][…… ]
└────── 窗宽 5 ──────┘ ← 窗里 5 个词,对位相乘再求和 → 输出一个数
└────── 窗宽 5 ──────┘ ← 窗右移一格,同一组数再算一次
└────── 窗宽 5 ──────┘

图说:和第 06 章一模一样,只是滑动从两个方向减成了一个。
这叫**一维卷积**。

书还给了一个很具体的例子说明它学得到什么:训过之后,一个一维卷积核可能会对 「一个贬义的动词后面紧跟一个褒义的形容词」这种模式变得敏感16

它为什么感觉得到顺序

因为窗里那一下「对位相乘再求和」是认位置的17:

「I like it so much」 → 窗算出某个数
「much so I like it」 → 同样五个词,**窗算出来的是另一个数**

图说:词一样,位置变了,乘的对象就变了,结果就变了。
——**这正是密集层做不到的那件事(第 12 章第 1 节)。**

跑一遍:0.91,而且快 6 倍

书搭的模型是这样一条链18:

一条 500 词的影评(每个词一个编号)
↓ 查表(嵌入层) → [500, 128] 128 万个参数
↓ dropout 0.5(第 06 章那味药) → 形状不变
↓ 一维卷积:250 个窗,窗宽 5 → [496, 250] 16 万个参数
└ 496 = 500 − 5 + 1,**窗能停的位置数**
↓ 全局最大池化 → [250]
└ 每个窗在整句话上的**最高得分**,取出来,时间维度就此坍缩
↓ 两个密集层 → 一个「有多正面」的数

合计 1 503 251 个参数

验证准确率:**约 0.91**(上一节压扁的做法是 0.89)

图说:提升不大但稳,**而它多出来的那一点,买的正是顺序。**

同一个任务换成 LSTM(第 12 章那种循环层的复杂版本)呢?书试了19:

一维卷积LSTM
准确率约 0.91大致相同
训练速度基准慢约 6 倍

为什么慢?第 12 章讲过:循环必须一步等一步,而卷积天生适合并行。

但它有个死穴:窗外的事它看不见

书把这一条写得很清楚20:

一个宽 5 的窗,**学不到相距 20 个词的那两个词之间的关系。**
窗根本没同时看见过它们。

补救:把一维卷积一层层叠起来 —— 上层那个窗看的是下层的输出,
等于间接看见了更宽的一片。**这片范围第 06 章叫感受野。**

图说:书接着说了句很实在的话 —— 很多文本任务里,
**远距离的呼应本来就不太影响结果**,所以叠几层就够了。

书还顺手解释了上面那个「LSTM 没赢」的结果:大概正是因为这个影评任务里, 远距离依赖对分类不重要19

8. 最后一道手续:句子长度必须统一

这一节讲一件听起来很琐碎、但漏了就会出事的事。

模型吃的是张量,张量必须有确定的形状。可影评有 10 个词的也有 2400 个词的21

所以要定一个长度,书定的是 500,然后所有影评统一裁到这个长度21:

情况怎么处理书为什么这么选
比 500 长砍掉开头那一截影评的结尾更可能带着情绪结论
比 500 短前面补占位符书说这一条是任意选的,没有理由

⚠ 上一节那个 multi-hot 的做法不需要这道手续—— 它的长度只和单词表有关,和句子多长无关。这是它唯一比词嵌入省事的地方。

而这道手续正是第 09 章那个坑的入口

模型上线到浏览器之后,用户输进来的是一句原始的英文它要经过和训练时一模一样的处理才能喂给模型22:

用户输入:「Don't get me wrong, I hardly disagree...」
↓ 转小写、去标点、去空格 ← 因为单词表里全是小写、无标点的词
↓ 查词到编号的对照表
↓ 表里没有的词 → OOV 那个编号
↓ **调用和训练时同一个截断填充函数**
↓ 变成 [1, 500] 的张量 → 喂给模型

图说:书专门指出了这一条的价值 ——
**训练在 Node 里、推断在浏览器里,两边能复用同一份预处理代码,
这直接降低了第 09 章那种「训练时和上线时不一样」的风险。**

这是这本书相对 Python 版不可替代的地方之一:同一种语言,两头共用一份代码。

9. 主走查:一条影评,三种写法

这一章每个承重机制在这条走查上各占一步。数字全部来自书里,标注除外。

发生了什么具体的数 / 状态
1拿书里那句双重否定的影评「Don't get me wrong, I hardly disagree this is an excellent film」
2转小写、去标点don't get me wrong i hardly disagree this is an excellent film
3查词到编号的对照表每个词换成一个整数;表里没有的词全部换成 OOV 那一个编号
4写法一:一万个格子,只点亮一个「excellent」= 一万个数,其中一个是 1
5一句 12 个词就这么叠起来12 × 10 000 = 12 万个数(书按平均 18 词算的是 18 万)
6诊断:会爆炸表示这句话的空间,比句子本身大几个数量级
7写法二:压扁成一行,出现过就点亮永远是 10 000 个数,和句子多长无关
8但压扁时发生了什么顺序全丢——don't、hardly、disagree、excellent 变成四个孤立的事实
9跑 IMDb 情感分析验证准确率 约 0.89(瞎猜是 0.5)
10可这句话它读不出来四个否定词互相抵消这件事,没有顺序就无从知道
11写法三:词嵌入——查一张可训练的表「excellent」→ 它那一行 128 个数
12数一下省了多少500 词:64 000 对 5 000 000,差 78 倍
13训完之后这张表变成了什么意思相近的词那一行也相近;画出来,好词挤一端、坏词挤另一端
14统一长度裁到 500:长的砍开头,短的在前面补占位
15一维卷积:250 个宽 5 的窗沿句子滑输出 [496, 250],496 = 500 − 5 + 1
16这一步凭什么感觉得到顺序窗里是对位相乘:换了词序,同样五个词算出的数就变了
17全局最大池化每个窗取整句话上的最高分 → [250],时间维度坍缩
18两个密集层 → 一个分数合计 1 503 251 个参数;验证准确率 约 0.91
19和 LSTM 比准确率大致相同,训练快约 6 倍
20收账一维卷积快、省;代价是窗外的远距离呼应它看不见,得靠叠层撑宽感受野

10. 作者的判断与证据

书里给了证据的:

  • 压扁的写法在 IMDb 上到 0.89,一维卷积到 0.91。 两个数都有,并且给了跑出它们的命令818
  • 一维卷积比 LSTM 快约 6 倍,准确率大致相同。 书说这从两条命令的执行情况就能看出来19
  • 词嵌入省 78 倍。 6.4 万对 500 万,可以当场验算11
  • 训完之后正面词和负面词分居两端。 书给了把这张嵌入表导出来的命令,和一张实际画出来的图14
  • 496 = 500 − 5 + 1。 模型概览里的形状是印出来的18

属于作者判断、书里没给证据的:

  • 「意思相近的词,取出来那行数也相近」的那个解释(换成近义词答案不该变)。 书用的措辞是「可以这样直观地理解它」——是说法,不是证明12
  • 词嵌入的某一列表示词性、某一列表示性别色彩。 书说的是「可能有一个维度」, 这是举例,不是从训练结果里读出来的13
  • 截断时砍开头,是因为结尾更可能含情绪信息。 这是一条经验判断,书没做对照实验21
  • LSTM 没赢是因为这个任务里远距离依赖不重要。 书自己用的是「这可能是因为」19

判断(我们的,不是书里的): 这一章最该带走的不是任何一种编码,是第 6 节那个转向—— 从「人定规则」变成「让数据自己定」。 一万个格子的写法里,每个词的数是人排出来的, 排法和意思毫无关系;词嵌入把这件事交给了训练,结果「意思」自己长了出来。 这和第 01 章那句「人不写规则,人给答案」是同一个动作,只是这次它作用在了输入的表示上。 如果错,会错在: 如果你的词表很小、任务很窄(比如只分十个固定口令), 一万个格子那种写法反而更省事——它不用训,也不会因为数据少而学出一张乱七八糟的表。

11. 边界与局限

  • 这一章的模型不理解句子的意思,书自己在开头就写死了。 它做的是把统计结构映射到目标空间1
  • OOV 只讲了最粗的一种。 所有生僻词和错别字塞进同一项; 多个 OOV 类别加散列函数,书提了一句就没了4
  • 单词表怎么定、定多大,书没有讨论。 只说「常用词粗略估计一万多个」, 一万这个数是直接拿来用的。
  • 词嵌入的维数怎么选,也没有答案。 128 是选定的,书没有做对照。
  • 中文这类没有空格分词的语言,整章没有涉及。 它的做法从头到尾是「按空格切词」。
  • 一维卷积和循环层怎么选,书只给了这一个任务上的结论。 远距离依赖重要的任务上谁更好,没有实验。
  • GloVe 只讲了「有这么个东西、有两个好处」。 怎么加载、怎么固化、和自己训的怎么比, 全书没有示例。
  • 降维那两种办法(t-SNE 和主成分分析)书明说不讲。 只说都是「降到三维、尽量少损失关系」14

12. 可带走的

  1. 先记住这一句:这一章的模型不理解句子的意思,它只是把统计结构映射到一个分数或类别;
  2. 文字是离散的,得先变成数,这个动作叫文本向量化。 别直接用编号——编号带大小关系,而词与词之间没有大小;
  3. 老实的写法是一万个格子只点亮一个。 代价是一句 18 个词的话要 18 万个数;
  4. 压扁成一行(出现过就点亮)能治爆炸:长度永远等于单词表大小。 代价是顺序全丢——IMDb 情感分析到 0.89,但读不出「不可能不觉得这是部优秀的作品」;
  5. 词嵌入 = 一张可训练的表,一行一个词。 500 词的影评:6.4 万个数,对一万个格子那种做法的 500 万个;
  6. 列数和单词表大小无关。 单词表涨到十万,一行还是 128 个数——这才是它真正省的地方;
  7. 训完之后意思变成了距离: 近义词那一行也相近。 原因不神秘:换成近义词答案不该变,而模型对两者的运算完全一样;
  8. 抓顺序不止循环一条路。 把第 06 章那块窗改成一维沿句子滑, 准确率 0.91、比 LSTM 快约 6 倍;它认顺序是因为窗里那一下是对位相乘;
  9. 一维卷积的死穴是窗外看不见。 相距远于窗宽的两个词,它学不到关系; 补救是叠层,把感受野撑宽;
  10. 句子必须统一长度(书裁到 500,长的砍开头、短的前面补占位); 而且浏览器端这套处理必须和训练时一模一样——两边共用一份代码, 这正是第 09 章那种偏斜最省事的防法。

13. 原文地图

主题原书章原文位置
这类模型不理解含义,只映射统计结构第 9 章text/21-ch09.txt:243(搜「没有任何一个能像人类一样真正理解文本」)
字是离散的;文本向量化的定义第 9 章text/21-ch09.txt:249(搜「文本向量化」)
单词表与 one-hot 编码第 9 章text/21-ch09.txt:251(搜「单词表」)
OOV:表外的词怎么办第 9 章text/21-ch09.txt:253(搜「超出单词表范围」)
句子叠起来会爆炸:18 词 × 一万 = 18 万第 9 章text/21-ch09.txt:255(搜「180 000个数字」)
multi-hot:压扁成定长,代价是丢顺序第 9 章text/21-ch09.txt:261(搜「multi-hot编码」)
IMDb 数据集:2.5 万条、均衡、10~2000 词第 9 章text/21-ch09.txt:265(搜「25 000个文本形式的影评」)
multi-hot + MLP 达到约 0.89第 9 章text/21-ch09.txt:307(搜「0.89」)
双重否定那句读不出来第 9 章text/21-ch09.txt:307(搜「Don't get me wrong」)
词嵌入:可训练的权重矩阵第 9 章text/21-ch09.txt:311(搜「可训练的权重参数」) · text/21-ch09.txt:313(搜「vocabularySize, embeddingDims」)
省参数的账:6.4 万对 500 万第 9 章text/21-ch09.txt:323(搜「5 000 000个浮点数」)
意思相近的词向量也相近;very / truly / barely第 9 章text/21-ch09.txt:325(搜「语义比较接近」)
不同维度表示不同侧面(词性、阴阳性)第 9 章text/21-ch09.txt:327(搜「阴阳性」)
两种范式的对照表 9-1第 9 章text/21-ch09.txt:331(搜「比较词向量化的两种范式」) · text/21-ch09.txt:345(搜「稀疏」)
一维卷积:同一个想法只沿一个维度滑第 9 章text/21-ch09.txt:357(搜「一维卷积」) · text/21-ch09.txt:361(搜「滑动仅发生在一个维度上」)
截断与填充;maxLen 500;砍开头、前面补第 9 章text/21-ch09.txt:367(搜「截断」) · text/21-ch09.txt:377(搜「更可能含有和用户情感相关的信息」)
模型结构与参数量;496 = 500 − 5 + 1第 9 章text/21-ch09.txt:452(搜「Total params: 1503251」) · text/21-ch09.txt:462(搜「500 – 5 + 1」) · text/21-ch09.txt:464(搜「浓缩成单个最大值」)
一维卷积达到 0.91第 9 章text/21-ch09.txt:468(搜「0.91」)
卷积核为何对顺序敏感第 9 章text/21-ch09.txt:470(搜「much so I like it」)
学不到超出窗宽的模式;叠层撑感受野第 9 章text/21-ch09.txt:472(搜「无法学习超出其卷积核尺寸的模式」) · text/21-ch09.txt:474(搜「感受野」)
和 LSTM 的对照:准确率相当,快约 6 倍第 9 章text/21-ch09.txt:476(搜「大致相同」) · text/21-ch09.txt:478(搜「约快6倍」)
把词嵌入画出来:t-SNE、正负词分居两端第 9 章text/21-ch09.txt:494(搜「t分布随机邻域嵌入」) · text/21-ch09.txt:496(搜「delightful」)
GloVe 预训练词向量;类比 MobileNet第 9 章text/21-ch09.txt:498(搜「GloVe」) · text/21-ch09.txt:500(搜「两大好处」)
浏览器端推断:同一份预处理代码降低偏斜第 9 章text/21-ch09.txt:508(搜「转换为小写」) · text/21-ch09.txt:512(搜「减少数据偏斜的风险」)

Footnotes

  1. 出处:「第 9 章 针对序列和文本的深度学习」第 243 段(text/21-ch09.txt:243,搜「没有任何一个能像人类一样真正理解文本」)。原文接着说:「基于深度学习的自然语言处理只不过是将模式识别技巧应用到字符和单词上罢了。这和基于深度学习的计算机视觉(见第4章)是对像素的模式识别有异曲同工之妙。」 2 3

  2. 出处:「第 9 章」第 249 段(text/21-ch09.txt:249,搜「文本向量化」)。原文拿「j 和 k 之间没有别的字母」对照「0.13 和 0.14 之间有无限个实数」来说明离散与连续的区别。 2

  3. 出处:「第 9 章」第 251 段(text/21-ch09.txt:251,搜「单词表」)。原文说明常用英语词粗略估计约有一万多个,单词表里的词不重复且按一定顺序排列(例如按使用频率降序);同段末尾把「只有对应索引那一位为 1、其余全为 0」这种写法正式命名为「单词的one-hot编码」。这一节的标题(text/21-ch09.txt:247,搜「one-hot编码和multi-hot编码」)把这两个名字并列在一起,书是当成一对来讲的。 2 3

  4. 出处:「第 9 章」第 253 段脚注(text/21-ch09.txt:253,搜「超出单词表范围」)。原文提到更高级的技巧会用多个 OOV 类别配合散列函数,但没有展开。 2

  5. 出处:「第 9 章」第 255 段(text/21-ch09.txt:255,搜「180 000个数字」)。原文以「英语句子平均含 18 个单词、单词表 10 000」算出这个数,并说它「比句子本身占用的空间要多得多」。

  6. 出处:「第 9 章」第 261 段(text/21-ch09.txt:261,搜「multi-hot编码」)。原文明说这种写法「解决了向量尺寸爆炸性增长的问题,但这是以丢失数据中的顺序信息为代价的」。 2

  7. 出处:「第 9 章」第 265 段(text/21-ch09.txt:265,搜「25 000个文本形式的影评」)。原文说明该数据集是平衡的(正负各半),点评长度从 10 词到 2000 多词不等,且数据里已经省略了标点。

  8. 出处:「第 9 章」代码清单 9-6 与第 307 段(text/21-ch09.txt:307,搜「0.89」)。模型是两个 16 单元的 relu 密集层加一个 sigmoid 输出单元(text/21-ch09.txt:294,搜「添加两个隐藏的密集层」)。 2

  9. 出处:「第 9 章」第 307 段(text/21-ch09.txt:307,搜「Don't get me wrong」)。原文标明这是一个「假想的句子」,并说要理解它「必须考虑到每个词的序列信息」。

  10. 出处:「第 9 章」第 311~313 段(text/21-ch09.txt:311,搜「可训练的权重参数」;text/21-ch09.txt:313,搜「vocabularySize, embeddingDims」)。原文特别指出词到索引的对照表不属于嵌入层,它是模型之外独立存在的数据结构。 2

  11. 出处:「第 9 章」第 323 段(text/21-ch09.txt:323,搜「5 000 000个浮点数」)。原文给的两个数是 500 × 128 = 64 000 与 500 × 10 000 = 5 000 000。 2

  12. 出处:「第 9 章」第 325 段(text/21-ch09.txt:325,搜「语义比较接近」)。原文的措辞是「可以这样直观地理解它」,是解释而不是证明 2

  13. 出处:「第 9 章」第 327 段(text/21-ch09.txt:327,搜「阴阳性」)。原文用的是「可能有一个维度会表示……」这样的假设语气。 2

  14. 出处:「第 9 章」信息栏 9-2,第 494 与 496 段(text/21-ch09.txt:494,搜「t分布随机邻域嵌入」;text/21-ch09.txt:496,搜「delightful」)。原文明说不讲 t-SNE 和主成分分析的异同,只说两者都是「将高维词嵌入向量映射到三维,并尽可能减小向量间关系的损失」。 2 3 4

  15. 出处:「第 9 章」第 498~500 段(text/21-ch09.txt:498,搜「GloVe」;text/21-ch09.txt:500,搜「两大好处」)。原文说 GloVe 由斯坦福自然语言处理研究组提供,并把它和第 5 章的 MobileNet 做类比。

  16. 出处:「第 9 章」第 357 段(text/21-ch09.txt:357,搜「一维卷积」)。原文说 conv1d 和 conv2d「背后的基本思想是一样的」,并举了「一个贬义的动词后面紧跟一个褒义的形容词」这个例子。同段脚注还提到存在三维卷积(用于立体数据)。 2

  17. 出处:「第 9 章」第 470 段(text/21-ch09.txt:470,搜「much so I like it」)。

  18. 出处:「第 9 章」代码清单 9-8 与模型概览,第 452、462、464 段(text/21-ch09.txt:452,搜「Total params: 1503251」;text/21-ch09.txt:462,搜「500 – 5 + 1」;text/21-ch09.txt:464,搜「浓缩成单个最大值」)。准确率见第 468 段(text/21-ch09.txt:468,搜「0.91」)。 2 3

  19. 出处:「第 9 章」第 476~478 段(text/21-ch09.txt:476,搜「大致相同」;text/21-ch09.txt:478,搜「约快6倍」)。原文对 LSTM 没赢的解释用的是「这可能是因为」。 2 3 4

  20. 出处:「第 9 章」第 472~474 段(text/21-ch09.txt:472,搜「无法学习超出其卷积核尺寸的模式」;text/21-ch09.txt:474,搜「感受野」)。原文同段说 GRU 和 LSTM 在这一点上优于一维卷积,但也说很多文本任务里远距离依赖影响不大。

  21. 出处:「第 9 章」第 367 与 377 段(text/21-ch09.txt:367,搜「截断」;text/21-ch09.txt:377,搜「更可能含有和用户情感相关的信息」)。原文说明在序列之前填充这一选择是「任意选择」的。 2 3

  22. 出处:「第 9 章」第 508~512 段与代码清单 9-9(text/21-ch09.txt:508,搜「转换为小写」;text/21-ch09.txt:512,搜「减少数据偏斜的风险」)。原文把「后端训练环境和前端推断环境复用同一份数据处理代码」列为 TensorFlow.js 的优势,并回指第 6 章(我们的第 09 章)讲的偏斜风险。