词嵌入:简介#
预计整个模块学习时长: 45 分钟
学习目标:
把词嵌入(比如 word2vec)的向量表示可视化出来。
区分「编码」与「嵌入」这两件事。
描述上下文嵌入(contextual embedding)。
先修要求:
本模块假设你已经熟悉以下模块中介绍的概念:
背景介绍#
想象以下你正在做一个美食推荐应用:用户输入自己最喜欢的吃食,应用就推荐他可能会喜欢的相似吃食。你希望训练一个机器学习模型来预测食物之间的相似度,这样应用才能给出高质量的推荐(「例如你喜欢煎饼,那我们推荐可丽饼」)。
为了训练这个模型,你整理出一份包含 5,000 种热门食物的数据集,里面就有罗宋汤(borscht)、热狗(hot dog)、沙拉(salad)、披萨(pizza)和沙威玛(shawarma)。

进一步,你为每一种食物做了一个食品特征,里面装的是这道菜的独热编码(one-hot encoding)表示。所谓编码(encoding),指的是先为数据挑一个初始的数值表示,好让模型拿去训练。
![图 2. 三层可视化,从上到下分别是罗宋汤、热狗、沙威玛的独热编码。每层上方是一个向量:罗宋汤是 [1, 0, 0, 0, ..., 0],热狗是 [0, 1, 0, 0, ..., 0],沙威玛是 [0, 0, 0, 0, ..., 1]。向量下方并排六个方格,从左到右依次是罗宋汤、热狗、沙拉、披萨、一个空格子、沙威玛,方格与向量里的数字一一左右对齐,只有对上的那一个方格被点亮。](https://mlwithme.oss-cn-shanghai.aliyuncs.com/images/course/food_images_one_hot_encodings.png)
在图2中,每个独热编码向量的长度都是 5,000(数据集里每一道菜占一个位置),图里的省略号,代表没有画出来的另外 4,995 项。
稀疏数据表示的弊端#
回头看这些独热编码,你会发现这种表示方式有几个问题:
权重的数量: 输入的向量越长,神经网络所需要训练的权重就越多。假设独热编码里有 $M$ 维、网络输入层之后的第 1 层有 $N$ 个节点,那么这一层就得训练 $M\times N$ 个权重。
训练样本的数量: 模型里的权重越多,对应你需要的、能把它有效训练出来所用到的数据样本就越多。
计算量: 权重越多,训练和使用模型所需的计算量就越大,很容易超出你手上硬件的能力。
内存占用: 模型里的权重越多,训练与服务它的加速器所需要的内存就越多,而要把这套东西高效地规模化,是非常困难的。
难以支持端侧机器学习(ODML)。 如果你打算把模型跑在本地设备上(而不是放在服务端),那你就得一门心思把模型做小、把权重数量降下来。
在接下来的这个模块里,你会学到如何创建嵌入(embedding)—— 稀疏数据的低维表示,而这它们正好能化解上面这些问题。
MLWM: 词嵌入怎么把词变成向量、word2vec 的 CBOW 与 Skip-gram 思路,参见「Word2Vec原理:词向量训练与语义表示方法」与「Word2Vec训练与使用:CBOW、Skip-gram 与词向量应用」。
关键术语:
- 独热编码(One-hot encoding)
- 神经网络(Neural network)
- 权重(Weight)