深度学习、神经网络常见问题、基础问题

目录

神经网络基础问题

1.Backpropagation

2.梯度消失、梯度爆炸 

如何防止梯度消失?

如何防止梯度爆炸?

3.常用激活函数比较

1)什么是激活函数

2)为什么要用

3)都有什么

(1) sigmoid函数

(2) Tanh函数

(3) ReLU

(4) softmax函数

(5)改进的ReLU

4. sigmoid ,ReLU, softmax 的比较

5. 如何选择

4.解决overfitting的方法 

1)dropout

2)regularization

3)Batch normalization

5.参数更新方法

6.参考文献:


 


神经网络基础问题

1.Backpropagation

后向传播是在求解损失函数L对参数w求导时候用到的方法,目的是通过链式法则对参数进行一层一层的求导。这里重点强调:要将参数进行随机初始化而不是全部置0,否则所有隐层的数值都会与输入相关,这称为对称失效。 
大致过程是:

  • 首先前向传导计算出所有节点的激活值和输出值, 
    激活值

  • 计算整体损失函数: 
    损失函数

  • 然后针对第L层的每个节点计算出残差(这里是因为UFLDL中说的是残差,本质就是整体损失函数对每一层激活值Z的导数),所以要对W求导只要再乘上激活函数对W的导数即可 
    cancha 

强烈推荐的参考:

BP:https://www.cnblogs.com/charlotte77/p/5629865.html

CNN:http://www.cnblogs.com/charlotte77/p/7783261.html

 

2.梯度消失、梯度爆炸 

本质上是由于激活函数的选择导致的。

深度神经网络训练的时候,采用的是反向传播方式,该方式使用链式求导,计算每层梯度的时候会涉及一些连乘操作,因此如果网络过深。
那么如果连乘的因子大部分小于1,最后乘积的结果可能趋于0,也就是梯度消失,后面的网络层的参数不发生变化.
那么如果连乘的因子大部分大于1,最后乘积可能趋于无穷,这就是梯度爆炸

但是梯度爆炸不如梯度消失出现的机会多。 

如何防止梯度消失?

sigmoid容易发生,更换激活函数为 ReLU即可。
权重初始化用高斯初始化。重点强调:要将参数进行随机初始化而不是全部置0,否则所有隐层的数值都会与输入相关,这称为对称失效。 

如何防止梯度爆炸?

https://blog.csdn.net/qq_25737169/article/details/78847691

1 设置梯度剪切阈值,如果超过了该阈值,直接将梯度置为该值。

2 使用ReLU,maxout等替代sigmoid

3.BN层

https://blog.csdn.net/qq_25737169/article/details/79048516

4.每层预训练+微调

5.残差结构

6.LSTM

 

 

3.常用激活函数比较

函数

 

优点

缺点

sigmoid

https://images2018.cnblogs.com/blog/1393486/201805/1393486-20180509225027003-619124079.png

求导容易

二分类

激活

梯度消失

计算量大

输出不是0均值,收敛缓慢

tanh

https://images2018.cnblogs.com/blog/1393486/201805/1393486-20180509224733793-128411046.png

收敛速度快于sigmoid

0 均值

梯度消失

ReLU

f(x)=max(0,x)

用阈值,可快速收敛

缓解了梯度消失

网络稀疏表达能力

易神经元死亡

Leaky ReLU

https://images2018.cnblogs.com/blog/1393486/201805/1393486-20180509230215584-1751998167.png

解决了神经死亡问题

 

 

 

 

 

 

 

 

 

 

 

Maxout

https://images2018.cnblogs.com/blog/1393486/201805/1393486-20180509222113329-1933311607.png 

克服了ReLU的缺点

参数较多

softmax

 

用于多分类

 

 

1)什么是激活函数

如下图,在神经元中,输入的 inputs 通过加权,求和后,还被作用了一个函数,这个函数就是激活函数 Activation Function。


2)为什么要用

如果不用激励函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合。
如果使用的话,激活函数给神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到众多的非线性模型中。


3)都有什么

(1) sigmoid函数

公式:

曲线:

也叫 Logistic 函数
在特征相差比较复杂或是相差不是特别大时效果比较好。

优缺点:

输出映射在(0,1)之间,用于输出层,求导容易

sigmoid函数输入一个实值的数,然后将其压缩到0~1的范围内。特别地,大的负数被映射成0,大的正数被映射成1,可以用来做二分类

sigmoid function在历史上流行过一段时间因为它能够很好的表达“激活”的意思,未激活就是0,完全饱和的激活则是1。

缺点:

容易产生梯度消失,导致训练出现问题,

激活函数计算量大,反向传播求误差梯度时,求导涉及除法
反向传播时,很容易就会出现梯度消失的情况,从而无法完成深层网络的训练

输出不是0均值,使得梯度偏向一方

 

缺点解释:

Sigmoids saturate and kill gradients. Sigmoid容易梯度饱和,并且当输入非常大或者非常小的时候,神经元的梯度就接近于0了,从图中可以看出梯度的趋势。这就使得我们在反向传播算法中反向传播接近于0的梯度,导致最终权重基本没什么更新,我们就无法递归地学习到输入数据了。另外,你需要尤其注意参数的初始值来尽量避免saturation的情况。如果你的初始值很大的话,大部分神经元可能都会处在saturation的状态而把gradient kill掉,这会导致网络变的很难学习。

Sigmoid outputs are not zero-centered. Sigmoid 的输出不是0均值的,这是我们不希望的,因为这会导致后层的神经元的输入是非0均值的信号,这会对梯度产生影响:假设后层神经元的输入都为正(e.g. x>0 elementwise in ),那么对w求局部梯度则都为正,这样在反向传播的过程中w要么都往正方向更新,要么都往负方向更新,导致有一种捆绑的效果,使得收敛缓慢。 
当然了,如果你是按batch去训练,那么每个batch可能得到不同的符号(正或负),那么相加一下这个问题还是可以缓解。因此,非0均值这个问题虽然会产生一些不好的影响,不过跟上面提到的 kill gradients 问题相比还是要好很多的。

 

下面解释为何会出现梯度消失:

反向传播算法中,要对激活函数求导,sigmoid 的导数表达式为:

sigmoid 原函数及导数图形如下:

由图可知,导数从 0 开始很快就又趋近于 0 了,易造成“梯度消失”现象

(2) Tanh函数

公式

曲线

也称为双切正切函数
取值范围为[-1,1]。
tanh在特征相差明显时的效果会很好,在循环过程中会不断扩大特征效果。

优点:

这个函数和sigmoid相比收敛速度快
与 sigmoid 的区别是,tanh 是 0 均值的,也就解决了上述Sigmoid缺点中的第二个,所以实际中tanh会比sigmoid更常用。

缺点:

但是它还是存在梯度饱和的问题,容易产生梯度消失

 

(3) ReLU

Rectified Linear Unit(ReLU) - 用于隐层神经元输出

公式

曲线

输入信号 <0 时,输出都是0,>0 的情况下,输出等于输入

优缺点:

优点:

这个是线性,相比于 sigmoid/tanh需要计算指数等,计算复杂度高,ReLU 只需要一个阈值就可以得到激活值。非饱和的形式和前面两个相比它能够快速收敛

另外ReLU有效的缓解了梯度消失的问题,

Relu会使一部分神经元的输出为0,这样就提供了神经网络的稀疏表达能力,造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生

缺点:

训练的时候很”脆弱”,随着训练的进行,可能会出现神经元死亡,权重无法更新的情况。如果发生这种情况,那么流经神经元的梯度从这一点开始将永远是0。也就是说,ReLU神经元在训练中不可逆地死亡了。

例如,一个非常大的梯度流过一个 ReLU 神经元,更新过参数之后,这个神经元再也不会对任何数据有激活现象了,那么这个神经元的梯度就永远都会是 0.
如果 learning rate 很大,那么很有可能网络中的 40% 的神经元都”dead”了。

(4) softmax函数

Softmax - 用于多分类神经网络输出

公式

举个例子来看公式的意思:

就是如果某一个 zj 大过其他 z, 那这个映射的分量就逼近于 1,其他就逼近于 0,主要应用就是多分类。

为什么要取指数,第一个原因是要模拟 max 的行为,所以要让大的更大。
第二个原因是需要一个可导的函数。

(5)改进的ReLU

Leaky ReLU. Leaky ReLUs 就是用来解决ReLU坏死的问题的。和ReLU不同,当x<0时,它的值不再是0,而是一个较小斜率(如0.01等)的函数。也就是说f(x)=1(x<0)(ax)+1(x>=0)(x),其中a是一个很小的常数。这样,既修正了数据分布,又保留了一些负轴的值,使得负轴信息不会全部丢失。关于Leaky ReLU 的效果,众说纷纭,没有清晰的定论。有些人做了实验发现 Leaky ReLU 表现的很好;有些实验则证明并不是这样。 
- PReLU. 对于 Leaky ReLU 中的a,通常都是通过先验知识人工赋值的。然而可以观察到,损失函数对a的导数我们是可以求得的,可不可以将它作为一个参数进行训练呢? Kaiming He 2015的论文《Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification》指出,不仅可以训练,而且效果更好。原文说使用了Parametric ReLU后,最终效果比不用提高了1.03%. 
-Randomized Leaky ReLU. Randomized Leaky ReLU 是 leaky ReLU 的random 版本, 其核心思想就是,在训练过程中,a是从一个高斯分布中随机出来的,然后再在测试过程中进行修正。 
这里写图片描述

Maxout. Maxout的形式是f(x)=max(w_1^Tx+b_1,w_2^Tx+b_2),它最早出现在ICML2013上,作者Goodfellow将maxout和dropout结合后,号称在MNIST, CIFAR-10, CIFAR-100, SVHN这4个数据上都取得了start-of-art的识别率。可以看出ReLU 和 Leaky ReLU 都是Maxout的一个变形,所以Maxout 具有 ReLU 的优点(如:计算简单,不会 saturation),同时又没有 ReLU 的一些缺点 (如:容易饱和)。不过呢Maxout相当于把每个神经元的参数都double了,造成参数增多。 
Maxout的拟合能力非常强,它可以拟合任意的的凸函数。作者从数学的角度上也证明了这个结论,即只需2个maxout节点就可以拟合任意的凸函数了(相减),前提是”隐含层”节点的个数可以任意多。 
这里写图片描述


4. sigmoid ,ReLU, softmax 的比较

Sigmoid 和 ReLU 比较:

sigmoid 的梯度消失问题,ReLU 的导数就不存在这样的问题,它的导数表达式如下:

曲线如图

对比sigmoid类函数主要变化是:
1)单侧抑制
2)相对宽阔的兴奋边界
3)稀疏激活性。

Sigmoid 和 Softmax 区别:

softmax is a generalization of logistic function that “squashes”(maps) a K-dimensional vector z of arbitrary real values to a K-dimensional vector σ(z) of real values in the range (0, 1) that add up to 1.

sigmoid将一个real value映射到(0,1)的区间,用来做二分类

而 softmax 把一个 k 维的real value向量(a1,a2,a3,a4….)映射成一个(b1,b2,b3,b4….)其中 bi 是一个 0~1 的常数,输出神经元之和为 1.0,所以相当于概率值,然后可以根据 bi 的概率大小来进行多分类的任务。

二分类问题时 sigmoid 和 softmax 是一样的,求的都是 cross entropy loss,而 softmax 可以用于多分类问题

softmax是sigmoid的扩展,因为,当类别数 k=2 时,softmax 回归退化为 logistic 回归。具体地说,当 k=2 时,softmax 回归的假设函数为:

利用softmax回归参数冗余的特点,从两个参数向量中都减去向量θ1 ,得到:

最后,用 θ′ 来表示 θ2−θ1,上述公式可以表示为 softmax 回归器预测其中一个类别的概率为

另一个类别概率的为

这与 logistic回归是一致的。

softmax建模使用的分布是多项式分布,而logistic则基于伯努利分布
  
多个logistic回归通过叠加也同样可以实现多分类的效果,但是 softmax回归进行的多分类,类与类之间是互斥的,即一个输入只能被归为一类;多个logistic回归进行多分类,输出的类别并不是互斥的,即"苹果"这个词语既属于"水果"类也属于"3C"类别。


5. 如何选择

选择的时候,就是根据各个函数的优缺点来配置,例如:

如果使用 ReLU,要小心设置 learning rate,注意不要让网络出现很多 “dead” 神经元,如果不好解决,可以试试 Leaky ReLU、PReLU 或者 Maxout.

 

 

4.解决overfitting的方法 

添加噪声,early stopping,数据集扩增,dropout, regularization, batch normalizatin

详细见本博客 https://blog.csdn.net/sunflower_sara/article/details/81159155

 

1)dropout

dropout只在训练的时候用,让一部分神经元随机失活。 

相当于训练多个网络,并组合在一起


2)regularization

l1 l2正则化

3)Batch normalization

是为了让输出都是单位高斯激活,方法是在连接和激活函数之间加入BatchNorm层,计算每个特征的均值和方差进行规则化。

 

5.参数更新方法

方法名称公式 
Vanilla updatex += - learning_rate * dx 
Momentum update动量更新v = mu * v - learning_rate * dx # integrate velocity
x += v # integrate position
 
Nesterov Momentumx_ahead = x + mu * v 
v = mu * v - learning_rate * dx_ahead
x += v
 
Adagrad 
(自适应的方法,梯度大的方向学习率越来越小,由快到慢)
cache += dx**2
x += - learning_rate * dx / (np.sqrt(cache) + eps)
 
Adamm = beta1*m + (1-beta1)dx
v = beta2*v + (1-beta2)
(dx**2)
x += - learning_rate * m / (np.sqrt(v) + eps)
 

6.参考文献:

https://www.jianshu.com/p/22d9720dbf1a
https://blog.csdn.net/guorongronghe/article/details/70174476

https://blog.csdn.net/u014365862/article/details/52710698

https://blog.csdn.net/qq_25737169/article/details/78847691

https://www.cnblogs.com/helloworld0604/p/9017030.html

https://www.cnblogs.com/houjun/p/8535471.html

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值