《深度学习》之 循环神经网络 原理 超详解
参考:
https://blog.csdn.net/DFCED/article/details/104982539
https://www.jianshu.com/p/39a99c88a565
一、简介
RNN的目的:处理序列数据。
在传统的神经网络模型中,是从输入层到隐含层再到输出层,层与层之间是全连接的,每层之间的节点是无连接的。但是这种普通的神经网络对于很多问题却无能无力。例如,你要预测句子的下一个单词是什么,一般需要用到前面的单词,因为一个句子中前后单词并不是独立的。RNN之所以称为循环神经网路,即一个序列当前的输出与前面的输出也有关。具体的表现形式为网络会对前面的信息进行记忆并应用于当前输出的计算中,即隐藏层之间的节点不再无连接而是有连接的,并且隐藏层的输入不仅包括输入层的输出还包括上一时刻隐藏层的输出。理论上,RNN能够对任何长度的序列数据进行处理。但是在实践中,为了降低复杂性往往假设当前的状态只与前面的几个状态相关,下图便是一个典型的RNN:
二、结构
3.1 循环结构
当前的数据依赖于之前的信息, 设有一状态序列数据
{
s
t
}
\{s_t\}
{st}
要表示这一性质,典型的处理方式:
s
t
=
f
(
s
t
−
1
,
θ
)
s_t=f(s_t−1,θ)
st=f(st−1,θ)
其中f() 为映射(在RNN中可以简单的理解激活函数), θ 为参数. 从上式可以看出,
- 1). 映射是与时间不相关的.
- 2). θ 也是与时间无关的,这里体现了循环结构(在RNN中)的很重要性质: 参数(主要为权值参数)共享(parameter sharing).
上式可以用另一种形式(展开式)表示:
如果状态序列中的每个数据不只受其前面信息的影响,还受外部信息的影响,那么循环结构可以表示成:
s
t
=
f
(
s
t
−
1
,
x
t
,
θ
)
s_t=f(s_{t−1},x_t,θ)
st=f(st−1,xt,θ)
其中xt为外部信息序列的第t个元素. 这个就是RNN(简单的)使用的循环结构.
写成带权重的形式:
s
t
=
f
(
W
s
t
−
1
+
U
x
t
+
b
t
)
s_t=f(Ws_{t−1}+Ux_t+b_t)
st=f(Wst−1+Uxt+bt)
为简洁,可以把偏置省略,可以将其看成是U中的(额外)第一维(元素都为 1),后面的BPTT推导将采用此种方式.
如果考虑输出层:
3.2 RNN 结构
三、训练算法
RNN 的训练算法为:BPTT(Back Propagation Through Time),分为三步:
- 前向计算每个神经元的输出值;
- 反向计算每个神经元的误差项值,它是误差函数E对神经元j的加权输入的偏导数;
- 计算每个权重的梯度。
推导过程请参考:https://www.jianshu.com/p/39a99c88a565
四、基于 RNN 的语言模型例子
我们要用 RNN 做这样一件事情,每输入一个词,循环神经网络就输出截止到目前为止,下一个最可能的词,如下图所示:
1、首先,要把词表达为向量的形式:
建立一个包含所有词的词典,每个词在词典里面有一个唯一的编号。
任意一个词都可以用一个N维的one-hot向量来表示。
这种向量化方法,我们就得到了一个高维、稀疏的向量,这之后需要使用一些降维方法,将高维的稀疏向量转变为低维的稠密向量。
2、为了输出 “最可能” 的词,所以需要计算词典中每个词是当前词的下一个词的概率,再选择概率最大的那一个。
因此,神经网络的输出向量也是一个 N 维向量,向量中的每个元素对应着词典中相应的词是下一个词的概率:
3、为了让神经网络输出概率,就要用到 softmax 层作为输出层。
softmax函数的定义:
因为和概率的特征是一样的,所以可以把它们看做是概率。
含义就是:
模型预测下一个词是词典中第一个词的概率是 0.03,是词典中第二个词的概率是 0.09。
语言模型如何训练?
把语料转换成语言模型的训练数据集,即对输入 x 和标签 y 进行向量化,y 也是一个 one-hot 向量
接下来,对概率进行建模,一般用交叉熵误差函数作为优化目标。
交叉熵误差函数,其定义如下:
用上面例子就是:
计算过程如下:
有了模型,优化目标,梯度表达式,就可以用梯度下降算法进行训练了。