学完了吴恩达的序列模型第一周的课,之前也用过各种库,但是对模型内部了解不深,宏观认识也不够,就总结一下以加深印象。

循环序列模型及应用场景分类

传统的神经网络模型往往需要相同维度的输出和输入,而在自然语言处理中,句子或词语的构成往往长短不一;此外由于语言的先后顺序对于语义的理解十分重要,所以采用循环序列模型能够更好的捕捉词语先后顺序的联系。

不同的RNN类型

在下面的命名实体识别例子中,Tx = Ty。但是在很多RNN模型中,Tx是不等于Ty的。根据Tx与Ty的关系,RNN模型包含以下几个类型:

  • Many to many: Tx=Ty 人名识别,实体识别
  • Many to many: Tx≠Ty 机器翻译
  • Many to one: Tx>1,Ty=1 文本分类,情感分类
  • One to many: Tx=1,Ty>1 语音生成,文本生成
  • One to one: Tx=1,Ty=1

循环序列模型总结之RNN
下面命名实体识别为例总结RNN基础模型

循环序列模型

本文主要对循环序列模型进行总结,并对应用场景进行分类
1. RNN
2. LSTM
3. GRU

RNN模型的前项传播

循环神经网络(RNN)是专门用来解决序列模型问题的。RNN模型结构如下:
循环序列模型总结之RNN

序列模型从左到右,依次传递,此例中,Tx=Ty。x<t>y<t>之间是隐藏神经元。a<t>会传入到第t+1个元素中,作为输入。其中,a<0>作为初始向量,一般为零向量。对于每个t时刻的的输出y<t>,总是和上一时刻的**值a<t1>和当前时刻的输入值x<t>有关。

RNN模型包含三类权重系数由下图所示:分别是Wax,Waa,Wya。且不同元素之间同一位置共享同一权重系数。
循环序列模型总结之RNN

在命名实体识别中,对于t时刻的**值at RNN内部的运算采用公式如下图:
循环序列模型总结之RNN
a<t>=tanh(WaxXt+Waaat1+ba) 进行计算。
对于当前时刻的输入是否是一个实体,通常进行softmax计算概率分布得出。

对于一般问题,RNN的正向传播(Forward Propagation)过程为:
a<t>=g(Waaa<t1>+Waxx<t>+ba)
y<t>=g(Wyaa<t>+by)
其中,g(⋅)表示**函数,不同的问题需要使用不同的**函数。

RNN模型的反向传播

针对上面识别人名的例子,经过RNN正向传播,单个元素的Loss function为:
L<t>(y^<t>,y<t>)=y<t>log y^<t>(1y<t>)log (1y^<t>)
则该所有元素的Loss function为:
L(y^,y)=t=1TyL<t>(y^<t>,y<t>)
对于Waa,Wax,ba求偏导数来进行更新
循环序列模型总结之RNN

存在的缺陷

缺陷1

得一提的是,以上所述的RNN为单向RNN,即按照从左到右顺序,单向进行,y^只与左边的元素有关。但是,有时候y^也可能与右边元素有关。例如下面两个句子中,单凭前三个单词,无法确定“Teddy”是否为人名,必须根据右边单词进行判断。

He said, “Teddy Roosevelt was a great President.”

He said, “Teddy bears are on sale!”
为了解决上述问题,有一种更为复杂的结构叫做Bi-RNN(双向RNN)我们在未来会加以讨论和总结。

缺陷2

  • 梯度爆炸
  • 梯度消失
    对于梯度爆炸,可以简单的将所计算的梯度进行区间限制。
    梯度消失,指的是在反向传播过程中,梯度计算为0无法更新参数的情况。在rnn中,如果序列较长,计算的梯度又接近于0,就会出现这种情况。
    对于梯度消失,RNN没有什么好的办法,因此有大神创造了LSTM模型来解决梯度消失的问题,下一篇将对LSTM进行总结。

参考:https://blog.csdn.net/red_stone1/article/details/79446105

相关文章: