前言
笔者写下此系列文章是希望在复习人工智能相关知识同时为想学此技术的人提供一定帮助。
图源网络,所有者可随时联系笔者删除。
在一个深度学习问题中,我们通常会预先定义一个损失函数。有了损失函数以后,我们就可以使用优化算法试图将其最小化。在优化中,这样的损失函数通常被称作优化问题的目标函数(objective function)。
即,优化算法是非常重要的,它将调整模型内的参数,以最小化或最大化某个函数(loss损失) 。
正文
梯度下降(Gradient Descent)
梯度下降用于找到函数的局部最小值。在深度学习中,该函数通常是损失函数,它衡量模型预测和真实值之间的差异。算法的每一步都需要计算损失函数关于模型参数的梯度(即偏导数),然后按照这个梯度的反方向更新参数,以减少损失函数的值。标准梯度下降法在每一步更新中使用所有训练数据来计算梯度,因此它也被称为批量梯度下降(Batch Gradient Descent)。
- θ 是模型参数。
- α 是学习率,控制步长的大小。
- J(θ) 是损失函数。
- ∇θJ(θ) 是损失函数关于参数 θ 的梯度。
示例代码如下
def gradient_descent(X, y, theta, learning_rate, iterations):m = len(y) for _ in range(iterations):predictions = X.dot(theta)errors = predictions - ygradient = X.T.dot(errors) / mtheta -= learning_rate * gradientreturn theta
随机梯度下降(Stochastic Gradient Descent, SGD)
与梯度下降每次迭代使用所有数据不同,随机梯度下降每次仅使用一个训练样本来计算梯度和更新参数。这种方法显著降低了每次迭代的计算成本,使得算法能够更快地收敛。然而,由于每次更新只基于一个样本,这可能会导致参数更新过程中出现较大的波动,使得损失函数的减少路径较为崎岖,而不是平滑下降。
def stochastic_gradient_descent(X, y, theta, learning_rate, iterations):m = len(y)for _ in range(iterations):for i in range(m):random_index = np.random.randint(m)xi = X[random_index:random_index+1]yi = y[random_index:random_index+1]predictions = xi.dot(theta)errors = predictions - yigradients = xi.T.dot(errors)theta -= learning_rate * gradientsreturn theta
小批量随机梯度下降(Mini-batch Gradient Descent)
小批量随机梯度下降是上述两种方法的折衷方案。它不是使用全部数据或单个数据进行参数更新,而是选取一小批量(mini-batch)的样本来进行每次迭代。这种方法结合了批量梯度下降的减少波动性和随机梯度下降的计算效率的优点。小批量的大小通常是2的幂次,如32、64或128等,这是为了利用现代计算库对特定大小数组的优化。
def mini_batch_gradient_descent(X, y, theta, learning_rate, iterations, batch_size):m = len(y)for _ in range(iterations):shuffled_indices = np.random.permutation(m)X_shuffled = X[shuffled_indices]y_shuffled = y[shuffled_indices]for i in range(0, m, batch_size):xi = X_shuffled[i:i+batch_size]yi = y_shuffled[i:i+batch_size]predictions = xi.dot(theta)errors = predictions - yigradients = xi.T.dot(errors) / batch_sizetheta -= learning_rate * gradientsreturn theta
动量法(Momentum)
动量法在面对小批量数据或是非凸优化问题时表现出较好的效率和更快的收敛速度。动量法的灵感来自物理学中的动量概念,即物体运动时会因为其质量和速度而保持运动状态。在优化算法中,引入动量可以帮助算法在正确的方向上加速收敛,并减少震荡。
计算当前梯度(与SGD相同),然后更新动量向量
使用该动量向量更新参数
- vt 是当前时刻的动量向量。
- vt−1 是上一时刻的动量向量。
- β 是动量衰减系数,通常设置为0.9或类似的值。
- η 是学习率。
- ∇θJ(θ) 是损失函数相对于参数 θ 的梯度。
def momentum_gradient_descent(X, y, theta, learning_rate, iterations, beta):m = len(y)v = np.zeros(theta.shape)for _ in range(iterations):gradient = X.T.dot(X.dot(theta) - y) / mv = beta * v + learning_rate * gradienttheta -= vreturn theta