直接看这个博客吧,写得很好
一、循环神经网络(RNN)原理通俗解释
- 在图像处理中,目前做的最好的是CNN
- 自然语言处理中,表现比较好的是RNN
既然我们已经有了人工神经网络和卷积神经网络,为什么还要循环神经网络?
-
原因很简单,无论是卷积神经网络,还是人工神经网络,他们的前提假设都是:元素之间是相互独立的,输入与输出也是独立的
-
循环神经网络,他的本质是:像人一样拥有记忆的能力。因此,他的输出就依赖于当前的输入和记忆。
RNN结构:
RNN中的结构细节:
- 可以把 S t S_t St 当作隐状态,捕捉了之前时间点上的信息。就像你去考研一样,考的时候记住了你能记住的所有信息。
- o t o_t ot 是由当前时间以及之前所有的记忆得到的。就是你考研之后做的考试卷子,是用你的记忆得到的。
- 很可惜的是, S t S_t St 并不能捕捉之前所有时间点的信息。就像你考研不能记住所有的英语单词一样。
- 和卷积神经网络一样,这里的网络中每个 cell 都共享了一组参数(U,V,W),这样就能极大的降低计算量了。
- o t o_t ot 在很多情况下都是不存在的,因为很多任务,比如文本情感分析,都是只关注最后的结果的。就像考研之后选择学校,学校不会管你到底怎么努力,怎么心酸的准备考研,而只关注你最后考了多少分。
- 用一句话解释RNN,就是一个单元结构重复使用。
定义:
- X t X_t Xt : 表示t时刻的输入
- o t o_t ot : 表示t时刻的输出
- S t S_t St : 表示t时刻的记忆
当前时刻的输出是由:以前的记忆和当前时刻的输入决定的,神经网络最擅长做的就是通过一系列参数把很多内容整合到一起,然后学习这个参数,因此就定义了RNN的基础:
下一状态:
S
t
=
σ
(
U
∗
X
t
+
W
∗
S
t
−
1
+
b
)
S_t = \sigma( U * X_t + W * S_{t-1} + b)
St=σ(U∗Xt+W∗St−1+b)
当前输出:
o
t
=
σ
(
V
∗
S
t
+
c
)
o_t = \sigma(V * S_t + c)
ot=σ(V∗St+c)
- σ ( ) \sigma() σ() 是神经网络中的激活函数
- 套用一个激活函数,可以用来做一个非线性映射,也可以用来过滤信息
双向 RNN
在有些情况,比如有一部电视剧,在第三集的时候才出现的人物,现在让预测一下在第三集中出现的人物名字,你用前面两集的内容是预测不出来的,所以你需要用到第四,第五集的内容来预测第三集的内容,这就是双向RNN的想法。如图是双向RNN的图解:
从前往后:
S
t
1
=
σ
(
U
1
∗
X
t
+
W
1
∗
S
t
−
1
+
b
1
)
S^1_t = \sigma( U^1 * X_t + W^1 * S_{t-1} + b^1)
St1=σ(U1∗Xt+W1∗St−1+b1)
o
t
=
σ
(
V
1
∗
S
t
+
c
1
)
o_t = \sigma( V^1 * S_t + c^1)
ot=σ(V1∗St+c1)
从后往前:
S
t
2
=
σ
(
U
2
∗
X
t
+
W
2
∗
S
t
+
1
+
b
2
)
S^2_t = \sigma( U^2 * X_t + W^2 * S_{t+1} + b^2)
St2=σ(U2∗Xt+W2∗St+1+b2)
o
t
=
σ
(
V
2
∗
S
t
+
c
2
)
o_t = \sigma( V^2 * S_t + c^2 )
ot=σ(V2∗St+c2)
双向RNN需要的内存是单向RNN的两倍,因为在同一时间点,双向RNN需要保存两个方向上的权重参数,在分类的时候,需要同时输入两个隐藏层输出的信息。
深层双向 RNN
深层双向RNN 与双向RNN相比,多了几个隐藏层,因为他的想法是很多信息记一次记不下来,比如你去考研,复习考研英语的时候,背英语单词一定不会就看一次就记住了所有要考的考研单词吧,你应该也是带着先前几次背过的单词,然后选择那些背过,但不熟的内容,或者没背过的单词来背吧。
Pyramidal RNN(金字塔型RNN)