吴恩达Coursera深度学习课程 deeplearning.ai (5-1) 循环序列模型--课程笔记

1.1 为什么选择序列模型

序列模型的应用

  • 语音识别:将输入的语音信号直接输出相应的语音文本信息。无论是语音信号还是文本信息均是序列数据。
  • 音乐生成:生成音乐乐谱。只有输出的音乐乐谱是序列数据,输入可以是空或者一个整数。
  • 情感分类:将输入的评论句子转换为相应的等级或评分。输入是一个序列,输出则是一个单独的类别。
  • DNA序列分析:找到输入的DNA序列的蛋白质表达的子序列。
  • 机器翻译:两种不同语言之间的想换转换。输入和输出均为序列数据。
  • 视频行为识别:识别输入的视频帧序列中的人物行为。
  • 命名实体识别:从输入的句子中识别实体的名字。

image

1.2 数学符号

符号含义

  • x < t > 表示输入 x 中的第 t 个符号(单词)
  • y < t > 表示输出 y 中的第 t 个符号(单词)
  • x ( i ) < t > 表示第 i 个输入样本中的第 t 个符号(单词)
  • y ( i ) < t > 表示第 i 个输出样本中的第 t 个符号(单词)
  • T x 表示输入 x 的长度
  • T y 表示处处 y 的长度

字典编码

  • 利用一个字(词)典向量,通常有3-5万个字(词)。
  • 可以利用one-hot编码,指出输入的序列中每个单词的向量
    • 与字典向量大小一致
    • 是单词的索引位置1,其他位置0

image

1.3 循环神经网络模型

传统神经网络

试想我们如果将输入拆成每个字的 One-Hot 编码输入传统的深度神经网络中,经过一些隐藏层的计算得到输出 Y。

问题:

  • 输入和输出数据在不同的例子中可以有不同的长度;
  • 不能共享从文本不同位置所学习到的特征
  • 参数数量过多

循环神经网络

循环神经网络,从左到右一个字计算一步,每一步的计算不仅来自这一步的输入,也来自上一步的激活函数值。

image

  • 最左侧第一层假设了一个来自第零层的激活值向量(零向量或随机向量)
  • 有的研究论文上将循环神经网络的结构写成右边的形式,其和左边的形式是一致的。

循环神经网络是从左到右扫描数据的,同时共享每个时间步的参数。

  • Wax 管理从输入 x < t > 到隐藏层的连接
  • Waa 管理激活值 a < t > 到隐藏层的连接
  • Wya 管理隐藏层到激活值y的连接
  • 每个时间步都使用相同的 Wax,Waa,Wya

循环神经网络的前向传播

image

  • 计算每步的激活函数a: Tanh/ReLu
  • 计算每步的输出函数 y h a t

a < t > = g ( W a a a < t 1 > + W a x x < t > + b a )

y < t > = g ( W y a a < t > + b y )

  1. 每一步都有一个激活函数 a t 和一个输出函数 y t
  2. 激活函数 a t 来自于输入 x t 和上一步的激活函数 a t 1 , 输出函数 y t 来自于激活函数 a t
  3. 激活函数或者输出函数都是 g(WX+b) 这一点没有改变
  4. 参数W,b 的第一个下标表示是激活函数a 的参数还是输出函数 y 的参数, W的第二个下标表示这个参数是用来乘以那个输入的

前向传播参数的简化

下面参数可以精简合并为WX+b

扫描二维码关注公众号,回复: 2443974 查看本文章
a < t > = g ( W a a a < t 1 > + W a x x < t > + b a ) y < t > = g ( W y a a < t > + b y )

精简合并参数
a < t > = g ( W a [ a < t 1 > , x < t > ] + b a ) y < t > = g ( W y a < t > + b y )

其中

W a = [ W a a : W a x ] [ a < t 1 > , x < t > ] = [ a < t 1 > x < t > ] W y = W y a

image

1.4 穿越时间的反向传播

损失函数

L < t > ( y ^ < t > , y < t > ) = y < t > l o g y ^ < t > ( 1 y < t > ) l o g ( 1 y ^ < t > ) L ( y ^ , y ) = t = 1 T y L < t > ( y ^ < t > , y < t > )

image

前向传播从左到右,按照输入的次序进行,反向传播从右到左,好似穿越时间的传播。

1.5 不同类型的循环神经网络

输入和输出的长度不一定一样(Tx ?=? Ty)

  • One-to-one: 一个输入一个输出,相当于传统的简单神经网络
  • One-to-many: 音乐生成的例子,输入一个音乐的类型或者空值,直接生成一段音乐序列或者音符序列
  • Many-to-one: 情感分类问题中,我们要对某个序列进行正负判别或者打星操作。
  • Many-to-many (Tx equal Ty): 上几节介绍的命名实体识别
  • Myny-to-many (Tx not equal Ty): 语言翻译 (前一段都是输入的 encode,后一段都是输出的 decode)

image

1.6 语言模型和序列生成

在NLP中,构建语言模型是最基础也是最重要的工作之一,我们可以通过RNN来很好的实现。

什么是语言模型?

  • 语音识别中,两句话有相似的发音,但是实际中正确性却不相同
  • 如何让语音识别系统能够输出正确地给出想要的输出。
  • 也就是从输入的句子中,评估各个句子中各个单词出现的可能性,进而给出整个句子出现的可能性。
  • 语言模型在语音识别和语言翻译中都是基础的模型。

语言模型:具有语言结构和内在语法和单词顺序的模型,可以用来预测句子下一个单词是某个单词的概率,通过训练大量的语料库可以训练出语言模型。

image

使用RNN构建语言模型

  • 训练集:一个很大的语言文本语料库
  • Tokenize:将句子使用字典库标记化(反向索引)

    • 未出现在字典库中的词使用“UNK”来表示

      1. 使用零向量对输出进行预测,即预测第一个单词是某个单词的可能性
      2. 通过前面的输入,逐步预测后面一个单词出现的概率;
      3. 使用softmax损失函数计算损失,对网络进行参数更新,提升语言模型的准确率

image

原理:
1. 基于字典库,通过句子前面的输入预测该位置各个单词出现的概率;
2. 最后将各个位置单词的概率相乘得到句子的概率。

1.7 对新序列采样

对训练完的语言模型进行采样

训练完一个语言模型后,我们想知道模型学到了什么,可以从该模型中进行一次新序列采样来观察模型学到的知识。(非正式的方法)

采样的过程就是根据模型预测第一个单词是什么,然后根据第一个单词预测第二个单词是什么,以此类推。

image

字符模型

除了基于词汇的模型,还可以构建基于字符的模型。

  • 难以捕捉句子前后依赖关系
  • 会得到太多太长的输出序列
  • 训练代价比较高
  • 仅在特殊情况下使用

模型采样的例子

下图是一个新闻模型和一个莎士比亚模型的采样结果。

image

1.8 带有神经网络的梯度消失

梯度消失

看个例子

  • The cat, which already ate ………..,was full;
  • The cats, which already ate ………..,were full.

这两个句子,应该识别cat … was 识别 cats … were 但是中间部分单词可以很长,也就是单复数的依赖关系是长期依赖(long-term dependencies)

基本的RNN模型,不擅长捕获这种长期依赖,因为输出y得到的梯度很难通过反向传播再传播回去,也就是很难对前面几层的权重产生影响,这就是梯度消失的问题。

梯度爆炸

如果梯度指数级增大,会让参数变得太大而溢出,所以梯度爆炸比梯度消失更容易发现。解决方法就是用梯度修剪,也就是观察梯度向量,如果其大于某个阈值,则对其进行缩放,保证它不会太大。

1.9 GRU 单元

门控循环单元(Gated Recurrent Unit, GRU)改变了RNN的隐藏层,使其能够更好地捕捉深层次连接,并改善了梯度消失的问题。

RNN 单元

对于RNN的一个时间步的计算单元,在计算a也就是下图右边的公式,能以左图的形式可视化呈现:

image

简化的GRU单元

时间步从左到右进行计算的时候,在GRU单元中,存在一个新的变量称为c,(代表cell),作为“记忆细胞”,其提供了长期的记忆能力。

  • c < t > = a < t > ,实际上记忆细胞输出的是在t时间步上的激活值a;
  • c ˜ < t > = t a n h ( W c [ c < t 1 > , x < t > ] + b c ) ,在每一个时间步上,给定一个候选值 c ˜ < t > ,用以替代原本的记忆细胞 c < t >
  • Γ u = σ ( W u [ c < t 1 > , x < t > ] + b u ) ,代表更新门,是一个0-1的值,用以决定是否对当前时间步的记忆细胞用候选值更新替代;
  • c < t > = Γ u c ˜ < t > + 1 Γ u c < t 1 > ,记忆细胞的更新规则,门控值处于0-1之间,根据更新公式能够有效地缓解梯度消失的问题。
  • 其中, c < t > c ˜ < t > Γ u 均具有相同的维度;

因为Γu通常非常小,趋近于0,所以 c < t > 大多情况下都保持 c < t 1 > 不变,所以解决了深度网络中的长期依赖问题。

image

完整的 GRU 单元

完整的GRU单元还存在另外一个门 W u ,来决定候选值 W u 与原值 c < t 1 > 的相关程度。

image

1.10 长短期记忆(LSTM)

GRU能够让我们在序列中学习到更深的联系

image

长短期记忆(long short-term memory, LSTM)对捕捉序列中更深层次的联系要比GRU更加有效。

image

LSTM中,使用了单独的更新门Γu
和遗忘门Γf,以及一个输出门Γo
image

可以将多个 LSTM 单元连接起来,可以看出,适当的参数可以使记忆细胞顺利向更深层传递。

image

在实际使用时,几个门值不仅仅取决于 a < t 1 > x < t > ,还可能会取决于上一个记忆细胞的值 c < t 1 > ,这也叫做偷窥孔连接。

image

选择

  • GRU 有两个门,比较简单,计算快
  • LSTM 有三个门,复杂但是灵活(推荐)

1.11 双向神经网络

如下图仅通过前三个单词很难判断是否是人名,需要后面第四个单词进行佐证。

image

双向 RNN(bidirectional RNNs) 模型能够在序列的某处,不仅可以获取之前的信息,还可以获取未来的信息。

在双向 RNN 中,有一个从左到右再从右到左的环形前向传播,结果 y h a t 的预测依赖于从左到右的激活函数 a1 和从右向左的激活函数 a2。

image

y ^ < t > = g ( W y [ a < t > , a < t > ] + b y )

双向 RNN 模型更复杂,需要知道整个完整的输入才能预测值。在NLP问题中,常用的就是使用双向RNN的LSTM。

1.12 深层循环神经网络

与标准神经网络不同,深度循环神经网络每个激活值在每个层次,每个时间点都进行计算。

image

与其他深度神经网络不同,深度循环神经网络通常3层就算多的了,因为计算非常耗时。更常见的是在一定层次(比如三层)循环神经网络的基础上到预测结果之间加入其他的神经网络层,来增加预测的准确度。

image

猜你喜欢

转载自blog.csdn.net/haoyutiangang/article/details/81178024