小小白祈祷中...

在深度学习和机器学习中,优化器损失函数是模型训练的核心要素。

  • 优化器决定了模型的参数如何更新,以最小化损失函数
  • 损失函数度量了模型预测值和真实值之间的差异

下面将详细介绍常用的优化器和损失函数。


优化器(Optimizers)

梯度下降(Gradient Descent,GD)

原理:

梯度下降是最基本的优化算法。其核心思想是在参数空间中沿着损失函数梯度的反方向移动,以找到损失函数的最小值。

公式:

θ=θαθJ(θ)\theta = \theta - \alpha \cdot \nabla_{\theta} J(\theta)

  • θ\theta:模型参数
  • α\alpha:学习率(步长)
  • θJ(θ)\nabla_{\theta} J(\theta):损失函数关于参数的梯度

特点:

  • 需要遍历整个训练集,计算量大,收敛速度慢。
  • 适用于小规模数据集。

随机梯度下降(Stochastic Gradient Descent,SGD)

原理:

为了加速计算,每次随机抽取一个样本计算梯度,更新参数。

公式:

θ=θαθJ(θ;x(i);y(i))\theta = \theta - \alpha \cdot \nabla_{\theta} J(\theta; x^{(i)}; y^{(i)})

  • x(i),y(i)x^{(i)}, y^{(i)}:第 ii 个样本的数据和标签

特点:

  • 更新频率高,计算速度快。
  • 更新方向噪声大,可能导致收敛不稳定。

小批量梯度下降(Mini-batch Gradient Descent)

原理:

在每次更新时,使用一个小批量(batch)的样本计算梯度,折中批量和随机的优点。

特点:

  • 平衡了计算效率和收敛稳定性。
  • 通常是深度学习中最常用的优化方式。

动量(Momentum)

原理:

引入动量的概念,结合过去梯度的指数加权平均,更新时不仅考虑当前梯度,还考虑过去梯度的累积。

公式:

v=βv+(1β)θJ(θ)v = \beta v + (1 - \beta) \nabla_{\theta} J(\theta)

θ=θαv\theta = \theta - \alpha v

  • vv:速度(动量项)
  • β\beta:动量系数,通常取值接近1(如0.9)

特点:

  • 能够加速收敛,减少震荡。
  • 对于鞍点和局部极小值有更好的越过能力。

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

原理:

在动量的基础上,先对参数进行一个预估,然后计算梯度,提供更精确的更新方向。

公式:

v=βv+αθJ(θβv)v = \beta v + \alpha \nabla_{\theta} J(\theta - \beta v)

θ=θv\theta = \theta - v

特点:

  • 比标准动量方法有更快的收敛速度。
  • 能够更加准确地调整方向,避免过冲。

Adagrad(Adaptive Gradient)

原理:

根据参数的历史梯度平方和自适应地调整学习率,参数的更新步长与过去的梯度相关。

公式:

rt=rt1+θJ(θ)t2r_t = r_{t-1} + \nabla_{\theta} J(\theta)_t^2

θ=θαrt+ϵθJ(θ)\theta = \theta - \frac{\alpha}{\sqrt{r_t} + \epsilon} \nabla_{\theta} J(\theta)

  • rtr_t:历史梯度的累计平方和
  • ϵ\epsilon:防止除零的小常数

特点:

  • 对于稀疏数据有优势,能自动适应学习率。
  • 学习率单调递减,可能在训练后期过小无法更新。

Adadelta

原理:

对Adagrad的改进,使用窗口内的梯度平方和,避免累积量无限增长。

公式:

E[g2]t=ρE[g2]t1+(1ρ)θJ(θ)t2E[g^2]_t = \rho E[g^2]_{t-1} + (1 - \rho) \nabla_{\theta} J(\theta)_t^2

Δθ=E[Δθ2]t1+ϵE[g2]t+ϵθJ(θ)\Delta \theta = - \frac{\sqrt{E[\Delta \theta^2]_{t-1} + \epsilon}}{\sqrt{E[g^2]_t + \epsilon}} \nabla_{\theta} J(\theta)

E[Δθ2]t=ρE[Δθ2]t1+(1ρ)(Δθt)2E[\Delta \theta^2]_t = \rho E[\Delta \theta^2]_{t-1} + (1 - \rho) (\Delta \theta_t)^2

特点:

  • 不需要手动设置全局学习率。
  • 能够适应学习率,但计算复杂度增加。

RMSProp

原理:

与Adadelta类似,采用指数加权移动平均的方法来调整学习率。

公式:

E[g2]t=βE[g2]t1+(1β)θJ(θ)t2E[g^2]_t = \beta E[g^2]_{t-1} + (1 - \beta) \nabla_{\theta} J(\theta)_t^2

θ=θαE[g2]t+ϵθJ(θ)\theta = \theta - \frac{\alpha}{\sqrt{E[g^2]_t} + \epsilon} \nabla_{\theta} J(\theta)

特点:

  • 适用于非平稳目标,能处理学习率的调整。
  • 是深度学习中常用的优化器之一。

Adam(Adaptive Moment Estimation)

原理:

结合了动量和RMSProp的思想,既考虑梯度的一阶矩(动量),也考虑二阶矩(梯度平方)。

公式:

  • 梯度的一阶矩估计:

    mt=β1mt1+(1β1)θJ(θ)tm_t = \beta_1 m_{t-1} + (1 - \beta_1) \nabla_{\theta} J(\theta)_t

  • 梯度的二阶矩估计:

    vt=β2vt1+(1β2)(θJ(θ)t)2v_t = \beta_2 v_{t-1} + (1 - \beta_2) (\nabla_{\theta} J(\theta)_t)^2

  • 偏差修正:

    m^t=mt1β1t\hat{m}_t = \frac{m_t}{1 - \beta_1^t}

    v^t=vt1β2t\hat{v}_t = \frac{v_t}{1 - \beta_2^t}

  • 参数更新:

    θ=θαm^tv^t+ϵ\theta = \theta - \alpha \frac{\hat{m}_t}{\sqrt{\hat{v}_t} + \epsilon}

特点:

  • 适用于大规模数据和参数的优化。
  • 效果稳定,收敛速度快,是目前最常用的优化器之一。

Adamax

原理:

Adam的变体,使用无偏估计的无穷范数来替代二阶矩。

公式:

ut=max(β2ut1,θJ(θ)t)u_t = \max(\beta_2 u_{t-1}, |\nabla_{\theta} J(\theta)_t|)

θ=θαut+ϵmt\theta = \theta - \frac{\alpha}{u_t + \epsilon} m_t

特点:

  • 对于某些问题,Adamax比Adam表现更好。
  • 能够处理稀疏梯度。

Nadam(Nesterov-accelerated Adam)

原理:

结合了NAG和Adam的思想,在Adam的基础上加入Nesterov动量。

公式:

更新方式类似于Adam,但在计算动量时采用了Nesterov加速。

特点:

  • 比Adam有更好的收敛性能。
  • 能够更快地达到最优解。

AMSGrad

原理:

针对Adam可能不收敛的问题,提出了AMSGrad,通过在更新中引入了历史最大二阶矩。

公式:

vt=max(vt1,vt)v_t' = \max(v_{t-1}', v_t)

θ=θαmtvt+ϵ\theta = \theta - \alpha \frac{m_t}{\sqrt{v_t'} + \epsilon}

特点:

  • 改进了Adam的收敛性。
  • 在某些情况下有更好的性能。

参考链接

如果要详细了解这些优化器的原理,代码实现等,可参考:

梯度下降优化器
梯度下降优化器
梯度下降(`Gradient Descent`)是一种最常用的优化算法,广泛应用于机器学习和深度学习模型的训练中。它的主要目的是在参数空间中找到使损失函数最小化的参数集合。下面将详细介绍梯度下降的原理、公式以及Python中的代码实现。 # 梯度下降的原理 梯度下降是一种基于一阶导数的信息,沿着`负梯度方向`搜索最小值的迭代优化算法。直观上,可以将其想象成一个人在山坡上(损失函数表面)下山,
动量优化器
动量优化器
在深度学习和机器学习的优化过程中,梯度下降算法是最基本也是最常用的优化算法之一。然而,标准的梯度下降算法在某些情况下收敛速度较慢,或者在接近最优点时产生振荡。为了加速收敛和减少振荡,引入了动量(`Momentum`)优化器。 下面,我们将详细介绍动量优化器的原理、数学公式,以及Python代码实现。 --- # 背景与动机 在标准的梯度下降(`Gradient Descent`,GD)算
自适应学习率优化器
自适应学习率优化器
在深度学习和机器学习的模型训练过程中,优化算法起着至关重要的作用。除了标准的梯度下降和动量优化器之外,还有许多`自适应学习率`的优化算法,如 `Adagrad`、`Adadelta` 和 `RMSProp`。它们通过自适应地调整学习率,以提升收敛速度和稳定性。 以下将详细介绍这三个优化算法,包括公式、原理,以及 Python 代码实现。 --- # Adagrad 算法 ## 背景与动机
Adam优化器
Adam优化器
在深度学习和机器学习的模型训练过程中,优化算法起着关键作用。 **Adam**(Adaptive Moment Estimation)优化器是目前最受欢迎和广泛使用的优化算法之一。它结合了`动量优化器`和 `RMSProp` 的优势,能够在训练过程中`自适应地调整学习率`,实现`高效`和`稳健`的梯度更新。 下面,我们将详细介绍 Adam 优化器的原理、数学公式,以及 Python 代码实现

损失函数(Loss Functions)

均方误差(Mean Squared Error,MSE)

定义:

计算预测值和真实值之差的平方和的平均值。

公式:

MSE=1ni=1n(yiy^i)2\text{MSE} = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2

特点:

  • 对异常值敏感,误差平方会放大偏差大的样本的影响。
  • 常用于回归问题。

平均绝对误差(Mean Absolute Error,MAE)

定义:

计算预测值和真实值之差的绝对值的平均值。

公式:

MAE=1ni=1nyiy^i\text{MAE} = \frac{1}{n} \sum_{i=1}^{n} |y_i - \hat{y}_i|

特点:

  • 对异常值不如MSE敏感。
  • 反映误差的平均大小。

交叉熵损失(Cross-Entropy Loss)

定义:

衡量两个概率分布之间的差异,常用于分类问题。

二分类交叉熵:

Loss=1ni=1n[yilogy^i+(1yi)log(1y^i)]\text{Loss} = - \frac{1}{n} \sum_{i=1}^{n} [y_i \log \hat{y}_i + (1 - y_i) \log (1 - \hat{y}_i)]

多分类交叉熵:

Loss=i=1nj=1kyijlogy^ij\text{Loss} = - \sum_{i=1}^{n} \sum_{j=1}^{k} y_{ij} \log \hat{y}_{ij}

  • kk:类别数

特点:

  • 当预测概率接近真实标签时,损失较小。
  • 对于分类问题,能够更好地衡量模型性能。

Hinge损失

定义:

主要用于支持向量机(SVM),用于最大化分类间隔。

公式:

Loss=i=1nmax(0,1yiy^i)\text{Loss} = \sum_{i=1}^{n} \max(0, 1 - y_i \hat{y}_i)

  • yiy_i:真实标签,取值为1-111
  • y^i\hat{y}_i:预测值

特点:

  • 强调正确分类的同时有足够的间隔。
  • 对于硬分类(hard margin)问题效果较好。

Huber损失

定义:

结合MSE和MAE的优点,对异常值有一定的鲁棒性。

公式:

对于误差δ\delta

  • yy^δ|y - \hat{y}| \leq \delta时:

    Loss=12(yy^)2\text{Loss} = \frac{1}{2} (y - \hat{y})^2

  • yy^>δ|y - \hat{y}| > \delta时:

    Loss=δ(yy^12δ)\text{Loss} = \delta (|y - \hat{y}| - \frac{1}{2} \delta)

特点:

  • 对小误差采用MSE,对大误差采用MAE。
  • 平衡了对异常值的敏感性和收敛速度。

Log-Cosh损失

定义:

计算预测误差的双曲余弦的对数,总是平滑且对异常值不太敏感。

公式:

Loss=i=1nlog(cosh(y^iyi))\text{Loss} = \sum_{i=1}^{n} \log (\cosh(\hat{y}_i - y_i))

特点:

  • 类似于MSE,但对异常值更鲁棒。
  • 导数行为良好,方便优化。

Poisson损失

定义:

用于计数数据的模型,如泊松回归。

公式:

Loss=i=1n(y^iyilogy^i)\text{Loss} = \sum_{i=1}^{n} (\hat{y}_i - y_i \log \hat{y}_i)

特点:

  • 适用于预测事件发生次数的问题。
  • 假设预测值为正。

Kullback-Leibler散度(KL散度)损失

定义:

衡量两个概率分布之间的差异。

公式:

Loss=i=1nyi(logyilogy^i)\text{Loss} = \sum_{i=1}^{n} y_i (\log y_i - \log \hat{y}_i)

特点:

  • 在概率分布估计中常用。
  • 非对称,DKL(PQ)DKL(QP)D_{\text{KL}}(P||Q) \neq D_{\text{KL}}(Q||P)

Sigmoid交叉熵损失

定义:

结合Sigmoid函数和交叉熵,用于多标签分类问题。

公式:

Loss=i=1n[yilogσ(y^i)+(1yi)log(1σ(y^i))]\text{Loss} = - \sum_{i=1}^{n} [y_i \log \sigma(\hat{y}_i) + (1 - y_i) \log (1 - \sigma(\hat{y}_i))]

  • σ(y^i)\sigma(\hat{y}_i):Sigmoid函数

特点:

  • 适用于每个样本可能属于多个类别的情况。
  • 将每个类别的预测视为独立的二分类问题。

Softmax交叉熵损失

定义:

结合Softmax函数和交叉熵,用于多分类问题。

公式:

Loss=i=1nj=1kyijlog(ey^ijl=1key^il)\text{Loss} = - \sum_{i=1}^{n} \sum_{j=1}^{k} y_{ij} \log \left( \frac{e^{\hat{y}_{ij}}}{\sum_{l=1}^{k} e^{\hat{y}_{il}}} \right)

特点:

  • 能够处理多类别互斥的情况。
  • 模型输出经过Softmax后表示为概率分布。

总结

优化器和损失函数的选择对于模型的训练效果至关重要。优化器决定了参数更新的方式,影响模型的收敛速度和收敛效果;损失函数则定义了模型的优化目标,影响模型对误差的敏感性和预测精度。在实际应用中,需要根据具体的问题特性、数据规模和模型结构,选择合适的优化器和损失函数,以达到最佳的训练效果。