# 2.2 使用词嵌入（Using Word Embeddings）

之前Named entity识别的例子（即找出语句中的人名），每个单词采用的是one-hot编码。RNN模型能确定**Sally Johnson**是一个人名而不是一个公司名，是因为“orange farmer”是份职业，很明显“Sally Johnson”是一个人名（输出1）

[![](https://github.com/fengdu78/deeplearning_ai_books/raw/master/images/b4bf4b0cdcef0c9d021707c47d5aecda.png)](https://github.com/fengdu78/deeplearning_ai_books/blob/master/images/b4bf4b0cdcef0c9d021707c47d5aecda.png)

如果用特征化表示方法，即用**词嵌入**作为输入训练好的模型，如果一个新的输入：“**Robert Lin is an apple farmer.**”，因为知道**orange**和**apple**很相近，那么算法很容易就知道**Robert Lin**也是一个人的名字

**featurized representation**的优点是可以减少训练样本的数目，前提是对海量单词建立特征向量表述。即使训练样本不够多，测试时遇到陌生单词，例如“durian cultivator”，根据之前海量词汇特征向量就判断出“durian”也是一种水果，与“apple”类似，而“cultivator”与“farmer”也很相似。从而得到与“durian cultivator”对应的应该也是一个人名。这种做法将单词用不同的特征来表示，即使是训练样本中没有的单词，也可以根据word embedding的结果得到与其词性相近的单词，从而得到与该单词相近的结果，有效减少了训练样本的数量

词嵌入能够达到这种效果，原因是学习词嵌入的算法会考察非常大的文本集

[![](https://github.com/fengdu78/deeplearning_ai_books/raw/master/images/8a1d58b7ade17208053c10728b2bf3b6.png)](https://github.com/fengdu78/deeplearning_ai_books/blob/master/images/8a1d58b7ade17208053c10728b2bf3b6.png)

词嵌入做迁移学习的步骤：

1. 先从大量的文本集中学习词嵌入，或者下载网上预训练好的词嵌入模型
2. 用这些词嵌入模型迁移到新的只有少量标注训练集的任务中，比如用300维的词嵌入来表示单词。好处就是可以用更低维度的特征向量代替原来的10000维的**one-hot**向量。尽管**one-hot**向量很快计算，但学到的用于词嵌入的300维的向量会更加紧凑
3. 当在新的任务上训练模型，而在命名实体识别任务上只有少量的标记数据集，可以选择要不要继续微调，用新的数据调整词嵌入。但实际中只有第二步中有很大的数据集才会这样做，如果标记的数据集不是很大，通常不会在微调词嵌入上费力气

当任务的训练集相对较小时，词嵌入的作用最明显，所以它广泛用于**NLP**领域

[![](https://github.com/fengdu78/deeplearning_ai_books/raw/master/images/43943c791844cc7f077f6c6f98f1f629.png)](https://github.com/fengdu78/deeplearning_ai_books/blob/master/images/43943c791844cc7f077f6c6f98f1f629.png)

词嵌入和人脸编码有很多相似性，训练了一个**Siamese**网络结构，这个网络会学习不同人脸的一个128维表示，然后通过比较编码结果来判断两个图片是否是同一个人脸，在人脸识别领域用编码指代向量$$f(x^{\left(i \right)})$$，$$f(x^{\left( j\right)})$$，词嵌入的意思和这个差不多

人脸识别领域和词嵌入不同就是：

* 在人脸识别中训练一个网络，任给一个人脸照片，甚至是没有见过的照片，神经网络都会计算出相应的一个编码结果
* 学习词嵌入则是有一个固定的词汇表，比如10000个单词，学习向量$$e\_{1}$$到$$e\_{10000}$$，学习一个固定的编码，即每一个词汇表的单词的固定嵌入
* 人脸识别中的算法未来可能涉及到海量的人脸照片，而自然语言处理有一个固定的词汇表，没有出现过的单词就记为未知单词
