這篇文章主要介紹一些在深度學習模型訓練時的一些小技巧。
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能夠正常下降,但在後期難以收斂的情況下,就可以派上用場了。
根據官方api的解釋,遞減的公式為: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
)
這裡的decay_steps就是總的遞減步數,一般是訓練的總步數即num_train_steps。global_step = min(global_step, decay_steps)
decayed_learning_rate = (learning_rate - end_learning_rate) *
(1 - global_step / decay_steps) ^ (power) +
end_learning_rate
看到這裡, 相信有人就有疑問了:warmup和學習率遞減,這不是自相矛盾嗎?
確實,它們兩者是完全相反的思路,但是它們有各自不同的適用場景。
並且,在實際情況中,兩者是可以結合一起使用的,例如大名鼎鼎的bert
模型就是這麼幹的。但是,warmup一般在前10%-20%的訓練過程中,所以在前期對學習率影響較大的還是warmup,即專注於warmup,後期則是專注於lr_decar。
這樣即可以緩解初設階段對區域性資料的過擬合,也能緩解後期的動盪,提高網路的穩定性,增加模型收斂的可能性
適用場景:當你的梯度很容易出現**的情況下,這個時候就可以考慮使用梯度裁剪了。
根據官方api的解釋,梯度裁剪的公式為:# 獲取所有待更新引數
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)
)
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.收斂速度慢 學習率的設定 在訓練過程中,一般根據訓練輪數設...