返回首页

Roadmap
更新于 2026年11月5日 全文 998 字未阅读

词嵌入:简介#

预计整个模块学习时长: 45 分钟

学习目标:

  • 把词嵌入(比如 word2vec)的向量表示可视化出来。

  • 区分「编码」与「嵌入」这两件事。

  • 描述上下文嵌入(contextual embedding)。

先修要求:

本模块假设你已经熟悉以下模块中介绍的概念:


背景介绍#

想象以下你正在做一个美食推荐应用:用户输入自己最喜欢的吃食,应用就推荐他可能会喜欢的相似吃食。你希望训练一个机器学习模型来预测食物之间的相似度,这样应用才能给出高质量的推荐(「例如你喜欢煎饼,那我们推荐可丽饼」)。

为了训练这个模型,你整理出一份包含 5,000 种热门食物的数据集,里面就有罗宋汤(borscht)、热狗(hot dog)、沙拉(salad)、披萨(pizza)和沙威玛(shawarma)。

图 1. 五种食物的插画集合。从左上角开始顺时针依次是:罗宋汤、热狗、沙拉、披萨、沙威玛。
图 1. 食物数据集中食物条目的采样

进一步,你为每一种食物做了一个食品特征,里面装的是这道菜的独热编码(one-hot encoding)表示。所谓编码(encoding),指的是先为数据挑一个初始的数值表示,好让模型拿去训练。

图 2. 三层可视化,从上到下分别是罗宋汤、热狗、沙威玛的独热编码。每层上方是一个向量:罗宋汤是 [1, 0, 0, 0, ..., 0],热狗是 [0, 1, 0, 0, ..., 0],沙威玛是 [0, 0, 0, 0, ..., 1]。向量下方并排六个方格,从左到右依次是罗宋汤、热狗、沙拉、披萨、一个空格子、沙威玛,方格与向量里的数字一一左右对齐,只有对上的那一个方格被点亮。
图 2. 罗宋汤、热狗与沙威玛的独热编码

在图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)
阅读 --