您的位置:首页 > 其它

Word2vec和embedding 非底层算法原理讲解

2019-04-12 23:11 78 查看

网上关于二者的信息真的是多如牛毛,参差不齐。
本文不对算法细节进行讲解推导,不从零开始讲二者含义,主要记录些学习中出现的问题。
建议先看完基础知识再浏览,欢迎大家留言指出错误或留下你的疑问。 先贴几个不错的链接

word2vec源码
不错的Word2vec原理讲解

1.为什么embedding层引入了词向量就减少了计算量呢?

首先,我们要清楚什么是embedding层,**embedding层就是以one hot为输入、中间层节点为字向量维数的全连接层!而这个全连接层的参数,就是一个“字向量表”!**我们下面给出一个计算实例:

降低了运算量不是因为词向量的出现,而是因为把one hot型的矩阵运算简化为了查表操作。

2.word2vec的输入是什么?为什么有的资料是输入随机初始化的字向量(维度小于词汇表)有的是直接输入one-hot编码呢?

首先,这两种说法都是正确的,之所以会出现这样的差别是因为对层的合并,相信大部分人都有看过word2vec的3层model,一般如下:

我们先看第一种说法如何对应模型,输入的是n个随机初始化的k维字向量,那么输入规模就是(nk),经过一个全连接层隐藏层,假设有N个神经元(N就是我们拟要降到的维度,可以等于k),那么隐藏层的输出规模就是(nkkN=nN),接下来再接入softmax输出层,输出规模为(nV,词汇表大小为V),通过计算预测概率最大的词和实际词之间的距离来优化参数(参数包括,神经网络权值参数+输入词向量数单个词向量大小)。那么我们的词向量表是那部分呢,很显然是由两部分构成的,一部分是作为输入的k维词向量(模型训练会调整其值),另一部分就是隐藏层的参数。二者之积就是最终的词向量表(其实就是隐藏层的输出)。

接下来看第二种说法,直接输入one-hot向量,输入规模是(nV),经过隐藏层(VN),输出规模为(nN),接下来再接入softmax输出层,输出规模为(nV,词汇表大小为V),通过计算预测概率最大的词和实际词之间的距离来优化参数(参数包括,神经网络权值参数+输入词向量数*单个词向量大小)。可以看到和上面的输出是一致的,那么我们的词向量表是那部分呢,还是隐藏层的输出,此时就只有一部分组成,就是只有隐藏层这个全连接层的参数(不明白为什么是这个层的参数可以看下上面关于embedding层的说明)。

接下来我们将二者合并给出定义:Word2Vec之类的模型,是“自监督”的,它事实上训练了一个语言模型,通过语言模型来获取词向量。所谓语言模型,就是通过前n个字预测下一个字的概率,就是一个多分类器而已,我们输入one hot,然后连接一个全连接层,然后再连接若干个层,最后接一个softmax分类器,就可以得到语言模型了,然后将大批量文本输入训练就行了,最后得到第一个全连接层的参数,就是字、词向量表,当然,Word2Vec还做了大量的简化,但是那都是在语言模型本身做的简化,它的第一层还是全连接层,全连接层的参数就是字、词向量表。

最后举一个例子:y=6,x=1,求二者的关系,6= (1x2)x3 6= 1x(2x3 ) 能看懂相信你就已经明白这个问题了。

3.训练字向量一定要用语言模型吗?

我们知道字向量就是一层全连接参数。这样看,问题就比较简单了,我也没必要一定要用语言模型来训练向量吧?对呀,你可以用其他任务,比如文本情感分类任务来有监督训练。因为都已经说了,就是一个全连接层而已,后面接什么,当然自己决定。

4.为什么一般先用大规模语料无监督训练字、词向量,可以降低过拟合风险?

降低过拟合风险的原因是可以使用无标签语料预训练词向量出来(无标签语料可以很大,语料足够大就不会有过拟合风险),跟词向量无关,词向量就是一层待训练参数,有什么本事降低过拟合风险?

5.tf中的embedding是如何随得到的呢?

Embedding层就是以one hot为输入、中间层节点为字向量维数的全连接层!而这个全连接层的参数,就是一个“字向量表”!那tf中的embedding是如何随model进行训练的呢?

我也不知道怎么得来呀。神经网络的参数不是取决你的任务吗?你的任务应该问你自己呀,怎么问我来了?
细细品读这句话,明白了你就知道了tf中的embedding如何得到的,当然首先要知道什么是embedding层。

6.Word2vec的cbow和skip-gram中的loss函数是什么

我们看下两个模型输出都是什么,

首先都是一个softmax输出层,那么输出的就是k个概率值(k为词汇表大小),对cbow而言,输入上下文来预测中间词,loss就是中间词k维向量和预测k维向量之间的距离。
eg:预测输出(0,0,0.8,0.1,0.1), 中间词向量为(0,0,1,0,0)那么可以计算这两个向量之间的距离,当小于预设阈值时就可以认为预测等于实际值。

对skip-gram而言,输入是一个中间词,输出是预测其对应的上下文。
eg:预测输出(0,0.5,0.5)。中间词的上下文词向量是(0.1,0.5,0.4),最小化二者的距离来反向优化参数。

具体可以看顶部源码链接。

7.最后一提

embedding层就是一个全连接层的参数,可以通过很多途径得到,一类是语言模型,用语言模型无监督训练,开通窗口获得字词向量以及之间的性质(仅仅是基于统计的性质);另一类通过自定义的神经网络模型,获得字词向量以及之间的性质(性质和你的模型目的挂钩,若你的任务认为"大的" "高的"是两相对的,那么二者对应的字向量就差异较大,哪怕它们一般是近似的)。

感觉还没说完,但好像也没有什么好说的了,希望这点文字有助于大家理解字、词向量这些概念,弄清楚Word2vec和Embedding的本质。有疑问或者有新的见解,欢迎留言提出。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: