面试准备——RNN和LSTM

RNN

RNNs的目的使用来处理序列数据。
在传统的神经网络模型中,假设样本之间无依赖关系(至少时间和顺序上是无依赖关系),层与层之间是全连接的,每层之间的节点是无连接的。但是这种普通的神经网络对于很多问题却无能无力。例如,你要预测句子的下一个单词是什么,一般需要用到前面的单词,因为一个句子中前后单词并不是独立的。
假如说基于传统的非循环NN采用滑框的形式来处理先后关系,可是因为是滑框大小是必须固定的,对于序列数据是可变长度情况下,还是没法解决。而且对于对话系统或者说自动驾驶等任务来说,也没法基于所谓的分类器和回归器去组合成一个新模型从而解决问题。所以还是需要一些能够显示的处理时序依赖关系的方法。
为什么不能用HMM呢?
因为HMM必须基于离散的适度数量的状态集合S中去状态转换,即使使用了viterbi算法,算法时间复杂度也是O(|S|2),所以一旦状态增多,那么HMM的复杂度就急速上升了,而且如果采用滑框形式来融合多个状态,一旦窗口变大,计算复杂度也指数上升了,所以HMM对于长时依赖问题也是很麻烦的。
所以RNN系列应运而生了。一方面基于非线性激活函数的固定size的RNN几乎可以拟合任意的数学计算,并且RNN是基于NN的,不但可以用SGD方式训练,而且还可以增加正则项等来缓解过拟合问题;另一方面,RNN的图灵完备特性使得其一旦结构定义了,就不太可能生成任何其他随意的模式(固定性)。
RNNs隐藏层之间的节点不再无连接而是有连接的,并且隐藏层的输入不仅包括输入层的输出还包括上一时刻隐藏层的输出。理论上,RNNs能够对任何长度的序列数据进行处理。但是在实践中,为了降低复杂性往往假设当前的状态只与前面的几个状态相关。
RNN典型结构如下:
在这里插入图片描述
x t x_t xt为time step为t时的输入,如可以为对应句子某个单词的one-hot向量。
s t s_t st为time step为t时的隐藏层状态,即网络的“记忆”:
S t = f ( U ∗ X t + W ∗ S t − 1 ) S_t=f(U∗X_t+W∗S_{t−1}) St=f(UXt+WSt1)
,其中f常为tanh或ReLU。
o t o_t ot为t步的输出,若我们想预测句子的下一个单词,它可以为词汇表中的概率向量。
o t = s o f t m a x ( V s t ) o_t=softmax(V_{s_t}) ot=softmax(Vst)
沿时间轴将RNN展开:
在这里插入图片描述
RNNs在NLP中的应用有:
语言模型与文本生成(Language Modeling and Generating Text),机器翻译(Machine Translation),语音识别(Speech Recognition),图像描述生成 (Generating Image Descriptions)。

RNN的训练

由于RNN在所有的时间步中共享参数(U,V,W),因此每个输出的梯度不仅取决于当前时间步长的计算,而且还取决于以前的时间步长。 例如,为了计算t=4处的梯度,我们需要反向传播3个步骤并对梯度求和(链式法则),这叫做时间反向传播(BPTT)
由于RNN模型如果需要实现长期记忆的话需要将当前的隐含态的计算与前n次的计算挂钩(具体推导见下文),那样的话计算量会呈指数式增长,导致模型训练的时间大幅增加,因此RNN模型一般不直接用来进行长期记忆计算。
使用BPTT训练的普通RNNs由于消失/爆炸梯度问题而难以学习长期依赖关系(例如,步骤之间相距很远的依赖关系)。

RNN的梯度消失和梯度爆炸

RNN的损失函数可以为交叉熵:
E t ( y t , y ^ t ) = − y t log ⁡ y ^ t E ( y , y ^ ) = ∑ t E t ( y t , y ^ t ) = − ∑ t y t log ⁡ y ^ t E_t(y_t, \hat{y}_t) = - y_{t} \log \hat{y}_{t} \\ E(y, \hat{y}) =\sum\limits_{t} E_t(y_t,\hat{y}_t) \\ = -\sum\limits_{t} y_{t} \log \hat{y}_{t} Et(yt,y^t)=ytlogy^tE(y,y^)=tEt(yt,y^t)=tytlogy^t
其中 y t y_t yt为真实标签, y ^ t \hat{y}_t y^t为预测标签。
为了计算误差对U、V、W的梯度,和误差相加类似,对每一个时间步长的梯度相加, ∂ E ∂ W = ∑ t ∂ E t ∂ W \frac{\partial E}{\partial W} = \sum\limits_{t} \frac{\partial E_t}{\partial W} WE=tWEt
在这里插入图片描述
如图所示,以 E 3 E_3 E3为例计算梯度:
∂ E 3 ∂ V = ∂ E 3 ∂ y ^ 3 ∂ y ^ 3 ∂ V = ∂ E 3 ∂ y ^ 3 ∂ y ^ 3 ∂ z 3 ∂ z 3 ∂ V = ( y ^ 3 − y 3 ) ⊗ s 3 \frac{\partial E_3}{\partial V} =\frac{\partial E_3}{\partial \hat{y}_3}\frac{\partial\hat{y}_3}{\partial V} =\frac{\partial E_3}{\partial \hat{y}_3}\frac{\partial\hat{y}_3}{\partial z_3}\frac{\partial z_3}{\partial V} =(\hat{y}_3 - y_3) \otimes s_3 \\ VE3=y^3E3Vy^3=y^3E3z3y^3Vz3=(y^3y3)s3
其中 z 3 = V s 3 z_3 =Vs_3 z3=Vs3 ⊗ \otimes 是两个向量的外积。
所以 ∂ E 3 ∂ V \frac{\partial E_3}{\partial V} VE3只取决于当前time step的值: y ^ 3 , y 3 , s 3 \hat{y}_3, y_3, s_3 y^3,y3,s3
但对于 ∂ E 3 ∂ W \frac{\partial E_3}{\partial W} WE3:
∂ E 3 ∂ W = ∂ E 3 ∂ y ^ 3 ∂ y ^ 3 ∂ s 3 ∂ s 3 ∂ W \begin{aligned} \frac{\partial E_3}{\partial W} &= \frac{\partial E_3}{\partial \hat{y}_3}\frac{\partial\hat{y}_3}{\partial s_3}\frac{\partial s_3}{\partial W}\\ \end{aligned} WE3=y^3E3s3y^3Ws3
其中 s 3 = tanh ⁡ ( U x t + W s 2 ) s_3 = \tanh(Ux_t + Ws_2) s3=tanh(Uxt+Ws2)取决于 s 2 s_2 s2,而 s 2 s_2 s2取决于 W W W s 1 s_1 s1,所以此处求导不能简单地将看作 s 2 s_2 s2常数:
∂ E 3 ∂ W = ∑ k = 0 3 ∂ E 3 ∂ y ^ 3 ∂ y ^ 3 ∂ s 3 ∂ s 3 ∂ s k ∂ s k ∂ W \begin{aligned} \frac{\partial E_3}{\partial W} &= \sum\limits_{k=0}^{3} \frac{\partial E_3}{\partial \hat{y}_3}\frac{\partial\hat{y}_3}{\partial s_3}\frac{\partial s_3}{\partial s_k}\frac{\partial s_k}{\partial W}\\ \end{aligned} WE3=k=03y^3E3s3y^3sks3Wsk
∂ s 3 ∂ s 1 \frac{\partial s_3}{\partial s_1} s1s3这里也有一个链式法则: ∂ s 3 ∂ s 1 = ∂ s 3 ∂ s 2 ∂ s 2 ∂ s 1 \frac{\partial s_3}{\partial s_1} =\frac{\partial s_3}{\partial s_2}\frac{\partial s_2}{\partial s_1} s1s3=s2s3s1s2,所以梯度传播如图:
在这里插入图片描述
∂ E 3 ∂ W = ∑ k = 0 3 ∂ E 3 ∂ y ^ 3 ∂ y ^ 3 ∂ s 3 ( ∏ j = k + 1 3 ∂ s j ∂ s j − 1 ) ∂ s k ∂ W \begin{aligned} \frac{\partial E_3}{\partial W} &= \sum\limits_{k=0}^{3} \frac{\partial E_3}{\partial \hat{y}_3}\frac{\partial\hat{y}_3}{\partial s_3} \left(\prod\limits_{j=k+1}^{3} \frac{\partial s_j}{\partial s_{j-1}}\right) \frac{\partial s_k}{\partial W}\\ \end{aligned} WE3=k=03y^3E3s3y^3j=k+13sj1sjWsk
再加上激活函数 s t = t a n h ( U ∗ x t + W ∗ s t − 1 ) s_t=tanh(U∗x_t+W∗s_{t−1}) st=tanh(Uxt+Wst1),则 ∏ j = k + 1 t ∂ s j ∂ s j − 1 = ∏ j = k + 1 t t a n h ′ W S \prod\limits_{j=k+1}^{t} \frac{\partial s_j}{\partial s_{j-1}}=\prod\limits_{j=k+1}^{t}tanh^{'}W_S j=k+1tsj1sj=j=k+1ttanhWS
在这里插入图片描述
又因为tanh的倒数在[0,1]之间,大部分时间小于1,如果 W s W_{s} Ws 也是一个大于0小于1的值,则当t很大时,使得 t a n h ′ ∗ W s &lt; 1 tanh&#x27; * W_s &lt; 1 tanhWs<1,则连乘式就会趋近于0,即出现梯度消失。同理,当 W s W_{s} Ws很大时,使得 t a n h ′ ∗ W s &gt; 1 tanh&#x27; * W_s &gt; 1 tanhWs>1,则连乘式就会趋近于无穷,即出现梯度爆炸
梯度消失和爆炸的根本原因在于 ∏ j = k + 1 t ∂ S j ∂ S j − 1 \prod_{j=k+1}^{t}{\frac{\partial{S_{j}}}{\partial{S_{j-1}}}} j=k+1tSj1Sj 这里。
要消除这种情况就需要把这一坨在求偏导的过程中去掉,至于怎么去掉,一种办法就是使 ∂ S j ∂ S j − 1 ≈ 1 {\frac{\partial{S_{j}}}{\partial{S_{j-1}}}}\approx1 Sj1Sj1 另一种办法就是使 ∂ S j ∂ S j − 1 ≈ 0 {\frac{\partial{S_{j}}}{\partial{S_{j-1}}}}\approx0 Sj1Sj0

为了解决这种问题,有三种方式:(1)合适地初始化W,即采用正则化;(2)将tanh或sigmoid替换为ReLU;(3)使用LSTM或者GRU。
总结:
梯度消失:RNN梯度消失是因为激活函数tanh函数的倒数在0到1之间,反向传播时更新前面时刻的参数时,当参数W初始化为小于1的数,则多个(tanh函数’ * W)相乘,将导致求得的偏导极小(小于1的数连乘),从而导致梯度消失。
梯度爆炸:当参数初始化为足够大,使得tanh函数的倒数乘以W大于1,则将导致偏导极大(大于1的数连乘),从而导致梯度爆炸。
参考网址:
Recurrent Neural Networks Tutorial, Part 1 – Introduction to RNNs
循环神经网络(RNN, Recurrent Neural Networks)介绍(上文的翻译+变体RNN)
Recurrent Neural Network[survey]
RNN梯度消失和爆炸
Recurrent Neural Networks Tutorial, Part 3 – Backpropagation Through Time and Vanishing Gradients

LSTM

LSTM的结构

首先是LSTM的cell的结构
LSTMcell结构
在这里插入图片描述
具体遗忘门、输入门、输出门的前向传播公式,见Understanding LSTM Networks
f t = σ ( W f X t + b f ) f_{t}=\sigma({W_{f}X_{t}}+b_{f}) ft=σ(WfXt+bf) i t = σ ( W i X t + b i ) i_{t}=\sigma({W_{i}X_{t}}+b_{i}) it=σ(WiXt+bi) o i = σ ( W o X t + b o ) o_{i}=\sigma({W_{o}X_{t}}+b_{o}) oi=σ(WoXt+bo)
要点

  1. 结构:
    输入门 weight bias 决定更新信息 决定什么值更新
    遗忘门 weight bias 确定丢弃信息
    输出门 weight bias 输出信息
    原始cell(rnn部分)weight bias 创建新的候选值到状态中
    每个时刻weight同时变化、每个时刻weight相互影响
  2. 激活函数:
    sigmoid:门控、确定哪部分输出
    导数 :f(1-f)
    映射到[0,1]
    梯度消失 :当值接近0或1时,梯度接近0,反向传播计算每层残差接近0,梯度接近0,在参数微调中引起梯度弥散,前几层梯度靠近0,不再更新。
    函数中心不为0
    tanh:状态和输出,对数据处理,创建候选值向量
    导数:1-f^2
    函数中心0 【-1,1】
    relu:解决梯度消失问题;计算速度快,收敛快,在前几层也能很快更新
  3. LSTM反向传播:
    沿时间反向传播;从t时刻开始,计算每个误差项;误差向上一级传递
LSTM解决梯度消失问题

LSTM可以抽象成下图:
在这里插入图片描述
LSTM当前的状态 S t = f t S t − 1 + i t X t S_{t}=f_{t}S_{t-1}+i_{t}X_{t} St=ftSt1+itXt与传统RNN的当前状态 S t = W s S t − 1 + W x X t + b 1 S_{t}=W_{s}S_{t-1}+W_{x}X_{t}+b_{1} St=WsSt1+WxXt+b1类似。
在这里插入图片描述
将LSTM的状态表达式展开并加上激活函数tanh后如下:
S t = t a n h [ σ ( W f X t + b f ) S t − 1 + σ ( W i X t + b i ) X t ] S_{t}=tanh\left[\sigma(W_{f}X_{t}+b_{f})S_{t-1}+\sigma(W_{i}X_{t}+b_{i})X_{t}\right] St=tanh[σ(WfXt+bf)St1+σ(WiXt+bi)Xt]
对比传统RNN求偏导的过程:
∏ j = k + 1 t ∂ S j ∂ S j − 1 = ∏ j = k + 1 t t a n h ′ W s \prod_{j=k+1}^{t}\frac{\partial{S_{j}}}{\partial{S_{j-1}}}=\prod_{j=k+1}^{t}{tanh{&#x27;}W_{s}} j=k+1tSj1Sj=j=k+1ttanhWs
LSTM同样包含这一项,但形式为:
∏ j = k + 1 t ∂ S j ∂ S j − 1 = ∏ j = k + 1 t t a n h ’ σ ( W f X t + b f ) \prod_{j=k+1}^{t}\frac{\partial{S_{j}}}{\partial{S_{j-1}}}=\prod_{j=k+1}^{t}{tanh{’}\sigma({W_{f}X_{t}+b_{f}})} j=k+1tSj1Sj=j=k+1ttanhσ(WfXt+bf)
假设 Z = t a n h ′ ( x ) σ ( y ) Z=tanh{&#x27;}(x)\sigma({y}) Z=tanh(x)σ(y),则Z的函数图像如下图所示:
在这里插入图片描述
可以看到该函数值基本上不是0就是1,所以 ∏ j = k + 1 t ∂ S j ∂ S j − 1 = ∏ j = k + 1 t t a n h ’ σ ( W f X t + b f ) ≈ 0 ∣ 1 \prod_{j=k+1}^{t}\frac{\partial{S_{j}}}{\partial{S_{j-1}}}=\prod_{j=k+1}^{t}{tanh{’}\sigma({W_{f}X_{t}+b_{f}})}\approx0|1 j=k+1tSj1Sj=j=k+1ttanhσ(WfXt+bf)01,即解决了传统RNN中梯度消失的问题。

推导forget gate,input gate,cell state, hidden information等的变化;因为LSTM有进有出且当前的cell informaton是通过input gate控制之后叠加的,RNN是叠乘,因此LSTM可以防止梯度消失或者爆炸。

LSTM的变体
流形的 LSTM 变体

由 Gers & Schmidhuber (2000) 提出的,增加了 “peephole connection”。即让门层 也会接受细胞状态的输入。
在这里插入图片描述
上面的图例中,我们增加了 peephole 到每个门上,但是许多论文会加入部分的 peephole 而非所有都加。

GRU(Gated Recurrent Unit)

GRU由 Cho, et al. (2014) 提出。在 GRU 中,只有两个门:重置门(reset gate)和更新门(update gate)。同时在这个结构中,把细胞状态和隐藏状态进行了合并。最后模型比标准的 LSTM 结构要简单,而且这个结构后来也非常流行。
在这里插入图片描述
其中, r t r_t rt表示重置门, z t z_t zt表示更新门。重置门决定是否将之前的状态忘记。当 r t r_t rt趋于 0 的时候,前一个时刻的状态信息 h t − 1 h_{t-1} ht1会被忘掉,隐藏状态 h t ~ \tilde{h_t} ht~会被重置为当前输入的信息。更新门决定是否要将隐藏状态更新为新的状态 h t ~ \tilde{h_t} ht~ (作用相当于合并了 LSTM 中的遗忘门和传入门)。
和 LSTM 比较一下:
(1) GRU 少一个门,同时少了细胞状态 C t C_t Ct
(2) 在 LSTM 中,通过遗忘门和传入门控制信息的保留和传入;GRU 则通过重置门来控制是否要保留原来隐藏状态的信息,但是不再限制当前信息的传入。
(3) 在 LSTM 中,虽然得到了新的细胞状态 C t C_t Ct,但是还不能直接输出,而是需要经过一个过滤的处理: h t = o t ∗ t a n h ( C t ) h_t=o_t*tanh(C_t) ht=ottanh(Ct);同样,在 GRU 中, 虽然 (2) 中我们也得到了新的隐藏状态 h t ~ \tilde{h_t} ht~, 但是还不能直接输出,而是通过更新门来控制最后的输出: h t = ( 1 − z t ) ∗ h t − 1 + z t ∗ h t ~ h_t=(1-z_t)*h_{t-1}+z_t*\tilde{h_t} ht=(1zt)ht1+ztht~
其他变体,如Yao, et al. (2015) 提出的 Depth Gated RNN。还有用一些完全不同的观点来解决长期依赖的问题,如 Koutnik, et al. (2014) 提出的 Clockwork RNN。(见循环神经网络(RNN, Recurrent Neural Networks)介绍

参考网址:
LSTM如何解决梯度消失问题
Understanding LSTM Networks
[RNN介绍,较易懂]
(https://blog.csdn.net/prom1201/article/details/52221822)(上文的翻译)
(译)理解 LSTM 网络 (Understanding LSTM Networks by colah)(上文翻译+GRU)
LSTM在MNIST手写数据集上做分类(代码中尺寸变换细节)
https://blog.csdn.net/u010858605/article/details/78696325

### 回答1: 电脑桌面显示配置是指对电脑桌面上的图标、背景、分辨率等进行调整和设置。在Windows操作系统中,可以通过右键点击桌面空白处选择“个性化”来打开桌面显示配置界面。在这里,我们可以更改桌面背景图片、设置图标大小和排列方式,还可以调整电脑屏幕的分辨率以适应不同大小的显示器。 另外,如果想要让电脑桌面更加个性化,我们还可以下载和安装各种小部件和皮肤软件,通过它们来自定义桌面图标和壁纸,实现更多的视觉效果和功能。 而IP地址是指互联网协议地址,是一种用于在网络上唯一识别一个设备的地址。在Windows操作系统中,可以通过命令行工具或者控制面板来查看电脑IP地址。比如,我们可以按下Win键 + R键打开运行窗口,然后输入“cmd”(不带引号)并按下回车键,就会打开命令行窗口。在命令行中,可以输入“ipconfig”命令来查看电脑IP地址、子网掩码、网关等网络配置信息。 总之,电脑桌面显示配置IP地址都是在日常使用电脑时会涉及到的一些设置和信息。这些设置可以让我们更好地个性化电脑桌面,并且了解电脑所在网络的一些基本信息。 ### 回答2: 电脑桌面显示配置是指对电脑的显示器进行设置,包括屏幕分辨率、壁纸、桌面图标、任务栏等。我们可以在“控制面板”中找到“显示”选项,然后对显示器进行个性化的设置。 首先,屏幕分辨率是指屏幕上横向和纵向的像素数量,决定了屏幕上能显示多少信息。一般而言,我们可以根据自己的需要来选择适合自己的分辨率。较高的分辨率可以提供更清晰的图像,但可能使文本和图标变得更小,较低的分辨率则相反。 其次,壁纸是指桌面背景的图像或颜色。我们可以从系统提供的壁纸中选择,也可以使用自己的图片作为壁纸。通过壁纸,我们可以个性化自己的电脑桌面,体现自己的喜好和风格。 还有,桌面图标是指显示在桌面上的各种快捷方式和文件夹图标。我们可以通过拖拽或右键菜单进行图标的增加、删除和排序,以方便我们快速访问所需的程序和文件。 最后,任务栏是显示在屏幕底部的水平栏,用于快速启动程序和切换窗口。我们可以根据自己的使用习惯自定义任务栏,比如将常用的程序固定到任务栏上,调整任务栏的位置和尺寸等。 至于IP地址,它是计算机在网络中的唯一标识。我们可以通过在命令提示符或网络设置中输入“ipconfig”命令来获取自己电脑IP地址IP地址分为IPv4和IPv6两种,一般IPv4是由四个0到255之间的数字组成,用点来分隔,例如192.168.0.1。而IPv6则更为复杂,包含八组四位十六进制数字,用冒号分隔。 总之,电脑桌面显示配置IP地址设置是为了提高用户使用电脑的便利性和个性化需求,根据自己的喜好和实际需求进行设置,以提升工作和娱乐效率。 ### 回答3: 电脑桌面显示配置指的是电脑显示器的设置和布局。我们可以通过右键点击桌面的空白位置,选择“显示设置”来进行配置。在显示设置中,可以调整分辨率、缩放比例、屏幕旋转、多个显示器的顺序和位置等。 首先,我们可以通过显示设置调整分辨率。分辨率决定了显示器上像素的数量,较高的分辨率意味着更清晰的图像。调整分辨率可以根据个人喜好或应用程序需求。 其次,我们可以调整缩放比例。缩放比例决定了在显示器上的元素的大小。较大的缩放比例使得文字和图标更大,方便阅读和操作。 另外,显示设置还可以实现屏幕的旋转。通过选择适应自己的工作或娱乐需求,可以将屏幕旋转为横向或纵向模式。 对于使用多个显示器的用户,还可以调整显示器的顺序和位置。这样可以模拟多屏幕工作环境,提高工作效率。 IP(Internet Protocol)是指互联网协议,用于在网络中标识和定位计算机和其他设备。每个连接到互联网上的设备都会被分配一个IP地址。 我们可以通过以下方法查看电脑IP地址。首先,打开命令提示符(按下Win + R,然后输入“cmd”并按Enter键),然后输入“ipconfig”命令并按Enter键。在命令的输出中,可以找到标有“IPv4地址”或“IP地址”的一行,后面的数字就是电脑IP地址。 另外,也可以在控制面板中找到网络和互联网设置,然后点击网络连接,查看本地连接的详细信息,其中包括IP地址。 通过以上方法,我们可以轻松查看电脑桌面的显示配置IP地址。这些信息对于个性化设置和网络连接都非常重要。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值