计算机视觉-09:循环神经网络
循环神经网络
RNN 处理的是“当前输入依赖过去上下文”的数据。普通前馈网络每次只看一个固定输入,而 RNN 会把上一时刻的隐藏状态 带到当前时刻,与当前输入 一起计算新的隐藏状态 。因此 可以被理解为到目前为止读过的序列摘要,它既包含当前 token 的信息,也保留了一部分历史信息。
组成
循环神经网络一般用于处理序列数据,如文本和语音等。它的输入和输出的序列长度可以是任意的。循环神经网络通过中间隐藏层的循环连接来捕捉此前序列中的信息,并应用于当前的输出。

左侧是循环神经网络的单元,中间的隐藏状态随着序列处理更新,可以展开成类似右侧的形式。隐藏状态通过 来更新,其中 是变换的参数;输出则通过当前时间步的隐藏状态得到,即 得到。每个时间步使用变换的参数如 和 在序列处理的各个时间步都是共享的。
计算隐藏层时还要用到激活函数,这里使用 函数:
右图中的结构可以产生很多变种。这个结构原始的输入和输出是多对多的。如果想要将其改成多对一,可以将全部的输出经过变换产生一个最终输出,也可以直接使用最后一个时间步的隐藏状态来产生输出,因为这个隐藏状态已经包含了此前所有时间步的信息。也可以使用一对多的结构,将后续输入全部置零或者将本时间步的输出作为下一时间步的输入。
损失与反向传播
循环神经网络的损失函数可以定义为各个时间步的损失之和。当我们处理一个长序列时,在整个网络中进行反向传播会导致梯度消失或梯度爆炸,还可能会带来存储压力。为了解决这个问题,可以使用截断的反向传播(truncated backpropagation through time),即只在一定数量的时间步内进行反向传播,而不是在整个序列上进行。

如果最终输出只有一个呢?只在最后一个截断的单元计算有效函数并进行反向传播即可。最终计算图如下:

尝试推导反向传播的过程:
在每一步,有 ,其中 是每个时间步的损失函数。每一个时间步贡献的梯度是独立的,根据之前推导的矩阵乘的反向传播公式,可以得到对 的梯度为:
那么同理有:
对于隐藏状态 的梯度,需要考虑当前时间步的输出以及后续时间步的影响。当前时间步的输出对 的梯度为:
对任意时间步有
逐步展开可以得到:
可以看到,随着时间步的增加,梯度会被 反复乘积,这可能导致梯度消失或爆炸的问题。
上面的例子是使用原始公式中的矩阵运算的,实际上可以将原来的计算简化成一次矩阵乘的形式,将 和 放在一行上,将 和 放在一列上,这样计算公式简化为:
这样计算公式就只有一个参数矩阵 了。
RNN 应用

使用 RNN 进行图像描述时,先使用卷积神经网络将图像编码成一个定长的向量,然后将这个向量作为循环神经网络的输入来生成描述文本。不过计算隐藏状态的方法发生了改变,增加了一个矩阵 来处理将图像输入加到隐藏状态的计算中。后续的传播就是将每一个时间步的输出作为下一时间步的输入重复,直到生成结束 token。

可以增加中间隐藏层的层数来提升模型的表达能力,这样每个时间步的计算就变成了多层的前向传播。对于每一层的隐藏状态计算,输入是上一层的隐藏状态和当前时间步的输入。这一部分课上似乎没有深究。
Long Short-Term Memory (LSTM)
LSTM 可以先按“给普通 RNN 加了一条更容易传递长期信息的记忆通道”来理解。普通 RNN 每一步都用同一个非线性变换重写隐藏状态,长序列中梯度需要反复穿过这些变换,容易消失或爆炸;LSTM 额外维护 cell state ,并用门控机制决定旧记忆保留多少、新信息写入多少、最终对外暴露多少。

长短期记忆网络引入一个记忆元(memory cell),是一种特殊的隐状态,在网络中作为一条独立传递信息的通道。输入门 i 控制何时写入 cell,遗忘门 f 控制何时重置 cell,输出门 o 控制从 cell 读取输出信息,(Gate gate 是什么鬼)门 g 则控制写入 cell 的信息。W 将上一时间步的隐藏状态和输入组成的向量变换成四个通道的值,并经过对 i,f,o 门的 sigmoid 处理和对 g 门的 tanh 处理得到相应的门控值。cell 状态通过遗忘门和输入门的控制进行更新,最终输出由输出门控制。
更具体地说, 像一个保留比例,决定旧记忆 中哪些维度继续留下; 像写入开关,决定候选内容 中哪些维度写入 cell; 像读取开关,决定更新后的 cell 有多少暴露给隐藏状态 。这些门的值都在 到 之间,因此可以逐维地软控制信息流,而不是简单地全保留或全丢弃。

现在,i,f,o 三个门的值都被压缩到了 0 到 1 之间,且大小与输入一致,这样就可以通过门控机制来控制信息的流动。对于记忆元内容的更新,有:
其中 表示元素级乘法。遗忘门 控制了之前的记忆元内容 的保留程度,而输入门 和门 控制了新信息的写入程度。输出门 则控制了最终输出的生成:
f = 1,i = 0 时,cell 状态完全保留之前的内容;f = 0,i = 1 时,cell 状态完全被新的信息覆盖。通过调整这些门的值,LSTM 能够灵活地保留或更新信息,从而更好地捕捉长期依赖关系,缓解 RNN 中的梯度消失问题。有一个缺点是计算复杂度变高了,权重矩阵的学习成本更高了。





