word2vec是google几年前开源出来的一个小的机器学习项目,代码极为精简,其作用就是把一个词转换为200维(可以设置)的向量,比如:father->[0.11234234,0.00032112,....]。 转换成向量之后有什么用?作用太大了,算词之间的关联关系,对词进行聚类都变得非常简单。看下图:
下面我们就通过一个例子一步步的来看它是怎么做的?
word2vec中有2个模型,在训练的时候需要选择一个:CBow(bag of words),skip-gram。
先看看CBow,把一个词前后的几个词看成一个整体来预测该词出现的概率,通过windows size来设置往前后看几个词:
假设我们现在有一句话, windows size为2,我们会得到如下训练data set:
{i coffee everyday->drink}
,每个单词用one-hot-vector 表示:
i->[1,0,0,0]
like->[0,1,0,0]
drink->[0,0,1,0]
coffee->[0,0,0,1]
以第3个训练数据为例
输入x1=i ,x2=drink, x3=everyday ,输出:coffee
初始化因子W,计算W*x,作为Hidden layer的输入
计算Hiden Layer的输出,同样初始化一个因子W'
计算输出层,SoftMax:
计算Cost值,回想一下前面“softmax”的文章中提到的方法:
Cost值:L=-(0*ln(0.23)+0*ln(0.03)+1*ln(0.62)+0*ln(0.12))=-0.478
反向传播更新W'和W,回想一下前面“BP”的文章中提到的方法,为了加深理解,我把整个过程推算一遍:
8. 继续下一轮迭代训练。。
skig-gram模型跟cbow是反着来的,用一个词来预测前后X个词,还是用上面的,如果用skip-gram模型,windows_size还是2,则得到如下training data set:
有兴趣的可以自己模拟算一遍。
自然语言处理是很有意思的领域,很多方法都很巧妙,后面再写一下HMM模型,跟这个对比着看看
领取专属 10元无门槛券
私享最新 技术干货