2021 Domain Adaptation(李宏毅
在前面介紹的模型中,一般我們都會假設訓練資料和測試資料符合相同的分布。而如果訓練資料和測試資料是來自于不同的分布,這樣就會讓模型在測試集上的效果很差,這種問題稱為Domain shift。(域的轉變)
Domain Adaptation領域自適應學習,就是將在A domain上學到的東西應用到B domain上,這個技術 也可以看作是transfer learning的其中一個環節(在A任務上學到的技能可以用到B任務上)。
?
?Domain Shift,其實有很多種不同的類型:
模型輸入的資料的分布有變化(源域黑白,目標域彩色)
輸出的分布也可能有變化(源域均勻分布,目標域極端分布)
輸入跟輸出雖然分布可能是一樣的,但它們之間的關係變了(源域中叫做“0”,目標域中叫做"1")
今天只專注在,輸入資料不同的 Domain Shift 的上面。
Source Domain 是我們的訓練資料,Target Domain 是我們的測試資料.
那么對于?Domain Shift的問題,具體的做法隨著我們對于目標領域的了解程度不同而不同,主要有以下幾種情況:
1、少量有標注的目標領域資料
處理思想:先用原始資料訓練一個模型,然后用目標資料對模型進行微調,類似于BERT,只稍微跑個兩 三個(Edpa)就足夠了。
處理遇到的困難:因為target domain的資料非常少,不要跑太多iteration,否則可能會 Overfit 到 Target 的這些少量的資料上。為了避免Overfit的情況,有很多solution,比如說 把 Learning Rate 調小一點,要讓微調前后模型參數不要差很多,或者讓微調前后模型輸入和輸出的關系不要差很多,等等方法。
2、大量無標注的目標領域資料
怎麼找出這樣一個?Feature Extractor ?
其實我們可以 把一個一般的 Classifier,就分成 Feature Extractor,跟 Label Predictor 兩個部分
(用 Domain Adversarial Training時,你要把一個Classifier里 哪幾層當作 Feature Extractor,? Label Predictor, 這個是你自己決定的 )
如何訓練Feature Extractor,跟 Label Predictor?
我們把 Feature Extractor 的 Output 拿出來看,希望兩個 Domain 的圖片丟進去產生的 Feature,它們看起來分不出差異。
那怎么讓紅色和藍色的點 分不出差異?就需要Domain Adversarial Training技術:
?訓練一個domain classifier,二元分類器
而 Feature Extractor 它學習的目標,就是要去想辦法騙過這個 Domain Classifier,讓它分辨不出來。(與Generative Adversaria Network (GAN)很相似)
(Domain Adversarial Training最早的paper是發表在 2015 年的 ICML 上面、比 Gan 還要稍微晚一點點、不過它們幾乎可以說是同時期的作品)
用 表示各個模型的參數,右邊兩個式子是找出能使loss最小的 ,目的是找出能讓predictor和classifier分類越正確的模型參數。左邊的式子就是站在predictor這邊桶classifier一刀。
?但是左邊這個式子存在問題,本來是想用 -Ld來表示讓classifier分不清向量來源。但是 -Ld不也可以用來表示誤判嗎,把source誤判為target,
所以這未必是最好的做法,當然這招還是有用的。
?剛才這整套想法,還是有一個限制,我們看下面的問題:
?那我們今天訓練的目標,就是要讓這些正方形它的分布,跟這個圈圈三角形合起來的分布越接近越好,所以我們是不是應該要讓右邊的狀況發生 (就是希望類對齊),而避免讓左邊的狀況發生呢?
一個可能的想法是,我們既然知道藍色的圈圈跟藍色的三角形它們的分界點在哪里,那我們應該要讓這些方形(雖然我們不知道它是哪一個類別),但我們讓這些方形遠離這一個分界點,這在文獻上就有很多不同的做法。
一個最簡單的做法是,我有很多 Unlabeled 的圖片,丟到 Feature Extractor,再丟到 Label Predictor 以后,我不知道它是哪一個類別,但是我希望它離 Boundary 越遠越好
如果今天輸出的結果非常地集中,叫做離 Boundary 遠
如果今天輸出的結果每一個類別都非常地接近,叫做離 Boundary 近
?
我們到目前為止,好像都假設 Source Domain 跟 Target Domain,它的類別都要是一模一樣的,但是真的會如此嗎?
怎麼解決 Source Domain 跟 Target Domain它可能有不一樣的 Label 的問題, 參見Universal Domain Adaptation 這篇文章。
?
Q&A:
如果 Feature Extractor 是 CNN而不是 Linear Layer,那 Domain Classifier Input就是feature map拉直的 Latent Embedding、這樣 Latent Space 學到的東西、把兩個 Domain 分部彌平會不會有影響、因為 Feature Map 本來就有 Space 的關係、現在卻硬是被拉直
說的很對,就是 Feature Extractor它是一個複雜的 Network、然後我們硬是要 把兩個 Domain 的東西拉在一起、會不會變成它只是為了拉在一起而拉在一起、他根本沒學到我們本來希望、這個 Feature Space 學到的東西呢。
會。所以domain adaption沒有大家想像得那麼容易 Train 起來
你知道我們在 Train 的時候、有兩件事互相結抗、也就是說一方面既騙過 Domain Classifier、一方面又分類分得好、那就同時把兩個 Domain Align 在一起、同時 Latent Space我們又希望它的分布是正確的、比如說我們覺得 1 跟 7 比較像、為了要讓 Classifier 做好、那今天你的 Feature Extractor就會讓 1 跟 7 比較像、
我們期待說,藉由需要把 Label Predictor 的 Performance衝高這件事情、latent representation 裡面的這個 Space仍然是保留一個比較好的 Latent Space、但是這件事不一定總是會成功了
如果你今天你給要騙過 Domain Classifier這件事的權重太大,你的 Model 就會學到說? 它都只想騙過 Domain Classifier、它就不會產生好的 Latent Space
所以實作的時候也是有些參數要調的,
3、少量無標注的目標領域資料
剛才我們是假設 Target Domain 沒有 Labeled Data,但至少有一大堆數據,這個時候還可以說,我要把兩個 Space 拉在一起。
但是假設目標域不只沒有 Label,而且 Data 還很少,比如說我就只有一張而已,這個時候你 Target Domain 只有一張,只有一個點,根本沒有辦法跟 Source Domain 把他align 在一起,此時怎么辦?
Testing Time Training,它的縮寫是 TTT,鏈接在圖上。
?
4、沒有目標領域資料
其實還有一個更嚴峻的狀況,如果我們對 Target Domain 一無所知的話,怎么辦呢?
這個時候我們就不叫 Domain 的 Adaptation,通常就叫 Domain Generalization,
因為我們并不是要Adapt 到某一個特定的 Domain 上、我們對那個特定的 Domain 已經一無所知了、我們是希望機器學到Domain Generalization,在 Testing 的時候,不管來什么神奇的 Domain,它都可以處理,那 Domain Generalization,又分成兩種狀況:
(1)訓練資料非常地豐富,本來就包含了各式各樣不同的 Domain。
????????假設要做貓狗的分類器,那現在在訓練資料里面有真實的、素描的、水彩畫的貓和狗的照片。因為訓練資料有多個 Domain,我們希望模型可以學到如何彌平 Domain 間的差異,如果測試資料是卡通的貓跟狗,它也可以處理。
(2)還有另外一種真的不知如何下手的狀況,假設訓練資料只有一個 Domain ,而測試資料有多種不同的 Domain。
????????在文獻上也是有人試著去解惑這種問題的,在概念上就是有點像是 Data Augmentation,雖然你只有一個 Domain 的資料,想個 Data Augmentation 的方法,去產生多個 Domain 的資料,然后你就可以套上面這個方案來做做看,看能不能夠在測試的時候,新的 Domain 都可以做好。
?
?
總結
以上是生活随笔為你收集整理的2021 Domain Adaptation(李宏毅的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 个人网站搭建时linux中的相关配置记录
- 下一篇: python day 5