机器学习周报第十四周

摘要

深层神经网络模型和循环神经网络(RNN)是深度学习中的两个关键组成部分,但它们都面临着一些挑战。为了不断提高这些模型的性能,研究人员提出了各种改善方法。对于深层神经网络,这些方法包括使用更深的层次结构,引入残差连接,批次归一化和不同类型的激活函数,以应对梯度消失和过拟合等问题。而在RNN中,改进的方法涵盖了长短时记忆网络(LSTM)和门控循环单元(GRU)等新的结构,以及双向RNN和注意力机制等技术,以捕捉序列数据中的长距离依赖性和提高模型的性能。

Abstract

Deep neural network models and recurrent neural networks (RNNs) are two key components in deep learning, but they both face a number of challenges. In order to continuously improve the performance of these models, researchers have proposed various methods for improvement. For deep neural networks, these methods include the use of deeper hierarchies, the introduction of residual connectivity, batch normalization, and different types of activation functions to cope with problems such as gradient vanishing and overfitting. Whereas in RNNs, the improvement approaches cover new structures such as Long Short-Term Memory Networks (LSTMs) and Gated Recurrent Units (GRUs), as well as techniques such as bi-directional RNNs and attentional mechanisms to capture long-range dependencies in sequential data and to improve the performance of the model.

一、改善深层神经网络

1.1 梯度消失和梯度爆炸

训练神经网络,尤其是深度神经所面临的一个问题就是梯度消失或梯度爆炸(vanishing and exploding gradients),也就是你训练神经网络的时候,导数或坡度有时会变得非常大,或者非常小,甚至于以指数方式变小,这加大了训练的难度。
如下图所示,假设你正在训练这样一个极深的神经网络神经网络每层只有两个隐藏单元,其中,激活函数为线性激活函数,b的值为0,则输出为 y = W [ L ] W [ L − 1 ] W [ L − 2 ] . . . W [ 1 ] X y=W^{[L]}W^{[L-1]}W^{[L-2]}...W^{[1]}X y=W[L]W[L1]W[L2]...W[1]X。假设权重矩阵比单位矩阵略大,那么随着层数的增加,y_hat会呈指数型增长,产生梯度爆炸;如果权重矩阵比单位矩阵略小,随着层数的增加,y_hat会呈指数型减小,产生梯度消失。
在这里插入图片描述
对于梯度爆炸和梯度消失的问题,可以控制深度网络的权值初始化来缓解。先看只有一个神经元的情况,单个神经元可能有4个输入特征,从x1到x4,如下图:因为b=0,先忽略b,为了预防z值过大或者过小,可以看到n越大,希望w_i越小,最合理的方法是设置为w_i = 1/n,n表示神经元的输入特征数量。设置第l层权重矩阵为:
其中, n [ l − 1 ] n^{[l-1]} n[l1]是第l-1层神经元的数量。代码如下:

w[l] = np.random.randn(n[l],n[l-1])*np.sqrt(1/n[l-1])

如果你是用的是Relu激活函数,方差设置为2/n,效果会更好。

w[l] = np.random.randn(n[l],n[l-1])*np.sqrt(2/n[l-1])

这里用的是 n [ l − 1 ] n^{[l-1]} n[l1],因为本例中,逻辑回归的特征是不变的。但一般情况下第l层上的每个神经元都有个 n [ l − 1 ] n^{[l-1]} n[l1]输入。如果激活函数的输入特征被零均值和标准方差化,方差是1,也会调整到相似范围,这就没解决问题(梯度消失和爆炸问题)。但它确实降低了梯度消失和爆炸问题,因为它给权重矩阵W设置了合理值,它不能比1大很多,也不能比1小很多,所以梯度没有爆炸或消失过快。
在这里插入图片描述

1.2 梯度检验

假设你的网络中有下列参数,梯度检验首先要做的是 W [ 1 ] W^{[1]} W[1], b [ 1 ] b^{[1]} b[1],…, W [ L ] W^{[L]} W[L], b [ L ] b^{[L]} b[L]这些矩阵构造成一维向量,然后将这些一维向量组合起来构成一个更大的一维向量θ。这样cost function J就可以表示成J(θ)。然后将反向传播过程通过梯度下降算法得到的 d W [ 1 ] dW^{[1]} dW[1], d b [ 1 ] db^{[1]} db[1],…, d W [ L ] dW^{[L]} dW[L], d b [ L ] db^{[L]} db[L] 按照一样的顺序构造成一个一维向量 dθ。 dθ的维度与 θ一致。具体分析如下图:
在这里插入图片描述
为了实施梯度检验,你要做的就是循环执行,从而对每个i也就是对每个θ组成元素计算的值,这里使用双边误差,也就是:
在这里插入图片描述
对于双边误差,两个向量应该会非常接近。为了检验,可以使用两个向量的欧式距离来检验两个向量的距离。分母只是用于预防这些向量太小或太大,分母使得这个方程式变成比率,我们执行这个方程式,ε可能为 1 0 − 7 10^{-7} 107,如果你发现上面方程式得到的值为或更小,这就很好,这就意味着导数逼近很有可能是正确的,它的值非常小。如果这个值在 1 0 − 5 10^{-5} 105范围内,就要小心了,表明梯度计算可能有问题,需要再次检查这个向量的所有项,确保没有一项误差过大,可能这里有bug。如果这个值为10^-3,或者更大,这时应该仔细检查所有θ项,经过一些调试,最终结果会是非常小的值。
在这里插入图片描述
但是对于梯度检测,有一些需要注意的事项。
首先,不要在训练中使用梯度检验,它只用于调试。为了实施梯度下降,你必须使用W和b反向传播来计算dθ,只有调试的时候才会计算它。
第二点,如果算法的梯度检验失败,要检查所有项,检查每一项,并试着找出bug。注意θ的各项与b和w的各项都是一一对应的。
第三点,在实施梯度检验时,如果使用正则化,请注意正则项。
第四点,梯度检验不能与dropout同时使用,因为每次迭代过程中,dropout会随机消除隐藏层单元的不同子集,难以计算dropout在梯度下降上的代价函数J。
最后一点,也是比较微妙的一点,现实中几乎不会出现这种情况,随机初始化时运行梯度检查。

1.3 小批量梯度下降

深度学习(deep learning)没有在大数据领域发挥最大的效果,我们可以利用一个巨大的数据集来训练神经网络,而在巨大的数据集基础上进行训练速度很慢。因此,你会发现,使用快速的优化算法,使用好用的优化算法能够大大提高你和团队的效率,那么,我们首先来谈谈mini-batch梯度下降法(Mini-batch Gradient Descent,MBGD)。
所以X的维度是(n_x,m),Y的维度是(1,m),向量化可以相对较快地处理所有m个样本,但是如果m很大时(500万或者5000万或者更大),处理速度仍然缓慢。在对整个训练集执行梯度下降法时,你必须处理整个训练集,然后才能进行一步梯度下降法,然后你需要再重新处理500万个训练样本,才能进行下一步梯度下降法。所以如果你在处理完整个500万个样本的训练集之前,先让梯度下降法处理一部分,你的算法速度会更快。你可以把训练集分割为小一点的子集训练,这些子集被取名为mini-batch。如果你的总训练样本个数m=5000000,维度是(n_x,m),假设每一个子集中只有1000个样本,把其中的x从1到1000取出来,将其称为第一个子训练集,也叫做mini-batch,然后你再取出接下来的1000个样本,从x从1000到2000,然后再取1000个样本,以此类推。在这里插入图片描述
梯度下降法的原理如下图所示。这是使用mini-batch梯度下降法训练样本的一步,代码中被称为进行“一代”(1 epoch)的训练。一代这个词意味着只是一次遍历了训练集。使用batch梯度下降法,一次遍历训练集只能让你做一个梯度下降,使用mini-batch梯度下降法,一次遍历训练集,能让你做5000个梯度下降。当然正常来说你想要多次遍历训练集,还需要为另一个while循环设置另一个for循环。所以你可以一直处理遍历训练集,直到最后你能收敛到一个合适的精度。如果你有一个丢失的训练集,mini-batch梯度下降法比batch梯度下降法运行地更快,所以几乎每个研习深度学习的人在训练巨大的数据集时都会用到
在这里插入图片描述
对于mini-batch的大小,如果总体样本数量m不太大时,例如m<2000,建议直接使用Batch gradient descent。然后,如果总体样本数量m很大时,建议将样本分成许多mini-batches。推荐常用的mini-batch size为64,128,256,512。这些都是2的幂。之所以这样设置的原因是考虑到电脑内存设置和使用的方式,计算机存储数据一般是2的幂,这样设置可以提高运算速度。最后,注意确保X{t}和Y{t}符合CPU/GPU内存。事实上mini-batch大小是另一个重要的变量,你需要做一个快速尝试,才能找到能够最有效地减少成本函数的那个,Andrew一般会尝试几个不同的值,几个不同的2次方,然后看能否找到一个让梯度下降优化算法最高效的大小。希望这些能够指导你如何开始找到这一数值。

1.4 指数加权平均

v_t是1/(1-β)天的平均值。当β=0.9时,是这10天的平均值,就是上图的红线部分。当β=0.98时,是这50天的平均值,就是上图的绿线部分。β值越大,你得到的曲线要平坦一些,原因在于你多平均了几天的温度,所以这个曲线,波动更小,更加平坦,缺点是曲线进一步右移,因为现在平均的温度值更多,要平均更多的值,指数加权平均公式在温度变化时,适应地更缓慢一些,所以会出现一定延迟。如果β=0.5,则平均了2天的温度,得到黄线如下:
在这里插入图片描述
由于仅平均了两天的温度,平均的数据太少,所以得到的曲线有更多的噪声,有可能出现异常值(outliers),但是这个曲线能够更快适应温度变化。所以指数加权平均数经常被使用,再说一次,它在统计学中被称为指数加权移动平均值,我们就简称为指数加权平均数。通过调整这个参数β,或者说后面的算法学习,你会发现这是一个很重要的参数,可以取得稍微不同的效果,往往中间有某个值效果最好,β为中间值时得到的红色曲线,比起绿线和黄线更好地平均了温度。
在这里插入图片描述

1.5 动量梯度下降

假设蓝色点开始梯度下降法(gradient descent),如果进行梯度下降法的一次迭代,无论是batch或mini-batch下降法,也许会指向这里,现在在椭圆的另一边,计算下一步梯度下降,结果或许如此,然后再计算一步,再一步,计算下去,会发现梯度下降法要很多计算步骤对吧?慢慢摆动(oscillate)到最小值(minimum),这种上下波动减慢了梯度下降法(gradient descent)的速度,就无法使用更大的学习率,如果要用较大的学习率(紫色箭头),结果可能会偏离函数的范围,为了避免摆动过大,要用一个较小的学习率。
另一个看待问题的角度是,在纵轴上,希望学习慢一点,因为不想要这些摆动,但是在横轴上,希望加快学习,快速从左向右移,移向最小值,移向红点。所以使用动量梯度下降法,需要做的是,在每次迭代中,确切来说在第t次迭代的过程中,会计算微分dW和db,计算公式如下图:
在这里插入图片描述
在上几个导数中,这些纵轴上的摆动平均值接近于零,所以在纵轴方向,希望放慢一点,平均过程中,正负数相互抵消,所以平均值接近于零。但在横轴方向,所有的微分都指向横轴方向,因此横轴方向的平均值仍然较大,因此用算法几次迭代后,动量梯度下降法最终纵轴方向的摆动变小了,横轴方向运动更快,因此算法走了一条更加直接的路径,在抵达最小值的路上减少了摆动。(红线)
从动量的角度来看,以权重W为例,V_dW可以成速度V,dW可以看成是加速度a。指数加权平均实际上是计算当前的速度,当前速度由之前的速度和现在的加速度共同影响。而0<β<1,又能限制速度V_dW过大。即当前速度是渐变的,而不是瞬变的,是动量的过程。这保证了梯度下降的平稳性和准确性,减少振荡,较快地达到最小值处。

1.6 RMSprop

RMSprop算法可以实现减缓b方向的学习(纵轴方向),同时加快,至少不减慢横轴方向的学习。我们希望在横轴(W方向)学习速度快,而在纵轴(b方向)减缓摆动,所以有了S_dW和S_db,所以我们W要除以一个较小的数(S_dW会相对较小),同理b要除以较大的数(S_db较大),这样就可以减缓纵轴上的变化。这些微分中,db较大,dW较小,也可观察函数的倾斜程度,纵轴要大于在横轴,公式处理的结果就是纵轴上的更新要被一个较大的数相除,就能消除摆动,而水平方向的更新则被较小的数相除。再说明一点,实际中dW和db是一个高维的参数向量,因为你对微分进行平方,然后使用平方根,这就是RMSprop,全称均方根(root mean square)。操作规程中,可以在S_dW和S_db的分母加上很小很小的值(10^-8),可以确保数值稳定。RMSprop跟Momentum有很相似的一点,可以消除梯度下降中的摆动,包括mini-batch梯度下降,并允许你使用一个更大的学习率,从而加快你的算法学习速度。
在这里插入图片描述

二、序列模型

2.1 为什么选择序列模型

循环神经网络(RNN)之类的模型在语音识别(speech recognition)、自然语言处理(natural language processing)和其他领域中引起变革。我们先看一些例子,这些例子都有效使用了序列模型。在语音识别(Speech recognition)时,给定了一个输入音频片段(audio clip)x,并要求输出对应的文字记录(text transcript)y。这个例子里输入和输出数据都是序列模型,因为x是一个按时播放的音频片段,输出y是一系列单词。所以之后将要学到的一些序列模型在语音识别方面是非常有用的。音乐生成问题(Music generation)是使用序列数据的另一个例子,在这个例子中,只有输出数据y是序列,而输入数据可以是空集(empty set),也可以是个单一的整数,这个数可能指代你想要生成的音乐风格,也可能是你想要生成的那首曲子的头几个音符。在处理情感分类(Sentiment classification)时,输入数据x是序列,你会得到类似这样的输入:“There is nothing to like in this movie.”,你认为这句评论对应几星?在DNA序列分析(DNA sequence analysis)时,你的DNA可以用A、C、G、T四个字母来表示。所以给定一段DNA序列,你能够标记出哪部分是匹配某种蛋白质的吗?在机器翻译(Machine translation)过程中,你会得到这样的输入句:“Voulez-vou chante avecmoi?”(法语:要和我一起唱么?),然后要求你输出另一种语言的翻译结果。在视频行为识别(Video activity recognition)时,你可能会得到一系列视频帧,然后要求你识别其中的行为。在命名实体识别(Name entity recognition)时,可能会给定一个句子要你识别出句中的人名。
在这里插入图片描述

2.2 循环神经网络

如上图所示,从左到右的顺序读这个句子,我们将第一个单词 x < 1 > x^{<1>} x<1>输入一个神经网络层,第一个神经网络的隐藏层,可以让神经网络尝试预测输出 y < 1 > y^{<1>} y<1>,判断这是否是人名的一部分。循环神经网络做的是,当它读到第二个单词 x < 2 > x^{<2>} x<2>时,它不是仅用 x < 2 > x^{<2>} x<2>就预测出 y < 2 > y^{<2>} y<2>,他也会输入一些来自时间步1的信息。具体而言,时间步1的激活值就会传递到时间步2。然后,在下一个时间步,循环神经网络同时也输入了 x < 3 > x^{<3>} x<3>,然后预测输出了预测结果 y < 3 > y^{<3>} y<3>,等等,一直到最后一个时间步。注意在这个例子中,T_x = T_y,当不相等时这个结构会需要作出一些改变。因此在每一个时间步(time step)中,循环神经网络传递一个激活值到下一个时间步中用于计算。

要开始整个流程,在零时刻构造一个激活值 a < 0 > a^{<0>} a<0>,通常是零向量。使用零向量作为零时刻的伪激活值是最常见的选择,因此我们把它输入神经网络。

在一些研究论文中或是一些书中这类神经网络也用这样的图形来表示(上图最右侧图像所示),表示循环连接(recurrent connection)时会画个圈,表示输回网络层;一个黑色方块(shaded box)来表示在这个黑色方块处会延迟一个时间步。在本次课程中更倾向于使用左边这种分布画法。

循环神经网络是从左向右扫描数据,同时每个时间步的参数也是共享的,如上图的红色标记,我们用W_ax来表示从 x < 1 > x^{<1>} x<1>到隐藏层的连接的一系列参数,每个时间步使用的都是相同的参数。而激活值也就是水平联系是由参数W_aa决定的,同样每一个时间步都使用相同的参数,同样的输出结果由参数W_ya决定。下图详细讲述这些参数是如何起作用。

注意到该循环神经网络的一个缺点:只使用了这个序列之前的信息来做出预测,为了判断Teddy是否是人名的一部分,仅仅知道句中前两个词是完全不够的,还需要知道句子后部分的信息,比如这个句子,“Teddy bears are on sale!”。因此如果只给定前三个单词,很难确切地知道Teddy是否是人名的一部分,第一个例子是人名,第二个例子就不是。这样特定的神经网络结构的一个限制是它在某一时刻的预测仅使用了从序列之前的输入信息并没有使用序列中后部分的信息,在之后的双向循环神经网络(bidirectional recurrent neural networks)的视频中解决这个问题。现在这个更简单的单向神经网络结构就够我们来解释关键概念(explain the key concepts)。
在这里插入图片描述

总结

深层神经网络模型和RNN在深度学习中具有重要地位,但它们的性能和稳定性问题一直是研究的焦点。通过引入改善方法,如更深的网络结构、残差连接、批次归一化、新型激活函数等,深层神经网络在各种任务中实现了卓越的性能。对于RNN,LSTM和GRU等新结构以及双向RNN和注意力机制等技术已经取得了显著进展,使得RNN能够更好地处理序列数据。这些改进方法推动了深度学习领域的发展,使其在自然语言处理、语音识别、图像处理等众多领域中取得了重大突破。未来,研究人员将继续致力于改进这些模型,以应对不断增长的复杂任务和数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值