假设你经营一家火锅店,主厨负责熬制一锅招牌汤底,锅里的香料浓度就是模型参数。几个助手厨师的工作是:时不时舀一勺汤尝尝,然后把“该加盐了”“该下辣椒了”的建议写成小纸条递给主厨。 如果采用“同步SGD”模式:所有助手必须同时尝完汤,主厨收到全部建议才动手调整。谁尝得慢,大家就一起干等,效率很低。 于是你改用“异步SGD”模式:谁先尝完谁先递条子,主厨拿到一张就改一次。后厨立刻快了起来,但新的麻烦出现了——助手小刘递上的建议,写的是他三分钟前尝的那锅汤的口味。这期间主厨已经改了五次配方,那条建议早就过时了。 这条“过时建议”就是梯度延迟。本文就用这个火锅店后厨的故事,讲清楚延迟从哪来、为什么会让训练震荡甚至发散,以及延迟补偿、自适应学习率、控制并发等对策,最后聊聊什么时候该用异步、什么时候该老老实实走同步。

岗位关联

异步SGD的梯度延迟是分布式训练收敛不稳的常见元凶。掌握成因与对策,能让你在设计分布式训练方案、排查收敛问题时快速定位,是走向资深分布式训练工程师的关键一课。

目录
  1. 可视化演示
  2. 异步SGD原理
  3. 延迟产生机制
  4. 收敛影响分析
  5. 延迟补偿方法
  6. 自适应学习率
  7. 工程实践要点
  8. 同步异步取舍
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示异步SGD中梯度延迟的产生机制、对收敛稳定性的影响,以及延迟补偿和自适应学习率等缓解策略的效果对比。

本节配有交互动效(进入视口后自动加载,约 3KB)。

梯度延迟产生机制 参数服务器(PS)分发参数,工作节点异步计算梯度 延迟越大(W3)的梯度越过期,更新方向偏离当前最优 θ←θ-η·g(t-τ) 异步更新中τ越大,梯度越陈旧,训练越不稳定

异步SGD原理

同步后厨开饭前有个“集合仪式”:所有助手尝完汤,站成一排,主厨听完所有人的意见才动一次勺。这叫同步SGD——每个训练步,所有 worker 必须在屏障(barrier)处集合,等最慢的人。一个人磨蹭,全队陪等,这就是著名的木桶效应。

分布式训练里把这个后厨搬到多台机器上。参数服务器(parameter server,PS)是主厨的位置,集中存放并更新模型参数;worker是助手厨师,拿到最新参数、算小批量数据的梯度(尝汤),再把梯度交回 PS 更新参数。同步模式下,PS 要等齐一批梯度才更新;异步模式下,PS 来一个梯度就更新一次。

异步的更新规则长这样:

这段公式里藏着一个隐患:右下角的 $t-\tau$。它提醒我们,异步更新用的梯度很可能不是“此刻”的梯度,而是“过去某一刻”的梯度。后厨确实快了几倍,但主厨手里的建议,可能已经是凉了的。这就是异步的代价,也是后面所有对策要解决的问题。

wt+1=wt−η ∇f(wt−τ)\displaystyle w_{t+1} = w_t - \eta\, \nabla f\left(w_{t-\tau}\right)
一句话说:每次更新等于“当前参数 − 学习率 × 一份可能过期的梯度”。学习率是勺,梯度是建议,$\tau$ 是建议的“保鲜期”。
  1. $w_{t+1}$ 新参数$w$ 是模型参数(锅底浓度),下标 $t+1$ 表示这次更新完成后的最新值。
    wt+1w_{t+1}
  2. $w_t$ 当前参数更新前 PS 里存着的参数值,是所有更新的出发点。
    wtw_t
  3. $\eta$ 学习率每一次更新迈出的步幅,相当于主厨加料时勺子的大小。
    η\eta
  4. $\nabla f(w_{t-\tau})$ 延迟梯度梯度在 $t-\tau$ 步就算好了,迟到了 $\tau$ 步才被应用到参数上;$\tau=0$ 就是无延迟的理想情况。
    ∇f(wt−τ)\nabla f\left(w_{t-\tau}\right)

延迟产生机制

助手小刘的建议为什么会迟到?仔细看后厨,原因无非两种。第一种是“尝得慢”:有的助手负责的食材区离锅远,来回跑一趟就要三分钟;有的助手手头活儿多,排了半天队才轮到他尝。对应到分布式训练,就是不同 worker 的计算速度有差异、数据分片不均匀。第二种是“送得慢”:后厨走廊窄,几十个助手同时递条子,消息在 PS 门口排队等处理,网络通信成了瓶颈。

无论哪种迟到,在数学上都用一个数字刻画——延迟(staleness)$\tau$。它定义为“梯度实际被应用的那一步”与“梯度被算出来的那一步”之差:

所以,后厨越大、助手越多,走廊越拥堵,$\tau$ 就越大。在工程中,$\tau$ 不是一个固定值:网络抖动、机器排队都会让它忽大忽小。很多人盯着训练日志里的 loss 曲线震荡,却不知道幕后元凶正是这个躲在右下角的 $\tau$。要治理它,得先学会度量它——每个梯度都该记录自己的“出生时间步”。

τ=t−t0\displaystyle \tau = t - t_0
一句话说:延迟就是“梯度从出锅到上桌”隔了多少步。$\tau$ 越大,建议越凉。
  1. $t$ 当前步梯度此刻正要被 PS 应用到参数上,$t$ 是最新更新轮次。
    tt
  2. $t_0$ 计算步这个梯度刚被某个 worker 算出来时的轮次,对应“尝汤的那一刻”。
    t0t_0
  3. $\tau$ 延迟量两者之差,单位是“步数”。$\tau=0$ 表示没有延迟,$\tau$ 越大表示这条梯度越陈旧。
    τ=t−t0\tau = t - t_0

收敛影响分析

主厨拿到的建议是过时的,麻烦有多大?想象小刘三分钟前尝汤,觉得“太淡”,写条子让加盐。可这三分钟里主厨已经加了两勺盐,汤其实已经偏咸了。主厨要是照单全收再补一勺盐,这一锅就彻底毁了。延迟梯度的问题正在于此:它指向的是“旧汤底”的正确方向,对“新汤底”来说很可能是错误方向。

数学上,理想情况希望更新方向等于当前参数的梯度 $\nabla f(w_t)$,但延迟梯度给出的是 $\nabla f(w_{t-\tau})$。两者之间的关系可以写成:

这个偏差 $b_t$ 混在每次更新里,就像汤里飘着的一层油花:单看一次没什么,积累起来会让 loss 曲线反复震荡,甚至把参数推向发散。更麻烦的是,神经网络这类非凸目标函数凹凸不平,一次大偏差更新可能把参数推到某个糟糕的局部最优附近,再难逃出来。梯度噪声变大、收敛变慢、最终精度下降,都是这一层“油花”的杰作。

好,再想想对策。既然“菜要趁热吃”,那没法保证趁热时怎么办?要么把凉菜回锅热一热——延迟补偿;要么干脆对凉菜少放料——自适应学习率。接下来的两节就是这两条路。

E[∇f(wt−τ)]=∇f(wt)+bt\displaystyle \mathbb{E}\left[\nabla f\left(w_{t-\tau}\right)\right] = \nabla f\left(w_t\right) + b_t
一句话说:延迟梯度算出的方向,平均来看等于真实方向加上一个偏差 $b_t$。这个偏差就是训练震荡的源头。
  1. $\mathbb{E}[\cdot]$ 期望对随机采样的小批量梯度取平均,代表“平均来说”的方向。
    E[∇f(wt−τ)]\mathbb{E}\left[\nabla f\left(w_{t-\tau}\right)\right]
  2. $\nabla f(w_t)$ 真实方向假设当前参数 $w_t$ 已知,用最新参数算出的梯度方向,是理想更新方向。
    ∇f(wt)\nabla f\left(w_t\right)
  3. $b_t$ 偏差项延迟带来的系统性偏差。$\tau$ 越大,$b_t$ 越大,更新方向被带偏得越厉害。
    btb_t

延迟补偿方法

聪明的助手不会干巴巴递一张过时条子,他会在条子上补充一句:“我尝的时候汤底浓度是 X,现在如果已经变成 Y,那么我的建议请按差值修正。”这正是延迟补偿(delay compensation)的思想:把陈旧梯度“换算”成当前参数下的梯度再使用。

DC-ASGD(延迟补偿异步随机梯度下降)算法给出了一个漂亮的修正公式。它利用泰勒展开,用当前参数与陈旧参数之间的差距以及二阶曲率信息,把陈旧梯度拉回当前位置:

直观地说,参数漂移量乘以曲率,就估计出“如果我在当前位置重新算梯度,方向会偏多少”。把这个估计量加回旧梯度,相当于把凉掉的建议回锅加热。工程上,完整海森矩阵太贵,常用对角近似甚至直接省略二阶项、只保留参数差的一阶补偿,效果也已经很显著。此外,延迟补偿常常配合梯度裁剪:把更新向量限制在合理范围内,防止某条极端陈旧的梯度把参数一步推飞。主厨的秘诀是:采纳建议之前,先换算成“当前汤底口味”再动勺。

wt+1=wt−η[ gt−τ+λ ∇2f(wt)(wt−τ−wt)]\displaystyle w_{t+1} = w_t - \eta\left[\, g_{t-\tau} + \lambda\, \nabla^2 f\left(w_t\right)\left(w_{t-\tau} - w_t\right)\right]
一句话说:更新时不只是用旧梯度,还会按“参数漂移 × 曲率”补一笔修正,把旧建议换算成当前口味。
  1. $g_{t-\tau}$ 陈旧梯度worker 在 $t-\tau$ 步算出的原始梯度,即 $\nabla f(w_{t-\tau})$ 的简写。
    gt−τg_{t-\tau}
  2. $\nabla^2 f(w_t)$ 海森矩阵损失函数在当前参数处的二阶曲率,描述“这里的地形是陡坡还是缓坡”。
    ∇2f(wt)\nabla^2 f\left(w_t\right)
  3. $(w_{t-\tau}-w_t)$ 参数漂移从梯度算出的那一刻到现在,参数已经走了多远。漂移越大,越需要大力修正。
    (wt−τ−wt)\left(w_{t-\tau} - w_t\right)
  4. $\lambda$ 补偿强度控制补偿力度的超参数,平衡“信任旧梯度”与“信任修正”。
    λ\lambda

自适应学习率

第二条路更省事:既然摸不准迟到建议的方向,那就干脆减少对它的信任——建议越晚到,主厨的勺子就舀得越小。这就是自适应学习率家族里专门为延迟设计的 AdaDelay 算法。

它的公式很简洁,把学习率设成延迟量 $\tau$ 的减函数:

AdaDelay 的精髓是“以退为进”:延迟 $\tau$ 大时主动放慢脚步,虽然单步走得小,但每一步都在向正确方向挪动,总比大步乱撞强。实践中,最常用的是将它与延迟补偿配合:补偿负责修正方向,自适应学习率负责控制步幅,一个掌舵、一个踩刹车。损失曲线如果还震荡,先看平均延迟,再决定是该加强补偿还是加大 $\lambda$。

ηt=η01+λ τt\displaystyle \eta_t = \frac{\eta_0}{1 + \lambda\, \tau_t}
一句话说:延迟越大,学习率越小——越凉的建议,越只配用小勺子。
  1. $\eta_0$ 基础学习率无延迟($\tau=0$)时使用的默认步幅,由正常调参确定。
    η0\eta_0
  2. $\tau_t$ 当前延迟第 $t$ 步这条梯度的陈旧程度,由梯度携带的“出生时间”算出。
    τt\tau_t
  3. $\lambda$ 衰减系数延迟对学习率的惩罚力度。$\lambda$ 越大,学习率随延迟下降得越快。
    λ\lambda
  4. $\eta_t$ 延迟感知学习率分母恒大于 1,所以延迟越大、学习率越小,陈旧梯度的“调料量”被压缩。
    ηt=η01+λ τt\eta_t = \frac{\eta_0}{1 + \lambda\, \tau_t}

工程实践要点

学了原理,回到后厨管理:到底什么时候适合开异步模式?观察一下客人流量的规律。如果一桌菜只需要炖十几分钟(单步计算时间短),同步模式干等的浪费并不大;但如果每道菜要炖几小时(大模型单步训练很久),等最慢的助手就太亏了,异步的“不等了、先改起来”优势就体现出来。异步在高延迟、大规模、单步耗时长的场景里更值得用。

但开异步不等于放任不管。第一个铁律是限制并发 worker 数量。人多不一定快,平均延迟 $\bar{\tau}$ 会随 worker 数上升。有效加速比有一个经验公式:

这个公式告诉我们:当 $\bar{\tau} \ll 1$ 时,$S \approx N$,几乎线性加速;一旦 $\bar{\tau}$ 涨到和 $N$ 一个量级,加速比就严重缩水,加再多 worker 也是白费电。工程上对应三条实操建议:一是给 worker 数设上限,别盲目加机器;二是监控参数服务器日志里的平均延迟,延迟飙升时报警;三是调参时把初始学习率按 $1/(1+\bar{\tau})$ 的尺度下调,给延迟留出余量。后厨不是帮手越多越好——人多走廊挤,消息更拥堵,过时建议更多。

S=N1+τˉ\displaystyle S = \frac{N}{1 + \bar{\tau}}
一句话说:有效加速比永远小于 worker 数,延迟越大,加人的收益越低,所以不能盲目堆机器。
  1. $N$ worker 总数并行训练的助手厨师数量。
    NN
  2. $\bar{\tau}$ 平均延迟所有梯度延迟的均值,后厨的“拥堵指数”。
    τˉ\bar{\tau}
  3. $S$ 有效加速比相对单 worker 的等效加速倍数。分母大于 1,所以 $S$ 永远小于 $N$。
    S=N1+τˉS = \frac{N}{1 + \bar{\tau}}

同步异步取舍

讲到这里,火锅店的经营哲学逐渐清晰:同步稳,异步快,但没有银弹。同步模式下,所有助手等在屏障前,PS 攒齐一批梯度再求平均更新:

怎么选?看三个指标:一是集群规模,几十上百卡时异步优势明显,几卡时同步足够;二是单步耗时,单步越久越值得异步;三是收敛要求,追求极致精度的场景,可以先异步热身快速下降、后期切同步精调,这就是常见的“异步预热 + 同步收尾”混合策略。还有一个兜底原则:切换到异步后,盯着 loss 曲线看几十步,如果震荡远超基线,就果断降并发或切回同步。后厨经营没有放之四海而皆准的菜谱,快和稳,要在实际客流中反复掂量。

wt+1=wt−η 1N∑i=1N∇fi(wt)\displaystyle w_{t+1} = w_t - \eta\, \frac{1}{N}\sum_{i=1}^{N} \nabla f_i\left(w_t\right)
一句话说:同步把大家基于同一份参数的梯度平均再用,方向最准,但必须等最慢的人。
  1. $\nabla f_i(w_t)$ 各 worker 梯度第 $i$ 个 worker 基于同一份 $w_t$ 算出的梯度,大家口径一致。
    ∇fi(wt)\nabla f_i\left(w_t\right)
  2. $\frac{1}{N}\sum_{i=1}^{N}$ 平均聚合把 $N$ 份梯度取平均,方向更稳,但必须等最慢的那份到齐。
    1N∑i=1N\frac{1}{N}\sum_{i=1}^{N}
  3. 对比异步这里的下标是 $w_t$ 而不是 $w_{t-\tau}$,正是同步“新鲜但慢”、异步“快但陈旧”的核心差别。
    wt+1=wt−η 1N∑i=1N∇fi(wt)w_{t+1} = w_t - \eta\, \frac{1}{N}\sum_{i=1}^{N} \nabla f_i\left(w_t\right)

AI 应用场景

场景1:推荐系统大规模稀疏模型训练

阶段:模型训练

解决的问题:传统同步SGD在超大规模稀疏特征(用户ID、商品ID的 embedding)下,单步训练就要全量聚合梯度,通信开销巨大,训练吞吐上不去。异步SGD让每个 worker 的梯度立即更新参数服务器上的 embedding,能大幅提升吞吐。但 embedding 更新频繁、延迟严重,直接用异步会出现 CTR 预估指标震荡。引入延迟补偿(参数漂移修正)与延迟感知学习率后,收敛稳定性明显改善。

具体案例:某短视频推荐团队在数百台机器的参数服务器集群上训练 CTR 模型,embedding 表达到百亿级。初期异步SGD下 AUC 曲线剧烈抖动,通过记录每个梯度的时间戳、计算平均延迟 $\bar{\tau}$,并将学习率按 $1/(1+\bar{\tau})$ 缩放,抖动消失,训练速度比同步提升约 3 倍。

场景2:大模型数据并行选型决策

阶段:分布式并行策略设计

解决的问题:训练百亿参数大模型时,开发者常纠结同步还是异步。同步版本每个 step 都要全局通信,木桶效应让整卡利用率只有 40%;改异步又怕梯度延迟导致 loss 发散。本文的“看延迟、看单步耗时、看收敛要求”决策框架可以直接拿来用。

具体案例:某团队用数据并行训练 70 亿参数模型,16 卡同步训练整卡利用率低。按本文思路分析后:单步耗时 2 秒(足够长)、集群规模合理、worker 数控制在 8,搭配延迟补偿与梯度裁剪后,吞吐提升 1.8 倍,loss 曲线与同步基线几乎重合。

场景3:在线学习与持续训练

阶段:模型更新与推理

解决的问题:在线推荐、风控等场景需要实时用新数据更新模型,天然适合异步:新样本不断到达,不可能让所有 worker 摆好队形再同步。梯度延迟不可避免,需要在“来一条更新一条”的同时做好稳定性控制。

具体案例:某风控系统每天流式更新反欺诈模型,采用异步SGD风格的在线更新,配合延迟自适应学习率,对快速漂移的欺诈模式响应时间从小时级降到分钟级,模型 AUC 保持稳定。

Python 演示

python46 行
import numpy as np  class AsyncTrainer:    """模拟异步SGD训练,目标函数 f(w)=0.5*(w-5)^2"""     def __init__(self, delay=0, lr=0.4, adaptive=False, compensate=False):        self.delay = delay        self.lr = lr        self.adaptive = adaptive        self.compensate = compensate        self.w = 0.0        self.history = [self.w]     def step(self, t):        tau = min(self.delay, t)        w_stale = self.history[t - tau] if tau > 0 else self.w        grad = w_stale - 5.0        if self.compensate:            grad += self.w - w_stale        eta = self.lr / (1.0 + 0.5 * tau) if self.adaptive else self.lr        self.w -= eta * grad        self.history.append(self.w)     def train(self, steps=200):        for t in range(steps):            self.step(t)        return self.history  def main():    configs = {        '同步(延迟0)': dict(delay=0),        '异步(延迟5)': dict(delay=5),        '异步+补偿': dict(delay=5, compensate=True),        '异步+自适应': dict(delay=5, adaptive=True),    }    for name, cfg in configs.items():        trainer = AsyncTrainer(**cfg)        hist = trainer.train(200)        loss = (hist[-1] - 5.0) ** 2        print('%-14s 最终参数: %10.3f  损失: %.4f' % (name, hist[-1], loss))  if __name__ == '__main__':    main()
目的:用最小模型模拟同步、异步(带延迟)、延迟补偿与自适应学习率四种训练方式在二次损失面上的表现,直观对比梯度延迟的影响与对策效果。
  1. class AsyncTrainer:定义一个可配置延迟、补偿和自适应学习率的模拟训练器,对应正文里的四种策略。
  2. self.history = [self.w]把每一步的参数记录下来,后续模拟“用旧参数算梯度”全靠这份历史。
  3. w_stale = self.history[t - tau] if tau > 0 else self.w取出 $\tau$ 步前的旧参数,相当于 worker 用“过期汤底”尝味。
  4. grad = w_stale - 5.0用旧参数计算梯度,模拟真正的延迟梯度 $\nabla f(w_{t-\tau})$。
  5. grad += self.w - w_stale延迟补偿项:用当前参数与旧参数的差修正梯度方向,对应 DC-ASGD 的线性近似。
  6. eta = self.lr / (1.0 + 0.5 * tau) if self.adaptive else self.lrAdaDelay 的学习率衰减:延迟越大,步幅越小。
  7. self.w -= eta * grad完成一次参数更新,模拟参数服务器收到梯度后的动作。
  8. '异步(延迟5)': dict(delay=5)模拟通信或计算不均衡导致的 5 步延迟,观察不设防时是否发散。
  9. if __name__ == '__main__':程序入口,依次跑四种配置并打印最终参数与损失。

常见误区

误区异步SGD一震荡,我就把学习率调小,调了几次发现还是抖,是不是我调得不够小?可能直接把学习率调到几乎为零,训练又慢到不可接受。

正解调小学习率能缓解发散,但解决不了“方向陈旧”这个根子问题。学习率控制步幅,延迟补偿控制方向,两者各管一摊。正确做法是先用延迟补偿修正梯度方向,再配合适度的学习率缩放,而不是只拧学习率一个旋钮。

为何常见:学习率是训练里最常动的旋钮,遇到震荡第一反应就是调它;但延迟造成的“方向偏差”不是把步子迈小就能完全纠正的,方向错了小步走也只是小步错。

误区异步不用等别人,吞吐肯定更高,所以训练一定更快。我是不是可以无脑选异步?

正解异步的单步吞吐确实高,但延迟带来的噪声会让收敛需要的迭代步数变多。端到端看“收敛到目标精度的时间”,大延迟异步可能反超同步。小集群、快通信、单步短的环境里,同步反而更优;异步的优势要在大规模、单步耗时长的场景才明显。

为何常见:只看到异步“不用等待”的表象,忽略了延迟导致的迭代质量下降。吞吐高不等于收敛快,就像上菜快但每道菜口味都偏,客人整体评价反而差。

误区不就是梯度旧了一点嘛,多训练几百步不就追回来了吗?损失曲线稍微震荡一下应该没关系吧。

正解在光滑凸问题上延迟影响确实有限,但神经网络是非凸的,参数面凹凸不平。一次基于陈旧梯度的坏更新可能把参数推进一个糟糕的局部最优或鞍点区域,后面很难逃出来,甚至会直接发散。延迟不只是速度问题,还直接决定最终精度和训练稳定性。

为何常见:凸优化里延迟影响小的经验容易让人低估;神经网络非凸、学习率大时,延迟的影响会被显著放大,这是两类问题质的区别。

误区DC-ASGD 公式里有 $\nabla^2 f$,海森矩阵在深度模型里是亿级参数平方的量级,存都存不下,这算法是不是只能活在论文里?

正解DC-ASGD 原始论文用的是海森近似(对角近似、经验 Fisher),实践中还有更便宜的线性补偿——直接用参数差 $w_t - w_{t-\tau}$ 修正梯度,几乎零额外开销,效果已经很明显。工程是妥协的艺术,完整海森是理想,近似是家常便饭。

为何常见:看到二阶项就以为要算完整海森矩阵,其实论文和开源实现里都用了近似技巧,把“精确公式”当“实现要求”,是初学者常踩的坑。

面试题

Q1. 同步SGD与异步SGD的本质区别是什么?

单选题 · easy

  • A.异步算完梯度立即更新← 正确答案
  • B.同步完全不用梯度
  • C.同步必须使用单机
  • D.异步没有收敛性质

答案:A。异步SGD的核心是 worker 算完梯度立刻发给参数服务器更新,不用等别人;同步则要在屏障处等齐一批再平均。B 错在同步只是要等齐,不是不用梯度;C 错在同步完全支持多机;D 错在异步也有收敛性质,只是受延迟影响。好比火锅店同步是等所有助手到齐再动勺,异步是谁先到谁先递条子。

Q2. 梯度延迟 τ 的正确含义是什么?

单选题 · easy

  • A.梯度的数值大小
  • B.参与训练的工人数
  • C.计算步与应用步之差← 正确答案
  • D.一次迭代的总耗时

答案:C。延迟 τ 定义为梯度实际被应用的那一步 $t$ 与梯度被算出来的那一步 $t_0$ 之差。A 把梯度数值当延迟;B 把 worker 数当延迟;D 把单步耗时当延迟,都不是“相差几步”的概念。想象条子从出锅到上桌隔了几轮,隔的轮数才是 τ。

Q3. 参数服务器在异步训练中的主要职责是什么?

单选题 · easy

  • A.负责存储训练数据集
  • B.只负责数据预处理
  • C.代替工人计算梯度
  • D.统一维护模型参数← 正确答案

答案:D。参数服务器是分布式训练中集中存放并更新模型参数的节点,相当于火锅店主厨的位置。A 存储训练数据的是数据系统;B 只做预处理不是它的职责;C 梯度由 worker 计算,PS 不代劳。一句话:PS 是收条子、改配方的主厨。

Q4. 为什么延迟梯度会让训练不稳定?

单选题 · mid

  • A.延迟梯度是随机噪声
  • B.参数已变方向陈旧← 正确答案
  • C.延迟梯度数值过小
  • D.延迟梯度总是相反的

答案:B。延迟梯度基于旧参数算出,而参数在这期间已经更新多次,梯度方向自然陈旧甚至完全拧了。A 说它是随机噪声不准确,它是有偏的;C 说数值过小不对,延迟不代表数值小;D 说总是相反太绝对。好比按三分钟前的咸度给现在的汤加盐,方向很可能完全错了。

Q5. DC-ASGD 延迟补偿的核心思路是什么?

单选题 · mid

  • A.直接丢弃全部的延迟梯度
  • B.用二阶信息校正陈旧梯度← 正确答案
  • C.把学习率固定为最小值
  • D.人为增大延迟的数值

答案:B。DC-ASGD 用参数漂移量与二阶曲率(海森近似)把陈旧梯度修正到当前位置,B 正确。A 丢弃梯度浪费了算力;C 固定最小学习率不是补偿思路;D 增大延迟没有意义。相当于把凉掉的建议回锅换算成当前口味再采纳。

Q6. AdaDelay 算法调整学习率的依据是什么?

单选题 · mid

  • A.根据梯度延迟大小递减← 正确答案
  • B.根据损失值单调递增
  • C.根据批次大小随机变化
  • D.根据训练次数保持不变

答案:A。AdaDelay 让学习率随延迟 τ 增大而衰减,公式为 $\eta_t = \eta_0 / (1 + \lambda \tau_t)$。B 与损失挂钩的是其他策略;C 随机变化没有依据;D 保持不变就失去了延迟感知。越晚到的建议,用越小的勺子试探着加。

Q7. 以下哪些措施可以缓解异步梯度延迟问题?

多选题 · mid

  • A.延迟补偿修正梯度方向← 正确答案
  • B.采用延迟自适应学习率← 正确答案
  • C.限制并发的工人数量← 正确答案
  • D.盲目增大学习率数值

答案:ABC。延迟补偿修正方向、延迟自适应学习率控制步幅、限制 worker 数量控制平均延迟,都是标准对策;D 调大学习率会放大陈旧梯度的危害,适得其反。三种措施就像主厨的三种手艺:回锅、小勺、限客流。

Q8. 关于有效加速比公式 $S = N/(1+\bar{\tau})$,理解正确的是?

单选题 · hard

  • A.加速比随工人数线性增长
  • B.延迟增大会让收益递减← 正确答案
  • C.加速比与延迟毫无关系
  • D.加速比始终等于工人数

答案:B。公式显示分母恒大于 1,所以加速比 S 永远小于 worker 数 N,且平均延迟 $\bar{\tau}$ 越大收益越差。A 和 D 都假设线性增长,忽略了分母;C 说与延迟无关与公式直接矛盾。后厨人再多,走廊拥堵(τ̄ 大)也白搭。

Q9. 同步SGD训练的主要缺点有哪些?

多选题 · hard

  • A.等待最慢的工人同步← 正确答案
  • B.每次同步通信开销大← 正确答案
  • C.更新方向一定不准确
  • D.无法进行分布式部署

答案:AB。同步训练要在屏障处等所有 worker 的梯度到齐,木桶效应明显,且每次都要全局通信,开销大,A、B 正确。C 说同步方向不准是错的,同步方向恰恰最准;D 说无法分布式更是错误,同步是主流的分布式方案。

Q10. 延迟很大又不便补偿时,最稳妥的策略是什么?

单选题 · extreme

  • A.保持学习率不变训练
  • B.增加并发工人数量
  • C.调小学习率并监控损失← 正确答案
  • D.放弃异步改回同步

答案:C。延迟大又无法补偿时,调小学习率控制步幅并持续监控损失曲线是最稳妥的工程做法。A 保持学习率可能继续震荡;B 增并发只会让延迟更严重;D 放弃异步过于极端,调参和监控才是正道。好比汤偏咸时先减勺量试味道,而不是直接掀锅。