训练神经网络
1.激活函数:使用relu作为激活函数,同时要小心设置学习率。学习率不能设置得太大,不然会导致梯度更新之后的权值数值变得很大,从而使得W和X加权求和之后的数值小于0,则所有的激活神经元都会变成dead neuron,dead neuron指的是当前神经元节点的输出激活值为0,并不代表最后的损失函数值为0,即损失函数对于当前层的激活值偏导数不为0(upstream gradient),但是local gradient都为0,故而loss的反向传播梯度到净输出那一层就全部变为0,也就是说dead neuron之前的所有网络权值都不会有梯度更新,如果当前的dead neuron在最后一层的话,则网络模型的所有权值参数都不会更新,从而导致下一次,对于同样数值的输入数据,loss还是相同的数值,梯度还是不会更新。
注:不要使用sigmoid(值域0-1)和tanh(值域-1~1)作为激活函数,这二者的计算公式中因为包含指数项,故而计算量很大,同时没有relu函数收敛更快。relu的变体还有:PRelu和leaky Relu
2.数据预处理
对于输入到网络模型中的数据首先要进行数据归一化:减去均值和除以方差。这一操作的目的是为了构造0中心分布的数据,就像希望每一层经过激活函数操作之后的输出值有正有负一样(这里指的是不同的神经元)。假设第一层的输入神经元有2个,输出神经元1个,权值连接参数W1和W2,则对于某一个输入样本,激活值输出f(x1,x2)=max(0,W1*x1+W2*x2),假设损失函数对于当前层激活后的神经元的upstream gradient记作up_grad,假设输入数据的每个维度的特征都是大于0的数,则激活神经元的local gradient=x1或者x2都大于0,则loss对于W的导数符号完全由上层梯度值决定,则loss对于W1和W2的导数具有相同的符号,这对于模型的收敛是不利的,故而希望不同的权值梯度异号。也就是说,对于同一个样本,我们希望它在不同维度上的特征是具有不同符号的,对于训练数据集的N个样本而言,也是希望每个样本的不同维度上的特征中心分布,通常做法是:对于N个训练样本的D个维度的特征求平均值和方差。在测试阶段使用相同的均值和方差对于测试数据进行预处理。
3.权值初始化
随机初始化
4.batch normalization
希望经过线性加权之后的数值仍然是服从均值为0,方差为1的分布,无论是在全连接层还是在卷积网络中,batch normalization层通常都是加在non linearity activation非线性激活层前面的,即FC-BN-Relu-FC-BN-Relu或者Conv-BN-Relu-Conv-BN-Relu结构。在激活函数之前是用BN。batch normalization中的参数:其中经验均值和经验方差是由当前batch size的数据计算得到的,故而不是可学习的参数,神经网络需要训练得到的参数是gamma(对于归一化之后的特征进行的尺度变换)和beta(对于归一化之后的特征加法),如果网络最终学习到的是identity mapping,就是说batch normalization不起到作用,BN之后的特征图和之前的特征图相同,则gamma等于经验方差,beta等于经验均值,但是大多数情况下,网络所学习到的不是identity mapping。
(1)全连接层的batch normalization:N个训练样本经过全连接层的矩阵变换之后,输出的是N*D的矩阵,对于D个特征,沿着num train维度上对于每个训练样本在该维度上的特征求平均值和方差,分别得到D个均值和D个方差,然后对于N*D个数值分别进行归一化(对于特征状态的归一化操作和对于输入图像的归一化操作完全相同),即N*D,对维度N做归一化。全连接层中的BN learnable parameters是D个gamma和D个beta
(2)CNN中的batch normalization
卷积操作输出的特征图shape=[batch size,C,H,W],进行normalization的dimension包括N,H,W,即可以这样类比:全连接层的输出层包含D个节点,需要对于N个输入向量在每个节点的数值进行normalization;而CNN中的每个节点指的是不同的fliters,即对于每个卷积核得到的某个通道上的特征图进行normalization,之前提到,CNN中的每个卷积核都是对于输入的所有通道上进行的,故而对于N个输入样本,每个卷积核将会得到一个1*H*W的特征图,对于N*H*W个数值进行normalization,这样的操作在C个通道上重复进行。也就是说,CNN中的BN是在spatial location H*W和training examples N维度上进行的。则对于输入特征图,将会得到C个经验均值(empirical mean)和C个经验方差,然后将它应用到每个通道的activation map上。CNN层中的BN learnable parameters是C个gamma和C个beta
5.loss函数计算检查
6.loss和学习率
loss几乎不变:学习率太小。这种情况下对于分类问题可能会导致loss不变,但是分类准确率performance上升的现象,是因为是用的是softmax分类器,将会以概率值最大的类别作为预测类别进行输出,假设是2分类问题,比如之前预测为正确类别的概率为0.48,则loss=-np.log(0.48),由于学习率设置的比较小,梯度更新的幅度会比较小,但是梯度下降法还是会朝着正确的权值优化方向走小小的一步,故而对于正确类别预测的概率值会变大,loss=-np.log(0.51),则loss数值变化不大,但是当前样本就是一个TP,accuracy提升。
loss变化剧烈:学习率设置太大,导致dW大,从而计算得到的loss变化大。
loss NAN :学习率设置太大
7.超参数优化