LSTM、BiLSTM讲解及实践+GRU讲解_对于 bilstm 来说,当前的项目或者隐藏状态总会比前一个更重要。

63 阅读12分钟

输入控制门用来更新重要信息,即就是用来确定什么样的新信息需要保留在cell的状态中。
输入控制门分两部分
1、

h

t

1

h_{t−1}

ht−1​和

x

t

x_t

xt​先经过S函数层得到

i

t

i_t

it​来确定什么样的值是重要的,在通过一个tanh层得到

C

t

~

\tilde{C_t}

Ct​~​,

i

t

i_t

it​也是范围0-1的一个概率值p,

i

t

i_t

it​做的事就是对目前为止学到的所有信息做一个过滤,它的概率值表明,现在学到的哪部分新知识可以更新我之前的记忆的,也就是拿它过滤本次记忆。而本次学到的所有知识就是

C

t

~

\tilde{C_t}

Ct​~​。要把本次学到的信息,放到之前学到的所有信息中。所以用

i

t

i_t

it​这个概率,对

C

t

~

\tilde{C_t}

Ct​~​做一个过滤,补充到之前学习到的信息中。
在这里插入图片描述
比如,在语言模型中,我们希望增加新的主语的性别到细胞状态中,来代替需要忘记的主语。

输入门工作过程:
在这里插入图片描述

2、更新cell状态

C

t

1

C_{t−1}

Ct−1​ 更新为

C

t

C_t

Ct​,更新过程如下
在这里插入图片描述

f

t

C

t

1

f_t*C_{t-1}

ft​∗Ct−1​就是忘记旧的值,

i

t

C

t

~

i_t *\tilde{C_t}

it​∗Ct​~​用来添加新的值。

f

t

f_t

ft​就是旧的记忆的通过率,也就是我们的gate门,

i

t

i_t

it​是本次信息的过滤器,

C

t

~

\tilde{C_t}

Ct​~​是本次学习到的知识。

细胞状态更新过程:
在这里插入图片描述

3.4 输出控制门

输出控制们用来确定我们需要输出什么值,输出值基于细胞状态。
我们先将

h

t

1

h_{t-1}

ht−1​和

x

t

x_t

xt​的组合经过Sigmoid函数层,再与

C

t

C_t

Ct​经过tanh层的结果相乘,确定输出部分:
在这里插入图片描述

C

t

C_t

Ct​是我更新以后之前所学到的全部知识,而当我解决当前需解决的问题的时候,只需要某些知识,因此,用一个

o

t

o_t

ot​去筛选,他依然是一个0-1之间的概率,他会从

C

t

C_t

Ct​所有知识中去筛选出来解决当前问题的信息,然后的出结果。
举个例子,同样在语言模型中,细胞状态中此时包含很多重要信息,比如:主语为单数形式,时态为过去时态,主语的性别为男性等,此时输入为一个主语,可能需要输出与动词相关的信息,这个时候只需要输出是单数形式和时态为过程,而不需要输出主语性别就可确定动词词性的变化。

输出门工作过程:
在这里插入图片描述

  

所以整个LSTM的更新和RNN是非常像的。唯一的区别是:我先确定我丢掉什么,我再确定我要添加什么,再把它加上,我再根据最后的记忆来产出结果。总的来说,LSTM用两个门来控制单元状态C的内容,一个是遗忘门(forget gate),它决定了上一时刻的单元状态

C

t

1

C_{t-1}

Ct−1​有多少保留到当前时刻

C

t

C_t

Ct​;另一个是输入门(input gate),它决定了当前时刻网络的输入

x

t

x_t

xt​有多少保存到单元状态

C

t

C_t

Ct​。LSTM用输出门(output gate)来控制单元状态

C

t

C_t

Ct​有多少输出到LSTM的当前输出值

h

t

h_t

ht​。

4、双向LSTM(Bi-directional LSTM)

如上篇文章BRNN所述同理,有些时候预测可能需要由前面若干输入和后面若干输入共同决定,这样会更加准确。因此提出了双向循环神经网络,网络结构如下图。可以看到Forward层和Backward层共同连接着输出层,其中包含了6个共享权值

w

1

w

6

w_1-w_6

w1​−w6​。
在这里插入图片描述
在Forward层从1时刻到t时刻正向计算一遍,得到并保存每个时刻向前隐含层的输出。在Backward层沿着时刻t到时刻1反向计算一遍,得到并保存每个时刻向后隐含层的输出。最后在每个时刻结合Forward层和Backward层的相应时刻输出的结果得到最终的输出,用数学表达式如下:
在这里插入图片描述

5、GRU(Gated Recurrent Unit)门控循环单元

5.1 GRU概述

GRU是LSTM网络的一种效果很好的变体,它较LSTM网络的结构更加简单,而且效果也很好,因此也是当前非常流形的一种网络。GRU既然是LSTM的变体,因此也是可以解决RNN网络中的长依赖问题。
在LSTM中引入了三个门函数:输入门、遗忘门和输出门来控制输入值、记忆值和输出值。而在GRU模型中只有两个门:分别是更新门和重置门。**GRU使用同一个门控

z

t

z_t

zt​就同时进行遗忘和选择记忆**,具体结构如下图所示:

图中的

z

t

z_t

zt​和

r

t

r_t

rt​分别表示更新门和重置门。更新门用于控制前一时刻的状态信息被带入到当前状态中的程度,更新门的值越大说明前一时刻的状态信息带入越多。重置门控制前一状态有多少信息被写入到当前的候选集

h

~

t

\tilde h{_t}

h~t​ 上,重置门越小,前一状态的信息被写入的越少。

5.2 GRU前向传播

根据上面的GRU的模型图,我们来看看网络的前向传播公式:

在这里插入图片描述
其中[]表示两个向量相连,*表示矩阵的乘积。

(

1

z

t

)

h

t

1

(1-z_t)*h_{t-1}

(1−zt​)∗ht−1​: 表示对原本的隐藏状态进行选择性的忘记。

z

t

h

t

~

z_t*\tilde{h_t}

zt​∗ht​~​: 表示对包含当前节点信息的

h

t

~

\tilde{h_t}

ht​~​进行选择性的记忆,这里

z

t

z_t

zt​也会忘记上一维度

h

t

1

h_{t-1}

ht−1​中的一些不重要的信息。或者,这里我们更应当看作是对

h

t

1

h_{t-1}

ht−1​维度中的某些信息进行选择。

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​=(1−zt​)∗ht−1​+zt​∗ht​~​: 这一步操作就是忘记传递下来的

h

t

1

h_{t-1}

ht−1​中的某些维度信息,并加入当前节点输入的某些维度信息。

可以看到,这里的遗忘

(

1

z

t

)

(1-z_t)

(1−zt​)和选择

z

t

z_t

zt​是联动的。也就是说,对于传递进来的维度信息,我们会进行选择性遗忘,则遗忘了多少权重

(

1

z

t

)

(1-z_t)

(1−zt​),我们就会使用包含当前输入的

h

t

~

\tilde{h_t}

ht​~​中所对应的权重进行弥补

z

t

z_t

zt​。以保持一种“恒定”状态。

5.3 GRU的训练过程

从前向传播过程中的公式可以看出要学习的参数有

W

r

W

z

W

h

W

o

W_r、W_z、W_h、W_o

Wr​、Wz​、Wh​、Wo​。其中前三个参数都是拼接的(因为后先的向量也是拼接的),所以在训练的过程中需要将他们分割出来:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在算出了对各参数的偏导之后,就可以更新参数,依次迭代直到损失收敛。
概括来说,LSTM和GRU都是通过各种门函数来将重要特征保留下来,这样就保证了在long-term传播的时候也不会丢失。此外GRU相对于LSTM少了一个门函数,因此在参数的数量上也是要少于LSTM的,所以整体上GRU的训练速度要快于LSTM的。不过对于两个网络的好坏还是得看具体的应用场景。
关于GRU更好的文章参考:人人都能看懂的GRU

6、Keras实现LSTM和双向LSTM

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7、LSTM里面比较重要的几个问题:

7.1 为什么要使用激活函数?

如果不用激励函数(其实相当于激励函数是f(x) = x),在这种情况下你每一层输出都是上层输入的线性函数,很容易验证,无论你神经网络有多少层,输出都是输入的线性组合,与没有隐藏层效果相当,这种情况就是最原始的感知机(Perceptron)了。

正因为上面的原因,我们决定引入非线性函数作为激励函数,这样深层神经网络就有意义了(不再是输入的线性组合,可以逼近任意函数)。最早的想法是sigmoid函数或者tanh函数,输出有界,很容易充当下一层输入(以及一些人的生物解释balabala)。激活函数的作用是为了增加神经网络模型的非线性。否则你想想,没有激活函数的每层都相当于矩阵相乘。就算你叠加了若干层之后,无非还是个矩阵相乘罢了。所以你没有非线性结构的话,根本就算不上什么神经网络。
关于激活函数可以参见这篇文章,讲解的非常详细神经网络激活函数的作用是什么?

7.2 为什么用sigmoid,为什么不用relu?为什么不用tanh?

Sigmoid会饱和,确实,可能会带来问题。注意看公式,0-1才可以起到筛选的作用,如果用relu信息就会全过去了,信息它可能会爆炸,每层都会变大,下一层更大,就做不到把每层的信息都压缩到一个共同的范围了。

在这里插入图片描述

Relu是做不到的,它大于0的就全过去了,信息会越来越多。
在这里插入图片描述
用tanh的话,它双曲正切你想一下图像,它可能会出现一个负值,如-0.2,或者-0.5之类的,就会否定掉之前的全部的。

总结来说:激活函数求导,大于1或小于1,累乘的过程数值会不断变大或变小,出现梯度爆炸或梯度消失的问题。而relu求导梯度永远等于1,所以不会给信息造成影响。

7.3 为什么LSTM比RNN更能解决长时依赖?

RNN怎么修改

S

t

S_t

St​的?

S

t

img img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取