cs231n第4节课笔记

激活函数
先介绍了几种激活函数,sigmoid不管输入是多少,都会激活为正数(副作用?)
tanh解决了sigmoid的问题,拥有正负数,但是饱和的时候梯度很小
ReLU解决了tanh的问题,梯度很大,但是左侧没有梯度(彻底饱和),(所以W的初始化要比0大一点点,像0.01左右的随机数)
Leaky ReLU解决了ReLU的问题,左侧有梯度
ELU解决了Leaky的问题,输出均值为0(Leaky呢?)
还有种非主流激活方式:maxout,有ReLU和Leaky ReLU的作用,但是要双倍的参数量(很像水平细胞?)

数据预处理
减去均值图像 [32,32,3] (如Alex Net)
或减去3通道均值 [3,] (如VGGNet)

权重初始化
W都=0,不好,一个隐藏层的所有神经元都会学到一样的参数
W都=0.01左右的随机值,网络层数少可以,网络层数多,网络深层输出分布会接近0,即W的更新梯度会趋近于0,网络会更新不了
W都=1左右的随机值,网络层数多,网络深层输出分布会趋近于-1和1,因为tanh会处于饱和状态,W的梯度会趋近于0,网络几乎更新不了
W=Xavier更新方法,除以输入的根号值,网络层数多,网络深层输出分布会维持在高斯正态分布,所以梯度很健康,网络可以继续更新,如果加了ReLU,那就再除以根号2,如果是tanh,那就不知道怎么样再搞一搞。
BN(Batch Normalization),在FC层/Conv层后,激活函数层前加入,使即使在网络深层输出也依然塑造成高斯正态分布。要是tanh不喜欢单位高斯正态分布咋办?那就加入2个参数调整BN的“w和b”,让网络自己具有“改变BN幅度或取消BN”的能力。有了BN,网络对权重初始化的高度依赖就大大减弱了,基本上普通的W=0.01左右的随机值可以胜任训练。

照看网络宝宝的学习过程
sanity check:不带reg(reg=0)地前向传播一次,看看loss(softmax):和预期相同
sanity check:带小reg(=1e3)地前向传播一次,看看loss:和预期相同,稍微大了一点
在20个训练集样本上训练,看看能不能过拟合:loss很小,accuracy=100%,过拟合成功,网络没问题
lr(学习率)=1e-6试试看:loss几乎没动(训练集精度在上升),看来需要让学习率增大一点
lr(learning rate)=1e6试试看:loss得到了溢出NaN,意味着学习率太大了
lr=3e-3试试看:loss得到了inf,学习率还是太大了

超参数优化
在log范围搜索(epoch=5)
reg = 10 ** uniform(-5, 5)
lr = 10 ** uniform(-3, -6)
不要网格搜索,要随机数搜索(因为一个超参可能比另一个超参重要得多)