博客 / 詳情

返回

吳恩達深度學習課程三: 結構化機器學習項目 第二週:誤差分析與學習方法(四)多任務學習

此分類用於記錄吳恩達深度學習課程的學習筆記。
課程相關信息鏈接如下:

  1. 原課程視頻鏈接:[雙語字幕]吳恩達深度學習deeplearning.ai
  2. github課程資料,含課件與筆記:吳恩達深度學習教學資料
  3. 課程配套練習(中英)與答案:吳恩達深度學習課後習題與答案

本篇為第三課的第二週內容,2.8的內容。


本週為第三課的第二週內容,本週的內容關於在上週的基礎上繼續展開,並拓展介紹了幾種“學習方法”,可以簡單分為誤差分析和學習方法兩大部分。
其中,對於後者的的理解可能存在一些難度。同樣,我會更多地補充基礎知識和實例來幫助理解。
本篇的內容關於多任務學習,同樣是在模型學習方式上的一種拓展。

1. 多任務學習

在上一篇的遷移學習中,我們知道,把一個任務的模型遷移到另一個任務中應用的前提是:兩個任務的低層次特徵十分相似

現在在這個點子的啓發下,又有人提出了新的想法:

既然多個任務的底層特徵十分相似,那能不能在一個網絡裏同時訓練針對這多個任務的模型?

這就是多任務學習的基本思想
理解多任務學習,你可以把它想象成讓同一個大腦,同時學會幾件相互關聯的事情
在深度學習中,就是用一個模型,同時去做多個任務,而不是每個任務都訓練一個獨立模型。
為什麼要這樣做? 原因就是上面提到的,因為一些任務之間其實共享着大量底層特徵

舉個例子:
在這種共享基礎的前提下,單任務學習就像讓學生分別學習語文、歷史、寫作,但明明這些科目都依賴閲讀理解能力,結果你卻讓他重複學三遍閲讀方法,顯然不高效。

可能還是不太清楚,下面我們用課程裏一個非常典型的例子來説明:

1.1 自動駕駛系統的路面識別

假設你正在開發一個自動駕駛系統,它需要識別:

  1. 行人檢測
  2. 紅綠燈識別
  3. 路標識別
  4. 車輛檢測

現在,如果你為這些任務分別訓練 4 個模型,那麼它們都會學到:

  • 圖像邊緣
  • 物體輪廓
  • 顏色分佈
  • 基本幾何形狀

而這些“底層特徵”本質上是一樣的。
在這時,多任務學習的做法是:讓模型的前幾層共享,後面的部分再根據不同任務分頭進行。

繼續上面的學生上課的例子,多任務學習就像:
先讓學生統一上“基礎課”(數學、邏輯、閲讀),然後再按照專業分流各學科。

這樣做有三個顯著好處:

  • 底層特徵共享,訓練更快
  • 多個任務互相幫助,提高泛化能力
  • 不用為每個任務單獨準備海量數據

尤其是當某些任務數據較少時,多任務學習往往能讓弱任務因為“借到其他任務的經驗”而表現更好。
瞭解了多任務學習的概念後,我們來看看它的適用範圍。

1.2 何時適合多任務學習?

多任務學習不是萬能的,它在以下條件下最有效:

  • 多個任務之間具有相關性
  • 它們共享大量底層結構(如共同處理圖像、共同處理語音)。
  • 數據量有限,希望通過共享知識彌補某個任務的不足。

此外,機器終究是由我們人設計的,因此,對於是否適用多任務學習,一個最符合直覺的判斷方式就是:如果一個人掌握任務 A 的知識後會更容易學會任務 B,那機器學習模型也可能如此。

例如:

  • 識別貓的種類 + 判斷貓的姿勢
  • OCR 文本識別 + 文本方向校正
  • 情感分析 + 主題分類
  • 車道檢測 + 路面分割

但如果任務之間差異很大,比如“人臉識別”和“花卉識別”,強行多任務反而會變成負擔,讓模型不知道優先學習什麼,最終效果反而變差。
現在,我們就來看看到底如何實現多任務學習。

1.3 多任務學習的實現邏輯

實際上,我們在多值預測與多分類那一節裏就簡單提到過這部分內容,現在才正式展開。
回憶一下最初的內容,在單任務學習中,我們的數據通常表示為一組樣本對:

\[(x^{(i)}, y^{(i)}) \]

其中

  • \(x^{(i)}\) 是輸入樣本
  • \(y^{(i)}\) 是樣本對應的“單個任務標籤”

但在自動駕駛系統中,一張路面圖片往往需要同時識別多個內容,這意味着對同一個輸入 \(x^{(i)}\),原本只有一個標籤,現在變成了多個標籤

在開始前,再用我們的貓狗分類器舉例再理解一下這句話:
原本我們的數據集樣本中只會存在貓或者狗中的一種,相應的標籤自然就只有貓或狗。
現在任務改變,樣本中出現了貓和狗的“合照”,標籤自然也會增加,實現同時識別貓和狗的多任務學習。

舉完這個簡單的例子後,我們來正式展開這一部分。

(1) 多個任務的標籤如何組織?

繼續用前面的自動駕駛例子。現在一張圖像 \(x^{(i)}\),我們需要它同時給出:

  1. 有沒有行人(是/否)
  2. 有沒有車輛(是/否)
  3. 有沒有路標(是/否)
  4. 有沒有紅綠燈(是/否)

這裏先強調一下,我們只是使用這個語境來了解多任務學習,實際邏輯遠比這要複雜

現在,單任務的標籤 \(y^{(i)}\) 就不夠用了,我們需要讓它變成一“組”標籤,就像這樣:

\[y^{(i)} = (y^{(i)}_1, y^{(i)}_2, y^{(i)}_3, y^{(i)}_4) \]

其中 :

  • \(y^{(i)}_1\):行人檢測
  • \(y^{(i)}_2\):車輛檢測
  • \(y^{(i)}_3\):路標檢測
  • \(y^{(i)}_4\):紅綠燈檢測

於是,從結構上看,\(y^{(i)}\) 就不再是一個標量,而是一個代表“任務集合”的向量。

來看一個實例:
假設現在有一張路口照片 \(x^{(i)}\),內容如下:

  • 畫面中有行人
  • 畫面中也有車輛
  • 沒有看到任何路標。
  • 畫面中有紅綠燈

那麼,這張圖片的多任務標籤就是:

\[y^{(i)} = (1, 1,0, 1) \]

而如果讓任務再複雜一些,我們還會具體對紅綠燈進行三分類,於是又加入了獨熱編碼,例如:

\[\text{green} = (0, 0, 1) \]

在這種情況下,這張圖片的最終標籤就變成了:

\[y^{(i)} = (1, 1, 0, (0, 0, 1)) \]

總之,一個輸入 \(x^{(i)}\),多行標籤一起出現,這就是多任務學習在標籤維度上的直接體現。

説到這裏,你可能會有這樣一個問題,多任務學習與應用獨熱編碼的多分類都把標籤從標量變成了向量,這不會混淆嗎? 我們在這個問題上簡單展開一下。

(2)多標籤與應用獨熱編碼的多分類辨析:互斥性

在多任務學習中,經常會看到這樣的表達:

  • 某些任務是“多標籤”
  • 某些任務會用獨熱編碼
  • 兩者都長得像一串 \((0,1)\) 組成的向量

就像剛剛的:

\[y^{(i)} = (1, 1, 0, (0, 0, 1)) \]

雖然它們看起來很像,但本質完全不同
依舊以自動駕駛為例,你要判斷一張圖片裏:

  • 有沒有人(是/否)
  • 有沒有車(是/否)
  • 有沒有路標(是/否)
  • 有沒有紅綠燈(是/否)

這四件事之間互不影響
畫面裏可以同時出現行人 + 車輛 + 紅綠燈,也可以一個都沒有。
因此,每個標籤都是一個獨立的二分類任務:

\[y^{(i)} = (y^{(i)}_1, y^{(i)}_2, y^{(i)}_3, y^{(i)}_4),\quad y^{(i)}_k \in {0,1} \]

這裏的四個 \(y^{(i)}_k\) 都是“自由的”,可以同時為 1
也就是説多任務學習的任務間沒有互斥性,sigmoid更適用這種邏輯。

現在再説説多分類
紅綠燈狀態只有三種:紅、黃、綠 。
它們不能同時出現,因此需要用獨熱編碼:

\[\text{red}=(1,0,0),\quad \text{yellow}=(0,1,0),\quad \text{green}=(0,0,1) \]

這個編碼的特點是:存在互斥性,向量中只能出現一個 1,因此通常接 softmax 激活函數。
如果你有點忘了,它第一次出現在這裏:獨熱編碼
因此,這不是“多標籤”,而是“單標籤多分類”。

總結一下,區分二者的關鍵就是標籤間的互斥性,即是否允許多個標籤同時為 1。
能同時為 1 的就是“多標籤”,不能同時為 1 的就是“多分類(獨熱編碼)”。

(2) 多任務學習的模型結構長什麼樣?

我們先按照課程裏的內容,看一看最簡單的多任務學習模型長什麼樣子。
image.png
很顯然,這和我們之前的模型並沒有什麼區別,只是根據任務要求給輸出層的每個節點匹配了不同的語義。實際上,在真正的多任務學習裏,這種結構略顯簡陋。
現在我們來看下一步擴展:
image.png

這種結構就是和上面的最大區別就在於這種“前面共享、後面分頭”的結構。
模型最前面的幾層負責提取底層特徵,之後,不同任務會接上不同的“小網絡模塊”,我們稱為 task head(任務頭)。
在這裏就是:

  • 行人檢測 head:判斷有沒有行人
  • 車輛檢測 head:判斷有沒有車
  • 路標檢測 head:判斷是否存在路標
  • 紅綠燈 head:做紅/黃/綠的分類

這四個任務頭不會共享參數,它們各自學習怎麼從底層特徵裏找出與自己任務相關的特徵。
所以多任務結構能帶來:

  • 訓練更快(底層共享)
  • 泛化更強(任務間互相幫助)
  • 對少數據任務更友好(能借其他任務的信息)

繼續打比方:
模型前面像一位“通識教育老師”教基礎知識;
模型後面像四位“專業課老師”分別教行人檢測、車輛檢測、路標識別、紅綠燈識別。

正向傳播説完了,現在來看看反向傳播。

(3)多任務模型的損失函數整合

現在,每個任務都有自己的損失:

\[L_1, L_2, L_3, L_4 \]

而多任務學習的整體目標是同時優化所有任務,因此最終損失通常是:

\[L = L_1 + L_2 + L_3 + L_4 \]

與此同時,不同任務可能重要性不同,因此有時會給部分任務更大的權重:

\[L = \alpha_1 L_1 + \alpha_2 L_2 + \alpha_3 L_3 + \alpha_4 L_4 \]

你可以把它理解成學生的期末總成績由多門課程的成績共同決定,有的科目是必修,就權重更高。

最後,多任務學習就像一棵樹:

  • 根和樹幹:共享的前幾層(基本特徵提取)
  • 分叉的樹枝:根據不同任務分成多個 “Head”
  • 每個任務的輸出葉子:分類、迴歸或特定目標
    因此這種結構也被稱為 Shared-bottom(共享底層)模型

2.總結

概念 原理 比喻
多任務學習的適用條件 多個任務需要共享大量底層特徵;任務之間具有關聯性;數據量有限時共享結構能互相補充。 像學生學習語文、歷史、寫作,三者都依賴閲讀能力,因此可以在同一門“基礎課”中打底,再各自深入。
多標籤(多任務) vs. 獨熱編碼多分類 多標籤任務中,每個標籤彼此獨立,可以同時為 1;獨熱編碼多分類具有互斥性,只能出現一個 1。 多標籤:一個人可以同時“會游泳、會跑步”;獨熱編碼:一個人“只能是男或女,不會同時是兩者”。
多任務學習的標籤結構 單一標籤由標量變成向量:\(y^{(i)} = (y^{(i)}_1, y^{(i)}_2, \dots)\);互相獨立,各自對應不同的任務頭。 就像一次體檢,一項檢查報告裏同時包含身高、體重、視力、血壓,每一項互不干擾。
共享底層 + 多任務 Head 的結構 模型前幾層負責學習共同底層特徵;後面不同 Head 僅負責學習自己任務特有的模式。 前面像“通識課老師”教基礎知識;後面像“專業課老師”各自教授專項技能。
多任務損失函數的組合方式 多任務損失通常相加:\(L = L_1 + L_2 + L_3 + \dots\);必要時加入權重:\(L = \alpha_1 L_1 + \alpha_2 L_2 + \dots\) 像期末總成績由語數外等各科成績共同組成,有些科目(如數學)權重更高。
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.