Tensorflow 的Word2vec demo解析

简单demo的代码路径在tensorflow\tensorflow\g3doc\tutorials\word2vec\word2vec_basic.py

Sikp gram方式的model思路

http://tensorflow.org/tutorials/word2vec/index.md

另外可以参考cs224d课程的课件。

?
?

窗口设置为左右1个词

对应skip gram模型
就是一个单词预测其周围单词(cbow模型是
输入一系列context词,预测一个中心词)

?
?

Quick -> the quick -> brown

Skip gram的训练目标cost function是

对应

但是这样太耗时了
每一步训练时间代价都是O(VocabularySize)

于是我们采用了 nce(noise-contrastive estimation)的方式,也就是负样本采样,采用某种方式随机生成词作为负样本,比如 quick -> sheep ,sheep作为负样本,假设我们就取一个负样本

?
?

  1. 输入数据
    这里是
    分隔好的单词
  2. 读入单词存储到list中
  3. 统计词频 0号位置给 unknown, 其余按照频次由高到低排列,unknown的获取按照预设词典大小
    比如50000,则频次排序靠后于50000的都视为unknown

    建立好 key->id id->key的双向索引map

4. 产生一组training batch

batch_size = 128

embedding_size = 128 # Dimension of the embedding vector.

skip_window = 1 # How many words to consider left and right.

num_skips = 2 # How many times to reuse an input to generate a label.

?
?

Batch_size每次sgd训练时候扫描的数据大小, embedding_size 词向量的大小,skip_window 窗口大小,

Num_skips = 2 表示input用了产生label的次数限制

demo中默认是2,
可以设置为1 对比下

默认2的时候

batch, labels = generate_batch(batch_size=8, num_skips=2, skip_window=1)

for i in range(8):

print(batch[i], ‘->‘, labels[i, 0])

print(reverse_dictionary[batch[i]], ‘->‘, reverse_dictionary[labels[i, 0]])

?
?

Sample data [5239, 3084, 12, 6, 195, 2, 3137, 46, 59, 156]

3084 -> 5239

originated -> anarchism

3084 -> 12

originated -> as

12 -> 6

as -> a

12 -> 3084

as -> originated

6 -> 195

a -> term

6 -> 12

a -> as

195 -> 2

term -> of

195 -> 6

term -> a

3084左侧出现2次,对应窗口左右各1

设置1的时候

batch, labels = generate_batch(batch_size=8, num_skips=1, skip_window=1)

for i in range(8):

print(batch[i], ‘->‘, labels[i, 0])

print(reverse_dictionary[batch[i]], ‘->‘, reverse_dictionary[labels[i, 0]])

?
?

Sample data [5239, 3084, 12, 6, 195, 2, 3137, 46, 59, 156]

3084 -> 12

originated -> as

12 -> 3084

as -> originated

6 -> 12

a -> as

195 -> 2

term -> of

2 -> 3137

of -> abuse

3137 -> 46

abuse -> first

46 -> 59

first -> used

59 -> 156

3084左侧只出现1次

?
?

?
?

# Step 4: Function to generate a training batch for the skip-gram model.

def generate_batch(batch_size, num_skips, skip_window):

global data_index

assert batch_size % num_skips == 0

assert num_skips <= 2 * skip_window

batch = np.ndarray(shape=(batch_size), dtype=np.int32)

labels = np.ndarray(shape=(batch_size, 1), dtype=np.int32)

span = 2 * skip_window + 1 # [ skip_window target skip_window ]

buffer = collections.deque(maxlen=span)

for _ in range(span):

buffer.append(data[data_index])

data_index = (data_index + 1) % len(data)

for i in range(batch_size // num_skips):

target = skip_window # target label at the center of the buffer

targets_to_avoid = [ skip_window ]

for j in range(num_skips):

while target in targets_to_avoid:

target = random.randint(0, span - 1)

targets_to_avoid.append(target)

batch[i * num_skips + j] = buffer[skip_window]

labels[i * num_skips + j, 0] = buffer[target]

buffer.append(data[data_index])

data_index = (data_index + 1) % len(data)

return batch, labels

?
?

batch, labels = generate_batch(batch_size=8, num_skips=2, skip_window=1)

for i in range(8):

print(batch[i], ‘->‘, labels[i, 0])

print(reverse_dictionary[batch[i]], ‘->‘, reverse_dictionary[labels[i, 0]])

?
?

?
?

就是对于一个中心词
在window范围
随机选取 num_skips个词,产生一系列的

(input_id, output_id) 作为(batch_instance, label)

这些都是正样本

?
?

训练准备,

Input embedding W

?
?

?
?

Output embedding W^

?
?

后面code都比较容易理解,tf定义了nce_loss来自动处理,每次会自动添加随机负样本

num_sampled = 64 # Number of negative examples to sample.

?
?

graph = tf.Graph()

?
?

with graph.as_default():

?
?

# Input data.

train_inputs = tf.placeholder(tf.int32, shape=[batch_size])

train_labels = tf.placeholder(tf.int32, shape=[batch_size, 1])

valid_dataset = tf.constant(valid_examples, dtype=tf.int32)

?
?

# Construct the variables.

embeddings = tf.Variable(

tf.random_uniform([vocabulary_size, embedding_size], -1.0, 1.0))

nce_weights = tf.Variable(

tf.truncated_normal([vocabulary_size, embedding_size],

stddev=1.0 / math.sqrt(embedding_size)))

nce_biases = tf.Variable(tf.zeros([vocabulary_size]))

?
?

# Look up embeddings for inputs.

embed = tf.nn.embedding_lookup(embeddings, train_inputs)

?
?

# Compute the average NCE loss for the batch.

# tf.nce_loss automatically draws a new sample of the negative labels each

# time we evaluate the loss.

loss = tf.reduce_mean(

tf.nn.nce_loss(nce_weights, nce_biases, embed, train_labels,

num_sampled, vocabulary_size))

?
?

# Construct the SGD optimizer using a learning rate of 1.0.

optimizer = tf.train.GradientDescentOptimizer(1.0).minimize(loss)

?
?

训练过程利用embedding矩阵的乘法计算了不同词向量的欧式距离
并计算了高频几个词对应的距离最近的词展示

?
?

最后调用 skitlearn的TSNE模块
进行降维到2元,绘图展示。

?
?

时间: 2024-10-05 05:47:19

Tensorflow 的Word2vec demo解析的相关文章

Element demo解析

Element demo解析

文本分布式表示(二):用tensorflow和word2vec训练词向量

博客园的markdown用起来太心塞了,现在重新用其他编辑器把这篇博客整理了一下. 目前用word2vec算法训练词向量的工具主要有两种:gensim 和 tensorflow.gensim中已经封装好了word2vec这个包,用起来很方便,只要把文本处理成规范的输入格式,寥寥几行代码就能训练词向量.这样比较适合在做项目时提高效率,但是对理解算法的原理帮助不大.相比之下,用tensorflow来训练word2vec比较麻烦,生成batch.定义神经网络的各种参数,都要自己做,但是对于理解算法原理

unity car demo解析

目的 对unity的car demo进行解析,看下wheelcollider的运行原理. 结果 下图就是我用unity的基础模型搭建起来的车子,实现了前进.后退.转弯.刹车等功能,当然就是抄的官方的代码. 搭建模型 摄像机.灯光使用创建场景时默认的. 创建一个plane当道路使用,一个cube用来检测碰撞. cube有三种用来测试碰撞的状态.一是可以不添加rigidbody,此时cube为静态刚体,碰撞时不会动.而是添加rigidbody但是使用is kinematic选项,此时cube为动态运

Tensorflow的CNN教程解析

之前的博客我们已经对RNN模型有了个粗略的了解.作为一个时序性模型,RNN的强大不需要我在这里重复了.今天,让我们来看看除了RNN外另一个特殊的,同时也是广为人知的强大的神经网络模型,即CNN模型.今天的讨论主要是基于Tensorflow的CIFAR10教程,不过作为对比,我们也会对Tensorflow的MINST教程作解析以及对比.很快大家就会发现,逻辑上考虑,其实内容都是大同小异的.由于所对应的目标不一样,在数据处理方面可能存在着些许差异,这里我们以CIFAR10的为基准,有兴趣的朋友欢迎去

转:RealThinClient LinkedObjects Demo解析

这个Demo源码实现比较怪,有点拗脑,原因估是作者想把控件的使用做得简单,而封装太多. 这里说是解析,其实是粗析,俺没有耐心每个实现点都查实清楚,看源码一般也就连读带猜的. 这个Demo表达出的意义,在于在HTTP访问方式下,很方便的实现了客户端和服务端相互的主动通讯能力,这在需要实时消息交互,控制交互,数据互传上非常有意义,非常给力. 一.Demo工作过程 1. 实现功能:实现了上传文件到HTTP服务端的能力,大文件上传成功率极高,并且始终保持非常少的内存占用量. 2. 工作过程:客户端和服务

Android蓝牙联机Demo解析

写在前面: 手游的双人对战实现方式有很多,比如: 联网对战(需要一个服务器负责转发客户端请求,各种大型手游的做法) 分屏对战(手机上下分屏,典型的例子就是切水果的双人对战) 蓝牙联机对战(通过蓝牙联机,典型的例子是三国Kill联机版) 首先,联网对战不考虑(成本高,服务器贵..),而分屏对战局限性太大(两个人用一个手机玩,太不方便了) 所以蓝牙联机对战是不错的选择,低成本,可实现(三国Kill就是最好的例子,至少证明了这是可行的) 一.资源搜集 搜索“安卓开发蓝牙联机”,找到很多有用的信息,经过

机器学习算法实现解析——word2vec源代码解析

在阅读本文之前,建议首先阅读"简单易学的机器学习算法--word2vec的算法原理"(眼下还没公布).掌握例如以下的几个概念: 什么是统计语言模型 神经概率语言模型的网络结构 CBOW模型和Skip-gram模型的网络结构 Hierarchical Softmax和Negative Sampling的训练方法 Hierarchical Softmax与Huffman树的关系 有了如上的一些概念,接下来就能够去读word2vec的源代码. 在源代码的解析过程中,对于基础知识部分仅仅会做简

Android端小米推送Demo解析和实现方法

前言 最近这几个月都是在准备找工作和找工作中,付出了很多,总算是有点收获,所以都没有怎么整理笔记.到了最近才有空把自己的笔记整理一下发上来,分享一下我的学习经验. 推送 由于最近项目要用到Android的消息推送,关于Android推送的解决方案有很多种,有C2DM,轮询, SMS,MQTT协议,XMPP协议和第三方平台,经过我们对项目需求的考虑之后我们选择了第三方平台推送的小米推送,下面就是小米推送的实现方法. 实现准备 想要用小米推送首先要去小米开发者平台注册申请开发者账号,经过1到3天的审

windows10 64bit 下的tensorflow 安装及demo

目前流行的深度学习库有Caffe,Keras,Theano,本文采用谷歌开源的曾用来制作AlphaGo的深度学习系统Tensorflow. 1:安装Tensorflow 最早TensorFlow只支持mac和Linux系统,目前也支持windows系统,但要求python3.5 (64bit)版本.TensorFlow有cpu和gpu版本,由于本文使用服务器是NVIDIA显卡,因此安装gpu版本,在cmd命令行键入 pip install --upgrade tensorflow-gpu 如果出