1 自然语言处理简介
1.1 自然语言处理的特殊性
从处理的对象来看,NLP 与其他机器学习任务有很大区别:NLP 处理的对象是人类语言,而人类的语言是一种特定的用于传达意义的系统,并不由任何形式的物理表现产生,大部分词语只是一个表达某种意义的符号。语言通过各种方式编码(语音、手势、写作等),以连续信号的形式传输给大脑。
1.2 任务类型
NLP 的目标是设计算法来让计算机“理解”自然语言,以执行某些任务。这些任务可以划分为不同的难度等级,举例来说:
简单难度:
- 拼写检查
- 关键词搜索
- 同义词寻找
中等难度:
- 从网站、文档中解析信息
困难难度:
- 机器翻译
- 语义分析
- 指代消解
- 智能问答
1.3 如何表示词语
所有 NLP 任务的第一个议题就是如何表示词语以将其作为模型的输入。当前常见的做法是使用词向量来表示词语,下面将对各种不同的词向量技术进行介绍。
2 传统词向量
3 基于 SVD 的方法
3.1 词语-文档矩阵
下面给出一个例子:该语料库由 3 个句子组成,且窗口大小设置为 1:
- I enjoy flying.
- I like NLP.
- I like deep learning.
按上述方法得到的矩阵为:
3.3 将 SVD 应用到共现矩阵
下面两张图给出了 SVD 的求解过程:
- 使用 SVD 分解共现矩阵:
- 通过选择前 k 个奇异向量减少维度:
3.4 存在的问题
基于 SVD 的方法虽然减小了维数,但是存在很多的问题:
- 矩阵维数经常变化(随语料库变化)
- 矩阵非常稀疏(因为大部分词语不存在共现)
- 计算复杂度是平方级的(执行 SVD)
- 需要一些技巧来处理词语频率间的极度不平衡
针对上述问题,可以采取如下的解决方案:
- 忽略一些功能性词语(如 the、he、has 等)
- 使用一个有坡度的窗口(即基于词语之间的距离设置不同的共现权重)
- 使用皮尔逊相关性(中心化的余弦相似度)替代原始计数,并将负数置为 0
接下来,我们会介绍一种能更优雅地解决上述诸多问题的方案:基于迭代的方法。
4 基于迭代的方法:Word2vec
基于迭代的方法通过迭代逐渐学习词语的共现关系,而非基于 SVD 的方法那样一次性直接获取所有词语的共现关系。训练的过程是:设置一个目标函数,基于某种更新规则进行迭代,不断优化目标函数,最终学习得到词向量。
本节将介绍其中一种方法:Word2vec。Word2vec 是一个软件包,实际包括:
两种算法:CBOW 和 skip-gram
- CBOW 的目标是基于上下文预测中心词
- Skip-gram 的目标是基于中心词预测上下文
两种训练方法:negative sampling 和 hierarchical softmax
- negative sampling 通过采集负样本定义目标函数
- hierarchical softmax 通过一个高效的树结构计算所有词语的概率来定义目标函数
4.1 语言模型
word2vec 可以理解为是语言模型的副产物,语言模型用于计算一个词语序列的概率。如果这个序列是合理的(语义和语法上),其概率就会比较高,否则输出的概率就会比较低。该概率用数学公式可以表示为:
上述两种模型都过于理想化,实际情况下一个词语的出现概率受到更多因素的影响。下面将介绍如何通过模型学习这些概率。
4.2 CBOW
第一种方法是给定一个单词的上下文,来预测或生成该单词,该模型称为连续词袋模型(CBOW)。
4.2.3 学习方法
4.3 Skip-Gram
另一种方法是给定一个中心词,去预测或生成周围的词语,该模型被称为 Skim-Gram 模型。
4.3.3 学习方法
在构建 skip-gram 模型的目标函数时,使用了贝叶斯假设(即条件独立假设):给定中心词的情况下,所有输出词语都完全独立。因此,代价函数如下:
4.5 Hierarchical Softmax
另一种优化代价函数计算的方法是 hierarchical softmax。在实际应用中,hierarchical softmax 对低频词的效果更好,而负采样对常用词和低维词向量的效果更好。
Hierarchical softmax 使用一个二叉树来表示词典中的所有词语。每个叶子节点都是一个词语,从根节点到叶子节点的路径唯一: