目录
神经网络基础问题
1.Backpropagation
后向传播是在求解损失函数L对参数w求导时候用到的方法,目的是通过链式法则对参数进行一层一层的求导。这里重点强调:要将参数进行随机初始化而不是全部置0,否则所有隐层的数值都会与输入相关,这称为对称失效。
大致过程是:
-
首先前向传导计算出所有节点的激活值和输出值,
-
计算整体损失函数:
- 然后针对第L层的每个节点计算出残差(这里是因为UFLDL中说的是残差,本质就是整体损失函数对每一层激活值Z的导数),所以要对W求导只要再乘上激活函数对W的导数即可
强烈推荐的参考:
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 | 求导容易 二分类 激活 | 梯度消失 计算量大 输出不是0均值,收敛缓慢 | |
tanh | 收敛速度快于sigmoid 0 均值 | 梯度消失 | |
ReLU | f(x)=max(0,x) | 用阈值,可快速收敛 缓解了梯度消失 网络稀疏表达能力 | 易神经元死亡 |
Leaky ReLU | 解决了神经死亡问题 |
| |
Maxout |
| 克服了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 update | x += - learning_rate * dx | |
Momentum update动量更新 | v = mu * v - learning_rate * dx # integrate velocity x += v # integrate position | |
Nesterov Momentum | x_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) | |
Adam | m = 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