马上要过年啦,祝大家新春快落!
写在前面:最近沉迷网络调参无法自拔,我就简单列举一下我遇见的情况以及对应措施记录一下,之后也会缓慢更新
TODO:
- 学习率对收敛速度的影响
- 学习率和BatchNormalization层之间的相互影响
- 关于BN层:是否在每一个卷积层后都要加入一个BN层?我现在的网络结构是只在输出之前加了BN。BN层的位置有无影响?
- SGD和Adam优化的比较
- 规则项L1范数和L2范数的选择
- batch_size对网络收敛的影响
- batch_size对网络效果的影响
1、学习率对网络收敛速度的影响
我的网络结构相对简单,所以本次也是基于网络没有那么deep的情况记录的
输入为[12,12,3],结构为1层卷积+1个maxpool+2层卷积+一层MLP+softmax激活后得到两个输出,优化器为Adam函数
合适的学习率:1e-4~1e-6范围之间,这个范围的学习率能够在大部分时间保障网络以一个较为稳定的速率下降,并且一般情况下能够得到最好的优化结果(我的实验中是0.90)
学习率过大:1e-3左右,容易陷入局部最优,但是初期下降会比较快(我的实验中是0.78-0.8,基本不可能突破0.8)
学习率过小:emmmm还没尝试
其实我以前也调过一些主流CNN的网络,例如ResNet,GoogLeNet,VGG等,深度都不太相等,但是学习率基本都设置在1e-4~1e-6
基本的技巧:如果网络比较的简单,那么可以直接用小学习率闷头算,如果网络变得大了,就选用大的学习率1e-3甚至0.01量级去训练几个周期,感觉差不多到头了再按0.1的量级去减小学习率再训练
2、学习率和BN层的相辅相成相爱相杀
学习率就是learning rate,是调参一定会修改的一项参数,往往根据输入数据的不同、网络结构的不同,训练阶段的不同,都需要手动or自动的调整lr使网络进一步收敛。
BN层就是BatchNormalization层,批标准化,在这次调参过程中我才意识到我之前对BN层的理解还是不够的,错误理解划掉:我之前理解为了是对批输出数据做一个高斯分布使边缘数据(接近激活函数饱和区的输出)尽可能向0靠拢,简单来说就是做了一个数据的集中化处理。
后来在这次学习过程中我学习了大佬做的可视化分析和视频,也进一步理解了BN能为网络所带来的收益,就是他能有效地解决ReLu(我本次使用的激活函数全部都是ReLu)最显著的缺点,就是造成大量dead node,把那些处于死亡边缘的节点神奇的奶住,能够让网络中有效的节点数增多。
盗一个大佬的图,这个是tanh激活函数的实例示例,可以看到把本来为0接近无效的数据变得规整
那么,具体的来举几个栗子,也是我的实验结果
总结的来说,BN层的优点如下:
(1)BN层对收敛速度的改善非常大(2)能够使用大学习率训练
(1)使用相同学习率lr=0.001,无bn层直接没有输出
(2)bn层lr=1e-4和无bn层lr=1e-6收敛速度对比,结果惨烈hhhh
BN层对收敛结果基本无影响,我的实验中最终结果是使用的BN层的比未使用的好0.0001,但是没有BN层的时候收敛到最好结果真的很难…………
3、神经网络优化函数的L1和L2正则化的选择
今天在别人的讨论中又学习到了新知识啦!特此记录:)
在之前的学习中,我自己对这两个方法的使用还是非常浅显的,只是单纯的知道在计算损失函数的时候加入这种正则化方法能够防止过拟合,加速收敛啥的,却不知道其真正的含义以及该如何选择。
首先理解一下这两种正则化方式的数学表达式,例举最简单的loss function: w = ∑ n ∣ X i − Y ∣ w=\sum_{n}|X_{i}-Y|