Deep Learning Note: 5-6 Word Embedding 介绍

1. 单词的表示方法

  前面在介绍 RNN 时,使用词汇表对单词进行独热编码(One-Hot Encoding)来表示单词。例如使用一个有 10000 个词的词汇表 $V = [a, aaron, …, zulu, \lt UNK \gt]$ 对单词进行编码,则每个单词都会被编码为一个长度为 10000 的向量,其中位置与单词在词汇表中位置相同的项值为 1,其余位置的值为 0,图 1 展示了几个单词的编码。

图 1

图 1

  使用词汇表对单词进行独热编码的一个缺点是,每个单词的编码都是完全独立的,无法体现单词与单词之间的潜在关系。例如对于如下的两个句子:

I want a glass of orange ____
I want a glass of apple ____

我们可以很容易地预测两句话最后的空白处很可能是 juice,因为 orange juice 和 apple juice 这两个词组非常常见。而对于算法来说,算法通过学习习得了 orange juice 这个词组很常见后,很难直接推广到 apple juice 这个词组也很常见。因为使用独热编码时,任意两个独热编码向量的内积都为零,即在算法看来任意两个单词之间的距离都一样,而实际上我们知道 orange 和 apple 两个词比 orange 和 king 两个词有更加接近,有更多的相似之处。

  Word Embedding 是自然语言处理中的一个重要概念,它可以看成是单词的一种特征化的表现形式,通过学习得到一组特征来评估每个单词,得到单词对应的编码,如表 1 所示。

表 1

Man (5391) Woman (9853) King (4914) Queen (7157) Apple (456) Orange (6257)
Gender -1 1 -0.95 0.97 0.00 0.01
Royal 0.01 0.02 0.93 0.95 -0.01 0.00
Age 0.03 0.02 0.7 0.69 0.03 -0.02
Food 0.09 0.01 0.02 0.01 0.95 0.97

  表 1 中,第 1 个特征是 Gender,使用 -1 表示男性,1 表示女性,则可以看到 Man 和 King 的值很接近 -1,Woman 和 Queen 的值很接近 1,Apple 和 Orange 没有性别属性,值接近 0。在第 2 个特征 Royal 上,King 和 Queen 具有较大的值。对于第 3 个特征 Age,Man、Woman、Apple、Orange 本身不包含特定的年龄信息,Age 特征的值较小;而 King 和 Queen 通常都是成人,具有特定的年龄特征,故 Age 特征的值较大。在第 4 个特征 Food 上,只有 Apple 和 Orange 能拿到较大的值。

  像表 1 那样,使用一系列特征对每个单词进行评估,就得到了单词的一个编码,这种特征化的编码称为 Embedding,意为将单词嵌入(Embed)到一个特征向量中。如使用 300 个特征,则每个单词可以被编码为一个长度为 300 的向量,这个向量中的值是很密集的,而独热编码中的值则非常稀疏(只有一个 1 ,其余都是 0)。此时再看前面的两个句子:

I want a glass of orange ____
I want a glass of apple ____

通过表 1 的编码结果,可以知道 orange 和 apple 有很多特征都十分相似,在算法习得关于 orange 的词组 orange juice 后,就可以更容易地推广得到 apple juice 是一个和 orange juice 很相似的概念。

  实际中,算法通过学习得到特征并不像表 1 那样直观,但这种特征化的表现方式有利于算法发现单词之间的关系。为了直观地观测算法所到的 Embedding,可以使用 t-SNE 算法(论文)将高维的单词向量压缩到二维并进行可视化,如图 2 所示。

图 2

图 2

  从图 2 中可以看出,man 和 woman、king 和 queen 距离接近,且这四个词都表示人的概念,它们之间的距离也接近;表示其他动物的 dog、cat、fish 距离接近;man、woman、king、queen、dog、cat、fish 这些词都表示动物的概念,距离接近。可见算法学习确实学到了单词之间的相似关系,可以将相似的单词映射到相似的编码向量中。

2. 使用 Word Embedding

  使用 Word Embedding 有助于算法通过单词间的关系对更好地泛化已经习得的知识。例如在人名识别的问题中,对于下面的句子:

Sally Johnson is an orange farmer.

算法通过学习知道 Sally Johnson 是一个人名后,对于类似的句子:

Robert Lin is an apple farmer.

算法通过 Word Embedding 可以知道 apple 和上一句的 orange 具有相似的概念,由此可以更容易地将上一句的学习成果泛化到这一句中,进而判断 Robert Lin 也是人名。

  学习 Word Embedding 的算法通常会使用海量的语料进行训练,经过十亿、百亿甚至上千亿单词的训练,Word Embedding 不仅能知道 orange 和 apple 具有类似的概念,还能学会很多生僻词的概念,如对于下面这句话:

Mason Smith is a durian cultivator.

其中 durian(榴莲)和 cultivator(种植者)两个单词很少见,可能在人名识别任务的训练数据中根本没有出现过,但人名识别算法仍可以通过 Word Embedding 知道 durian 和 orange 具有类似的概念,从而更容易预测出 Mason Smith 也是人名。

  对于人名识别问题,可用的训练数据可能很有限,比如只有 10 万个单词。而通过使用在 10 亿个单词上训练得到的 Word Embedding,可以通过迁移学习将 Word Embedding 学到的知识迁移到人名识别问题上,步骤为:

  1. 使用大量语料(如 10 亿到 1000 亿单词)学习 Word Embedding,或者从网上下载已经训练好的 Embedding;
  2. 使用较小的训练集(如 10 万个单词),将上一步的 Embedding 迁移到新的任务上,使用 Embedding 表示训练集中的单词;
  3. 可选:如果新任务的训练数据很多,使用新任务的数据对 Word Embedding 进行精调。

  在数据量较少的任务上使用 Word Embedding 可以带来显著的效果,不仅是前面提到的人名识别,Word Embedding 在文本摘要(Text Summarization)、指代消解(Co-Reference Resolution)、语法分析(Parsing)等自然语言处理任务上都有应用。Word Embedding 在语言建模(Language Modeling)、机器翻译(Machine Translation)这些本身就具有海量数据的任务上使用得较少。这也符合迁移学习的一般规律,即通常会先在具有较多数据的问题 A 上学习,然后将学习成果迁移到具有较少数据的问题 B 上。

  值得一提的是,Word Embedding 和人脸识别任务中使用 Siamese Network 对人脸进行编码的方法有着异曲同工之妙。在人脸识别任务中,Siamese Network 学习的是对人脸图像的编码,使用 Siamese Network 对人脸图像进行编码后,通过比较不同人脸图像的编码,就可以判断两张图像中的是不是同一个人。这里的编码(Encoding)和嵌入(Embedding)的意思相近,都是数据的表现形式。Siamese Network 和 Word Embedding 的区别在于,Siamese Network 用于将输入的任意人脸图像编码为一个向量,输入的图像可以是 Siamese Network 从来没见过的;而 Word Embedding 是在一个已知且固定的词汇表上进行学习,得到每个已知单词的 Embedding。

3. Word Embedding 的属性

  Word Embedding 有助于算法进行类比推理(Analogy Reasoning)。举例来说,假设使用了前面表 1 的特征化的编码方式,只使用前 4 个特征来表示每个词,如表 2 所示。现在提出这样一个问题:Man 之于 Woman,相当于 King 之于什么?

表 2

Man (5391) Woman (9853) King (4914) Queen (7157) Apple (456) Orange (6257)
Gender -1 1 -0.95 0.97 0.00 0.01
Royal 0.01 0.02 0.93 0.95 -0.01 0.00
Age 0.03 0.02 0.7 0.69 0.03 -0.02
Food 0.09 0.01 0.02 0.01 0.95 0.97

  对于这个问题,我们可以轻松地回答 Man 之于 Woman,相当于 King 之于 Queen。而算法要通过计算来回答这个问题。这里使用 $e_{man}$、$e_{woman}$、$e_{king}$、$e_{queen}$ 分别表示 Man、Woman、King、Queen 四个词的 Embedding 向量,则可以计算得到:

\begin{equation}
e_{man} – e_{woman} = \begin{bmatrix}-1 \\ 0.01 \\ 0.03 \\ 0.09 \end{bmatrix} –
\begin{bmatrix}1 \\ 0.02 \\ 0.02 \\ 0.01 \end{bmatrix} =
\begin{bmatrix}-2 \\ -0.01 \\ 0.01 \\ 0.08 \end{bmatrix} \approx
\begin{bmatrix}-2 \\ 0 \\ 0 \\ 0 \end{bmatrix}
\end{equation}

\begin{equation}
e_{king} – e_{queen} = \begin{bmatrix}-0.95 \\ 0.93 \\ 0.70 \\ 0.02 \end{bmatrix} –
\begin{bmatrix}0.97 \\ 0.95 \\ 0.69 \\ 0.01 \end{bmatrix} =
\begin{bmatrix}-1.92 \\ -0.02 \\ 0.01 \\ 0.01 \end{bmatrix} \approx
\begin{bmatrix}2 \\ 0 \\ 0 \\ 0 \end{bmatrix}
\end{equation}

  从上面 Embedding 向量间的计算可见,Man 和 Woman 之间的主要区别是 Gender(性别),且 King 和 Queen 之间的主要区别也是 Gender,这一结论也和常识相符。Word Embedding 的这一属性是由 Tomas Mikolov 等人在 Linguistic Regularities in Continuous Space Word Representations 一文中首先提出的。

  对于前面“Man 之于 Woman,相当于 King 之于什么”的问题,算法进行类比推理的方法是,找到一个单词 $w$,使得 $e_{man} – e_{woman} \approx e_{king} – e_{w}$,如图 3 所示。

图 3

图 3

  图 3 虽然画成了二维的形式,但实际上表示的是高维空间的情况,空间维度等于 Embedding 向量长度。此时只需计算:

\begin{equation}
arg\underset{w}{max} \; sim(e_w, e_{king} – e_{man} + e_{woman}) \tag{1}
\end{equation}

  上式中的 $sim$ 为相似度函数,最常见的选择是使用余弦相似度(Cosine Similarity),即计算两个向量 $u$ 和 $v$ 夹角的余弦值:

\begin{equation}
sim(u, v) = \frac{u^Tv}{\Vert u \Vert_2 \Vert v \Vert_2} \tag{2}
\end{equation}

  此外还可以使用欧氏距离的平方,即:

\begin{equation}
sim(u, v) = -\Vert u-v \Vert^2 \tag{3}
\end{equation}

  注意式 (3) 中 $\Vert u-v \Vert^2$ 衡量的是 $u$ 和 $v$ 之间的差异,$u$ 和 $v$ 差距越大,$\Vert u-v \Vert^2$ 的值越大。故在前面加了负号来衡量 $u$ 和 $v$ 之间的相似度。

  以上方法在类比推理的任务中通常能达到 30% 到 75% 的准确率。

  需要注意的是,前面提到可以使用 t-SNE 算法将高维的 Embedding 向量压缩到二维,从而进行可视化。这是一个非线性的映射过程,经过 t-SNE 压缩后,单词之间可能不再具有如图 3 所示的关系(图 3 实际上展示的是高维空间的情况)。

  Word Embedding 不仅有助于类比推理,还能对类比关系进行很好的泛化。通过使用 Word Embedding 算法在海量语料上进行学习,算法可以找到各种各样的关系和模式。算法可以很容易地学到 Man 之于 Woman,就像 King 之于 Queen,就像 Boy 之于 Gril,因为他们之间的差异主要都在 Gender 这一特征上。算法还可以很容易地学到 Ottawa 之于 Canda 就像 Nairobi 之于 Kenya(首都之于国家),学到 Yen 之于 Japan 就像 Ruble 之于 Russia(货币之于国家)等等。

4. Embedding 矩阵

  Word Embedding 的学习目标是习得一个 Embedding 矩阵。例如对于一个有 10000 个词的词汇表 $V = [a, aaron, …, zulu, \lt UNK \gt]$,设置 Embedding 向量的长度为 300,则 Embedding 矩阵是一个 $300 \times 10000$ 的矩阵,每一列对应词汇表中一个单词的 Embedding 向量。使用 $E$ 表示 Embedding Matrix,使用 $o_j$ 表示单词的独热编码,其中 $j$ 为单词在词汇表中的位置,则该单词的 Embedding 向量 $e_j$ 为:

\begin{equation}
e_j = E \cdot o_j \tag{4}
\end{equation}

  式 (4) 写起来很方便,但在实际应用中,对每个输入的词都使用式 (4) 来计算 Embedding 效率不高,通常会直接根据 $j$ 来查找 $E$ 中的对应列,来得到单词的 Embedding。