多工深度學習的三個經驗教訓

2021-09-19 18:21:56 字數 2471 閱讀 8287

在過去的一年裡,我和我的團隊一直致力於提高 taboola feed 的個性化使用者體驗。我們使用多工學習(mtl)來**同一組輸入特性上的多個關鍵效能指標(kpis),並在 tensorflow 中實現了乙個深度學習(dl)模型。但是,在我們開始著手這項研究的時候,mtl 對我們來說比現在複雜得多,所以我想分享一些經驗教訓。

在本文中,我將分享一些在神經網路(nn)中實現 mtl 時具體需要考慮哪些方面的問題,我還將對這些問題提出簡單的 tensorflow 解決方案。

我們想從硬引數共享(hard parameter sharing)的基本方法開始。硬共享意味著我們有乙個共享子網,這個子網是特定於任務的。

經驗 1-損失合併

我們在 mtl 模型中遇到的第乙個挑戰是為多個任務定義單個損失函式。雖然單個任務有定義明確的損失函式,但多個任務會帶來多個損失。

我們最開始嘗試的做法是直接將所有的損失相加。不久我們就發現,當乙個任務趨同於好的結果時,其他任務看起來相當糟糕。造成這個現象的原因很簡單,因為損失的規模是如此的不同,以至於乙個任務主導了整個損失,而其餘的任務沒有機會影響共享層的學習過程。

乙個快速的解決辦法是用乙個加權和替代損失的直接相加和,使所有的損失對共享層的影響大致相同。然而,這個解決方案涉及另乙個超引數,可能需要每隔一段時間調整一次。

幸運的是,我們發現了一篇很棒的**,**建議使用不確定性來衡量 mtl 中的損失。具體方法是學習另乙個雜訊引數,該引數整合在每個任務的損失函式中。這允許 mtl 中有多個任務,並使所有損失達到相同的規模。

通過這種方法,不僅可以得到比加權和更好的結果,而且不需要考慮附加的權重超引數。這篇**的作者還提供了乙個 keras 實現方法。

經驗 2-調整學習速率

學習速率是調節神經網路最重要的超引數之一,這是乙個常見的規律。所以我們嘗試了調優,發現了對不同任務來說最優的除錯速率。選擇較高的學習率會導致其中乙個任務的 dying relu,而使用較低的學習率會導致另乙個任務的收斂緩慢。那我們該怎麼辦?我們可以讓每個特定於任務的子網調整為單獨的學習速率,並將共享子網調整為另乙個速率。

雖然這聽起來很複雜,但實際上相當簡單。通常,在 tensorflow 中訓練神經網路時,您可以使用如下方法:

optimizer = tf.train.adamoptimizer(learning_rate).minimize(loss)

adamoptimizer 定義了應該如何應用漸變,並最小化計算並應用它們。我們可以用自己的實現來代替最小化,該實現將對計算圖中的每個變數使用適當的學習速率:

all_variables = shared_vars + a_vars + b_vars

all_gradients = tf.gradients(loss, all_variables)

shared_subnet_gradients = all_gradients[:len(shared_vars)]

a_gradients = all_gradients[len(shared_vars):len(shared_vars + a_vars)]

b_gradients = all_gradients[len(shared_vars + a_vars):]

shared_subnet_optimizer = tf.train.adamoptimizer(shared_learning_rate)

a_optimizer = tf.train.adamoptimizer(a_learning_rate)

b_optimizer = tf.train.adamoptimizer(b_learning_rate)

train_op = tf.group(train_shared_op, train_a_op, train_b_op)

另外,這個技巧實際上也可以應用於單任務網路。

經驗 3-使用評估作為特徵

一旦我們通過了建立**多個任務的 nn 的第乙個階段,我們可能會將某個任務的評估作為另乙個任務的結果。這個估計是張量,所以我們可以像連線其他層的輸出一樣連線它。但是在反向傳播中會發生什麼呢?

假設任務 a 的估計值作為乙個特性傳遞給任務 b。我們可能並不想將梯度從任務 b 傳回任務 a,因為我們已經給了任務 a 標籤。

別擔心,tensorflow 的 api 有 tf.stop_gradient,它正是為了解決這個問題而存在的。當計算梯度時,它可以讓你傳遞乙個張量列表,你想把它當作常數,這正是我們所需要的。

all_gradients = tf.gradients(loss, all_variables, stop_gradients=stop_tensors)

同樣地,這在 mtl 網路中很有用,但它不僅僅在 mtl 網路中有用。只要您想用 tensorflow 計算乙個值,並且需要假設該值是乙個常量,就可以使用此技術。例如,當訓練生成對抗網路(gans)時,您不希望在生成對抗性網路的過程中進行反向傳播。

via:

有關機器學習的 12 個經驗教訓

這篇文章講述了機器學習研究人員和從業人員總結的 12 個關鍵經驗教訓,包括如何避免陷阱,重點問題以及常見問題的答案。機器學習可以通過一些例子,然後從中歸納出規律來解決重要問題。在手動程式設計 硬編碼 不使用的情況下,這種方法通常是非常有效的,而且非常經濟。隨著更多的資料可以使用,我們可以解決更多雄心...

企業應用AI和機器學習的經驗教訓

從幫助企業加速ai ml歷程中獲得的卑微的見解。從我的ai 機器學習歷程中學到的教訓 我最近有幸與幾位ai 機器學習專家一起參加了小組討論。有很多偉大的問題,但大多數與如何在大型組織中最有效地建立ai 機器學習 ai ml 有關。這使我有機會反思自己的經驗,以幫助大型企業加速其ai 機器學習之旅,並...

Win7任務計畫使用的經驗教訓

1 注意在上圖配置處選擇你的電腦的系統版本 這一點覺得很有問題,難道就不能自動獲取系統版本嗎?而且這個任務計畫每次預設都是vista,一旦選錯了,不能正常執行。2 在安全選項裡面選擇 不管使用者是否登入都要執行 可能會造成程式執行時,不顯示介面。建議winform程式選擇 只在使用者登入時執行 3 ...