已经介绍了Word2Vec中的Skip-Gram模型的基本原理,以及训练过程的3个策略,详细请参考:
接下来开始动手用 TensorFlow 实现自己的 Word2Vec 模型,本篇文章将利用 TensorFlow 来完成 Skip-Gram 模型。还不是很了解Skip-Gram思想的小伙伴可以参考以上推送文章。
本篇 TensorFlow 实战参考 天雨粟 的实现思路,实战代码的主要目的是加深对Skip-Gram 模型中一些思想和训练技巧的理解,选用了满足自己训练目的的语料规模,对语料质量和算法细节做基本的约束要求,尽可能的降低训练成本。同时,运用 TensorFlow 框架建立网络结构,求解嵌入的词向量。
实战工具
Skip-Gram 模型的训练所使用的语言,库,及工具如下所示:
语言:Python 3
包:TensorFlow包,Numpy包
编辑器:Pycharm
线上GPU:floyd (https://www.floydhub.com/),这是一个非常不错的在线训练深度学习神经网络的平台
数据集:维基百科英文文章预料,参考 天雨粟 给出的预料,预料字节数为90+M.
数据预处理
首先,导入用到的包,如下:
加载训练网络所用的语料,如下:
数据预处理部分主要做的工作包括:
替换文本中特殊符号,比如:逗号,分号,感叹号等
对文本分词
去除低频词,减少噪音
构建语料
单词映射表
替换文本中的特殊字符:
根据空格分词
剔除低频词
去重后的词汇表
在词汇表中建立映射关系
去除低频率的单词,同时去除高频出现的停用词,例如“the”, “of”以及“for”这类单词进行剔除。剔除这些单词以后能够加快我们的训练过程,同时减少训练过程中的噪音。采用以下公式:
其中t是一个阈值参数,一般为 1e-3 至 1e-5
fwi)是单词 wi 在整个数据集中的出现频次
P(wi)是单词被删除的概率
输入样本
Skip-Gram模型的输入是基于中心词的上下文窗依次配对,通过一定批次大小构建输入样本。
对于一个给定词,离它越近的词可能与它越相关,离它越远的词越不相关,这里我们设置窗口大小为 5,对于每个训练单词,我们还会在 [1:5] 之间随机生成一个整数 R,用 R 作为我们最终选择 output word 的窗口大小。这里之所以多加了一步随机数的窗口重新选择步骤,是为了能够让模型更聚焦于当前 input word 的邻近词。
三层网络
该部分主要包括:
详细实现代码如下:
验证
抽取几个词,找出各自最相近的 topk 个单词。首先把测试样本加入到图中,
接下来,运行以上默认图:
每 1000 个时步打印一次,从最后的训练结果来看,模型还是学到了一些常见词的语义,比如 one 等计数词以及 gold 之类的金属词,animals 中的相似词也相对准确,列表如下:
为了能够更全面地观察我们训练结果,我们采用 sklearn 中的 TSNE 来对高维词向量进行可视化。
以上便是在 TensorFlow 中完整源码实现Word2vec之Skip-Gram模型的详细过程代码。
领取专属 10元无门槛券
私享最新 技术干货