Digit Recognizer
batch梯度下降算法
梯度下降算法并不能保证被优化的函数达到全局最优解,只有当损失函数为凸函数时才能保证达到了全局最优解。除了不能达到全局最优解,梯度下降算法的另外一个问题就是计算时间太长,因为要在全部训练数据上最小化损失,在每一轮的迭代过程中都要计算全部数据上的损失函数。
随机梯度下降(SGD)
为了加速训练过程,可以使用随机梯度下降算法(Stochastic Gradient Descent),这个算法在每一轮迭代过程中随机优化某一条数据上的损失函数,更新的速度就大大加快了,由于每次只是在一条数据上计算损失,并不能代表在全部数据上的损失函数更小,所以随机梯度下降算法甚至可能无法达到局部最优。另外随机梯度下降算法永远不会收敛,只会在最小值附近不断地波动。另一个很大的缺点是不能使用向量化进行加速,因为他每次只选用了一个样本。
Mini_batch梯度下降
批梯度下降算法:每次计算一小部分数据的损失函数,进行一次参数的更新,这一小部分数据称为一个batch,每次使用一个batch可以大大减小需要迭代的次数,同时可以使收敛的结果更加接近梯度下降。
batch_size为批处理参数,即经过batc_size个样本则进行一次梯度下降,当数据量比较小时,可以将batch_size设置为全数据集。
例如有500万的训练集,划分为每个子集为1000个样本,那么会有5000个这样的子集,每一次对1000个样本进行整体梯度下降更新参数。当计算完5000个子集时即完成了一个epoch(遍历整个数据集)
三种梯度下降算法的比较
在batch梯度下降中,单次迭代的成本是下降的,在mini_batch梯度下降中,并不是每次都会下降,但是整体趋势是下降的,会有更多的噪音,因为每次选取的数据不一样,遇到好处理的成本就低,难处理的成本就高。
如何选择参数batch_size
如果训练集较小(小于2000)可以直接使用Batch Gradient Descent,一般batch_size的大小选择2的幂次计算较快(64-512)是为了符合CPU/GPU的内存要求
过拟合
欠拟合(unoverfitting):根本原因是特征维度过少,模型过于简单,导致函数无法满足训练集,误差较大。表现为高偏差(训练集与验证集上的损失都比较高(High bias)),可以通过以下方法改进:
1、调整更深更大的网络结构(Bigger Network)
2、增加更多的训练时间(Time Longer)
3、寻找其他的网络结构(NN Architecture Search)
过拟合(overfitting):当模型过于复杂或者训练次数太多,导致在未知数据上预测的准确性明显低于在训练数据上的准确率,表现为高方差(High Variance)如下图:在训练集的准确率明显有高于在验证集上的准确率
解决过拟合的方法:
1、交叉验证(Cross Validation)
2、使用更多的训练数据或者使用数据增广的方法(Train with more data)
3、提前结束训练(Early Stopping)
4、正则化(Regularization):让模型变得简单
5、随机失活(Dropout)
数据增广之后的效果如下,可以很明显的看出避免了过拟合,并且准确率较高