基本介绍
今天的应用实践是RNN实现情感分类,情感分类是自然语言处理中的经典任务,是典型的分类问题。RNN是一种循环神经网络,接收序列数据作为输入。模型训练所采用的数据集是IMDB影评数据集,数据集包含Positive和Negative两类。由于该数据集是英文数据集,所以训练后的情感分类模型只能分类英文语句的情感。本文会先简单介绍RNN模型,然后展示自己的运行结果,不作代码展示,最后进行总结。
RNN模型简介
循环神经网络(Recurrent Neural Network, RNN)是一类以序列(sequence)数据为输入,在序列的演进方向进行递归(recursion)且所有节点(循环单元)按链式连接的神经网络。RNN的一般网络结构如下:
图示左侧为一个RNN Cell循环,右侧为RNN的链式连接平铺。实际上不管是单个RNN Cell还是一个RNN网络,都只有一个Cell的参数,在不断进行循环计算中更新。
由于RNN的循环特性,和自然语言文本的序列特性(句子是由单词组成的序列)十分匹配,因此被大量应用于自然语言处理研究中。RNN的结构拆解图如下所示:
RNN单个Cell的结构简单,因此也造成了梯度消失(Gradient Vanishing)问题,具体表现为RNN网络在序列较长时,在序列尾部已经基本丢失了序列首部的信息。为了克服这一问题,LSTM(Long short-term memory)被提出,通过门控机制(Gating Mechanism)来控制信息流在每个循环步中的留存和丢弃。LSTM的结构拆解图如下所示:
今天实践模型是LSTM的变种,并不是单纯的RNN或者LSTM,从而规避梯度消失问题,并获得更好的模型效果。
RNN代码实践
官方给的代码实践是先下载IMDB数据集,然后加载数据集,由于单词的输入并不是某种编码,而是词向量化后变为词向量后输入,这需要用到MindSpore的nn.Embedding层,使用Glove词向量模型,接着就是经典的深度学习流程。即数据集预处理,模型搭建,模型训练,模型评估,模型推理,详细的可直接参考官方的代码实践,这里给出我自己的运行结果和部分代码。
- 模型训练超参数配置代码
hidden_size = 256
output_size = 1
num_layers = 2
bidirectional = True
lr = 0.001
pad_idx = vocab.tokens_to_ids('<pad>')model = RNN(embeddings, hidden_size, output_size, num_layers, bidirectional, pad_idx)
loss_fn = nn.BCEWithLogitsLoss(reduction='mean')
optimizer = nn.Adam(model.trainable_params(), learning_rate=lr)
- 模型训练结果
模型训练两轮而已,效果一般,如果有时间,可以多训练一会儿,训练个10轮的,效果应该会好些
- 模型评估结果
采用的是accuracy指标,不出意料,结果看上去很一般,因为这是二分类任务,随便猜的话,准确率应该也是有0.5的。
- 模型自定义预测结果
我随便输入两句不一样情感类别的英文,进行预测,预测速度很慢,但是结果是准确的,很神奇
总结
RNN和LSTM是自然语言处理的经典模型,RNN的原理不难理解,懂得它的思想就很容易上手了,而LSTM是RNN的优化版,针对RNN的一些缺陷进行改进优化。看上去LSTM比RNN好很多,但是这种东西还是要具体问题具体分析的,有的任务是适合RNN不适合LSTM的。由于以前接触过这两个模型,所以今天较为顺利就完成实践了。