NLP-深度学习(二)

NLP | 深度学习(二)

一. RNN

1. RNN:

[1]. 图示

image-20201203002706462

[2] \(X_t\)为当前时刻的输入向量,\(h_t\)为当前时刻的输出向量。

[3] RNN模型考虑了上一时刻的输出结果\(h_{t-1}\),最终通过如下公式计算得到\(h_t\)(W, U为参数矩阵): \[ h_t = tanh(Wh_{t-1}+UX_t+b) \]

2. RNN的输入数据:

一个全连接层的输入为:batch_size * feature大小,batch_size是一次训练使用的样本数目,feature对应每个样本的特征向量。这里以输入为句子举例:batch_size是一次训练使用的句子数;feature是对句子的一个编码,是一个向量:可以通过获得每个词的词向量求平均。

RNN的输入是:batch_size * timestamp * feature,还是以输入为句子距离:batch_size含义不变;这里feature对应的是每个词的词向量;而timestamp这个时间序列就对应着句子的长度。按照文本中词出现的先后位置,他们将会顺序被处理。这样由于每一次RNN都会基于当前输入和上一次的输出,计算当前的输出,所以最终时刻的输出可以代表改句子的一个个编码,也就是说RNN可以学习文本信息。

由此我们进一步可以理解到,RNN中的时刻或者说是时间戳等等,其实就是我们对每个样本中数据制定一个处理顺序,RNN在训练中会按照这个顺序依次处理。这也是说为什么RNN适合序列数据的任务。

3. RNN的问题:

[1]. 梯度消失:

梯度消失是指在做反向传播,计算损失函数对权重的梯度时,随着越向后传播,梯度变得越来越小,这就意味着在网络的前面一些层的神经元,会比后面的训练要慢很多,甚至不会变化。致使结果不准确,训练时间非常长

[2]. 数学推导:

复习:时刻t的RNN输出结果为: \[ h_t = tanh(Wh_{t-1}+UX_t+b) \] 这里我们定义最终的预测结果为\(y_t\)\[ y_t = f(W_yh_t+b'_t) \] 损失函数为L(\(y'_t\)为真实标签值),t时刻损失为\(L_t\): \[ L_t = L(y_t,y'_t) \] 整体的损失(Loss)就是将所有时间戳下的损失加起来: \[ Loss = \sum_{t=1}^{T}L_t \] 某一时刻损失\(L_t\)对于参数W的梯度为: \[ \frac{\partial L_t}{\partial W} = \frac{\partial L_t}{\partial y_t}\frac{\partial y_t}{\partial h_t}\frac{\partial h_t}{\partial W} \]

\[ \frac{\partial h_t}{\partial W} = \frac{\partial h_1}{\partial W}\prod_{i=2}^{t}\frac{\partial h_i}{\partial h_{i-1} }=\frac{\partial h_1}{\partial W}*(\prod_{i=2}^{t}tanh'(*)W) \]

从式(7)中,展开是为了让我们能够更直观的去感受梯度。我们可以看到其中有一个连乘的式子,有关证明指出,如果W的最大特征值小于1,那么多次连乘后,这个梯度的值将会呈现指数级缩小,很快就接近于0,也就是我们之前说的梯度消失。相反的,多次练成就容易导致梯度过大,出现梯度爆炸的问题。

二. LSTM:

1. LSTM图示:

image-20201203015045951

2. LSTM前向传播计算

[1]. LSTM作为循环神经网络的一种,其输入数据的格式和RNN相同。

[2]. 作为对RNN的优化,LSTM使用了三个'门'来控制输入数据、上一时刻的输出数据在计算当前输出数据时所攒的比重,具体作用如下:

[3] 输入门\(i_t\)、遗忘门\(f_t\)、输出门\(o_t\)(\(\sigma\)是激活函数): \[ i_t = \sigma(W_i[h_{t-1},x_t]+b_i) \\ f_t = \sigma(W_f[h_{t-1},x_t]+b_f) \\ o_t = \sigma(W_o[h_{t-1},x_t]+b_o) \\ \] 遗忘门数值越大,长期记忆保存越多,即:之前时刻累积的记忆值使用的越多

输入门数值越大,短期记忆影响越大,即:当前时刻学习到的值使用的越多

遗忘门数值越大,遗忘程度越低,最终输出的数值越接近于记忆中的数值

[4] 记忆单元\(C\)用于保存一个记忆值\(C_t\),会参与到下一时刻的记忆值计算中: \[ C_t = f_t * C_{t-1} + i_t*C'_t \]

\[ C'_t = \sigma(W_c[h_{t-1},x_t]+b_c) \]

[5] 输出值\(h_t\)根据当前记忆中的数据获得,并使用遗忘门进行控制: \[ h_t = o_t * \sigma(C_t) \]

3. LSTM与RNN:

在介绍RNN时曾说他有两个问题:梯度消失和梯度爆炸,下面给出LSTM的解决方式:

  • 梯度受遗忘门控制,若将遗忘门训练到较大的值,该路径上就不会发生梯度消失

  • 梯度爆炸的问题可以通过梯度裁剪解决