本系列博客为跟随开源组织Datawhale学习小组的学习过程记录,任务内容及相关数据集为Datawhale开源组织搜集并无偿提供,饮水思源,特此宣传,欢迎关注Datawhale。
自然语言处理入门之路【task11】—— 循环神经网络基础

  1. RNN的结构。循环神经网络的提出背景、优缺点。着重学习RNN的反向传播、RNN出现的问题(梯度问题、长期依赖问题)、BPTT算法。
  2. 双向RNN
  3. LSTM、GRU的结构、提出背景、优缺点。
    4、针对梯度消失(LSTM等其他门控RNN)、梯度爆炸(梯度截断)的解决方案。
  4. Text-RNN的原理。
  5. 利用Text-RNN模型来进行文本分类。

RNN

循环神经网络(RNN) 基础讲解 https://www.jianshu.com/p/9f155515bdf0
http://book.aqinet.cn/?page=doc3.7.1.1.htm
【AI笔记】认识循环神经网络(RNN) https://www.jianshu.com/p/30b253561337
深度学习之RNN(循环神经网络)https://blog.csdn.net/qq_32241189/article/details/80461635

RNN背景

RNN为序列数据而生,设计RNN的目的,就是处理序列数据。
  词序是很重要的,中文中:“杭州到西安的高铁”与“西安到杭州的高铁”,“天津旅游怎么样”与“天津怎么样旅游”。
  传统的神经网络模型中,是从输入层到隐含层再到输出层,层与层之间是全连接的,每层之间的节点是无连接的。但是这种普通的神经网络对于很多问题却无能我丽。例如,你要预测句子的下一个单词是什么,一般需要用到前面的单词,因为一个句子中前后单词并不是独立的。RNN之所以成为循环神经网络,即一个序列当前的输出与前面的输出也有关。具体的表现形式为网络会对前面的信息进行记忆并应用于当前输出的计算中,即隐藏层之间的节点不再无连接,而是有连接的,并且隐藏层的输入不仅包括输出层的输出还包括上一时刻隐藏层的输出。理论上,RNN能够对任何长度的序列数据进行处理。

RNN的基本结构

RNN包含输入单元(input units),输入集标记为x0,x1,...,xt,xt+1,...{x_0, x_1,...,x_t,x_{t+1},...},而输出单元(output units)的输出集被标记为y0,y1,...,yt,yt+1,...{y_0, y_1,...,y_t,y_{t+1},...}。RNN还包含隐藏单元(Hidden units),标记为h0,h1,...,ht,ht+1,...{h_0, h_1,...,h_t,h_{t+1},...},这些隐藏单元完成了最为主要的工作。
自然语言处理入门之路【task11】—— 循环神经网络基础
各个变量的含义:
自然语言处理入门之路【task11】—— 循环神经网络基础
展开以后形式:
自然语言处理入门之路【task11】—— 循环神经网络基础
一个RNN的小例子
自然语言处理入门之路【task11】—— 循环神经网络基础
深层次的RNN:
自然语言处理入门之路【task11】—— 循环神经网络基础
字符级别的RNN:
自然语言处理入门之路【task11】—— 循环神经网络基础
charRNN的代码:
Torch版本

https://github.com/karpathy/char-rnn

Tensorflow版本

https://github.com/sherjilozair/char-rnn-tensorflow

RNN类型

RNN可以分为两类:
  - simple RNN
  - Long short term memory [LSTM]
  1、Simple RNN
  RNN引入了Store来存储信息,每一次都将前一次RNN的结果,带入到下一次RNN的隐层中,一起train。
  1) 按输入的前后向分类
  按照语言顺序分类:
  - 前向RNN
  自然语言处理入门之路【task11】—— 循环神经网络基础
  即只将语句前半部分的内容不断的向后一个RNN传递,但这样带来的缺陷是位于句子后半部分的内容无法影响前半部分
  - 双向RNN
  自然语言处理入门之路【task11】—— 循环神经网络基础
  Bidirectional RNN是先正向一次,再反向一次,将两者的store混合,再进入NN中再来一次,好处是看的内容比较广,即考虑了句子的前半部分,也考虑了句子的后半部分。
  2)按存储结果的不同输入到不同的隐藏层
  - Elman Network
  将上一隐层的结果传入到下一个RNN的隐层
  自然语言处理入门之路【task11】—— 循环神经网络基础
  - Jordan Network
  将上一output的结果传入到下一个RNN的隐层
  自然语言处理入门之路【task11】—— 循环神经网络基础
  3)缺点
  simpleRNN有两个缺点
  - 记忆非常短期
  第一个隐层的Store内容输入到第二个隐层后,store内的内容是会被改写的,再给到第三个隐层的store的内容,实际是混合的第一和第二个隐层。即第一个隐层的store的内容在往后传递的时候,影响是逐渐减弱的,也可以理解为simpleRNN的记忆是非常短期的,很快就被改写了。有时候也称为“梯度消失”
  - 无法控制store内的内容
  一个语句中并不是所有的内容都应该写入store中影响整个语句的。例如“我想来杯冰的啤酒”,句子中的“我”,“的”这些词实际对整体影响是不大的,但是都会写入到store中,即simpleRNN也无法控制store的内容。
  - 梯度爆炸
  用来克服梯度爆炸的问题就是gradient clipping,即当计算的梯度超过阈值c或者小于阈值-c时候,便将此时的梯度设置为c或-c

2、Long short term memory (LSTM)
  LSTM结构如下:
  自然语言处理入门之路【task11】—— 循环神经网络基础
  与simple中的store直接存入的结构不同,LSTM由4个输入和一个输出组成:
  1)impute,就是外界要存入memory的内容
  2)impute gate,控制存入门的开关
  3)forget gate,控制是否清空memory的开关
  4)output gate,控制是否输入memory的开关
  5)output,输入memory的内容到其他的隐层
  以上结构,可以实现灵活的管理需要记忆的内容。可以控制只将重要的内容存入到memory中,不重要的内容不存入,需要的时候输出,必要的时候清空等。.
  需要说明的是,LSTM看起来复杂,但是实际控制各个gate的参数,是后期machine自己train的过程中学会的,并不需要设定好,并且他是work的。
  由此,LSTM解决了simpleRNN的问题。但是LSTM的特殊结构,决定了他需要的参数是simpleRNN四倍。
  再放一张更简洁明了的LSTM结构图:
  自然语言处理入门之路【task11】—— 循环神经网络基础
  3、GRU算法
  GRU是2014年提出的LSTM改进算法,他将遗忘门和输入门合并成为一个单一的更新门,同时合并了数据单元状态和隐藏状态,使得模型结构比之于LSTM更为简单。
自然语言处理入门之路【task11】—— 循环神经网络基础