优化器:Adam与AdamW

博客主要介绍了Adam和AdamW两种基于梯度下降算法的神经网络优化器。阐述了它们在更新规则、权重衰减处理、动量处理和超参数调整方面的特点。指出AdamW改进了权重衰减处理,能避免对偏置参数的不必要影响,提高训练效果,但具体选择需依任务和模型实验确定。

在这里插入图片描述

💪 专业从事且热爱图像处理,图像处理专栏更新如下👇:
📝《图像去噪》
📝《超分辨率重建》
📝《语义分割》
📝《风格迁移》
📝《目标检测》
📝《图像增强》
📝《模型优化》
📝《模型实战部署》
📝《图像配准融合》
📝《数据集》
📝《高效助手》


在这里插入图片描述

Adam 和 AdamW 是两种常用的优化器,它们都是基于梯度下降算法的优化器,用于训练神经网络。它们之间的主要区别在于权重衰减(Weight Decay)的处理方式。

一、Adam(Adaptive Moment Estimation)

1.1 更新规则

m = beta1*m + (1-beta1)*grad
v = beta2*v + (1-beta2)*(grad**2)
theta = theta - learning_rate * m / (sqrt(v) + epsilon)

可以看到,对权重衰减项没有特别的处理。

1.2 权重衰减处理

在原始的Adam优化器中,权重衰减(weight decay)是在梯度更新中直接应用的,它等价于在损失函数中添加了一个L2正则化项,用于减小权重的幅度。这意味着权重衰减对所有权重参数都是一样的。

1.3 动量处理

Adam使用了动量来加速梯度下降,它引入了两个动量参数β₁(用于一阶矩估计)和β₂(用于二阶矩估计)。这些动量参数决定了过去梯度的影响程度。

1.4 超参数调整

Adam的超参数(如学习率、β₁、β₂等)通常需要进行调整,以获得最佳性能。

二、AdamW(Adam with Weight Decay Fix)

2.1 更新规则

AdamW 在Adam式的基础上,对 m 项加入了权重衰减项的计算:

m = beta1*m + (1-beta1)*(grad + lambda*theta)
v = beta2*v + (1-beta2)*(grad**2) 
theta = theta - learning_rate * m / (sqrt(v) + epsilon)

这里 lambda 是权重衰减系数。
这相当于在梯度之外,额外考虑了一个 L2 范数正则化目标。这样可以更好地减小权重参数值,提高模型的泛化能力。

2.2 权重衰减处理

AdamW是对Adam的改进,它将权重衰减与梯度更新分开处理。具体来说,权重衰减只应用于权重参数,而不应用于偏置参数。这是通过在损失函数中添加一个额外的L2正则化项来实现的,而不是直接应用于梯度更新。

2.3 动量处理

AdamW仍然使用动量,与Adam一样,它使用β₁和β₂参数来调整动量的影响。

2.4 超参数调整

与Adam类似,AdamW的超参数(如学习率、β₁、β₂等)也需要进行调整,以获得最佳性能。

三、总结

AdamW的改进主要在于更好地处理了权重衰减。这有助于避免权重衰减对偏置参数的不必要影响,因此可以提高模型的训练效果。然而,选择使用哪种优化器取决于具体的任务和模型,通常需要进行实验来确定哪种优化器最适合你的情况。

感谢您阅读到最后!😊总结不易,多多支持呀🌹 点赞👍收藏⭐评论✍️,您的三连是我持续更新的动力💖

关注公众号「视觉研坊」,获取干货教程、实战案例、技术解答、行业资讯!

03-21
### AdamW优化器简介 AdamW是一种改进版的Adam优化器,在机器学习和深度学习领域得到了广泛应用。它结合了L2正则化(权重衰减)的思想,解决了原始Adam优化器中正则化项实现不一致的问题[^1]。 具体来说,AdamW通过分离权重衰减梯度更新的过程,使得优化过程更加稳定并提高了模型的泛化能力。这种设计允许开发者更灵活地控制正则化的强度,从而改善模型在复杂任务中的表现[^2]。 以下是AdamW的核心公式: #### 更新规则 假设当前迭代步为 \( t \),参数为 \( w_t \),梯度为 \( g_t \),动量缓存分别为 \( m_t, v_t \),以及学习率为 \( \eta \) 和权重衰减系数为 \( \lambda \): ```python import math def adamw_update(w, grad, m, v, beta1=0.9, beta2=0.999, eps=1e-8, lr=0.001, weight_decay=0.01): # 动量计算 m = beta1 * m + (1 - beta1) * grad v = beta2 * v + (1 - beta2) * (grad ** 2) # 偏差修正 mt_hat = m / (1 - beta1**(t+1)) vt_hat = v / (1 - beta2**(t+1)) # 权重衰减 w -= lr * mt_hat / (math.sqrt(vt_hat) + eps) + lr * weight_decay * w return w, m, v ``` 上述代码展示了AdamW的关键部分:除了标准的Adam更新外,还额外加入了 `lr * weight_decay * w` 的权重衰减项[^3]。 --- ### AdamW的优势 相比传统的Adam优化器AdamW的主要优势在于其对权重衰减的有效处理方式。传统Adam会将权重衰减融入到梯度计算过程中,这可能导致实际施加的正则化效果偏离预期。而AdamW通过显式地应用权重衰减,确保了正则化的效果更为精确且可控[^4]。 此外,AdamW在多个实验场景下表现出更高的稳定性,尤其适用于大规模深度学习模型训练,例如Transformer架构下的自然语言处理任务[^5]。 --- ### 实现细节 为了更好地理解AdamW的工作机制,可以参考以下伪代码实现: ```python class AdamWOptimizer: def __init__(self, params, lr=0.001, betas=(0.9, 0.999), eps=1e-8, weight_decay=0.01): self.params = params self.lr = lr self.beta1, self.beta2 = betas self.eps = eps self.weight_decay = weight_decay self.t = 0 self.m = {p: 0 for p in params} self.v = {p: 0 for p in params} def step(self, grads): self.t += 1 for param, grad in zip(self.params, grads): self._update_param(param, grad) def _update_param(self, param, grad): self.m[param] = self.beta1 * self.m[param] + (1 - self.beta1) * grad self.v[param] = self.beta2 * self.v[param] + (1 - self.beta2) * (grad ** 2) mt_hat = self.m[param] / (1 - self.beta1 ** self.t) vt_hat = self.v[param] / (1 - self.beta2 ** self.t) update = self.lr * mt_hat / (vt_hat ** 0.5 + self.eps) + self.lr * self.weight_decay * param param -= update ``` 此代码片段清晰地展现了AdamW如何在每次迭代中执行权重更新操作,并引入了独立的权重衰减逻辑。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

视觉研坊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值