LSTM及其激活函数理解

-------本文仅为学习笔记,不做任何商业用途-------

一、LSTM简介

    长短期记忆网络(LSTM)是一种时间循环神经网络,是为了解决一般的RNN(循环神经网络)存在的长期依赖问题所设计出来的,可以解决RNN中的梯度消失和梯度爆炸的问题。
    长短期记忆网络由于其独特的设计结构适合处理和预测时间序列中间隔和延迟非常长的重要事件。相比于传统的RNN,LSTM的参数会随着输入序列而改变,同时会选择记住和遗忘输入序列里的相关信息。LSTM可以用于不分段的连续手写识别上,语音识别,自然语言处理以及计算机视觉领域。在最近阅读的一篇关于计算机视觉中human action recognition的论文中,就依托于LSTM方法对视频流里每帧图像动作进行了提取,得到了很不错的结果。

二、LSTM结构介绍

2.1从LSTM整体出发

    LSTM是一种特殊的RNN网络,所有的循环神经网络都具有神经网络的重复模块链的形式。在RNN中,每个模块内只包含了单个tanh层,但在LSTM的链式结构中,每个模块内包含了四个网络层,具体的对比图如下所示。

    之后,本文结合相关资料,对LSTM的每一个网络层进行详细介绍。

2.2 “LSTM细胞”介绍

    根据前面的介绍,LSTM本质上还是一个RNN循环神经网络,但它具有内部的LSTM细胞循环(自环),这个细胞是LSTM的核心所在,用贯穿细胞的水平线表示。

    LSTM网络通过一种被称为门的结构对细胞的状态进行删除或添加信息,而在一个LSTM里包含三个门控制细胞状态,其中包括遗忘门、输入门和输出门。值得一提的是,LSTM中贯穿细胞的水平线CtC_tCt​代表了其中的长时记忆,下面的hth_tht​代表了工作记忆或短时记忆

2.3逐步理解LSTM

2.3.1遗忘门

    首先,LSTM的首要工作就是决定细胞状态需要丢弃的信息,这也就是遗忘门的作用。因为在一个序列数据里,不同的数据随着time_step的变化,前后侧重点会有所变化,忘记不需要及不重要的信息,这也是遗忘门产生的原因。

    根据上图,首要的工作是要对输入数据ht−1h_{t-1}ht−1​和xtx_txt​进行拼接操作,比如说xtx_txt​是15位的向量,ht−1h_{t-1}ht−1​是60位的向量,那么拼接起来就是75位的向量进行输入。之后,通过权重矩阵与WfW_fWf​相乘并加上偏置项bfb_fbf​通过sigmoid单元进行处理。

    为什么要用sigmoid函数进行激活呢?

    对于sigmoid函数来说,它是平滑的阶梯函数,可导;它可以将任何值转化为0~1之间,用于二分类。其公式和图像如下所示(红色为原函数、蓝色为导函数):


    可以看到,sigmoid函数的输出为0-1的值,这代表具体有多少的信息能够流过sigmoid层,0表示不能通过(丢弃),1表示能通过(保留)。

2.3.2输入门

    在处理完哪些信息需要删除后,就到了输入门的操作部分。首先,需要考虑给细胞新增添的信息(即需要给细胞更新什么)。它利用ht−1h_{t-1}ht−1​和xtx_txt​通过一个tanh层得到新的候选细胞信息Ct~\widetilde {C_t}Ct​​,这些新的信息会被更新到细胞信息中,如下图所示。

    在进行完上述步骤后,需要对旧的细胞信息Ct−1C_{t-1}Ct−1​进行更新完善,变为新的细胞信息CtC_tCt​。而更新的原则则是将通过遗忘门的旧细胞信息与通过输入门的候选细胞信息Ct~\widetilde {C_t}Ct​​相结合得到新的细胞信息CtC_tCt​,具体操作步骤如下所示。

    为什么要用tanh函数进行激活呢?

    对于tanh函数(即双曲正切)来说,它类似于幅度增大的sigmoid,输出范围为[-1,1],且导函数的取值范围为0-1之间,由于sigmoid的0到1/4,在一定程度上减轻了梯度消失的问题;同时,它需要做对数据的处理,不决定取舍,通过扩大输出范围进而决定输出放大或缩小。当然对于有更好效果,更便于计算的激活函数,也可以使用。其公式和图像如下所示(红色为原函数、蓝色为导函数):

2.3.3输出门

    在更新完细胞信息后,需要根据输入的ht−1h_{t-1}ht−1​和xtx_txt​来判断需要输出细胞的哪些状态特征,而这就要输出门作为保安进行判断。将ht−1h_{t-1}ht−1​和xtx_txt​经过输出门的sigmoid激活函数得到判断条件(即哪些细胞信息需要输出),然后将细胞状态信息CtC_tCt​经过tanh层得到范围为[-1,1]的向量,然后与输出门得到的判断条件进行相乘得到该RNN模块(time_step=t)的输出,具体步骤如下图。

三、LSTM图示理解

    在查阅了相关资料后,发现了一副动图可以很好的表征和解释RNN,帮助更好的理解,这里引用其动图来表示RNN的工作原理。
    作者:刘大力
    链接:https://www.zhihu.com/question/41949741/answer/385019773
    来源:知乎

四、总结

    通过查阅相关资料,本文从RNN入手,对LSTM与RNN进行了对比,并对LSTM进行了详细的拆分介绍,充分理解了LSTM的相关结构原理,而且其对有长时间记忆需求的任务来说十分好用,当然对于其变形的其他结构网络也有很多,将在后面对用过的进行介绍。

Reference

[1]https://baike.baidu.com/item/%E9%95%BF%E7%9F%AD%E6%9C%9F%E8%AE%B0%E5%BF%86%E4%BA%BA%E5%B7%A5%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C/17541107?fromtitle=LSTM&fromid=17541102&fr=aladdin
[2]https://www.jianshu.com/p/95d5c461924c
[3]https://www.zhihu.com/question/41949741
[4]https://www.jianshu.com/p/857d5859d2cc
[5]https://www.zhihu.com/question/61265076

注:本文所引用的图都已在Reference中进行说明。

LSTM及其激活函数理解相关推荐

  1. LSTM 01:理解LSTM原理及训练方法

    本文代码运行环境: cudatoolkit = 10.1.243 cudnn = 7.6.5 tensorflow-gpu = 2.1.0 keras-gpu = 2.3.1 相关文章 LSTM 01 ...

  2. 深度学习(四)——RNN, LSTM, 神经元激活函数进阶

    https://antkillerfarm.github.io/ 词向量 word2vec/doc2vec的缺点(续) 2.虽然我们一般使用word2vec/doc2vec来比较文本相似度,但是从原理 ...

  3. 常用激活函数理解与总结

    从左到右画sigmoid曲线,先是平的梯度消失--> zero-centered -->指数运算 引言 学习神经网络的时候我们总是听到激活函数这个词,而且很多资料都会提到常用的激活函数,比 ...

  4. pytorch lstm crf 代码理解 重点

    好久没有写博客了,这一次就将最近看的pytorch 教程中的lstm+crf的一些心得与困惑记录下来. 原文 PyTorch Tutorials 参考了很多其他大神的博客,https://blog.c ...

  5. pytorch lstm crf 代码理解

    好久没有写博客了,这一次就将最近看的pytorch 教程中的lstm+crf的一些心得与困惑记录下来. 原文 PyTorch Tutorials 参考了很多其他大神的博客,https://blog.c ...

  6. 深度学习中几种常见的激活函数理解与总结

    学习神经网络的时候我们总是听到激活函数这个词,而且很多资料都会提到常用的激活函数,比如Sigmoid函数.tanh函数.Relu函数.肯定很多人刚开始和我一样一头雾水,接下来就让我们详细了解一下激活函 ...

  7. 【Pytorch】时间序列中LSTM的输入输出理解

    Pytorch中的nn.LSTM Pytorch中LSTM总共有7个参数,前面3个是必须输入的 input_size – The number of expected features in the ...

  8. Sigmoid,tanh,Relu,Leaky ReLu,ELU,GeLu 激活函数理解

    目录 1 神经网络为什么需要非线性激活函数? 2 Sigmoid 2.1缺陷 2.1.1 梯度消失 2.2.2 Output非zero-centered 3 Tanh 3.1 缺陷 4 ReLu 4. ...

  9. lstm keras 权重 理解_Keras 作者:TF 2.0+Keras 深度学习研究你需要了解的 12 件事...

    [新智元导读]Keras 作者 François Chollet 今天发表了一系列推文,如果你使用 TensorFlow 2.0 + Keras 做深度学习研究,这里有你需要知道的一切. Tensor ...

最新文章

  1. 关于JQuery中的ajax请求或者post请求的回调方法中的操作执行或者变量修改没反映的问题...
  2. SAP SD基础知识之流程概览
  3. 悟空分词的搜索和排序源码分析之——搜索
  4. python源代码不需要编译成什么-python程序不需要编译吗
  5. 01.jupyter环境安装
  6. 阅读SSM项目之scm【第一篇】
  7. linux服务器云防火墙配置文件,Linux云服务器防火墙配置之Firewalld
  8. Security+ 学习笔记4 社会工程攻击
  9. HDU 4289 Control
  10. vue视频播放——vue-video-player
  11. 结点电压法的c语言实现,节点电压法该如何理解_节点电压法例题
  12. 强化学习#code3
  13. Machine Learning-L13-频繁模式挖掘
  14. 2019新版《黑马web前端课程+项目实践课程》
  15. 六一快乐!管她几岁,快乐万岁!
  16. 打印一只Nyan Cat(彩虹猫)(C++)3.0[多色版]
  17. 南阳市有没有达内PHP班,南阳达内php培训班怎么样
  18. Apollo与ROS
  19. 【知识点】web安全怎么做
  20. [回归分析][11]--共线性数据的分析

热门文章

  1. uniapp自定义弹框
  2. JavaScript , jQuery
  3. 统计Windows系统日志
  4. 配置logstash收集TCP的日志
  5. Android内容提供者ContentProvider总结
  6. srand函数--为rand函数设置伪随机数起点
  7. 【第一章 第1节】Web网页的基本概念
  8. Element table 斑马线设置
  9. 2018年12月六级考试真题笔记
  10. slim linux,SLiM (简体中文)