训练神经网络
2019-05-21 本文已影响0人
autisticBoy
(在听课时做的一些笔记,本人菜鸡)
激活函数
1.sigmoid
- 形式:1 / 1 + e ^ -x
- 优点: 将输出值压缩在[0,1]之间,x很大时接近1,x很小时接近0
- 缺点:1.在反向传播时x很大或者很小可能会使导数很小,这个很小的导数又会传到下游
2.不是zero-center 在本地对w(参数)进行求导时,如果输入的x全部是正,那么对w求导全是正或者负(取决于上游导数),这样在更新梯度时效率低下
3.exp()计算代价很高
2.RELU函数
- 形式: fx = max(0, x)
- 优点:1.不会饱和(在x > 0区域) 2. 计算方便 3. biological plausible
- 缺点: 1. x < 0 仍存在饱和 (dead Relu)2. 不是zero-center
3.LeakyReLu
- 形式: fx = max(0.01x, x)
- 解决了ReLu 的负饱和
建议:
- 使用ReLu,注意learning rate
- 尝试LeakyReLu/ELu 等函数
- 不用sigmoid
数据预处理
1.zero-centring
- 作用:防止梯度恒为正/负
- 使用:x -= np.mean(x, axis = 0)
2. normalize data
- 每个x贡献相同
- 使用: x /= np.std(x, axis = 0)
建议
在做视觉时用第一个不用第二个
weight initialization
1. small random number
- 实现: 0.01 * np.random.randn(D, H)
- 在大型神经网络中,可能随着一层层的激活函数,all activation become zero, 在反向传播中,对于x的导数会越来越接近0
那如果 把0.01 变成1会怎么样: 输出过大导致激活函数出现饱和
建议
使用xaviier initialization 即 W = np.random.randn(fan_in, fan_out) / np.sqrt(fan_in / 2) (/2 目的是
batch normalization
- 数学表达(Gauss): x = x - E[x] / VAR[x] ^ 0.5(可以理解为一定程度上正则化)
- 通常插在fc层和activiation层中间
- 让神经网络有能力能恢复归一化之间的数据(设置 m = VAR[x] ^ 0.5, n =E[x] )
- 在测试阶段,不用重新 计算e 与var 用训练阶段的数据
优化算法
SGD(随机梯度下降法)
-
缺点:1.可能会出现如图情况
2.也可能会停在局部最小值或者鞍点(saddle point)
3.could be noisy
image.png
改进:SGD+momentum
image.pngrho为摩擦系数 一般为0.9或者0.99
速度一般初始化为0
RMSProp
image.png先平方在去除的原因是让变化小的dimension加速,让变化大的dimension减速
Adam
结合前两种
image.png
这个有问题就是在前几项的时候secoond_moment会很小,导致前几步过于大,但是这个过大不是因为本身的梯度问题而是认为导致
Adam改进
image.png解决了上述问题,这个算法应该是最先应该被考虑的
正则化
L2 regularization
image.png- 缺点:在神经网络中may not perform well
dropout
- 想法:在每次正向传播的时候,把一部分神经元的激活函数设置为0
-
原因:减少了神经元之间的耦合度,防止过拟合
image.png
data augmentation
对数据进行处理,如对图片进行水平翻转,标签不变