动量法(Momentum)在深度学习中的实战应用与调优技巧

深度学习入门之Momentum Momentum Momentum 是“动量”的意思,和物理有关。用数学式表示 Momentum 方法,如下所示。 和 SGD(随机梯度下降) 一样, W 表示要更新的权重参数,∂L/∂W表示损失函数关于 的梯度,η 表示学习率。这里新出现了一个变量 ,对应物理上的速度。式(6.3)表示了物体在梯度方向上受力,在这个力的作用下,物体的速度增加这一物理法则。如图 6-4 所示,Momentum 方法给人的感觉就像是小球在地面上滚动。 图 6-4 Momentum:小球在斜面上滚动 式(6.3) 阅读详情

1. 从“下坡”到“冲坡”:理解动量法的核心思想

如果你刚开始接触深度学习,优化器这个词听起来可能有点吓人,但它的工作其实特别像我们生活中的一个场景:下山找路。想象一下,你站在一个崎岖不平的山坡上,目标是找到最低的那个山谷(也就是损失函数的最小值)。最朴素的方法就是“梯度下降”,你每走一步,都只看脚下最陡的方向,然后迈一小步。这个方法很直接,但问题也很明显:如果地面坑坑洼洼(梯度有噪声),或者你遇到一个又长又缓的斜坡(梯度很小但方向一致),你就会走得很慢,而且容易在原地来回打转。

动量法(Momentum)就是为了解决这个“走路不稳、速度慢”的问题而生的。它的灵感来自于物理学中的动量概念。一个滚下山坡的球,它不会因为路上遇到一个小坑就立刻改变方向,而是会凭借之前积累的速度“冲”过去。在优化算法里,这个“速度”就是我们引入的动量项(velocity)。

我刚开始用的时候,觉得这玩意儿有点玄乎,不就是记一下之前的梯度嘛。但实际跑几个模型对比一下,效果立竿见影。尤其是在训练那些层数比较深的网络,或者数据本身比较“脏”、梯度噪声大的时候,加上动量就像给优化过程装了一个稳定器和加速器。它让参数的更新方向不只是听命于当前这一步的“临时工”(瞬时梯度),还会参考过去一段时间“老员工”(历史梯度)的经验,使得整体的更新方向更加平滑、一致,朝着真正有潜力的低谷前进。

所以,简单来说,动量法做了一件很聪明的事:它让优化过程有了“惯性”。这个惯性既能帮助模型冲过一些局部的小坑(局部极小值或噪声),也能在正确的方向上越跑越快,从而大大缩短训练时间。接下来,我们就拆开看看这个“惯性”是怎么通过数学公式实现的,以及我们怎么在代码里把它用起来。

2. 动手实现:动量法的公式与代码拆解

光说概念可能还是有点虚,我们直接上公式和代码,这是最能让人安心的地方。动量法的更新规则其实就两步,我把它写下来,咱们一起过一遍。

第一步,计算当前时刻的“速度”(动量项): v_t = β * v_{t-1} + (1 - β) * g_t 这里的 v_t 就是当前时刻的速度,β 是我们设定的一个超参数,叫做动量系数,通常在0.9附近。v_{t-1} 是上一时刻的速度,g_t 是当前计算出的损失函数梯度。

第二步,用这个速度去更新参数: θ_t = θ_{t-1} - α * v_t 这里的 θ 是我们的模型参数,α 是学习率。

看到这个公式,你可能会有两个疑问:第一,(1 - β) 那个系数是干嘛的?第二,这跟直接记个历史梯度平均值有啥区别?我来解释一下。

实际上,这个公式是对历史梯度的一个指数加权移动平均。你可以把 v_t 展开,会发现它包含了从开始到现在所有梯度的信息,但离现在越远的梯度,权重衰减得越厉害(以 β 的指数次幂衰减)。(1 - β) 的作用主要是为了进行偏差修正,尤其是在训练初期,v_t 从0开始,加了这个系数能让初始的估计更接近真实的梯度均值。不过,在很多现代的深度学习框架(像PyTorch、TensorFlow)的实现里,它们可能采用了略微不同的形式,比如 v_t = β * v_{t-1} + g_t,然后把学习率 α 放在外面。这两种形式在理论上等价,只是实现上的细微差别,你不需要太纠结,知道核心思想是“用加权平均的历史梯度来更新”就行。

下面,我写一个最简单的Python示例,不用任何框架,就用手算的方式来模拟一下这个过程,这样理解最深。

import numpy as np

# 模拟一个简单的二次损失函数: L(w) = (w - 5)^2
# 它的最小值在 w = 5 处
def loss(w):
    return (w - 5) ** 2

def gradient(w):
    # 损失函数关于w的梯度
    return 2 * (w - 5)

# 超参数设置
alpha = 0.1  # 学习率
beta = 0.9   # 动量系数
num_epochs = 20  # 迭代次数

# 初始化
w = 0.0      # 参数初始值
v = 0.0      # 动量项初始化为0
loss_history = []
w_history = []

print("Epoch | w         | Gradient  | Velocity  | Loss")
print("-" * 50)
for epoch in range(num_epochs):
    g = gradient(w)          # 计算当前梯度
    v = beta * v + g         # 更新速度(这里采用简化形式 v = βv + g)
    w = w - alpha * v        # 用速度更新参数
    
    loss_val = loss(w)
    loss_history.append(loss_val)
    w_history.append(w)
    
    print(f"{epoch+1:5d} | {w:9.6f} | {g:9.6f} | {v:9.6f} | {loss_val:.6f}")

print(f"\n最终参数 w = {w:.6f}, 最终损失 = {loss(w):.6f}")

你把这个代码跑一遍,就能清晰地看到参数 w 是如何从0开始,在动量的推动下,“滚”向最优值5的。你会发现,初期梯度很大,速度 v 快速累积,w 变化也快。随着接近最优点,梯度变小,但之前积累的速度还能让它继续向前“滑行”一段,这比单纯用梯度下降要快得多。你可以试着把 beta 改成0(相当于关闭动量),对比一下收敛速度,感受会更明显。

3. 调参的艺术:如何设置动量系数与学习率

好了,现在我们知道动量法怎么工作了,下一个实际问题就是:这俩超参数——动量系数 β 和学习率 α,到底该怎么设? 这是我被问得最多的问题,也是实践中最容易踩坑的地方。它们俩不是独立的,而是需要协同工作的“黄金搭档”。

先说动量系数 β。它控制着历史梯度信息衰减的速度。

  • β 接近 1(如0.99):意味着历史信息记得很牢,衰减很慢。这会带来非常平滑的更新轨迹,惯性很强,能有效抑制梯度噪声,在参数空间里“横冲直撞”地冲过平坦区域和局部极小点。但缺点也很明显:如果方向错了,调头会非常困难,容易“刹不住车”。
  • β 较小(如0.5):历史信息忘得快,更关注近期梯度。这时的行为更接近普通的梯度下降,灵活但缺乏惯性带来的加速效果。
  • 常用经验值:对于绝大多数视觉、自然语言处理任务,β = 0.9 是一个非常好的起点。这也是为什么几乎所有框架的默认值都是0.9。对于一些非常深、非常复杂的网络,或者你发现训练轨迹震荡得厉害,可以尝试稍微调高到0.95或0.99。反之,如果任务很简单,或者数据量很小,用0.9就行。

然后是学习率 α。这是所有优化器里最重要的超参数,没有之一。动量法的引入,实际上改变了学习率的“有效尺度”。

  • 一个重要现象:由于动量累积了历史梯度,实际更新步长 α * v_t 往往会比单纯的 α * g_t 要大。这意味着,当你从普通SGD切换到带动量的SGD时,通常需要将学习率适当调小,否则可能会因为步子太大而发散(loss直接飞上天)。
  • 协同策略:我个人的经验是,采用“低学习率 + 高动量”的组合往往比“高学习率 + 低动量”更稳健。例如,原来用SGD学习率是0.01,加上动量0.9后,可以先把学习率降到0.005或0.001试试看。你可以用一个简单的策略:保持 α * (1 / (1 - β)) 这个量级大致不变来粗略估计。当β从0增加到0.9时,分母(1-β)从1变成了0.1,放大了10倍,所以学习率相应缩小10倍是个合理的起点。

为了更直观,我列个表对比一下不同场景下的调参思路:

训练现象可能原因调整建议
Loss下降很慢,甚至几乎不动学习率太小,或动量积累不足适当增大学习率,或略微减小β(如0.9->0.8)
Loss震荡剧烈,上下跳动学习率太大,或动量惯性太强首要降低学习率,其次考虑略微减小β
Loss先降后升,或直接爆炸学习率过大,导致冲过头大幅降低学习率(比如减半或降至1/10)
训练后期Loss在最低点附近徘徊可能已收敛,或学习率仍可微调尝试使用学习率衰减,或进一步调小学习率

最后提一下Nesterov加速梯度(NAG),它算是动量法的一个“聪明”变种。普通动量是“先积累速度,再朝速度方向更新”。NAG则是“先朝当前速度方向眺望一步,在那个预估的位置计算梯度,再用这个梯度来修正速度”。你可以把它理解为“向前看”的动量。在理论上,NAG对于某些凸函数有更好的收敛保证。在实践中,对于深度学习,它的优势有时不明显,但通常不会比普通动量差。在PyTorch中,你可以在torch.optim.SGD里设置nesterov=True来启用它,值得一试。

4. 实战指南:在CNN与RNN中的差异化应用策略

理论懂了,参数也会调了,现在我们来点更实际的:在不同的网络结构里,动量法怎么用效果最好? 我以最典型的卷积神经网络(CNN)和循环神经网络(RNN)为例,分享一些实战中的技巧和踩过的坑。

在CNN图像任务中的应用: CNN,特别是用于图像分类、目标检测的网络,参数空间巨大,损失地形复杂(包含大量平坦区域和鞍点)。动量在这里几乎是标配。

  • 我的常用配置:对于ResNet、VGG这类经典CNN,使用SGD with Momentum,初始学习率设为0.01(如果batch size是256),动量β=0.9,权重衰减(weight decay)设为1e-4。这是一个非常稳健的基线。
  • 学习率调度是关键:CNN训练通常不会用一个固定学习率从头跑到尾。我习惯用余弦退火(Cosine Annealing)或者分段步进衰减。例如,在CIFAR-10上训练ResNet-18,我会用余弦退火让学习率从0.1平滑降到0。动量系数β则通常保持不变。动量的存在使得学习率即使降得比较低,参数更新依然能靠惯性保持一定的活力,避免过早停滞。
  • 一个注意点:在训练初期,由于参数随机初始化,梯度可能很不稳定。有些工作会建议在训练前几个epoch使用一个较小的动量(如0.5),等训练稳定后再升到0.9,也就是所谓的“热身”(Warmup)策略。我实测下来,对于大数据集(如ImageNet),配合学习率Warmup,这个技巧确实能提升最终精度。

在RNN序列任务中的应用: RNN(及其变体LSTM、GRU)处理的是序列数据,其优化面临著名的“梯度消失/爆炸”问题。动量法在这里的作用更加微妙。

  • 梯度裁剪是好朋友:由于RNN的梯度可能变得非常大,直接应用高动量会导致更新步长失控。因此,在使用动量的同时,务必加上梯度裁剪(Gradient Clipping)。这是一个标准操作,能防止参数更新一步跨出“银河系”。
  • 动量系数可以调低:对于语言模型、机器翻译等任务,我有时会发现将动量系数设为0.8或0.85比0.9效果更好。可能是因为序列数据的梯度动态变化更剧烈,过强的惯性反而容易导致模型在优化路径上“ overshoot ”。
  • 结合自适应优化器:现在很多RNN/LSTM模型会直接使用Adam优化器,它本身已经包含了自适应学习率和动量(一阶矩估计)的思想。但有意思的是,即使在Adam中,你仍然可以开启Nesterov动量(如果框架支持)。在一些需要非常精细调优的序列生成任务上,使用SGD with Momentum并精心调参,有时能达到比Adam更好的极限性能,虽然这需要更多的调参成本。

这里给一个在PyTorch中训练LSTM文本分类的优化器设置示例,融合了上述几点:

import torch
import torch.nn as nn
import torch.optim as optim

# 假设我们有一个简单的LSTM模型
class TextLSTM(nn.Module):
    def __init__(self, vocab_size, embed_dim, hidden_dim, num_classes):
        super().__init__()
        self.embedding = nn.Embedding(vocab_size, embed_dim)
        self.lstm = nn.LSTM(embed_dim, hidden_dim, batch_first=True)
        self.fc = nn.Linear(hidden_dim, num_classes)
    
    def forward(self, x):
        x = self.embedding(x)
        lstm_out, _ = self.lstm(x)
        last_hidden = lstm_out[:, -1, :]
        out = self.fc(last_hidden)
        return out

model = TextLSTM(vocab_size=10000, embed_dim=128, hidden_dim=256, num_classes=10)

# 优化器配置:SGD with Momentum + 权重衰减
optimizer = optim.SGD(model.parameters(), 
                      lr=0.01,       # 初始学习率
                      momentum=0.85, # 动量系数,略低于CNN常用值
                      weight_decay=1e-4) # L2正则化

# 学习率调度器:比如在30个epoch后衰减到0.1倍
scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=30, gamma=0.1)

# 在训练循环中,每次backward之后,更新之前,加入梯度裁剪
for epoch in range(num_epochs):
    for inputs, labels in train_loader:
        optimizer.zero_grad()
        outputs = model(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        
        # 梯度裁剪!非常重要!
        torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=5.0)
        
        optimizer.step()
    scheduler.step()

5. 高级技巧与避坑指南

掌握了基础应用后,我们聊聊一些能让你更上一层楼的高级技巧,以及我亲身踩过、希望你别再踩的坑。

技巧一:差异化的动量(Per-Layer Momentum) 这是一个比较进阶但非常有效的思路。神经网络的每一层,学到的特征层次不同,其梯度的尺度和噪声水平也不同。浅层卷积核可能学习边缘、纹理,梯度相对稳定;深层网络负责高级语义,梯度可能更复杂。因此,对不同的层使用不同的动量系数可能更有益。例如,给浅层设置更高的动量(如0.95)以加速稳定特征的提取,给深层设置稍低的动量(如0.85)以保持灵活性。虽然主流框架没有直接提供这个接口,但你可以通过创建多个优化器分组来实现。不过,这增加了调参复杂度,建议在基线模型已经调优得很好,想要冲击更高分数时再尝试。

技巧二:动量与批量归一化(BatchNorm)的协同 这是一个至关重要的细节。现在绝大多数CNN都使用BatchNorm(BN)层。BN层在训练时有自己的内部统计量(均值和方差)需要更新,这个更新通常是通过移动平均实现的,其动量参数(默认0.1)和优化器的动量完全是两回事,别搞混了!优化器的动量作用于梯度,BN的动量作用于特征分布的统计量。一个常见的误区是,当模型使用了BN,优化器动量就不重要了。不对!BN解决了内部协变量偏移,让训练更平稳,但优化器动量依然负责在参数空间中进行高效的导航。两者是互补的。我建议是:保持BN的动量为其默认值(如0.1),然后独立地调优优化器的动量。

避坑指南:我踩过的几个典型坑

  1. 动量与学习率衰减的时机:如果你使用了类似ReduceLROnPlateau(当指标不再提升时降低学习率)的策略,请注意,高动量可能会“掩盖”模型收敛的迹象。因为即使梯度已经很小,动量项依然可能推着参数缓慢移动,导致验证集loss还在缓慢下降,从而延迟了学习率衰减的触发。我的经验是,在这种情况下,可以适当提高衰减策略的“耐心”(patience)参数,或者更依赖训练集loss的平滑程度来判断。
  2. 重启(Restart)策略下的动量:当使用带重启的余弦退火(Cosine Annealing with Warm Restarts)时,每次重启学习率会突然变大。这时,如果动量项还保持着之前迭代积累的很大速度,两者结合可能会导致训练初期剧烈震荡。一个好的做法是,在每次学习率重启时,将动量缓存(velocity)清零或重置为一个很小的值。有些优化器(如torch.optim.SGD)在PyTorch中并不会自动做这件事,需要你在调度器重启时手动处理。
  3. 调试时关闭动量:当你模型训练出现异常(如Loss NaN),进行问题排查时,第一件事就是创建一个不使用动量的优化器对比实验。这能帮你快速判断问题是来自动量/学习率设置,还是来自模型结构、数据预处理等其他环节。这是一个非常有效的隔离问题的方法。

动量法作为一个历经时间考验的经典优化技术,其思想简洁而强大。它可能没有Adam、AdamW这些自适应优化器那么“自动化”,但也正因如此,它给了我们更多可控性和理解空间。在追求模型极致性能的路上,很多时候,从Adam切换回精调过的SGD with Momentum,反而是那临门一脚。希望这些从实战中摸爬滚打出来的经验,能帮你更自信地驾驭这个工具,让你的模型训练得更快、更稳。

SGD+Momentum:提速优化的强力组合 SGD+Momentum算法通过结合SGD和Momentum的优点,能够更快地收敛、避免局部极小值,并提高深度学习模型的性能。在深度学习领域的各个任务和模型中,SGD+Momentum已被广泛应用,并取得了良好的优化效果。SGD+Momentum(随机梯度下降+动量法)是一种强大的优化算法组合,它结合了SGD的简单性和Momentum的收敛速度,:SGD+Momentum通过引入动量项,使更新方向在梯度变化较大的维度上具有一定的惯性,从而加速收敛并提高性能。SGD+Momentum是一种优化算法的组合。 阅读详情

相关推荐

优化算法-momentum(动量法)

关于梯度下降的三个算法:梯度下降,随机梯度下降,以及小批量皮杜下降已经在该篇博文中介绍:https://blog.youkuaiyun.com/weixin_42109859/article/details/104822335 但对梯度下降使用同一固定不变的超参数会引发一些问题。 例如当我们的目标函数为f(x)=0.1x12+2x22f(\boldsymbol{x})=0.1x_1^2+2x_2^2f(x)=...

DevilXiao 5552

深度学习(一)优化算法之动量法详解

动量法 使用梯度下降法,每次都会朝着目标函数下降最快的方向,这也称为最速下降法。这种更新方法看似非常快,实际上存在一些问题。 1. 梯度下降法的问题 考虑一个二维输入,[x1,x2][x_1, x_2][x1​,x2​],输出的损失函数 L:R2→RL: R^2 \rightarrow RL:R2→R,下面是这个函数的等高线: 可以想象成一个很扁的漏斗,这样在竖直方向上,梯度就非常大,在水平方向上,梯度就相对较小,所以我们在设置学习率的时候就不能设置太大,为了防止竖直方向上参数更新太过了,这样一个较小的学

qq_39809262的博客 1万+

33. 动量法(Momentum)介绍

尽管深度学习中的动量与物理学中的动量并不完全相同,但它们都强调了一个概念:在运动方向上保持运动的趋势,从而加速收敛。1. **加速收敛**:动量法通过积累之前的梯度信息,使得优化过程更为顺畅,避免了曲折路径,提高了收敛速度。2. **跳过局部最小值**:由于动量的累积作用,可以帮助优化算法跳过一些局部最小值,找到更优的解。3. **减少振荡**:动量法可以有效减小学习过程中梯度震荡的现象,使得模型的训练更加稳定。2. **参数调节**:动量法引入了新的超参数(动量系数),需要在实际应用中进行调节。

qq_41238579的博客 909

深度学习:算法优化之动量算法(Momentum)

1.原理   运用物理学上的动量思想,在梯度下降的问题中引入动量项 mmm 和折扣因子 γ\gammaγ,公式为:mt=γmt+1m_t=\gamma m_{t+1}mt​=γmt+1​其中 mmm 是动量项mmm的指数加权平均后的值,γ\gammaγ表示历史梯度的影响力,也就是权重值,γ\gammaγ越大,权重越大。从直观上看,如果当前时刻的梯度与历史梯度方向趋近,这种趋势会在当前时刻加强,否则减弱。 2.指数加权平均   在分析动量算法之前,我们先来了解指数加权平均的含义。假定给一个序列,例如北京一年每

m0_58475958的博客 5497

深度学习中的优化方法(Momentum,AdaGrad,RMSProp,Adam)详解及调用

深度学习中的优化方法(Momentum,AdaGrad,RMSProp,Adam)详解及调用

bbaaa123的博客 1823

深度学习优化:动量法原理、实现与调优全解析

在深度学习模型训练中,优化算法是决定模型能否高效收敛的关键。随机梯度下降(SGD)作为基础方法,其原理是沿着当前梯度反方向更新参数以最小化损失函数。然而,在复杂非凸的损失函数曲面上,SGD容易因梯度方向剧烈变化而产生震荡,导致收敛缓慢。动量法(Momentum)通过引入物理中的动量概念,将历史梯度以指数加权平均的方式累积为“速度”变量,从而平滑更新方向、抑制震荡,并加速在持续下降方向上的收敛。这一技术显著提升了训练的稳定性和效率,尤其在处理条件数较差(如狭长山谷状)的优化地形时价值突出。其核心超参数动量系数

weixin_33309048的博客 321

【深度学习笔记】7_4 动量法momentum

注:本文为开源内容,部分标注了个人理解,仅为个人学习记录,无抄袭搬运意图。

RIKI_1 2245

Pytorch Note16 优化算法2 动量法(Momentum)

Pytorch Note16 优化算法2 动量法(Momentum) 文章目录Pytorch Note16 优化算法2 动量法(Momentum)动量法(Momentum)梯度下降法的问题MomentumNesterov Accelerated Gradient代码从0实现pytorch 内置优化器对比 动量 + 不加动量 的 SGD 全部笔记的汇总贴:Pytorch Note 快乐星球 动量法(Momentum) 使用梯度下降法,每次都会朝着目标函数下降最快的方向,这也称为最速下降法。这种更新方法看似非常

风信子的猫Redamancy的快乐星球 3126

深度学习的优化算法之--动量法、Adagrad、RMSProp、Adadelta

不同优化算法针对不同问题设计了特定的更新策略,帮助模型更高效地收敛到全局或局部最优解。本文将深入讲解动量法、Adagrad、RMSProp和Adadelta优化算法,结合实际代码演示它们的应用场景和效果,帮助读者掌握这些算法并学以致用。

xyaixy的博客 3830

动量法 (Momentum) 算法详解及案例分析

动量法是一种非常有效的优化算法,通过引入动量项来加速梯度下降的收敛过程,并且在某些情况下可以帮助算法跳出局部最优。本文通过三个具体的案例展示了动量法在线性回归、逻辑回归和神经网络训练中的应用,并通过代码实现和流程图详细说明了算法的执行过程。在实际应用中,动量法的超参数选择对算法的性能有较大影响,需要通过实验进行调整。此外,动量法虽然可以加速收敛,但在某些情况下可能会导致算法错过最优解,因此在实际应用中需要根据具体问题选择合适的优化算法。

闲人编程的博客 1532

深度学习实战(基于pytroch)系列(四十七)momentum(动量法)

本文介绍了梯度下降法的局限性以及动量法的改进方案。梯度下降在目标函数不同方向梯度差异较大时,需要较小的学习率以避免振荡,但会导致收敛缓慢。动量法通过引入速度变量,结合当前梯度和历史速度信息(公式:vₜ=γvₜ₋₁+ηgₜ),有效缓解了这一问题。实验显示,动量法能使优化路径更平滑,允许使用更大学习率而不会发散。文中还详细解释了指数加权移动平均的数学原理,说明动量法本质是对最近1/(1-γ)个梯度进行加权平均,近期梯度权重更高(如γ=0.9时约65%权重集中于最近10步)。这种机制使动量法兼具快速响应和稳定收敛

echo的博客 1018

【深度学习优化算法】06:动量法

本文探讨更高效优化算法,重点介绍了泄漏平均值(动量)方法,通过累加过去梯度减小方差,提高收敛性。还分析了条件不佳问题,通过数学推导和实例展示了动量法在优化中的优势,包括扩大学习率范围,提高参数适应性,加速收敛。

Morse_Chen的博客 1563

训练集、验证集、测试集!YOLO系列标签数量统计!

【代码】训练集、验证集、测试集!YOLO系列标签数量统计!

qq_26281057的博客 649

深度学习优化函数详解(4)-- momentum 动量法

深度学习优化函数详解系列目录 深度学习优化函数详解(0)– 线性回归问题 深度学习优化函数详解(1)– Gradient Descent 梯度下降法 深度学习优化函数详解(2)– SGD 随机梯度下降 深度学习优化函数详解(3)– mini-batch SGD 小批量随机梯度下降 深度学习优化函数详解(4)– momentum 动量法 深度学习优化函数详解(5)– Neste...

史丹利复合田的博客 4万+

[Multisim][模电实验]简易函数信号发生器的设计与实现_北京邮电大学2019级信通院电子电路实验下

本文记述了笔者设计并实现以±12V供电电压输出1KHZ~10KHZ频率连续可调的方波、三角波和正弦波的过程。其中,方波输出电压峰峰值为12V(误差<20%),占空比可调、三角波输出电压峰峰值为8V(±20%),正弦波输出电压峰峰值≥1V。

lgc0208的博客 4万+

Unity类银河战士恶魔城学习总结(P103之前 Enemy相关 , 骷髅战士,状态机,敌人状态,)

udemy的Alex银河战士恶魔城,记录我自己的学习,代码会逐渐每一p更新,仅供参考学习。

suzh1qian的博客 1633

动量法-momentum

动量法是一种优化梯度更新的方法,借鉴物理学中的动量概念,在梯度更新时不仅考虑当前梯度,还参考历史梯度趋势。主要分为标准动量法和指数加权平均动量法,通过引入动量系数β(通常取值0.5-0.99)来平滑梯度。该方法在多个场景具有优势:通过拐点时能利用历史梯度继续前进;在缓坡场景中标准动量法可显著加速收敛;能帮助逃离局部极小值;指数加权法可部分缓解悬崖问题;在最小值点附近能减少震荡。然而标准动量法在悬崖地形可能加剧跳跃,而指数加权法虽然平滑梯度但缓坡加速效果有限。

hbkybkzw的博客 757

语义通信实战:跳过“比特”保“语义”,手把手构建轻量级图像压缩重建网络(基于PyTorch)

本文详细介绍了基于PyTorch的轻量级语义通信系统LICRnet的实现,专注于图像压缩重建中的语义信息保留。通过深度可分离卷积、可变窗口多尺度注意力等创新技术,显著降低计算量并提升性能,特别适用于无人机巡检、远程医疗等物联网场景。文章包含完整的代码实现、训练策略及部署优化方案。

weixin_27697385的博客 221

通俗易懂讲透动量法(Momentum)优化算法

本文通过形象比喻和公式拆解,深入浅出地讲解了动量法优化算法的原理与应用。文章指出普通梯度下降的两个缺陷(震荡和收敛慢),而动量法通过引入速度变量积累历史梯度惯性,实现更稳定快速的优化。核心内容包括:动量法的自行车下山比喻、核心公式拆解(速度更新和参数更新)、Nesterov动量法的改进原理、完整算法流程4步骤,以及可运行的Python代码实现(标准动量法与Nesterov对比)。文章还总结了动量法的5大优点和4个缺点,并提供了优化算法对比表和使用场景建议。动量法特别适用于损失函数呈狭长山谷形状、梯度震荡大的

DeepModel的博客 974

Halcon手眼标定实战:九点标定法从入门到精通(附完整代码)

本文详细介绍了Halcon环境下九点标定法的完整实现流程,从基础概念到实战技巧,帮助开发者快速掌握手眼标定技术。通过精确采集图像坐标与机械坐标,计算仿射变换矩阵,实现相机与机械臂坐标系的精确映射,适用于工业自动化中的平面定位场景。

v4w5x6的博客 411

RK3568平台开发系列讲解(音频篇)配置声卡

📢本篇文章介绍如何配置声卡。

内核笔记 2448

深度学习中的优化方法-Momentum and Nesterov Accelerated Gradient

码字不易,转载请注明出处~ tags: optimizer; Momentum; Nesterov Accelerated Gradient 这篇文章主要介绍动量法以及Nesterov法,来源于: https://medium.com/konvergen/momentum-method-and-nesterov-accelerated-gradient-487ba776c987 之所以把这两个内容...

hanjiangxue_wei的博客 1159

【虚幻引擎UE】UE5 四步骤实现AI漫游与对话行为(含工程源码)

【虚幻引擎UE】UE5 四步骤实现AI漫游与对话行为(含工程源码)

灵境引路人 3227

深度学习入门之Pytorch——Momentum

动量法 动量法是梯度下降法的变式,在随机梯度下降的同时,增加动量。这是来自于物理中的概念,可以想象损失函数是一个山谷,一个球从山谷滑下来,在一个平坦的地势,球的滑动速度就会慢下来,可能陷入一些鞍点或者局部极小值点,如图 这个时候给它增加动量就可以让它从高处滑落时的势能转换为平地的动能,相当于惯性增加了小球在平地滑动的速度,从而帮助其跳出鞍点或者局部极小点。 动量怎么计算呢?动量的计算基于前面的梯...

weixin_40793406的博客 6529

NVIDIA - 人形机器人扼要

人形机器人是仿照人类外形设计的通用双足机器人,旨在与人类并肩工作,提高生产效率。它们能够学习和执行各种任务,如抓取物体、移动集装箱、装卸箱子等。

机器人控制与仿真应用 1289

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

上一篇: 基于74HC74与74HC86的同步模4可逆计数器设计与实现
下一篇: Keil开发实战:从错误到优化的嵌入式调试全攻略
gitlab7runner
博客等级 码龄4年 78粉丝 1747原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值