Transfer Learning的意思是,假設你現在有一些跟你的task沒有直接相關的data,那你能不能用這些沒有直接相關的data來幫助我們做什麼事。
舉例來說,你現在要做的是貓跟狗的classifier,而沒有直接相關的data可能是輸入的distribution是類似的,例如一樣是動物的圖片,但是task裡的label是沒有相關的,還有另一個可能是你的input domain不一樣,但是task一樣。
為什麼我們要用Transfer Learning?舉例來說,我們要做一個台語的語音辨識,但是台語的data是很少的,但其實語音的data是很容易蒐集的,那我們能不能夠用其他語言的data,來improve台語的語音辨識這件事情。
假設現在我們有一個想要做的task,有一些跟我們task有關的data我們稱為Target data,有一些跟我們task無關的data我們稱為Source data,這兩筆data都有可能有label,也有可能沒有label,所以我們就可以分成四種可能來討論。
今天會先講Target data和Source data都有label的情況。
首先是我們的Target data和Source data同時都有label的情況,最常見也最簡單的方法是fine-tune你的model,通常我們會假設Target data的量是非常少的,source data是很多的,而如果今天Target data的量少到只有幾個example,我們稱之為One-shot Learning。
語音上最典型的例子是speaker adaptation,就是說我現在的Target data是某一個人的聲音,這個人的聲音你不可能有太多的label data,但是Source data你有一大堆來自於不同人的audio data。所以你可以直接拿你的Source data去訓練一個model,接下來你就用你的Target data來去fine-tune你的model,就等於是你把Source data上訓練出來的model當作是訓練的初始值,然後再用Target data去訓練,那接下來我就介紹一些方法來做這件事。
Conservative Training是你現在有大量的Source data,裡面有很多不同speaker的聲音,你就可以訓練一個拿來做語音辨識的Neural Network,接下來你有Target data是某個speaker的聲音,但可能只有幾句而已。這時候你可以在訓練的時候加上一些限制,讓訓練完新的模型跟舊的模型不要差太多,這個限制其實就是Regularization,我們會希望新的模型跟舊的模型的輸出在看到同一筆data的時候,它們的輸出越接近越好,或是它們的L2 norm差距越小越好。
另一個方法是Layer Transfer,假設現在有用Source data訓練好一個模型,然後把這個模型裡面的一些layer拿出來直接複製到新的模型裡,接下來你用Target data只去訓練沒有複製的layer,這樣的好處就是你的Target data只需要考慮非常少的參數,
但是哪些layer應該被Transfer呢?其實在不同task上面需要被Transfer的layer是不一樣的。
舉例來說,在語音辨識方面,我們通常是複製最後幾層,然後重新訓練輸入那一層,你可以想成是每一個人用同樣的發音方式,但因為口腔結構有差異,所以得到的聲音不同,那Neural Network前幾層是從聲音訊號裡面得知說話的人的發音方式,再根據發音方式得到現在說的是哪一個詞彙。從這個角度來看,Neural Network的後面幾層是跟說話的人沒有關係的,所以可以被複製。
而在影像辨識方面,通常是複製前面幾層,只訓練最後幾層,因為當你在Source data上訓練了一個Network,通常前幾層就是detect最簡單的pattern,比如說有沒有直線、橫線或是有沒有簡單的幾何圖形,所以前幾層是可以被Transfer到其他task上面的。
Multitask Learning跟Fine-tune不同的地方是,在Fine-tune裡面,我們在意的是Target domain做得好不好,而在Multitask Learning裡面,是會同時在意Target domain跟Source domain做得好不好。
如果是用基於Deep Learning的方法,就特別適合用Multitask Laerning。假設有兩個不同的task,它們用的是一樣的feature,例如說都是做影像辨識,只是影像辨識的class不一樣,我就可以訓練一個Neural Network,輸入就是兩個不同的task,同樣的feature,但是中間會分叉出來,一部分的Network它的輸出是Task A的答案,一部分的Network它的輸出是Task B的答案。這樣做的好處是,Task A和Task B在前幾個layer會是共用的,就代表前面幾個layer是用比較多的data去訓練的,所以可能有比較好的表現,但是你要確定這兩個task有沒有共通性,是不是可以共用前面幾個Layer。
另一個是連輸入都沒有辦法共用的,所以兩種不同的task都用不同的Neural Network把它Transform到同一個domain上,在同一個domain上,再apply不同的Neural Network,一個去做Task A,一個去做Task B,而中間可能有幾個layer是共用的。
Multitask Learning有一個很成功的例子是,多語言的語音辨識。假設現在有一堆不同語言的data,你可以訓練一個model同時可以辨識這五種不同的語言,而這個model的前幾個layer它們會共用參數,後面幾個layer,每一個語言可能會有自己的參數。
其實在Translation也可以用同樣的事情,假設你要做中翻英、中翻日,那可以把兩個模型一起訓練,反正都要先把中文的data做處理,那一部分的Neural Network就可以是兩種不同語言的data共同使用。
這個方法可以幫助我們不用花太多時間在想兩個task能不能Transfer。Progressive Neural Network是在說,先訓練一個Task 1的Neural Network,訓練好之後它的參數就fix住了,而現在我們要做Task 2,一樣有一個Neural Network,但是Task 2的每一個hidden layer都會去接Task 1某一個hidden layer的輸出。所以在訓練的時候,首先Task 2的data不會去動到Task 1的model,所以Task 1不會比原來更差,再來Task 2去借用Task 1的參數,但是它可以把這些參數直接設成0,這樣也不會影響到Task 2的表現。如果有Task 3也是做一樣的事情,它會同時從Task 1和Task 2的hidden layer得到information。