李宏毅学习笔记13.RNN Part I

本文探讨了循环神经网络(RNN)及其变种长短时记忆网络(LSTM)在SlotFilling任务中的应用,通过实例展示了如何利用RNN解决序列分类问题,并深入解析了LSTM的结构与工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

监督学习先放一下,先来学习RNN,本节课先从一个订票系统实例出发,得到前馈神经网络在相同输入只能相同输出的缺点,引入了RNN来解决这个问题。
接下来讲解了RNN常见的几种结构,尤其重点讲解了LSTM,并给出了LSTM计算实例。
公式输入请参考:在线Latex公式

实例应用引入

Slot Filling

实例论文
在这里插入图片描述
slot不知道怎么翻译,卡槽,槽位?
比如在一个订票系统上,我们的输入 “I would like to arrive Taipei on November 2 n d 2^{nd} 2nd” 这样一句话(序列),我们设置几个槽位(Slot),希望算法能够将关键词’Taipei’放入目的地(Destination)槽位,将November和2nd放入到达时间(Time of Arrival)槽位,将其他词语放入其他(Other)槽位,实现对输入序列的一个归类,以便后续提取相应信息。能否用前馈神经网络(Feedforward Neural Network)来解决这个问题?
在这里插入图片描述

向量化

我们首先要对输入序列向量化,将每一个输入的单词用向量表示,可以使用 One-of-N Encoding 或者是 Word hashing 等编码方法,输出预测槽位的概率分布。
在这里插入图片描述
这个在读DEEP LEARNING REVIEW笔记一文中有写。
还有一种改进方法:Beyond 1-of-N encoding
1-of-N encoding中有很多词可能都没有见过,没有在词典里面,这个时候就可以放到Other这个dimension里面。
在这里插入图片描述
例如:“Gandalf” 甘道夫,“Sauron”索伦不在词典中,被分到other中。
也可以用词汇的数组来表示,这样就不会出现word不在词典中里面。例如“apple”里面有“app”、“ppl”、“ple”,这三个dimension是1,其他的是0。

前馈训练结果缺点

把词汇表示为vector之后,就可以把句子丢到上面那个前馈神经网络里面去。
在这里插入图片描述
但是这样做的话,有个问题就出现了。如果现在又有一个输入是 “Leave Taipei on November 2 n d 2^{nd} 2nd”,这里Taipei是作为一个出发地(Place of Departure),所以我们应当是把Taipei放入Departure槽位而不是Destination 槽位,但对于前馈网络来说,对于同一个输入,输出的概率分布应该也是一样的,不可能出现既是Destination的概率最高又是Departure的概率最高。
在这里插入图片描述
所以我们就希望能够让神经网络拥有“记忆”的能力,能够根据之前的上下文信息(在这个例子中是Arrive或Leave),相同的输入,得到不同的输出。将两段序列中的Taipei分别归入Destionation槽位和Departure槽位。这种有记忆的神经网络就是RNN。

RNN结构及小实例

RNN结构

先来看RNN的结构以及解决上面订票的问题的过程。
在这里插入图片描述
其中蓝色方框就是用于存储的隐藏层的输出的单元。下一次计算的时候,除了考虑 x 1 x_1 x1 x 2 x_2 x2之外,还需要考虑 a 1 a_1 a1 a 2 a_2 a2

RNN小实例

假设有如下的神经网络结构,而且所有的权重都为1,没有bias,所有的激活函数都为线性的。
在这里插入图片描述
假设输入是一个sequence: [ 1 1 ] [ 1 1 ] [ 2 2 ] . . . . . . \begin{bmatrix} 1\\ 1 \end{bmatrix}\begin{bmatrix} 1\\ 1 \end{bmatrix}\begin{bmatrix} 2\\ 2 \end{bmatrix}...... [11][11][22]......
1、在计算之前,先初始化,假设 a 1 a_1 a1 a 2 a_2 a2都为0, x 1 x_1 x1 x 2 x_2 x2都为1。
2、接下来绿色神经元的output为2和2,同时将输出存到 a 1 a_1 a1 a 2 a_2 a2,即 a 1 a_1 a1 a 2 a_2 a2都等于2,然后,红色神经元的output为4和4。即整个神经网络的输出是:
[ 4 4 ] \begin{bmatrix} 4\\ 4 \end{bmatrix} [44]

3、第二次计算如下图所示:
在这里插入图片描述
这个时候绿色神经元不但接收 x 1 x_1 x1 x 2 x_2 x2、还接收 a 1 a_1 a1 a 2 a_2 a2的值,所以从图中可以看出来每个绿色神经元的输出等于 x 1 + x 2 + a 1 + a 2 = 2 + 2 + 1 + 1 = 6 x_1+x_2+a_1+a_2=2+2+1+1=6 x1+x2+a1+a2=2+2+1+1=6,同时会把绿色的输出存到 a 1 a_1 a1 a 2 a_2 a2
整个神经网络的输出:
[ 4 4 ] [ 12 12 ] \begin{bmatrix} 4\\ 4 \end{bmatrix}\begin{bmatrix} 12\\ 12 \end{bmatrix} [44][1212]
这个时候可以看到即使相同的输入 [ 1 1 ] \begin{bmatrix} 1\\ 1 \end{bmatrix} [11],他的输出也是不一样的。
4、接下来的输入是 [ 2 2 ] \begin{bmatrix} 2\\ 2 \end{bmatrix} [22]结果如图:
在这里插入图片描述
可以看出来如果改变输入sequence的顺序,输出是会变化的。

RNN解决Slot Filling问题

根据刚才的小例子,注意的是,下面不是三个神经网络,而是同一个神经网络,老师非常贴心的相同的weight都是对应相同颜色。
在这里插入图片描述
考虑不同的输入,由于第一个词不一样,所以可以看到 a 1 a^1 a1不同,因此结果不同,结果如下:
在这里插入图片描述

RNN的深度问题

上面的例子中的RNN只有一层隐藏层,如果要加深度是增加绿色部分就可以:
在这里插入图片描述

RNN的常见变种

Elman Network

在这里插入图片描述

Jordan Network

在这里插入图片描述
可以看到Jordan network存的不算隐藏层的输出,而是整个网络的输出,论文控给出了大概结论:Jordan network的效果好,因为在Elman network中隐藏层是很难控制的,没有办法决定它学到什么样的information;在Jordan network中y是有target的,比较清楚中间存放的是什么东西

Bidirectional RNN

在这里插入图片描述
之前只有一个方向的RNN在产生 y t + 1 y^{t+1} yt+1的时候,只看过 x 1 x^1 x1 x t x^t xt的输入;而Bidirectional RNN不但看过 x 1 x^1 x1 x t x^t xt的输入,还看了句尾一直到 x t + 1 x^{t+1} xt+1的输入。
To determine y i y_i yi, you have to consider a lot ……
You should see the whole sequence

LSTM( Long Short-term Memory)长短时记忆

Normal neuron: 1 input, 1 output
LSTM neuron: 4 input, 1 output
在这里插入图片描述
当外界信息想要写入Memory Cell必须先经过Input gate,input gate打开的时候才能把值写入Memory Cell,Input gate打开还是关闭状态是LSTM自己学的。同样原理还有Forget Gate,Ourput Gate。
PS:冷知识,Long Short-term的-要放在short和term之间,因为从原理上看,整个Memory还是短期的,只不过整个这个短期Memory比较长(只要你的Forget gate不format Memory cell里面的值都会一直保留)。
在这里插入图片描述
在上图中, z i z_i zi z 0 z_0 z0都是向量scalar,三个门使用的激活函数通常是sigmoid函数,因此输出的范围为0到1,代表门打开的程度,1是打开,0是关闭。上图中的Memory Cell中本来是 c c c,后来经过右边公式操作后变成 c ′ c' c。注意:Forget Gate打开的时候表示记得,关闭代表忘记。

LSTM实例

输入是三维vector [ x 1 x 2 x 3 ] \begin{bmatrix} x_1\\ x_2\\ x_3 \end{bmatrix} x1x2x3,输出是一维vector y y y,神经网络中只有一个LSTM的CELL。
当输入中的 x 2 = 1 x_2=1 x2=1 x 1 x_1 x1的值就会被累加写到Memory中;
当输入中的 x 2 = − 1 x_2=-1 x2=1,Memory中的值就会Reset;
当输入中的 x 3 = 1 x_3=1 x3=1,output gate才会打开,才输出Memory中的内容
在这里插入图片描述
注意:第一次出现 x 2 = 1 x_2=1 x2=1(蓝色框),就把当前 x 1 = 3 x_1=3 x1=3写入下一个时间点的memory中;
第二次出现 x 2 = 1 x_2=1 x2=1,,就把当前 x 1 = 4 x_1=4 x1=4 m e m o r y = 3 memory=3 memory=3累加,变成 m e m o r y = 7 memory=7 memory=7
第一次出现 x 2 = − 1 x_2=-1 x2=1(紫色框),就把下一个时间点的memory清空;
当出现 x 3 = 1 x_3=1 x3=1(绿色框),就把memory里面的值输出。
按上面的规则来实际计算一下:
在这里插入图片描述
输入要乘以权重加上bias才是输出,权重本来是应该用GD学习得来,现在暂且当做已知条件(蓝色数字)。
存在Memory(中间那个圈圈)的初始值为0
下面开始输入第一组 [ x 1 x 2 x 3 ] \begin{bmatrix} x_1\\ x_2\\ x_3 \end{bmatrix} x1x2x3,即右下角第一组 [ 3 1 0 ] \begin{bmatrix} 3\\ 1\\ 0 \end{bmatrix} 310
在这里插入图片描述
输入部分: 3 × 1 + 1 × 0 + 0 × 0 + 1 × 0 = 3 3×1+1×0+0×0+1×0=3 3×1+1×0+0×0+1×0=3通过线性激活函数g得到3
Input Gate: 3 × 0 + 1 × 100 + 0 × 0 + 1 × ( − 10 ) = 90 3×0+1×100+0×0+1×(-10)=90 3×0+1×100+0×0+1×(10)=90通过sigmoid函数约等于1,Input Gate打开,输入的3往下走
Forget Gate: 3 × 0 + 1 × 100 + 0 × 0 + 1 × 10 = 110 3×0+1×100+0×0+1×10=110 3×0+1×100+0×0+1×10=110通过sigmoid函数约等于1,Forget Gate打开,memory记录3,然后经过线性激活函数h得到3
Output Gate: 3 × 0 + 1 × 0 + 0 × 100 + 1 × ( − 10 ) = − 10 3×0+1×0+0×100+1×(-10)=-10 3×0+1×0+0×100+1×(10)=10通过sigmoid函数约等于0,Output Gate关闭,输出y为0。
同理,下面开始输入第二组r [ x 1 x 2 x 3 ] \begin{bmatrix} x_1\\ x_2\\ x_3 \end{bmatrix} x1x2x3,即右下角第二组 [ 4 1 0 ] \begin{bmatrix} 4\\ 1\\ 0 \end{bmatrix} 410

在这里插入图片描述
与第一次不一样的地方是Forget Gate把传过来的4累加到memory中变成了7。
第三组输入 [ 2 0 0 ] \begin{bmatrix} 2\\ 0\\ 0 \end{bmatrix} 200
在这里插入图片描述
第四组输入 [ 1 0 1 ] \begin{bmatrix} 1\\ 0\\ 1 \end{bmatrix} 101
在这里插入图片描述
第四组输入 [ 3 − 1 0 ] \begin{bmatrix} 3\\ -1\\ 0 \end{bmatrix} 310
在这里插入图片描述
这里Forget Gate计算后的值为-90,经过sigoid后变0,Forget Gate会关闭,并清空memory中的值。

普通NN变身LSTM过程

假设现在有这样一个神经网络:
在这里插入图片描述
变身为LSTM只要Simply replace the neurons with LSTM,就变成:
在这里插入图片描述
可以看出来神经元一样的情况下,LSTM的参数是普通RNN参数的4倍。

LSTM与RNN啥关系

上面的图貌似看不出来LSTM是RNN,现在整理一下:
在这里插入图片描述
假设我们有一整排的LSTM神经元,他们每个memory cell里面都存了一个值scalar。把这些scalar连起来,可以写成 c t − 1 c^{t-1} ct1,现在在时间点 t t t输入一个vector: X t X^t Xt
这个 X t X^t Xt会先乘上一个matrix,做linear的transform,变成vector: Z Z Z,它的dimension对应的是每一个LSTM神经元输入,所以这个dimension的大小等于LSTM神经元的数量;
这个 X t X^t Xt会先乘上一个matrix,做linear的transform,变成vector: Z i Z^i Zi,它的dimension的大小等于LSTM神经元的数量, Z i Z^i Zi对应于LSTM神经元的input gate;
同理 Z f Z^f Zf对应于LSTM神经元的forget gate;
同理 Z o Z^o Zo对应于LSTM神经元的output gate;
整个计算过程可以表示为下图,注意右边的四个绿色的东西是向量中的一个dimension:
在这里插入图片描述
X t X^t Xt X t + 1 X^{t+1} Xt+1时间点的LSTM计算如下图:
在这里插入图片描述
这里比上面的图要多了两个东西,输入的地方除了 X t X^t Xt之外,还会接入上一个LSTM神经元隐藏层的输出 h t − 1 h^{t-1} ht1,还会把memory cell中的值 c t − 1 c^{t-1} ct1(红色箭头表示,这个叫peephole),也就是说输入的东西由三个vector并在一起,乘上不同的transform,操控不同的gate。
上面是单层LSTM,下面多层LSTM感受一下。。。
在这里插入图片描述
老师表示看不懂没关系,会调包就可以。
在这里插入图片描述

### 李宏毅机器学习课程中关于RNN的笔记内容概述 李宏毅机器学习课程中,RNN(循环神经网络)的相关内容涵盖了基础理论、实际应用以及解决梯度消失问题的方法。以下是相关内容的详细总结: #### 一、RNN的基本概念与结构 循环神经网络(Recurrent Neural Network, RNN)是一种用于处理序列数据的神经网络模型[^1]。其核心特点是能够保存先前计算的状态信息,并将其作为当前输入的一部分参与计算。这种机制使得RNN可以捕捉时间序列中的依赖关系。例如,在自然语言处理任务中,RNN可以通过记住前面的词来预测下一个词。 ```python import torch import torch.nn as nn class SimpleRNN(nn.Module): def __init__(self, input_size, hidden_size, output_size): super(SimpleRNN, self).__init__() self.hidden_size = hidden_size self.rnn = nn.RNN(input_size, hidden_size, batch_first=True) self.fc = nn.Linear(hidden_size, output_size) def forward(self, x): h0 = torch.zeros(1, x.size(0), self.hidden_size).to(x.device) out, _ = self.rnn(x, h0) out = self.fc(out[:, -1, :]) return out ``` #### 二、双向RNN(Bidirectional RNN) 为了同时考虑前文和后文的信息,提出了双向RNN(Bidirectional RNN)。该模型通过两个独立的隐藏层分别从前向后和从后向前处理输入序列,最终将两者的结果合并以获得更丰富的上下文信息[^3]。 #### 三、长短时记忆网络(LSTM) 尽管RNN在理论上可以捕捉长距离依赖关系,但在实践中由于梯度消失或爆炸问题,通常难以有效建模长序列。为此,提出了长短时记忆网络(Long Short-Term Memory, LSTM),它通过引入门控机制(输入门、遗忘门、输出门)解决了这一问题[^2]。 #### 四、梯度消失问题及其解决方案 RNN在训练过程中容易遇到梯度消失问题,这会导致模型无法学习到长距离依赖关系。为了解决这一问题,除了使用LSTM外,还可以通过以下方法进行改进: - 使用残差连接(Residual Connections)。 - 应用正则化技术,如Dropout。 - 初始化权重矩阵以改善梯度传播[^4]。 #### 五、RNN的应用场景 RNN广泛应用于自然语言处理领域,包括但不限于: - 机器翻译:将一种语言的句子转换为另一种语言。 - 情感分析:判断文本的情感倾向。 - 文本生成:根据给定的前缀自动生成后续内容。 --- ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

oldmao_2000

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

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

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

打赏作者

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

抵扣说明:

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

余额充值