自己动手做聊器人 二十五-google的文本挖掘深度学习工具word2vec的实
[0,1,0,0,0,0……]表示成年女子
想想机器学习真是伟大,整个模型从上到下全是未知数,竟然能算出来我真是服了
下载下来后直接执行make编译(如果是mac系统要把代码里所有的#includemalloc.h替换成#includesys/malloc.h)
word2vec中做训练主要使用的是神经概率语言模型,这需要掌握一些基础知识,否则下面的内容比较难理解,关于神经网络训练词向量的基础知识我在《自己动手做聊器人二十四-将深度学习应用到NLP》中有,可以参考,这里不再赘述。
[0,0,0,0,0,1……]表示女婴
localistrepresentation中文释义是稀疏表达,典型的案例就是onehotvector,也就是这样的一种向量表示:
我们先用word2vec来训练
于是θ的更新公式:
我们以对数似然函数为优化目标,盗取一个网上的推导公式:
因为x是多个v的累加,word2vec中v的更新方法是:
[1,0,0,0,0,0……]表示成年男子
翻译成中文叫做词嵌入,这里的embedding来源于范畴论,在范畴论中称为morphism(态射),态射表示两个数学结构中保持结构的一种过程抽象,比如“函数”、“映射”,他们都是表示一个域和另一个域之间的某种关系。
投影层:依然是v(w),就是一个形式
会生成一个vectors.bin文件,这个就是训练好的词向量的二进制文件,利用这个文件我们可以求近义词了,执行:
输出层:一个霍夫曼树,其中叶子节点是语料中出现过的词,权重是出现的次数
输出层:和CBOW一样的霍夫曼树
词向量是将深度学习应用到NLP的根基,word2vec是如今使用最广泛最简单有效的词向量训练工具,那么它的实现原理是怎样的呢?本文将从原理出发来介绍word2vec
后面的推导公式和CBOW大同小异,其中θ和v(w)的更新公式除了把符号名从x改成了v(w)之外完全一样,如下:
性别老年成年婴儿
Skip-gram模型的神经网络结构设计如下:
而distributedrepresentation中文释义是分布式表达,的表达方式可以改成:
首先我们从网上下载一个源码,因为google的svn库已经不在了,所以只能从csdn下了,但是因为还要花积分才能下载,所以我干脆分享到了我的git上(,大家可以直接下载
[0,0,0,0,1,0……]表示男婴
问你这样一个问题:如果你大脑有很多记忆单元,让你记住一款白色奥迪Q7运动型轿车,你会用几个记忆单元?你也许会用一个记忆单元,因为这样最节省你的大脑。那么我们再让你记住一款小型灰色雷克萨斯,你会怎么办?显然你会用另外一个记忆单元来记住它。那么如果让你记住所有的车,你要耗费的记忆单元就不再是那么少了,这种表示方法叫做localistrepresentation。这时你可能会换另外一种思:我们用几个记忆单元来分别识别大小、颜色、品牌等基础信息,这样通过这几个记忆单元的输出,我们就可以表示出所有的车型了。这种表示方法叫做distributedrepresentation,词向量就是一种用distributedrepresentation表示的向量
./word2vec-traintrain.txt-outputvectors.bin-cbow0-size200-window5-negative0-hs1-sample1e-3-thread12-binary1
Skip-gram全称是ContinuousSkip-gramModel,是在已知当前词的情况下预测上下文
CBOW全称是ContinuousBag-of-WordsModel,是在已知当前词的上下文的前提下预测当前词
p(dx,θ)=σ(xTθ)
[1,0,0,1]表示男婴
那么就有:
在word2vec中使用的最重要的两个模型是CBOW和Skip-gram模型,下面我们分别来介绍这两种模型
[0,1,0,0]表示老奶奶
p(足球Context(足球))=∏p(dx,θ)
在这个霍夫曼树中,我们以词足球为例,走过的径图上容易看到,其中非根节点上的θ表示待训练的参数向量,也就是要达到这种效果:当在投射层产出了一个新的向量x,那么我通过逻辑回归公式:
首先我们要有训练语料,其实就是已经切好词(空格分隔)的文本,比如我们已经有了这个文本文件叫做train.txt,内容是人工智能一直以来是人类的梦想造一台可以为你做一切事情并且有情感的机器人并且重复100遍
同理得出x的梯度公式:
输入层:词w的上下文一共2c个词的词向量
每一类型用向量中的一维来表示
[0,0,1,0]表示成年女子
和
[0,0,0,1]表示女婴
就可以得出在每一层被分到左节点(1)还是右节点(0)的概率分别是
如果我们想表达男童和女童,只需要增加一个特征维度即可
理解了distributedrepresentation和wordembedding的概念,我们就初步了解了word2vec的本质,它其实是通过distributedrepresentation的表达方式来表示词,而且通过降维的wordembedding来减少计算量的一种方法
[1,1,0,0]表示老爷爷
现在模型已经有了,下面就是通过语料来训练v(Context(w))、x和θ的过程了
输入层:w的词向量v(w)
的CBOW输出层为什么要建成一个霍夫曼树呢?因为我们是要基于训练语料得到每一个可能的w的概率。那么具体怎么得到呢?我们先来看一下这个霍夫曼树的例子:
CBOW模型的神经网络结构设计如下:
[1,0,1,0]表示成年男子
投影层:将输入层的2c个向量做求和累加
我们发现这一设计相比《自己动手做聊器人二十四-将深度学习应用到NLP》中讲到的神经网络模型把首尾相接改成了求和累加,这样减少了维度;去掉了隐藏层,这样减少了计算量;输出层由softmax归一化运算改成了霍夫曼树;这一系列修改对训练的性能有很大提升,而效果不减,这是独到之处。
编译后生成word2vec、word2phrase、word-analogy、distance、compute-accuracy几个二进制文件
范畴论中的嵌入(态射)是要保持结构的,而wordembedding表示的是一种“降维”的嵌入,通过降维避免维度灾难,降低计算复杂度,从而更易于在深度学习中应用。
……
请尊重原创,转载请注明来源网站以及原始链接地址
假设两个求和符号里面的部分记作L(w,j),那么有
./distancevectors.binEnterwordorsentence(EXITtobreak):人类Word:人类Positioninvocabulary:6WordCosinedistance------------------------------------------------------------------------可以0.094685为0.091899人工0.088387机器0.076216智能0.073093情感0.071088做0.059367一直0.056979以来0.049426一切0.042201/s0.025968事情0.014169的0.003633是-0.012021有-0.014790一台-0.021398造-0.031242人-0.043759你-0.072834梦想-0.086062并且-0.122795……
[0,0,0,1,0,0……]表示老奶奶
请尊重原创,转载请注明来源网站以及原始链接地址
p(dx,θ)=1-σ(xTθ)
σ(xTθ)=1/(1+e^(-xTθ))
[0,0,1,0,0,0……]表示老爷爷
执行