CS231n 2017 Spring Lecture6 Training Neural Networks Ⅰ总结
两层的神经网络
可以看到红框内经过了Relu的操作
参数经过低度下降进行调整,最终收敛,那么用什么方法进行训练呢?
一般用小批处理SGD(mini-batch SGD),这样的方法可以克服BGD(批处理梯度下降)的计算量巨大的缺点,也能加速SGD(Stochastic Gradient Descent)收敛,是一个比较好的这种方法,当然在深度学习的发展过程中又出现了很多其他的优化方法,具体有
- 动量方法(Momentum)
- Nesterov梯度加速法(NAG)
- Adagrad方法
- AdaDelta方法
这里优化方法也是深度学习中的一个很重要的课题。
总览
- 首先设置好一次性地参数:
如activation functions, preprocessing, weight initialization, regularization, gradient checking - 动态训练过程:
在训练的过程中调节参数,比如自适应的学习率调整。另外还有超参数的优化。 - 评估
model ensemble
Activation Functions(**函数)
这同样是一个课题
Sigmoid
可以看到Sigmoid函数的函数式,将函数范围压缩在[0,1],但是在这个函数有3个问题
- 梯度消失问题
- Sigmoid的输出不是zero-centered
- exp()函数耗费很高的计算力
可以看到在很大以及很小的时候梯度已经基本变为0,这样在BP的时候梯度就基本没有了,另外在计算梯度的时候会用到dLdf⋅dfdw ,其中L是Loss函数。那么在输入时正数时就会只得到同样符号的梯度,最终会导致梯度下降的方向不规则收敛很慢,如下图。
tanh
其函数形式为:
它是Sigmoid的一个变形可以看做
但还是会有梯度消失的问题,实际也并不经常使用此**函数。
Relu
但是当x小于0时会有Dead Relu出现,梯度也会消失。所以初始化时都初始化微小的正数。
剩下的一些方法基本都是Relu的改良
Leaky Relu
ELU
在实践中使用**函数
数据预处理
处理数据首先将原始数据经过zero-centered的过程,就是将数据分布调整到从0开始,然后对数据进行正规化。
实践中可能用到主成分分析与白化。
但是在对图片进行处理的时候可能会用到将所有的点减去平均值的方法来进行zero-centered的处理。
权重初始化
当w初始参数全部设置为0的时候,可能bp算法无法进行(因为得到的都是0)。所以很直接的有初始化很小的随机值的想法。
但是针对于深度一点的网络来说,这种方法并不可行,因为对于深度的网络来说,每一层的w都很小,到最后基本上wx基本上都是0,也很难再利用bp调整梯度。
那么我们调大初始值会发生什么?
这里可以看到我们将高斯分布的值乘以1作为初始值,当进行前向传播以及反向传播时最终会饱和,得到1或者-1,这时梯度基本为0,可以说梯度又消失了。这是cs231课程的笔记有推导该初始值的过程。
所以基本都是使用下列方法来进行初始化的。
Xavier initialization可以看做是从标准高斯分布中取出的并且以输入数据进行缩放
可以看到在使用Relu的时候这个初始化方式得不到很好的结果
因为Relu会造成一般的神经元‘死掉’所以应该讲刚才除以的规模再缩小为二分之一,得到如下形式。
因此将其改进成上图形式。
这里列出有关初始值的研究如下
批量正规化
这种正规化处理在CNN里面经常用到,通常都是在经过卷积之后。
在这里有一个恢复的过程,可以让网络学习
算法步骤
照顾训练过程
检查loss