Coursera | Andrew Ng (05-week1)—循环序列模型
2018-02-27 14:18
896 查看
【第 5 部分-序列模型-第一周】在吴恩达深度学习视频基础上,笔记总结,添加个人理解。- ZJ
Coursera 课程 |deeplearning.ai |网易云课堂
CSDN:http://blog.csdn.net/JUNJUN_ZHAO/article/details/79362639
例如循环神经网络(RNN)在语音识别,自然语言处理等其他领域中引起变革。
能够应用序列模型的例子:语音识别、音乐生成、情感分类、DNA 序列分析、机器翻译、视频活动识别、名称实体识别等。
学习目标:学习构建自己的序列模型。
输入 x : Harry Potter and Hermione Granger invented a new spell.
目标:构建一个能够自动识别句中人名位置的序列模型。—命名实体识别问题(Named-entity recognition)NER
此例子中为:识别 Harry Potter 和 Hermione Granger
x⟨1⟩x⟨2⟩x⟨3⟩......x⟨t⟩......x⟨9⟩x⟨1⟩x⟨2⟩x⟨3⟩......x⟨t⟩......x⟨9⟩ 9 组特征表示上述 x 中 9 个单词。
输出 y : 1 1 0 1 1 0 0 0 0
y⟨1⟩y⟨2⟩y⟨3⟩......y⟨t⟩......y⟨9⟩y⟨1⟩y⟨2⟩y⟨3⟩......y⟨t⟩......y⟨9⟩
t : 意味着这些是时间序列。
输入序列的长度:Tx=9Tx=9
输出序列的长度:Ty=9Ty=9
x(i)⟨t⟩x(i)⟨t⟩: 第 i 个 训练样本 x 的第 t 个元素。 T(i)xTx(i) : 第 i 个训练样本的输入序列长度。
y(i)⟨t⟩y(i)⟨t⟩: 第 i 个训练样本 y 的第 t 个元素。 T(i)yTy(i) : 第 i 个训练样本的输出序列长度。
使用自然语言处理 (NLP),如何在序列中表示单个单词?
首先,需要词汇表(字典)。列出在表示中所使用的所有单词。如图中所表示,不同的单词在自己的词汇表中对应得索引不同。
此例子中使用的 10000 个单词的词汇表,根据不同的商业模式,应用,所构建的词汇表不同,30000,50000,(大型互联网)1000000等。
One-hot 向量表示法:
如上图所示:x⟨1⟩x⟨1⟩ 是一个 10000 维度的向量,只有 第 4075 索引位置是 1,其余位置都是 0 。
对于不在词汇表中的单词的表示:返回
1.首先是在不同的例子中输入和输出可以是不同的长度。
2.像这样一个简单的神经网络架构,它不会共享在文本中不同位置上学到的特征。(例如卷积神经网络,可以传递学习到的特征等)
此外,每一个训练样本都是一个 10,000 维的向量。所以,这只是一个非常大的输入层,同时,第一层的权重矩阵将最终具有大量的参数。
使用循环神经网络(RNN) 可以解决上述两个问题。
什么是循环神经网络?
如果你从左到右阅读句子,第一个单词 x⟨1⟩x⟨1⟩ 以及 初始化 a⟨0⟩a⟨0⟩ 零向量 ,带入到神经网络层(隐含层),尝试预测输出 y^⟨1⟩y^⟨1⟩,同时在时间步 1 产生 a⟨1⟩a⟨1⟩。然后,将 a⟨1⟩a⟨1⟩ 和 x⟨2⟩x⟨2⟩带入到神经网络层(隐含层),尝试预测输出 y^⟨2⟩y^⟨2⟩,然后前向广播,进入下一个时间步……直到最后输入 x⟨Tx⟩x⟨Tx⟩,输出 y^⟨Ty⟩y^⟨Ty⟩。因此,在每个时间步,循环神经网络将这个激活传递给下一个时间步,供它使用。
在这个例子中,Tx=TyTx=Ty ,若 Tx,TyTx,Ty 不同,体系结构会改变一点。
上图中右侧图表,是在 论文或书籍中常见的图表,为了便于理解,Andrew Ng 使用左侧图表展开讲解。
每个时间步的参数是共享的,每一部分都受到参数的影响,如 Waa,Wax,WyaWaa,Wax,Wya,后面在解释这些参数的工作原理。
RNN 的一个弱点:,它只使用序列中较早的信息进行预测,特别是在预测 y^⟨3⟩y^⟨3⟩ 时,不使用 x⟨4⟩,x⟨5⟩,x⟨6⟩x⟨4⟩,x⟨5⟩,x⟨6⟩ 等单词的信息。
例如:
He said,”Teddy Roosevelt was a great President.”
He said,”Teddy bears are on sale!”
上述例子中,Teddy Roosevelt 是人名。Teddy bears 并非我们想要识别的内容,但是如果只知道前三个单词 是无法准确识别的,还需要后面的单词信息。所以这个特定的神经网络结构的一个限制是,在某一时刻的预测使用输入或使用来自序列中较早的输入的信息,而不是在该序列的后面的信息。
后面的视频将讲解 双向递归神经网络 (BRNN),来解决这个问题。
前向传播:
a⟨0⟩=0⃗ a⟨0⟩=0→
a⟨1⟩=g(Waaa⟨0⟩+Waxx⟨1⟩+ba)a⟨1⟩=g(Waaa⟨0⟩+Waxx⟨1⟩+ba)
y^⟨1⟩=g(Wyaa⟨1⟩+by)y^⟨1⟩=g(Wyaa⟨1⟩+by)
a⟨t⟩=g(Waaa⟨t−1⟩+Waxx⟨t⟩+ba)a⟨t⟩=g(Waaa⟨t−1⟩+Waxx⟨t⟩+ba)
y^⟨t⟩=g(Wyaa⟨t⟩+by)y^⟨t⟩=g(Wyaa⟨t⟩+by)
对于激活函数计算 a⟨t⟩a⟨t⟩常用的是 tanh , 也有使用 Relu 的。
对于输出 y ,根据具体问题选取不同激活函数,如二分类问题可使用 sigmoid,其他 输出 如 softmax 等。
简化 RNN 符号表示:
a⟨t⟩=g(Waaa⟨t−1⟩+Waxx⟨t⟩+ba)a⟨t⟩=g(Waaa⟨t−1⟩+Waxx⟨t⟩+ba)
y^⟨t⟩=g(Wyaa⟨t⟩+by)y^⟨t⟩=g(Wyaa⟨t⟩+by)
简化为:
a⟨t⟩=g(Wa[a⟨t−1⟩,x⟨t⟩]+ba)a⟨t⟩=g(Wa[a⟨t−1⟩,x⟨t⟩]+ba)
y^⟨t⟩=g(Wya⟨t⟩+by)y^⟨t⟩=g(Wya⟨t⟩+by)
使用矩阵的叠加简化,如 a 的维度是 100,x 的维度是 10000,那么 WaaWaa 的维度是 (100,100),WaxWax 的维度是 (100,10000),叠加后 WaWa 的维度是 (100,100100),如上图中所示。
红色箭头方向是反向传播。
如上图所示:红色箭头方向是反向传播。绿色线参数相同。
逻辑回归损失,也称为交叉熵损失。
单个单一位置或单个时间单一预测的单个词汇的损失:
L⟨t⟩(y^⟨t⟩,y⟨t⟩)=−y(i)logy^⟨t⟩−(1−y⟨t⟩)log(1−y^⟨t⟩)L⟨t⟩(y^⟨t⟩,y⟨t⟩)=−y(i)logy^⟨t⟩−(1−y⟨t⟩)log(1−y^⟨t⟩)
如上图所示,每个特征元素计算损失值。
整个序列的整体损失:
L(y^,y)=∑t=1TyL⟨t⟩(y^⟨t⟩,y⟨t⟩)L(y^,y)=∑t=1TyL⟨t⟩(y^⟨t⟩,y⟨t⟩)
以上是 RNN 前向和反向的工作原理,以上讲解的例子都是输入序列的长度等于输出序列的长度,接下来会展示更广泛的RNN架构。
上图所示例子中,展示了多种不同的 RNN 架构。Tx和TyTx和Ty 存在不相等的情况。
Many-to-Many(相等) : Tx=TyTx=Ty ,如 Name entity recognition (命名实体识别)。
Many-to-One : Tx≠TyTx≠Ty,x=text,y=0/1或1...5x=text,y=0/1或1...5 等,如 Sentiment Classification (情感分类),
One-to-One : 标准神经网络。
One-to- Many: Tx≠TyTx≠Ty,x=Øx=Ø ,x 可以为空集, 如 Music generation (音乐生成) 。当你真正生成序列的时候,经常会把这些前一个合成的输出文件输入到下一层。
Many-to-Many(不等) : Tx≠TyTx≠Ty ,如 Machine translation (机器翻译),法语翻译成英语,单词数量是不同的,则使前半部分为 encoder,共 TxTx 个,后半部分为 decoder ,共 TyTy 个。
其中很有意思的一部分是 序列生成,下节讲解。
在语音识别系统中,我说了一句话,然后一个语言模型能够告诉我,对于这句话识别得到的多种可能性中,哪种可能概率高。它所做的就是,可以告诉你某个特定的句子出现的概率是多少。
语言模型的基本工作原理可以理解为,输出一段语句,它可以给出每一部分的概率,表示为P(y⟨1⟩,y⟨2⟩......,y⟨Ty⟩)P(y⟨1⟩,y⟨2⟩......,y⟨Ty⟩),注意,这里用 y 表示,比用 x 表示更合适。后面会解释。
如何建立一个语言模型呢?要使用 RNN 建立这样一个模型,你首先需要一个训练集包括大量的英文文本。NLP 术语:语料库。
如上图所示,在有了以上基础的前提下,在训练集中的一个句子。Cats average 15 hours of sleep a day.
这句话结尾需添加一个 Tokenize
如上图所示,不在词汇表中的使用
对于训练样本 x⟨t⟩=y⟨t−1⟩x⟨t⟩=y⟨t−1⟩, 下面解释为什么这么表示。
如上图所示:注意一开始,从左向右看,第一个词是未知的。
x⟨1⟩=0⃗ x⟨1⟩=0→,a⟨0⟩=0⃗ a⟨0⟩=0→,然后预测输出 y^⟨1⟩y^⟨1⟩ 使用 softmax ,假设词汇表是 10000 个,则预测输出的 概率是
然后在预测出第一个之后,会将第一个正确的单词作为输入,x⟨2⟩=y⟨1⟩x⟨2⟩=y⟨1⟩ 来预测第二个单词 y^⟨2⟩y^⟨2⟩ , P(average | cats)。如上图所示,依次代入,一直到预测完最后一个单词。注意 因为句子结尾是
单个语句的损失函数(softmax 层后的函数输出):
L(y^⟨t⟩,y⟨t⟩)=−∑iy⟨t⟩ilogy^⟨t⟩iL(y^⟨t⟩,y⟨t⟩)=−∑iyi⟨t⟩logy^i⟨t⟩
整个句子的损失函数:
L=∑L⟨t⟩(y^⟨t⟩,y⟨t⟩)L=∑L⟨t⟩(y^⟨t⟩,y⟨t⟩)
简单的例子,一个句子有三个单词,分别定义为 y⟨1⟩,y⟨2⟩,y⟨3⟩y⟨1⟩,y⟨2⟩,y⟨3⟩,那么它的概率是:
P(y⟨1⟩,y⟨2⟩,y⟨3⟩)=P(y⟨1⟩)P(y⟨2⟩|y⟨1⟩)P(y⟨3⟩|y⟨1⟩,y⟨2⟩)P(y⟨1⟩,y⟨2⟩,y⟨3⟩)=P(y⟨1⟩)P(y⟨2⟩|y⟨1⟩)P(y⟨3⟩|y⟨1⟩,y⟨2⟩)
记住:一个序列模型,模拟了任意特定单词序列的概率。
我们要做的就是对这个概率分布进行采样,来生成一个新的单词序列。
首先 :x⟨1⟩=0⃗ x⟨1⟩=0→ , a⟨0⟩=0⃗ a⟨0⟩=0→, 然后预测输出 y^⟨1⟩y^⟨1⟩ ,得出的概率比如是:P(a)P(aron)….P(cats)…P(Zulu)P(
如何标记结束?有两种方式: 1. 词汇表中含有
而这个特定的程序有时会产生一个
最后,经过以上步骤,就随机产生了一些序列语句。
目前我们建立的都是基于词汇的 RNN 模型,根据实际应用,也可以建立一个基于字符的 RNN 结构。如上图所示。
Vocabulary = [a,b,c,…0,1,…9, ; ,’, : , ,…A….Z]
相对应的 y⟨1⟩,y⟨2⟩,y⟨3⟩y⟨1⟩,y⟨2⟩,y⟨3⟩ 都是字符,而不是单个词汇,如 Cats average …. y⟨1⟩=C,y⟨2⟩=a,y⟨3⟩=t,y⟨4⟩=空格y⟨1⟩=C,y⟨2⟩=a,y⟨3⟩=t,y⟨4⟩=空格等
基于字符的优点: 不用担心 UNK 出现。
主要的缺点:最后会得到太多太长的序列,所以在捕捉句子中的依赖关系方面,效果并不是很好。计算训练成本也很高。
上图,左侧是 一则新闻,右侧是 模仿莎士比亚的诗。
基本的 RNN 算法,存在一个很大的问题: 就是梯度消失。
如图上所示:第一句 前面的 cat 单数 决定后面 是 was。 第二句 前面的 cats 复数决定后面是 were。这就是语言具有非常长期的依赖关系的一个例子。
而迄今为止我们已经看到了 RNN 的基础结构,它不是非常擅长捕获非常长期的依赖关系。
解释为什么?回想之前学过的梯度消失问题。
一个非常非常深的神经网络,前向传播,再反向传播,输出的 y^y^ 很难再影响前面层的权重。则 RNN 同理,梯度消失,不擅长捕捉长期依赖。
回想 梯度爆炸问题:指数级大的梯度 会导致 参数爆炸性增长,神经网络参数崩溃,会看到很多 NaN,这意味着在你的神经网络计算数值溢出的结果。
总结:训练很深的神经网络时,随着层数的增加,导数会出现指数级的下降,则导致 梯度消失。或者指数级的增加,导致梯度爆炸。
解决梯度爆炸问题可以使用 梯度修剪(gradient clipping)解决。观察梯度向量,如果大于某个阈值,可以适当地额缩放梯度,保证其不会太大,(通过最大值 阈值来修剪),相对具有鲁棒性。
而梯度消失就比较难解决,下面介绍 GRU (Gated Recurrent Unit)门控循环单元,来解决这个问题。
a⟨t⟩=g(Wa[a⟨t−1⟩,x⟨t⟩]+ba)a⟨t⟩=g(Wa[a⟨t−1⟩,x⟨t⟩]+ba)
如计算在时间 t 的激活值 a⟨t⟩a⟨t⟩ , 输入 权重 WaWa,上一个时间步的 激活值 a⟨t−1⟩a⟨t−1⟩,当前输入值 x⟨t⟩x⟨t⟩,以及偏移量 baba。激活函数 g ,比如是 tanh。 上图中 左侧部分,绘画了 输入及输出,经过 tanh 后,在经过 softmax ,再输出 y^⟨t⟩y^⟨t⟩。
讲解这个图的目的是,将使用类似的图来讲解 GRU。
c = memory cell : 记忆细胞,提供记忆能力,如 主语猫是单数还是复数。
c⟨t⟩=a⟨t⟩c⟨t⟩=a⟨t⟩ 在 GRU 中这两个值是相同的,后面的 LSTM 中是不同的
c~⟨t⟩==tanh(Wc[c⟨t−1⟩,x⟨t⟩]+bc)c~⟨t⟩==tanh(Wc[c⟨t−1⟩,x⟨t⟩]+bc)
c~⟨t⟩=c~⟨t⟩= : 候选值,代替 c⟨t⟩c⟨t⟩的值,tanh 激活函数计算,WcWc 权重,c⟨t−1⟩c⟨t−1⟩ 前一个时间步的记忆值,x⟨t⟩x⟨t⟩ 当前输入值。bc)bc) 偏移项。
重点:GRU 中的真正思想。(决定是否更新)
Γu=σ(Wu[c⟨t−1⟩,x⟨t⟩]+bu)Γu=σ(Wu[c⟨t−1⟩,x⟨t⟩]+bu)
ΓuΓu:更新门 (符号比较像 门的边缘),0 到 1 之间的值。σσ sigmoid 函数 (其函数图 回想下,介于 0 到 1 之间) u: update 更新
假设 cat 输出 是 c⟨t⟩=1c⟨t⟩=1 (1 代表单数,0 代表复数)memory cell 在从左往右读的过程中,会一直记住 这个值,直到 到了 was ,根据 c⟨t⟩=1c⟨t⟩=1 所以决定用 was 。
ΓuΓu 决定什么时候更新这个值,比如 看到 the cat 那么这是个好的时机去更新 c⟨t⟩=1c⟨t⟩=1
c⟨t⟩=Γu∗c~⟨t⟩+(1−Γu)∗c⟨t−1⟩c⟨t⟩=Γu∗c~⟨t⟩+(1−Γu)∗c⟨t−1⟩
c⟨t⟩c⟨t⟩ 等于 门的值 element-wise 候选值, (1−Γu)(1−Γu) element-wise 旧的值。若 Γu≈1Γu≈1则代表把候选值 设为新的值。 若 Γu≈0Γu≈0则代表 不更新,还是用旧的值。
详细的图解看上图 左侧图示。简化的 GRU 示意图。
优点:从左到右扫描句子时,门可以决定在哪个时间是否更新值。指导需要使用记忆细胞的时候。
Γu=0.000000001Γu=0.000000001可以缓解梯度消失的问题,即使经过了很多很多的时间步,这个值也可以很好的维持。关键所在
注意细节: c⟨t⟩c⟨t⟩ 可以是向量,比如 维度 100 ,同理 上图中所标注出来的,都是相同的维度。
完整 (Full) GRU :
再添加一个门 ΓrΓr ,r 可以理解为代表相关性,前一个 c⟨t−1⟩c⟨t−1⟩ 对于计算 c~⟨t⟩c~⟨t⟩ 有多大的相关性。
c~⟨t⟩==tanh(Wc[Γr∗c⟨t−1⟩,x⟨t⟩]+bc)c~⟨t⟩==tanh(Wc[Γr∗c⟨t−1⟩,x⟨t⟩]+bc)
Γu=σ(Wu[c⟨t−1⟩,x⟨t⟩]+bu)Γu=σ(Wu[c⟨t−1⟩,x⟨t⟩]+bu)
Γr=σ(Wr[c⟨t−1⟩,x⟨t⟩]+br)Γr=σ(Wr[c⟨t−1⟩,x⟨t⟩]+br)
c⟨t⟩=Γu∗c~⟨t⟩+(1−Γu)∗c⟨t−1⟩c⟨t⟩=Γu∗c~⟨t⟩+(1−Γu)∗c⟨t−1⟩
a⟨t⟩=c⟨t⟩a⟨t⟩=c⟨t⟩
产生更大的影响,更好的缓解 梯度消失问题,GRU 是一个常用的版本。LSTM (Long Short Term Memory 长短时记忆网络)也是比较常用的。
GRU 回顾:
c~⟨t⟩c~⟨t⟩: 代替记忆细胞的候选值。
ΓuΓu: 更新门,决定什么时候更新。
ΓrΓr:相关门,决定前面的序列对后面序列有多大的影响,彼此之间的相关性
c⟨t⟩c⟨t⟩: 由上述几个值,共同决定是否更新。
a⟨t⟩=c⟨t⟩a⟨t⟩=c⟨t⟩: 这里是相等的。
LSTM:
c~⟨t⟩=tanh(Wc[a⟨t−1⟩,x⟨t⟩]+bc)c~⟨t⟩=tanh(Wc[a⟨t−1⟩,x⟨t⟩]+bc)
(update) : Γu=σ(Wu[a⟨t−1⟩,x⟨t⟩]+bu)Γu=σ(Wu[a⟨t−1⟩,x⟨t⟩]+bu)
(forget) :Γf=σ(Wf[a⟨t−1⟩,x⟨t⟩]+bf)Γf=σ(Wf[a⟨t−1⟩,x⟨t⟩]+bf)
(output) :Γo=σ(Wo[a⟨t−1⟩,x⟨t⟩]+bo)Γo=σ(Wo[a⟨t−1⟩,x⟨t⟩]+bo)
c⟨t⟩=Γu∗c~⟨t⟩+Γf∗c⟨t−1⟩c⟨t⟩=Γu∗c~⟨t⟩+Γf∗c⟨t−1⟩ # 是维持旧的记忆细胞的值,还是加上新的值。
a⟨t⟩=Γo∗c⟨t⟩a⟨t⟩=Γo∗c⟨t⟩
在本周结束后的作业练习中:上面的公式是这么写的
a⟨t⟩=Γ⟨t⟩o∗tanh(c⟨t⟩)a⟨t⟩=Γo⟨t⟩∗tanh(c⟨t⟩)
注意:这里是三个门,更新门,遗忘门,输出门。与 GRU 的区别,a⟨t⟩a⟨t⟩与c⟨t⟩c⟨t⟩不相等。
公式其实更好理解,上右侧图 展示的更加直观些。
上图下方的红色直线,说明 只要正确了设置了 更新门和遗忘门,LSTM 就能把 c⟨0⟩c⟨0⟩ 一直往下传递到 后面某个记忆单元。这也是为什么 LSTM 和 GRU 善于维持更深的联系,及时经过很长很长的时间步。
此外,上述的 LSTM 与常用的 LSTM 单元 区别在于,
Γo,Γf,ΓuΓo,Γf,Γu 这些门值取决于,不仅是 a⟨t−1⟩,x⟨t⟩a⟨t−1⟩,x⟨t⟩ 有时也可以 偷窥下 c⟨t−1⟩c⟨t−1⟩的值,这叫做 窥视孔连接 (peephole connection),还有一个细节,如果 c⟨t−1⟩c⟨t−1⟩ 如果是 一个 100 维的向量,其中 第 50 位是 1 , 那么只会影响 第 50 位对应的门。
GRU 的优点:更简单,可以构建更深的网络,计算性能上,也运行的更快。
LSTM 优点:更加强大灵活,这是更好的选择。
回顾之前的例子,命名实体识别问题(Named entity recognition),这个网络存在的一个问题是,当判断 Teddy 是否是人名中的一部分是,只看前面的部分是不够的,还需有后面的信息共同进行判断。需要使用 双向神经网络解决这个问题。
BRNN 工作原理:
上图中,绿色画笔绘画的部分就是,反向连接,从最后依次反向向前连接,因此网络构成了一个无环图(Acyclic graph)。
反向序列从 ←a⟨4⟩←a⟨4⟩,反向进行,到←a⟨3⟩←a⟨3⟩…..
所以整个前向广播,分为两部分,一部分是从左到右,另一部分是从右到左。
最终预测输出的值:y^⟨t⟩=g(Wy[a→⟨t⟩,a←⟨t⟩]+by)y^⟨t⟩=g(Wy[a→⟨t⟩,a←⟨t⟩]+by)
(没有找到合适的 latex 在字母上方表示向左的箭头)
实践中,大部分的 NLP 问题,采用 BRNN W/LSTM (有 LSTM 单元的 BRNN 模型)是一个不错的选择。
BRNN 缺点:需要完整的数据的序列,才能预测任意位置。比如,构建语音识别系统,需要等待一个人说完整个句子,才能语音处理,并进一步识别,所以实际上的大型的应用,都是更加复杂的模型。
目标:学习如何构建更深的模型。
与之前的 标准 (standard)RNN 相比,改变了下符号表示,将 a⟨0⟩a⟨0⟩ 改为 a[1]<0⟩a[1]<0⟩
a[l]<t⟩a[l]<t⟩:ll 表示 ll 层。 t : 第 t 个时间步。
上图所示为,三个隐层的新网络。
其中a[2]<3⟩a[2]<3⟩ 的计算是:
a[2]<3⟩=g(W[2]a[a[2]<2⟩,a[1]<3⟩]+b[2]a)a[2]<3⟩=g(Wa[2][a[2]<2⟩,a[1]<3⟩]+ba[2])
y⟨1⟩y⟨1⟩ 输出之前可以做的改变是,增加纵向的连接,但是横向的连接不会增加。这种结构更加常见。
其中的单元,可以是 标准的 RNN ,也可以是 GRU ,或者 LSTM BRNN 。
PS: 欢迎扫码关注公众号:「SelfImprovementLab」!专注「深度学习」,「机器学习」,「人工智能」。以及 「早起」,「阅读」,「运动」,「英语 」「其他」不定期建群 打卡互助活动。
Coursera 课程 |deeplearning.ai |网易云课堂
CSDN:http://blog.csdn.net/JUNJUN_ZHAO/article/details/79362639
循环序列模型 (Recurrent Neural Networks)
1.1 为什么选择序列模型?(Why sequence models?)
深度学习中最激动人心的领域之一:序列模型。例如循环神经网络(RNN)在语音识别,自然语言处理等其他领域中引起变革。
能够应用序列模型的例子:语音识别、音乐生成、情感分类、DNA 序列分析、机器翻译、视频活动识别、名称实体识别等。
学习目标:学习构建自己的序列模型。
1.2 数学符号 (Notation)
从定义数学符号开始,一步步构建序列模型。输入 x : Harry Potter and Hermione Granger invented a new spell.
目标:构建一个能够自动识别句中人名位置的序列模型。—命名实体识别问题(Named-entity recognition)NER
此例子中为:识别 Harry Potter 和 Hermione Granger
x⟨1⟩x⟨2⟩x⟨3⟩......x⟨t⟩......x⟨9⟩x⟨1⟩x⟨2⟩x⟨3⟩......x⟨t⟩......x⟨9⟩ 9 组特征表示上述 x 中 9 个单词。
输出 y : 1 1 0 1 1 0 0 0 0
y⟨1⟩y⟨2⟩y⟨3⟩......y⟨t⟩......y⟨9⟩y⟨1⟩y⟨2⟩y⟨3⟩......y⟨t⟩......y⟨9⟩
t : 意味着这些是时间序列。
输入序列的长度:Tx=9Tx=9
输出序列的长度:Ty=9Ty=9
x(i)⟨t⟩x(i)⟨t⟩: 第 i 个 训练样本 x 的第 t 个元素。 T(i)xTx(i) : 第 i 个训练样本的输入序列长度。
y(i)⟨t⟩y(i)⟨t⟩: 第 i 个训练样本 y 的第 t 个元素。 T(i)yTy(i) : 第 i 个训练样本的输出序列长度。
使用自然语言处理 (NLP),如何在序列中表示单个单词?
首先,需要词汇表(字典)。列出在表示中所使用的所有单词。如图中所表示,不同的单词在自己的词汇表中对应得索引不同。
此例子中使用的 10000 个单词的词汇表,根据不同的商业模式,应用,所构建的词汇表不同,30000,50000,(大型互联网)1000000等。
One-hot 向量表示法:
如上图所示:x⟨1⟩x⟨1⟩ 是一个 10000 维度的向量,只有 第 4075 索引位置是 1,其余位置都是 0 。
对于不在词汇表中的单词的表示:返回
<UNK>(Unknown Word)
1.3 循环神经网络模型 (Recurrent Neural Network Model)
对于上述 命名实体识别问题 (NER) 之所以不使用标准神经网络来解决,是因为存在两个主要问题。1.首先是在不同的例子中输入和输出可以是不同的长度。
2.像这样一个简单的神经网络架构,它不会共享在文本中不同位置上学到的特征。(例如卷积神经网络,可以传递学习到的特征等)
此外,每一个训练样本都是一个 10,000 维的向量。所以,这只是一个非常大的输入层,同时,第一层的权重矩阵将最终具有大量的参数。
使用循环神经网络(RNN) 可以解决上述两个问题。
什么是循环神经网络?
如果你从左到右阅读句子,第一个单词 x⟨1⟩x⟨1⟩ 以及 初始化 a⟨0⟩a⟨0⟩ 零向量 ,带入到神经网络层(隐含层),尝试预测输出 y^⟨1⟩y^⟨1⟩,同时在时间步 1 产生 a⟨1⟩a⟨1⟩。然后,将 a⟨1⟩a⟨1⟩ 和 x⟨2⟩x⟨2⟩带入到神经网络层(隐含层),尝试预测输出 y^⟨2⟩y^⟨2⟩,然后前向广播,进入下一个时间步……直到最后输入 x⟨Tx⟩x⟨Tx⟩,输出 y^⟨Ty⟩y^⟨Ty⟩。因此,在每个时间步,循环神经网络将这个激活传递给下一个时间步,供它使用。
在这个例子中,Tx=TyTx=Ty ,若 Tx,TyTx,Ty 不同,体系结构会改变一点。
上图中右侧图表,是在 论文或书籍中常见的图表,为了便于理解,Andrew Ng 使用左侧图表展开讲解。
每个时间步的参数是共享的,每一部分都受到参数的影响,如 Waa,Wax,WyaWaa,Wax,Wya,后面在解释这些参数的工作原理。
RNN 的一个弱点:,它只使用序列中较早的信息进行预测,特别是在预测 y^⟨3⟩y^⟨3⟩ 时,不使用 x⟨4⟩,x⟨5⟩,x⟨6⟩x⟨4⟩,x⟨5⟩,x⟨6⟩ 等单词的信息。
例如:
He said,”Teddy Roosevelt was a great President.”
He said,”Teddy bears are on sale!”
上述例子中,Teddy Roosevelt 是人名。Teddy bears 并非我们想要识别的内容,但是如果只知道前三个单词 是无法准确识别的,还需要后面的单词信息。所以这个特定的神经网络结构的一个限制是,在某一时刻的预测使用输入或使用来自序列中较早的输入的信息,而不是在该序列的后面的信息。
后面的视频将讲解 双向递归神经网络 (BRNN),来解决这个问题。
前向传播:
a⟨0⟩=0⃗ a⟨0⟩=0→
a⟨1⟩=g(Waaa⟨0⟩+Waxx⟨1⟩+ba)a⟨1⟩=g(Waaa⟨0⟩+Waxx⟨1⟩+ba)
y^⟨1⟩=g(Wyaa⟨1⟩+by)y^⟨1⟩=g(Wyaa⟨1⟩+by)
a⟨t⟩=g(Waaa⟨t−1⟩+Waxx⟨t⟩+ba)a⟨t⟩=g(Waaa⟨t−1⟩+Waxx⟨t⟩+ba)
y^⟨t⟩=g(Wyaa⟨t⟩+by)y^⟨t⟩=g(Wyaa⟨t⟩+by)
对于激活函数计算 a⟨t⟩a⟨t⟩常用的是 tanh , 也有使用 Relu 的。
对于输出 y ,根据具体问题选取不同激活函数,如二分类问题可使用 sigmoid,其他 输出 如 softmax 等。
简化 RNN 符号表示:
a⟨t⟩=g(Waaa⟨t−1⟩+Waxx⟨t⟩+ba)a⟨t⟩=g(Waaa⟨t−1⟩+Waxx⟨t⟩+ba)
y^⟨t⟩=g(Wyaa⟨t⟩+by)y^⟨t⟩=g(Wyaa⟨t⟩+by)
简化为:
a⟨t⟩=g(Wa[a⟨t−1⟩,x⟨t⟩]+ba)a⟨t⟩=g(Wa[a⟨t−1⟩,x⟨t⟩]+ba)
y^⟨t⟩=g(Wya⟨t⟩+by)y^⟨t⟩=g(Wya⟨t⟩+by)
使用矩阵的叠加简化,如 a 的维度是 100,x 的维度是 10000,那么 WaaWaa 的维度是 (100,100),WaxWax 的维度是 (100,10000),叠加后 WaWa 的维度是 (100,100100),如上图中所示。
1.4 通过时间的反向传播 (Backpropogation through time)
上一节讲述的是 RNN 的基本结构,以及前向广播,这一节学习目标是:了解 RNN 的反向传播是如何工作的。红色箭头方向是反向传播。
如上图所示:红色箭头方向是反向传播。绿色线参数相同。
逻辑回归损失,也称为交叉熵损失。
单个单一位置或单个时间单一预测的单个词汇的损失:
L⟨t⟩(y^⟨t⟩,y⟨t⟩)=−y(i)logy^⟨t⟩−(1−y⟨t⟩)log(1−y^⟨t⟩)L⟨t⟩(y^⟨t⟩,y⟨t⟩)=−y(i)logy^⟨t⟩−(1−y⟨t⟩)log(1−y^⟨t⟩)
如上图所示,每个特征元素计算损失值。
整个序列的整体损失:
L(y^,y)=∑t=1TyL⟨t⟩(y^⟨t⟩,y⟨t⟩)L(y^,y)=∑t=1TyL⟨t⟩(y^⟨t⟩,y⟨t⟩)
以上是 RNN 前向和反向的工作原理,以上讲解的例子都是输入序列的长度等于输出序列的长度,接下来会展示更广泛的RNN架构。
1.5 不同类型的循环神经网络 (Different types of RNNs)
到目前为止,您已经看到了一种 RNN 架构,例如在 Name entity recognition 中Tx=TyTx=Ty。接下来介绍其他不同的 RNN 体系结构。上图所示例子中,展示了多种不同的 RNN 架构。Tx和TyTx和Ty 存在不相等的情况。
Many-to-Many(相等) : Tx=TyTx=Ty ,如 Name entity recognition (命名实体识别)。
Many-to-One : Tx≠TyTx≠Ty,x=text,y=0/1或1...5x=text,y=0/1或1...5 等,如 Sentiment Classification (情感分类),
One-to-One : 标准神经网络。
One-to- Many: Tx≠TyTx≠Ty,x=Øx=Ø ,x 可以为空集, 如 Music generation (音乐生成) 。当你真正生成序列的时候,经常会把这些前一个合成的输出文件输入到下一层。
Many-to-Many(不等) : Tx≠TyTx≠Ty ,如 Machine translation (机器翻译),法语翻译成英语,单词数量是不同的,则使前半部分为 encoder,共 TxTx 个,后半部分为 decoder ,共 TyTy 个。
其中很有意思的一部分是 序列生成,下节讲解。
1.6 语言模型和序列生成 (Language model and sequence generation)
那么什么是语言模型?在语音识别系统中,我说了一句话,然后一个语言模型能够告诉我,对于这句话识别得到的多种可能性中,哪种可能概率高。它所做的就是,可以告诉你某个特定的句子出现的概率是多少。
语言模型的基本工作原理可以理解为,输出一段语句,它可以给出每一部分的概率,表示为P(y⟨1⟩,y⟨2⟩......,y⟨Ty⟩)P(y⟨1⟩,y⟨2⟩......,y⟨Ty⟩),注意,这里用 y 表示,比用 x 表示更合适。后面会解释。
如何建立一个语言模型呢?要使用 RNN 建立这样一个模型,你首先需要一个训练集包括大量的英文文本。NLP 术语:语料库。
如上图所示,在有了以上基础的前提下,在训练集中的一个句子。Cats average 15 hours of sleep a day.
这句话结尾需添加一个 Tokenize
<EOS>代表句子结束。 然后 每一个单词 使用 One-hot vectors 表示。如 10000 维度的向量。
如上图所示,不在词汇表中的使用
<UNK>表示。
对于训练样本 x⟨t⟩=y⟨t−1⟩x⟨t⟩=y⟨t−1⟩, 下面解释为什么这么表示。
如上图所示:注意一开始,从左向右看,第一个词是未知的。
x⟨1⟩=0⃗ x⟨1⟩=0→,a⟨0⟩=0⃗ a⟨0⟩=0→,然后预测输出 y^⟨1⟩y^⟨1⟩ 使用 softmax ,假设词汇表是 10000 个,则预测输出的 概率是
P(a)P(aron)....P(cats)...P(Zulu)额外还有
P(<UNK>)P(<EOS>)共 10002 个。
然后在预测出第一个之后,会将第一个正确的单词作为输入,x⟨2⟩=y⟨1⟩x⟨2⟩=y⟨1⟩ 来预测第二个单词 y^⟨2⟩y^⟨2⟩ , P(average | cats)。如上图所示,依次代入,一直到预测完最后一个单词。注意 因为句子结尾是
<EOS>所以 最后一个的 输入为 x⟨9⟩=y⟨8⟩x⟨9⟩=y⟨8⟩ ,输出为 y^⟨9⟩y^⟨9⟩
P(<EOS>| ...... )。
单个语句的损失函数(softmax 层后的函数输出):
L(y^⟨t⟩,y⟨t⟩)=−∑iy⟨t⟩ilogy^⟨t⟩iL(y^⟨t⟩,y⟨t⟩)=−∑iyi⟨t⟩logy^i⟨t⟩
整个句子的损失函数:
L=∑L⟨t⟩(y^⟨t⟩,y⟨t⟩)L=∑L⟨t⟩(y^⟨t⟩,y⟨t⟩)
简单的例子,一个句子有三个单词,分别定义为 y⟨1⟩,y⟨2⟩,y⟨3⟩y⟨1⟩,y⟨2⟩,y⟨3⟩,那么它的概率是:
P(y⟨1⟩,y⟨2⟩,y⟨3⟩)=P(y⟨1⟩)P(y⟨2⟩|y⟨1⟩)P(y⟨3⟩|y⟨1⟩,y⟨2⟩)P(y⟨1⟩,y⟨2⟩,y⟨3⟩)=P(y⟨1⟩)P(y⟨2⟩|y⟨1⟩)P(y⟨3⟩|y⟨1⟩,y⟨2⟩)
1.7 对新序列采样 (Sampling novel sequences)
在训练完一个序列模型之后,要想了解这个模型学习到了什么,可以采用一个非正式的方法是:进行一次新序列采样。记住:一个序列模型,模拟了任意特定单词序列的概率。
我们要做的就是对这个概率分布进行采样,来生成一个新的单词序列。
首先 :x⟨1⟩=0⃗ x⟨1⟩=0→ , a⟨0⟩=0⃗ a⟨0⟩=0→, 然后预测输出 y^⟨1⟩y^⟨1⟩ ,得出的概率比如是:P(a)P(aron)….P(cats)…P(Zulu)P(
<UNK>) ,然后 使用采样函数,如
np.random.choice对 softmax 分布进行随机采样。得出 y^⟨1⟩y^⟨1⟩ 是 The, 然后输入到下一层,前向广播,进入下一个时间步。直到结束。
如何标记结束?有两种方式: 1. 词汇表中含有
<EOS>2. 限定时间步,20 ,100 等。
而这个特定的程序有时会产生一个
<UNK>的单词标记。如果你想确保你的算法从来没有产生这个标记,你可以做的一件事就是拒绝任何以未知的单词标记出来的样本,并且继续从其他词汇中重新采样,直到你得到一个不是未知的单词。
最后,经过以上步骤,就随机产生了一些序列语句。
目前我们建立的都是基于词汇的 RNN 模型,根据实际应用,也可以建立一个基于字符的 RNN 结构。如上图所示。
Vocabulary = [a,b,c,…0,1,…9, ; ,’, : , ,…A….Z]
相对应的 y⟨1⟩,y⟨2⟩,y⟨3⟩y⟨1⟩,y⟨2⟩,y⟨3⟩ 都是字符,而不是单个词汇,如 Cats average …. y⟨1⟩=C,y⟨2⟩=a,y⟨3⟩=t,y⟨4⟩=空格y⟨1⟩=C,y⟨2⟩=a,y⟨3⟩=t,y⟨4⟩=空格等
基于字符的优点: 不用担心 UNK 出现。
主要的缺点:最后会得到太多太长的序列,所以在捕捉句子中的依赖关系方面,效果并不是很好。计算训练成本也很高。
上图,左侧是 一则新闻,右侧是 模仿莎士比亚的诗。
1.8 带有神经网络的梯度消失 (Vanishing gradients with RNNs)
前面已经了解了 RNN 的工作原理,接下来了解其中存在的问题,以及解决办法。基本的 RNN 算法,存在一个很大的问题: 就是梯度消失。
如图上所示:第一句 前面的 cat 单数 决定后面 是 was。 第二句 前面的 cats 复数决定后面是 were。这就是语言具有非常长期的依赖关系的一个例子。
而迄今为止我们已经看到了 RNN 的基础结构,它不是非常擅长捕获非常长期的依赖关系。
解释为什么?回想之前学过的梯度消失问题。
一个非常非常深的神经网络,前向传播,再反向传播,输出的 y^y^ 很难再影响前面层的权重。则 RNN 同理,梯度消失,不擅长捕捉长期依赖。
回想 梯度爆炸问题:指数级大的梯度 会导致 参数爆炸性增长,神经网络参数崩溃,会看到很多 NaN,这意味着在你的神经网络计算数值溢出的结果。
总结:训练很深的神经网络时,随着层数的增加,导数会出现指数级的下降,则导致 梯度消失。或者指数级的增加,导致梯度爆炸。
解决梯度爆炸问题可以使用 梯度修剪(gradient clipping)解决。观察梯度向量,如果大于某个阈值,可以适当地额缩放梯度,保证其不会太大,(通过最大值 阈值来修剪),相对具有鲁棒性。
而梯度消失就比较难解决,下面介绍 GRU (Gated Recurrent Unit)门控循环单元,来解决这个问题。
1.9 GRU 单元 (Gated Recurrent Unit )
以上已经了解了基础 RNN 模型的运行机制。本节介绍 GRU 。改变了 神经网络隐藏层,使其可以更好的捕捉深层连接,并改善了梯度消失问题。a⟨t⟩=g(Wa[a⟨t−1⟩,x⟨t⟩]+ba)a⟨t⟩=g(Wa[a⟨t−1⟩,x⟨t⟩]+ba)
如计算在时间 t 的激活值 a⟨t⟩a⟨t⟩ , 输入 权重 WaWa,上一个时间步的 激活值 a⟨t−1⟩a⟨t−1⟩,当前输入值 x⟨t⟩x⟨t⟩,以及偏移量 baba。激活函数 g ,比如是 tanh。 上图中 左侧部分,绘画了 输入及输出,经过 tanh 后,在经过 softmax ,再输出 y^⟨t⟩y^⟨t⟩。
讲解这个图的目的是,将使用类似的图来讲解 GRU。
c = memory cell : 记忆细胞,提供记忆能力,如 主语猫是单数还是复数。
c⟨t⟩=a⟨t⟩c⟨t⟩=a⟨t⟩ 在 GRU 中这两个值是相同的,后面的 LSTM 中是不同的
c~⟨t⟩==tanh(Wc[c⟨t−1⟩,x⟨t⟩]+bc)c~⟨t⟩==tanh(Wc[c⟨t−1⟩,x⟨t⟩]+bc)
c~⟨t⟩=c~⟨t⟩= : 候选值,代替 c⟨t⟩c⟨t⟩的值,tanh 激活函数计算,WcWc 权重,c⟨t−1⟩c⟨t−1⟩ 前一个时间步的记忆值,x⟨t⟩x⟨t⟩ 当前输入值。bc)bc) 偏移项。
重点:GRU 中的真正思想。(决定是否更新)
Γu=σ(Wu[c⟨t−1⟩,x⟨t⟩]+bu)Γu=σ(Wu[c⟨t−1⟩,x⟨t⟩]+bu)
ΓuΓu:更新门 (符号比较像 门的边缘),0 到 1 之间的值。σσ sigmoid 函数 (其函数图 回想下,介于 0 到 1 之间) u: update 更新
假设 cat 输出 是 c⟨t⟩=1c⟨t⟩=1 (1 代表单数,0 代表复数)memory cell 在从左往右读的过程中,会一直记住 这个值,直到 到了 was ,根据 c⟨t⟩=1c⟨t⟩=1 所以决定用 was 。
ΓuΓu 决定什么时候更新这个值,比如 看到 the cat 那么这是个好的时机去更新 c⟨t⟩=1c⟨t⟩=1
c⟨t⟩=Γu∗c~⟨t⟩+(1−Γu)∗c⟨t−1⟩c⟨t⟩=Γu∗c~⟨t⟩+(1−Γu)∗c⟨t−1⟩
c⟨t⟩c⟨t⟩ 等于 门的值 element-wise 候选值, (1−Γu)(1−Γu) element-wise 旧的值。若 Γu≈1Γu≈1则代表把候选值 设为新的值。 若 Γu≈0Γu≈0则代表 不更新,还是用旧的值。
详细的图解看上图 左侧图示。简化的 GRU 示意图。
优点:从左到右扫描句子时,门可以决定在哪个时间是否更新值。指导需要使用记忆细胞的时候。
Γu=0.000000001Γu=0.000000001可以缓解梯度消失的问题,即使经过了很多很多的时间步,这个值也可以很好的维持。关键所在
注意细节: c⟨t⟩c⟨t⟩ 可以是向量,比如 维度 100 ,同理 上图中所标注出来的,都是相同的维度。
完整 (Full) GRU :
再添加一个门 ΓrΓr ,r 可以理解为代表相关性,前一个 c⟨t−1⟩c⟨t−1⟩ 对于计算 c~⟨t⟩c~⟨t⟩ 有多大的相关性。
c~⟨t⟩==tanh(Wc[Γr∗c⟨t−1⟩,x⟨t⟩]+bc)c~⟨t⟩==tanh(Wc[Γr∗c⟨t−1⟩,x⟨t⟩]+bc)
Γu=σ(Wu[c⟨t−1⟩,x⟨t⟩]+bu)Γu=σ(Wu[c⟨t−1⟩,x⟨t⟩]+bu)
Γr=σ(Wr[c⟨t−1⟩,x⟨t⟩]+br)Γr=σ(Wr[c⟨t−1⟩,x⟨t⟩]+br)
c⟨t⟩=Γu∗c~⟨t⟩+(1−Γu)∗c⟨t−1⟩c⟨t⟩=Γu∗c~⟨t⟩+(1−Γu)∗c⟨t−1⟩
a⟨t⟩=c⟨t⟩a⟨t⟩=c⟨t⟩
产生更大的影响,更好的缓解 梯度消失问题,GRU 是一个常用的版本。LSTM (Long Short Term Memory 长短时记忆网络)也是比较常用的。
1.10 长短期记忆 Long Short Term Memory Unit (LSTM)
上一节学习的 GRU ,它能够在序列中学习到非常深的连接,此外 LSTM 也可以做到这一点。且比 GRU 更有效。GRU 回顾:
c~⟨t⟩c~⟨t⟩: 代替记忆细胞的候选值。
ΓuΓu: 更新门,决定什么时候更新。
ΓrΓr:相关门,决定前面的序列对后面序列有多大的影响,彼此之间的相关性
c⟨t⟩c⟨t⟩: 由上述几个值,共同决定是否更新。
a⟨t⟩=c⟨t⟩a⟨t⟩=c⟨t⟩: 这里是相等的。
LSTM:
c~⟨t⟩=tanh(Wc[a⟨t−1⟩,x⟨t⟩]+bc)c~⟨t⟩=tanh(Wc[a⟨t−1⟩,x⟨t⟩]+bc)
(update) : Γu=σ(Wu[a⟨t−1⟩,x⟨t⟩]+bu)Γu=σ(Wu[a⟨t−1⟩,x⟨t⟩]+bu)
(forget) :Γf=σ(Wf[a⟨t−1⟩,x⟨t⟩]+bf)Γf=σ(Wf[a⟨t−1⟩,x⟨t⟩]+bf)
(output) :Γo=σ(Wo[a⟨t−1⟩,x⟨t⟩]+bo)Γo=σ(Wo[a⟨t−1⟩,x⟨t⟩]+bo)
c⟨t⟩=Γu∗c~⟨t⟩+Γf∗c⟨t−1⟩c⟨t⟩=Γu∗c~⟨t⟩+Γf∗c⟨t−1⟩ # 是维持旧的记忆细胞的值,还是加上新的值。
a⟨t⟩=Γo∗c⟨t⟩a⟨t⟩=Γo∗c⟨t⟩
在本周结束后的作业练习中:上面的公式是这么写的
a⟨t⟩=Γ⟨t⟩o∗tanh(c⟨t⟩)a⟨t⟩=Γo⟨t⟩∗tanh(c⟨t⟩)
注意:这里是三个门,更新门,遗忘门,输出门。与 GRU 的区别,a⟨t⟩a⟨t⟩与c⟨t⟩c⟨t⟩不相等。
公式其实更好理解,上右侧图 展示的更加直观些。
上图下方的红色直线,说明 只要正确了设置了 更新门和遗忘门,LSTM 就能把 c⟨0⟩c⟨0⟩ 一直往下传递到 后面某个记忆单元。这也是为什么 LSTM 和 GRU 善于维持更深的联系,及时经过很长很长的时间步。
此外,上述的 LSTM 与常用的 LSTM 单元 区别在于,
Γo,Γf,ΓuΓo,Γf,Γu 这些门值取决于,不仅是 a⟨t−1⟩,x⟨t⟩a⟨t−1⟩,x⟨t⟩ 有时也可以 偷窥下 c⟨t−1⟩c⟨t−1⟩的值,这叫做 窥视孔连接 (peephole connection),还有一个细节,如果 c⟨t−1⟩c⟨t−1⟩ 如果是 一个 100 维的向量,其中 第 50 位是 1 , 那么只会影响 第 50 位对应的门。
GRU 的优点:更简单,可以构建更深的网络,计算性能上,也运行的更快。
LSTM 优点:更加强大灵活,这是更好的选择。
1.11 双向神经网络 (Bidirectional RNN)
到现在,之前已经学习了解了大部分 RNN 模型的关键的构建,此外还有两个方法,可以构建更好的模型,其中之一就是双向神经网络,这个模型可以让你在序列的某点处,不仅可以获取之前的信息,也可以获取未来的信息。本节讲解。还有一个是 Deep RNN 下节讲解。回顾之前的例子,命名实体识别问题(Named entity recognition),这个网络存在的一个问题是,当判断 Teddy 是否是人名中的一部分是,只看前面的部分是不够的,还需有后面的信息共同进行判断。需要使用 双向神经网络解决这个问题。
BRNN 工作原理:
上图中,绿色画笔绘画的部分就是,反向连接,从最后依次反向向前连接,因此网络构成了一个无环图(Acyclic graph)。
反向序列从 ←a⟨4⟩←a⟨4⟩,反向进行,到←a⟨3⟩←a⟨3⟩…..
所以整个前向广播,分为两部分,一部分是从左到右,另一部分是从右到左。
最终预测输出的值:y^⟨t⟩=g(Wy[a→⟨t⟩,a←⟨t⟩]+by)y^⟨t⟩=g(Wy[a→⟨t⟩,a←⟨t⟩]+by)
(没有找到合适的 latex 在字母上方表示向左的箭头)
实践中,大部分的 NLP 问题,采用 BRNN W/LSTM (有 LSTM 单元的 BRNN 模型)是一个不错的选择。
BRNN 缺点:需要完整的数据的序列,才能预测任意位置。比如,构建语音识别系统,需要等待一个人说完整个句子,才能语音处理,并进一步识别,所以实际上的大型的应用,都是更加复杂的模型。
1.12 深层循环神经网络 (Deep RNNs)
目前为止,学习到的不同的 RNN 版本,每一个都可以独当一面,但是要学习非常复杂的函数,通常的做法是把 RNN 的多个层堆叠起来,来构建更深的模型。目标:学习如何构建更深的模型。
与之前的 标准 (standard)RNN 相比,改变了下符号表示,将 a⟨0⟩a⟨0⟩ 改为 a[1]<0⟩a[1]<0⟩
a[l]<t⟩a[l]<t⟩:ll 表示 ll 层。 t : 第 t 个时间步。
上图所示为,三个隐层的新网络。
其中a[2]<3⟩a[2]<3⟩ 的计算是:
a[2]<3⟩=g(W[2]a[a[2]<2⟩,a[1]<3⟩]+b[2]a)a[2]<3⟩=g(Wa[2][a[2]<2⟩,a[1]<3⟩]+ba[2])
y⟨1⟩y⟨1⟩ 输出之前可以做的改变是,增加纵向的连接,但是横向的连接不会增加。这种结构更加常见。
其中的单元,可以是 标准的 RNN ,也可以是 GRU ,或者 LSTM BRNN 。
PS: 欢迎扫码关注公众号:「SelfImprovementLab」!专注「深度学习」,「机器学习」,「人工智能」。以及 「早起」,「阅读」,「运动」,「英语 」「其他」不定期建群 打卡互助活动。
相关文章推荐
- Coursera | Andrew Ng (05-week2)—自然语言处理与词嵌入
- DeepLearning.ai学习笔记(五)序列模型 -- week1 循环序列模型
- Coursera | Andrew Ng (03-week1-1.12)—改善你的模型的表现
- Coursera 机器学习(by Andrew Ng)课程学习笔记 Week 7——支持向量机
- Coursera | Andrew Ng (01-week-1-1.3)—用神经网络进行监督学习
- Coursera | Andrew Ng (01-week-3-3.9)—神经网络的梯度下降法
- 机器学习之Coursera Andrew Ng 《Machine Learning》 week 6 test 2
- Coursera | Andrew Ng (02-week-1-1.9)—归一化输入
- Coursera | Andrew Ng (02-week-1-1.13)—梯度检验
- Coursera | Andrew Ng (03-week2-2.9)—什么是端到端的深度学习
- Coursera | Andrew Ng (03-week2-2.10)—是否要使用端到端的深度学习
- Coursera | Andrew Ng (01-week-1-1.4)—为什么深度学习会兴起?
- Coursera | Andrew Ng (01-week-2-2.6)—更多导数的例子
- Coursera | Andrew Ng (01-week-2-2.9)—Logistic 回归中的梯度下降法
- Coursera | Andrew Ng (03-week1-1.4)—满足和优化指标
- Coursera | Andrew Ng (02-week-1-1.6)—Dropout 正则化
- Coursera | Andrew Ng (03-week1-1.9)—可避免偏差
- Coursera | Andrew Ng (03-week2-2.7)—迁移学习
- Coursera | Andrew Ng (02-week-2-2.5)— 指数加权平均的偏差修正
- Coursera 机器学习(by Andrew Ng)课程学习笔记 Week 8(二)——降维