从处理的对象来看,NLP 与其他机器学习任务有很大区别:NLP 处理的对象是人类语言,而人类的语言是一种特定的用于传达意义的系统,并不由任何形式的物理表现产生,大部分词语只是一个表达某种意义的符号。语言通过各种方式编码(语音、手势、写作等),以连续信号的形式传输给大脑。
NLP 的目标是设计算法来让计算机“理解”自然语言,以执行某些任务。这些任务可以划分为不同的难度等级,举例来说:
简单难度:
中等难度:
困难难度:
所有 NLP 任务的第一个议题就是如何表示词语以将其作为模型的输入。当前常见的做法是使用词向量来表示词语,下面将对各种不同的词向量技术进行介绍。
下面给出一个例子:该语料库由 3 个句子组成,且窗口大小设置为 1:
按上述方法得到的矩阵为:
下面两张图给出了 SVD 的求解过程:
基于 SVD 的方法虽然减小了维数,但是存在很多的问题:
针对上述问题,可以采取如下的解决方案:
接下来,我们会介绍一种能更优雅地解决上述诸多问题的方案:基于迭代的方法。
基于迭代的方法通过迭代逐渐学习词语的共现关系,而非基于 SVD 的方法那样一次性直接获取所有词语的共现关系。训练的过程是:设置一个目标函数,基于某种更新规则进行迭代,不断优化目标函数,最终学习得到词向量。
本节将介绍其中一种方法:Word2vec。Word2vec 是一个软件包,实际包括:
两种算法:CBOW 和 skip-gram
两种训练方法:negative sampling 和 hierarchical softmax
word2vec 可以理解为是语言模型的副产物,语言模型用于计算一个词语序列的概率。如果这个序列是合理的(语义和语法上),其概率就会比较高,否则输出的概率就会比较低。该概率用数学公式可以表示为:
上述两种模型都过于理想化,实际情况下一个词语的出现概率受到更多因素的影响。下面将介绍如何通过模型学习这些概率。
第一种方法是给定一个单词的上下文,来预测或生成该单词,该模型称为连续词袋模型(CBOW)。
另一种方法是给定一个中心词,去预测或生成周围的词语,该模型被称为 Skim-Gram 模型。
在构建 skip-gram 模型的目标函数时,使用了贝叶斯假设(即条件独立假设):给定中心词的情况下,所有输出词语都完全独立。因此,代价函数如下:
另一种优化代价函数计算的方法是 hierarchical softmax。在实际应用中,hierarchical softmax 对低频词的效果更好,而负采样对常用词和低维词向量的效果更好。
Hierarchical softmax 使用一个二叉树来表示词典中的所有词语。每个叶子节点都是一个词语,从根节点到叶子节点的路径唯一: