该博客主要用于个人学习记录,部分内容参考自:[基础]斯坦福cs231n课程视频笔记(三) 训练神经网络、【cs231n笔记】10.神经网络训练技巧(上)、CS231n学习笔记-训练神经网络、整理学习之Batch Normalization(批标准化)、CS231n-2022 Module1: 神经网络3:Learning and Evaluation 参数初始化问题。 学习率太高导致在训练过程中参数更新太大。 在训练开始之前,我们常常会对数据进行预处理,以使得更加适合训练。测试时,或者实际运行时,不用做数据预处理(当然这里说的是类似归一化、zero-centerd这样的操作,反之,像截取这样的处理还是要的)。 归一化就是将原本散乱的数据归一成零均值、方差为1,zero mean ,unit variance的操作,由此数据的中心大致处于D维空间的零中心。归一化可以使得分类器更鲁棒,对于微小的扰动不会过于敏感。 在一般的机器学习问题会有差别很大的特征,并且这些特征会处于的范围差别也很大,所以需要使用归一化。 在机器学习中,可能会看到有PCA和白化的数据预处理方式。但在图像应用领域中,我们做零均值化(zero mean) 的处理而不做归一化,也不会做这些更复杂的预处理,因为对于图像来说,我们不会真的想要所有的输入,我们就想在空间中应用卷积神经网络得到原图像的空间结构。 在训练阶段我们从所有图像中计算它们的均值,得到与每张图像尺寸相同的均值图像,对要传到网上的每张图减去整张均值图像的值。在测试阶段对在训练中确定的数组做同样的事。 在实践中,对一些网络,我们也可以通过减去单通道均值代替用一整张均值图像来将图像集零中心化,我们只是取每个通道的均值。这么做是因为发现纵观整张图像来看相似度足够,减去均值图像和只是减去单通道值二者相比没有太大的不同,并且更容易传送和处理。所以你也会在像是VGG网络中见到这种操作。 权重初始化的主要目的,是为了让数据更好地分布,如果数据大量集中在一个部位,很可能导致梯度丢失,从而无法更新前面的权值。 如果把所有参数都设为0,给定一个输入,每个神经元将在你的输入数据上做相同操作,输出相同的值,得到相同的梯度,这与我们期望的不同神经元学习到不同的知识相悖。关键就是当用相同值初始化所有参数时,基本没有打破参数对称问题。 若所有权重是一个从概率分布中抽样的小的随机数, \(W = 0.01 * np.random.randn(D,H)\)。在这个例子中从高斯分布中抽样,对它进行缩放使标准差为0.01,由此给定了很多小的随机参数。这样的参数适用于小型网络中,打破了参数对称问题,但在结构深一些的网络中可能会存在问题。 例如我们初始化一个10层神经网络,每层有500个神经元,使用tanh非线性激活函数,用小的随机数来初始化,经过网络在每一层观察产生的激活函数的数据的统计结果,如果计算每一层的均值和标准差会发现在第一层中能得到较为合理的高斯分布,接着不断收缩,最后所有的激活值都变成了0。在反向传播时,权重的梯度由上游梯度×本层梯度得到,即\(W·X\),由于输入的X很小,权重的梯度将会很小,基本没有更新,最终都趋向于0。 若用1代替0.01,即\(W = 1 * np.random.randn(D,H)\)。由于权重变大了,所以几乎所有神经元都处于饱和状态,无论tanh的负方向还是正方向,在实践中观察每一层激活值的分布,它们会趋近于-1或+1,对照前面讲过的tanh,将导致所有梯度趋于0,权重得不到更新。 权重太小,激活值趋近于0,梯度趋于0,不学习。 从标准高斯分布中取样,根据我们拥有输入的数量来进行缩放,要求输入的方差等于输出的方差。 但是当使用ReLU激活函数时,它会消除一半的神经元,实际上会把得到的方差减半,可以将公式变为\(W = np.random.randn(Din, Dout) / np.sqrt(Din / 2)\) Batch normalization 的 batch 是批数据,把数据分成小批小批进行随机梯度下降 ,而且在每批数据进行前向传递的时候, 对每一层都进行 normalization的处理。常用在在全连接层FC或者卷积层Conv之后,非线性层之前。随着网络的深度增加,每层特征值分布会逐渐的向激活函数的输出区间的上下两端(激活函数饱和区间)靠近,这样继续下去就会导致梯度消失。BN就是通过方法将该层特征值分布重新拉回均值为0方差为1的标准正态分布,特征值将落在激活函数对于输入较为敏感的区间(把输入限制在非线性函数的线性区域内),输入的小变化可导致损失函数较大的变化,使得梯度变大,避免梯度消失,同时也可加快收敛。 给定输入,对每个输入的小批量都计算均值和方差,利用均值和方差进行归一化操作,然后用常量\(\gamma\)进行额外的缩放,再用另一个因子\(\beta\)进行平移,这里实际在做的是允许你恢复恒等函数。从而改进了整个网络的梯度流,具有更高的鲁棒性,能够在更广范围的学习率和不同初值下工作,所以一旦使用批量归一化,训练会更容易。 在测试阶段,对批量归一化层,现在减去了训练数据中的均值和方差,所以在测试阶段不用重新计算,只需把这当成训练阶段,例如在训练阶段用到了平均偏移,在测试阶段也同样会有所用到。 Look for correct loss at chance performance. 确保用很小的值进行参数初始化时得到符合预期的损失。最好先单独检查数据损失(将正则化强度设置为零)。例如,对于具有Softmax分类器的CIFAR-10,我们期望初始损失为2.302,因为我们期望每个类的扩散概率为0.1(因为有10个类),并且Softmax损失是正确类的负对数概率,所以:-ln(0.1)=2.302。如果检验时没有获得预期损失,那么初始化可能会出现问题。 作为第二个完整性检查,经过上一步的初次检验后,增加正则化强度时,损失也应该随之增加。 过拟合测试Overfit a tiny subset of data.在对整个数据集进行训练之前,试着对一小部分数据(例如20个样本)进行试训练,确保你可以得到zero cost。在这个实验中,应该将将正则化设置为零,否则会影响你获得0损失。如果没有通过这个检验,则该网络模型就不值得继续使用完整的数据集进行训练。 在神经网络的训练过程中,有许多有用的量需要监控:loss, train/val accuracy, ratio of the update magnitudes, the first-layer weights in ConvNets Learning rate(最重要,首先要处理), regularization, learning rate decay, model size 一重验证比交叉验证好 交叉验证 随机搜索有时比网格搜索更好.超参数最优值大概率并不会恰好出现你规划的搜索格点上。随机搜索能帮助你更精确地找到最优解。 左图是随时间变化的损失函数曲线,由图中发现曲线在下降,说明神经网络的损失函数在降低。中间的图中,x轴是训练时间或迭代次数,y轴是模型在训练集上的损失函数。右图是训练集和测试集随时间变化的精确度。可以发现随着时间的增加,训练集上的效果随着损失函数的下降越来越好,但验证集却在达到某一点后不再上升,这表明模型进入了过拟合状态,这时可能就需要加入其他的正则化手段。 当观察学习率损失取消时,如果在一段时间内很平缓突然又开始训练,可能是初值没有设置好一、激活函数Activation Funnctions
1、Sigmoid: \(\sigma(x)=\frac{1}{1+e^{-x}}\)
当输入远远离0时,处于饱和区,激活节点的本地梯度趋近于0,导致前面的层中参数无法得到有效的更新。
意味着如果输出的激活值作为后继节点的输入一直是正数,那么导致后续节点本地梯度(就是w对应相乘的那个x)一直是正数,所以所有输入的下游梯度一定和输出的上游梯度同号,全为正或全为负(具体依表达式f而定),这会导致参数用梯度下降法更新时,呈现z字型下降。 正如下图中所示,最好的路径是蓝色,但是由于受到方向限制,只能通过反复的红色路径才能达到同样效果,使得梯度更新效率低。
2、tanh(x)双曲正切
3、ReLU: \(f(x)=max(0,x)\)
Dead ReLU Problem
如果权重设置太低,恰巧不在data cloud中,这导致我们将不能得到一个能激活神经元的数据输入,同时也不会有一个合适的梯度传回来,所以它既不会更新,也不会被激活。
当你的学习率很大时,在这种情况下从一个ReLU函数开始,但因为你在进行大量的更新,权值不断波动,然后ReLU单元会被数据的多样性所淘汰,这些会在训练时发生,在开始时很好,但在某个时间点之后开始变差最后dead。4、Leaky ReLU: \(f(x)=max(0.1x, x)\)
5、ELU (Exponential Linear Units): \(f(x)= \left\{\begin{array}{lrc}x&if&x>0\\\alpha(exp(x)_1)&if&x\leq0\end{array}\right.\)
6、Maxout Neuron: \(f=max(w_1^Tx+b_1,w_2^T+b_2)\)
总结
二、数据预处理 Data Preprocessing
在本课程中,一般对图像来说,在每个位置已经得到了相对可比较的范围与分布,所以大多数情况下我们会做zero centering的处理,但不会真的过多地归一化像素值。零均值化(zero mean)的处理。
三、初始化权重 Weight Initialization
权重太大,网络饱和,梯度也趋于0,不学习。Xavier 初始化: \(W = np.random.randn(Din, Dout) / np.sqrt(Din)\)
如果输入数据少,将除以较小的数,从而得到较大的权重,我们需要较大的权重来得到一个相同输出的方差。
反之,如果输入数据多,将除以较大的数,得到较小的权重来得到一个相同输出的方差四、批量归一化Batch Normalization
BN做法
好处:
五、训练过程监视Babysitting the Learning Process
1、数据预处理Preprocess the data
2、choose the architecture
3、优化前:
4、开始训练
5、提前停止:当验证损失开始上升时
六、超参数优化Hyperparameter Optimization
在训练集上训练,在验证集上验证,观察这些超参数的实验效果。
①首先选择相当分散的数值,用几个Cross-validation 迭代学习来确定超参数的有效范围,以便做出调整
②花较长时间在前面得到的超参数区间内进行进一步精确搜索
如果出现一个远大于初始cost的值比如超过了3倍,可以说明这个超参数是错的,它会迅速变得很大,直接结束训练。