機器學習:詳解多工學習(Multi-task learning)

Oten發表於2024-07-24

詳解多工學習

在遷移學習中,步驟是序列的,從任務\(A\)裡學習只是然後遷移到任務\(B\)。在多工學習中,是同時開始學習的,試圖讓單個神經網路同時做幾件事情,然後希望這裡每個任務都能幫到其他所有任務。

來看一個例子,假設在研發無人駕駛車輛,那麼無人駕駛車可能需要同時檢測不同的物體,比如檢測行人、車輛、停車標誌,還有交通燈各種其他東西。比如在左邊這個例子中,影像裡有個停車標誌,然後影像中有輛車,但沒有行人,也沒有交通燈。

如果這是輸入影像\(x^{(i)}\),那麼這裡不再是一個標籤 \(y^{(i)}\),而是有4個標籤。在這個例子中,沒有行人,有一輛車,有一個停車標誌,沒有交通燈。然後如果嘗試檢測其他物體,也許 \(y^{(i)}\)的維數會更高,現在就先用4個吧,所以 \(y^{(i)}\)是個4×1向量。如果從整體來看這個訓練集標籤和以前類似,將訓練集的標籤水平堆疊起來,像這樣\(y^{(1)}\)一直到\(y^{(m)}\)

\[Y = \begin{bmatrix} | & | & | & \ldots & | \\ y^{(1)} & y^{(2)} & y^{(3)} & \ldots & y^{(m)} \\ | & | & | & \ldots & | \\ \end{bmatrix} \]

不過現在\(y^{(i)}\)是4×1向量,所以這些都是豎向的列向量,所以這個矩陣\(Y\)現在變成\(4×m\)矩陣。而之前,當\(y\)是單實數時,這就是\(1×m\)矩陣。

那麼現在可以做的是訓練一個神經網路,來預測這些\(y\)值,就得到這樣的神經網路,輸入\(x\),現在輸出是一個四維向量\(y\)。請注意,這裡輸出畫了四個節點,所以第一個節點就是想預測圖中有沒有行人,然後第二個輸出節點預測的是有沒有車,這裡預測有沒有停車標誌,這裡預測有沒有交通燈,所以這裡\(\hat y\)是四維的。

要訓練這個神經網路,現在需要定義神經網路的損失函式,對於一個輸出\(\hat y\),是個4維向量,對於整個訓練集的平均損失:

\(\frac{1}{m}\sum_{i = 1}^{m}{\sum_{j = 1}^{4}{L(\hat y_{j}^{(i)},y_{j}^{(i)})}}\)

\(\sum_{j = 1}^{4}{L(\hat y_{j}^{(i)},y_{j}^{(i)})}\)這些單個預測的損失,所以這就是對四個分量的求和,行人、車、停車標誌、交通燈,而這個標誌L指的是logistic損失,就這麼寫:

\(L(\hat y_{j}^{(i)},y_{j}^{(i)}) = - y_{j}^{(i)}\log\hat y_{j}^{(i)} - (1 - y_{j}^{(i)})log(1 - \hat y_{j}^{(i)})\)

整個訓練集的平均損失和之前分類貓的例子主要區別在於,現在要對\(j=1\)到4求和,這與softmax迴歸的主要區別在於,與softmax迴歸不同,softmax將單個標籤分配給單個樣本。

而這張圖可以有很多不同的標籤,所以不是說每張圖都只是一張行人圖片,汽車圖片、停車標誌圖片或者交通燈圖片。要知道每張照片是否有行人、或汽車、停車標誌或交通燈,多個物體可能同時出現在一張圖裡。實際上,那張圖同時有車和停車標誌,但沒有行人和交通燈,所以不是隻給圖片一個標籤,而是需要遍歷不同型別,然後看看每個型別,那類物體有沒有出現在圖中。所以就說在這個場合,一張圖可以有多個標籤。如果訓練了一個神經網路,試圖最小化這個成本函式,做的就是多工學習。因為現在做的是建立單個神經網路,觀察每張圖,然後解決四個問題,系統試圖告訴,每張圖裡面有沒有這四個物體。另外也可以訓練四個不同的神經網路,而不是訓練一個網路做四件事情。但神經網路一些早期特徵,在識別不同物體時都會用到,然後發現,訓練一個神經網路做四件事情會比訓練四個完全獨立的神經網路分別做四件事效能要更好,這就是多工學習的力量。

另一個細節,到目前為止,是這麼描述演算法的,好像每張圖都有全部標籤。事實證明,多工學習也可以處理影像只有部分物體被標記的情況。所以第一個訓練樣本,說有人,給資料貼標籤的人告訴裡面有一個行人,沒有車,但他們沒有標記是否有停車標誌,或者是否有交通燈。也許第二個例子中,有行人,有車。但是,當標記人看著那張圖片時,他們沒有加標籤,沒有標記是否有停車標誌,是否有交通燈等等。也許有些樣本都有標記,但也許有些樣本他們只標記了有沒有車,然後還有一些是問號。

即使是這樣的資料集,也可以在上面訓練演算法,同時做四個任務,即使一些影像只有一小部分標籤,其他是問號或者不管是什麼。然後訓練演算法的方式,即使這裡有些標籤是問號,或者沒有標記,這就是對\(j\)從1到4求和,就只對帶0和1標籤的\(j\)值求和,所以當有問號的時候,就在求和時忽略那個項,這樣只對有標籤的值求和,於是就能利用這樣的資料集。

那麼多工學習什麼時候有意義呢?當三件事為真時,它就是有意義的。

第一,如果訓練的一組任務,可以共用低層次特徵。對於無人駕駛的例子,同時識別交通燈、汽車和行人是有道理的,這些物體有相似的特徵,也許能幫識別停車標誌,因為這些都是道路上的特徵。

第二,這個準則沒有那麼絕對,所以不一定是對的。但從很多成功的多工學習案例中看到,如果每個任務的資料量很接近,還記得遷移學習時,從\(A\)任務學到知識然後遷移到\(B\)任務,所以如果任務\(A\)有1百萬個樣本,任務\(B\)只有1000個樣本,那麼從這1百萬個樣本學到的知識,真的可以幫增強對更小資料集任務\(B\)的訓練。那麼多工學習又怎麼樣呢?在多工學習中,通常有更多工而不僅僅是兩個,所以也許有,以前有4個任務,但比如說要完成100個任務,而要做多工學習,嘗試同時識別100種不同型別的物體。可能會發現,每個任務大概有1000個樣本。所以如果專注加強單個任務的效能,比如專注加強第100個任務的表現,用\(A100\)表示,如果試圖單獨去做這個最後的任務,只有1000個樣本去訓練這個任務,這是100項任務之一,而透過在其他99項任務的訓練,這些加起來可以一共有99000個樣本,這可能大幅提升演算法效能,可以提供很多知識來增強這個任務的效能。不然對於任務\(A100\),只有1000個樣本的訓練集,效果可能會很差。如果有對稱性,這其他99個任務,也許能提供一些資料或提供一些知識來幫到這100個任務中的每一個任務。所以第二點不是絕對正確的準則,但通常會看的是如果專注於單項任務,如果想要從多工學習得到很大效能提升,那麼其他任務加起來必須要有比單個任務大得多的資料量。要滿足這個條件,其中一種方法是,比如右邊這個例子這樣,或者如果每個任務中的資料量很相近,但關鍵在於,如果對於單個任務已經有1000個樣本了,那麼對於所有其他任務,最好有超過1000個樣本,這樣其他任務的知識才能幫改善這個任務的效能。

最後多工學習往往在以下場合更有意義,當可以訓練一個足夠大的神經網路,同時做好所有的工作,所以多工學習的替代方法是為每個任務訓練一個單獨的神經網路。所以不是訓練單個神經網路同時處理行人、汽車、停車標誌和交通燈檢測。可以訓練一個用於行人檢測的神經網路,一個用於汽車檢測的神經網路,一個用於停車標誌檢測的神經網路和一個用於交通訊號燈檢測的神經網路。那麼研究員Rich Carona幾年前發現的是什麼呢?多工學習會降低效能的唯一情況,和訓練單個神經網路相比效能更低的情況就是神經網路還不夠大。但如果可以訓練一個足夠大的神經網路,那麼多工學習肯定不會或者很少會降低效能,都希望它可以提升效能,比單獨訓練神經網路來單獨完成各個任務效能要更好。

所以這就是多工學習,在實踐中,多工學習的使用頻率要低於遷移學習。看到很多遷移學習的應用,需要解決一個問題,但訓練資料很少,所以需要找一個資料很多的相關問題來預先學習,並將知識遷移到這個新問題上。但多工學習比較少見,就是需要同時處理很多工,都要做好,可以同時訓練所有這些任務,也許計算機視覺是一個例子。在物體檢測中,看到更多使用多工學習的應用,其中一個神經網路嘗試檢測一大堆物體,比分別訓練不同的神經網路檢測物體更好。但說,平均來說,目前遷移學習使用頻率更高,比多工學習頻率要高,但兩者都可以成為強力工具。

所以總結一下,多工學習能讓訓練一個神經網路來執行許多工,這可以給更高的效能,比單獨完成各個任務更高的效能。但要注意,實際上遷移學習比多工學習使用頻率更高。看到很多工都是,如果想解決一個機器學習問題,但資料集相對較小,那麼遷移學習真的能幫到,就是如果找到一個相關問題,其中資料量要大得多,就能以它為基礎訓練神經網路,然後遷移到這個資料量很少的任務上來。

相關文章