本文为深度学习的学习笔记,讲解NLP 与词嵌入。欢迎在评论区与我交流 😀
词汇表征
单词表示
词嵌入是语言表示的一种形式,可以让算法自动理解类似的词语,例如男人和女人。
在之前的【循环神经网络 RNN】中,我们使用 one-hot 向量来表示词,例如 man 是词典中的第 5391 个单词,可以表示为只在 5319 处为 1 的向量,记为 O 5391 O_{5391} O5391:
这种表示方法的缺点是每个词都是独立的,对相关词的泛化能力不强。例如我们已经学到了一个语言模型,预测“I want a glass of orange ____” 中空的单词是什么,模型预测为 juice。但当模型看到 “I want a glass of apple ____” 时,因为任意两个 one-hot 向量的内积都是 0,算法不知道 apple 和 orange 的关系,所以模型很难预测下一个单词为 juice。
特征化表示:词嵌入
词嵌入是 NLP 中最重要的概念之一。
使用特征化的表示方法可以很好地表示单词间的相关性。例如我们使用性别、高贵、年龄、是否为食物等 300 个特征来表示单词,得到的结果如下:
每个单词可以表示为一个 300 维的向量,用 e 5391 e_{5391} e5391 表示 man 的向量。这样,相似单词就具有相似的向量,算法也具有更好的泛化能力。
可视化词嵌入
学习到 300 维的向量或词嵌入时,我们可以将 300 维的数据使用可视化算法(常用 t-SNE 算法)嵌入到二维空间中。下图中男人和女人聚集在一起,动物、水果、数字则各自聚集在一起。
词嵌入算法对于相近的概念学到的特征也是相似的,可视化时也会映射为相似的特征向量。嵌入的意思就是每个单词被嵌入到空间的一个点上。
使用词嵌入
命名实体识别的例子
例如我们要从句子“Sally Johnson is an orange farmer”中找出人名,我们之所以能确定 “Sally Johnson” 是人名,是因为种橘子的农民肯定是一个人。如果我们使用词嵌入的表示方式,当模型判断 “Robert Lin is an apple farmer” 中的人名时,因为知道苹果和橘子是相似的,因此 “Robert Lin” 也被预测为人名。
但当其中的 “apple farmer” 变为一个不常见的单词时,例如榴莲培育家,若我们只有一个很小的标记训练集,其中可能没有这两个单词。
如果有一个已经学好的词嵌入,由特征向量的相似性会知道榴莲是水果,培育家和农民是一类,那么我们会从 “种橙子的农民” 归纳出榴莲培育家也是一个人。得到这个归纳结果是因为词嵌入算法会考察大量的无标签文本集,从而发现橙子和榴莲特征相近。因此我们可以使用迁移学习,将网上无标签文本集中学到的能辨别橙子、榴莲都是水果的知识迁移到命名实体识别的任务中。
迁移学习和词嵌入
- 从大量文本集中学习词嵌入,或者直接下载开源的预训练好的词嵌入模型
- 将词嵌入模型迁移到当前具有少量标记训练集的任务中,从而用更低维度(更紧凑)的特征向量代替原来的 one-hot 向量。但 one-hot 向量计算很快
- 命名实体识别任务的标记数据集很大时,需要用新的数据微调词嵌入。
关于迁移学习见【深度卷积网络】。
词嵌入与人脸编码
在人脸识别中,我们训练了一个孪生网络结构,用来学习人脸的 128 维的表示,通过比较编码结果来判断两张图片是否是同一个人脸。这和词嵌入很相似。
人脸编码中,我们任意输入一张图片(可不在训练集中),都能输出图片中人脸的编码。而在词嵌入中,我们有固定的词汇表,对应每个词汇表中的单词学习固定的词嵌入。如果出现了词汇表以外的单词,则记为 UNK。
关于人脸编码见【人脸识别】。
词嵌入的特性
词嵌入可以帮助实现类比推理,虽然类比推理不是一个重要的任务,但可以帮助我们理解词嵌入的原理。
类比
例如这是词嵌入捕捉的一系列单词的特征表示,如果 man 对应 woman,那么 king 对应什么?我们这里用四维的嵌入向量来表示一个单词,man 的向量记为 e m a n e_{man} eman。
通过计算可以得到:
e m a n − e w o m e n ≈ [ − 2 0 0 0 ] e_{man}-e_{women}\approx\left[\begin{matrix} -2\\ 0\\ 0\\ 0 \end{matrix} \right] eman−ewomen≈⎣⎢⎢⎡−2000⎦⎥⎥⎤
e k i n g − e q u e e n ≈ [ − 2 0 0 0 ] e_{king}-e_{queen}\approx\left[\begin{matrix} -2\\ 0\\ 0\\ 0 \end{matrix} \right] eking−equeen≈⎣⎢⎢⎡−2000⎦⎥⎥⎤