精华内容
下载资源
问答
  • word2vec训练词向量word2vec训练词向量word2vec训练词向量
  • Word2Vec 采用Word2Vec训练词向量,数据集:STS
  • word2vec训练词向量

    2018-03-20 10:02:10
    输入是分词之后的文本输出是词向量./word2vec -train tlbb.seg -output tlbb.seg.vec -cbow 0 -size 200 -window 5 -negative 0 -hs 1 -sample 1e-3 -threads 12 -binary 0

    输入是分词之后的文本

    输出是词向量


    ./word2vec -train tlbb.seg -output tlbb.seg.vec -cbow 0 -size 200 -window 5 -negative 0 -hs 1 -sample 1e-3 -threads 12 -binary 0
    展开全文
  • word2vec训练词向量的转换过程CBOW为例第一步:把每个字用one-hot的形式表示出来第二步:初始化左边的权重。作用是分别得到向量V(代表一个单词),做法是利用输入的单词的onehot向量X和W相乘第三步:将得到的三个...


    看了关于w2v的很多文章,讲的都是他的大致原理,介绍了CBOW和SKIP GRAM两种方式,再介绍霍夫曼树和负采样。。。
    都是在边界上介绍他,却没有告诉我他具体是怎么计算的?怎么就训练出词向量来?最终的结果是怎么取的?都没有介绍,于是今天做一个总结

    CBOW为例

    在这里插入图片描述

    CBOW是通过window size内的上下文来预测当前字的概率,在后面BERT的预训练用的同样也是类似的思路,可以看文章

    那词向量预训练是什么样的过程呢?
    所以定义几个参数:
    num:词表中的文字数。可以是我们常见的1万多字,或者词。
    d:向量维度。w2v是设置成300维,这个太低表达能力低下,太高训练要求高,而且效果会边际收紧。
    另外我们要训练的是两个权重,就是在上图中的Hidden Layer的左右两个 W W W W ′ W^{'} W 。其中
    W W W :是 d × n u m d\times num d×num形状的矩阵;
    W ′ W^{'} W :是 n u m × d num\times d num×d 形状的矩阵。
    案例
    假设我们要训练一段话 I   d r i n k   c o f f e e   e v e r y d a y I\ drink \ coffee\ everyday I drink coffee everyday 中每个词的词向量,我们要做一下几步。
    此时我们可以知道num=4,表示4个字;d可以假设3维。
    同时选coffee作为中心词,window size设为2,用K表示,也就是说,我们要根据单词”I”,”drink”和”everyday”来预测一个单词,并且我们希望这个单词是coffee。

    第一步:把每个字用one-hot的形式表示出来

    在这里插入图片描述

    这里的运算转换过程为:字表示成向量shape=(1,num),然后每个字concat在一起为shape=(2K,num),K表示window size。
    这一步很关键,表示的是图中最左边的任务,把每个字用位置表示出来。
    这里也让我们知晓了为什么要用词向量,因为这里用的num是4,如果词表很多呢?几万字,那我们就要用几万维来表示,那就太大,太稀疏了,所以我们的目的就是用低维比如300维,准确的表述这个词的含义,同时还会有相似词的效果。

    第二步:初始化左边的权重。作用是分别得到向量V(代表一个单词),做法是利用输入的单词的onehot向量X和W相乘

    在这里插入图片描述

    这里的运算转换过程为:
    W × 字 T = ( d , n u m ) × ( , n u m , 2 K − 1 ) = ( d , 2 K − 1 ) W\times 字^T=(d,num)\times (,num,2K-1)=(d,2K-1) W×T=(d,num)×(,num,2K1)=(d,2K1)
    K表示window size, 2K-1 是因为target是不计入的,这里只有content的。
    如上图右边的红色方框中,这个 W 是用来表示每个字的向量的,也是我们最后想要用的词向量。

    第三步:将得到的三个单词的V向量相加作为隐藏层的矩阵(隐藏层也就代表周围词的一个集合(即符合由周围的词来预测中心的词))

    在这里插入图片描述

    这里的运算转换过程为:
    v h i d d e n = m e a n ( d , 2 K − 1 ) = ( d , 1 ) v_{hidden}=mean(d,2K-1)=(d,1) vhidden=mean(d,2K1)=(d,1)
    如上图右边的红色方框中,我们除去了target的词向量,对剩下的 n u m − 1 num-1 num1个向量做平均值求解。

    第四步:将隐藏层向量乘以 W ′ W' W

    在这里插入图片描述

    这里的运算转换过程为:
    W ′ × v h i d d e n = ( n u m , d ) × ( d , 1 ) = ( n u m , 1 ) W^{'}\times v_{hidden}=(num,d)\times (d,1)=(num,1) W×vhidden=(num,d)×(d,1)=(num,1)
    如上图右边的红色方框,这一步从维度d变成词表的num,方便后续得到每个字的可能概率。

    第五步:激活函数处理得到V-dim概率分布 {PS: 因为是onehot嘛,其中的每一维都代表着一个单词},概率最大的index所指示的单词为预测出的中间词(target word)。与true label的onehot做比较,误差越小越好

    在这里插入图片描述

    这里的运算转换过程为:
    s o f t m a x ( n u m , 1 ) = ( n u m , 1 ) softmax(num,1)= (num,1) softmax(num,1)=(num,1)
    这里就只是做一步激活,得到概率值后做反向传播。
    至此我们已经理解了整个过程,矩阵变换的过程如下:
    1、字表示成向量shape=(1,num),然后每个字concat在一起为shape=(num,num)。
    2、在第一个初始化的权重矩阵 W 中取出每个字的初始化词向量: W × 字 T = ( d , n u m ) × ( n u m , n u m ) = ( d × n u m ) W\times 字^T=(d,num)\times (num, num)=(d\times num) W×T=(d,num)×(num,num)=(d×num)
    3、对除target字之外的向量求平均值, v h i d d e n = m e a n ( d , n u m − 1 ) = ( d , 1 ) v_{hidden}=mean(d,num-1)=(d,1) vhidden=mean(d,num1)=(d,1)
    4、用第二个初始化的权重矩阵 W^{’} 做个全连接层,从维度d变成词表的num,方便后续得到每个字的可能概率: W ′ × v h i d d e n = ( n u m , d ) × ( d , 1 ) = ( n u m , 1 ) W^{'}\times v_{hidden}=(num,d)\times (d,1)=(num,1) W×vhidden=(num,d)×(d,1)=(num,1)
    5、用激活函数得到每个字可能的概率, s o f t m a x ( n u m , 1 ) = ( n u m , 1 ) softmax(num,1)= (num,1) softmax(num,1)=(num,1);然后再做反向传播。

    了解更多和AI、金融相关的知识,请关注公众号:卓拾书非卓师叔
    作者:卓师叔,爱书爱金融的NLPer

    展开全文
  • size:词向量的维度,默认值是100。这个维度的取值一般与我们的语料的大小相关,如果是不大的语料,比如小于100M的文本语料,则使用默认值一般就可以了。如果是超大的语料,建议增大维度。 window:即词向.
    1. 安装gensim:pip install gensim
    2. 准备预料:word2vec中需要sens是经过预处理且用空格进行分词的
      在这里插入图片描述
    3. 训练模型
    w2v_model = gensim.models.Word2Vec(sentences, min_count=5, size=128, window=5)
    

    size:词向量的维度,默认值是100。这个维度的取值一般与我们的语料的大小相关,如果是不大的语料,比如小于100M的文本语料,则使用默认值一般就可以了。如果是超大的语料,建议增大维度。
    window:即词向量上下文最大距离,默认为5
    min_count:需要计算词向量的最小词频。这个值可以去掉一些很生僻的低频词,默认是5。如果是小语料,可以调低这个值。
    4.保存模型,训练好的词向量

    w2v_model.save("word2vec_model.bin")     # 保存模型,save_binary=True
    w2v_model.wv.save_word2vec_format("word2vec.txt", binary=False)     # 保存训练好的词向量
    
    展开全文
  • 基于word2vec训练词向量(一)

    千次阅读 2018-04-11 23:27:11
    上次说到了通过DNN模型训练词获得词向量,这次来讲解下如何用word2vec训练词获取词向量。 回顾下之前所说的DNN训练词向量的模型: DNN模型中我们使用CBOW或者Skip-gram模式结合随机梯度下降,这样每次都只是取训...

    欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习、深度学习的知识!

    1.回顾DNN训练词向量

    上次说到了通过DNN模型训练词获得词向量,这次来讲解下如何用word2vec训练词获取词向量。

    回顾下之前所说的DNN训练词向量的模型:

    DNN模型中我们使用CBOW或者Skip-gram模式结合随机梯度下降,这样每次都只是取训练样本中几个词训练,每完成一次训练就反向传播更新一下神经网络中W和W’。

    我们发现其中DNN模型仍存在两个缺点:

    首先,每次我们只是使用了几个单词进行训练,但是在计算梯度的过程却要对整个参数矩阵进行运算,这样计算效率低下。

    更重要的一个缺点是在输出层中用softmax时,需要对输出层中每个位置求其概率,sotfmax函数如下图:

    这里u_0是W’的一个神经元的参数向量,v_c对应的是训练样本与隐藏层参数W相乘激活后得到的向量。可以发现,为了得到输出层的每个位置的概率,我们需要求得所有单词的得分,如果一个词汇表很庞大的话,这是很耗资源的。

    2.Word2vec

    2.1 前瞻

    针对DNN模型训练词向量的缺点,2013年,Google开源了一款用于词向量计算的工具–word2vec,引起了工业界和学术界的关注。Word2vec采用了Hierarchical Softmax或Negative Sampling两种技术来提高训练词向量性能,由于篇幅较长,本次只讲解基于Hierarcical Softmax优化的CBOW模型。

     

    2.2 霍夫曼树

    在介绍word2vec的网络结构之前这里需要简短的回顾下霍夫曼树,输入不同的权值的w节点,将其看作是n棵森林,先选取这些节点中最小两个权值w_i,w_j节点进行合并,得到一棵新的树,原来的w_i,w_j成为这个新树的左右子树。新树的权值是w_i和w_j节点对应的权值之和,将新树作为新加入的一棵树,删除原来的w_i,w_j树,重新选取两棵最小的树合并,以此类推直到所有的树都合并了。举个例子,假如有(a,b,c,d,e,f)共6个点,节点权值分布是(16,4,8,6,20,3)。规定左分支为0,右分支为1。

    其中所有的词都是叶子结点,霍夫曼树的好处就是权值较大的词(即频率较大的词)会在深度更小的叶子处,获得更短的编码。这样频率更高的词会以更小的代价被发现。

    2.3 Hierarcical Softmax网络结构

    Word2vec有两种优化加速模型,一种是基于Hierarcical Softmax优化,另一种是基于Negative Sampling优化,本次只讲解基于Hierarcical Softmax优化。下图是Word2vec基于Hierarcical Softmax优化的模型,训练模式选用CBOW模型:

    该网络结构包含了三层,输入层,投影层(即原来的隐藏层)和输出层,假设存在样本(Context(w),w),Context(w)是由w前后各c个词构成作输入样本train_X,w作输出值train_y。

     

    1. 输入层:
    包含Context(w)中2c个词向量v(Context(w)_1),v(Context(w)_2),......,v(Context(w)_2c)组成,词向量长度相同。
    1. 投影层:
    将输入层2c个词向量累加后求平均作为X_w。
    1. 输出层:
    输出层是对应一棵霍夫曼树,其中叶子节点就是对应词汇表中的词,非叶子节点即(黄色节点)等价于原来DNN模型中隐藏层到输出层的参数W’,用θ_i表示该节点的权重,是一个向量,根节点是投影层的输出X_w。

     

    2.4 基于Hierarcical Softmax优化的Word2vec优点:

    Word2vec相比较于DNN训练词向量,其网络结构有两点很大的不同:

    • 舍去了隐藏层,在CBOW模型从输入层到隐藏层的计算改为直接从输入层将几个词的词向量求和平均作为输出。
    • 舍去了隐藏层到输出层的全连接结构,换成了霍夫曼树来代替隐藏层到输出层的映射。
    第一个改进在于去除了隐藏层,Word2vec训练词向量的网络结构严格上来说不算是神经网络的结构,因为其整个网络结构是线性的,没有激活函数并且取消了隐藏层。这么做对于训练词向量反而是极好的,我们在神经网络中使用激活函数,是因为我们处理的问题很多不是线性相关的,输入的样本之间一般也不是线性相关的。但处理词的问题时,我们知道一个词与其上下文是相关的,也就是说输入的上下文几个词也应该是线性相关的。取消了隐藏层没有了激活函数也就意味着承认了输入的几个上下文词的关系也是呈线性相关的。Google的Tomas Mkolov就发现了如果将DNN模型中的隐藏层移除,训练出来的词向量就会成大量线性相关,于是就有了我们在上一篇开头所说的神奇的地方:

     

     

    第二个改变是为了针对降低原来DNN的softmax的计算量,我们把softmax计算改成了沿着一棵霍夫曼树找叶子节点的计算,这里霍夫曼树德非叶子节点相当与DNN中隐藏层到输出层的权重,在霍夫曼树中不需要计算所有的非叶子结点,只需要计算找寻某个叶子结点时经过的路径上存在的节点,极大的减少了计算量。

     

    2.5 Hierarcical Softmax优化原理

    上图是一个根据词频构建好的霍夫曼树,各叶子节点代表词汇表中的所有词,在计算之前引入一些符号:

    假设w使我们要求的目标词,Context(w)是该目标词的上下文词组,一共有c个,x_w是投影层的输出。

    在word2vec中使用了二元逻辑回归的方法,这时候从根节点到叶子节点的过程是一个二分类问题,规定当前节点走到下一个节点,沿着左右子树走的概率分别为:

    …(1)

    使用了sigmoid函数来计算选取当前节点的概率,因为只存在0,1两种取值,我们可以用指数形式写在一起:

    …(2)

     

    因为计算每一个非叶子是相互独立的,所以在从根节点到找到叶子节点对应的词w的概率可以写成,就是我们的目标函数,我们希望最大化这个目标函数:

    …(3)

    这里我们的目标函数可以去对数似然:

     

    ...(4)

     

    将(2)带入(4),得:

    …(5)

    为了方便理解,将(5)改成c项之和:

    …(6)

    我们的目标是最大化对数似然函数(5),等效成最大化每一项(6)即可。这时对(6)每个变量(X_w,θ_j-1)求偏导,对每一个样本,带入偏导数表达式得到在该函数上增长的梯度,然后让对应的参数加上这个梯度,函数就在偏导数对应的维度上增长了,这就是梯度上升法。

    于是可以得到参数更新的伪代码,在训练开始前要把词汇表放入,统计每个词频构建好霍夫曼树,然后开始进行训练:

    如果梯度收敛,则结束梯度迭代,算法结束。

    3.总结

    基于Hierarcical Softmax优化的Word2vec,相对于DNN,使用霍夫曼树网络结构不需要计算所有非叶子节点,每次只会反向对路径上的参数求偏导更新路径上的节点参数,提高了词向量训练效率。但是仍存在一些问题,比如霍夫曼树的结构是基于贪心的思想,这样训练频率很大的词很有效,但是对词频很低的词很不友好,路径很深。在基于Negative Sampling 的word2vec可以很高效率对词频很低的词训练,下次会继续讲解最后一篇基于Negative Sampling 的word2vec,学习路漫漫,和大家一起分享学得的东西,自己对于word2vec的一些拙见,如有不足或理解错误的地方,望各位指点!

    本篇文章出自http://www.tensorflownews.com,对深度学习感兴趣,热爱Tensorflow的小伙伴,欢迎关注我们的网站!

    展开全文
  • IF-IDF统计—jieba分词—Word2Vec模型训练使用 训练中文语料库 中文语料 用gensim实现word2vec 和 glove python训练work2vec词向量(python gensim
  • 一、训练词向量 # 导入必要的包 import jieba import numpy as np import pandas as pd from gensim.models.word2vec import Word2Vec import joblib from sklearn.svm import SVC # 读取两个类别的语料 pos = pd....
  • Word2vec模型中,算法可以...dav/word2vec是一个经典的利用多线程训练词向量的代码,非常地好用且非常地高效。然而该代码是用Linux C语言写的,而且代码的调度使用的是shell。在Windows上安装Cygwin即可运行该代码
  • 前言:  通过gensim包里面的word2vec将分词完成的数据训练成词向量 ...# 使用gensim word2vec训练脚本获取词向量 import warnings warnings.filterwarnings(action='ignore', category=UserWarning,...
  • 利用Word2Vec训练词向量过程

    千次阅读 2017-02-11 02:05:40
    先明确一点,选用不同的词向量作为模型的初始值,效果的差异非常大!那么怎么产生一个好的...2、但是中文就不行了,没有一个公布一个权威的词向量。所以,当我们自己做试验时,就需要动手训练这个语义空间的词向量
  • 【NLP】基于python的gensim word2vec训练词向量

    万次阅读 多人点赞 2016-10-12 17:18:37
    model.save('/model/word2vec_model') new_model=gensim.models.Word2Vec.load('/model/word2vec_model') 也可以获取每个词的词向量 model['computer'] 总结 训练词向量时传入的两个参数也对训练效果有很大影响,...
  • 基于word2vec训练词向量(二)

    千次阅读 2018-04-19 22:51:05
    基于Hierarchical Softmax的word2vec模型的缺点 二.Negative SampliNg模型 三.Negative Sampling优化原理 四.Negative Sampling选取负例词原理 五.代码实现 六.总结 一.基于Hierarchical Softmax...
  • 利用Gensim 的Word2Vec训练词向量

    千次阅读 2018-05-11 14:58:24
    最近一直在折腾词向量训练,之前是用HanLP来训练,不过这个框架的文件训练输入只能是单个文件,而我的需要求要输入一个文件路径,会进行递归的查询文件去加载,遗憾的是看了HanLp的源码之后发现并不行,他就没有...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 17,249
精华内容 6,899
关键字:

word2vec训练词向量