Deep Learning | Andrew Ng (05-week1)—循环序列模型

【第 5 部分-序列模型-第一周】在吴恩达深度学习视频基础上,笔记总结,添加个人理解。后期复习阶段参考 大树先生的博客 链接看这里 大树先生 - ZJ

Coursera 课程 |deeplearning.ai |网易云课堂

CSDNhttp://blog.csdn.net/JUNJUN_ZHAO/article/details/79362639


循环序列模型 (Recurrent Neural Networks)

1.1 为什么选择序列模型?(Why sequence models?)

深度学习中最激动人心的领域之一:序列模型。

例如循环神经网络(RNN)在语音识别,自然语言处理等其他领域中引起变革。

能够应用序列模型的例子:语音识别、音乐生成、情感分类、DNA 序列分析、机器翻译、视频活动识别、名称实体识别等。

序列模型的应用

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

这里写图片描述

学习目标:学习构建自己的序列模型。


1.2 数学符号 (Notation)

定义数学符号开始,一步步构建序列模型。

这里写图片描述

  • 输入 x : Harry Potter and Hermione Granger invented a new spell.

目标:构建一个能够自动识别句中人名位置序列模型。—命名实体识别问题(Named-entity recognition)NER

此例子中为:识别 Harry Potter 和 Hermione Granger

x1x2x3......xt......x9 9 组特征表示上述 x 中 9 个单词。

  • 输出 y : 1 1 0 1 1 0 0 0 0

y1y2y3......yt......y9

t : 意味着这些是时间序列。

  • 输入序列的长度:Tx=9

  • 输出序列的长度:Ty=9

x(i)t : 第 i 个 训练样本 x 的第 t 个元素。 Tx(i) : 第 i 个训练样本的输入序列长度。

y(i)t : 第 i 个训练样本 y 的第 t 个元素。 Ty(i) : 第 i 个训练样本的输出序列长度。

这里写图片描述

使用自然语言处理 (NLP),如何在序列中表示单个单词?

首先,需要词汇表(字典)。列出在表示中所使用的所有单词。如图中所表示,不同的单词在自己的词汇表中对应得索引不同。
此例子中使用的 10000 个单词的词汇表,根据不同的商业模式,应用,所构建的词汇表不同,30000,50000,(大型互联网)1000000等。

One-hot 向量表示法:

如上图所示:x1 是一个 10000 维度的向量,只有 第 4075 索引位置是 1,其余位置都是 0 。

对于不在词汇表中的单词的表示:返回 <UNK> (Unknown Word)


1.3 循环神经网络模型 (Recurrent Neural Network Model)

对于上述 命名实体识别问题 (NER) 之所以不使用标准神经网络(standard network)来解决,是因为存在两个主要问题。

这里写图片描述

  1. 首先是在不同的例子中输入和输出可以是不同的长度。
  2. 像这样一个简单的神经网络架构,它不会共享在文本中不同位置上学到的特征。(例如卷积神经网络,可以传递学习到的特征等)
    • 此外,每一个训练样本都是一个 10,000 维的向量。所以,这只是一个非常大的输入层,同时,第一层的权重矩阵将最终具有大量的参数。

这里写图片描述

使用循环神经网络(RNN) 可以解决上述两个问题。

什么是循环神经网络?

如果你从左到右阅读句子,第一个单词 x1 以及 初始化 a0 零向量 ,带入到神经网络层(隐含层),尝试预测输出 y^1 ,同时在时间步 1 产生 a1 。然后,将 a1x2 带入到神经网络层(隐含层),尝试预测输出 y^2 ,然后前向广播,进入下一个时间步……直到最后输入 xTx ,输出 y^Ty 。因此,在每个时间步,循环神经网络将这个激活传递给下一个时间步,供它使用。

在这个例子中,Tx=Ty ,若 TxTy 不同,体系结构会改变一点。

上图中右侧图表,是在 论文或书籍中常见的图表,为了便于理解,Andrew Ng 使用左侧图表展开讲解。

每个时间步的参数是共享的,每一部分都受到参数的影响,如 Waa,Wax,Wya ,后面在解释这些参数的工作原理。

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

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

RNN 的一个弱点:,它只使用序列中较早的信息进行预测,特别是在预测 y^3 时,不使用 x4x5x6 等单词的信息。

例如:

  1. He said,”Teddy Roosevelt was a great President.”
  2. He said,”Teddy bears are on sale!”

上述例子中,Teddy Roosevelt 是人名。Teddy bears 并非我们想要识别的内容,但是如果只知道前三个单词 是无法准确识别的,还需要后面的单词信息。所以这个特定的神经网络结构的一个限制是,在某一时刻的预测使用输入或使用来自序列中较早的输入的信息,而不是在该序列的后面的信息。

后面的视频将讲解 双向递归神经网络 (BRNN),来解决这个问题。

这里写图片描述

前向传播:

a0=0

a1=g(Waaa0+Waxx1+ba)

y^1=g(Wyaa1+by)

at=g(Waaat1+Waxxt+ba)

y^t=g(Wyaat+by)
  • 对于激活函数计算 at 常用的是 tanh , 也有使用 Relu 的。(使用 tanh 函数梯度消失的问题会用其他方式解决)

  • 对于输出 y^ ,根据具体问题选取不同激活函数,如二分类问题可使用 sigmoid,其他 输出 如 softmax 等。

  • 注:其中Wax 中,前面的 a 表示要得到一个 a 类型的量,x 表示参数W 要乘以一个 x 类型的量,其余WaaWya 同理;

这里写图片描述

简化 RNN 符号表示:

at=g(Waaat1+Waxxt+ba)

y^t=g(Wyaat+by)

简化为:

at=g(Wa[at1,xt]+ba)

y^t=g(Wyat+by)

其中,使用矩阵的叠加简化:

  • Wa=[WaaWax] ,假如 a<t1> 是100维,x<t> 是10000 维,那么Waa 便是(100,100)维的矩阵,Wax 便是(100,10000)维的矩阵。堆叠起来,Wa 便是(100,10100)维的矩阵。
  • [a,x]=[a<t1>x<t>] 表示一个(10100)维的矩阵。

1.4 通过时间的反向传播 (Backpropogation through time)

上一节讲述的是 RNN 的基本结构,以及前向广播,这一节学习目标是:了解 RNN 的反向传播是如何工作的。

这里写图片描述

红色箭头方向是反向传播。

这里写图片描述

如上图所示:红色箭头方向是反向传播。绿色线参数相同。

逻辑回归损失,也称为交叉熵损失。

单个单一位置或单个时间预测的单个词汇的损失:

Lt(y^t,yt)=y(i)logy^t(1yt)log(1y^t)

如上图所示,每个特征元素计算损失值。

整个序列的整体损失:

L(y^,y)=t=1TyLt(y^t,yt)

以上是 RNN 前向和反向的工作原理,以上讲解的例子都是输入序列的长度等于输出序列的长度,接下来会展示更广泛的RNN架构。


1.5 不同类型的循环神经网络 (Different types of RNNs)

到目前为止,您已经看到了一种 RNN 架构,例如在 Name entity recognition 中Tx=Ty 。接下来介绍其他不同的 RNN 体系结构。

这里写图片描述

上图所示例子中,展示了多种不同的 RNN 架构。TxTy 存在不相等的情况。

这里写图片描述

  • Many-to-Many(相等) : Tx=Ty ,如 Name entity recognition (命名实体识别)。

  • Many-to-One : TxTyx=text,y=0/11...5 等,如 Sentiment Classification (情感分类),要对某个序列进行正负判别或者打星操作。在这种情况下,就是输入是一个序列,但输出只有一个值

  • One-to-One : 标准神经网络。

这里写图片描述

  • One-to- Many: TxTyx=Ø ,x 可以为空集, 如 Music generation (音乐生成) 。当你真正生成序列的时候,经常会把这些前一个合成的输出文件输入到下一层。

  • Many-to-Many(不等) : TxTy ,如 Machine translation (机器翻译),法语翻译成英语,单词数量是不同的,则使前半部分为 encoder,共 Tx 个,后半部分为 decoder ,共 Ty 个。

这里写图片描述

其中很有意思的一部分是 序列生成,下节讲解。


1.6 语言模型和序列生成 (Language model and sequence generation)

那么什么是语言模型?

这里写图片描述

在语音识别系统中,我说了一句话,然后一个语言模型能够告诉我,对于这句话识别得到的多种可能性中,哪种可能概率高。它所做的就是,可以告诉你某个特定的句子出现的概率是多少。

语言模型的基本工作原理可以理解为,输出一段语句,它可以给出每一部分的概率,表示为P(y1,y2......,yTy) ,注意,这里用 y 表示,比用 x 表示更合适。后面会解释。

这里写图片描述

如何建立一个语言模型呢?要使用 RNN 建立这样一个模型,你首先需要一个训练集包括大量的英文文本。NLP 术语:语料库。

如上图所示,在有了以上基础的前提下,在训练集中的一个句子。Cats average 15 hours of sleep a day.

这句话结尾需添加一个 Tokenize <EOS>代表句子结束。 然后 每一个单词 使用 One-hot vectors 表示。如 10000 维度的向量。

如上图所示,不在词汇表中的使用 <UNK> 表示。

对于训练样本 xt=yt1 , 下面解释为什么这么表示。

这里写图片描述

如上图所示:注意一开始,从左向右看,第一个词是未知的。

x1=0 ,a0=0 ,然后预测输出 y^1 使用 softmax ,假设词汇表是 10000 个,则预测输出的 概率是 P(a)P(aron)....P(cats)...P(Zulu) 额外还有 P(<UNK>)P(<EOS>) 共 10002 个。

然后在预测出第一个之后,会将第一个正确的单词作为输入,x2=y1 来预测第二个单词 y^2 , P(average | cats)。如上图所示,依次代入,一直到预测完最后一个单词。注意 因为句子结尾是 <EOS> 所以 最后一个的 输入为 x9=y8 ,输出为 y^9 P(<EOS>| ...... )

单个语句的损失函数(softmax 层后的函数输出):

L(y^t,yt)=iyitlogy^it

整个句子的损失函数:

L=Lt(y^t,yt)

简单的例子,一个句子有三个单词,分别定义为 y1,y2,y3 ,那么它的概率是:

P(y1,y2,y3)=P(y1)P(y2|y1)P(y3|y1,y2)

1.7 对新序列采样 (Sampling novel sequences)

在训练完一个序列模型之后,要想了解这个模型学习到了什么,可以采用一个非正式的方法是:进行一次新序列采样。

记住:一个序列模型,模拟了任意特定单词序列的概率。

我们要做的就是对这个概率分布进行采样,来生成一个新的单词序列。

这里写图片描述

首先 :x1=0 , a0=0 , 然后预测输出 y^1 ,得出的概率比如是:P(a)P(aron)….P(cats)…P(Zulu)P(<UNK>) ,然后 使用采样函数,如 np.random.choice 对 softmax 分布进行随机采样。得出 y^1 是 The, 然后输入到下一层,前向广播,进入下一个时间步。直到结束。

如何标记结束?有两种方式: 1. 词汇表中含有 <EOS> 2. 限定时间步,20 ,100 等。

而这个特定的程序有时会产生一个 <UNK> 的单词标记。如果你想确保你的算法从来没有产生这个标记,你可以做的一件事就是拒绝任何以未知的单词标记出来的样本,并且继续从其他词汇中重新采样,直到你得到一个不是未知的单词。

最后,经过以上步骤,就随机产生了一些序列语句。

这里写图片描述

目前我们建立的都是基于词汇的 RNN 模型,根据实际应用,也可以建立一个基于字符的 RNN 结构。如上图所示。

Vocabulary = [a,b,c,…0,1,…9, ; ,’, : , ,…A….Z]

相对应的 y1,y2,y3 都是字符,而不是单个词汇,如 Cats average …. y1=C,y2=a,y3=t,y4=

基于字符的优点: 不用担心 UNK 出现。
主要的缺点:最后会得到太多太长的序列,所以在捕捉句子中的依赖关系方面,效果并不是很好。计算训练成本也很高。

所以目前的趋势和常见的均是基于词汇的语言模型。但随着计算机运算能力的增强,在一些特定的情况下,也会开始使用基于字符的语言模型。

这里写图片描述

上图,左侧是 一则新闻,右侧是 模仿莎士比亚的诗。


1.8 带有神经网络的梯度消失 (Vanishing gradients with RNNs)

前面已经了解了 RNN 的工作原理,接下来了解其中存在的问题,以及解决办法。

基本的 RNN 算法,存在一个很大的问题: 就是梯度消失。

这里写图片描述

如图上所示:第一句 前面的 cat 单数 决定后面 是 was。 第二句 前面的 cats 复数决定后面是 were。这就是语言具有非常长期的依赖关系的一个例子。

而迄今为止我们已经看到了 RNN 的基础结构,它不是非常擅长捕获非常长期的依赖关系。

解释为什么?回想之前学过的梯度消失问题。

一个非常非常深的神经网络,前向传播,再反向传播,输出的 y^ 很难再影响前面层的权重。则 RNN 同理,梯度消失,不擅长捕捉长期依赖。

回想 梯度爆炸问题:指数级大的梯度 会导致 参数爆炸性增长,神经网络参数崩溃,会看到很多 NaN,这意味着在你的神经网络计算数值溢出的结果。

总结:训练很深的神经网络时,随着层数的增加,导数会出现指数级的下降,则导致 梯度消失。或者指数级的增加,导致梯度爆炸。

解决梯度爆炸问题可以使用 梯度修剪(gradient clipping)解决。观察梯度向量,如果大于某个阈值,可以适当地缩放梯度,保证其不会太大,(通过最大值 阈值来修剪),相对具有鲁棒性。

而梯度消失就比较难解决,下面介绍 GRU (Gated Recurrent Unit)门控循环单元,来解决这个问题。


1.9 GRU 单元 (Gated Recurrent Unit )

以上已经了解了基础 RNN 模型的运行机制。本节介绍 GRU 。改变了 神经网络隐藏层,使其可以更好的捕捉深层连接,并改善了梯度消失问题。

这里写图片描述

at=g(Wa[at1,xt]+ba)

如计算在时间 t 的激活值 at , 输入 权重 Wa ,上一个时间步的 激活值 at1 ,当前输入值 xt ,以及偏移量 ba 。激活函数 g ,比如是 tanh。 上图中 左侧部分,绘画了 输入及输出,经过 tanh 后,在经过 softmax ,再输出 y^t

讲解这个图的目的是,将使用类似的图来讲解 GRU。

这里写图片描述

c = memory cell : 记忆细胞,提供记忆能力,如 主语猫是单数还是复数。

  • ct=at 在 GRU 中这两个值是相同的,后面的 LSTM 中是不同的

  • c~t=tanh(Wc[ct1,xt]+bc

    c~t= : 候选值,代替 ct 的值,tanh 激活函数计算,Wc 权重,ct1 前一个时间步的记忆值,xt 当前输入值。bc 偏移项。

    重点:GRU 中的真正思想。(决定是否更新)

  • Γu=σ(Wu[ct1,xt]+bu)

    Γu :更新门 (符号比较像 门的边缘),0 到 1 之间的值。σ sigmoid 函数 (其函数图 回想下,介于 0 到 1 之间) u: update 更新

    假设 cat 输出 是 ct=1 (1 代表单数,0 代表复数)memory cell 在从左往右读的过程中,会一直记住 这个值,直到 到了 was ,根据 ct=1 所以决定用 was 。

    Γu 决定什么时候更新这个值,比如 看到 the cat 那么这是个好的时机去更新 ct=1

  • ct=Γuc~t+(1Γu)ct1

    ct 等于 门的值 element-wise 候选值, (1Γu) element-wise 旧的值。若 Γu1 则代表把候选值 设为新的值。 若 Γu0 则代表 不更新,还是用旧的值。

详细的图解看上图 左侧图示。简化的 GRU 示意图。

优点:从左到右扫描句子时,门可以决定在哪个时间是否更新值。指导需要使用记忆细胞的时候。

Γu=0.000000001 可以缓解梯度消失的问题,即使经过了很多很多的时间步,这个值也可以很好的维持。关键所在

注意细节: ct 可以是向量,比如 维度 100 ,同理 上图中所标注出来的,都是相同的维度。

这里写图片描述

完整 (Full) GRU :

再添加一个门 Γr ,r 可以理解为代表相关性(relativity),前一个 ct1 对于计算 c~t 有多大的相关性。

c~t=tanh(Wc[Γrct1,xt]+bc)

Γu=σ(Wu[ct1,xt]+bu)

Γr=σ(Wr[ct1,xt]+br)

ct=Γuc~t+(1Γu)ct1

at=ct

产生更大的影响,更好的缓解 梯度消失问题,GRU 是一个常用的版本。LSTM (Long Short Term Memory 长短时记忆网络)也是比较常用的。


1.10 长短期记忆 Long Short Term Memory Unit (LSTM)

上一节学习的 GRU ,它能够在序列中学习到非常深的连接,此外 LSTM 也可以做到这一点。且比 GRU 更有效。

这里写图片描述

GRU 回顾:

  • c~t : 代替记忆细胞的候选值。

  • Γu : 更新门,决定什么时候更新。

  • Γr :相关门,决定前面的序列对后面序列有多大的影响,彼此之间的相关性

  • ct : 由上述几个值,共同决定是否更新。

  • at=ct : 这里是相等的。

LSTM:

c~t=tanh(Wc[at1,xt]+bc)

(update) :

Γu=σ(Wu[at1,xt]+bu)

(forget) :

Γf=σ(Wf[at1,xt]+bf)

(output) :

Γo=σ(Wo[at1,xt]+bo)

ct=Γuc~t+Γfct1
# 是维持旧的记忆细胞的值,还是加上新的值。

at=Γoct

在本周结束后的作业练习中:上面的公式是这么写的

at=Γottanh(ct)

注意:这里是三个门,更新门,遗忘门,输出门。与 GRU 的区别,atct 不相等。

这里写图片描述

公式其实更好理解,上右侧图 展示的更加直观些。

上图下方的红色直线,说明 只要正确了设置了 更新门和遗忘门,LSTM 就能把 c0 一直往下传递到 后面某个记忆单元。这也是为什么 LSTM 和 GRU 善于维持更深的联系,及时经过很长很长的时间步。

此外,上述的 LSTM 与常用的 LSTM 单元 区别在于,

Γo,Γf,Γu 这些门值取决于,不仅是 at1,xt 有时也可以 偷窥下 ct1 的值,这叫做 窥视孔连接 (peephole connection),还有一个细节,如果 ct1 如果是 一个 100 维的向量,其中 第 50 位是 1 , 那么只会影响 第 50 位对应的门。

GRU 的优点:更简单,可以构建更深的网络,计算性能上,也运行的更快。
LSTM 优点:更加强大灵活,这是更好的选择。


1.11 双向神经网络 (Bidirectional RNN)

到现在,之前已经学习了解了大部分 RNN 模型的关键的构建,此外还有两个方法,可以构建更好的模型,其中之一就是双向神经网络,这个模型可以让你在序列的某点处,不仅可以获取之前的信息,也可以获取未来的信息。本节讲解。还有一个是 Deep RNN 下节讲解。

这里写图片描述

回顾之前的例子,命名实体识别问题(Named entity recognition),这个网络存在的一个问题是,当判断 Teddy 是否是人名中的一部分是,只看前面的部分是不够的,还需有后面的信息共同进行判断。需要使用 双向神经网络解决这个问题。

这里写图片描述

BRNN 工作原理:

上图中,绿色画笔绘画的部分就是,反向连接,从最后依次反向向前连接,因此网络构成了一个无环图(Acyclic graph)。

反向序列从 a4 ,反向进行,到a3 …..

所以整个前向广播,分为两部分,一部分是从左到右,另一部分是从右到左。

最终预测输出的值:y^t=g(Wy[at,at]+by)

(没有找到合适的 latex 在字母上方表示向左的箭头)

实践中,大部分的 NLP 问题,采用 BRNN W/LSTM (有 LSTM 单元的 BRNN 模型)是一个不错的选择。

BRNN 缺点:需要完整的数据的序列,才能预测任意位置。比如,构建语音识别系统,需要等待一个人说完整个句子,才能语音处理,并进一步识别,所以实际上的大型的应用,都是更加复杂的模型。


1.12 深层循环神经网络 (Deep RNNs)

目前为止,学习到的不同的 RNN 版本,每一个都可以独当一面,但是要学习非常复杂的函数,通常的做法是把 RNN 的多个层堆叠起来,来构建更深的模型。

目标:学习如何构建更深的模型。

这里写图片描述

与之前的 标准 (standard)RNN 相比,改变了下符号表示,将 a0 改为 a[1]0

a[l]t :l 表示 l 层。 t : 第 t 个时间步。

上图所示为,三个隐层的新网络。

其中a[2]3 的计算是:

a[2]3=g(Wa[2][a[2]2,a[1]3]+ba[2])

y1 输出之前可以做的改变是,增加纵向的连接,但是横向的连接不会增加。这种结构更加常见。

其中的单元,可以是 标准的 RNN ,也可以是 GRU ,或者 LSTM BRNN 。


PS: 欢迎扫码关注公众号:「SelfImprovementLab」!专注「深度学习」,「机器学习」,「人工智能」。以及 「早起」,「阅读」,「运动」,「英语 」「其他」不定期建群 打卡互助活动。

发布了186 篇原创文章 · 获赞 44 · 访问量 14万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章