ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Word2Vec(下)

Word2Vec(下) 碎碎语在我的word2vec上中我们已经较为详细的介绍过了统计语言模型和神经网络语言模型但是那些也只是我们Word2vec学习的前的一些开胃小菜加下来我们终于要进入Word2vec的学习了。Word2Vec其实在学习NLP的过程中我越发的发现很多模型的处理方式很我们人类的正常思考方式很相似。在语言的处理方面也是因为我们人类的语言系统中我们是从字--词语--句子--段落--文章。但是呢因为我们的计算机是无法直接理解我们的语言因此计算机需要先将我们的人类语言计算机化也就是将我们的语言转化成数字在我们这里也就是向量进而通过向量去理解我们的上下文。在我们Word2Vec上的讲解中我们说过N-gram它本质上就是就是统计我们共现词出现的频率进而预测我们的下一个要输出什么而我们的word2vec则是通过观察和学习大量的句子从而培养语感从而具有一定的预测能力。一. Word2Vec到底解决什么问题假设我们的语料库在这其中每一个都是一个token在传统NLP中我们会使用one-hot。这时候就会有人问什么是one-hot呀其实这个应该在Word2Vec上的部分就写完的但是因为我忘了在此补充一下one-hot简单点来说就是给我们的每个词贴的唯一标签他本身是无法表达词的含义只能去表达词的一个顺序位置例如假设我们单词表有五个词“我” “喜欢” “吃” “苹果” “香蕉”那么我们就可以使用长度为5的向量来表示我们的这五个词“我” [1,0,0,0,0]“喜欢” [0,1,0,0,0]“吃” [0,0,1,0,0]“苹果” [0,0,0,1,0]“香蕉” [0,0,0,0,1]我们会发现我们的每个向量只有一个位置是1其余位置都是0而且那个是1的位置正好就是我们每个词语在句子中的位置。这便是我们的One-Hot。但是如果你真的理解语言模型你就会发现我们的One-Hot有一个非常致命的问题虽然我们可以通过One-Hot将我们的token转换成向量但是这个向量他只能去表示我们token的位置对于token和token之间的关系他一无所知在数学上这个关系的体现一般会使用点积。[0,0,0,1,0][0,0,0,0,1]* 0这说明在我们的one-hot下我们的苹果和香蕉没有任何关系本质上就是one-hot标签无法去表示token和token之间的内在联系。补充完了我们的one-hot我们回归主题。正是因为我们的One-Hot标签无法去理解词和词的内在联系因此我们的Word2Vec希望有一种方法可以用向量来表示我们的token既可以表示词和词之间的关系也尽可能的保持低维度因为低维度可以降低计算复杂度。Word2Vec 希望学习一个映射其中例如 king -- [0.21,-0.31,0.72......]我们希望较大而较小本质上就是我们希望相似的词他们的词向量尽可能的相近不相似的词他们的词向量尽可能的相离。这里的相似和相离只要计算两个向量的余弦相似值即可。因此我们的Word2Vec本质上就是让计算机理解词与词之间的关系。二.Word2Vec 的核心理论在前面我说过Word2Vec本质上就是一种基于神经网络训练来让计算机理解词与词之间的关系但是在Word2Vec中最重要的理论是Distributional Hypothesis分布假设。那什么是分布假设Distributional Hypothesis简单点来讲就是一个词的语义可以由它所处的上下文决定。例如I drink coffee every morning.I drink tea every morning.I drink milk every morning.那么和可能具有相似的分布因此这个分布式假设可以简单总结成语义相似上下文分布相似因此我们的Word2Vec的本质就是尝试把这个思想参数化成一个神经网络优化问题。参数化简单点来说就是不要只凭人观察或者说直觉而是用一堆可以学习的数字来表示。神经网络优化Loss——反向传播——优化器——更新参数具体内容请参考我们我Word2Vec上总结我们认为“词的意义可以通过上下文体现”于是把每个词表示成一组可以学习的数字然后设计一个“根据词预测上下文”的任务通过损失函数、反向传播和优化器不断调整这些数字最终得到有语义关系的词向量。三.Word2Vec的核心框架我们以skip-gram和Nagetive Sampling为例子训练语料 → 构造训练样本中心词上下文词 → Embedding Lookup → 词向量 计算点积Score → Negative Sampling → Sigmoid → Loss → 反向传播 → 参数更新 → W、W′更新 → 最终 EmbeddingWord2Vec 并不是直接“计算出”Embedding而是通过一个“预测上下文”的任务让Embedding矩阵里的参数在训练过程中不断被优化最后得到含有语义信息的词向量。1.训练语料假如我们有我 喜欢 吃 苹果我 喜欢 吃 香蕉Word2Vec首先需要大量这样的文本但是呢我们的Word2Vec本身又不能理解我们的纯文本因此需要我们把文本转换成训练样本。2.构造训练样本构造 Skip-gram 训练数据假设我 喜欢 吃 苹果window窗口 1含义中心词往左或者往右只关注一个最近的词。有点想我当年学过的滑动窗口假设“喜欢”是我们的中心词那么“我”和“吃”都会在我们的窗口中出现而这两个在窗口中会出现的词语表示的就是我们的上下文词。因此我们就会得到喜欢我和喜欢吃这两个样本。所以我们的Skip-gram 训练数据就是我们大量的中心词上下文词对。不过因为我们的计算机只能去理解0和1所以我们还是需要帮我们的训练数据数字化变成计算机可以理解的语言。其实学到这里很多人会产生疑问我们学过了N-gram 可以看看我的Word2Vec现在又学习了skip-gram好像在word2vec中还有一个CBOW这些技术到底是用来干啥的为啥要搞这么多的算法skip-gram他关心的是一个词(中心词)他的周围会出现那些词。CBOW他关心的是已知周围的词上下文词他的中心词是什么。N-gram本质上是根据词与词共现的一个频率来估计我们的条件概率。简单总结一下CBOWSkip-gram输入上下文中心词输出中心词上下文方向context-targettarget-context训练样本一个上下文组合-中心词一个中心词-多个上下文组合核心目的学习词向量学习词向量如果以后你面试的时真的被询问“N-gram、CBOW、Skip-gram 有什么区别”“N-gram 主要通过统计固定长度的局部词序列来估计条件概率例如根据前 N-1 个词预测下一个词CBOW 和 Skip-gram 都属于 Word2Vec通过上下文预测任务学习词的分布式表示其中 CBOW 是由上下文预测中心词而 Skip-gram 是由中心词预测上下文词。N-gram 更关注显式的词序概率而 Word2Vec 更关注词之间的分布式语义关系。”3.Embedding Lookup简单点来说就是查表这个embedding lookup会在后面频繁的使用到。我们有一个embedding 矩阵比如那么“吃”这个词的id 2我们去词向量表中找第二行进而我们就会得到 [0.2,-0.1,0.5].这个过程就被叫做Embedding Lookup根据词 ID从 Embedding 矩阵中取出这个词当前的向量。4.词向量 计算点积Score或者说是Logit在我们经历过了Embedding Lookup之后我们就会得到两个矩阵(W)和(W),也就是我们的中心词矩阵和我们的上下文矩阵。所以对于喜欢我我们很容易查表得到和最开始这两个向量是随机化初始的我们训练的过程就是不断的修正他们。我们得到了中心词和上下文词之后我们就可以计算我们的点积从而得到我们的score{计算(中心词上下文词)到底有多匹配}例如ScoreLogit *通过计算如果我们的点积比较大说明这两个词较为匹配反之则相反。5.Negative Sampling其实这个东西算是一种优化策略但是我感觉未来可能随着算力的不断提高很多优化的策略也许使用暴力的堆叠可能也会有不同的结果。假设词表如果我们要预测“吃”的上下文是不是“苹果”最简单的方法就是遍历所有的词分别算出条件概率但是这太慢了O(N)效率太低了。Negative Sampling的想法就是我不需要拿整个词表比较只随机挑几个“错误答案”来比较。也就是在我们学习正样本的同时会提供给模型一些负样本进而提高我们模型的学习效率。如果未来我真的有时间的话我感觉可以把我看的Clip那篇论文简单的讲一下我相信各位正在学习大模型或者是NLP的同志们一定会有不同的收获。作用把原本昂贵的“整个词表上的多分类问题”转化成少量样本上的二分类问题。6.Sigmoid激活函数现在的我们在经过上面的点积计算过后我们已经得到了Score *我们需要把这Score分数变成0~1之间的数字这时候就会有好奇宝宝问“为什么我们需要将我们的这个Score分数计算前统一到0~1的范围之内这样做有什么好处”我们在上面计算点积是得到是一个数他并不是一个概率而我们在后续的计算和训练时都需要的是条件概率因此我们的激活函数Sigmoid负责把“匹配程度”转换成“这个样本是真实上下文的概率”。那这时候好奇宝宝又开始提问题了为什么这里激活函数使用Sigmoid而不去使用别的激活函数呢这其实就和我们的Negative Sampling有点关系了由于我们的Word2Vec会采用到负样本训练的缘故我们的模型训练的本质上就是判断“中心词 上下文词”这个组合是真的还是假的。也就是我们所谓的二分类问题。7.Loss损失值我们的模型在经过预测之后我们该如何评价模型预测的效果呀这就要使用到我们的Loss了衡量我们模型给出的预测到底怎么样。例如如果那么这就说明模型预测的很好反之则说明我们的模型训练效果一般。8.反向传播和参数更新反向传播简单点来说就是探寻我们参数往什么方向去修改可以去降低我们的Loss值。在反向传播的过程中会用到链式法则计算偏导数。具体内容可以参看我的上一篇博客。至于参数更新就要使用到我们的优化器说法很多我自己现在也只用过几个简单点的后续等我完全弄明白了再来补充一下这里的部分内容。9.更新Embedding矩阵W、W′原来的 W和W --》反向传播得到的梯度--》优化器 --》新的W和W’至此我们就得到了我们最终的Word2Vec Embedding。我们的Embedding在训练的过程中蕴含了大量的词-上下文关系。至此我们的Word2Vec的完整架构就已经讲完了但是其实还是会有很多细节内容没有完全讲清如果真的想要学明白最好自己去推到一些那个数学公式视频在cs224n第一节课的最后10min.如果对别的部分的数学推导感兴趣我推荐你看一下这篇《word2vec中的数学原理详解》。四.未来One-Hot → N-gram → Word2Vec → Contextual Embedding→Transformer → BERT / GPT → LLM虽然我们的Word2Vec距离现在已经过去很久了但是我觉得一种算法也好模型也罢我们在学习他的时候更多的是学习一种思考的方式没有必要一直追着我们所谓的前沿去追寻当然如果你着急去实习的话那就另说了那还是及时做点和你想去岗位垂直的实习方便你入职。如果你能认真的看完我写的这两篇文章我相信你们一定会有所收获。博观而约取厚积而薄发。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进