我们要解决的问题是:一个文本经过前置的分词处理之后,送入一个语言模型进行预测,需要以一个什么样的形式输入?

显然,直接使用文本不是很合适,因为我们的模型实质上就是一个超大型的函数,函数上的参数描述了词在各个维度上的信息,直接输入文本相当于用 unicode 编码进行处理,这种编码没有考虑文字与文字之间的关联,因此,我们需要一种有效的数字表示,以提升模型对文本域的学习能力。

词袋模型

词袋模型是早期的词向量化工具,这种方法将初始预料进行分词,得到的分词结果进行标号,最后就能得到每个分词结果的向量表示,且每个向量都是 $|V|$ 维的,其中 $|V|$ 是词袋中词的数量。

这种模型的缺陷在于,其忽略了词与词之间的顺序信息,从另一个角度来说,这种模型就是 One Hot 编码在向量化中的应用,无法正确还原词语在语义空间中的正确表达。

词向量模型

词向量模型与词袋模型不同,其维度并不是由词袋的元素个数决定,而是一个固定长度,例如 256,512 维。在说明词向量的具体思想之前,我们需要明确词向量的目标是什么

  1. 良好的词向量应该能够正确地表示词与词之间的关联程度,例如橘子和橙子的距离应该小于橘子和土豆的距离。
  2. 支持词语之间的复合,例如通过直观的加法运算,快速得到一个复合词的向量表示,例如 “女人”+“漂亮” =“女神” 。

训练获取词向量模型的一个重要方法就是使用神经网络来训练。

在这里我们先忽略神经网络模型的具体实现,去探讨神经网络的设计目标与副产物(词向量)的产生。

所有统计语言学模型的根本目标都是寻找一个句子出现的概率,例如

$$ P(w_t|w_1,w_2,...,w_{t-1}) $$

其中的 $w$ 是词汇表中词语的向量表示。

那么,最初的向量是怎么来的?很显然,如果从 0 开始训练模型,我们对词和词之间的关系不会有任何的先验知识,因此我们选择直接进行随机初始化,在整个神经网络的训练过程中,会一步一步的优化调整词向量的数值,以降低目标任务的损失函数。一般来说,通用模型训练的主要任务是 MLM (掩码语言模型,遮蔽部分单词,给出上下文,让模型预测被遮蔽的单词是什么)。

训练完成之后,我们就得到了一个可以预测的神经网络模型和一组词向量的表示,一般来说,我们将词向量表示的矩阵称为 embedding 层。


【NLP-词向量】词向量的由来及本质_51CTO博客_词向量