TensoFlow 实战 3层网络求解嵌入词向量,附代码详解

已经介绍了Word2Vec中的Skip-Gram模型的基本原理,以及训练过程的3个策略,详细请参考:

斯坦福大学NLP-cs224课程笔记2:词向量模型

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.

数据预处理

首先,导入用到的包,如下:

import random
import time

加载训练网络所用的语料,如下:

with  open('data/text8') as f:

数据预处理部分主要做的工作包括:

  1. 替换文本中特殊符号,比如:逗号,分号,感叹号等
  2. 对文本分词
  3. 去除低频词,减少噪音
  4. 构建语料
  5. 单词映射表

替换文本中的特殊字符:

text = text.replace('.', ' <PER> ').replace(',', ' <COM> ').replace('"', ' <QUO> ').\

根据空格分词

words = self.text.split()

剔除低频词

word_counts = Counter(words)

去重后的词汇表

vocab = set(words)

在词汇表中建立映射关系

vocab_to_int = {w: c for c, w in enumerate(vocab)}

去除低频率的单词,同时去除高频出现的停用词,例如“the”, “of”以及“for”这类单词进行剔除。剔除这些单词以后能够加快我们的训练过程,同时减少训练过程中的噪音。采用以下公式:

其中 t 是一个阈值参数,一般为 1e-3 至 1e-5 fwi) 是单词 wi 在整个数据集中的出现频次

P(wi) 是单词被删除的概率

# 在词汇表中找到单词的索引list

输入样本

Skip-Gram模型的输入是基于中心词的上下文窗依次配对,通过一定批次大小构建输入样本。

对于一个给定词,离它越近的词可能与它越相关,离它越远的词越不相关,这里我们设置窗口大小为 5,对于每个训练单词,我们还会在 [1:5] 之间随机生成一个整数 R,用 R 作为我们最终选择 output word 的窗口大小。这里之所以多加了一步随机数的窗口重新选择步骤,是为了能够让模型更聚焦于当前 input word 的邻近词。

def generate_batches(self,train_words_index):

三层网络

该部分主要包括:

  • 输入层
  • Embedding,
  • 嵌入矩阵的矩阵形状为 vocab_size×hidden_units_size ,TensorFlow 中的 tf.nn.embedding_lookup 函数可以实现 lookup 的计算方式
  • Negative Sampling,负采样主要是为了解决梯度下降计算速度慢的问题,详细的实现细节请参考 Word2vec之Skip-Gram训练网络的3种技术,TensorFlow中的 tf.nn.sampled_softmax_loss 会在 softmax 层上进行采样计算损失,实现类似于 negative sampling 的功能。

详细实现代码如下:

def build_tf_nn(self,train_words_index, int_to_vocab):

验证

抽取几个词,找出各自最相近的 topk 个单词。首先把测试样本加入到图中,

with train_graph.as_default():

接下来,运行以上默认图:

每 1000 个时步打印一次,从最后的训练结果来看,模型还是学到了一些常见词的语义,比如 one 等计数词以及 gold 之类的金属词,animals 中的相似词也相对准确,列表如下:

为了能够更全面地观察我们训练结果,我们采用 sklearn 中的 TSNE 来对高维词向量进行可视化。

以上便是在 TensorFlow 中完整源码实现Word2vec之Skip-Gram模型的详细过程代码。

相关链接

TensorFlow笔记|为什么会有它?

TensorFlow笔记|Get Started

Tensorflow笔记|tensorflow做线性回

Tensorflow|Tensor, 与Numpy比较,Constant

Tensorflow|通过Variable及assign()感悟一点设计之道

Tensorflow|Session和InteractiveSession

点击以下标题查看相关内容:

  • 深度学习和自然语言处理:介绍
  • 斯坦福大学NLP-cs224课程笔记2:词向量
  • 一文了解Word2vec之Skip-Gram训练网络的3种技术

原文发布于微信公众号 - Python与机器学习算法频道(alg-channel)

原文发表时间:2018-04-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏AI研习社

如何有效处理特征范围差异大且类型不一的数据?

原题目如下: 1. 特征类型混杂: 连续变量,离散变量,描述变量共存 2. 不同变量之间取值差异大: 例如有些变量取值在 0~1 但有些取值为 10000-5...

4597
来自专栏机器之心

学界 | 神经优化器搜索:利用强化学习自动搜索最优化方法

4566
来自专栏杨熹的专栏

凸优化有什么用

本文结构: 凸优化有什么用? 什么是凸优化? ---- 凸优化有什么用? 鉴于本文中公式比较多,先把凸优化的意义写出来吧,就会对它更有兴趣。 我们知道在机器学习...

4288
来自专栏人工智能LeadAI

xgboost的原理没你想像的那么难

xgboost 已然火爆机器学习圈,相信不少朋友都使用过。要想彻底掌握xgboost,就必须搞懂其内部的模型原理。这样才能将各个参数对应到模型内部,进而理解参数...

4274
来自专栏YoungGy

信息论中的各种熵

本文简单介绍了信息论中的各种熵,包括自信息、熵;联合熵、条件熵、互信息;KL散度、交叉熵。并在最后用信息论中的交叉熵推导了逻辑回归,得到了和最大似然法相同的结果...

2405
来自专栏人工智能LeadAI

基于朴素贝叶斯的自然语言分类器

概述 自然语言分类是指按照预先定义的主题类别,为文档集合中的每个文档确定一个类别。本文将介绍一个限定类别的自然语言分类器的原理和实现。采用Python作为编程语...

3905
来自专栏ATYUN订阅号

RNN示例项目:详解使用RNN撰写专利摘要

我第一次尝试研究RNN时,我试图先学习LSTM和GRU之类的理论。在看了几天线性代数方程之后(头疼的要死),我在Python深度学习中发生了以下这段话:

1701
来自专栏人工智能头条

如何用70行代码实现深度学习(Java,极易移植)

2592
来自专栏AI科技评论

想了解递归神经网络?这里有一份入门教程

本文来自deeplearning4j,AI科技评论编辑。 递归神经网络是一类人工神经网络,用于识别诸如文本、基因组、手写字迹、语音等序列数据的模式,或用于识别传...

3183
来自专栏AI科技大本营的专栏

透析|卷积神经网络CNN究竟是怎样一步一步工作的?

译者 | zhwhong 当你听到说深度学习打破了某项新技术障碍,那么十有八九就会涉及到卷积神经网络。它们也被称作CNNs或着ConvNets,是深层神经网络领...

3489

扫码关注云+社区

领取腾讯云代金券