吴恩达DeepLearning.ai笔记(5-1)– 循环序列模型
1.一些序列数据例子
2.数学符号
x<1>
x
<
1
>
输入序列X第一个单词,Tix
T
x
i
输入序列X的单词个数,X(i)<t>
X
(
i
)
<
t
>
第i个输入序列的第t个单词
- one-hot表示法
3.循环神经网络模型
- 为什么不使用传统的神经网络?
- 输入和输出数据在不同例子中可以有不同长度,即Tx T x 和Ty T y
- 从文本不同位置学到的特征不能共享,举例来说已经识别出位置x1 x 1 出现的Herry是人名的一部分,那么Herry出现在其他位置上,例如位置xt x t 也是Herry,我们希望它能自动识别出该位置也为人名的一部分。
- 循环神经网络(RNN)
- RNN两种表示图例,RNN的限制是在某一时刻的预测仅使用了序列之前的输入信息,没有使用序列后面的信息
- RNN前向传播
- a<t>=g1(waaa<t−1>+waxx<t>+ba)
- a < t > = g 1 ( w a a a < t − 1 > + w a x x < t > + b a )
- y^<t>=g2(wyaa<t>+by)
-
y
^
<
t
>
=
g
2
(
w
y
a
a
<
t
>
+
b
y
)
激活函数g1 - g 1 可以是tanh也可以是Relu,g2 g 2 如果是二分类选择sigmoid函数,多分类可以用softmax。
- 简化RNN符号
- 通过时间反向传播
损失函数
L<t>(y^<t>,y<t>)=−y<t>logy^<t>−(1−y<t>)log(1−y^<t>) 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)=∑Tyt=1L<t>(y^<t>,y<t>) L ( y ^ , y ) = ∑ t = 1 T y L < t > ( y ^ < t > , y < t > )
4.不同类型的循环神经网络
分为以下五种类型
一对一:传统的神经网络 一对多:音乐生成 多对一:情感分类 多对多(Tx=Ty T x = T y ):命名实体识别 多对多(T_x!=T_y):机器翻译
5.语言模型和序列生成
- 什么是语言模型
- 语言模型所做的就是它会告诉你某个特定的句子出现的概率是多少,它是语音识别系统和机器翻译系统的基本组成部分。语言模型做的基本工作是输入文本序列(y<1>,y<2>...y<Ty>)
- ( y < 1 > , y < 2 > . . . y < T y > ) ,估计序列中各个单词出现的可能性
- 用RNN构建语言模型
- 首先有一个英文文本语料库,语料库由数量众多的句子或文本组成。
- 标记化(Tokenize)句子,可以采用one-hot进行标记化 , EOS表示句子结束,UNK表示文本未知。
- 用RNN构建语言模型,如下图所示x<1>
x
<
1
>
,a<0>
a
<
0
>
初始化为0向量,经过softmax函数计算出y^<1>
y
^
<
1
>
(字典中任意的词为第一个词的概率),x<2>=y<1>
x
<
2
>
=
y
<
1
>
,y^<2>=p(average|cats)
y
^
<
2
>
=
p
(
a
v
e
r
a
g
e
|
c
a
t
s
)
,以此类推……
采用交叉熵函数作为损失函数
6.新序列采样
当训练好一个序列模型时,我们想要知道序列模型学到了什么,一个非正式的方法就是进行一次新序列采样。
一个序列模型模拟了任意特定单词序列的概率,我们要做的是根据这个概率分布进行采样,生成一个新的单词序列。
采样过程:输入a<0>
a < 0 > =0,x<1> x < 1 > =0,第一个时间步得到所有可能的输出,即经过softmax层得到的概率,根据softmax分布进行随机采样,np.random.choice随机采样,得到y^<1>
y
^
<
1
>
,将y^<1>
y
^
<
1
>
作为第二个时间步的输入,即x<2>=y^<1>
x
<
2
>
=
y
^
<
1
>
,以此类推……采样若输出EOS,采样停止。
- 基于字符的语言模型
- 基于字符的语言模型不会出现未知标识EOS这种情况,但其最后会得到太多太长的序列,在捕获句子中的依赖关系上不如基于词汇的语言模型。基于字符的语言模型计算代价高昂。
- 采用不同的语料训练出的模型
7.传统RNN的缺点
- 梯度消失问题
梯度消失问题导致基本的RNN不擅长处理长期依赖的问题。
举一个例子:
句1:The cat which already ate…,was full.
句 2:The cats which already ate…,were full.
两个句子中cat/cats和was/were应保持一致,这表明句子前面的单词对句子后面的单词有长期依赖,但是传统的RNN不善于捕获这种长期依赖效应,为什么那?之前讨论的在深层神经网络模型中存在的梯度消失问题(如上图所示),即输出y的梯度很难传播回去,即很难影响前面层的权重计算;同样,在RNN中也存在一样的问题。梯度消失问题在例子中也就意味着很难让一个神经网络记住看到的是单数名词还是复数名词,然后在句子后部生成依赖单复数形式的was或were。
所以基本的RNN模型会有很多局部影响,即y<3> y < 3 > 主要受y<3> y < 3 > 附近的值的影响,很难受到较远的值的影响。 - 梯度爆炸问题
在很深的神经网络中,反向传播时随着层数的增多,梯度不止可以指数级的下降也可以指数级的上升。事实上,梯度下降在训练RNN时是首要问题,尽管梯度爆炸也会出现,但是梯度爆炸很明显,因为指数级的梯度会让你的参数变的极其大,以至于你的网络参数崩溃,所以梯度爆炸很容易发现。当出现NaN或者不是数字的情况时,意味着网络计算出现了数值溢出。可以用梯度修剪(gradient clipping)解决梯度爆炸问题。
梯度修剪是观察梯度向量,若大于某个阈值,缩放梯度向量,保证它不会太大
8.门控循环单元GRU
- RNN隐藏单元可视化
- 简单的GRU
c:记忆细胞
c<t>=a<t> c < t > = a < t >
c~<t>=tanh(Wc[c<t−1>,x<t>]+bc) c ~ < t > = t a n h ( W c [ c < t − 1 > , x < t > ] + b c )
更新门:Γu=σ(Wu[c<t−1>,x<t>]+bu) Γ u = σ ( W u [ c < t − 1 > , x < t > ] + b u )
c<t>=Γu∗c~<t>+(1−Γu)∗c<t−1> c < t > = Γ u ∗ c ~ < t > + ( 1 − Γ u ) ∗ c < t − 1 >
GRU优点:当从左向右扫描句子时,通过门决定什么时间更新记忆细胞,缓解了梯度消失问题 - 完整的GRU单元
9.长短时记忆网络LSTM
相较于GRU,LSTM多了遗忘门、输出门。
- 窥视孔连接(peephole connection):门值不仅取决于a<t−1> a < t − 1 > ,x<t> x < t > ,有时也取决于c<t−1> c < t − 1 >
9.双向循环神经网络(Bidirectional RNN)
- 单向RNN遇到的问题
如果不根据Teddy后面的词判断,是很难识别出Teddy是否是它是不是人名。
y^<t>=g(wy[a⃗ <t>,a←<t>]+by) y ^ < t > = g ( w y [ a → < t > , a ← < t > ] + b y )
- 例如计算y^<3>
y
^
<
3
>
,首先我们计算a⃗ <1>
a
→
<
1
>
,a⃗ <2>
a
→
<
2
>
,a⃗ <3>
a
→
<
3
>
,然后计算a←<4>
a
←
<
4
>
,a←<3>
a
←
<
3
>
,最后根据公式得出y^<3>
y
^
<
3
>
。
BRNN缺点:需要完整的序列才能预测序列中的任意位置。
10.深层循环神经网络
a[l]<t> a [ l ] < t > 表示第l层t时刻的激活值,上图是一个3层的RNN,在输出前加一个深层网络的模型也是很常见。每个单元可以是标准RNN单元、GRU、LSTM均可,每一层采用BRNN也是可以的。