简介
首先,我们从一个问题看:
你是否能理解下面这句话的意思吗?“肉喜欢如此我的吃是”,显然很难理解。那这句话呢?“我是如此的喜欢吃肉”,句子通顺了就很好理解了!从这里可以看出,一些词顺序的颠倒就使得整个句子不通顺。
在日常生活中也有许许多多这样的问题。例如:
+ 之前的那个句子——词语的顺序决定了它们的意义
+ 时间序列数据——事件的发生顺序由时间决定
+ 基因组序列数据——每个序列都有不同的含义
它们共同之处就是:序列的信息决定事件本身。传统的神经网络并不能很好地学习数据的先前知识(prior knowledge),来理解这些数据。因此,便有了循环神经网络(RNN)。
一个用于处理序列的神经网络可以实现什么任务:
RNN的优点在于其应用的多样性,他有强大的处理各种输入和输出类型的能力。例如:
+ 情感分析——这是可以把一段文字分成正负两种情绪。输入时任意长度的句子,输出是固定长度固定类型。
“这一场电影真不错。” ——> +
“这人演的真是烂啊。” ——> -
+ 图像标注——假设我们有一张图片,我们需要描述这张图片。所以,我们的输入是单一的图像,输出是单词或句子。这里图像可能是固定大小的,但是输出是不同长度的文字描述。
+ 语言翻译——如下图,英文翻译成法语。每种语言都有自己的语义,对同一句话有不同的长度。因此,这次的输入和输出是不同长度的。
因此,RNNs可用于将输入映射到不同类型、长度的输出,并根据实际应用泛化。让我们看看RNN的架构是怎样的。
什么是循环神经网络
RNN因为具有“记忆”功能,所以很擅于处理自然语言和其他序列任务。它可以一次读取一个输入 x⟨t⟩ x ⟨ t ⟩ (例如单词),并且从一个时间步到另一个时间步可以通过隐藏层的激活函数记住一些信息/内容。这一点允许一个单向RNN从过去获取信息来处理稍后的输入。
接下来要用到的符号:
- 上标
[l]
[
l
]
表示与第
lth
l
t
h
层相关联的对象。
- 例如:
a[4]
a
[
4
]
是第
4th
4
t
h
层的激活函数。
W[5]
W
[
5
]
和
b[5]
b
[
5
]
是第
5th
5
t
h
层的参数。
上标 (i) ( i ) 表示与第 ith i t h 样本相关联的对象。
- 例如: x(i) x ( i ) 是第 ith i t h 训练样本的输入。
上标 ⟨t⟩ ⟨ t ⟩ 在第 tth t t h 个时间步的对象。
- 例如: x⟨t⟩ x ⟨ t ⟩ 是在第 tth t t h 时间步输入的 x 。 x(i)⟨t⟩ x ( i ) ⟨ t ⟩ 是样本 i i 在第 时间步的输入。
下标 i i 表示向量的第 个条目。
- 例如: a[l]i a i [ l ] 表示在 l l 层的第 个激活函数。
如下是一个RNN,有一个输入层(X),一个隐藏层(RNN)和一个输出层(Y),其中隐藏层RNN做一个自循环。
我们对该图进行展开,得到如下结构,其中分为T个时间步:
我们先来看单个RNN cell:
一个RNN可以看做是单个RNN-cell的循环。我们先来看单个时间步是怎么实现的。
其中:
+
x⟨t⟩
x
⟨
t
⟩
为当前输入。
+
a⟨t−1⟩
a
⟨
t
−
1
⟩
为之前的隐藏状态,包含来自上一个RNN-cell的信息,其中第一个隐藏状态由我们随机初始化。
+
a⟨t⟩
a
⟨
t
⟩
为当前RNN-cell的隐藏状态,作为下一个RNN-cell 的输入。
+
y⟨t⟩
y
⟨
t
⟩
则是根据输入和之前隐藏状态得到的预测值。
其计算步骤:
1. 用tanh作为激活函数计算隐藏状态:
a⟨t⟩=tanh(Waaa⟨t−1⟩+Waxx⟨t⟩+ba)
a
⟨
t
⟩
=
tanh
(
W
a
a
a
⟨
t
−
1
⟩
+
W
a
x
x
⟨
t
⟩
+
b
a
)
。(其中
Wax
W
a
x
表示
a⟨t⟩
a
⟨
t
⟩
的权值矩阵
W
W
与相乘的权值矩阵,
Waa
W
a
a
同理)。
2. 使用上一步的得到的隐藏状态
a⟨t⟩
a
⟨
t
⟩
, 计算预测值
y^⟨t⟩=softmax(Wyaa⟨t⟩+by)
y
^
⟨
t
⟩
=
s
o
f
t
m
a
x
(
W
y
a
a
⟨
t
⟩
+
b
y
)
。
你可以把RNN看做RNN-cell的重复,如果输入的数据序列超过10个时间步,那么将重复十个RNN-cell,也就是下图的T=10。其中每个RNN-cell将前一个时间步的RNN-cell的隐藏状态 a⟨t−1⟩ a ⟨ t − 1 ⟩ 和当前时间步的输入数据 x⟨t−1⟩ x ⟨ t − 1 ⟩ 作为输入。在这个时间步它输出一个隐藏状态 a⟨t⟩ a ⟨ t ⟩ 和一个预测 y⟨t⟩ y ⟨ t ⟩ 。
其中输入序列
x=(x⟨1⟩,x⟨2⟩,...,x⟨Tx⟩)
x
=
(
x
⟨
1
⟩
,
x
⟨
2
⟩
,
.
.
.
,
x
⟨
T
x
⟩
)
可以是一个词的one-hot编码。例如”我喜欢这个东西”的one-hot编码序列为[1,0,0,0……,1,0,……,1],其中
x⟨1⟩
x
⟨
1
⟩
就对应序列中的 1,
x⟨2⟩
x
⟨
2
⟩
对应其中序列中的第二个数0,以此类推。
以上就是一个最基本的RNN。
本文参考自Fundamentals of Deep Learning – Introduction to Recurrent Neural Networks和吴恩达的深度学习。