一、为什么需要RNN
以往我们学习的全连接神经网络都是单独的取处理一个个的输入,前一个输入和后一个输入是完全没有关系的。但是,某些任务需要能够更好的处理序列的信息,即前面的输入和后面的输入是有关系的。
当我们在理解一句话意思时,孤立的理解这句话的每个词是不够的,我们需要处理这些词连接起来的整个序列; 当我们处理视频的时候,我们也不能只单独的去分析每一帧,而要分析这些帧连接起来的整个序列。
使用情景
RNN是在自然语言处理领域中最先被用起来的,比如,RNN可以为语言模型来建模。那么,什么是语言模型呢?
我们可以和电脑玩一个游戏,我们写出一个句子前面的一些词,然后,让电脑帮我们写下接下来的一个词。比如下面这句:
我昨天上学迟到了,老师批评了____。
我们给电脑展示了这句话前面这些词,然后,让电脑写下接下来的一个词。在这个例子中,接下来的这个词最有可能是『我』,而不太可能是『小明』,甚至是『吃饭』。
通俗理解
让电脑预测这句话后面该说什么,电脑会从到到尾分析这段话,分析的过程并不是独立的,而是通过神经网络来解析,并且前面的话语肯定会对后面的话语产生影响,最终生成我们想要的结果。这种类似的“前对后的影响”是RNN的核心所在
二、RNN结构
这是一个简单的循环神经网络结构图,由输入层、隐藏层、输出层构成。 这里我们去掉W的话就是一个简单的全连接神经网络模型
我们从下向上理解简单部分:
参数 | 意义 |
---|
X | 表示输入层的值 | U | 输入层到隐藏层的权重矩阵 | S | 它表示隐藏层的值 | V | 隐藏层到输出层的权重矩阵 | O | 表示输出层的值 |
W是什么?
W是一个权重矩阵,作用在隐藏层中 循环神经网络的隐藏层的值s不仅仅取决于当前这次的输入x,还取决于上一次隐藏层的值s。 权重矩阵 W就是隐藏层上一次的值作为这一次的输入的权重。
三、 一图以蔽之
四、一式以蔽之
五、代码实现
import numpy as np
timesteps = 100
input_features = 32
out_features = 64
inputs = np.random.random((timesteps, input_features))
state_t = np.zeros((output_features,))
U = np.random.random((output_features, input_features))
W = np.random.random((output_features, output_features))
b = np.random.random((output_features, ))
successive_outputs = []
for input_t in inputs:
output_t = np.tanh(np.dot(U, input_t)+np.dot(W, state_t)+b)
successive_outputs.append(output_t)
state_t = output_t
final_output_sequence = np.stack(successive_outputs, axis=0)
六、Encoder-Decoder
新的神经网络模型叫做 RNN编码-解码器 ,该模型包含两个RNN,分别位于编码器和解码器中,编码器中的RNN负责将变长的输入序列映射到一个固定长度的向量中,解码器中的RNN则负责将向量映射到一个变长的输出序列中
"Elle aime la Chine."在法语里面是"她喜欢中国。“的意思,翻译为英文即为"She loves China.”。在这里,它是一个翻译的seq2seq结构。
结构图
Encoder
编码器部分标注了隐藏层的状态,用
h
t
h_{t}
ht?表示,更新公式为:
h
t
=
f
(
h
t
?
1
,
x
t
)
h_{t}=f(h_{t}-1,x_{t})
ht?=f(ht??1,xt?) 说明了当前时刻的隐藏层状态
h
t
h_{t}
ht?是由上一时刻状态
h
t
?
1
h_{t-1}
ht?1?合当前时刻的输入
x
t
x_{t}
xt?决定的
C
C
C是中间语义表示 可以是各个时刻隐层输出的汇总:
C
=
g
(
h
1
,
h
2
,
h
3
.
.
.
.
.
h
T
)
C=g(h_{1},h_{2},h_{3}.....h_{T})
C=g(h1?,h2?,h3?.....hT?) 也可以是最后一层的输出
C
=
h
T
C=h_{T}
C=hT? 由于编码器用的是RNN的结构,每一个循环中的信息都会流到下一个循环中,因此中间语义表示 C 理论上包含了输入序列的所有信息。
Decoder
解码过程合编码是倒序关系,由前推后,因此公式顺序也会发生变化,并不是类似输入推出隐藏层的状态。 以翻译例子为例:
|