RNN学习笔记(一)-简介及BPTT RTRL及Hybrid(FP/BPTT)算法
本文假设读者已经熟悉了常规的神经网络,并且了解了BP算法,如果还不了解的,参见UFIDL的教程。
- 1.RNN结构
- 2.符号定义
- 3.网络unrolled及公式推导
- 4.BPTT
- 5.RTRL
- 6.Hybrid(FP/BPTT)
- 7.参考文献
1.RNN结构
如下图1是一个最简单的RNN:
其中集合
2.符号定义
定义:
再来是一组等式定义:
因为假定
由于
因为初始状态的输出
3.网络unrolled及公式推导
将网络按时间展开:
根据上图,下面两个式子成立:
显然,
下面对公式进行进一步的推导:
由复合函数求导法则,上式可进一步变为:
当
这里:
代入,上式可以变为:
所以就有:
因为当
进一步推导:
先做如下定义:
4.BPTT(Back Propagation Through Time)
4.1 Real-Time BPTT
算法描述:
令
可以看出,算法的公式与BP算法非常相似,算法从t时刻开始,先用等式
上图描述了Real-Time BPTT算法在每一个时刻t的存储和处理操作。历史缓存每经过一个时刻t,就会增加一层的数据(包括该t时刻所有的输入和输出值)。实线箭头表明了当前的输出值由和上一时刻的输入输出值确定。虚线表示反向传播,计算直到
激活函数通常取logistics函数,此时的
最后,权值的梯度通过下式计算:
在每一个时刻t,算法的执行流程如下:
(1)将当前网络的状态和当前的输入值添加到历史缓存2;
(2)注入当前时刻
(3)计算所有的
(4)根据第(3)步的结果修改权值。
随着时间的增长,算法对历史缓存的需求将是无限的,因此,有时也用BPTT(∞)来表示这个算法,它在理论上的研究价值要远大于实用。接下来,我们将讨论更为实用的近似算法。
4.2 Epochwise BPTT
为了解决Real-Time BPTT对内存的无限制需求,我们采用一种近似的算法,即:Epochwise BPTT。
算法的目标是计算基于
令
算法从最后的时刻
对
算法的执行流程如下:
(1)执行BP算法,计算所有的
(2)计算所有的
(3)使用(2)的结果更新权值,重复步骤(1)~(3);
5.RTRL(Real-Time Recurrent Learning)
与反向传播的BPTT算法不同的是,RTRL通过前向传播梯度来进行计算。
对任意的
令
根据之前的关系等式:
可以推出:
此外,
于是,整个计算过程将从
对每一个时刻
6.Hybrid(FP/BPTT)
等式右边的第一部分可写为:
因此,最初的式子可变为:
令
首先计算BPTT:
然后,使用上边的计算结果执行:
上图是FP/BPTT(h)算法的简单描述。可以看到,算法包含两个连续的误差计算过程。一个在时刻
7.参考文献
1.Gradient-Based Learning Algorithms for Recurrent Networks and Their Computational Complexity.Ronald J. Williams,David Zipser
-
F:F为{yk(τ)|k∈U,τ∈(t′,t]}的函数,
即F=F(yk(t′+1),yk(t′+2),...,yk(τ),...,yk(t))
这地方稍微深入说明一下引入变量y∗k(τ) 的原因:
假设有函数f(x,y)=x+2y ,同时,y,x 满足:y=x2
对f(x,y)求偏导数:∂f∂x=∂(x+2y)∂x
这个地方出现了两个x (分别在分式的上下边),这两个x虽然相等,但含义其实并不相同。下边的x 是自变量,上边的x 其实可以看做自变量的一个函数,不妨令t=x ,于是有如下关系式:
{x(t)=ty(t)=t2
于是f(x,y)=f(x(t),y(t))
∂f∂x=∂f(x(t),y(t))∂t
由复合函数求导法则,上式又可变为:
∂f(x(t),y(t))∂x(t)∂x(t)∂t+∂f(x(t),y(t))∂y(t)∂y(t)∂t
由于x(t),y(t)是t的单变量函数,有:
∂x(t)∂t=dx(t)dt
∂y(t)∂t=dy(t)dt
所以有:
∂f∂x=∂f(x(t),y(t))∂x(t)dx(t)dt+∂f(x(t),y(t))∂y(t)dy(t)dt
类比函数即F=F(y(t′+1),y(t′+2),...,yk(τ),...,y(t)) ,对其求关于yk(τ) 的偏导数显然也存在符号混淆的问题,所以,有必要引入符号
y∗k(τ)=y∗k(τ)(yk(τ))=yk(τ)
y∗k(τ)(yk(τ)) 后边的括号表示y∗k(τ) 为yk(τ) 的函数。变量符号y∗k(τ) 的意义与上例中x(t) 的意义一样。 ↩ - 历史缓存(History buffer)中存储了整个网络从
t0 时刻开始的输入和激活信息。 ↩ -
δik 是克罗内克函数(Kronecker delta)
函数定义:
δik={1 if i=k0 if i≠k ↩