李宏毅机器学习2020笔记(三)深度学习

一、深度学习

1、简介

 

 

 

不同的连接方法

2、全连接前馈网络

 1*1+(-1)*(-2)+1=4--->sigmoid--->0.98

 

相当于一个函数,输入一个向量,输出一个向量。如果w和b未知,神经网络就是一个比较大的function set。

 全连接、前馈。输入层只有data,输出层是最后一层,中间都称为隐藏层。

现在基于神经网络的方法都是深度学习的方法。

 

 常常用矩阵运算来表示神经网络的运算。

 

  一连串的向量乘以矩阵再加上向量,写成这样的好处是可以进行GPU加速(GPU做矩阵运算更快)

 

 输出层是一个多分类器,将 很多次特征抽取后的比较好的feature 分类,最后一个layer也要加上softmax。

 

3、例子

 输入256维,输出10维。

 

多少层?每层几个?经验+直觉。

有了深度学习,不需要在影像辨识或是自然语言处理时来做特征抽取,但是麻烦变成了如何设计神经网络。

不过对于影像辨识或是语音辨识问题,设计网络结构可能比特征工程更容易,不如让机器自己去找出好的特征。

 

 计算交叉熵损失,通过调整参数,使得交叉熵越小越好。所有training data的cross entropy相加就是损失函数L,找一组网络参数最小化L。

 

同样用梯度下降来优化参数。

  

为什么是deep而不是fat呢?

 

 4、反向传播

 

 对于高维的vector,为了有效的计算梯度下降的微分,使用反向传播。反向传播实际就是使用链式法则:

  

 

 下面的推导只考虑一笔data来计算,最后求和即是total loss。

 

 根据链式法则,C对w求偏微分,可以拆成z对w和C对z。下面分别看这两部分:

对于forward pass:w前面接的是什么,微分以后就是什么。

对于backward pass,同样链式法则,sigmoid函数的部分可以直接算.

 

后一部分同样使用链式法则,假设下一层只有两个神经元,我们得到上图这样的式子。

 

 这个式子可以用上图类似神经网络的样子画出来,σ'(z)可以看做一个常数(直接乘上一个常数画成三角形)。

 

① 最后剩下的两项,如果是输出层,可以直接算出结果,如上例中y1对z'的偏导是sigmoid函数的导数,C对y1的偏导是交叉熵求导。

② 如果不是输出层,可以按照一模一样的式子以此类推,直到输出层。

 

 如上,如果要算backward pass,从z5,z6对C的偏微分开始求,即从输出层开始计算,接下来可以算z3和z4,再算z1和z2。

 综上,顺推法和逆推法(建立一个反向的神经网络)结合,这样就可以更高效地计算出偏微分。

 

5、tips

先检查training set performance,再检查overfitting。

 

5.1、梯度消失、ReLU与Maxout

 

激活函数用的不好。sigmoid会造成梯度消失的问题。

使用sigmoid function会发现,deeper 不一定imply better,在训练集上的结果会坏掉。

训练集上层数越多反而结果越差,原因在于对于多层的网络,

靠近输入的地方对损失函数的微分很小,而靠近输出的地方微分值很大,

当设定同样的学习率时,靠近输入的地方参数更新很慢而靠近输出的地方参更新很快,

当靠近输入的地方参数几乎还是random的时候,output就已经converge(收敛)了。

假设将第一个layer的参数加上△w,会发现,每通过一次sigmoid function,w的变化就衰减一次(把很大的值都压到0-1之间),

所以当网络越深,变化的衰减越多,对output的影响很小,对cost的影响也很小,造成了靠近输入的地方梯度小。

以前的做法是用RBM,一个一个layer来train。

计算比sigmoid更快;生物学原因;无穷多bias不一样的sigmoid方法叠加;解决梯度消失问题;

 对output是0的neural来说,它们对整个网络output没有任何影响,就可以把它们拿掉,

剩下的就是一个很瘦长的linear network,变成了线性网络以后,就不会出现激活函数递减的问题了。

但是我们希望神经网络的function是一个non-linear的,其实这个网络整体上还是non-linear的,线性与否与input有关。

实做中对ReLU微分,就是0(input<0)或1(input>0),不考虑input=0。

如果在input小于0时,output是0,微分是0,就没法update参数了。

我们会让input小于0时,output会有一点点的值,设为0.01或者是个可学习的量。

进一步,可以自动学习激活函数,ReLU只是maxout network一个特例。

首先把value分组(事先决定的),同一个组中选最大值,作为output,。

maxout network也可以做出ReLU能做的事情。

可学习的激活函数:从两个范围内选择大的。

分成的段数取决于一组value的个数。

 max不能微分,应该怎么train?

有些neural不会影响output,所以可以拿掉,得到的是比较细长的线性网络的参数。

由于不同的input,得到的是不同的network,所以不必担心有些neural会train不到。

 

5.2、调整学习率RMSProp

 

线性回归中的优化方法是convex的形状,而DeepLearning中可能是任何形状。

RMSProp和adagrad类似,还是包含梯度的平方,但是前面乘上了可调的参数α,表示倾向于新的梯度的程度。

 

5.3、momentum

 

其实在error surface上是没有太多local minima的,如果要是极小值,在每个维度都要是山谷的谷底,因为有非常多的维度,出现的几率很低,所以一般的神经网络没有太多的极小值。

为了处理一下极小值的问题,可以利用物理上的惯性原理,momentum(冲力、势头)。

 

 前一个时间点移动的方向(绿色)和梯度的反方向(红色)合起来,得到下一步走的方向。

 

 momentum也可以看做过去所有梯度的总和,也就是说,过去的梯度会对现在要走的方向有一定的影响力。

 

 Adam是RMSProp与Momentum的集合

 

5.4、early stop

用验证集来模拟,找到停下来的位置。

 

5.5、正则化

 L2正则化。

 

化简可以知道,每次更新参数前都要把参数先乘以(1-ηλ)。

因为是个小于1的数,乘完的结果会越来越靠近0,但是由于后面一项的存在,w不会变成0。

这种使用L2正则化,让weight逐渐变小的方法,叫做weight decay。

如果有一些weight每次都不去update,就会变得越来越小,最后接近0。

L1每次减掉是一个固定的值,w是正的就减去正的ηλ,负的就加上。如果w有很大的值,下降的速度可能也会和很小的w值一样。

L1 train出来的结果更sparse,有很多接近0的值也有很大的值。

L2每一次减掉的不同,学习的值平均都比较小,train出来结果会保留很多接近0的值。

 

5.6、dropout

 

train时每次update参数前,都对每个neural做sampling,决定这个neural要不要被丢掉,每个neural有p%的几率会被丢掉,跟它相连的weight也会被丢掉。

然后再去train得到的比较瘦的network,每次得到的结果会是不一样的。

在training上使用dropout,会导致结果变差,但这样训练出来的参数在testing的时候会更好。

在testing时不能做dropout,所有neural都要用到。

在training时dropout rate是p%,那么在testing时所有weight都要乘以(1-p%)。

 

关于dropout,直观上的原因如上。以下从集成的角度来解释:

 

有一个很大的训练集(bias准,但variance大),每次只sample一部分的data出来,每个model甚至可以结构不同,把所有的到的结果平均。

 

 dropout等于是一个终极的ensemble方式,每次只用一个minibatch的data去train。

不同网络的参数是共享的,所以不用担心batch中的data太少train不到好的weight。

由于network太多,实际testing时无法计算每一个的output再平均,运算量太大,一般用图右的方法。

示例:

 

 

6、why deeper is better?

 

 

类似于模块化编程的原理,不把所有东西都放在main函数。

长发男生的data比较少,所以detect长发男生的classifier就比较weak。

最后的分类器会参考基本分类器的输出,把第一层当做module,第一层的输出当做它的输入。

因此AI并不一定是建立在大数据的基础上的,正是没有足够的bigdata,才需要去做DeepLearning。

 在图像上往往会用到模块化表现非常好。

人类语言的结构:一串phoneme(音素)组成的,phoneme是语言学家制定的人类发音的基本单位。

同样的phoneme可能会有不太一样的发音,因为人类发音器官的限制,phoneme的发音会受到前后的phone所影响(context有关),因此给同样的phone不同的model,叫做tri-phone。

一个tri-phone可以拆成几个state(自己订),通常拆成3个。

 

在weight phone上取一个window,用acoustic feature描述这个window中的特性,最后得到一个sequence。

在语音辨识的第一阶段,就是要决定每个acoustic feature属于哪个state。

 

DNN火红之前的做法,HMM-GMM的方式。传统的方法使用GMM认为,每一个属于某个state的acoustic feature的分布是静态的,可以用一个GMM来描述。

由于state太多,一些state共用同样的模型分布,叫做tied-state。

subspace GMM,先找一个高斯pool,每个state的信息就是一个key,每一个state从pool中挑一些gaussian,这样有些state share一些gaussian,有些也不share,这种方法也有一些模块化的意思。

音素之间不是完全无关的,如上图中展示了人类语言所有母音,所有声音只受到舌头前后、上下、嘴型三件事的影响。

对GMM来说,每个state都需要一个高斯分布(很多很小的model),用到的参数与DNN差不多(一个很大的model)。

DNN中所有的state用同一个DNN,更加有效率。

 

DNN在隐藏层把输入降到二维,用颜色表示五个不同的母音,发现分布和右上的图几乎一样,我们可以得知低层在detect发声的方法。

所有phone都share同一组detector,这样就做到了模块化,更有效地使用参数。

 

任何连续函数都可以用一层的神经网络来完成,只要这一层够宽,但是这样是没有效率的。

 

类比逻辑电路,设计多层的结构,需要使用更少的逻辑闸。同样多层的神经网络会需要比较少的参数,意味着不容易过拟合,并且需要比较少的data。

 

 

 

 类比剪窗花,隐藏层的特征转换好像把原来的平面对折了一样。

 

 

 

7、end-to-end learning

 

 

用深度学习的另一个好处是,可以做end-to-end learning。

一个复杂的function由很多简单的function串连起来,中间的每个function做什么由它自己学习。

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值