梯度下降是一种优化算法,用于找到函数的最小值。它的原理是:
- 选择初始参数值。
- 计算损失函数相对于每个参数的梯度(偏导数)。
- 使用梯度乘以学习率,更新每个参数值。
- 重复步骤2和3,直到收敛到最小值。
梯度下降在机器学习中有很重要的应用:
- 神经网络训练:使用梯度下降(基于反向传播算法)更新网络权重,最小化损失函数,实现网络训练。
- 逻辑回归:使用梯度下降找到最佳的回归系数,最小化逻辑回归的负对数似然损失函数。
- 支持向量机:使用梯度下降法找到最大间隔超平面(软间隔情况下)。
- k-means聚类:使用梯度下降更新聚类中心,最小化聚类损失函数。
常见的梯度下降算法有:
- 普通梯度下降:每次只使用当前梯度更新。收敛慢,易减震。
- 批量梯度下降:每过一定步骤才更新参数,使用多条样本的梯度均值。收敛快但易减震。
- 随机梯度下降:每过一定步骤随机选择少量样本更新。收敛快,易出现震荡。
- 动量梯度下降:加入动量项避免减震,加快收敛。
- AdaGrad:自适应调整每个参数的学习率。
- RMSProp:修正AdaGrad的拟合问题。
- Adam:综合Momentum和RMSProp的优点。是深度学习最常用的优化算法。
代码示例:
python
# 普通梯度下降
def gradient_descent(x, y, theta, alpha, iters):
m = len(x)
for i in range(iters):
temp = theta
for j in range(len(x[0])):
theta[j] = theta[j] - (alpha/m) * sum((theta[j] * x[i][j] - y[i]) * x[i][j] for i in range(m))
if temp == theta:
break
return theta
# 批量梯度下降
def batch_gradient_descent(x, y, theta, alpha, batch_size, iters):
...
# Adam优化器
optimizer = tf.keras.optimizers.Adam(learning_rate=0.1)
...
optimizer.minimize(loss, var_list=model.trainable_variables)