1. 为什么需要RNN?

一般处理单个的输入,前一个输入和后一个输入完全无关,但实际应用中,某些任务需要能够更好的处理序列的信息,即前面的输入和后面的输入是有关系的。比如:时间序列问题

2. 简要介绍RNN的基本结构

单层网络结构

​ 在进一步了解RNN之前,先给出最基本的单层网络结构,输入是xx,经过变换Wx+bWx+b和**函数ff得到输出yy

【机器学习面试题】——循环神经网络(RNN)

经典RNN结构

​ RNN在单层网络结构的基础上引入了隐藏层hhhh可对序列数据提取特征,接着再转换为输出。

【机器学习面试题】——循环神经网络(RNN)

注:图中的圆圈表示向量,箭头表示对向量做变换。

RNN中,每个步骤权值共享,使用的参数U,W,bU,W,b​相同,h2h_2的计算方式和h1h_1类似,其计算结果如下:

【机器学习面试题】——循环神经网络(RNN)

接下来,计算RNN的输出y1y_1,采用SoftmaxSoftmax作为**函数,根据yn=f(Wx+b)y_n=f(Wx+b),得y1y_1:

【机器学习面试题】——循环神经网络(RNN)

使用和y1y_1相同的参数V,cV,c,得到y1,y2,y3,y4y_1,y_2,y_3,y_4的输出结构:

【机器学习面试题】——循环神经网络(RNN)

RNN的拓展结构

网络结构 结构图示 应用场景举例
1 vs N 【机器学习面试题】——循环神经网络(RNN) 1、从图像生成文字,输入为图像的特征,输出为一段句子
2、根据图像生成语音或音乐,输入为图像特征,输出为一段语音或音乐
N vs 1 【机器学习面试题】——循环神经网络(RNN) 1、输出一段文字,判断其所属类别
2、输入一个句子,判断其情感倾向
3、输入一段视频,判断其所属类别
N vs M 【机器学习面试题】——循环神经网络(RNN) 1、机器翻译,输入一种语言文本序列,输出另外一种语言的文本序列
2、文本摘要,输入文本序列,输出这段文本序列摘要
3、阅读理解,输入文章,输出问题答案
4、语音识别,输入语音序列信息,输出文字序列

3. CNN和RNN的区别 ?

类别 特点描述
相同点 1、传统神经网络的扩展。
2、前向计算产生结果反向计算模型更新
3、每层神经网络横向可以多个神经元共存,纵向可以有多层神经网络连接。
不同点 1、CNN空间扩展,神经元与特征卷积;RNN时间扩展,神经元与多个时间输出计算
2、RNN可以用于描述时间上连续状态的输出,有记忆功能,CNN用于静态输出

4. RNNs和FNNs(前馈神经网络)有什么区别?

  • RNNs引入了定向循环,能够处理输入之间前后关联问题。
  • RNNs可以记忆之前步骤的训练信息。

5. RNNs训练和传统ANN训练异同点?

相同点

  • RNNs与传统ANN都使用BP误差反向传播算法

不同点

  • RNNs网络参数W,U,V是共享的,而传统神经网络各层参数间没有直接联系。
  • 对于RNNs,在使用梯度下降算法中,每一步的输出不仅依赖当前步的网络,还依赖于之前若干步的网络状态。

6. 为什么RNN 训练的时候Loss波动很大

​ 由于RNN特有的memory会影响后期其他的RNN的特点,梯度时大时小learning rate没法个性化的调整,导致RNN在train的过程中,Loss会震荡起伏。为了解决RNN的这个问题,在训练的时候,可以设置临界值,当梯度大于某个临界值,直接截断,用这个临界值作为梯度的大小,防止大幅震荡。

7. 描述RNN的前向输出流程

​ 以xx表示输入,hh是隐层单元,oo是输出,LL为损失函数,yy为训练集标签。tt表示tt时刻的状态,V,U,WV,U,W是权值,同一类型的连接权值相同。以下图为例进行说明标准RNN的前向传播算法:

【机器学习面试题】——循环神经网络(RNN)

对于tt时刻:
h(t)=ϕ(Ux(t)+Wh(t1)+b)h^{(t)}=phi(Ux^{(t)}+Wh^{(t-1)}+b)
其中ϕ()phi()为**函数,一般会选择tanh函数,bb为偏置。

tt时刻的输出为:
o(t)=Vh(t)+co^{(t)}=Vh^{(t)}+c
模型的预测输出为:
y^(t)=σ(o(t))widehat{y}^{(t)}=sigma(o^{(t)})
其中σsigma为**函数,通常RNN用于分类,故这里一般用softmax函数。

8. RNN中为什么会出现梯度消失,如何解决?

原因

  • RNN在算是会有**函数导数的累乘,如果取tanh或sigmoid函数作为**函数的话,那么必然是一堆小数在做乘法,结果就是越乘越小。随着时间序列的不断深入,小数的累乘就会导致梯度越来越小直到接近于0,这就是“梯度消失“现象。

如何解决

  • 选取更好的**函数,如Relu**函数。ReLU函数的左侧导数为0,右侧导数恒为1,这就避免了“梯度消失“的发生。但恒为1的导数容易导致“梯度爆炸“,但设定合适的阈值可以解决这个问题。
  • 加入BN层,其优点包括可加速收敛、控制过拟合,可以少用或不用Dropout和正则、降低网络对初始化权重不敏感,且能允许使用较大的学习率等。
  • 改变传播结构,LSTM结构可以有效解决这个问题。下面将介绍LSTM相关内容。

9. LSTM核心思想图解

LSTM 拥有三个门,分别是遗忘门,输入门和输出门,来保护和控制细胞状态。

忘记门

  • 作用对象:细胞状态

  • 作用:将细胞状态中的信息选择性的遗忘

  • 操作步骤:该门会读取ht1h_{t-1}xtx_t,输出一个在 0 到 1 之间的数值给每个在细胞状态Ct1C_{t-1}中的数字。1 表示“完全保留”,0 表示“完全舍弃”。

【机器学习面试题】——循环神经网络(RNN)

输入门

  • 作用对象:细胞状态

  • 作用:将新的信息选择性的记录到细胞状态中。

  • 操作步骤:

    • sigmoid 层称 “输入门” 决定什么值我们将要更新

    • tanh 层创建一个新的候选值向量C~ttilde{C}_t加入到状态中。

【机器学习面试题】——循环神经网络(RNN)

  • Ct1C_{t-1}更新为CtC_{t}。将旧状态与ftf_t相乘,丢弃掉我们确定需要丢弃的信息。接着加上itC~ti_t * tilde{C}_t得到新的候选值,根据我们决定更新每个状态的程度进行变化。

【机器学习面试题】——循环神经网络(RNN)

输出层门

  • 作用对象:隐层hth_t

  • 作用:确定输出什么值

  • 操作步骤:

    • 通过sigmoid 层来确定细胞状态的哪个部分将输出。

    • 把细胞状态通过 tanh 进行处理,并将它和 sigmoid 门的输出相乘,最终我们仅仅会输出我们确定输出的那部分。

【机器学习面试题】——循环神经网络(RNN)

10. LSTMs与GRUs有什么区别?

LSTMs与GRUs的区别如图所示:

【机器学习面试题】——循环神经网络(RNN)

从上图可以看出,二者结构十分相似,不同在于

  • new memory都是根据之前state及input进行计算,但是GRUs中有一个reset gate控制之前state的进入量,而在LSTMs里没有类似gate;

  • 产生新的state的方式不同,LSTMs有两个不同的gate,分别是forget gate (f gate)和input gate(i gate),而GRUs只有一种update gate(z gate)

  • LSTMs对新产生的state可以通过output gate(o gate)进行调节,而GRUs对输出无任何调节

11. BPTT算法推导

​ BPTT(back-propagation through time)算法是常用的训练RNN的方法,其本质还是BP算法,只不过RNN处理时间序列数据,所以要基于时间反向传播,故叫随时间反向传播。BPTT的中心思想和BP算法相同,沿着需要优化的参数的负梯度方向不断寻找更优的点直至收敛。需要寻优的参数有三个,分别是UVWU、V、W。与BP算法不同的是,其中WWUU两个参数的寻优过程需要追溯之前的历史数据,参数VV相对简单只需关注目前,先求解参数V的偏导数。
L(t)V=L(t)o(t)o(t)Vfrac{partial L^{(t)}}{partial V}=frac{partial L^{(t)}}{partial o^{(t)}}cdot frac{partial o^{(t)}}{partial V}
RNN的损失也是会随着时间累加的,所以不能只求t时刻的偏导。
L=t=1nL(t)L=sum_{t=1}^{n}L^{(t)}

LV=t=1nL(t)o(t)o(t)Vfrac{partial L}{partial V}=sum_{t=1}^{n}frac{partial L^{(t)}}{partial o^{(t)}}cdot frac{partial o^{(t)}}{partial V}

WWUU的偏导的求解由于需要涉及到历史数据,其偏导求起来相对复杂。为了简化推导过程,假设只有三个时刻,那么在第三个时刻 LLWWLLUU的偏导数分别为:
L(3)W=L(3)o(3)o(3)h(3)h(3)W+L(3)o(3)o(3)h(3)h(3)h(2)h(2)W+L(3)o(3)o(3)h(3)h(3)h(2)h(2)h(1)h(1)Wfrac{partial L^{(3)}}{partial W}=frac{partial L^{(3)}}{partial o^{(3)}}frac{partial o^{(3)}}{partial h^{(3)}}frac{partial h^{(3)}}{partial W}+frac{partial L^{(3)}}{partial o^{(3)}}frac{partial o^{(3)}}{partial h^{(3)}}frac{partial h^{(3)}}{partial h^{(2)}}frac{partial h^{(2)}}{partial W}+frac{partial L^{(3)}}{partial o^{(3)}}frac{partial o^{(3)}}{partial h^{(3)}}frac{partial h^{(3)}}{partial h^{(2)}}frac{partial h^{(2)}}{partial h^{(1)}}frac{partial h^{(1)}}{partial W}

L(3)U=L(3)o(3)o(3)h(3)h(3)U+L(3)o(3)o(3)h(3)h(3)h(2)h(2)U+L(3)o(3)o(3)h(3)h(3)h(2)h(2)h(1)h(1)Ufrac{partial L^{(3)}}{partial U}=frac{partial L^{(3)}}{partial o^{(3)}}frac{partial o^{(3)}}{partial h^{(3)}}frac{partial h^{(3)}}{partial U}+frac{partial L^{(3)}}{partial o^{(3)}}frac{partial o^{(3)}}{partial h^{(3)}}frac{partial h^{(3)}}{partial h^{(2)}}frac{partial h^{(2)}}{partial U}+frac{partial L^{(3)}}{partial o^{(3)}}frac{partial o^{(3)}}{partial h^{(3)}}frac{partial h^{(3)}}{partial h^{(2)}}frac{partial h^{(2)}}{partial h^{(1)}}frac{partial h^{(1)}}{partial U}

可以观察到,在某个时刻的对WW或是UU的偏导数,需要追溯这个时刻之前所有时刻的信息。根据上面两个式子得出L在tt时刻对WWUU偏导数的通式:
L(t)W=k=0tL(t)o(t)o(t)h(t)(j=k+1th(j)h(j1))h(k)Wfrac{partial L^{(t)}}{partial W}=sum_{k=0}^{t}frac{partial L^{(t)}}{partial o^{(t)}}frac{partial o^{(t)}}{partial h^{(t)}}(prod_{j=k+1}^{t}frac{partial h^{(j)}}{partial h^{(j-1)}})frac{partial h^{(k)}}{partial W}

L(t)U=k=0tL(t)o(t)o(t)h(t)(j=k+1th(j)h(j1))h(k)Ufrac{partial L^{(t)}}{partial U}=sum_{k=0}^{t}frac{partial L^{(t)}}{partial o^{(t)}}frac{partial o^{(t)}}{partial h^{(t)}}(prod_{j=k+1}^{t}frac{partial h^{(j)}}{partial h^{(j-1)}})frac{partial h^{(k)}}{partial U}

整体的偏导公式就是将其按时刻再一一加起来。

往期内容

参考文献

  • https://github.com/scutan90/DeepLearning-500-questions
  • https://github.com/NLP-LOVE/ML-NLP
  • https://github.com/songyingxin/NLPer-Interview
  • https://blog.csdn.net/vivian_ll/article/details/88780661

个人总结 ,如有错误,请批评指正!
【机器学习面试题】——循环神经网络(RNN)