超强总结,十大优化算法!!

Hello,大家好~

今天咱们拿出来比较重要的一块和大家分享,那就是机器学习中的优化算法。

优化算法在机器学习中至关重要,它们决定了模型参数的更新方式,直接影响着模型的收敛速度和性能表现。选择合适的优化算法可以加快模型的训练速度、提高模型的准确性,并且对于处理大规模数据集和复杂模型具有重要意义。

今天涉及到内容包括以下:

  • 梯度下降算法

  • 动量梯度下降

  • Nesterov加速梯度

  • AdaGrad

  • RMSProp

  • Adam

  • AdaDelta

  • Nadam

  • L-BFGS

  • CMA-ES

梯度下降算法(Gradient Descent)

原理:梯度下降算法通过迭代地调整模型参数,以使损失函数逐步减小。每一步调整的方向是当前点的梯度负方向,调整的步长由学习率决定。

公式

核心代码

def gradient_descent(X, y, theta, alpha, num_iters):
    m = len(y)
    for i in range(num_iters):
        gradient = X.T @ (X @ theta - y) / m
        theta = theta - alpha * gradient
    return theta

动量梯度下降(Gradient Descent with Momentum)

原理:在梯度下降的基础上加入动量项,使得优化路径上的振荡减小,加速收敛。

公式

核心代码

def momentum_gradient_descent(X, y, theta, alpha, beta, num_iters):
    m = len(y)
    v = np.zeros_like(theta)
    for i in range(num_iters):
        gradient = X.T @ (X @ theta - y) / m
        v = beta * v + (1 - beta) * gradient
        theta = theta - alpha * v
    return theta

 Nesterov加速梯度(Nesterov Accelerated Gradient, NAG)

原理:在动量梯度下降的基础上,提前计算未来位置的梯度,提高收敛速度。

公式

核心代码

def nesterov_accelerated_gradient(X, y, theta, alpha, beta, num_iters):
    m = len(y)
    v = np.zeros_like(theta)
    for i in range(num_iters):
        temp_theta = theta - alpha * beta * v
        gradient = X.T @ (X @ temp_theta - y) / m
        v = beta * v + (1 - beta) * gradient
        theta = theta - alpha * v
    return theta

AdaGrad(Adaptive Gradient Algorithm)

原理:根据每个参数的历史梯度自适应地调整学习率,适合处理稀疏数据。

公式

核心代码

def adagrad(X, y, theta, alpha, num_iters, epsilon=1e-8):
    m = len(y)
    G = np.zeros_like(theta)
    for i in range(num_iters):
        gradient = X.T @ (X @ theta - y) / m
        G += gradient ** 2
        theta = theta - alpha / (np.sqrt(G + epsilon)) * gradient
    return theta

RMSProp(Root Mean Square Propagation)

原理:改进了AdaGrad,通过使用梯度的指数加权移动平均值来调整学习率。

公式

核心代码

def rmsprop(X, y, theta, alpha, beta, num_iters, epsilon=1e-8):
    m = len(y)
    E_g2 = np.zeros_like(theta)
    for i in range(num_iters):
        gradient = X.T @ (X @ theta - y) / m
        E_g2 = beta * E_g2 + (1 - beta) * gradient ** 2
        theta = theta - alpha / (np.sqrt(E_g2 + epsilon)) * gradient
    return theta

Adam(Adaptive Moment Estimation)

原理:结合了动量和RMSProp的优点,使用梯度的动量估计和平方梯度的加权平均来调整学习率。

公式

核心代码

def adam(X, y, theta, alpha, beta1, beta2, num_iters, epsilon=1e-8):
    m = len(y)
    m_t = np.zeros_like(theta)
    v_t = np.zeros_like(theta)
    for t in range(1, num_iters + 1):
        gradient = X.T @ (X @ theta - y) / m
        m_t = beta1 * m_t + (1 - beta1) * gradient
        v_t = beta2 * v_t + (1 - beta2) * gradient ** 2
        m_t_hat = m_t / (1 - beta1 ** t)
        v_t_hat = v_t / (1 - beta2 ** t)
        theta = theta - alpha * m_t_hat / (np.sqrt(v_t_hat) + epsilon)
    return theta

AdaDelta

原理:对AdaGrad进行改进,克服了其学习率不断下降的问题,通过引入一个基于梯度的指数加权移动平均值来调整步长。

公式

核心代码:

def adadelta(X, y, theta, rho, num_iters, epsilon=1e-8):
    m = len(y)
    E_g2 = np.zeros_like(theta)
    E_delta_theta2 = np.zeros_like(theta)
    for i in range(num_iters):
        gradient = X.T @ (X @ theta - y) / m
        E_g2 = rho * E_g2 + (1 - rho) * gradient ** 2
        delta_theta = - (np.sqrt(E_delta_theta2 + epsilon) / np.sqrt(E_g2 + epsilon)) * gradient
        theta = theta + delta_theta
        E_delta_theta2 = rho * E_delta_theta2 + (1 - rho) * delta_theta ** 2
    return theta

Nadam(Nesterov-accelerated Adaptive Moment Estimation)

原理:结合了Nesterov加速和Adam算法的优点,通过提前计算未来位置的梯度和动量估计来加速收敛。

公式

核心代码

def nadam(X, y, theta, alpha, beta1, beta2, num_iters, epsilon=1e-8):
    m = len(y)
    m_t = np.zeros_like(theta)
    v_t = np.zeros_like(theta)
    for t in range(1, num_iters + 1):
        gradient = X.T @ (X @ theta - y) / m
        m_t = beta1 * m_t + (1 - beta1) * gradient
        v_t = beta2 * v_t + (1 - beta2) * gradient ** 2
        m_t_hat = m_t / (1 - beta1 ** t)
        v_t_hat = v_t / (1 - beta2 ** t)
        theta = theta - alpha * ((beta1 * m_t_hat + (1 - beta1) * gradient / (1 - beta1 ** t)) / (np.sqrt(v_t_hat) + epsilon))
    return theta

L-BFGS(Limited-memory Broyden-Fletcher-Goldfarb-Shanno)

原理:一种拟牛顿法,适用于中小型数据集上的高维优化问题,使用历史梯度和参数更新信息来构建近似Hessian矩阵。涉及复杂的矩阵操作,使用历史梯度和参数更新信息来更新参数。

核心代码

from scipy.optimize import fmin_l_bfgs_b

def lbfgs(X, y, theta):
    def loss_and_grad(theta):
        loss = np.sum((X @ theta - y) ** 2) / (2 * len(y))
        gradient = X.T @ (X @ theta - y) / len(y)
        return loss, gradient

    theta, _, _ = fmin_l_bfgs_b(loss_and_grad, theta)
    return theta

CMA-ES(Covariance Matrix Adaptation Evolution Strategy)

原理:一种进化策略优化算法,适用于全局优化和非凸优化问题,通过更新协方差矩阵来调整搜索策略。基于进化策略的迭代更新,涉及种群生成、选择、变异和协方差矩阵更新等。

核心代码

import cma

def cma_es(X, y, theta):
    def loss(theta):
        return np.sum((X @ theta - y) ** 2) / (2 * len(y))

    es = cma.CMAEvolutionStrategy(theta, 0.5)
    es.optimize(loss)
    return es.result.xbest

这些代码示例为核心实现,实际应用中可能需要进一步调整和优化。

我这里有一份200G的人工智能资料合集:内含:990+可复现论文、写作发刊攻略,1v1论文辅导、AI学习路线图、视频教程等,看我简介处即可获取到!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值