0.mini-batch SGD( stochastic gradient descent)
四步:
(1)对整个数据采样一个小批次
(2)将这批次数据传入计算图进行计算
(3)反传计算梯度
(4)利用梯度更新参数
1.激活函数(activation function):sigmoid, Relu, tanh
sigmoid存在的问题:
(1)神经元饱和(输入值的绝对值很大,输出接近0或1)的时候会发生梯度消失;
(2)sigmoid不以0为中心:输入恒为正数的时候,梯度恒为正或恒为负——只向固定方向进行梯度更新,增加迭代次数
因此我们希望使用零均值的数据
(3)指数函数的计算代价--minors problem
tanh存在的问题:
(1)仍然存在梯度消失问题,better than sigmoid, but still exist
ReLU存在的问题:
(1)不是以零为中心
(2)负半轴梯度恒为0 --产生dead ReLU现象:只有部分的数据集会对梯度产生影响
造成原因:糟糕的初始化,很高的学习率
解决方案:使用较小的正初始偏置--很少使用
优点:
(1)不会饱和
(2)计算消耗低
(3)收敛速度快于sigmoid和tanh
(4)生物学意义上的可解释性好 。。。。。
Leaky ReLU:f(x)=max(0.01x,x), Parametric Rectifier(PReLU):f(x)=max(ax,x), ELU:f(x)=x (if x>0) or a(exp(x)-1) (if x<0)
maxout: max(w1x+b1, w2x+b2)
优点:泛化ReLU和Leaky ReLU, 不会饱和,不会死亡,参数加倍
经验之谈:
(1).先直接使用ReLU,谨慎调节学习率
(2).可以尝试Leaky ReLU······但是不太靠谱
(3).一般不适用sigmoid----最为原始
2.数据的预处理
(1)以零为中心,归一化处理(较少使用)
(2)PCA,whiten在图像处理中使用较少
(3)一般只做零均值化:减去平均值(训练集中所有图像像素的均值),也有分别减去单一通道的均值
ps:对于sigmoid函数,由于只在数据只是第一层的输入,所以并没有解决深度网络后续层的零均值问题
3.权重的初始化
(1)初始权重都设为0——所有神经元做出相同的操作,相同的梯度,相同的方式更新——完全相同的神经元,参数对称问题
ps:最后一层的神经元对应不同的类,因此损失函数的值不同,所以反传不同
(2)初始权重赋一个较小的随机值:浅层网络还Ok,深层网络中的后几层就会发生参数集中在0附近,因为较小的值不断相乘会迅速逼近0
以上对于激活函数为tanh的情况。
(3)初始权重赋予一个很大的随机值:会经常发生饱和现象,输出趋于正负1
(4)a good method—— Xavier初始化方法:W=np.random(fan_in, fan_out)/np.sqrt(fan_in) 适用于tanh,但不试用于ReLU
ReLU: W=np.random(fan_in, fan_out)/np.sqrt(fan_in/2)
4.批量归一化(Batch Normalization):让某一层被激活的单元数目呈现高斯分布,解决梯度消失。梯度爆炸的现象
经常在全连接层或卷积层之后,非线性层之前使用
步骤:(1).对于n个d维数据,计算其在各个维度上的均值和方差
(2).每个维度上数据减去均值再除去标准差
(3).也可以增加平移和缩放因子来将处理后的数据恢复成原始数据以让网络自主学习去控制数据的饱和程度
, γ为缩放因子,b为平移因子。
目的:
(1).提高梯度的流动
(2).增强了训练的鲁棒性,允许更高的学习率
(3).可以被看做是一种正则化的方法:因为本质上讲,你处理的数据都是来源于这一批数据,而非给定的确定样本,相当于在样本中加入一些抖动
ps:仅仅是对输入进行归一化,没有改变网络参数
pss:减去均值,除以标准差就是将数据高斯化——但原数据不比服从高斯分布
psss:γ和b是有意义的,实际训练出的数据中,学习到的γ和b并没有将数据恢复到原状态
(4).测试时减去的是训练时的均值和方差(将这两个参数也视为网络需要学习的)
5.实战经验
(1)学习率选择(1e-3, 1e-5)
(2)超参数选择——交叉验证:训练集,验证集,测试集,在验证集上调整你在训练集上训练的模型
采用对数采样效果往往会更好(而不是均匀增长)
(3)采用随机搜索(random search)而非网格搜索(grid search)