查看原文
其他

从零开始用 TensorFlow 分析情绪,硅谷网红带你飞

2017-05-26 雷锋字幕组 AI研习社


Siraj Raval 作为深度学习领域的自媒体人在欧美可以说是无人不知、无人不晓。


凭借在 Youtube 上的指导视频,Siraj Raval  在全世界吸粉无数,堪称是机器学习界的网红。说他是全球范围内影响力最大的 ML 自媒体人,怕也无异议。


因此,雷锋网 AI 研习社联系到了 Siraj 本人,并获得授权将他最精华的 Youtube 视频进行字幕汉化,免费推送给大家。我们将不定期更新,敬请关注!

雷锋字幕组为大家最新译制了Siraj深度学习系列,从机器学习和神经网络架构类型到数据可视化、小样本学习等从基础到应用的技巧,争取带领希望掌握神经网络的神奇魔力和想成为深度学习工程师的大家伙早日入坑!哦不,走向巅峰!!


今天主要讲的内容是如何用 TensorFlow 分析情绪(文末点击阅读原文可抵达 GitHub 获取代码)。

https://v.qq.com/txp/iframe/player.html?vid=j0507vzrey8&width=500&height=375&auto=0

(建议在 Wi-Fi 环境下观看视频,土豪随意~)


为了方便流量不足的小伙伴们在路上看,我们特意整理出了图文版:

只有塔罗牌可以帮你分析感情运势?AI也可以秒变情感分析师!


情商将人类与地球上其他生物区分开来。情绪可以很简单,比如听到凤凰传奇的《最炫民族风》你会变超兴奋。



人类发明了相应的情绪词汇来帮助我们表达,但有时词汇不足以表达感情,有些情绪则没有直接的语言表述。情感如此难以表达的,更别说去理解了,但是AI可以帮助我们,甚至比我们自己分析情绪数据做的更好,并帮助我们作出最优的决策,但它是如何做到的呢?


  情感分析通常有两种方法:


  • 基于词典资源分析(Lexicon Based Approach)

我们首先将一些给定的文本拆分成小的单元,可以是单词、短语、或者句子。这个过程被称为标记化(Tokenization),计算出每个词语出现的次数,得到的结果被称为词袋模型(Bag of Words model)。

接下来,我们根据现有的“词典”来确定每个词语的情感值。“词典”是研究人员预先建立的词汇情感值数据库。一旦我们有了这些情感值,我们就能计算出整个文本的情感倾向。


  • 基于机器学习

通过学习被转换成广义向量的单词来进行情感分析。前向神经网络接受固定维度的输入,例如二进制数;但循环神经网络(RNN,recurrent neural nets)可以帮助我们学习序列数据,例如文本。


如果我们有标记了正面或负面情绪的推文(tweets)数据集,我们就可以使用数据集训练一个分类器,当有一个新的推文时,分类器就可以区分它是正面的或是负面的。


  那么哪种方法更好呢?


虽然使用词典的方法容易些,但是机器学习的方法会更准确。语言的表达有很多微妙的地方,词典不太擅长处理这类情况,例如“讽刺”。讽刺就是看上去说的是这回事,真正的含义却是另一回事。恩,谢耳朵最懂什么叫“讽刺“了。



深度神经网络能处理这些细微的地方,因为它并不靠字面意思来分析,它们根据所学创建了抽象表示。这些可以称为“向量”(vectors),通过向量对数据进行分类。


接下来Siraj带大家用电影评论数据来建立一个情感分类器,并且在云端运行。唯一依赖的工具是tflearn,因为它是目前搭建深度神经网络最简单的工具。简单粗暴,先上代码:


from __future__ import division, print_function, absolute_import


import tflearn

from tflearn.data_utils import to_categorical, pad_sequences

from tflearn.datasets import imdb


# IMDB数据集下载

train, test, _ = imdb.load_data(path='imdb.pkl', n_words=10000,valid_portion=0.1)

trainX, trainY = train

testX, testY = test


# 数据处理

# 序列填充

trainX = pad_sequences(trainX, maxlen=100, value=0.)

testX = pad_sequences(testX, maxlen=100, value=0.)

# 将labels转换成二进制向量

trainY = to_categorical(trainY, nb_classes=2)

testY = to_categorical(testY, nb_classes=2)


# 构建网络

net = tflearn.input_data([None, 100])

net = tflearn.embedding(net, input_dim=10000, output_dim=128)

net = tflearn.lstm(net, 128, dropout=0.8)

net = tflearn.fully_connected(net, 2, activation='softmax')

net = tflearn.regression(net, optimizer='adam', learning_rate=0.001,loss='categorical_crossentropy')


# 训练模型

model = tflearn.DNN(net, tensorboard_verbose=0)

model.fit(trainX, trainY, validation_set=(testX, testY), show_metric=True,batch_size=32)


  第一步:收集数据


我们选用IMDB电影评分数据。通过load_data函数将数据导入,设置好保存路径,同时将扩展名设为“pkl”,这样可以更容易的转换成其他的Python对象。在10,000个词汇中,我们只留10%作为验证集(validation)。

导入数据后将被自动分为训练集和验证集,可以进一步将这些集合拆分为评论和标签,分别赋值为X和Y。训练集是用来训练模型的,帮助找到合适的权重;验证集则调整结果以防过度拟合,用来将预测值与真实值进行比较, 并最终测试模型准确度。


  第二步:数据预处理


需要先对输入进行向量化。使用pad_sequences函数,将每一条评论都填充(pad)到一个矩阵中。“填充”可以让输入的维度保持一致,将每个序列的指定地方填充为零,直到序列的最大长度(这里设为100)。也要通过to_categorical函数将标签转换成向量,将它们转换成二元向量,其中1代表正面,0代表负面。


  第三步:构建网络


神经网络的第一层是输入层(input layer),下一层是嵌入层(embedding layer,也做隐层)。第一个参数是上一层的输出向量,类似的对于每一层而言都是以前一层的输出作为该层的输入。这里将维度设为10,000,也就是从数据集中导入词汇的数量。输出维度设为128,即生成嵌入层的维数。


下一步,将这些值输入至LSTM层,它可以让网络从一开始就记住所有的数据,从而提高预测精度。将退出率(dropout)设为0.08,有助于防止神经网络中过度拟合的问题。每个神经元都与上一层的所有神经元连接。用softmax函数作为其激活函数,它的功能在于可以把任何一个向量中的值转换成0和1之间的概率,概率之和等于1。这些值将作为我们最后一层,也就是回归层(regression layer),对输入进行回归。


指定一个优化器(optimizer)使得损失函数(loss function)最小化,以及设置学习速率(learning rate)来决定神经网络的训练速度。我们使用的优化器是adam来执行梯度下降算法(gradient descent)。损失函数设为categorical cross entropy,它将找出预测输出和期望输出间的差异。


  第四部:训练模型


建立了神经网络之后,可以通过tflearn的深度神经网络函数对它进行初始化,然后就在给定的训练集和验证集上开始训练模型。将show_metric参数设为“True”,就可以在训练中间通过log查看精确性。


为了演示这个过程,将在AWS(Amazon的云服务器)上运行。我们要做的是使用AMI(Amazon Machine Image,亚马逊系统映像),那上面有我们需要用到的一切工具,包括tensorflow。可以在AWS上通过AMI在云端执行训练模型,而不用考虑环境依赖的问题。进入AWS控制台后开始执行上面的例子。将公共DNS复制粘贴到浏览器中后,在指定端口输入ID和密码。可以通过前面申请的账户构建一个AMI环境,通过Jupyter Notebook在云端(AWS上)运行程序。先创建一个文本文件,然后把代码贴上去,就可以开始执行代码训练神经网络了。



完整代码和数据集请参考 Github 链接(点击文末阅读原文进入)。

--------------------------------------------

  Siraj Raval 何许人也?

Siraj Raval 是 YouTube 极客网红,曾任职于 Twilio 和 Meetup,客户包括 Elon Mask 和 Google,教大家如何使用机器学习开发聊天机器人、无人驾驶车、AI 艺术家等视频点击量累计数百万。


  Siraj Raval 为什么这么火?


首先,当然是这位哥伦比亚大学高材生活儿好技术好,用自己特有的方式三言两语就能抛出一个原本晦涩的 ML、DL 概念,让听众细细咀嚼。再者,这家伙幽默逗比、口才便给。兴之所至常手舞足蹈,瞳仁奇光掩映,口吐智慧莲华。深度学习讲师不少,但这么风趣可亲的却不多。

延伸阅读:解惑:Python是否值得学习?最强语言展露端倪

 研习社特供福利  ID:OKweiwu

关注 AI 研习社后,回复【1】获取

【千G神经网络/AI/大数据、教程、论文!】
百度云盘地址!


  雷锋字幕组志愿者


下列同学参与了本文 / 视频的译制工作!

如果您对我们的工作内容感兴趣,欢迎添加组长微信 “iIoveus2014” 加入字幕组~





  人工智能之神经网络特训班


20 年清华大学神经网络授课导师,带你系统学习人工智能之神经网络!

一站式深入了解深度学习的发展现状、基本原理和主要方法。

点击图片抵达课程详细介绍~

课程链接:mooc.ai

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存