这套笔记是跟着七月算法五月深度学习班的学习而记录的,主要记一下我再学习机器学习的时候一些概念比较模糊的地方,具体课程参考七月算法官网:
1. 神经网络的训练
1.1 Mini-batch SGD
不断循环:
1 采样一个batch数据(比如32张,可以做镜像对称)
2 前向计算得到损失loss
3 反向传播计算梯度(一个 batch上的)
4 用这部分梯度迭代更新权重参数
未必找到全局最优,但是会找到相对好的解
1.2 两种方法去均值:
Subtract the mean image (mean image=[]32,32,3 array) 对一幅图像求均值
Subtract per-channel mean(mean along each channel = 3 numbers)对每个通道分别求均值
不要做标准化,PCA,和白化。
1.3 权重初始化
a. 为什么W不初始化为0? 使得每层的Input都相等(对称性)。传回的梯度也相等,使得网络中每个神经元学到同样的内容。而我们需要每个神经元学不同的东西
b. 用非常小的随机数初始化权重(eg.高斯分布), 希望W中正数和负数比例为1:1.(避免权重向某一侧倾斜)
对于层次不深的网络OK
深层网络容易带来整个网络(激活传递)的不对称性
c .
从图上可以看到,第一层的输出呈现高斯分布,而后面几层的输出均值和方差均趋近于0.
如果很小的值不行,那么很大的值可不可以。
均值和方差频繁波动。输出不是1就是-1
可以看到这种方式不适合训练深度网络
c . Xavier Initialization
我们希望输出的方差和输入层的方差基本一致。
这中方式在提出ReLU后就不好用了。
后续的做法:
其取值将原来sqrt(n)换成sqrt(n/2)
1.4 .后来谷歌提出的方式:关于Batch Normalization
如何约束W.
期望激励过后的结果是高斯分布的,那我们就手动修一下
做法:
关于Batch Normalization好处
梯度传递(计算)更为顺畅
学习率设高一点也没关系
对于初始值的依赖减少了!!!
说起来,其实这里也可以看做一种正则化,减少了对dropout的需求。
1. 5. 训练时注意事项
构建简单网络验证搭建是否正确
先把正则化调小,观察是否loss下降
监控一下loss
通过准确率看看网络大小是否设置合适
2. Dropout
神经网络的正则化方式:别一次开启所有学习单元
随机关闭一些神经元。
简单的实现方式:
设置阈值。
2.2 为什么能防止过拟合?
别让你的神经网络记住那么多东西(知道你记忆力好)
就是一只猫而已,要有一些泛化能力
另外的理解方式:
每次都关掉一部分感知器,得到一个新模型,最后做融合。不至于听一家所言。
参考资料:
七月算法:http://www.julyedu.com/
图片来自于课程PPT