自然语言处理及词嵌入
词汇表示
之前都是采用词汇表来表示词汇,把词汇表示成一个one-hot向量。比如 man 在词汇表中的第5391位,那么one-hot向量的5391位置为1,其它位置为0。
它的缺点就是:
- 每个词孤立起来,没有相关性,相关性的泛化能力很弱,因为它们的内积都是 0
- 维度太大了,一个词汇表比如有 10000,那么one-hot的维度就是1000维,非常庞大,并且稀疏,不利于模型的训练和收敛
词嵌入的表示方法如下图所示:
一个直观的例子如下图所示,用很多不同的属性来确定一个词汇, 比如对于 Man,给定它的属性比如 Gander、Royal、Age、Food、Size等等,就可以大概的描述出这个词汇。但是在实际的词嵌入表示中,它每个维度的含义却不是很清晰,甚至是没有意义的,但它就是可以表示一个词汇的含义以及其他词汇的距离。
把词向量通过PCA或者t-SNE算法映射到二维空间中,可以发现,相关性大的词汇他们在距离上是非常近的,这表示词向量学习到了词汇的相关性和含义。
词嵌入的使用
在命名体识别中,比如识别 Sally Johnson is an orange farmer。通过orange farmer 可以得知 Sally Johnson 是一个人的名字。如果使用 one-hot 的向量作为输入,当出现一个新的样本 Robert Lin is an apple farmer。由于训练样本中 apple farmer 几乎没有出现过,所以很难识别前面的是一个人名,但是如果使用词嵌入作为输入,apple farmer 和 orange farmer 在词嵌入的表达方式中,这两个词汇距离都是比较接近的。可以很好的识别前面的是一个人名。
学习词嵌入
构建一个语言模型是学习词嵌入的最好办法。
有语言学家指出,一个词汇完全可以由上下文的单词预测得到,也就是一个单词可以由上下文的词汇表示得到 (具体应该是这么个意思)。比如在例子中,I want a glass of orange ____ 。构建一个语言模型,输入是前面6个词汇的 embeding 向量,经过神经网络训练后,通过softmax预测出空格中词汇的 embeding 向量。通过不断的学习,优化词嵌入向量,可以得到词嵌入矩阵。
词向量的训练分为 skip-gram 和 CBOW 2种方法。使用 skip-gram 的方法就是根据上下文的单词去预测中心词,损失函数是正确词汇出现的概率,如下图所示:
在概率的计算中,分母需要计算目标词汇和其他10000个词汇的距离,耗费非常多的时间,一般在词向量的训练中都会做一个负采样。
下面是负采样的方法:
在句子中上下文的词汇是 orange ,目标词汇是 juice,这是一个正样本,但是 orange-king 等等是没有出现过的,这是一个负样本,构建 k 个负样本之后用于模型的训练,这样就无需计算和其他词汇出现的概率了。这里 k 成为负采样率,词汇量比较大的时候,k 比较小,词汇量小的时候 k 可以设置的大一点。
Glove 词向量
Glove 是目前比较流行的词向量训练办法。虽然不如skip-gram等用的多,但是有一些人热衷于它,可能是应该简单。NG 的课程里面讲的比较简单,没有听懂,后面补上。
情感分类
这是一个比较简单的NLP应用,根据输入的一段文本,判断用户的情感是正面或者是负面的,或者是感情评分。
情感分类最大的问题就是训练集的样本不多,可能只有几百上千个。
一个最简单的办法就是把把文本数据所有的词向量通过累加或者平均的办法,把平均的向量作为输入,预测得到分数,这样做有这么几个特点:
- 适用于任何长度的评论,无论长短
- 没有考虑词序,比如 lacking in good taste 这样的评价,取平均值是非常不合适的
通常的做法是把每一个词汇送到 RNN 或者是 LSTM 中,充分利用上下文之间的联系。
词向量除偏
在图中的论文里面,作者发现在训练好的词汇量中竟然存在性别或者其他方面的歧视。比如在词汇配对中出现这样的情况:
- man-computer programmer 而 woman-homemaker
- father-doctor 而 mother-nurse
训练出来的词汇量存在性别上的歧视,这是非常不好的。具体的解决办法在论文里面有,我听得不是非常清楚。