【CS230-DL】14 自然语言处理与词嵌入

前面我们学习了 RNN,这次就来看看 RNN 最突出的使用场景 —— 自然语言处理(Natural Language Processing)


更新历史

  • 2019.10.23: 完成初稿

词汇表示 Word Representation

前面我们表示单词的方式是 one-hot,这种编码的问题在于完全丢失了单词间可能的关系,比如 man 和 woman,apple 和 orange。我们当然可以手动制定各种特征来描述这些词汇,但一是难覆盖,二是容易出偏差。所以有没有可能让机器自动学习单词的表示方法呢?是有可能的!这个我们接下来会学习。

假设我们现在已经有了一种表示单词的方法,每个单词都对应一个 300 维的向量,如果我们想要可视化观察这些向量的分布,我们就需要把 300 维映射到 2 维空间。如下图所示:

注意,这里我们会使用 t-SNE 算法来完成这个映射。幸运的是,Tensorboard 已经帮我们实现了,后面我们会体验到。

另外,词嵌入其实和我们之前接触过的人脸编码有异曲同工之妙,实际上就是通过向量来表示具体的文本、图像,使之可以比较和运算。

词嵌入的特性 Properties of Word Embedding

词嵌入有一个很好的特性,就是可以用这些向量来进行类比推理,如下图所示:

比如我们知道 man 和 woman 有对应关系,通过计算上图中的公式,我们可以找到与 king 对应的单词,是不是很神奇!

嵌入矩阵 Embedding Matrix

嵌入矩阵可以看作我们学习的最终目标,也就是说,有了这个矩阵,我们就可以得到对应词的词向量。具体如下所示:

假设我们想要的词向量维度是 300,我们的词表有 10000 个单词(加上 是 10001 维),那么左边这个 300x10000 的大矩阵就是嵌入矩阵,右边是某个单词的 one-hot 表示,是一个 10000x1 的向量。这俩相乘可以得到一个 300x1 的向量,就是这个单词的词向量。

注意,在实际运算过程中,我们会查表,而不是每次都进行矩阵乘法以得到词向量。

学习词嵌入 Learning Word Embeddings

人们最开始学习词嵌入使用的算法比较复杂,后面发现其实简单的算法在大数据集上效果也非常好。

这里简单介绍一个稍微复杂一点的算法,原理是通过前四个词预测第五个词,如下图所示:

Word2Vec

Word2Vec 是一种简单且计算时非常高效的词嵌入学习方法,现在已经被广泛运用。原理和前面介绍的基本一致,但会分为两种不同的模式,一种是 Skip-Gram,另一种是 CBOW,如下图所示(左:CBOW,右:Skip-Gram)

直观来说,CBOW 是给定前面俩词和后面俩词,预测中间的词,对小型数据库比较合适;Skip-Gram 是给定中间的词,预测前面俩词和后面俩词,在大型语料中表现更好。

但是 Skip-Gram 需要多次计算 softmax,假设词汇表很大,速度会变得很慢。针对这个问题,常见的解决是分级(hierarchical) softmax 分类器和负采样(Negative Sampling)。分级的方法可以简单理解为用树的方式加快搜索,如下图所示:

负采样 Negative Sampling

负采样可以理解为简化版本的 Skip-Gram,我们的目标是:给定一对单词,去预测这是否是一对 context-target 词,下面是一个例子:

orange 和 juice 是在一起的,所以对应的 y 为 1,然后我们随机选出 K 个词,标记 y 为 0。我们要训练的算法就是给定一对词,判断是 1 还是 0。对于小数据集 K 设置为 5~20,对于大一点的数据集 K 设置为 2~5。这里我们设置 K 为 4,如下图:

然后我们正常进行训练即可。注意,我们要的是神经网络的隐层向量,而不是实际的预测值。

另外一种比较受关注的词嵌入方式是 GloVe 词向量,这里我们不详细说明,感兴趣的同学可以自己去了解一下。

情感分类 Sentiment Classification

使用词嵌入技术,即使只有中等大小的训练集,也可以构造一个不错的情感分类器。在这里我们的输入是一句话,我们的输出可以是一个具体的分值(比如 1-5 分),或者是几种等级(比如消极、中性、积极),如下图所示:

这里的做法很简单,我们把每个单词的向量相加再求平均,然后放到一个 softmax 分类器中区分 1~5 星的概率。

但是这个算法有个问题,就是没有考虑词序,对于某些否定词的句子,会出问题,比如:Completely lacking in good tast, good service, and good ambiance. 对应的是 1 星评价,而 good 出现了三次,很可能最终被划分到 5 星。

一个改进的方案是使用 RNN,我们直接把词嵌入放到 RNN 中,由 RNN 最后计算出来的特征表示来预测 y(一个多对一的案例),如下图所示:

这样一来,我们就可以考虑词语的顺序,就有可能学到 not good 是表示不好的意思了。

最后提一下词嵌入除偏 Debiasing Word Embeddings 这个问题,这里的偏见,主要是指性别歧视、种族歧视等等。比如性别歧视是 $e{he}-e{she}$,具体的方法这里不详细展开,感兴趣的同学可以自行了解一下。

一点打赏,十分感谢,百分动力