天天看點

讀不完的頂會Paper,我該如何讀論文?

讀不完的頂會Paper,我該如何讀論文?

作者:十方 微信公衆号:煉丹筆記

(一)你真的會讀論文嗎?

十方一開始就給大家提了一個非常犀利的問題,這個問題從十方剛開始讀論文,就不斷問自己了。如果你毫不猶豫的回答了會!那這篇可以跳過了,可以多關注一進制寫的前沿論文筆記。如果你猶豫了,或者就是想好奇看看十方到底要說啥,那麼往下看。

看論文的經典狀态如下:

讀不完的頂會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舉例,很多部落格或者知乎,都給了這張圖:

讀不完的頂會Paper,我該如何讀論文?

從這張圖,我們都知道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循環?論文中給了下式:

讀不完的頂會Paper,我該如何讀論文?

熟悉FM模型的肯定能第一時間想到化簡公式:

讀不完的頂會Paper,我該如何讀論文?

然後,複現就簡單了:

class FM_Block(layers.Layer):
    # better add drop-out after this block
    def __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 = True

    def call(self, inputs):
        # sum square part 上圖公式第一項
        summed_features_emb = tf.reduce_sum(inputs, 1)  # None * K
        summed_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 * K
        return y_second_order

    def get_config(self):
        config = super(FM_Block, self).get_config()
        config.update({})
        return config
           

看多很多複現代碼,你會發現,很多推薦模型相關的代碼并不難,有很多複現技巧隐藏在論文公式中。

結語

說了這麼多,十方還是希望大家在閱讀論文中,能真正學到東西的。

十方後面會出一系列“保姆”級的論文複現文章,旨在幫助大家能獨立複現很多論文。

關注煉丹筆記,加群一起努力學習吧,相信大家都可以從調包俠進化成煉丹俠。

PS:我們的号會在本月中期進行遷移,增加留言功能,如果大家對于煉丹有興趣的,可以先關注我們的号或者加入我們的群進行進一步探讨,

讀不完的頂會Paper,我該如何讀論文?

此外,我們還搞了個知識星球(

免費免費免費!

),相信有緣人一定可以找到。

http://weixin.qq.com/r/XSjP1zrEzGezrX60931P (二維碼自動識别)

https://weixin.qq.com/g/AQYAAOttrq070bD82fGIidTFZIvb0KMwk_BgoAp9xkuGwEE4weyivyLILtTt8rD2 (二維碼自動識别)