word2vec主要解决的问题是,把词典中的词表示成一个词向量(或词嵌入,word embedding,把词嵌入到一个向量空间中),这个向量是低维的、稠密的。通过研究词向量的性质,可以得到词之间的各种性质,如距离、相似性等。
1. 统计语言模型
自然语言处理中的一个基本问题:如何计算一段文本序列在某种语言下出现的概率?
统计语言模型给出了这一类问题的一个基本解决框架。对于一段文本序列S=w1,w2,...,wT,它的概率可以表示为:
2. N-gram模型
因为参数空间巨大,所以模型实际上不可用。通过限定过去的N-1个词语,可以得到简化版的N-gram模型,即
3. 从one-hot vector到dense vector
本质上,N-gram对词的表示是one-hot的离散表示,存在问题:1.参数空间随着N成指数增长,当词典数量较大时存在维度灾难问题;2.无法理解词与词之间的内在联系,无法建模出多个相似词的关系。
通过引入稠密向量(dense vector),从离散表示到连续表示,可以解决上面的问题:1. one-hot向量维度大小与词典成正比,稠密向量大小是固定值(50~300);2. 稠密向量各维度值是实数,不限于0和1,可以表示连续空间,可以通过计算距离度量词与词之间的相似度。类似的思想还有IR中的向量空间模型(VSM)。
4. 分布表示与cooccurence矩阵
与词的向量表示相独立的一个问题是,怎样表示一个词的意义?通过分布表示(distributional representation),即上下文环境相似的两个词有着相近的语义,可以度量词之间的相似性。
通过统计上下文中共同出现(cooccurence)的词对,得到cooccurence矩阵,可以用来描述词之间的关系。然而这个矩阵本质上也是one-hot的,存在维度灾难问题,传统方式是对它进行SVD降维表示。
5. NNLM
鉴于N-gram等模型的不足,2003年Bengio等人用神经网络建立统计语言模型的框架NNLM(Neural Network Language Model)。它是一个词嵌入+前馈神经网络,通过前n-1个词来预测第n个词的概率。
流程如下:
- 通过将词特征层(或嵌入层,embedding layer),提取词向量
将前n-1个词从one-hot vector转换成dense vector。转换矩阵是一个共享参数矩阵C,维度为|V|*m,|V|表示词典大小,m表示dense vector的维度大小。
- 基于词向量,训练浅层前馈神经网络
- 输入层((n-1)*m个神经元)
- 隐藏层(h个神经元),激活函数tanh
-
输出层(|V|个神经元),通过softmax输出词典中每个词的概率。注意论文里有输入层到输出层的连接
- 损失函数:cross-entropy + 正则项
模型的参数空间为 θ = (b,d,W,U,H,C),通过梯度递降来训练。
NNLM引入了连续的词向量和平滑的概率模型,我们就可以在一个连续空间里对序列概率进行建模,从而从根本上缓解数据稀疏性和维度灾难的问题。
NNLM存在的问题:1. 只能处理固定长度的模型;2. 参数空间巨大,训练速度慢。
6. word2vec
针对NNLM的问题,在两个步骤中(词向量提取、神经网络训练),计算瓶颈主要在第二个步骤。如果只想得到词向量,可以对神经网络进行简化:
- 移除隐藏非线性激活层:直接将embedding layer与输出层的softmax layer连接;
- 忽略序列信息:输入的所有词向量汇总到同一个embedding layer;
- 增加上下文窗口:将future words纳入上下文环境
得到了word2vec的CBOW模型(Continuous Bag-of-Words Model)。它依然是从context对target word的预测中学习到词向量的表达。
相反,如果从target word对context的预测中学习到word vector,则得到word2vec的skip-gram模型(名称源于该模型在训练时会对上下文环境里的word进行采样)。
关于word2vec的细节将在下一篇中讲述。
参考资料: