词向量论文研读

首先是托马斯.米克罗夫的’向量空间中的词表示的高效估计’
这是W2V两篇论文的初始之作


模型的是用于语法(syntactic)和语义(semantic)方面的相似性研究,本篇论文的目标就是要介绍一种能在超大数据集上训练一种高质量词向量表示的技术
之前的很多传统NLP系统都是把单词当做一个原子单位,仅仅是词表中的索引目录,这种方式不存在词汇之间相似性的概念,
传统的方式有着一些优势,简单,鲁棒性好,同时,观察到大量数据上训练的简单模型的性能比小数据上得到的复杂模型要好,一个例子就是,使用统计语言建模的N元模型几乎能在所有数据上训练。
虽然传统的方式有这些好处,但是在很多任务上也有这局限性,例如,语音识别领域内的数据量是有限的,但是模型性能往往取决于高质量录制语音数据的大小,在机器翻译任务中,许多语言的现存语料仅仅有几百万个词
因此简单对基本技术进行扩展不会带来重大进展,必须要探索更加先进的技术上面
随着近年来机器学习技术的进步(with progress of machine learning techniques in recent years)在更大数据集上训练更加复杂模型已经成为可能,这通常会由于简单模型的性能。
可能使用词的分布表示是最成功的概念,例如基于神经网络的语言模型往往会比N元模型要好
在这项工作之前没有一种架构能够在超出100w词规模的数据上训练50到100维之间的词向量
使用分布表示来衡量词表示的性能,不仅仅使得相似的词在向量空间中彼此接近,同时要让词有能够有不同程度的相似性,在屈折语中词的不同后缀会表示不同意思,所以可以在原始空间的子空间中找到具有相似词尾的词
使人惊讶的是,人们发现词表征的结果得出的相似性超出了句法规律,也即是开始涉及到句意和词义
对词向量做代数运算可以得到类比推理的效果
本文开发的新模型要最大限度的提升这些词向量运算的精度,同时探究了训练时间和精度对词向量维度和训练数据规模的依赖关系
在早期的研究工作中前人提出了一种很是流行的神经网络语言模型,通过线性映射层和非线性隐层来联合学习词向量表示和统计语言模型,另一篇论文中提到,可以使用单个隐藏层的神经网络来学习词向量
许多著名的模型被提出来用于词表示的估计,这里就有潜在语义分析和潜在狄利克雷分布,这篇论文里研究了神经网络学习的词分布表示,这种方式优于LSA,因为可以保持单词之间存在的线性规律,(CS224n中讲到LSA在词表示方面从来没有真正流行过,我估计这意思是不好用)
这里提及两个指标一个是模型需要访问的参数数量(应该是训练模型时要更新的参数数量)
另一个是模型的精度
这里就是要最大化精度,同时要最小化计算的复杂程度
模型的复杂程度被定义为 训练迭代轮次和训练集中词的数量,以及模型需要更新的参数
这三者的乘积被视作模型的复杂程度


在这之前的NNLM模型使用投影层来实现稀疏向量转化为稠密向量的操作,后续会接上一个隐藏层H,隐藏层用于计算词表中所有单词的概率分布
但是模型的计算复杂度是比较高的:
输入层到投影层的映射应该是全连接的这之间的计算是ND
投影层到隐藏层之间是对之前的向量的线性运算来计算概率分布NDH
后面的输出层是对概率结果的全概率结果进行映射出输出结果,HV
其中计算量最大的是隐藏层到输出层之间的关系计算
因为softmax的分母对于数据类特别多的词表来说计算量是海量的
模型的复杂性是因为隐藏层的计算引起的,本文提出的模型使用了分层的softmax将词表百事为一个哈夫曼二叉树,将出现频率高的词分配给短的二进制编码,这种方式可以使得输出计算带来对数级的转化,这种方式带来的加速并不能真正解决问题,因为关键的计算瓶颈是隐藏层的概率计算,所以后面就提出了没有隐藏层的词向量模型的架构,因此这类计算关键还是取决于softmax规范因子的计算效率。


使用循环神经网路的语言模型
循环神经网络用于语言模型上是为了克服前馈神经网络语言模型的部分限制,例如指定文本长度,同时从理论上来说,RNN能比浅层模型更加有效的表示复杂的模式,同时RNN不需要投影层,仅仅是输入层隐藏层输出层的结构,这种模型的特殊之处就是使用延时连接来将隐藏层连接到自身的递归矩阵。同时RNN的复杂程度也是很大程度上减少了
通过并行技术来训练一个很大的模型
这里用的是小批量异步梯度下降和自适应学习率程序adagrad


这里就是戏肉开始的部分了,作者这里提出了新的对数线性模型
好像大部分模型都是对数线性?
提出这两中模型的主要因素就是找到一种计算简单性能良好的词向量表示模型
从前面的章节可以看出主要的复杂度来自于模型中的非线性层计算,因为这个部分是神经网络有效性的重要部分,这里就要做取舍:
是在更大数据集上训练一个更简单的模型还是在较小数据集上训练一个复杂模型
前文可以知道已经提出一个经验公理。大数据集上的简单模型性能反而更好
所以可能在更多的数据集上训练反而是更加有效的方式


这里面提及第一种改进是词袋模型,和之前的前馈模型很是相似直接讲原先的非线性隐藏层去掉,同时简化投影层,使得所有单词共现投影层而不只是投影矩阵,词序不会影响投影,使用窗口为4的来通过上下文词来预测中间词


第二中被提出的模型是跳词模型,思想是通过一个词的输入来预测窗口范围内的单词
增加窗口大小会使得模型性能提升,但是计算量也会相应的提升,但是随着窗口加大考虑到的词的和当前输入词的相关性会越来越小
使用当前词作为输入,窗口范围内的上下文随机长度单词作为标签输出
以往对词的相似性通过一个表格来体现词之间的相似程度,但是词汇之间存在着很多程度或者角度上的相似
经过改进后的模型词汇之间可以通过代数关系体现一定的语义关联
本文作者通过语义和句法问题来测试词向量的质量,具体的测试方式是通过创建相似单词对列表,这种方式同时考虑到所有问题的总体准确性。


第二篇论文就是在第一篇基础上进行了扩展,进一步提出改进方法,因为之前的单层模型其实没有对向量维度进行有效压缩,训练的过程中计算量还是超出了预期。
这里是基于SKIP-gram模型的进一步改进,使用基于噪声对比估计的变体-负采样来训练跳词模型,使得改进后的模型比起之前的分层softmax方式相比,计算量更小,词向量的学习效果更好
在此基础上由词模型扩展的短语模型的过程相对来说比较简单,可以通过向量加法来表示一些有意义的结果。

跳词模型是要最大化由中心词预测的周边词概率最大化
C是上下文窗口大小,C取得大精度会相应增长,但是会有更长的训练时长。
原始的跳词模型的规范化因子是计算难度最大的来源,因为词表太大,规范因子需要在整个词表上求和
使用分层softmax方式可以让模型不需要在整个词表上计算来获得概率分布,只需要在log2W上进行计算
因为使用哈夫曼二叉树来表示词的输出结果,经过下采样的高频词会占据较短的编码位置,每个节点会表示子节点的相对概率
也就是说原本的

分层softmax使用二叉树对于性能有着很大的影响,这里使用的是一个二叉哈夫曼树,将单词按照共现频率进行编码。
这类方式还有一种替代方式就是负采样,噪声对比估计理论认为一个好的模型应该能够 通过逻辑回归来区别数据和噪声,这种方式通过将数据置于噪声之上来训练模型,
跳词模型只关心学习到的向量表示的质量,对sotfmax的对数概率什么的都是其次的

直接关注的是对真实分布的预测要最大化,对随机的负样例要最小化
使用负采样来替代原本跳词模型中的对数条件概率
原本的目标被转化为从噪声数据中划分真实样本的分类问题

这里是对超过t的高频词进行下采样
上面的公式是随机丢弃词的概率,也就是如果词频少于t是不会被丢弃的,
注意是词频不是词的出现次数,通常情况下t可以设置为论文研读: - 图110^{-5}
后边就是对短语模型的研究,选取短语数据集
使用经常联合使用的词作为短语

使用sigma作为衰减系数,忽视一部分用的比较少的(不常见组合)短语,同时使用逐渐降低的阈值来对训练数据进行2-4次筛选,就能够形成多个单词组成的长短语
负采样的样本设为5性能就会很不错了,设置成15性能会相当好
对分层softmax应用子采样技术的话就效果会相当好
跳词模型学习到的单词和短语表示呈现一种线性结构,可以从字向量与softmax的非线性输入之间成线性关系,单词向量是单词上下文单词的分布,这些值与输出层的概率成对数关系,两个向量的和就是上下文分布的乘积,乘积这里起到了与运算的作用,词分布中共同的特性会被放大或者缩小
这篇论文的共现就是子采样、负采样,词向量存在线性结构,同时对短语采用一种简单标记的方式来表示。