梯度下降(gradient decent)

基本概念

  • 什么是梯度:在多元函数中,梯度可理解为求各个变量的偏导数,最终各个偏导组合成梯度向量,即代表该函数在该点变化最快的方向。
    eg: \(f(x,y)=x^2+y^2\), 梯度向量为(2x,2y),在点(1,1)处的梯度即为(2,2),即沿(2,2)这个方向函数变化最快。
  • 梯度下降的作用: 求损失函数的最小值. 因为梯度是函数值下降最快的方向, 所以经常用梯度来构造参数的更新表达式, 以此来求使得损失函数的函数值最小的参数值.

Vanilla Gradient Descent(普通梯度下降)

1、求解梯度向量
2、一点点沿着梯度的方向迭代更新函数值,使函数最终下降到局部最小值处。
$$
\theta^{new}_j=\theta^{old}_j-\alpha\nabla_{\theta}J(\theta)=\theta^{old}_j-\alpha\frac {\partial}{\partial \theta^{old}_j}J(\theta)
$$
注1: \(J(\theta)\)是损失函数, \(\theta\)是参数, \(\alpha\)是步长(step size).
注2: 步长\(\alpha\)的值若取太小则求解速度慢,取则会造成抖动。
解决方法:距离谷底较远时,步幅大些比较好(加快速度);接近谷底时,步幅小些比较好(以免跨过界)。距离谷底的远近可以通过梯度的数值大小间接反映,接近谷底时,坡度会减小,因此可设置步长与梯度数值大小正相关。

Stochastic Gradient Descent(SGD,随机梯度下降)

VGD中,损失函数相当于每个数据样本取平均值,因此每次更新都需要遍历所有data,当数据量太大,更新一次梯度会花费大量时间,因此并不可行。
解决这个问题的基本思路:只通过一个随机选取的数据(xn,yn)来获取梯度(通常损失函数都是很多项的变量加和得到的,这时只取一项计算其梯度,用来估计整体的梯度),这种方法叫随即梯度下降。
虽然这样估计梯度非常粗糙,但事实证明这种方法效果还不错。

Softmax函数

  • 作用:Takes an un-normalized vector, and normalizes it into a probability distribution. After applying Softmax, each element \(x_i\) will be in the interval \([0,1]\) and \(\sum_ix_i=1\).
  • 公式:
    $$
    p(x_i) = \frac {exp(e_i)} {\sum_{n=1}^Nexp(x_n) }
    $$
  • 应用:可用于分类任务中,对目标进行线性分类;也经常用在神经网络中,用于将输出值归一化(原先值可能有负数,可能大于1,且所有值加和不为1),可视为产生概率分布。

Sigmoid函数

epoch,batch,iteration概念解释

结论先行:epoch是全量数据集经过一次计算的过程,batch是全量数据集中的一小份,iteration则是batch经过一次计算的过程。(“一次计算”的含义:计算了一次梯度,并用优化算法(eg. 梯度下降)对神经网络进行了一次更新)

batch

  • bacth指将数据集分为若干小份,一个小份一个小份去计算梯度、更新神经网络,通常也成为mini-batch。
  • 为什么会有mini-batch
    • 神经网络中,所有的优化方案都是梯度下降,一般两种方式:第一种是遍历全部数据集算一次损失函数,然后算函数对各个参数的梯度,更新梯度,这种方法最大的缺点就是计算开销大;另一种是每看一个数据就算一次损失函数,然后求梯度更新参数,称为随机梯度下降。这种方法虽然速度块,但收敛性能不好,可能在最优点附近晃来晃去。
    • batch即是两种方案的折衷,即小批的梯度下降,把数据分为若干个批,按批来更新参数。计算量不大,同时一批中所有数据共同决定梯度下降的方向,减少了随机性和震荡性。
    • 下图是三种计算方式的比较,蓝色线表示取一次取全量数据集计算,收敛效果更好,适合数据集不大的情况;红色线为随机取数据计算(Batch_Size等于1的情况),可以看出较难以收敛;绿色线为mini-batch,减轻了stochastic的震荡性,计算量增加也不大,是一种较为折衷的训练方式。

batch不同取值的影响

  • batch size对训练过程的影响
    • 若batch size过小,训练数据就会非常难收敛,从而导致underfitting。
    • 增大batch size,不仅收敛效果更好,而且处理速度也会加快(单次batch计算可以并行化地处理更多数据,单次epoch的迭代次数减少,即提高运行速度)。
    • 但增大batch size,所需内存容量增加(每次计算需要将batch中的数据加载进内存),所以也不能一味地增加bacth size。

epoch

当完整的数据集通过了神经网络一次,这个过程就称为一次epoch,神经网络训练通常会将整个数据集在神经网络上计算多次,即多个epoch。

  • 为什么要使用多个epoch
    提升训练效果。经验证明只对数据集计算一次不足以拟合神经网络,所以将数据集在同样的神经网络中传递多次以提升训练效果。
    但注意epoch次数过多会导致过拟合的问题,且计算开销会增大,因此也要合理选择epoch次数。

iteration

iteration是相对batch而言的,对batch的数据进行一次计算就算做一次iteration。
eg. 训练集有1000个样本,batchsize=10,那么训练完整个样本就需要:1000/10 = 100次iteration(即1次epoch需要100次iteration)。


Post Date: 2018-11-07

版权声明: 本文为原创文章,转载请注明出处