共计 5593 个字符,预计需要花费 14 分钟才能阅读完成。
编者按:嵌入 (Embedding) 是机器学习中一种将高维稠密向量转换为低维浓密向量的技术。其通常用于解决自然语言、图像等高维离散数据。
嵌入可能无效地解决维度劫难问题,缩小存储和计算成本,同时进步模型的表达能力。咱们还能够通过失去的嵌入向量进行语义类似度计算、举荐零碎、分类工作等多种利用。嵌入还能够用于解决非结构化数据,如文本、图像、音频等,帮忙机器了解和解决人类的语言和其余感知信息。
IDP 开启 Embedding 系列专栏,具体介绍 Embedding 的发展史、次要技术和利用。本文是《Embedding 技术与利用系列》的第一篇,重点介绍 Embedding 技术的倒退历程,并着重解说 Word2Vec 的工作原理、具体实现等内容。
文章作者首先介绍了以往的编码表示办法的局限,指出它们在解决大规模语料时会产生维度劫难和计算复杂度高的问题。而后作者具体解释了 Word2Vec 模型的工作原理,并给出了具体的 PyTorch 实现代码。作者认为 Word2Vec 克服了传统办法的局限性,是一种优雅的大规模语料解决计划。
心愿本文能给读者带来 Embeddings 技术倒退脉络的系统性了解,对心愿理解和应用 Word2Vec 技术的读者有重要参考价值。
以下是译文,enjoy!
作者 | Vicki Boykis
编译 | 岳扬
🚢🚢🚢欢送小伙伴们退出 AI 技术软件及技术交换群,追踪前沿热点,共探技术难题~
01 Embedding 技术发展史
将内容示意为更低维的向量,使数据成为更紧凑的数字表达形式,并进行计算,这并非一种新的想法。自从人类进入信息爆炸时代以来,就始终在试图综合这些信息,以便咱们能够基于这些信息做出决策。晚期的办法有独热编码(one-hot encoding)、TF-IDF、词袋模型(bag-of-words)、LSA 和 LDA。
晚期的这些办法都是基于计数的办法。它们次要计算一个词绝对于其余词呈现的次数,并以此为根底生成编码。LDA 和 LSA 实质上是一种统计办法,但仍通过启发式办法来推断数据集的属性,而非构建模型。(译者注:意思是应用一些教训法令或规定来猜想数据集的某些属性,而非应用数学模型来形容数据集的属性。这种办法可能不是最精确或最优的,但能够在不足残缺信息或数据集十分大的状况下提供一些有用的信息。与通过建设数学模型的办法相比,应用启发式办法可能更加疾速和简略,但也可能会导致一些误差或不精确。)
基于预测的办法呈现较晚,而是通过反对向量机(support vector machines)、Word2Vec、BERT 和 GPT 系列模型来学习给定文本的属性,前文说的这些模型都应用了学习到的嵌入。
嵌入办法家族谱系图
02 晚期办法的局限性
晚期基于计数的办法,在解决大规模语料库时面临以下两大问题:
2.1 呈现维度劫难
随着特色数的减少,数据集会变得十分稠密。举例来说,如果一段文本语料由 100 万个独特的词汇组成,那么应用独热编码就会产生 100 万个特征向量,每个向量都会极为稠密,因为大多数句子并不会蕴含其余句子的词汇。这会带来两方面的问题:
(1) 当特色数量线性减少时,进行计算会变得十分艰难。
(2) 当特色数量微小时,须要更多的数据能力精确牢靠地形容这些特色,否则模型就无奈良好表白数据,这就是所谓的“维度劫难”。
2.2 计算复杂度较高
以 TF-IDF 为例,它须要解决语料库中的所有词汇,所以工夫复杂度随着词汇总数 N 和文档数量 d 的增长而线性增长,为 O(Nd)。另外,TF-IDF 会生成一个矩阵,如果有 10 万文档和 5 千个词汇,矩阵大小就为 100,000 x 5,000,随着语料规模的增长,这个矩阵会变得非常难以解决。
(译者注:此处为内容总结,全文请看《What are embeddings》3.4 节 Limitations of traditional approaches)
03 Word2Vec
为了克服晚期文本处理办法的局限性,并跟上文本语料库规模一直增长的步调,2013 年,Google 的钻研人员提出了一种优雅的解决方案,名为 Word2Vec[1]。
到目前为止,咱们曾经从简略的启发式办法,如独热编码(one-hot encoding),倒退为机器学习办法(如 LSA 和 LDA),这些办法旨在学习数据集的模型特色。以前,就像最后的独热编码一样,所有的嵌入办法都将重点搁置于稠密向量。稠密向量(sparse vector)可能阐明两个单词之间存在关联,但并不能表明它们之间存在语义关系。例如,“狗追猫”和“猫追狗”在向量空间中的间隔是雷同的,只管它们是齐全不同的句子。
Word2Vec 是一个模型系列,有多种实现办法,每种办法都着眼于将整个输出数据集转换为向量示意,更重要的是,它们不仅关注单个单词的已有标签,还关注这些示意之间的关系。Word2Vec 有两种构建模型的办法——间断词袋模型(CBOW)和 skipgrams 模型,这两种办法都能生成密集的嵌入向量,但对问题的建模过程略有不同。无论是哪种办法,Word2Vec 模型的最终目标都是学习参数,最大限度地进步给定单词或单词组的精确预测概率[2]。
在训练 skipgrams 模型时,首先从初始训练语料(input corpus)中抽取一个单词,而后预测给定的一组单词围绕已抽取的单词的概率。对于 ”Hold fast to dreams for if dreams die, life is a broken-winged bird that cannot fly” 这句话,模型解决这句话的两头步骤是学习、生成一组嵌入,这些嵌入是数据集中所有单词之间的间隔,并以“fast”一词作为输出,预测整个短语中其余单词四周的概率,并给出了这些单词在此处的概率值。
Word2Vec 架构图
在训练 CBOW 时,咱们的做法恰恰相反:从一个短语(被称为上下文窗口)中移除一个单词,而后训练一个模型来预测给定单词可能填充空白处的概率。 这个过程能够用上面的公式示意,咱们的指标是最大化这个概率。
通过优化这两个参数(theta 和 Pi),咱们能够最大化单词在句子中呈现的概率,从而学习到适宜训练语料的好的嵌入向量。
当初让咱们来理解一下 CBOW 的具体实现过程,以便更好地了解其工作原理。这次,在代码局部,咱们将从实用于较小数据集的 scikit-learn 转向更实用于神经网络操作的 PyTorch。在最高层是一列输出词,而后通过第二层(嵌入层)进行解决,最初是输入层(只是一个返回概率的线性模型)。
Word2Vec CBOW 神经网络架构
咱们将在支流神经网络模型构建库 PyTorch 中实现这个架构的。实现 Word2Vec 的最佳办法是应用 Gensim,尤其是在解决较小数据集的状况下,而且 Gensim 将各层形象成外部类,这使得用户体验极佳。但因为咱们才刚刚理解它们,咱们心愿更分明地看到它们是如何工作的,而 PyTorch 尽管没有 Word2Vec 的原生实现,却能让咱们更分明地看到其外部工作原理。
要在 PyTorch 中建模实现 CBOW,须要应用与解决机器学习中的任何问题雷同的办法:
1. 查看并清理输出数据。
2. 构建模型的各层。(对于传统的机器学习模型,只有一层)
3. 将输出数据馈送到模型中并跟踪损失曲线。
4. 检索训练好的模型工件,并利用它对咱们剖析的新我的项目进行预测。
创立 Word2Vec 模型的步骤
先从输出数据开始。在本文中,语料库是咱们收集到的所有 flits。咱们首先须要解决这些数据,作为模型的输出。
Word2Vec 输出数据集
要为 PyTorch 筹备输出数据,咱们能够应用 DataLoader 或 Vocab 类,将文本拆分为 token 和进行分词,或者说为每个句子创立更小的单词级示意。对于文件中的每一行,咱们都会通过将每一行拆分成单个单词,而后删除空格和标点符号,并将每个单词小写化,从而生成 token。
这种解决流程在 NLP 中十分常见,花工夫做好这一步至关重要,这样咱们能力失去洁净、正确的输出数据。该流程通常包含以下步骤[3]:
• 分词 – 通过拆分句子或单词转换为其组成字符
• 去除噪声 – 包含 URL、标点符号和文本中与当前任务无关的其余内容
• 单词宰割 – 将句子拆分成多个单词
• 纠正拼写错误
解决输出词汇表并在 PyTorch 中从数据集构建一个 Vocabulary 对象[4]
当初曾经胜利创立了一个能够应用的输出词汇表对象,下一步是将每个单词创立为一个数字地位的独热编码,并将每个地位再映射回单词,这样就能够轻松地同时援用单词和向量。咱们的指标是在查找和检索时可能来回映射。
这一步产生在嵌入层中。在 PyTorch 的嵌入层中,咱们依据指定的矩阵大小和词汇表的大小初始化一个嵌入矩阵,该层将词汇表中的单词索引到词向量字典中,以便进行检索。嵌入层是一个查找表,可按索引将单词与相应的单词向量进行匹配。首先,咱们创立一个独热编码的 word to term 字典。而后,咱们创立每个单词到词向量的映射和每个词向量到每个单词的映射。这被称为双射(bijection)。这样,嵌入层就像一个独热编码矩阵,容许咱们进行查找,实现词语和词向量之间的转换。这一层的查找值初始化为一组随机权重,而后咱们将其传递给线性层。
嵌入相似于哈希映射(hash maps),也具备本人的性能特色(O(1)的检索和插入工夫),这就是为什么嵌入层能够轻松扩大,而其余办法却做不到。在嵌入层中,Word2Vec 中每个向量中的每个值都示意特定维度上的单词。更重要的是,与其余办法不同,该办法中每个向量的值都与输出数据集中的其余词语有间接关系。
在 Pytorch 中实现 Word2Vec CBOW[4]
失去查找值(lookup values,译者认为此处应为词向量)之后,就能够解决所有单词了。对于 CBOW 这种办法,须要先抉择一个滑动窗口,例如在本文这种状况下,即抉择指标词前后两个词作为上下文窗口,而后尝试推断出理论的单词是什么。这就是所谓的上下文向量(context vector),在一些状况下,它也被称为注意力。例如,对于“No bird [blank] too high”这个短语,咱们就会尝试预测答案是“soars(飞翔)”,也就是应用 softmax 概率来计算每个单词在给定上下文中呈现的概率,并依据这些概率进行训练和推理。一旦有了上下文向量之后,咱们就能够查看 loss 值(即实在单词与按概率排序的预测单词之间的差值),而后持续。
本文训练该模型的办法是通过上下文窗口。对于模型中的每个给定的单词,都要创立一个滑动窗口,其包含该单词和它的前后 2 个单词。
接着是应用 ReLu 激活函数激活线性层(linear layer),该函数会决定给定的权重是否重要。在这种状况下,ReLu 激活函数会将咱们初始化嵌入层的所有负值压缩为零,因为不可能有反向的单词关系,并通过学习单词关系模型的权重进行线性回归(linear regression)。而后,咱们查看每个 batch 的 loss,即实在单词与咱们依据上下文窗口预测应该存在的单词之间的差别,并将损失函数最小化。
在每个 epoch 完结时或将数据输出到模型中进行解决的过程中,将权重传递或反向流传回线性层,而后再次依据概率更新每个单词的权重。这里的概率是通过 softmax 函数计算的,该函数将实数向量(vector of real numbers)转换为概率分布(probability distribution),即向量中的每个数字都代表一个单词的概率值,该值在 0 和 1 之间的区间内,所有单词的概率数值加起来等于 1。反向流传到嵌入表(embeddings table)的间隔应该会逐步收敛,具体变动水平取决于模型对特定单词之间靠近水平的了解。
PyTorch 中 Word2Vec CBOW 的实现[4]
当实现对训练集的迭代后,咱们就训练实现了一个模型,该模型可能检索出给定单词是否是正确单词的概率,并且也能检索出词汇表的整个嵌入空间。换句话说,咱们能够利用这个模型来预测单词,并且能够应用嵌入空间来比拟单词之间的相似性。
下一期,咱们将分享神经网络技术下的 Embedding 技术,敬请期待。
END
参考资料
[1]Tomas Mikolov, Kai Chen, Greg Corrado, and Jeffrey Dean. Efficient estimation of word representations in vector space. arXiv preprint arXiv:1301.3781, 2013.
[2]Yoav Goldberg and Omer Levy. word2vec explained: deriving mikolov et al.’s negative-sampling word-embedding method. arXiv preprint arXiv:1402.3722, 2014.
[3]Usman Naseem, Imran Razzak, Shah Khalid Khan, and Mukesh Prasad. A comprehensive survey on word representation models: From classical to state-of-the-art word representation language models. Transactions on Asian and Low-Resource Language Information Processing, 20(5):1–35, 2021.
[4]https://github.com/veekaybee/viberary/tree/main/word2vec
本文经原作者受权,由 Baihai IDP 编译。如需转载译文,请分割获取受权。
原文链接:
https://vickiboykis.com/what_are_embeddings/index.html
🚢🚢🚢欢送小伙伴们退出 AI 技术软件及技术交换群,追踪前沿热点,共探技术难题~