天天看点

《TensorFlow技术解析与实战》——3.3 可视化的例子

本节书摘来异步社区《tensorflow技术解析与实战》一书中的第3章,第3.3节,作者:李嘉璇,更多章节内容可以访问云栖社区“异步社区”公众号查看。

词嵌入(word embedding)在机器学习中非常常见,可以应用在自然语言处理、推荐系统等其他程序中。下面我们就以word2vec为例来看看词嵌入投影仪的可视化。

tensorflow的word2vec有basic、optimised这两个版本,我们重点来看这两个版本的可视化表示。

本节将以github上的一段代码[3]为例,讲述可视化的思路。

word2vec采用text8[4]作为文本的训练数据集。这个文本中只包含a~z字符和空格,共27种字符。我们重点讲述产生的结果可视化的样子以及构建可视化的过程。这里我们采用的是skip-gram模型,即根据目标词汇预测上下文。也就是说,给定n个词围绕着词w,用w来预测一个句子中其中一个缺漏的词c,以概率p(c|w)来表示。最后生成的用t-sne降维呈现词汇接近程度的关系如图3-21所示。

《TensorFlow技术解析与实战》——3.3 可视化的例子

在word2vec_basic.py中,从获得数据到最终得到可视化的结果的过程分为5步。

(1)下载文件并读取数据。主要是read_data函数,它读取输入的数据,输出一个list,里面的每一项就是一个词。

这里的data就类似于['fawn', 'homomorphism', 'nordisk', 'nunnery']。

(2)建立一个词汇字典。这里首先建立了一个词汇字典,字典里是对应的词和这个词的编码。

dictionary里存储的就是词与这个词的编码;reverse_dictionary是反过来的dictionary,对应的是词的编码与这个词;data是list,存储的是词对应的编码,也就是第一步中得到的词的list,转化为词的编码表示;count中存储的是词汇和词频,其中重复数量少于49 999个词,用'unk'来代表稀有词。具体示例如下:

(3)产生一个批次(batch)的训练数据。这里定义generate_batch函数,输入batch_size、num_skips和skip_window,其中batch_size是每个batch的大小,num_skips代表样本的源端要考虑几次,skip_windows代表左右各考虑多少个词,其中skip_windows*2=num_skips。最后返回的是batch和label,batch的形状是[batch_size],label的形状是[batch_size, 1],也就是用一个中心词来预测一个周边词。

举个例子。假设我们的句子是“我在写一首歌”,我们将每一个字用dictionary中的编码代替,就变成了[123, 3084, 12, 6, 195, 90],假设这里的window_size是3,也就是只预测上文一个词,下文一个词,假设我们的generate_batch函数从3084出发,源端重复2次,那么batch就是[3084 3084 12 12 6 6 195 195],3084的上文是123,下文是12;12的上文是3084,下文是6;6的上文是12,下文是195;195的上文是6,下文是90。因此,对应输出的label就是:

(4)构建和训练模型。这里我们构建一个skip-gram模型,具体模型搭建可以参考skip-gram的相关论文。执行结果如下:

(5)用t-sne降维呈现。这里我们将上一步训练的结果做了一个t-sne降维处理,最终用matplotlib绘制出图形,图形见图3-19。代码如下:

tf_inc=$(python -c 'import tensorflow as tf; print(tf.sysconfig.get_include())')

g++ -std=c++11 -shared word2vec_ops.cc word2vec_kernels.cc -o word2vec_ops.so -fpic -i $tf_inc -o2 -d_glibcxx_use_cxx11_abi=0

tensorboard --logdir=/tmp/