Tensorflow的基础使用与文本分类应用

知乎大数据比赛官网

下面是基于知乎大数据比赛的文本分类公开课:

大家好,非常高兴大家今晚能参加 Tensorflow 的公开课,我是本次公开课的主讲人覃秉丰。今晚的公开课会分成两个部分, 第一部分 会介绍 Tensorflow 的基础使用,以及文本分类的思路。 第二部分会 给出具体代码来给大家讲解如何用 Tensorflow 来做文本分类。

Tensorflow 是 google 第二代人工智能学习系统。支持 python 和c++语言, 支持 CNN、 RNN 和 LSTM 等算法, 可以被用于语音识 别或图像处理等多项深度学习领域。它可以在一个或多个 CPU 或GPU 中运行。它可以运行在嵌入式系统(如手机, 平板电脑)中, PC中以及分布式系统中。它是目前全世界最火爆的深度学习平台(没有之一)。

深度学习这个行业刚刚兴起, 急需一个好的平台来提高我们的工作 效率。 google 在 2015 年 12 月 11 日开源了 Tensorflow, google希望把Tensorflow 做成行业标准。我个人也是比较看好 Tensorflow,毕竟 Google 的技术水平和公司实力都是全世界数一数二的。我们学 习了 Tensorflow 之后, 就可以使用 Tensorflow 非常方便地搭建一 些我们自己的深度网络, 实现我们想要的一些功能。

《Tensorflow的基础使用与文本分类应用》
《Tensorflow的基础使用与文本分类应用》

大家先看一下这一页 PPT,了解一下 Tensorflow 的一些基本概念。

《Tensorflow的基础使用与文本分类应用》
《Tensorflow的基础使用与文本分类应用》

就如同上一张 PPT 所说的,我们需要定义一个会话(Session),会话 中可以有一个或多个图(Graph),Tensorflow 会有一个默认的图,一 般情况下使用默认的图就足够了。在图中可以定义计算的节点,称为OP,一个 OP 可以获得张量(Tensor)或者变量(Variable),然后进 行计算。计算后得到的结构可以传给下一个 OP 再进行计算。

《Tensorflow的基础使用与文本分类应用》
《Tensorflow的基础使用与文本分类应用》

下面我们来看看 Tensorflow 中一个最基本的应用-MNIST 数据集分 类。手写数字图片数据集分成两个部分,训练集有 60000 张图片,测 试集有 10000 张图片。图片都是 0-9 的手写数字,类似于上面几张图 片的样子。

《Tensorflow的基础使用与文本分类应用》
《Tensorflow的基础使用与文本分类应用》

这里的重点是每一张图片都是 28*28 的黑白图片,然后把二维的图片变成一维的向量,向量的长度是 28*28=784。

《Tensorflow的基础使用与文本分类应用》
《Tensorflow的基础使用与文本分类应用》

训练集一共有 60000 张图片,所以数据的格式就像这样,是一个形状 为 [60000, 784] 的张量。

《Tensorflow的基础使用与文本分类应用》
《Tensorflow的基础使用与文本分类应用》

训练集的标签是[60000,10]的张量。

《Tensorflow的基础使用与文本分类应用》
《Tensorflow的基础使用与文本分类应用》

我们可以构建一个如图所示的神经网络,输入层有 784 个神经元,对 应一张图片有 784 个像素。输出层有 10 个神经元,对应 0 到 9 一共10 个数字。下面我们来看看程序。

《Tensorflow的基础使用与文本分类应用》
《Tensorflow的基础使用与文本分类应用》
《Tensorflow的基础使用与文本分类应用》
《Tensorflow的基础使用与文本分类应用》

大家花 3 分钟看看 MNIST 的代码,代码里面写了详细的注释应该还 是比较好理解的。

《Tensorflow的基础使用与文本分类应用》
《Tensorflow的基础使用与文本分类应用》

接下来我们会讲解如何使用 CNN 来做文本分类。内容会涉及到一些CNN 的知识,和 word2vec 的知识,由于时间的问题我们就不具体介 绍了。不太了解的朋友可以到网上查一下相关的知识。

《Tensorflow的基础使用与文本分类应用》
《Tensorflow的基础使用与文本分类应用》

这幅图很好的描绘了 CNN 网络在自然语言处理中的使用。大家先花2 分钟自己看一下,等下我再给大家讲解。

下面我给大家讲解一下这幅图,我给这些层做了从左到右做了一个编 号,分别为 1,2,3,4,5 层。我们先看第 1 层,第 1 层是输入层,输入一 句话,或者一段文本。比如图中一共有 7 个词,每个词用一个向量来 表示(这个的向量可以使用 word2vec),图中 d=5 意思是维度为 5 的 向量,不过实际使用中一般我们会用 128 维,200 维,256 维,或 300维等比较大的维度。这样我们就可以得到一个矩阵,每个词占矩阵中 的一行,列就是词向量。

我们再看到第 2 层,第 2 层定义了三个尺寸的滤波器。滤波的列数跟 第 1 层矩阵中的列数要是一样的(图中是 5 列,假如我们使用 128 维 的词向量,那么第 2 层的滤波器就是 128 列),滤波器的行数有三个 尺寸,分别是 2,3,4,每种尺寸的滤波器有 2 个。

使用第 2 层中的滤波对第 1 层的矩阵求卷积,就可以得到第 3 层。使 用尺寸为 4 的滤波器求卷积会得到 4 个输出值,使用尺寸为 3 的滤波 器求卷积会得到 5 个输出值,使用尺寸为 2 的滤波器求卷积会得到 6个输出值。

第 3 层到第 4 层有一个最大池化的操作,其实就是取第 3 层中每个滤 波器输出的 feature map 的最大值。因为一共有 6 个滤波器,所以会 得到 6 个 feature map,所以第 4 层会得到 6 个值。

第 5 层是分类层,假如我们需要分 2 个类,第 5 层就只有 2 个神经 元。如果我们需要分更多的类,那我们就需要设置更多的神经元。第4 层跟第 5 层之间是全连接的。

我们接着往下讲,讲解程序之前,我们先来讲一下数据预处理,以及 程序设计的思路。

《Tensorflow的基础使用与文本分类应用》
《Tensorflow的基础使用与文本分类应用》

知乎的这次比赛提供的数据种类很多,数据量也很大,所以参赛选手 可以有很大地自由发挥空间。不过我这次分享主要是给大家提供一种 可行的思路和方法,并不是说大家看完我的程序之后就能拿奖。为了 节约时间,我只使用了非常少量的数据进行训练。后面我也会讲到怎 么在我的这个方法上去做提升。

《Tensorflow的基础使用与文本分类应用》
《Tensorflow的基础使用与文本分类应用》

数据预处理的程序比较简单,我会把程序提供给大家,这里就不做讲 解了。我们看一下思路就可以。数据预处理使用了三个文件question_train_set.txt,question_topic_train_set.txt,topic_info.txt。这 三个文件的描述在上面可以看到。我的数据处理按照以下原则:

1.title通常来说包含的信息最重要。对于question_train_set.txt文件,为了简单起见,我们只取第三列,title 的词语编号序列。

2.对于 topic_info.txt,为了简单起见,我们不考虑 2,3,4,5,6 列。只是 简单的提取话题 id,然后转为 0-1998 的数字(一共有 1999 个话 题)

3.然后合并以上一些数据,得到最后处理后的数据。

我们可以看到,处理过后的数据,第 1 列的内容是问题的 title 中的词 编号,第 2 列是问题所属的话题 id。其实本质上就是一段文字描述,然后有一个或多个分类。训练集一共有 2999967 个问题,为了简单方 便,我把训练集拆分成了 10 份,前 9 份 300000 个数据,最后一份299967 个数据。我只取其中一份,也就是 300000 个数据来进行训练。

下面我们开始讲解程序。

《Tensorflow的基础使用与文本分类应用》
《Tensorflow的基础使用与文本分类应用》

在程序的最开始先定义一些参数。

《Tensorflow的基础使用与文本分类应用》
《Tensorflow的基础使用与文本分类应用》

接下来读取训练数据,并把训练数据存入 x_text 中,把分类的标签进 行一些处理,存入 y 中,图中我们可以看到 x_text 和 y 的数据格式。

《Tensorflow的基础使用与文本分类应用》
《Tensorflow的基础使用与文本分类应用》

建立一个词典,并且把数据集中的词汇(如‘w305’,‘w11’,‘w1034’等),变成编号的形式。然后把数据集切分为训练集和验证集。图中 我们可以看到,数据集一共有 300000 行。在所有的数据集中,词汇 数最多的一段数据一共有 72 个词汇,所有 x_shape 的列为 72,同时我们要把所有的数据的词汇数都变成 72,如果不够 72 个词汇就填充0,一直填充到 72 个元素。y_shape 的列为 1999,因为一共有 1999个话题的分类。x 和 y 的数据格式如上图所示。

《Tensorflow的基础使用与文本分类应用》
《Tensorflow的基础使用与文本分类应用》

接下来定义占位符,tf.placeholder 创建了一个占位符变量,当我们训 练或测试的时候,都可以使用它向我们的模型输入数据。同时还设置 了一些参数。

上面还定义了第一个网络层,这一层的作用是将词汇索引映射到词向 量进行表示。它的本质是一个我们从数据中学习得到的词汇向量表。

W 是我们的嵌入矩阵,这个矩阵是我们从数据训练过程中得到的。最 开始,我们使用一个随机均匀分布来进行初始化。tf.nn.embedding_lookup 创建实际的嵌入读取操作,这个嵌入操作返 回的数据维度是三维张量 [None, sequence_length, embedding_size] 。

《Tensorflow的基础使用与文本分类应用》
《Tensorflow的基础使用与文本分类应用》

TensorFlow 的卷积操作conv2d需要一个四维的输入数据,对应的维 度分别是批处理大小,宽度,高度和通道数。在我们嵌入层得到的数 据中不包含通道数,所以我们需要手动添加它,所以最终的数据维度 是 [None, sequence_length, embedding_size, 1] 。

这一部分是构建卷积层和池化层。因为我们使用的卷积核是不同尺寸 的,所以我们需要为每一个卷积核创建一层网络,最后再把这些经过 卷积和池化之后的数据合成一个大的特征向量。整个过程就跟右边的 图差不多。

《Tensorflow的基础使用与文本分类应用》
《Tensorflow的基础使用与文本分类应用》

接下来定义 dropout 层,输出层。并且定义 loss 函数和优化器。这里我们可以看到 num_filters_total 等于 3072,说明倒数第 2 层有 3072 个 神经元,话题一共有 1999 个分类,所以倒数第 2 层跟最后的输出层 是 3072×1999 的全连接网络。

《Tensorflow的基础使用与文本分类应用》
《Tensorflow的基础使用与文本分类应用》

这里定义了一个批次数据的生成程序,使用生成器生成num_epochs×num_batches_per_epoch 个批次的数据用于训练。

《Tensorflow的基础使用与文本分类应用》
《Tensorflow的基础使用与文本分类应用》

这里定义了知乎提供的评测方案。

《Tensorflow的基础使用与文本分类应用》
《Tensorflow的基础使用与文本分类应用》

最后就是调用之前的函数,生成批次数据,在会话中训练模型。每训 练 50 次测试 1 次模型效果,每训练 200 次保存一次模型。

模型训练好之后,我们再调用训练好的模型去预测question_eval_set.txt 就可以了。预测的程序我也会提供给大家,这里 就不做详细介绍了。

我按照前面说的方法简单预处理过后,取十分之一的数据进行训练,训练了 2-3 个周期。最后在知乎比赛官网提交结果得到了 0.3 左右的 分数。结果不算很好也不算很差,排名在中等的位置吧。

最后我再给大家提供几个优化的思路,以供参考。

《Tensorflow的基础使用与文本分类应用》
《Tensorflow的基础使用与文本分类应用》

1.把所有的数据训练完。因为我只用了十分之一的数据,如果你使用 了所有的数据来训练,最后的预测准确率应该会有较大提升。

2.增加训练周期,使用动态学习率。因为我只训练了 2 个周期,还是 比较少的,模型应该还有优化空间。同时我使用的是固定的学习率,如果改成动态的学习率,也就是开始的时候学习率比较大,随着训 练的进行,学习率越来越小,比较有助于网络进一步优化。

3.使用知乎提供的 word_embedding.txt 文件来初始化词汇向量表。 我的程序中词汇向量表示随机初始化的,如果使用知乎提供的文 件来初始化词汇向量表,那么可以使用模型的收敛速度更快,并且 模型最后应该可以获得更高的准确率。

4.考虑使用更多种类的数据。在我的程序中我只使用的问题 title 的 词汇数据,如果合理使用问题 title 的字符数据,问题描述的字符数 据、词汇数据,合理使用 topic_info.txt 中话题之间的联系,话题的 描述。应该可以取得更好的效果。

5.调节网络参数。我基本上没有怎么优化网络参数。如果对卷积核大 小,每一种卷积核个数,dropout 参数,l2 正则化系数,批次大小,优化器选择,学习率选择等等参数进行一些调试应该可以使得模 型效果有所提升。

6.优化网络结构。我使用的用于文本分类的 CNN 的网络结构几乎是 最简单的网络结构,所以如果对网络结构进行优化,选择更深层的,结构更复杂的卷积神经网络,那么结果应该会有很大提升。

优化方案当然不止这些,大家也可以自己考虑一些其他优化方案。

最后大家可以加一下我的公众号:深度学习与神经网络

《Tensorflow的基础使用与文本分类应用》
《Tensorflow的基础使用与文本分类应用》

今天分享的内容都放到了我的 github 上,代码在我的 github 上可以 下载,之后我也会放更多深度学习的分享内容到 github 上面。

github链接

    原文作者:顿坦覃秉丰
    原文地址: https://zhuanlan.zhihu.com/p/27685641
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞