自然语言菜鸟学习笔记(七):RNN(循环神经网络)及变体(LSTM、GRU)理解与实现(TensorFlow)

本文深入探讨了循环神经网络(RNN)及其变体LSTM(长短期记忆网络)和GRU(门控循环单元)。介绍了RNN在处理序列数据的优势,包括多对一、一对多和多对多任务。详细阐述了RNN结构、存在的梯度消失问题及LSTM如何通过门控机制解决这一问题。此外,还展示了GRU如何简化LSTM结构并保持性能。最后,给出了使用LSTM进行简单文本分类的预处理和代码实现。
摘要由CSDN通过智能技术生成

目录

前言

RNN(循环神经网络)

为什么要用循环神经网络(RNN)?

循环神经网络(RNN)可以处理什么类型的任务?

多对一问题

一对多问题

多对多问题

循环神经网络结构

单层网络情况

正向传播

反向传播

存在问题

优化方案

多层网络情况

双向网络结构

LSTM(Long Short Term Memory)长短期记忆网络

LSTM与RNN的不同

选择性机制的实现

LSTM模型结构

记忆单元状态

遗忘门

输入门

输出门

GRU(Gated Recurrent Unit)门控循环单元

LSTM实现简单文本分类

预处理

代码

效果截图:


前言

Stay hungry. Stay Foolish.


RNN(循环神经网络)

上一篇介绍到深度学习最经典的CNN,这一篇来研究一下深度学习同样经典的RNN。首先先研究清楚为什么我们有了CNN这么好用的神经网络后还需要循环神经网络。

为什么要用循环神经网络(RNN)?

首先上图是一张普通的神经网络模型,卷积神经网络也是这样的,输入一张图片,中间经过一个神经网络,输出他的类别。

但是上面的输入是固定输入固定输出的,比如输入一张图片,输出一个类别,那么如果拿来做输入不固定,或者输出不固定,又或者二者都不固定的任务,是不是就没辙了,比如输入是一个句子,或者要求输出是一个句子,而且输出的句子长度也不固定。循环神经网络就是用于应对这样的序列式问题,所以为了处理这一类变长的数据和序列式的问题,我们需要使用循环神经网络。

 

循环神经网络(RNN)可以处理什么类型的任务?

它一般可以处理三种类型的任务:1. 输入不固定,输出固定单一(多对一问题)2. 输入固定单一,输出不固定(一对多问题) 3. 输入和输出都不固定(多对多问题)

多对一问题

这样的问题的模型结构一般是这样的:

输入可能是一句话,输出是一个固定的输出,这种情况下卷积神经网络可能是无法处理的,这就需要循环神经网络,这样的问题对应到任务上有:文本分类、情感分析(给一句评论输出这句话的情感态度)

 

一对多问题

一对多问题的模型结构一般是这样的:

这种问题可能输入是一张图片,输出是一句话对吧,常见任务很经典的就是:Image Caption(当然输入前也是要加一层CNN抽特征的)

 

多对多问题

 

对于这种多对多的问题我们也称为序列到序列的问题(Seq2Seq),最经典的毫无疑问就是机器翻译了,输入一个源语言的句子,输出一个目标语言的句子。

 

循环神经网络结构

单层网络情况

下图就是循环神经网络的一个结构,可以看到有一个自指向的一个箭头,它代表一个中间状态,从头到尾的输出通过维持一个中间状态来记录之前输出的情况(也就是上下文信息),该状态和下一步的输入一起作为输入。

正向传播

s_{t} = F(s_{t-1}, x_{t})    ===>   s_{t} = tanh(s_{t-1}, x_{t})   ===>   y_{t} = softmax(V * s_{t})

s_{t}代表当前输入,s_{t-1}代表上一步输出的隐藏状态,他们通过F函数这样的非线性变换得到这一步输出的隐藏状态。W、U、V均为参数矩阵

损失函数就是每一步的输出计算一个损失,然后求和作为损失

最终通过softmax归一化算出最终概率,正向传播的过程也就是序列从头到尾的一个过程。

 

反向传播

其过程是序列的尾部到头部的过程,设E为Loss的值,梯度下降现在E要对每个参数进行求偏导,保证每个方向都成下降趋势。

可以看到参数矩阵都是共享的,每一步的W都是一样的,可以看成是一个变量。

我们计算对W的偏导计算梯度 :

\frac{\partial E}{\partial W} = \sum_{0}^{t} \frac{\partial E_ {t}}{\partial W}

通过一个变换:

\frac{\partial E_{t}}{\partial W} = \frac{\partial E_{t}}{\partial y_{t}} \frac{\partial y_{t}}{\partial s_{t}} \frac{\partial s_{t}}{\partial W}

s_{t}对W求偏导是比较困难的,通过上面的公式可以知道s_{t}s_{t-1}的函数:

s_{t} = tanh(s_{t-1}, x_{t})(正向传播中的公式)

那么,知道这一点我们的公式可以变换为:

\frac{\partial E_{t}}{\partial W} = \frac{\partial E_{t}}{\partial y_{t}} \frac{\partial y_{t}}{\partial s_{t}} (\prod_{i = j + 1}^{t} \frac{\partial s_{i}}{\partial s_{i-1}}) \frac{\partial s_{j}}{\partial W}

当 j = 0的时候,s_{0}对W求偏导是比较容易的,那么我们的反向传播的机制就会变成如下的一个流程:

它会从当前时间的损失,一直反向传播到最开始的状态,影响到最开始的节点。

存在问题

梯度消失,或者说较远的步骤对梯度下降贡献小。

来看看这个激活函数:tanh

\frac{\partial E_{t}}{\partial W} = \frac{\partial E_{t}}{\partial y_{t}} \frac{\partial y_{t}}{\partial s_{t}} (\prod_{i = j + 1}^{t} \frac{\partial s_{i}}{\partial s_{i-1}}) \frac{\partial s_{j}}{\partial W}

可以看到激活函数的导数的范围是在  [0 , 1] 之间的,那么我们上面这条公式的中间求偏导假如步骤拉的很长的话,中间有十几步连乘,那么每一个 \frac{\partial s_{i}}{\partial s_{i-1}}的值都在[ 0,

  • 8
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_我走路带风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值