什么是梯度下降,它在机器学习中有什么应用?代码举例讲解

梯度下降是一种优化算法,用于找到函数的最小值。它的原理是:

  1. 选择初始参数值。
  2. 计算损失函数相对于每个参数的梯度(偏导数)。
  3. 使用梯度乘以学习率,更新每个参数值。
  4. 重复步骤2和3,直到收敛到最小值。

梯度下降在机器学习中有很重要的应用:

  1. 神经网络训练:使用梯度下降(基于反向传播算法)更新网络权重,最小化损失函数,实现网络训练。
  2. 逻辑回归:使用梯度下降找到最佳的回归系数,最小化逻辑回归的负对数似然损失函数。
  3. 支持向量机:使用梯度下降法找到最大间隔超平面(软间隔情况下)。
  4. k-means聚类:使用梯度下降更新聚类中心,最小化聚类损失函数。

常见的梯度下降算法有:

  1. 普通梯度下降:每次只使用当前梯度更新。收敛慢,易减震。
  2. 批量梯度下降:每过一定步骤才更新参数,使用多条样本的梯度均值。收敛快但易减震。
  3. 随机梯度下降:每过一定步骤随机选择少量样本更新。收敛快,易出现震荡。
  4. 动量梯度下降:加入动量项避免减震,加快收敛。
  5. AdaGrad:自适应调整每个参数的学习率。
  6. RMSProp:修正AdaGrad的拟合问题。
  7. 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)