聊聊word2vec及TensorFlow示例

在自然语言处理领域中,将单词或词语映射到向量空间中可以很容易就得到单词之间的相似度,因为向量空间中两个向量的相似度很容易求得,比如余弦相似度。这可以用于自动语音识别以及机器翻译等。


提到word2vec,不得不提skip-gram模型,其结构如下

0?wx_fmt=png

它可以预测比较临近的单词。给定单词序列w1,w2,...,wT, skip-gram的目标在于最大化下面的函数

0?wx_fmt=png

其中c用来衡量上下文的长度,c越大,训练样本越多,精度越高,耗时越多。上面的概率函数基于softmax函数,具体如下:

0?wx_fmt=png

其计算复杂度跟W成正比,W是词汇量,词汇量的量级一般在十万到千万级别。


Hierachical softmax利用二叉树来表示输出层,其中W个单词作为叶节点,每个节点表示它的子节点的相对概率,事实上,这就定义了一种随机游走,并且对单词赋予了概率。

用 n(w, j) 表示从根节点到单词w是第j个节点,并且用L(w)来表示这个路径的长度,则 n(w, 1) 就是根节点,n(w, L(w)) = w。对于每个内部节点n,用ch(n)表示节点n的任意一个子节点。则:

0?wx_fmt=png

其中

0?wx_fmt=png

0?wx_fmt=png


负采样可以定义如下

0?wx_fmt=png

可以用它来代替skip-gram模型中的目标函数

0?wx_fmt=png

目的在于将目标单词利用逻辑回归从噪声分布Pn(w)中采样出来,其中k是样本点的负样本。对于小的训练样本集,k的取值范围一般在5到20,对于大样本集,可以取小一点,比如2到5。


次采样是为了缩减少见词与频繁词的不平衡性,次采样定义形式如下,训练集中的每个单词以一定概率舍弃:

0?wx_fmt=png

其中 f(wi) 是单词 wi 出现的频率,t 是事先选定的阈值,通常取值约为0.00001。 .这使得出现频率大的单词采样率变小,同时保持词语频率的原有排序。次采样可以加速训练速度,甚至可以提高少见词的精度。


word2vec可以看作Skip-gram模型的一种扩展。word2vec在训练过程中对经常出现的词进行了下采样,这可以大大提升训练的速度,差不多在2-10倍,而skip-gram单机版模型一天就可以训练多达千亿单词量级的模型;并且,word2vec对出现频次比较少的单词或词语的表示也比较精准。


下面介绍基于tensorflow的word2vec实践

首先安装Anaconda

然后创建conda 环境


conda create -n tensorflow python=3.5


结果如下:

0?wx_fmt=png


0?wx_fmt=png


然后激活刚刚创建的环境

activate tensorflow

安装tensorflow


pip install --ignore-installed --upgrade tensorflow

结果如下:

0?wx_fmt=png


0?wx_fmt=png


最后执行 python word2vec_basic.py

其中word2vec_basic文件来源为

https://github.com/tensorflow/tensorflow/blob/r1.4/tensorflow/examples/tutorials/word2vec/word2vec_basic.py


第一步下载数据

数据来源  http://mattmahoney.net/dc/

文件名 text8.zip

第二步 构建字典,并且将稀缺词替换为'UNK'

字典大小 50000

第三步 为skip-gram模型生成训练批

第四步 构建并且训练skip-gram模型

参数如下

batch_size = 128      # 批的大小 

embedding_size = 128  # 嵌入向量的维度    

skip_window = 1       # 考虑前后单词的个数    

num_skips = 2         # 几次利用同一个输入生成相应的标签. 

num_sampled = 64      # 负样本采样个数

第五步 训练模型

迭代步数: 100001    

第六步 可视化  

0?wx_fmt=png

0?wx_fmt=png


0?wx_fmt=png





0?wx_fmt=png


0?wx_fmt=png

0?wx_fmt=png




0?wx_fmt=png



0?wx_fmt=png


0?wx_fmt=png




0?wx_fmt=png



0?wx_fmt=png


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值