”關于初入NPL領域的一些小建議“
1.了解 NLP 的最基本知識:Jurafsky 和 Martin 的 Speech and Language Processing 是領域內的經典教材,里面包含了 NLP 的基礎知識、語言學掃盲知識、基本任務以及解決思路。閱讀此書會接觸到很多 NLP 的最基本任務和知識,比如 tagging, 各種 parsing,coreference, semantic role labeling 等等等等。這對于全局地了解 NLP 領域有著極其重要的意義。書里面的知識并不需要爛熟于心,但是刷上一兩遍,起碼對于 NLP 任務有基本認識,下次遇到了知道去哪里找還是非常有意義的。另外 Chris Manning 的 introduction to information retrieval 也是一本可以掃一下盲的書,當然我認為依然不需要記住所有細節,但輪廓需要了解。IR 里面的很多基本算法跟 NLP 有不少的重合。說說我自己曾經走過的彎路。Stanford NLP 的 qualification 考試的一部分就是選一些 jurafsky 和 manning 書里面的一些 chapter 來讀,然后老師來問相關問題。開始我一直對里面的東西懶得看,所以 qualification 考試一拖再拖。但博士最后一年沒辦法拖的時候,才發現如果早知道這些東西,博士早年可以少走很多彎路。
為什么了解 NLP 基礎知識的重要,我給大家舉幾個例子。
最近跟同學一起做語言模型 language modeling 相關的事情,很多同學用 LSTM 或者 transformers 做 language model 隨手就能實現,但是實現一個 bigram 或者 trigram 的 language model(LM)卻因為里面的 OOV 的平滑問題卡了大半天(熟悉的同學可能知道,需要拉普拉斯平滑或者更 sophisticated 的 Kneser-Ney 平滑)。為什么 bigram 或者 trigram 的 LM 很重要呢?去做一個語言模型的問題,實現深度模型之前,第一步其實就要去寫一個 bigram 或者 trigram 的 LM。為什么呢?因為這些 N-gram 模型實現簡單,并且 robust。通過這樣簡單的實現,可以告訴你這個數據集的 LM 模型的下限。這樣我們心里會有數,神經網絡模型至少不應該比這個模型差的。神經網絡模型因為其超參數、梯度爆炸等問題,有時候我們不太容易決定是真的模型不行、參數沒調好還是代碼有 bug。那么通過 N-gram LM 的給出的下限,我們就可以直觀地知道神經網絡是有 bug 還是沒調好參數。
第二個例子就是涉及發文章了,不知道有沒有同學想過,BERT 里面訓練 LM 的隨機替換為什么就使結果變好,隨機替換是什么鬼,怎么結果就好了。其實在 BERT 之前,斯坦福的吳恩達組的 Ziang Xie 的 Data Noising as Smoothing in Neural Network Language Models ICLR2017(https://arxiv.org/pdf/1703.02573.pdf)就首次提出了此方法,而且給出了理論解釋。這種 random 替換其實本質上屬于 language modeling 里面基于 interpolation 的平滑方式,而基于 interpolation 的 LM 平滑,就躺在 jurafsky 那本書的第 3.4.3 節。
2.了解早年經典的 NLP 模型以及論文:相比簡單粗暴的神經網絡模型,早年的 NLP 算法確實比較繁瑣復雜,但里面確實有很多早年學者在硬件條件艱苦情況下的智慧結晶。熟悉了這些模型,可以在現在神經網絡里面融會貫通。去年在人民大學做 seminar。Seminar 有大概 30-40 位同學參加。Seminar 中,我問了一個問題,有誰知道機器翻譯中的 IBM 模型大概是干嘛的,舉手的同學大概有五分之一。我再問,誰能來手寫(或者大概手寫)一下 IBM model1,一個人都沒有。僅僅從基于 IBM 模型的 Hierarchical Phrase-based MT, 近幾年就有很多篇引用量很高的文章是基于里面的思想的。例子數不勝數:
chris dyer 組的 Incorporating structural alignment biases into an attentional neural translation model (NAACL16) 提出用雙向 attention 做 neural 機器翻譯的約束項,意思是如果在英語翻譯法語生成的 target 中的一個法語詞 attend 到了一個 source 中的英語詞,那么反過來,法語翻譯英文 target 中相同這個英語詞應該也 attend 到 source 中的這個英語詞。其實這個思想就是完完全全相似 Percy Liang 曾經的成名作之一,早在 NAACL06 年 Alignment by Agreement,大家通過題目的意思就可以猜到文章的內容,正向翻譯與反向翻譯中的 對齊 (alignment) 要 一致 (agree)。如今做 neural MT 的同學,有多少同學讀過 Percy 的這篇大作呢(大家知道 Percy 最多的應該是 Squad 吧)。
處理對話系統的無聊回復,用 p(target|source) 做 reranking 現在應該已經是標配。再比如 Rico Sennrich 的成名作之一將 Monolingual data 跟 seq2seq 模型結合。其實這連個思想在 phrase-base MT 里面早就被廣發的使用。Neural 之前的 MT,需要對一個大的 N-best list 用 MERT 做 reranking,反向概率 p(target|source) 以及語言模型概率 p(target) 是 reranking 中 feature 的標配。
Harvard NLP 組, Sam Wiseman 和 Alex 發表的 EMNLP16 best paper runner-up, Sequence-to-Sequence Learning as Beam-Search Optimization, 基本上傳承了 Daume III and Daniel Marcu 2005 年的 LaSO 模型,將其思想 adapt 到 neural 里面。
如果再準本溯源,誕生于 neural MT 的 attention,不就是 IBM 模型的神經網絡版本嘛。
3.了解機器學習的基本模型:神經網絡的簡單暴力并且有效。但是從科研的角度講,熟悉基本的機器學習算法是必修課。比如吳恩達的 machine learning 就是必要之選。記得前段時間我面試一個小伙子,一看就是很聰明的同學,而且很短的時間就有一篇 NAACL 在投。我就問小伙子,EM 算法是什么,小伙子說沒有聽說過 EM,而且自己的科研也用不到 EM。我認為這其實是一個挺大的誤區。當我想起我自己,曾經就吃過很多類似的虧。因為早期數學基礎偏弱,也沒有決心惡補一下數學,所以早年每次看到跟 variational inference 相關的算法就頭大,這種偏科持續了很久,限制了科研的廣度。相比粗暴的神經網絡,CRF 等模型的 inference 確實相對復雜(當年我自己也看了很多次才徹底搞明白)。但搞懂這些,是一個 NLP researcher 的基本素養。Pattern Recognition and Machine Learning 那本書,尤其是某些小節確實比較難(又暴露了數學基礎差的事實),即便是只是為了過一遍,也需要很強的耐力才能看完,更不用說完全看懂了。我自己也曾經半途而廢很多次,如今依然有很多章節是不太懂的。但是其中的很多基礎 chapter,我認為還是很值得一讀的。其實可以組成那種兩三個人的學習小組,不需要有太雄偉的目標,用個一年哪怕兩年的時間,把幾個重要的 chapter 過一遍。
NLP 相對是應用科學,并不是特別的數學。但是我們天天用的算法的基本數學邏輯我認為還是需要搞懂,比如 dropout, 比如天天用到的優化 (SGD, momentum, adaboost, adagrad),比如各種 batch, layer normalization。這樣其實可以省去很多浪費的時間,磨刀不誤砍柴工。這些年來,在幫同學調 bug 的過程中,我至少遇見過 3-5 個同學 training 的時候開 dropout, test 的時候沒有對每個 cell 用 (1-dropout) 去 scale(大家不要笑,這是真的)。然后畫出 dropout 曲線就是 dropout 值越大,結果越差。在討論的時候,同學一臉茫然并且不清楚 test 時候需要 scale。其實本質就是并不了解 dropout 背后的數學原理。
4.多看 NLP 其他子領域的論文:NLP 有很多子領域,MT,信息抽取,parsing,tagging,情感分析,MRC 等等。多多熟悉其他子領域的進展是必要的。其實不同子領域所運用的模型不會相差太大。但是最開始看不熟悉領域的問題可能會有一點難,原因是對問題的 formalization 不是很了解。這可能就需要多花一些時間,多找懂的同學去問。其實了解不同問題的 formalization 也是對領域知識最好的擴充。
5.了解 CV 和 data mining 領域的基本重大進展:當熟悉了上面所說的點之后(當然可能至少也需要一年的時間)。熟悉 CV 領域的基本任務、基本算法我認為對于打開科研視野很重要。但是不可否認,因為領域不用,寫作風格、術語表達相差很大,又因為缺乏背景知識(文章中會省略一些基礎知識,默認大家都懂。但是跨領域的人可能不懂),第一次想讀懂跨領域的文章其實并不容易。我就出現過竟然在討論班上直接把 faster-RCNN 講錯了的情況,以為自己看懂了,然后就講錯了(至今昱先天天還在因為這個事情調侃我)。不過重要的是,NLP 領域里面一些重要的文章其實或多或少借鑒了 CV 里面的思想,當然也同樣出現 CV 借鑒 NLP 的情況。NLP 神經網絡可視化、可解釋性的研究,時間上還是落后于 CV 里面對 CNN 的可視化。所以很多工作大量借鑒了 CV 里面的類似工作。NLP 運用 GAN 其實也是借鑒 CV 的。其實兩個領域很多是很相通的。比如,如果不考慮 question query, vision 里面 detection 中的 region proposal(在一個大的圖片背景下找一個特定區域), 大家想是不是跟 MRC 里面的 span extraction(在一大堆文字里面找一個 span)有異曲同工之妙。更不用說 image caption generation 與 sequence-to-sequence 模型了,本質上幾乎沒什么太大的區別。強化學習在生成領域 generation,發完了 MT(Ranzato et al., ICLR2016) 再發 image caption generation, 再回到 summarization. Actor-critic 模型也是類似的,還是很多做 generation diversity 的文章。因為跨領域不好懂,所以第一次推薦看 tutorial, 如果有 sudo code 的 tutorial 那就更好了。另外看看掃盲課的視頻,比如 Stanford CS231n 也是個好辦法。另外,一個 NLP 組里面有一個很懂 CV 的人也很重要(拜謝昱先),and vise versa。graph embedding 近兩年崛起于 data mining 領域。目測會在(或者已經在)NLP 的不少任務得到廣泛應用。想到幾年前,deep walk 借鑒了 word2vec, 開始在 data mining 領域發跡,然后似乎又要輪轉回 NLP 了。