李宏毅机器学习笔记——梯度下降法
深度学习介绍
基于仿生学的一种自成体系的机器学习算法,包括但不限于图像识别、语音、文本领域。
梯度下降法
作为深度学习算法种常用的优化算法
梯度下降法,是一种基于搜索的最优化方法,最用是最小化一个损失函数。梯度下降是迭代法的一种,可以用于求解最小二乘问题(线性和非线性都可以)。在求解机器学习算法的模型参数,即无约束优化问题时,梯度下降是最常采用的方法之一,另一种常用的方法是最小二乘法。在求解损失函数的最小值时,可以通过梯度下降法来一步步的迭代求解,得到最小化的损失函数和模型参数值。
当然可以!以下是关于梯度下降法的详细介绍,使用 LaTeX 格式进行排版,并将希腊字母用美元符号表示:
梯度下降法
梯度下降法(Gradient Descent)是一种用于优化的迭代算法,广泛应用于机器学习和深度学习中,以最小化损失函数并找到模型的最佳参数。它的基本思想是通过计算损失函数相对于模型参数的梯度(即导数),来更新参数,从而逐步逼近损失函数的最小值。
1. 基本原理
在多维空间中,损失函数可以看作是一个表面,梯度下降法通过以下步骤来寻找最低点:
- 初始化参数:随机选择初始参数值。
- 计算梯度:计算损失函数相对于每个参数的梯度。
- 更新参数:根据梯度的方向和学习率(step size)更新参数:
θ = θ − α ∇ J ( θ ) \theta = \theta - \alpha \nabla J(\theta) θ=θ−α∇J(θ)
其中:- θ \theta θ 是参数,
- α \alpha α 是学习率,
- ∇ J ( θ ) \nabla J(\theta) ∇J(θ) 是损失函数的梯度。
- 迭代:重复步骤 2 和 3,直到满足停止条件(如达到最大迭代次数或损失函数收敛)。
2. 学习率
学习率 α \alpha α 是一个超参数,控制每次更新的步长。选择合适的学习率非常重要:
- 过大:可能导致参数更新过头,无法收敛,甚至发散。
- 过小:收敛速度慢,可能需要更多的迭代次数。
3. 梯度下降的变种
梯度下降法有几种不同的变种,适用于不同的场景:
-
批量梯度下降(Batch Gradient Descent):使用整个训练集计算梯度,适合小规模数据集,但在大数据集上计算开销较大。
-
随机梯度下降(Stochastic Gradient Descent, SGD):每次只使用一个样本计算梯度,更新频繁,收敛速度快,但可能会在最优解附近震荡。
-
小批量梯度下降(Mini-batch Gradient Descent):结合了批量和随机梯度下降的优点,每次使用一小部分样本进行更新,平衡了计算效率和收敛稳定性。
4. 动量法
为了加速收敛并减少震荡,动量法(Momentum)引入了“动量”概念,通过考虑过去的梯度来更新参数:
v t = β v t − 1 + ( 1 − β ) ∇ J ( θ ) v_t = \beta v_{t-1} + (1 - \beta) \nabla J(\theta) vt=βvt−1+(1−β)∇J(θ)
θ = θ − α v t \theta = \theta - \alpha v_t θ=θ−αvt
其中:
- v t v_t vt 是当前的动量,
- β \beta β 是动量衰减因子(通常取值在 0.9 到 0.99 之间)。
5. 自适应学习率方法
一些算法通过自适应调整学习率来提高收敛速度:
- AdaGrad:根据参数的历史梯度调整学习率,适合稀疏数据。
- RMSProp:对每个参数使用指数衰减平均来调整学习率,适合非平稳目标。
- Adam:结合了动量法和 RMSProp 的优点,广泛应用于深度学习。
6. 应用
梯度下降法在许多机器学习和深度学习任务中都有广泛应用,包括但不限于:
- 线性回归和逻辑回归
- 神经网络的训练
- 支持向量机(SVM)
- 深度学习中的卷积神经网络(CNN)和循环神经网络(RNN)
总结
梯度下降法是优化问题中一种重要的工具,尤其在机器学习和深度学习中。通过不断迭代更新参数,梯度下降法能够有效地找到损失函数的最小值,从而提高模型的性能。选择合适的变种和超参数(如学习率)对于成功应用梯度下降法至关重要。
最小二乘法的问题
梯度下降
最小二乘法是一种用于回归分析的统计方法,旨在通过最小化观测值与模型预测值之间的平方差来估计模型参数。其核心思想是找到一条最佳拟合线,使得所有数据点到这条线的垂直距离的平方和最小。
在机器学习中,许多算法都需要最大化或最小化一个函数,这个函数被称为“目标函数”。通常,我们将最小化的一类函数称为“损失函数”。损失函数能够根据预测结果衡量模型预测能力的好坏。在求损失函数最小化的过程中,梯度下降法被广泛应用。
- 梯度的概念
在直线方程中,导数代表斜率;在曲线方程中,导数代表切线的斜率。导数表示参数 θ \theta θ 单位变化时,损失函数相应的变化。通过图中的点可以发现,该点的导数为负值,因此随着参数 θ \theta θ 的增加,损失函数减小。导数从某种意义上还可以代表方向,对应着损失函数增大的方向。
import randomif __name__ == '__main__':x = [ i/100. for i in range(100)]y = [3*i+4+random.random()/100. for i in x]w = random.random()b = random.random()for _ in range(5000):for _x,_y in zip(x,y):y_pre = _x*w+bo = y_pre-_yloss = o**2dw = -2*o*_xdb = -2*ow = w+0.1*dwb = b+0.1*dbprint(w,b,loss)
公式原理
梯度
∇ J ( θ 0 , θ 1 , … , θ n ) = ( ∂ J ∂ θ 0 , ∂ J ∂ θ 1 , … , ∂ J ∂ θ n ) \nabla J\left(\theta_{0}, \theta_{1}, \ldots, \theta_{n}\right)=\left(\frac{\partial J}{\partial \theta_{0}}, \frac{\partial J}{\partial \theta_{1}}, \ldots, \frac{\partial J}{\partial \theta_{n}}\right) ∇J(θ0,θ1,…,θn)=(∂θ0∂J,∂θ1∂J,…,∂θn∂J)
目标: 使 ∑ i = 1 m ( y ( i ) − y ^ ( i ) ) 2 \sum_{i=1}^{m}\left(y^{(i)}-\hat{y}^{(i)}\right)^{2} ∑i=1m(y(i)−y^(i))2 尽可能的小
y ^ ( i ) = θ 0 + θ 1 X 1 ( i ) + θ 2 X 2 ( i ) + ⋯ + θ n X n ( i ) \hat{y}^{(i)}=\theta_{0}+\theta_{1} X_{1}^{(i)}+\theta_{2} X_{2}^{(i)}+\cdots+\theta_{n} X_{n}^{(i)} y^(i)=θ0+θ1X1(i)+θ2X2(i)+⋯+θnXn(i)
目标: 使 ∑ i = 1 m ( y ( i ) − ( θ 0 + θ 1 X 1 ( i ) + θ 2 X 2 ( i ) + ⋯ + θ n X n ( i ) ) ) 2 \sum_{i=1}^{m}\left(y^{(i)}-\left(\theta_{0}+\theta_{1} X_{1}^{(i)}+\theta_{2} X_{2}^{(i)}+\cdots+\theta_{n} X_{n}^{(i)}\right)\right)^{2} ∑i=1m(y(i)−(θ0+θ1X1(i)+θ2X2(i)+⋯+θnXn(i)))2 尽可能小
∇ J ( θ ) = [ ∂ J ∂ θ 0 ∂ J ∂ θ 1 … ∂ J ∂ θ 2 ] = [ ∑ i − 1 m 2 ( y ( i ) − X ( i ) θ ) ⋅ ( − 1 ) ∑ i − 1 m 2 ( y ( i ) − X ( i ) θ ) ⋅ ( − X 1 ( i ) ) ∑ i = 1 m 2 ( y ( i ) − X ( i ) θ ) ⋅ ( − X 2 ( i ) ) … ∑ i = 1 m 2 ( y ( i ) − X ( i ) θ ) ⋅ ( − X n ( i ) ) ] = 2 ⋅ [ ∑ i − 1 m ( y ( i ) − X ( i ) θ ) ⋅ ( − 1 ) ∑ i = 1 m ( y ( i ) − X ( i ) θ ) ⋅ ( − X 1 ( i ) ) ∑ i = 1 m ( y ( i ) − X ( i ) θ ) ⋅ ( − X 2 ( i ) ) ⋯ ∑ i = 1 m ( y ( i ) − X ( i ) θ ) ⋅ ( − X n ( i ) ) ] \nabla J(\theta)=\left[\begin{array}{c} \frac{\partial J}{\partial \theta_{0}} \\ \frac{\partial J}{\partial \theta_{1}} \\ \ldots \\ \frac{\partial J}{\partial \theta_{2}} \end{array}\right]=\left[\begin{array}{c} \sum_{i-1}^{m} 2\left(y^{(i)}-X^{(i)} \theta\right) \cdot(-1) \\ \sum_{i-1}^{m} 2\left(y^{(i)}-X^{(i)} \theta\right) \cdot\left(-X_{1}^{(i)}\right) \\ \sum_{i=1}^{m} 2\left(y^{(i)}-X^{(i)} \theta\right) \cdot\left(-X_{2}^{(i)}\right) \\ \ldots \\ \sum_{i=1}^{m} 2\left(y^{(i)}-X^{(i)} \theta\right) \cdot\left(-X_{n}^{(i)}\right) \end{array}\right]=2 \cdot\left[\begin{array}{c} \sum_{i-1}^{m}\left(y^{(i)}-X^{(i)} \theta\right) \cdot(-1) \\ \sum_{i=1}^{m}\left(y^{(i)}-X^{(i)} \theta\right) \cdot\left(-X_{1}^{(i)}\right) \\ \sum_{i=1}^{m}\left(y^{(i)}-X^{(i)} \theta\right) \cdot\left(-X_{2}^{(i)}\right) \\ \cdots \\ \sum_{i=1}^{m}\left(y^{(i)}-X^{(i)} \theta\right) \cdot\left(-X_{n}^{(i)}\right) \end{array}\right] ∇J(θ)= ∂θ0∂J∂θ1∂J…∂θ2∂J = ∑i−1m2(y(i)−X(i)θ)⋅(−1)∑i−1m2(y(i)−X(i)θ)⋅(−X1(i))∑i=1m2(y(i)−X(i)θ)⋅(−X2(i))…∑i=1m2(y(i)−X(i)θ)⋅(−Xn(i)) =2⋅ ∑i−1m(y(i)−X(i)θ)⋅(−1)∑i=1m(y(i)−X(i)θ)⋅(−X1(i))∑i=1m(y(i)−X(i)θ)⋅(−X2(i))⋯∑i=1m(y(i)−X(i)θ)⋅(−Xn(i))
由于目标函数的梯度随着特征向量的增加会越来越大,这是不合理的,因此我们给它加个系数 1 m \frac{1}{m} m1 。
目标: 使 1 m ∑ i = 1 m ( y ( i ) − y ^ ( i ) ) 2 \frac{1}{m} \sum_{i=1}^{m}\left(y^{(i)}-\hat{y}^{(i)}\right)^{2} m1∑i=1m(y(i)−y^(i))2 尽可能的小
∇ J ( θ ) = 2 m [ ∑ i = 1 m ( y ( i ) − X ( i ) θ ) ⋅ ( − 1 ) ∑ i = 1 m ( y ( i ) − X ( i ) θ ) ⋅ ( − X 1 ( i ) ) ∑ i = 1 m ( y ( i ) − X ( i ) θ ) ⋅ ( − X 2 ( i ) ) ⋯ ∑ i = 1 m ( y ( i ) − X ( i ) θ ) ⋅ ( − X n ( i ) ) ] = 2 m [ ∑ i = 1 m ( y ( i ) − X ( i ) θ ) ⋅ ( − X 0 ( i ) ) ∑ i = 1 m ( y ( i ) − X ( i ) θ ) ⋅ ( − X 1 ( i ) ) ∑ i = 1 m ( y ( i ) − X ( i ) θ ) ⋅ ( − X 2 ( i ) ) ⋯ ∑ i = 1 m ( y ( i ) − X ( i ) θ ) ⋅ ( − X n ( i ) ) ] \nabla J(\theta)=\frac{2}{m}\left[\begin{array}{c} \sum_{i=1}^{m}\left(y^{(i)}-X^{(i)} \theta\right) \cdot(-1) \\ \sum_{i=1}^{m}\left(y^{(i)}-X^{(i)} \theta\right) \cdot\left(-X_{1}^{(i)}\right) \\ \sum_{i=1}^{m}\left(y^{(i)}-X^{(i)} \theta\right) \cdot\left(-X_{2}^{(i)}\right) \\ \cdots \\ \sum_{i=1}^{m}\left(y^{(i)}-X^{(i)} \theta\right) \cdot\left(-X_{n}^{(i)}\right) \end{array}\right]=\frac{2}{m}\left[\begin{array}{c} \sum_{i=1}^{m}\left(y^{(i)}-X^{(i)} \theta\right) \cdot\left(-X_{0}^{(i)}\right) \\ \sum_{i=1}^{m}\left(y^{(i)}-X^{(i)} \theta\right) \cdot\left(-X_{1}^{(i)}\right) \\ \sum_{i=1}^{m}\left(y^{(i)}-X^{(i)} \theta\right) \cdot\left(-X_{2}^{(i)}\right) \\ \cdots \\ \sum_{i=1}^{m}\left(y^{(i)}-X^{(i)} \theta\right) \cdot\left(-X_{n}^{(i)}\right) \end{array}\right] ∇J(θ)=m2 ∑i=1m(y(i)−X(i)θ)⋅(−1)∑i=1m(y(i)−X(i)θ)⋅(−X1(i))∑i=1m(y(i)−X(i)θ)⋅(−X2(i))⋯∑i=1m(y(i)−X(i)θ)⋅(−Xn(i)) =m2 ∑i=1m(y(i)−X(i)θ)⋅(−X0(i))∑i=1m(y(i)−X(i)θ)⋅(−X1(i))∑i=1m(y(i)−X(i)θ)⋅(−X2(i))⋯∑i=1m(y(i)−X(i)θ)⋅(−Xn(i))
有时也取 J ( θ ) = 1 2 m ∑ i = 1 m ( y ( i ) − y ^ ( i ) ) 2 J(\theta)=\frac{1}{2 m} \sum_{i=1}^{m}\left(y^{(i)}-\hat{y}^{(i)}\right)^{2} J(θ)=2m1∑i=1m(y(i)−y^(i))2
最小二乘法和梯度下降法是机器学习中非常重要的工具。通过最小化损失函数,我们可以有效地训练模型,使其能够更好地拟合数据。理解梯度的概念及其在优化过程中的作用,对于掌握机器学习算法的工作原理至关重要。随着技术的不断发展,梯度下降法也在不断演化,出现了许多变种,如随机梯度下降(SGD)、小批量梯度下降(Mini-batch Gradient Descent)等,这些方法在实际应用中展现出了良好的性能。