深度學習模型訓練小技巧

2021-10-24 07:22:38 字數 2835 閱讀 7620

這篇文章主要介紹一些在深度學習模型訓練時的一些小技巧。

warmup可以理解為預熱、熱身的意思,它的思想是一開始以較小的學習率去更新引數,然後逐步提高學習率。

這樣的好處是:

有助於減緩模型在初始階段對mini-batch的提前過擬合現象,保持分布的平穩;

有助於保持模型深層的穩定性。

# 線性warmup

# num_warmup_steps:warmup的步數

# init_lr:預設的學習率

global_step = tf.train.get_or_create_global_step(

)global_steps_int = tf.cast(global_step, tf.int32)

warmup_steps_int = tf.constant(num_warmup_steps, dtype=tf.int32)

global_steps_float = tf.cast(global_steps_int, tf.float32)

warmup_steps_float = tf.cast(warmup_steps_int, tf.float32)

warmup_percent_done = global_steps_float / warmup_steps_float

warmup_learning_rate = init_lr * warmup_percent_done

is_warmup = tf.cast(global_steps_int < warmup_steps_int, tf.float32)

learning_rate =((

1.0- is_warmup)

* learning_rate + is_warmup * warmup_learning_rate)

為什麼需要學習率遞減呢?因為當我們的模型在接近最優點的時候,過大的學習率會導致一直在最優點附近動盪,難以找到最優點,甚至可能會逃離,這個時候就需要以較小的學習率才能找到最優點,換另一種說法:這個時候我們的網路已經趨於穩定了,過大的學習率會破壞網路的穩定性。

適用場景:通過上述的理解,當我們的模型在前期loss能夠正常下降,但在後期難以收斂的情況下,就可以派上用場了。

global_step = tf.train.get_or_create_global_step(

)# learning_rate:初設的學習率

# num_train_steps:總的訓練次數

# end_learning_rate:學習率最終降為多少

# power:決定遞減的幅度

# cycle:當學習率遞減為end_learning_rate時,是否開始新的一輪遞減

learning_rate = tf.train.polynomial_decay(

learning_rate,

global_step,

num_train_steps,

end_learning_rate=

0.0,

power=

1.0,

cycle=

false

)

根據官方api的解釋,遞減的公式為:

global_step = min(global_step, decay_steps)

decayed_learning_rate = (learning_rate - end_learning_rate) *

(1 - global_step / decay_steps) ^ (power) +

end_learning_rate

這裡的decay_steps就是總的遞減步數,一般是訓練的總步數即num_train_steps。

看到這裡, 相信有人就有疑問了:warmup和學習率遞減,這不是自相矛盾嗎?

確實,它們兩者是完全相反的思路,但是它們有各自不同的適用場景。

並且,在實際情況中,兩者是可以結合一起使用的,例如大名鼎鼎的bert模型就是這麼幹的。但是,warmup一般在前10%-20%的訓練過程中,所以在前期對學習率影響較大的還是warmup,即專注於warmup,後期則是專注於lr_decar。

這樣即可以緩解初設階段對區域性資料的過擬合,也能緩解後期的動盪,提高網路的穩定性,增加模型收斂的可能性

適用場景:當你的梯度很容易出現**的情況下,這個時候就可以考慮使用梯度裁剪了。

# 獲取所有待更新引數

tvars = tf.trainable_variables(

)# 計算所有引數的梯度

# loss:your loss

grads = tf.gradients(loss, tvars)

# 對梯度進行裁剪

(grads, _)

= tf.clip_by_global_norm(grads, clip_norm=

1.0)

optimizer = tf.train.gradientdescentoptimizer(

0.1)

# 進行梯度下降

zip(grads, tvars)

)

根據官方api的解釋,梯度裁剪的公式為:

grads[i] = grads[i] * clip_norm / max(global_norm, clip_norm)

global_norm = sqrt(sum([l2norm(t)**2 for t in grads]))

l2norm(t) = sqrt(sum(t ** 2))

caffe模型訓練小技巧

一 學習率調整 乙個對於排程學習率的建議 如果在驗證集上效能不再增加就讓學習率除以2或者5,然後繼續,學習率會一直變得很小,到最後就可以停止訓練了 二 finetun微調 finetune的過程相當於繼續訓練,跟直接訓練的區別是初始化的時候 a.直接訓練是按照網路定義指定的方式初始化 如高斯隨機初始...

深度檢測模型比賽訓練技巧(Tricks)

離線增強 直接對資料集進行處理,資料的數目會變成增強因子 原資料集的數目,這種方法常常用於資料集很小的時候 warmup 訓練初期由於離目標較遠,一般需要選擇大的學習率,但是使用過大的學習率容易導致不穩定性。所以可以做乙個學習率熱身階段,在開始的時候先使用乙個較小的學習率,然後當訓練過程穩定的時候再...

深度學習 網路訓練技巧

1.1 學習率 learning rate 學習率 是控制模型學習效率 步長 的權重。學習率的大小區分區別 學習率大 學習率小 學習速度快慢 應用場合 訓練初期 數次epoch過後 缺點1.容易損失過大 2.容易發生振盪 1.容易過擬合 2.收斂速度慢 學習率的設定 在訓練過程中,一般根據訓練輪數設...