CNN基础知识

关于权值初始化方法

文件 caffe/include/filler.hpp提供了7种权值初始化的方法,分别为:常量初始化(constant)、高斯分布初始化(gaussian)、positive_unitball初始化、均匀分布初始化(uniform)、xavier初始化、msra初始化、双线性初始化(bilinear)。

TYPE PARAM EXPLAIN
Constant Value 以常量初始化,初始化值为[Value]
Gaussian std,mean 以高斯分布方式初始化,均值为[mean],标准差为[std]
uniform min,max 均匀分布,[min,max]
xavier scale 均匀分布,[-scale,scale],scale=sqrt(3/K*H*W)

权值初始化讲解:http://www.cnblogs.com/yinheyi/p/6165716.html
filler层代码解析:http://blog.csdn.net/xizero00/article/details/50921692


常用的激活函数

Sigmoid:取值范围是(0,1)

f(z)=11+exp(z)

CNN基础知识_第1张图片

主要缺点

1。函数饱和使梯度消失

sigmoid神经元在值0或1的时候接近饱和,这些区域梯度几乎为0。因此在反向传播时,这个局部梯度会使整个代价函数关于该单元输出的梯度相乘,结果也会接近为0。

除此之外,为了防止过饱和,必须对于权值矩阵的初始化特别留意。比如,如果初始化权重过大,那么大多数神经元将会饱和,导致网络几乎不学习。

2。sigmoid函数不是关于原点中心对称
这个特性会导致后面网络层的输入也不是零中心的,进而影响梯度下降的运作。

因为如果输入都是正数的话(如 f=wTx+b 中每个元素都 x>0 ),那么关于 w 的梯度在反向传播过程中,要么全是正数,要么全是负数(具体依据整个表达式 f 而定),这将会导致梯度下降权重更新时出现 z 字型的下降。

当然,如果是按 batch 去训练,那么每个 batch 可能得到不同的信号,整个批量的梯度加起来后可以缓解这个问题。因此,该问题相对于上面的神经元饱和问题来说只是个小麻烦,没有那么严重。

Tanh函数:取值范围【-1,1】

tanh 函数也称为双曲正切函数。同样存在饱和问题,但它的输出是零中心的,因此实际中 tanh 比 sigmoid 更受欢迎。

tanh 函数实际上是一个放大的 sigmoid 函数,数学关系为:

tanh(x)=ezezez+ez=2σ(2x)1

CNN基础知识_第2张图片

ReLU:
ReLU 近些年来非常流行。它的数学公式为:

f(x)=max(0,x)

CNN基础知识_第3张图片

优点:
相较于 sigmoid 和 tanh 函数,ReLU 对于 SGD 的收敛有巨大的加速作用(Alex Krizhevsky 指出有 6 倍之多)。有人认为这是由它的线性、非饱和的公式导致的。
缺点:
举例来说:一个非常大的梯度经过一个 ReLU 神经元,更新过参数之后,这个神经元再也不会对任何数据有激活现象了。如果这种情况发生,那么从此所有流过这个神经元的梯度将都变成 0。

也就是说,这个 ReLU 单元在训练中将不可逆转的死亡,导致了数据多样化的丢失。实际中,如果学习率设置得太高,可能会发现网络中 40% 的神经元都会死掉(在整个训练集中这些神经元都不会被激活)。

合理设置学习率,会降低这种情况的发生概率。

参考:
http://www.jianshu.com/p/6df4ab7c235c
http://www.jianshu.com/p/22d9720dbf1a

你可能感兴趣的:(深度学习,c++)