第十五章:词嵌入
在前两章中,我们应用了词袋模型将文本数据转换为数值格式。结果是稀疏的、固定长度的向量,表示文档在高维词空间中的位置。这允许评估文档的相似性,并创建特征来训练机器学习算法,分类文档的内容或评估其中表达的情感。然而,这些向量忽略了术语使用的上下文,因此,例如,包含相同单词的不同句子将被编码为相同的向量。
在本章中,我们将介绍一种替代类别的算法,它使用神经网络来学习个别语义单元(如单词或段落)的向量表示。这些向量是密集的,而不是稀疏的,而且有几百个实值,而不是几万个二进制或离散条目。它们被称为嵌入,因为它们将每个语义单元分配到连续向量空间中的位置。
嵌入是通过训练模型将标记与其上下文关联起来而产生的,这样做的好处是类似的用法意味着类似的向量。此外,我们将看到嵌入如何通过它们的相对位置来编码语义方面的关系,例如词之间的关系。因此,它们是我们将在后面的章节中介绍的深度学习模型中强大的特征。
具体来说,在本章中,我们将涵盖以下主题:
- 词嵌入是什么,以及它们如何工作和捕捉语义信息
- 如何使用训练好的词向量
- 哪些网络架构对训练 Word2vec 模型有用
- 如何使用 Keras、gensim 和 TensorFlow 训练 Word2vec 模型
- 如何可视化和评估词向量的质量
- 如何使用 SEC 文件训练 Word2vec 模型
- 如何扩展 Word2vec 的
Doc2vec
词嵌入如何编码语义
词袋模型将文档表示为反映其所包含标记的向量。词嵌入将标记表示为较低维度的向量,使得它们的相对位置反映了它们在上下文中的使用方式的关系。它们体现了语言学中的分布假设,即单词最好通过它们的搭配来定义。
词向量能够捕捉许多语义方面;不仅是近义词彼此靠近,而且单词之间可以有多个相似度程度,例如,单词“驾驶员”可能与“汽车司机”或“导致”的相似。此外,嵌入反映了单词对之间的关系,例如类比(东京对日本就像巴黎对法国,或者 went 对 go 就像 saw 对 see),我们将在本节稍后进行说明。
嵌入是通过训练机器学习模型来预测单词与它们的上下文或反之。在下一节中,我们将介绍这些神经语言模型的工作原理,并介绍成功的方法,包括 Word2vec、Doc2vec
和 fastText。
神经语言模型如何学习上下文中的用法
词嵌入是通过训练一个浅层神经网络来预测给定上下文的单词而产生的。传统语言模型将上下文定义为目标词之前的单词,而单词嵌入模型使用包围目标的对称窗口中包含的单词。相比之下,词袋模型使用整个文档作为上下文,并使用(加权)计数来捕捉单词的共现关系,而不是预测向量。
早期使用的神经语言模型包括增加了计算复杂性的非线性隐藏层。Word2vec 及其扩展简化了体系结构,以便在大型数据集上进行训练(例如,维基百科包含超过二十亿个标记;有关前馈网络的详细信息,请参阅第十七章 深度学习)。
Word2vec 模型 – 大规模学习嵌入
Word2vec 模型是一个将文本语料库作为输入并输出该语料库中单词的一组嵌入向量的两层神经网络。有两种不同的架构可以使用浅层神经网络有效地学习单词向量,如下图所示:
- Continuous-Bag-Of-Words(CBOW)模型使用上下文词向量的平均值作为输入来预测目标词,因此它们的顺序并不重要。CBOW 模型训练速度更快,对于频繁词汇来说稍微准确一些,但对不经常出现的单词关注较少。
- Skip-Gram(SG)模型与之相反,使用目标词来预测从上下文中抽样的词。它在小数据集上效果很好,并且即使对于罕见的单词或短语也能找到良好的表示:
因此,Word2vec 模型接收一个嵌入向量作为输入,并与另一个嵌入向量计算点积。请注意,假设归一化向量,当向量相等时,点积被最大化(绝对值),当它们正交时被最小化。
然后使用反向传播来根据由任何分类错误造成的目标函数计算的损失来调整嵌入权重。在下一节中,我们将看到 Word2vec 如何计算损失。
训练通过将上下文窗口滑过文档进行,通常被分成句子。每次完整迭代整个语料库都被称为一个时代。根据数据,可能需要几十个时代才能使向量质量收敛。
从技术上讲,SG 模型已被证明可以因式分解包含相应单词和上下文对的点互信息的单词-上下文矩阵(请参阅 GitHub 上的参考文献)。
模型目标 – 简化 softmax
Word2vec 模型旨在预测一个单词,而这个单词可能是非常大的词汇表中的一个。神经网络通常使用 softmax 函数,该函数将任意数量的实值映射到相等数量的概率,以实现相应的多类目标,其中h指嵌入,v指输入向量,c是单词w的上下文:
然而,softmax 的复杂性随着类别数量的增加而增加,因为分母需要计算词汇表中所有单词的点积以标准化概率。Word2vec 模型通过使用 softmax 的简化版本或基于采样的方法(详见参考资料)来提高效率:
- 分层 softmax 将词汇表组织为具有词作为叶节点的二叉树。到每个节点的唯一路径可用于计算单词概率。
- 噪声对比估计 (NCE) 对上下文外的“噪声词”进行采样,并将多类任务近似为二元分类问题。随着样本数量的增加,NCE 的导数接近 softmax 梯度,但只要 25 个样本就能产生与 softmax 相似的收敛速度,速度快 45 倍。
- 负采样 (NEG)省略了噪声词样本,以逼近 NCE 并直接最大化目标词的概率。因此,NEG 优化了嵌入向量的语义质量(相似用法的相似向量),而不是测试集上的准确性。然而,它可能对频率较低的单词产生比分层 softmax 目标更差的表示。
自动短语检测
预处理通常涉及短语检测,即识别常用在一起的标记,并应该接收单一向量表示(例如,纽约市,请参阅第十三章中关于 n-gram 的讨论,处理文本数据)。
原始的 Word2vec 作者使用了一种简单的提升评分方法,该方法将两个词w[i]、w[j]标识为一个二元组,如果它们的联合出现相对于每个词的单独出现超过了给定阈值,通过一个修正因子δ校正:
评分器可以重复应用以识别连续更长的短语。
另一种选择是归一化的点间互信息分数,这种方法更准确,但计算成本更高。它使用了相对词频P(w),并在+1 和-1 之间变化:
如何评估嵌入向量 - 向量运算和类比
词袋模型创建反映标记在文档中存在和相关性的文档向量。潜在语义分析减少了这些向量的维度,并在此过程中识别了可被解释为潜在概念的内容。潜在狄利克雷分配将文档和术语都表示为包含潜在主题权重的向量。
词和短语向量的维度没有明确的含义。然而,嵌入在潜在空间中编码了相似用法,以一种体现在语义关系上的接近性的方式。这导致了有趣的性质,即类比可以通过添加和减去词向量来表达。
以下图显示了连接巴黎和法国的向量(即它们的嵌入之差)如何反映了首都关系。类似的关系,伦敦:英国,对应于相同的向量,即英国与通过将首都向量添加到伦敦得到的位置非常接近:
正如单词可以在不同的语境中使用一样,它们可以以不同的方式与其他单词相关联,而这些关系对应于潜在空间中的不同方向。因此,如果训练数据允许,嵌入应该反映出几种不同类型的类比关系。
Word2vec 的作者提供了一份涵盖地理、语法和句法以及家庭关系等多个方面的几千个关系的列表,用于评估嵌入向量的质量。如上所示,该测试验证了目标词(英国)最接近的是将代表类似关系(巴黎:法国)的向量添加到目标的补充(伦敦)后得到的结果。
以下图将在维基百科语料库上训练的 Word2vec 模型的最相关类比的 300 维嵌入,具有超过 20 亿标记,通过主成分分析(PCA)投影到二维。从以下类别的超过 24,400 个类比的测试实现了超过 73.5% 的准确率(参见笔记本):
使用嵌入模型
与其他无监督学习技术类似,学习嵌入向量的目标是为其他任务生成特征,如文本分类或情感分析。
获取给定文档语料库的嵌入向量有几种选项:
- 使用从通用大语料库(如维基百科或谷歌新闻)中学到的嵌入
- 使用反映感兴趣领域的文档来训练自己的模型
对于后续的文本建模任务,内容越专业化、越不通用,第二种方法就越可取。然而,高质量的词向量需要大量数据,并且需要包含数亿字的信息性文档。
如何使用预训练的词向量
预训练词嵌入的几个来源。流行选项包括斯坦福的 GloVE 和 spaCy 的内置向量(有关详细信息,请参见笔记本 using_trained_vectors
)。
GloVe - 用于词表示的全球向量
GloVe 是在斯坦福 NLP 实验室开发的无监督算法,它从聚合的全局词-词共现统计中学习单词的向量表示(请参阅参考文献)。可用于以下网络规模来源的预训练向量:
- Common Crawl 共有 420 亿或 840 亿令牌和词汇表或 190 万或 220 万令牌。
- Wikipedia 2014 + Gigaword 5,共有 60 亿令牌和 40 万令牌的词汇表。
- 推特使用了 20 亿条推文,27 亿令牌和 120 万令牌的词汇表
我们可以使用 gensim 将矢量文本文件转换并加载到 KeyedVector
对象中:
from gensim.models import Word2vec, KeyedVectors from gensim.scripts.glove2Word2vec import glove2Word2vec glove2Word2vec(glove_input_file=glove_file, Word2vec_output_file=w2v_file) model = KeyedVectors.load_Word2vec_format(w2v_file, binary=False)
Word2vec 作者提供了包含超过 24,000 个类比测试的文本文件,gensim 用于评估词向量。
在维基百科语料库上训练的词向量涵盖了所有类比,并在各个类别中达到了 75.5% 的总体准确率:
类别 | 样本 | 准确率 | 类别 | 样本 | 准确率 |
首都-普通国家 | 506 | 94.86% | 比较级 | 1,332 | 88.21% |
首都-世界 | 8,372 | 96.46% | 最高级 | 1,056 | 74.62% |
城市-州 | 4,242 | 60.00% | 现在分词 | 1,056 | 69.98% |
货币 | 752 | 17.42% | 国籍形容词 | 1,640 | 92.50% |
家庭 | 506 | 88.14% | 过去时 | 1,560 | 61.15% |
形容词到副词 | 992 | 22.58% | 复数 | 1,332 | 78.08% |
反义词 | 756 | 28.57% | 复数动词 | 870 | 58.51% |
常见爬网词嵌入的 10 万个最常见标记覆盖了约 80% 的类比,并以 78% 的略高准确率,而 Twitter 的词嵌入则仅覆盖了 25%,准确率为 62%。
Python 机器学习算法交易实用指南(五)(2)https://developer.aliyun.com/article/1523711