技术编程|词向量因何存在:一段往计算机输入文字的历史( 三 )


「聚类」就是基于这种思想生成特征的一种成功的方法 。 例如 , Brown 等人提出的聚类算法根据语料库中出现的上下文自动地将单词组织成一些聚类簇 。 倾向于出现在相同的邻居上下文的单词会被划分到同一个簇中 。 如图 1 所示这种方法具有惊人的可解释性和实用性 , 我们还可以使用任意给定的语料库重新构建它 , 包含所有观测到的单词 。

技术编程|词向量因何存在:一段往计算机输入文字的历史
本文插图

图 1:Brown 聚类示意图 。 该结果是根据 56M 条 tweet 生成的 , 本图中给出了以 00110 二进制串为前缀的簇的层次结构 , 以及簇中 10 个出现频率最高的单词 。 树中的中间节点对应于包含后继节点中所有单词的簇 。
另一类方法在一开始需要创建单词向量 , 其中每个维度对应于词性在某些上下文中出现的频率 。 例如 , 一个维度可能对应于「the」 , 并且包含在一个词例「the」附近的一个小的窗口中某单词出现的次数 。 该向量可能包括单词左侧、右侧 , 以及不同距离和长度的上下文模式 。 这样创建的单词向量可能比词汇表的还要行很多倍 。 我们可以利用线性代数的降维方法 , 将这些向量压缩地更短 , 从而减少维度之间的冗余 。

技术编程|词向量因何存在:一段往计算机输入文字的历史
本文插图

图 2:计算单词向量的方法示意图 。
降维之后的向量的优点有:首先 , NLP 程序员可以根据程序的需要选择合适的维度 。 更紧凑的向量计算效率更高 , 也可能由于特定语料库的噪声在压缩过程中消失而受益 。 然而 , 压缩的代价则是牺牲了一部分原始信息 。 由于压缩后的向量中单独的维度是很难被解释的 , 我们可以使用一些常见的算法找到单词在向量空间中的最近邻 , 它们往往是具有相关语义的单词 。
实际上 , 这些观测结果催生了「向量空间语义」的思想 , 我们可以对单词向量进行算术运算 , 从而理解学习到的单词「意义」 。 一个著名的例子是:
降维后的向量的缺点在于:独立的维度并不是可解释的特征 , 不能够直接被映射回构建单词意义的模块 。 单词的意义是分布在整个向量上的;因此 , 这些向量有时被称为分布的表征 。
随着语料库规模不短增长 , 可伸缩性成为了一个重大的挑战 。 所有词向量算法底层的思想是:词形向量的每个维度上的值是一个有待优化的参数 。 我们通过优化这些参数 , 最佳地拟合观测到的数据中的单词模式 。 由于我们将这些参数视为连续的值 , 而且拟合数据的概念可以作为光滑、连续的目标函数来操作 , 因此可以通过基于梯度下降的迭代式算法完成优化 。
研究人员对获取分布式词向量的方法进行了大量的探索 。 接下来 , 我们将列举出一些有趣的想法:
如图 3 所示 , 我们首先将每个输入的词例映射到其向量上 , 然后将词向量输入到神经网络模型中 , 该神经网络执行类似于翻译的任务 。 向量可以预先给定(或使用上述方法根据一个语料库预训练得到) , 也可以作为神经网络模型的参数 , 根据特定任务进行调整 。 「调优」(fine-tuning)是指通过预训练初始化向量 , 然后通过特定任务的学习算法来调整他们 。 我们也可以随机初始化词向量 , 从头开始学习 。
图 3:一个简单的神经网络示意图 。 神经网络是一种将向量映射到向量的函数 。 例如 , 将二维输入映射到二维输出上的函数:
我们可以使用 WordNet 这种专家构建的数据结构作为额外的输入来创建词向量 。 「retrofitting」方法首先从语料库中提取出词向量 , 然后试图自动地对其进行调整 , 使得在 WordNet 中那个相关的词形在向量空间中更接近 。
我们可以使用双语词典 , 将两种语言状态下的词向量「对齐」到同一个向量空间中 。 这样一来 , 例如英语词形「cucumber」和法语词形「concombre」的向量之间的欧氏距离就很小了 。


推荐阅读