梯度累积(Gradient Accumulation)
生活随笔
收集整理的這篇文章主要介紹了
梯度累积(Gradient Accumulation)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
隨著深度學習模型參數量的增加,現有GPU加載一個深度模型(尤其是預訓練模型)后,剩余顯存無法容納很多的訓練數據,甚至會僅能容納一條訓練數據。
梯度累積(Gradient Accumulation)是一種不需要額外硬件資源就可以增加批量樣本數量(Batch Size)的訓練技巧。這是一個通過時間換空間的優化措施,它將多個Batch訓練數據的梯度進行累積,在達到指定累積次數后,使用累積梯度統一更新一次模型參數,以達到一個較大Batch Size的模型訓練效果。累積梯度等于多個Batch訓練數據的梯度的平均值。
TensorFlow 2.0中梯度累積的代碼實現:
# 給定累積次數 accum_steps = 5 # 模型訓練 for step, x_batch_train in enumerate(x_train):with tf.GradientTape() as tape:y_pred = model(x_batch_train,training=True)loss_value = loss_fn(y_batch_train, y_pred)# 計算梯度if step == 0:accum_grads = [tf.Variable(tf.zeros_like(tv), trainable=False) for tv in self.trainable_variables]accum_grads = [accum_grads[i].assign_add(grad / accum_batch) for i, grad in enumerate( self.grad_clipping( # 梯度裁剪tape.gradient(loss, self.trainable_variables), gard_theta))]# 參數更新if (step + 1) % accum_batch == 0:self.optimizer.apply_gradients(zip(accum_grads, self.trainable_variables))accum_grads = [tv.assign(tf.zeros_like(tv)) for tv in accum_grads]總結
以上是生活随笔為你收集整理的梯度累积(Gradient Accumulation)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Daily Accumulation
- 下一篇: Accumulation Degree