读不完的顶会Paper,我该如何读论文?
(一)你真的會讀論文嗎?
十方一開始就給大家提了一個非常犀利的問題,這個問題從十方剛開始讀論文,就不斷問自己了。如果你毫不猶豫的回答了會!那這篇可以跳過了,可以多關注一元寫的前沿論文筆記。如果你猶豫了,或者就是想好奇看看十方到底要說啥,那么往下看。
看論文的經典狀態如下:
其實,也不會啥都沒學會,論文畢竟是英文的,至少提高了英語閱讀能力不是。嚴肅點說,看完論文會有以下幾種狀態:
- 看的一知半解,反復看也沒看懂,比如BERT的attention到底是怎么算的。
- 知道了有一個新的模型,解決了什么問題,和其他哪些模型對比,取得了SOTA成績。
- 除了以上,詳細了解了模型的結構,知道論文為什么這樣設計。
- 除了以上,嘗試復現整個模型,或模型的部分,去提高現有模型的泛化能力。
- 其他狀態
你是哪種狀態?
先說下看的一知半解的狀態,這個對很多初學者而言,是經常出現的情況。先說下為什么會出現這種狀態,就像我們在上大學前,會學數學、語文這種基礎學科,然后開始接觸專業課,看到很多公式就不會茫然。讀論文也一樣,不是說你可以直接讀最新的論文。BERT本質用的是Transformer的Encoder,而預訓練的思想,來自很多論文,比如ELMO,GPT。Attention呢?很早在LSTM的encoder-decoder架構中就用到了,其實attention最早是用在cv領域的,就不往下再擴展了,沒有這些背景知識,可以說直接看一篇巨佬的論文是沒有任何意義的,只是去浪費時間(十方表示也浪費過大量時間)。
再說下第2個狀態,這個狀態就很有意思了。看論文點到為止,知道有個什么模型,效果很好,解決了問題。然后去github搜復現(比如deepctr就封裝的很好),readme寫的很清楚,輸入數據格式是什么樣,直接調用(可能用于比賽),做個愉快的調包俠。其實這個狀態是優于上一個狀態的,實踐是認識發展的動力。比如我們從出生開始,不是先學會文字的語法才去學說話的,十方之前也喜歡看論文去github上找復現代碼,去跑跑看。當然,這個狀態不能持續太久,在你實踐能力很強后,這種狀態對你未來而言,就不能有任何提升了。
再說下第3個狀態,當你完全能看懂論文,比如transformer,為啥attention要做scale,預訓練樣本如何構造,transormer在處理不同任務的區別是什么等等細節的時候,這是個非常好的狀態,建議大家這個時候,可以好好看看源碼,十方看完bert這篇論文的時候,就仔仔細細看完了bert的源碼。
最后再說一種狀態,這些往往就是大佬了,能夠在只有論文,和tensorflow官方文檔的情況下,復現論文,或者融合論文中部分模型優化點,去優化現有模型。很多時候可能不需要達到這種狀態,看各位需求了。
因為每個人情況不一樣,其實還有些其他狀態。十方建議大家看完論文,最好總結下,自己究竟學到了什么。非常重要的是,如果你是一個初學者,建議多閱讀巨佬的著作,而不是直接看論文,每本書都會介紹很多經典的模型,并給出該模型出自的論文,大家結合著書去翻閱論文,這樣效率才是最高的。
(二)到底應該怎么讀論文呢?
大家一般看論文的方式,是哪種呢?大多數人喜歡從公眾號,知乎,CSDN等去看論文。首先不用面對煩人的英文,其次就是往往公眾號等平臺中已經把論文的要點,模型的結構做了詳細的解讀。直接讀別人寫的論文分享是一種快速閱讀論文的方式,但是畢竟作者能力層次不齊(主要是寫作能力),可能有時候你沒看懂僅僅是作者漏寫了部分要點導致的,比如之前就有朋友吐槽過十方寫的DR,他直接指出十方沒有寫模型的上線方式,導致他又去翻論文,問同事。十方看了下確實沒寫,即使十方十分清楚應該怎么上線,因為十方假定了讀者自己在讀完分享后能夠自己領悟上線方式。所以十方希望大家把公眾號的論文分享,盡可能當作一個摘要去看,當你發現一篇論文對你非常重要或者讓你非常感興趣,去讀原文吧,一篇一兩千字的公眾號文章是說不完很多細節的。
(三)關于復現論文
首先說下復現論文是一件非常有意思的事,當你完全領悟一篇論文的各個要點時,每個人都有能力去復現論文,不需要依賴于github的分享,或者等著某個開源平臺去開源。為什么要去復現?因為在調用一個開源模型上,你不會比任何人更優秀,畢竟每個人都可以用deepctr。那么為什么比賽很多大佬能拿冠亞呢?我們看很多top方案的時候,發現或多或少都對模型進行了各種調整。如果僅僅把開源當作一個黑盒來用,你就只能在挖特征上努力了,而對于圖像,nlp等比賽,給你挖特征的機會并不多。
那么應該怎么復現論文,其實論文中已經教你怎么復現了。我拿最經典的deepfm舉例,很多博客或者知乎,都給了這張圖:
從這張圖,我們都知道FM Layer把每個Fields映射成embedding,然后求點積,最后線性加權。好像很簡單,如何復現呢?難道是這樣(偽代碼):
# 省略FM Layer的bias def FM_Layer(dense_embs):dot_list = []for i in range(len(dense_embs)):for j in range(i + 1, len(dense_embs)):dot_list.append(dot(dense_embs[i], dense_embs[j]))return dot_list這在tensorflow中咋寫,還要寫兩個for循環?論文中給了下式:
熟悉FM模型的肯定能第一時間想到化簡公式:
然后,復現就簡單了:
class FM_Block(layers.Layer):# better add drop-out after this blockdef __init__(self, **kwargs):super(FM_Block, self).__init__(**kwargs)def build(self,input_shape):# input_shape must be in (None, Fields Num, K)super(FM_Block,self).build(input_shape) # 相當于設置self.built = Truedef call(self, inputs):# sum square part 上圖公式第一項summed_features_emb = tf.reduce_sum(inputs, 1) # None * Ksummed_features_emb_square = tf.square(summed_features_emb) # None * K# square sum part 上圖公式第二項squared_features_emb = tf.square(inputs)squared_sum_features_emb = tf.reduce_sum(squared_features_emb, 1) # None * K# second order 1/2 (第一項 - 第二項)y_second_order = 0.5 * tf.subtract(self.summed_features_emb_square, self.squared_sum_features_emb) # None * Kreturn y_second_orderdef get_config(self):config = super(FM_Block, self).get_config()config.update({})return config看多很多復現代碼,你會發現,很多推薦模型相關的代碼并不難,有很多復現技巧隱藏在論文公式中。
結語
說了這么多,十方還是希望大家在閱讀論文中,能真正學到東西的。十方后面會出一系列“保姆”級的論文復現文章,旨在幫助大家能獨立復現很多論文。關注煉丹筆記,加群一起努力學習吧,相信大家都可以從調包俠進化成煉丹俠。
PS:我們的號會在本月中期進行遷移,增加留言功能,如果大家對于煉丹有興趣的,可以先關注我們的號或者加入我們的群進行進一步探討,
此外,我們還搞了個知識星球(免費免費免費!),相信有緣人一定可以找到。
http://weixin.qq.com/r/XSjP1zrEzGezrX60931P (二維碼自動識別)
https://weixin.qq.com/g/AQYAAOttrq070bD82fGIidTFZIvb0KMwk_BgoAp9xkuGwEE4weyivyLILtTt8rD2 (二維碼自動識別)
總結
以上是生活随笔為你收集整理的读不完的顶会Paper,我该如何读论文?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 推荐算法炼丹笔记:序列化推荐算法Bert
- 下一篇: 推荐系统里的那些坑儿