大模型高效训练基础知识:梯度累积(Gradient Accumulationn)

梯度累积

梯度累积(Gradient Accumulation)的基本思想是将一次性的整批参数更新的梯度计算变为以一小步一小步的方式进行(如下图),具体而言该方法以小批次的方式进行模型前向传播和反向传播,过程中迭代计算多个小批次梯度并累加,当累积到足够多的梯度时,执行模型的优化步骤更新参数。这也是一种典型的时间换空间的做法,即我们可以实现在有限的GPU内存上更新大量参数,不过额外添加的小批次前向传播和后向传播会使得训练速度变慢一些。
在这里插入图片描述
参数更新方式可以使用随机梯度下降(Stochastic Gradient Descent)为例进行说明:

使用global batch(即全批次)训练时,参数更新公式为:
V t = V t − 1 − l r ∗ g r a d V_t=V_{t-1}-l_{r}*grad Vt=Vt1lrgrad
简化公式, V V V表示参数集, l r l_r lr表示学习率, g r a d grad grad表示全批次梯度。

使用梯度累积的mini-batch(即小批次)训练时,参数更新公式为:
V t = V t − 1 − l r ∗ ∑ i = 0 N g r a d i V_t=V_{t-1}-l_{r}*\sum_{i=0}^{N}grad_i Vt=Vt1lri=0Ngradi
g r a d i grad_i gradi表示第 i i i个批次反向传播时计算的梯度。

Transformers框架中开启梯度累积非常简单,仅需在TrainingArguments内指定累积步长即可:

training_args = TrainingArguments(
    per_device_train_batch_size=1, gradient_accumulation_steps=4, gradient_checkpointing=True, **default_args
)

trainer = Trainer(model=model, args=training_args, train_dataset=ds)
result = trainer.train()

参考文献

  1. Gradient Accumulation
  2. 聊聊梯度累加(Gradient Accumulation)
  3. 梯度累积算法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值