Mamba1 RNN
一、 概述
RNN用于处理序列数据。在传统的神经网络模型中,是从输入层到隐藏层再到输出层,层与层之间是全连接的,每层之间的节点是全连接的,层内的节点是无连接的。但是这种普通的神经网络对于很多问题却是无能为力。例如,你要预测下一个单词是什么,一般需要考虑前面输入的上下文信息。RNN之所以称为循环神经网络,具体表现为网络会对前面的信息进行记忆并应用到当前输出的计算中,即隐藏层之间的节点不再是无连接而是有连接的,并且隐藏层的输入不仅包括输入层的输入还包括上一时刻隐藏层的输出。理论上,RNN能够对任意长度的序列数据进行处理。但在实践中,为了降低复杂度,会假设当前状态只与前面几个状态相关。
RNN结构
RNN中有多种结构:
1. one-to-one
one-to-one是最基本的单层网络,输入是x,经过变换Wx+b和激活函数f得到输出y.
2. one-to-n
one-to-one 结构用于处理:
- 从图像中生成文字,输入的x是图像的特征,而输出的n序列y是一段文字。
- 从类别生成语音或音乐。
只有第一个阶段有输入。
将输入信息x作为每个阶段的输入:
3 n-to-n
最经典的RNN结构,输入、输出都是长序列数据。
假设输入为:
X
=
[
x
1
,
x
2
,
x
3
,
x
4
]
X=[x_1,x_2,x_3,x_4]
X=[x1,x2,x3,x4],每个x是一个单词的词向量。
为了建模序列问题,RNN引入了隐藏状态h的概念,h可以对序列形状的数据提取特征,接着再转换为输出。
先从
h
1
h_1
h1的计算看:
h
2
h_2
h2和
h
1
h_1
h1类似。需要注意的是,在计算时,每一步使用的参数U、W、b都是一样的,也就是说每个步骤的参数都是共享的,这是RNN的重要特点。
依次计算剩余的步骤:
下面介绍一下由隐藏状态转换成输出y的步骤
一个箭头就表示对对应的向量做一次类似
f
(
W
x
+
b
)
f(Wx+b)
f(Wx+b)的线性变换,对于RNN来说,这里的箭头就表示对
h
1
h_1
h1进行一次变换,得到输出
y
1
y_1
y1。
剩下的输出类似进行:
上述就是经典的RNN结构,它的输入是
x
1
,
x
2
,
.
.
.
,
x
n
x_1,x_2,...,x_n
x1,x2,...,xn,输出为
y
1
,
y
2
,
.
.
.
,
y
n
y_1,y_2,...,y_n
y1,y2,...,yn,也就是说输入和输出序列是等长的。由于这个限制的存在,经典的RNN使用范围较小,但也有一些问题适合经典的RNN结构建模,如:
- 视频帧分类,因为要对每一帧进行计算,因此输入和输出序列等长。
- 输入为字符,输出为下一个字符的概率。
4. n-to-one
输入:一个序列
输出:一个值
相较于RNN,实际上只在最后一个h上进行输出变换就可以了:
应用:处理序列分类问题。如输入一段文字判别它所属的类别,输入一个句子判断其情感倾向,输入一段视频判断它的类别。
三. RNN的数学原理
一个典型的RNN
在图中:有一条单向流动的信息流是从输入单元流向隐藏单元,与此同时另一条单向流动的信息流从隐藏单元到达输出单元。在某种情况下,RNNs会打破后者,引导信息从输出单元返回隐藏单元,这些被称为Back Projects,并且隐藏层的输入还包括上一层的隐藏状态,即隐藏层内的节点可以相互连接。
右侧为计算时便于理解而产生的结构,简单说,x为输入层,o为输出层,s为隐藏层。而t指的是第几次计算;W、V、U为权重,其中计算第t次的隐藏层的状态为:
s
t
=
f
(
U
∗
x
t
+
W
∗
s
t
−
1
)
s_t=f(U*x_t+W*s_{t-1})
st=f(U∗xt+W∗st−1)
实现当输入结果与之前的计算挂钩的目的。
RNN的前向传播满足以下公式:
t
i
=
W
h
x
x
i
+
W
h
h
h
i
−
1
+
b
h
t_i = W_{hx}x_i+W_{hh}h_{i-1}+b_h
ti=Whxxi+Whhhi−1+bh
h
i
=
e
(
t
i
)
h_i = e(t_i)
hi=e(ti)
s
i
=
W
y
h
h
i
+
b
y
s_i = W_{yh}h_i+b_y
si=Wyhhi+by
y
^
=
g
(
s
i
)
\hat{y}=g(s_i)
y^=g(si)
损失函数为重构误差:
l
o
s
s
=
∑
i
∣
∣
y
i
^
−
y
i
∣
∣
2
2
loss=\frac{\sum_i||\hat{y_i}-y_i||^2}{2}
loss=2∑i∣∣yi^−yi∣∣2