通俗易懂说模型——RNN

​🌈 个人主页十二月的猫-CSDN博客
🔥 系列专栏 🏀《深度学习基础知识》

      相关专栏: 《机器学习基础知识》

                         🏐《机器学习项目实战》
                         🥎《深度学习项目实战(pytorch)》

💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光

RNN分析

RNN出现之因

        要理解RNN出现的原因,我们必须要理解CNN存在的缺点

        细细研究上图,我们会发现, 他们的输出不会受之前输出的影响,仅仅受输入特征值的影响,即隐藏层之间没有连接(每一个隐藏层的块表示每一个时刻的输出值)

        总之,CNN考虑不到时间维度上的影响,仅仅能考虑一个时间点,事物不同特征值的输入

        那么,对于简单的猫,狗,手写数字等单个物体的识别具有较好的效果.。但是, 对于一些与时间先后有关的, 比如视频的下一时刻的预测,文档前后文内容的预测等, 这些算法的表现就不尽如人意了。因此, RNN就应运而生了。RNN每个时间点的输出受到之前所有时间点输出的影响,然后综合考虑这些信息做出下一个输出

什么是RNN

        RNN是一种特殊的神经网络结构, 它是根据"人的认知是基于过往的经验和记忆"这一观点提出的. 它与DNN,CNN不同的是: 它不仅考虑前一时刻的输入,而且赋予了网络对前面的内容的一种'记忆'功能。

        结合现实来看,我们每一个人的性格特点都是由以往所有的经历所造成的。离现在时间点越久远的经历对现在的我们影响越小,而发生在最近的经历对我们的影响越大。

        RNN之所以称为循环神经网路,即一个序列当前的输出与前面的输出也有关。具体的表现形式为网络会对前面的信息进行记忆并应用于当前输出的计算中,即隐藏层之间的节点不再无连接而是有连接的,并且隐藏层的输入不仅包括输入层的输出还包括上一时刻隐藏层的输出,即隐藏层之间还存在先后的时间序关系

RNN模型结构

        前面说了,RNN结构能够实现时间维度上的记忆功能,并且这个记忆和人类得记忆一样,具有长时间遗忘性。其模型结构如下图:

        当然,网络上还有其他经典的模型图:

        第一张图片突出的是RNN对CNN的继承与发展——既有CNN的特点(全连接层),又有RNN的特点(隐藏层相互连接)

        第二张照片隐藏了全连接层(全连接层封装到A中),仅仅保留RNN自身的特点,全连接层输出到隐藏层后,隐藏层彼此连接

RNN存在的问题

        RNN存在长期依赖问题:长期依赖问题是指RNN难以捕捉长期之前的依赖关系。换句话说,很久之前的数据在RNN中就会被彻底遗忘。并且这个长期实际上并不长,差不多到50个词语RNN就会彻底遗忘前面的数据,这就导致RNN很难处理长文本

举个例子:

        1、如果从“这块冰糖味道真?”来预测下一个词,RNN是很容易得出“甜”结果的

        2、如果有这么一句话,“他吃了一口菜,被辣的流出了眼泪,满脸通红。旁边的人赶紧给他倒了一杯凉水,他咕咚咕咚喝了两口,才逐渐恢复正常。他气愤地说道:这个菜味道真?”对于这句话,利用RNN来处理时,RNN在语句最后时早就忘了开头的信息“辣的流出来眼泪”,所以它难以成功预测出结果

        因此,RNN难以处理具有长期依赖关系的问题

RNN难以处理长期依赖问题的根本原因在于:经过多层多阶段传播后存在梯度消失(大部分,模型仍可用但是长期依赖会遗忘)或梯度爆炸(很少,但是一遇到模型就彻底完蛋)问题 

RNN梯度消失、爆炸的原因

(借用一张别人的图) 

        假设时间序列只有三段,初始进位量为S0,则RNN的前向传播过程为:

S_1=W_xX_1+W_sS_0+b_1\\ O_1=S_1W_o+b_2\\ S_2=W_xX_2+W_sS_1+b_1\\ O_2=S_2W_o+b_2\\ S_3=W_xX_3+W_sS_2+b_1\\ O_2=S_3W_o+b_2\\

        再假设损失函数为:

L_t=\frac{1}{2}(Y_t-O_t)^2

        训练RNN模型的本质就是求解Wx、Ws和Wo的值。进行反向传播求解模型:求解Lt取最小时,Wx、Ws和Wo的值。于是,对Lt求这三个值的偏导有:

可以看到:

        1、Lt对W0没有长期依赖问题

        2、但是对Wx、Ws求偏导时,偏导值不仅与当前的输入Xt有关,也与X0-Xt-1有关。并且这个关系是偏导间积的关系

       再将这个序列的段数扩大到n段(不再是三段),那么此时求偏导后值为:

\begin{array}{l}{​{\begin{array}{c}{​{\frac{\partial L_{t}}{\partial W_{x}}}}\end{array}=\sum_{k=0}^{t}\frac{\partial L_{t}}{\partial O_{t}}\frac{\partial O_{t}}{\partial S_{t}}\left(\prod_{j=k+1}^{t}\frac{\partial S_{j}}{\partial S_{j-1}}\right)\frac{\partial S_{k}}{\partial W_{x}}}}\\ {​{\frac{\partial L_{t}}{\partial W_{s}}\ =\ \sum_{k=0}^{t}\ \frac{\partial L_{t}}{\partial O_{t}}\ \frac{\partial O_{t}}{\partial S_{t}}\left(\prod_{j=k+1}^{t}\frac{\partial S_{j}}{\partial S_{j}-1}\right)\frac{\partial S_{k}}{\partial W_{s}}}}\end{array}

        Sj是每个时间步结合当前输入以及前时刻输入得到的信息总和,为提高信息的非线性成分以及对不必要信息进行剔除以降低梯度爆炸或消失,我们要在每一步信息传递给下一步时间块前,利用激活函数对信息进行激活处理,如下:

S_{j}=t a n h(W_{x}X_{j}+W_{s}S_{j-1}+b_{1})

        那么此时(划重点)

\frac{\partial S_{j}}{\partial S_{j-1}}=\frac{\partial (tanh(W_XX_j+W_sS_{j-1}+b_1))}{\partial S_{j-1}}=tanh'W_s 

1、如果激活函数tanh的导数小于1,那么随着累乘的增加,RNN会出现梯度消失的情况;如果激活函数tanh的导数大于1,那么随着累乘的增加,RNN会出现梯度爆炸的情况

RNN激活函数的选择

Sigmoid激活函数

公式

f(x)=\frac{1}{1+e^{-x}}

导函数图像 

分析 

1、从其导数的函数图像上可以看到,其导数的最大值只有0.25而且当x[-5,5]的范围外时其导数值就已经几乎接近于0了。这种情况会导致训练过程中神经元处于一种饱和状态,反向传播时其权重几乎得不到更新。也就是说采用这个作为RNN的激活函数,会导致梯度消失问题非常严重

2、需要进行指数运算(计算机运行得较慢),计算量大及计算复杂度高,训练耗时;指数的越大其倒数就越小,容易产生梯度消失

Tanh激活函数

公式

f(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}}

导函数图像 

分析 

1、相比于Sigmoid函数的导函数,Tanh激活函数导数值最大能达到1,在一定程度上应对梯度消失问题优于Sigmoid函数

2、但是同样要进行指数运算,并且再神经网络层数增多时同样会因为链式求导多项相乘导致梯度消失

ReLu激活函数

公式

ReLu(x)=max(x,0)

导函数图像 

分析 

1、ReLU 函数在正输入时是线性的收敛速度快计算速度快,同时符合恒等性的特点。当输入为正时,由于导数是1,能够完整传递梯度不存在梯度消失的问题(梯度饱和问题)

2、ReLU 函数在x小于0时永远等于0,在x大于0时又为x。所以在神经网络中也具有非线性的特性

3、ReLU在小于0的时候梯度为零,导致了某些神经元永远被抑制,最终造成某些特征模型学习不到;这是典型的 Dead ReLU 问题,所以需要改进随机初始化,避免将过多的负数特征送入ReLU。

总之:在上面三种常见的激活函数中,RNN模型由于存在梯度消失或爆炸问题,所以倾向于选择ReLu激活函数 

总结 

1、RNN模型相比CNN模型能够处理时间序列的问题,考虑时间点上不同输入值对目前输出值的影响

2、RNN模型存在梯度消失或爆炸的问题,导致其无法处理长期依赖问题

3、虽然可以用激活函数来缓解梯度消失爆炸问题,但RNN在处理长文本仍然存在很多弊端 


撰写文章不易,如果文章能帮助到大家,大家可以点点赞、收收藏呀~

十二月的猫在这里祝大家学业有成、事业顺利、情到财来

相关推荐

  1. 模型训练的过程(通俗易懂

    2024-04-26 08:12:02       32 阅读
  2. 常见设计模式--通俗易懂

    2024-04-26 08:12:02       24 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-26 08:12:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-26 08:12:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-26 08:12:02       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-26 08:12:02       20 阅读

热门阅读

  1. K8S Service 常见问题

    2024-04-26 08:12:02       16 阅读
  2. 2-token生成

    2024-04-26 08:12:02       12 阅读
  3. 每天学习一个Linux命令之awk

    2024-04-26 08:12:02       14 阅读
  4. mysql 意向锁

    2024-04-26 08:12:02       13 阅读
  5. 46、有向图的拓扑序列

    2024-04-26 08:12:02       12 阅读
  6. 每天学习一个Linux命令之bzip2

    2024-04-26 08:12:02       12 阅读
  7. Elasticsearch 详细介绍和经典应用

    2024-04-26 08:12:02       15 阅读
  8. VSCode 常用配置

    2024-04-26 08:12:02       11 阅读
  9. 使用rust学习基本算法(三)

    2024-04-26 08:12:02       15 阅读
  10. js中Symbol值的强制类型转换

    2024-04-26 08:12:02       14 阅读
  11. vue3 子组件实现v-model用法

    2024-04-26 08:12:02       11 阅读