机器学习(李宏毅)——RNN

一、前言

本文章作为学习2023年《李宏毅机器学习课程》的笔记,感谢台湾大学李宏毅教授的课程,respect!!!

二、大纲

  • 引例
  • RNN历史
  • 基本思想
  • RNN变形
  • RNN训练

三、引例

学习RNN之前先看一个例子:

假设要做一个火车订票系统(ticket booking system),给机器输入一句话"I would like to arrive Taipei on November 2nd. ",期望机器能够自动识别"目的地"和"到达时间",这该如何做到呢?

  • 方法:训练一个神经网络(Feedforward network ),当输入看到Taipei时候就应该输出这是地名,看到November 2nd就应该输出时间,所以地名和时间就像是这句话的插槽(slot filling)一样。

但这个方法会有一个问题,比如我输入"leave Taipei on November 2nd. ",同一个模型同样可以识别到地点和时间,但是这句话地点则是出发地,时间是出发时间。所以我们要把上下文语义信息关联上去,于是就有了RNN,也可以理解为有记忆的神经网络模型。

四、RNN历史

RNN称为递归神经网络,发展历史如下:

  • 1980-1990 年代:RNN 的基础理论建立,但训练困难。
  • 1997 年:LSTM 诞生,解决了梯度消失问题,使 RNN 变得实用。
  • 2014-2015 年:GRU 被提出,RNN 开始大规模应用于 NLP 任务。
  • 2017 年后:Transformer 取代RNN,成为主流 NLP 解决方案。

虽然现在的主流是Transformer,但还是有必要学习下RNN的经典算法。

五、基本思想

  • 隐藏层的输出被存储在记忆里;
  • 存储的记忆看做是输入;
    实际的计算过程如下:

    说明:
    假设上图神经网络所有权重都是1,没有bias,所有的激活函数都是linear的。
    RNN的基本思想就是将隐藏层的输出存在记忆中(memory)作为下一次的输入,计算过程如上gif图。
    同样的结构叠成多层,接起来变成如下的结构:

    每个位置的输入都是看过上次输出的memory(起始点除外)。
    当然还可以叠多层,让其越叠越深,结构如下:

六、RNN变形

1.双向RNN

Bidirectional RNN

双向的递归神经网络,例如输入的一个句子,使用RNN正序算一遍句子的每个位置的输出,逆序再算一遍每个位置的输出,最终双向结果拼接起来一块作为输出,这就是Bidirectional RNN。优点是考虑了双向的语义信息。

2.LSTM(Long Short-term Memory)

又名长短时记忆递归神经网络,精髓是让机器自己决定输入、记忆、输出这三件事情。

  • 输入:要不要输入;
  • 记忆:要更新记忆还是擦除记忆;
  • 输出:要不要输出。

对应起来就是控制门的思想,有三个控制门,分别是:输入门、遗忘门、输出门。如下图:

进一步拆解LSTM原理如下:

  • step1:输入一分为四,分别是z,zi,zf,zo,对应输入、输入门、遗忘门和输出门。激活函数式sigmoid,将输出的数值值域控制在0~1之间,好处就是输出是否关系;
  • step2:输入:输入z经过sigmoid函数g得到g(z);
  • step3:输入门:zi经过sigmoid函数f得到f(zi);
  • step4:将输入和输入门得到的值g(z)和f(zi)做multiply相乘得到输出g(z)f(z);
  • step5:遗忘门:zf经过sigmoid函数f得到f(zf),决定了记忆c是擦除还是保留。记忆c和f(zf)相乘再和g(z)f(z)相加得到c'。
  • step6:输出门:zo经过sigmoid函数f得到f(zo);
  • step7:最终输出:c'经过sigmoid函数h得到h(c'),然后再和f(zo)相乘得到a;

以上就是LSTM的计算原理了,下面是实际的计算过程演示:

用一个结构图来表达就是如下这样:

将多个这样的单元块接起来就会变成:

实做过程中还会把前一个时间点的记忆c和h输出当做下一次的输入,改写成:

更多层的接起来就像是下图这样:

看着虽然复杂,但基本的思想还是比较简单直接。

七、RNN训练

RNN的训练并非是容易的事情,虽然用的还是Backpropagation through time (BPTT)和Gradient Decent。

  • Backpropagation through time (BPTT) 进阶版的反向传播方法
  • Gradient Decent 梯度下降方法

实做过程中,RNN训练loss曲线比较崎岖震荡,如下图:

形象在图上表达就是悬崖峭壁,如果一脚踩在悬崖,一脚踩在谷底,直接飞了,也就是梯度爆炸的现象。

那如何解决呢?

有一招说穿不值钱,就是clipping,碰到悬崖的壁时候就不要乱蹦跶了,该参数就不要再更新乱动了,以免梯度爆炸。

举个例子,进一步形象说明一下:

已知条件 :输入为[1 0 0 ... 0],权重都设为1,memory为w,有考虑的memory的最后的输出就是w999
假设情况

情况1:

1、如果w=1,y1000 = w999=1。

2、改变一点点的话,如果w=1.01,y1000 = w999≈20000。

这种情况就是变量只改变了一丢丢,梯度却是改变了相当大,说明这里相当崎岖,极端下对应的就是上图悬崖情况,也就是梯度爆炸,当然这里不一定爆炸。

情况2:

1、如果w=0.99,y1000 = w999≈0。

2、如果w=0.01,y1000 = w999≈0。

这种情况说明这里是个非常平坦的地方,对应悬崖底下的平原地区,基本上自变量改变梯度还是趋近于零,这种现象也称为梯度消失。

以上例子辅助理解梯度爆炸和梯度消失情况,这也是RNN训练遇到的困难。

然而,上述的LSTM是可以解决梯度消失问题,它的做法是让error face都变得崎岖,但是解决不了梯度爆炸问题。

通俗讲:普通 RNN 就像黑板,写了一会儿就被覆盖,信息很快消失。而 LSTM 让信息流经过"笔记本"存储,并且通过"橡皮擦"和"高亮笔"合理管理信息,确保真正重要的东西可以长期保留,从而避免了梯度消失的问题。

相关推荐
Francek Chen7 分钟前
【现代深度学习技术】注意力机制05:多头注意力
人工智能·pytorch·深度学习·神经网络·注意力机制
犬余17 分钟前
模型上下文协议(MCP):AI的“万能插座”
人工智能·mcp
芯盾时代1 小时前
数据出境的安全合规思考
大数据·人工智能·安全·网络安全·信息与通信
Sylvan Ding1 小时前
PyTorch Lightning实战 - 训练 MNIST 数据集
人工智能·pytorch·python·lightning
大白技术控1 小时前
浙江大学 deepseek 公开课 第三季 第3期 - 陈喜群 教授 (附PPT下载) by 突破信息差
人工智能·互联网·deepseek·deepseek公开课·浙大deepseek公开课课件·deepseek公开课ppt·人工智能大模型
Silence4Allen1 小时前
大模型微调指南之 LLaMA-Factory 篇:一键启动LLaMA系列模型高效微调
人工智能·大模型·微调·llama-factory
江鸟19981 小时前
AI日报 · 2025年05月11日|传闻 OpenAI 考虑推出 ChatGPT “永久”订阅模式
人工智能·gpt·ai·chatgpt·github
weifont1 小时前
Ai大模型训练从零到1第一节(共81节)
人工智能
kyle~1 小时前
C++匿名函数
开发语言·c++·人工智能