深度学习入门教程(6)MNIST手写数字识别
one_hot:
在多分类的网络输出层,我们会对于每一个输出都有输出一个概率矩阵表示该输入对应每个分类的概率有多少,而我们实际的数据,为了力求分类准确,应该是一个正确类别概率为0,其余分类概率均为0的矩阵。而one_hot就是将我们把分类概率矩阵变为0-1矩阵。
Batch:
我们有N个样本参与训练,每个样本都会给不同方向的梯度带来一个动量,但是一次全部计算是不现实的事情,尤其是在面对大数据量的时候,现有的硬件条件和速度并不能满足要求,但是我们可以采用Batch的方法,一次只将部分的数据放入网络训练,虽然这样做有失一定的准确性,但是只要Batch设置的合理,整个函数的走向大趋势依旧是往最小值点去的。一般将Batch设为2的次幂,本人一般都是设在64左右,调整都以2的倍数进行,以满足内存对齐的需求。
如果我们用全部的训练集去训练,走的曲线可能会贴近下面那条较为平稳的线,但鉴于实际情况,我们可能无法一次训练整个训练集,我们采用Batch方法部分训练,这样走的方向可能更贴近上面的线,虽然迭代次数会增加,但是大方向是正确的,而且由于一次参与的数据量小,迭代过程进行得也比较快。
MNIST数据集训练:
准确率上升趋势:
可以见到,准确率在起初的上升还是比较快的,随着迭代次数的增加,准确率趋于稳定,在某一个值震荡。
引起震荡有三种可能:
1)鞍点:在多元函数中,会存在一种点,他对于某些变量的梯度很大,对于某些变量的梯度很小,这可能导致我们的值不能按照目的往最低点去而是在鞍点附近震荡。
2)局部最小值:有可能因为我们的步长设的过小,导致网络的迭代陷入了某个局部最小值而没有足够的步长跳出,从而导致振荡现象。
3)全局最低点:我们知道,全局最低点只是一个点,想要通过梯度下降完全找到,在复杂的多元函数中,是十分困难的,要求的精度实在是太高,而我们的步长可能相对来说过大,因此也会在全局最低点附近震荡。