word2vec原理(二) 基于Hierarchical Softmax的模型

简介:

1. 基于Hierarchical Softmax的模型概述

    我们先回顾下传统的神经网络词向量语言模型,里面一般有三层,输入层(词向量),隐藏层和输出层(softmax层)。里面最大的问题在于从隐藏层到输出的softmax层的计算量很大,因为要计算所有词的softmax概率,再去找概率最大的值。这个模型如下图所示。其中 V 是词汇表的大小,

 

    word2vec对这个模型做了改进,首先,对于从输入层到隐藏层的映射,没有采取神经网络的线性变换加激活函数的方法,而是采用简单的对所有输入词向量求和并取平均的方法。比如输入的是三个4维词向量: ( 1 , 2 , 3 , 4 ) , ( 9 , 6 , 11 , 8 ) , ( 5 , 10 , 7 , 12 ) ,那么我们word2vec映射后的词向量就是 ( 5 , 6 , 7 , 8 ) 。由于这里是从多个词向量变成了一个词向量。

    第二个改进就是从隐藏层到输出的softmax层这里的计算量个改进。为了避免要计算所有词的softmax概率,word2vec采样了霍夫曼树来代替从隐藏层到输出softmax层的映射。我们在上一节已经介绍了霍夫曼树的原理。如何映射呢?这里就是理解word2vec的关键所在了。

    由于我们把之前所有都要计算的从输出softmax层的概率计算变成了一颗二叉霍夫曼树,那么我们的softmax概率计算只需要沿着树形结构进行就可以了。如下图所示,我们可以沿着霍夫曼树从根节点一直走到我们的叶子节点的词 w 2

 

    和之前的神经网络语言模型相比,我们的霍夫曼树的所有内部节点就类似之前神经网络隐藏层的神经元,其中,根节点的词向量对应我们的投影后的词向量,而所有叶子节点就类似于之前神经网络softmax输出层的神经元,叶子节点的个数就是词汇表的大小。在霍夫曼树中,隐藏层到输出层的softmax映射不是一下子完成的,而是沿着霍夫曼树一步步完成的,因此这种softmax取名为"Hierarchical Softmax"。

    如何“沿着霍夫曼树一步步完成”呢?在word2vec中,我们采用了二元逻辑回归的方法,即规定沿着左子树走,那么就是负类(霍夫曼树编码1),沿着右子树走,那么就是正类(霍夫曼树编码0)。判别正类和负类的方法是使用sigmoid函数,即:

P ( + ) = σ ( x w T θ ) = 1 1 + e x w T θ

    其中 x w 是当前内部节点的词向量,而 θ 则是我们需要从训练样本求出的逻辑回归的模型参数。

    使用霍夫曼树有什么好处呢?首先,由于是二叉树,之前计算量为 V ,现在变成了 l o g 2 V 。第二,由于使用霍夫曼树是高频的词靠近树根,这样高频词需要更少的时间会被找到,这符合我们的贪心优化思想。

    容易理解,被划分为左子树而成为负类的概率为 P ( ) = 1 P ( + ) 。在某一个内部节点,要判断是沿左子树还是右子树走的标准就是看 P ( ) , P ( + ) 谁的概率值大。而控制 P ( ) , P ( + ) 谁的概率值大的因素一个是当前节点的词向量,另一个是当前节点的模型参数 θ

    对于上图中的 w 2 ,如果它是一个训练样本的输出,那么我们期望对于里面的隐藏节点 n ( w 2 , 1 ) P ( ) 概率大, n ( w 2 , 2 ) P ( ) 概率大, n ( w 2 , 3 ) P ( + ) 概率大。

    回到基于Hierarchical Softmax的word2vec本身,我们的目标就是找到合适的所有节点的词向量和所有内部节点 θ , 使训练样本达到最大似然。那么如何达到最大似然呢?

2. 基于Hierarchical Softmax的模型梯度计算

   我们使用最大似然法来寻找所有节点的词向量和所有内部节点 θ 。先拿上面的 w 2 例子来看,我们期望最大化下面的似然函数:

i = 1 3 P ( n ( w i ) , i ) = ( 1 1 1 + e x w T θ 1 ) ( 1 1 1 + e x w T θ 2 ) 1 1 + e x w T θ 3

    对于所有的训练样本,我们期望最大化所有样本的似然函数乘积。

    为了便于我们后面一般化的描述,我们定义输入的词为 w ,其从输入层词向量求和平均后的霍夫曼树根节点词向量为 x w , 从根节点到 w 所在的叶子节点,包含的节点总数为 l w w 在霍夫曼树中从根节点开始,经过的第 i 个节点表示为 p i w ,对应的霍夫曼编码为 d i w { 0 , 1 } ,其中 i = 2 , 3 , . . . l w 。而该节点对应的模型参数表示为 θ i w , 其中 i = 1 , 2 , . . . l w 1 ,没有 i = l w 是因为模型参数仅仅针对于霍夫曼树的内部节点。

    定义 w 经过的霍夫曼树某一个节点j的逻辑回归概率为 P ( d j w | x w , θ j 1 w ) ,其表达式为:

P ( d j w | x w , θ j 1 w ) = { σ ( x w T θ j 1 w ) d j w = 0 1 σ ( x w T θ j 1 w ) d j w = 1

    那么对于某一个目标输出词 w ,其最大似然为:

j = 2 l w P ( d j w | x w , θ j 1 w ) = j = 2 l w [ σ ( x w T θ j 1 w ) ] 1 d j w [ 1 σ ( x w T θ j 1 w ) ] d j w

    在word2vec中,由于使用的是随机梯度上升法,所以并没有把所有样本的似然乘起来得到真正的训练集最大似然,仅仅每次只用一个样本更新梯度,这样做的目的是减少梯度计算量。这样我们可以得到 w 的对数似然函数 L 如下:

L = l o g j = 2 l w P ( d j w | x w , θ j 1 w ) = j = 2 l w ( ( 1 d j w ) l o g [ σ ( x w T θ j 1 w ) ] + d j w l o g [ 1 σ ( x w T θ j 1 w ) ] )

    要得到模型中 w 词向量和内部节点的模型参数 θ , 我们使用梯度上升法即可。首先我们求模型参数 θ j 1 w 的梯度:

(1) L θ j 1 w = ( 1 d j w ) ( σ ( x w T θ j 1 w ) ( 1 σ ( x w T θ j 1 w ) σ ( x w T θ j 1 w ) x w d j w ( σ ( x w T θ j 1 w ) ( 1 σ ( x w T θ j 1 w ) 1 σ ( x w T θ j 1 w ) x w (2) = ( 1 d j w ) ( 1 σ ( x w T θ j 1 w ) ) x w d j w σ ( x w T θ j 1 w ) x w (3) = ( 1 d j w σ ( x w T θ j 1 w ) ) x w

    如果大家看过之前写的逻辑回归原理小结,会发现这里的梯度推导过程基本类似。

    同样的方法,可以求出 x w 的梯度表达式如下:

L x w = ( 1 d j w σ ( x w T θ j 1 w ) ) θ j 1 w

    有了梯度表达式,我们就可以用梯度上升法进行迭代来一步步的求解我们需要的所有的 θ j 1 w x w

3. 基于Hierarchical Softmax的CBOW模型

    由于word2vec有两种模型:CBOW和Skip-Gram,我们先看看基于CBOW模型时, Hierarchical Softmax如何使用。

    首先我们要定义词向量的维度大小 M ,以及CBOW的上下文大小 2 c ,这样我们对于训练样本中的每一个词,其前面的 c 个词和后面的 c 个词作为了CBOW模型的输入,该词本身作为样本的输出,期望softmax概率最大。

    在做CBOW模型前,我们需要先将词汇表建立成一颗霍夫曼树。

    对于从输入层到隐藏层(投影层),这一步比较简单,就是对 w 周围的 2 c 个词向量求和取平均即可,即:

x w = 1 2 c i = 1 2 c x i

    第二步,通过梯度上升法来更新我们的 θ j 1 w x w ,注意这里的 x w 是由 2 c 个词向量相加而成,我们做梯度更新完毕后会用梯度项直接更新原始的各个 x i ( i = 1 , 2 , , , , 2 c ) ,即:

θ j 1 w = θ j 1 w + η ( 1 d j w σ ( x w T θ j 1 w ) ) x w
x w = x w + η ( 1 d j w σ ( x w T θ j 1 w ) ) θ j 1 w ( i = 1 , 2.. , 2 c )

    其中 η 为梯度上升法的步长。

    这里总结下基于Hierarchical Softmax的CBOW模型算法流程,梯度迭代使用了随机梯度上升法:

    输入:基于CBOW的语料训练样本,词向量的维度大小 M ,CBOW的上下文大小 2 c ,步长 η

    输出:霍夫曼树的内部节点模型参数 θ ,所有的词向量 w

    1. 基于语料训练样本建立霍夫曼树。

    2. 随机初始化所有的模型参数 θ ,所有的词向量 w

    3. 进行梯度上升迭代过程,对于训练集中的每一个样本 ( c o n t e x t ( w ) , w ) 做如下处理:

      a)  e=0, 计算 x w = 1 2 c i = 1 2 c x i

      b)  for j = 2 to  l w , 计算:

f = σ ( x w T θ j 1 w )
g = ( 1 d j w f ) η
e = e + g θ j 1 w
θ j 1 w = θ j 1 w + g x w

              c) 对于 c o n t e x t ( w ) 中的每一个词向量 x i (共2c个)进行更新:

x i = x i + e

      d) 如果梯度收敛,则结束梯度迭代,否则回到步骤3继续迭代。

4. 基于Hierarchical Softmax的Skip-Gram模型

    现在我们先看看基于Skip-Gram模型时, Hierarchical Softmax如何使用。此时输入的只有一个词 w ,输出的为 2 c 个词向量 c o n t e x t ( w )

    我们对于训练样本中的每一个词,该词本身作为样本的输入, 其前面的 c 个词和后面的 c 个词作为了Skip-Gram模型的输出,,期望这些词的softmax概率比其他的词大。

    Skip-Gram模型和CBOW模型其实是反过来的,在上一篇已经讲过。

    在做CBOW模型前,我们需要先将词汇表建立成一颗霍夫曼树。

    对于从输入层到隐藏层(投影层),这一步比CBOW简单,由于只有一个词,所以,即 x w 就是词 w 对应的词向量。

    第二步,通过梯度上升法来更新我们的 θ j 1 w x w ,注意这里的 x w 周围有 2 c 个词向量,此时如果我们期望 P ( x i | x w ) , i = 1 , 2...2 c 最大。此时我们注意到由于上下文是相互的,在期望 P ( x i | x w ) , i = 1 , 2...2 c 最大化的同时,反过来我们也期望 P ( x w | x i ) , i = 1 , 2...2 c 最大。那么是使用 P ( x i | x w ) 好还是 P ( x w | x i ) 好呢,word2vec使用了后者,这样做的好处就是在一次迭代时,我们不是更新 x w 一个词,而是 x i , i = 1 , 2...2 c 2 c 个词。这样整体的迭代会更加的均衡。因为这个原因,Skip-Gram模型并没有和CBOW模型一样对输入进行迭代更新,而是对 2 c 个输出进行迭代更新。

    这里总结下基于Hierarchical Softmax的Skip-Gram模型算法流程,梯度迭代使用了随机梯度上升法:

    输入:基于Skip-Gram的语料训练样本,词向量的维度大小 M ,Skip-Gram的上下文大小 2 c ,步长 η

    输出:霍夫曼树的内部节点模型参数 θ ,所有的词向量 w

    1. 基于语料训练样本建立霍夫曼树。

    2. 随机初始化所有的模型参数 θ ,所有的词向量 w ,

    3. 进行梯度上升迭代过程,对于训练集中的每一个样本 ( w , c o n t e x t ( w ) ) 做如下处理:

      a)  for i =1 to 2c:

        i) e=0

                              ii)for j = 2 to  l w , 计算:

f = σ ( x i T θ j 1 i )
g = ( 1 d j i f ) η
e = e + g θ j 1 i
θ j 1 i = θ j 1 i + g x i

        iii) 

x i = x i + e

      b)如果梯度收敛,则结束梯度迭代,算法结束,否则回到步骤a继续迭代。

5. Hierarchical Softmax的模型源码和算法的对应    

    这里给出上面算法和word2vec源码中的变量对应关系。

    在源代码中,基于Hierarchical Softmax的CBOW模型算法在435-463行,基于Hierarchical Softmax的Skip-Gram的模型算法在495-519行。大家可以对着源代码再深入研究下算法。

    在源代码中,neule对应我们上面的 e , syn0对应我们的 x w , syn1对应我们的 θ j 1 i , layer1_size对应词向量的维度,window对应我们的 c

    另外,vocab[word].code[d]指的是,当前单词word的,第d个编码,编码不含Root结点。vocab[word].point[d]指的是,当前单词word,第d个编码下,前置的结点。

  

    以上就是基于Hierarchical Softmax的word2vec模型,下一篇我们讨论基于Negative Sampling的word2vec模型。


本文转自刘建平Pinard博客园博客,原文链接:http://www.cnblogs.com/pinard/p/7243513.html,如需转载请自行联系原作者

相关文章
|
域名解析 小程序 Linux
朋友圈超火的盲盒交友小程序,完整搭建教程及源码分享~(多图)
朋友圈超火的盲盒交友小程序,完整搭建教程及源码分享~(多图)
朋友圈超火的盲盒交友小程序,完整搭建教程及源码分享~(多图)
|
存储 文件存储 对象存储
|
数据采集 Web App开发 JavaScript
Puppeteer的高级用法:如何在Node.js中实现复杂的Web Scraping
随着互联网的发展,网页数据抓取已成为数据分析和市场调研的关键手段。Puppeteer是一款由Google开发的无头浏览器工具,可在Node.js环境中模拟用户行为,高效抓取网页数据。本文将介绍如何利用Puppeteer的高级功能,通过设置代理IP、User-Agent和Cookies等技术,实现复杂的Web Scraping任务,并提供示例代码,展示如何使用亿牛云的爬虫代理来提高爬虫的成功率。通过合理配置这些参数,开发者可以有效规避目标网站的反爬机制,提升数据抓取效率。
938 4
Puppeteer的高级用法:如何在Node.js中实现复杂的Web Scraping
|
边缘计算 运维 5G
|
10月前
|
机器学习/深度学习 算法 前端开发
基于Python深度学习的果蔬识别系统实现
果蔬识别系统,主要开发语言为Python,基于TensorFlow搭建ResNet卷积神经网络算法模型,通过对12种常见的果蔬('土豆', '圣女果', '大白菜', '大葱', '梨', '胡萝卜', '芒果', '苹果', '西红柿', '韭菜', '香蕉', '黄瓜')图像数据集进行训练,最后得到一个识别精度较高的模型文件。再基于Django框架搭建Web网页端可视化操作界面,以下为项目实现介绍。
177 4
基于Python深度学习的果蔬识别系统实现
|
SQL 人工智能 Cloud Native
数据库技术全攻略:基础、应用与未来趋势
一、引言 在当今数据驱动的时代,数据库技术成为了企业和个人不可或缺的工具
|
存储 开发工具 git
【IntellJ IDEA】、idea忽略隐藏文件、文件夹的设置操作
【IntellJ IDEA】、idea忽略隐藏文件、文件夹的设置操作
891 0
【IntellJ IDEA】、idea忽略隐藏文件、文件夹的设置操作
|
存储 SQL Apache
Apache Doris 助力网易严选打造精细化运营 DMP 标签系统
Apache Doris 助力网易严选打造精细化运营 DMP 标签系统
636 0
|
机器学习/深度学习 算法
探索机器学习在金融风控中的应用
本文将深入探讨机器学习技术如何革新金融风控领域,包括算法选择、模型构建以及实际应用案例。我们将通过具体数据和实验结果来揭示机器学习在提高风险识别准确性和操作效率方面的潜力。文章旨在为金融科技从业者提供实战指南,同时为研究人员指明未来研究的方向。
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp微信小程序的工厂车间管理系统的详细设计和实现
基于SpringBoot+Vue+uniapp微信小程序的工厂车间管理系统的详细设计和实现
232 0
基于SpringBoot+Vue+uniapp微信小程序的工厂车间管理系统的详细设计和实现