Relu
1.为何使用非线性激励而不是线性激励?
如果每一层的输出都是上层输入的线性函数,那么无论神经网络有多少层,输出都是输入的线性组合。可以用一个线性函数来代替。
引入非线性函数作为激励函数,这样就不再是输入的线性组合,而可以逼近任意函数。比如sigmod函数和tanh函数。
2.Relu函数
在深度神经网络中,通常使用一种叫修正线性单元(Rectified linear unit,ReLU)作为神经元的激活函数。
ReLU函数其实是分段线性函数,把所有的负值都变为0,而正值不变,这种操作被成为单侧抑制。正因为有了这单侧抑制,才使得神经网络中的神经元也具有了稀疏激活性。尤其体现在深度神经网络模型(如CNN)中,当模型增加N层之后,理论上ReLU神经元的激活率将降低2的N次方倍。
我们为什么需要让神经元稀疏?
例如生病了去医院看病,检查报告里面上百项指标,但跟病情相关的通常只有那么几个。与之类似,当训练一个深度分类模型的时候,和目标相关的特征往往也就那么几个,因此通过ReLU实现稀疏后的模型能够更好地挖掘相关特征,拟合训练数据。
3.为何使用非饱和Relu(修正线性单元)而不是饱和的sigmod或者tanh?
1减少计算量
采用sigmod等函数计算激活函数通常是指数运算,另外反向误差利用求导求梯度,计算量也很大。Relu函数计算量小。
2梯度消失
饱和函数在反向传播,在接近饱和区时,导数趋近于0,出现了梯度消失的情况,模型无法收敛,无法完成深层网络的训练。对于非线性函数而言,ReLU由于非负区间的梯度为常数,因此不存在梯度消失问题(Vanishing Gradient Problem),使得模型的收敛速度维持在一个稳定状态。
3梯度下降时间
relu的训练时间短
4减少过拟合
Relu会使一部分神经元的输出为0,这样就造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生
以上整理自https://blog.csdn.net/lee813/article/details/80993355
局部响应归一化(LRN)
局部响应归一化原理是仿造生物学上活跃的神经元对相邻神经元的抑制现象(侧抑制),对局部神经元的活动创建竞争机制,使得响应比较大的值相对更大,提高模型的泛化能力。公式如下
经过第一次卷积再经过ReLU,就是LRN函数的输入。
这个公式中的a表示卷积层(包括卷积操作和池化操作)后的输出结果,这个输出结果的结构是一个四维数组[batch,height,width,channel],这里可以简单解释一下,batch就是批次数(每一批为一张图片),height就是图片高度,width就是图片宽度,channel就是通道。
n是同一位置上临近的kernal map的数目,N是kernal的总数。参数K, n, alpha, belta 都是超参数,一般设置k=2, n=5, alpha=1*e-4, beta=0.7
池化(Pooling)
池化层往往在卷积层后面,通过池化来降低卷积层输出的特征向量,同时改善结果(不易出现过拟合)。
一般池化
一般池化作用于图像中不重合的区域,过程如下图。
我们定义池化窗口的大小为sizeX,即下图中红色正方形的边长,定义两个相邻池化窗口的水平位移/竖直位移为stride。一般池化由于每一池化窗口都是不重复的,所以sizeX=stride。
2重叠池化
重叠池化正如其名字所说的,相邻池化窗口之间会有重叠区域,此时sizeX>stride
转自:http://blog.csdn.net/silence1214/article/details/11809947
卷积
这幅图是对一个5*5的矩阵A进行3*3的矩阵B的卷积,那么就从最上角到右下角,生成卷积之后的矩阵的大小是(5-3+1)*(5-3+1)的矩阵,生成之后的矩阵的元素值,是之前的两个矩阵对应元素的乘积之和。下图展示了一般的有效卷积。
Dropout
dropout是在前向传播的时候,让某个神经元的激活值以一定的概率p停止工作,这样可以使模型泛化性更强,因为它不会太依赖某些局部的特征用来防止过拟合。
左边是原来的神经网络,右边是采用Dropout后的网络。这个说是这么说,但是具体代码层面是怎么实现的?怎么让某个神经元以一定的概率停止工作?这个我想很多人还不是很了解,代码层面的实现方法,下面就讲解一下其代码层面的实现。公式中Bernoulli函数,是为了以概率p,随机生成一个0、1的向量。
Dropout具体工作流程
以比例0.5为例,也就是说每次有一半的神经元不能工作。
假设我们要训练这样一个标准的神经网络,如下图(左)所示。输入是x输出是y,正常的流程是:我们首先把x通过网络前向传播,然后把误差反向传播以决定如何更新参数让网络进行学习。
使用Dropout之后(右图),过程变成如下:
(1)首先随机(临时)删掉网络中一半的隐藏神经元,输入输出神经元保持不变,图中虚线为部分临时被删除的神经元)
(2) 然后把输入x通过修改后的网络前向传播,然后把得到的损失结果通过修改的网络反向传播。一小批训练样本执行完这个过程后,在没有被删除的神经元上按照随机梯度下降法更新对应的参数(w,b)。
(3)然后继续重复这一过程:
.恢复被删掉的神经元(此时被删除的神经元保持原样,而没有被删除的神经元已经有所更新)
. 从隐藏层神经元中随机选择一个一半大小的子集临时删除掉(备份被删除神经元的参数)。
. 对一小批训练样本,先前向传播然后反向传播损失并根据随机梯度下降法更新参数(w,b) (没有被删除的那一部分参数得到更新,删除的神经元参数保持被删除前的结果)。
不断重复这一过程。
深度学习中momentum的作用
训练网络时,通常先对网络的初始权值按照某种分布进行初始化,如:高斯分布。初始化权值操作对最终网络的性能影响比较大,合适的网络初始权值能够使得损失函数在训练过程中的收敛速度更快,从而获得更好的优化结果。但是按照某类分布随机初始化网络权值时,存在一些不确定因素,并不能保证每一次初始化操作都能使得网络的初始权值处在一个合适的状态。不恰当的初始权值可能使得网络的损失函数在训练过程中陷入局部最小值,达不到全局最优的状态。
momentum 动量能够在一定程度上解决这个问题。momentum 动量是依据物理学的势能与动能之间能量转换原理提出来的。当 momentum 动量越大时,其转换为势能的能量也就越大,就越有可能摆脱局部凹域的束缚,进入全局凹域。momentum 动量主要用在权重更新的时候。
动量算法直观效果解释:
如图所示,红色为SGD+Momentum。黑色为SGD。可以看到黑色为典型Hessian矩阵病态的情况,相当于大幅度的徘徊着向最低点前进。
而由于动量积攒了历史的梯度,如点P前一刻的梯度与当前的梯度方向几乎相反。因此原本在P点原本要大幅徘徊的梯度,主要受到前一时刻的影响,而导致在当前时刻的梯度幅度减小。
直观上讲就是,要是当前时刻的梯度与历史时刻梯度方向相似,这种趋势在当前时刻则会加强;要是不同,则当前时刻的梯度方向减弱。
Softmax
Softmax回归模型是logistic回归模型在多分类问题上的推广,在多分类问题中,待分类的类别数量大于2,且类别之间互斥。比如我们的网络要完成的功能是识别0-9这10个手写数字,若最后一层的输出为[0,1,0, 0, 0, 0, 0, 0, 0, 0],则表明我们网络的识别结果为数字1。Softmax的公式为
可以直观看出如果某一个zj大过其他z,那这个映射的分量就逼近于1,其他就逼近于0,并且对所有输入数据进行归一化。