美好的舊日子裡,參加大學營隊是許多高中生的必備人生經驗。大學營隊的準備之夜可能是這樣度過的。數名年輕的大學生一邊討論著要不要增加新的舞台道具,一邊想新的黃色笑話,引人發笑的同時不能太下流。還有另一組人馬也在趕著死線,因為他們還沒將開幕式的企劃書交給學長姐。學長姐總是對每個細節都有意見,嘮嘮叨叨不停。在一旁偷聽的你,覺得學長姐給的意見不到令人讚嘆的程度,但至少表面上都有些幫助。其實你也很清楚,學長姐的執行力可能沒有比年輕一歲的學弟妹好,那些意見普通人也能想到,主要還是年紀的因素所以學長姐成為了指揮者。為什麼人會有批評比執行還容易的感覺呢?
這是個難以回答的問題
由於社會與文化的複雜度,顯然我們無法正面回答上述這些問題。在開始討論之前,我先強調一點。本文的故事背景是為了命題服務的,並不代表本人有相關經驗。我相信大部分的前輩都願意一步步帶領後輩進步,是同時擅長實作與批評的職人。畢竟所有的前輩也都是曾經的後輩。我不會也無法為讀了這篇文章而有同感的人負責。但如果有讀者遇到了極度雷同的情況,我建議快跳船、越快越好,在那樣的環境是學不到東西的。
猜想:學怎麼「執行」很困難、而學怎麼「批評」卻很容易
如果實作與批評之間存在著不同的學習難度,那就不難理解為什麼有些人總是光說不練了。機器模型(俗稱AI)的功用是模仿輸入與輸出資料之間的關係,如果兩者之間的關係越明確、越簡單,那麼機器就學的越快越好。我們可以藉此特質評估「執行」與「批評」的困難度。「執行」的意思是生成具有某些特質的資料,該類模型做的事情是學習某個資料分布,並且試圖仿造出一模一樣的出來。「批評」的本質是判斷,該類模型做的事情是把輸入的資料分類。根據命題的不同,這兩類模型底下也有數不清的分類。因為文章長度有限,為了讓討論能夠繼續,以下我使用自然語言作為例子。
測試資料集:網路電影資料庫 (Internet Movie Database, a.k.a. IMDB)
Tensorflow 上的IMDB資料集收集了IMDB上一小部分的使用者的電影觀後感,並且標註上是好評或差評。接著我們訓練兩個模型,一個是批評者:學習如何判斷IMDB上的評論是好評或是差評,另一個是執行者:學習如何生成類似IMDB 上的評論。透過比較這兩個模型的訓練時長與準確度(accuracy),就可以知道哪一個模型比較容易訓練。為了避免這次用的模型太大,我對資料及硬體做了一些限制,請見表一。
詞嵌入尺寸 word embedding size | 32 |
序列長度 sequence length | 300 |
詞種數 number of words | 10,000 |
訓練用句數 sequences for training | 25,000 |
測試用句數 sequences for testing | 2,500 |
顯示卡 graphic card | RTX 2080ti |
批評者:自然語言判斷模型
批評者的任務是區分IMDB的好評與差評。如果輸入的是好評,我們期待模型的輸出是True,例如圖一;如果輸入的是差評,我們期待模型的輸出是False,例如圖二。本次使用的語言模型 (Language Model) 是 Transformer ,因為他的效果通常是同參數量的模型中最好的。想知道有多厲害可以看看我之前介紹 Transformer 以及他的家族們。如果讀者想用其他的模型 (e.g. LSTM, GRU) 也是非常推薦的,多多實作可以幫助自己進一步理解。Tensorflow官方也有提供判斷模型的範例。
我製作了只有一層Transfomer的簡易語言模型。我們使用測試資料在每一個Epoch[1]結束後計算精準度及交叉熵,用於衡量模型的好壞。精準度越高或交叉熵越低代表模型越準[2]。這個模型花了30秒(不含最後過擬合的部分)就得到了當前的最佳解。從第二個Epoch之後精準度不斷下降,那是因為該模型已經過擬合了。我未來會開篇文章專門講過擬合,簡單的說是這個模型在訓練的時候,試著背答案但不懂應用,所以在測試資料上的表現越來越差。判斷模型的原始碼與結果請參考這裡。
[1] Epoch 是一種單位,一個 Epoch 的意思是將全部的訓練資料用於更新參數一次。以此類推,兩個 Epoch 就是全訓練資料用於更新參數兩次等等。
[2] 學術上都是用交叉熵 (Cross entropy) 作為衡量模型的標準,但本文為了簡化結果,使用了比較不主流但比較好懂的精準度作為標準。如果想知道更多,可以看我介紹機器學習常用的熵
執行者:自然語言生成模型
執行者學習的是如何輸出類似IMDB的評論。訓練方法是輸入前文,輸出下一個字,並且與真實的下一個字做比較。為什麼執行者一次只生成一個字呢?如果一次生成一個句子會如何?那樣做複雜度太高了,經驗上模型學不起來、或是需要極大的參數數量。所以我們選擇令模型一次生成一個字,直到模型輸出代碼End Of Sequence (EOS),見圖四、五。
執行者學習根據前文寫出後文,但是我們總是需要提示第一個字。現實中每一句話的第一個字並不一定相同,所以我們需要設計一個代碼叫 BOS (Begin of Sequence) 用來提示模型要開始說話了。訓練的時候,我們在每一條評論的開頭放上BOS,並要求模型輸出一個機率分佈,並且從中取樣出最有可能的第一個字,如圖六。
與批評者相比,我也使用了同樣的Transfomer來製作自然語言生成模型。最大的不同是生成模型使用了更多的參數,相比批評者多了快100%,因為生成模型要把輸出一個文字的機率分佈,有多少種字就有多大的維度,這個過程需要外加一個很大的神經網路。即使如此,我認為兩個模型之間還是有一定的可比性,因為用於交換資訊的Transformer的大小與形狀是一樣的,文字之間交換資訊也只會發生在這一層。
我們同樣的使用測試資料來計算精準度(accuracy),結果如圖七。執行者花費了十二分鐘以上的時間訓練好,而且精準度最高不超過50%。相比判斷模型在兩個Epoch內就能達到精準度87%以上,生成模型的表現不算好。生成模型的原始碼與結果請參考這裡。
小結:做好一件事,比批評困難得多
本次介紹的生成模型(執行者)與判斷模型(批評者)是機器學習中經常運用到的。我希望透過常見的生活議題來引導大家認識這些模型,而不是只被當成名詞。生成模型與判斷模型的比較是不公平的,因為兩者不可能在相同的架構下擁有一樣的參數量。本文的目的是提供直覺性的思考,提示讀者判斷模型通常是比生成模型容易訓練的。當然,對於為什麼有些人喜歡光說不練,我拿不出任何證據。但我可以很有信心的假設,做好一件事,比批評困難得多。
所有文章分類