几乎所有的深度学习算法都用到了一个非常重要的算法:随机梯度下降(stochastic gradient descent,SGD)。随机梯度下降是梯度下降算法的一个扩展。
机器学习中反复出现的一个问题是好的泛化需要大的训练集,但大的训练集的计算代价也更大。机器学习算法中的代价函数通常可以分解成每个样本的代价函数的总和。例如,训练数据的条件对数似然可以写成 J(θ)=Ex,y∼pˆdataL(x,y,θ)=1m∑mi=1L(x(i),y(i),θ) J ( θ ) = E x , y ∼ p ^ d a t a L ( x , y , θ ) = 1 m ∑ i = 1 m L ( x ( i ) , y ( i ) , θ ) ,其中L是每个样本的损失 L(x,y,θ)=−logp(y|x;θ) L ( x , y , θ ) = − log p ( y | x ; θ ) 。对于这些相加的代价函数,梯度下降需要计算 J(θ) J ( θ ) 对 θ θ 的梯度。这个计算的计算代价是 O(m) O ( m ) 。随着训练集规模增长为数十亿的样本,计算一步梯度也会消耗相当长的时间。
随机梯度下降的核心是,梯度是期望。期望可使用小规模的样本近似估计。具体而言,在算法的每一步,我们从训练集中均匀抽出一小批量(minibatch)。样本 B={x(1),...x(m′)} B = { x ( 1 ) , . . . x ( m ′ ) } 。小批量的数目m’通常是一个相对较小的数,从一到几百。重要的是,当训练集大小m增长时。m’通常是固定的。我们可能在拟合几十亿的样本时,每次更新计算只用到几百个样本。
梯度的估计可以表示成 g=1m′∇θ∑m′i=1L(x(i),y(i),θ) g = 1 m ′ ∇ θ ∑ i = 1 m ′ L ( x ( i ) , y ( i ) , θ ) 使用来自小批量 B 的样本。然后,随机梯度下降算法使用如下的梯度下降估计: θ←θ−εg θ ← θ − ε g 其中 ε ε 是学习率。
传统梯度下降往往被认为很慢或不可靠。以前,将梯度下降应用到非凸优化问题被认为是没有原则的。优化算法不一定能保证在合理的时间内达到一个局部最小值,但它通常能及时的找到代价函数一个很小的值,并且是有用的。
随机梯度下降在深度学习之外有很多重要的应用。他是在大规模数据上训练大型线性模型的主要方法。对于固定大小的模型,每一步随机梯度下降更新的计算量不取决于训练集的大小m。在实践中,当训练集大小增长时,我们通常会使用一个更大的模型,但这并非是必须的。达到收敛所需的更新次数通常会随训练集规模增长而增大。然而,当m趋向于无穷大时,该模型最终会在随机梯度下降抽样完成训练集上所有样本之前收敛到可能的最优测试误差。继续增加m不会延长达到模型可能的最有测试误差的时间。从这点来看,我们可以认为用SGD训练模型的渐近代价是关于m的函数的O(1)级别。
在深度学习兴起之前,学习非线性模型的主要方法是结合核技巧的线性模型。很多核学习算法需要构建一个m*m的矩阵。构建这个矩阵的计算量是O(m2)。当数据集是几十亿个样本时,这个计算量是不能接受的。在学术界,深度学习从2006年开始受到关注的原因是,在数以万计样本的中等规模数据集上,深度学习在新样本上比当时很多热门算法泛化得更好。不久后,深度学习在工业界收到了更多的关注,因为其提供了一种训练大数据集上的非线性模型的可扩展方式。
梯度下降法(gradient descent)是求解无约束最优化问题的一种最常用的方法,有实现简单的优点。梯度下降法是迭代算法,每一步都需要求解目标函数的梯度向量。
假设 f(x) f ( x ) 是实数向量集上具有一阶连续偏导数的函数,要求解的无约束最优化问题是
梯度下降法是一种迭代算法,选择合适的初值 x(0) x ( 0 ) ,不断迭代,更新 x x 的值,直到收敛。由于负梯度方向是函数值下降最快的方向,因此在迭代的每一步,以负梯度方向更新 x x 的值。
其中, pk p k 选择负梯度方向, pk=−∇f(x) p k = − ∇ f ( x )