RNN
循环神经网络(Recurrent Neural Network,RNN)是一种用于处理序列数据的神经网络。相比一般的神经网络来说,他能够处理序列变化的数据。比如某个单词的意思会因为上文提到的内容不同而有不同的含义,RNN就能够很好地解决这类问题。
为什么需要RNN
普通的神经网络都只能处理一个个的输入,不能提取前后输入之间的关系,而在有些情况下,前后两次输入之间的关系是有用的,如在NLP中。
当我们在理解一句话意思时,孤立的理解这句话的每个词是不够的,我们需要处理这些词连接起来的整个序列;当我们处理视频的时候,我们也不能只单独的去分析每一帧,而要分析这些帧连接起来的整个序列。
为了更好地处理序列上下文的关系,所以诞生了RNN。
RNN的结构
简单的循环网络
由输入层、隐藏层、输出层构成
![img](https://cdn.jsdelivr.net/gh/Collapsar-G/image/img/20210308181941.jpeg)
这个循环网络相当于在普通的全连接网络上添加了一层循环。
其中:
-
x是一个向量,它表示输入层的值;
-
s是一个向量,它表示隐藏层的值;
-
U是输入层到隐藏层的权重矩阵;
-
o也是一个向量,它表示输出层的值;
-
V是隐藏层到输出层的权重矩阵;
-
W是隐藏层上一次的值作为这一次的输入的权重矩阵;
$h^t = $
每一时间步的损失用交叉熵:
J
(
n
)
(
θ
)
=
C
E
(
y
(
1
)
,
y
^
(
t
)
)
=
−
∑
w
∈
V
y
b
(
1
)
log
y
˙
y
(
t
)
=
−
log
y
^
z
i
+
1
(
i
)
J^{(n)}(\theta)=C E\left(y^{(1)}, \hat{y}^{(t)}\right)=-\sum_{w \in V} y_{b}^{(1)} \log \dot{y}_{y}^{(t)}=-\log \hat{y}_{z_{i}+1}^{(i)}
J(n)(θ)=CE(y(1),y^(t))=−w∈V∑yb(1)logy˙y(t)=−logy^zi+1(i)
在整个数据集平均:
J
(
θ
)
=
1
T
∑
t
=
1
T
J
(
1
)
(
θ
)
=
1
T
∑
i
=
1
T
−
log
y
˙
x
i
+
1
(
θ
)
J(\theta)=\frac{1}{T} \sum_{t=1}^{T} J^{(1)}(\theta)=\frac{1}{T} \sum_{i=1}^{T}-\log \dot{y}_{x_{i}+1}^{(\theta)}
J(θ)=T1t=1∑TJ(1)(θ)=T1i=1∑T−logy˙xi+1(θ)