前言
20年給自己立了一個閱讀論文數量的flag,但有些論文讀完後沒有實踐,過一陣子又會忘記論文中的一些細節,所以2020開一個新的論文研讀系列,記錄一下自己讀過的論文吧。
第一篇論文,《Summarizing Source Code with Transferred API Knowledge》,這篇論文的2018年發表於IJCAI,目前爲代碼摘要生成的SOTA。主要的創新點爲歸納出代碼中的 API 方法,首先搭建一個 seq2seq 的模型對 API 進行預訓練,並將預訓練模型的 encoder 部分加入最終的代碼摘要生成模型,實現 encoder 部分的結合。最後通過 decoder 部分生成代碼摘要。
論文原文:《Summarizing Source Code with Transferred API Knowledge》
模型結構
上圖爲整個代碼摘要生成的模型結構, 整個模型分爲兩部分,上面一行爲本篇論文創新性的提出的 API 預訓練模型,使用 seq2seq 模型,輸入代碼片段中使用的 API 函數序列(有可能一個代碼片段中依次使用了多個 API ),輸出爲代碼摘要。
下面一行的模型爲 seq2seq 的代碼摘要生成模型,類似於code-nn 的結構(code-nn 爲之前次領域的 SOTA 模型),而不同於不普通模型之處在於:整個網絡更改爲雙輸入(API sequence 和 code Corpora)。API sequence 進入之前預訓練好的模型,生成其 encoder 好的特徵向量,並於 code Corpora 部分的 encoder 組合,再進行 decoder ,得到最終的代碼摘要。
上圖中,圖(a)爲預訓練 API 模型結構,採用 GRU 結構進行 encoder 和 decoder 的操作,同時在 decoder 時加入了 Attention 的機制。
(1)式爲 encoder 部分,每一時刻 GRU 的 hidden state 由當前時刻輸入的 API 向量和前一時刻的 hidden state 共同決定。
(2)式表示 decoder 時,每一時刻的摘要文字輸出概率由前一時刻的文字 embedding,該時刻的 decoder hidden state 和該時上下文向量 context vector 共同決定。
(3)式爲每一時刻 decoder 的 hidden state 的計算公式,由前一時刻 hidden state,前一時刻的文字 embedding,和該時刻上下文向量 context vector 計算得出。
(4)(5)(6)式爲每一時刻上下文向量 context vector 的計算方法,其實質是上一時刻的 decoder hidden state 與 encoder 所有時刻 hidden state 進行注意力機制的計算,得到注意力權重後,將其與 encoder hidden state 做 weighted sum 的結果。
這裏有一個細節是:計算 context vector 所使用的是上一時刻的 decoder hidden state ,這相較於當前時刻來說其實是滯後的,而當前時刻的注意力機制計算體現在時刻,所以這裏在計算當前時刻的 hidden state 時加入的 context vector 其作用其實是對上一時刻 hidden state 的修正和補充。當前時刻的 hidden state 在下一時刻纔會使用注意力機制來更新。這與傳統的 Attention 機制的計算方式有明顯不同。
圖(b)爲結合了 API encoder 部分的代碼摘要生成 seq2seq 模型。這裏只是加入了 API seq2seq 預訓練模型的 encoder 部分。
具體的結合方式如(7)式所示,其實是進行了 attention 部分的結合,而整個代碼摘要生成部分的計算公式還是與式(1)(2)(3)相同。
實驗數據
API 預訓練模型方面,論文作者爬取了 Github 上340,922 對 <API,comment>,代碼摘要模型方面,從 Github 上爬取了 stars 數大於20 的 69,708 對<API, code, comment>。代碼片段爲 Java 語言。
數據的統計如圖:
數據樣例如圖:
結果
出了對比的模型 Code-nn 外,作者還使用了其他三個模型進行對比,分別爲:
API-Only:只使用 API 進行摘要生成。
Code-Only:只使用代碼片段進行摘要生成。
API+Code:使用 API 和代碼片段同時進行摘要生成,但不進行 API 模型的預訓練。
TL-CodeSum(fixed):使用預訓練 API 和代碼片段同時進行摘要生成,但在訓練階段固化 API 模型的權重。
TL-CodeSum(fine-tuned):使用預訓練 API 和代碼片段同時進行摘要生成,在訓練階繼續 fine-tuning API 模型。
最終的結果確實有被震驚,竟然只使用 API 進行代碼摘要生成的方式都大幅超越了 code-nn 的效果,而論文提出的模型的效果更加有效,看來預訓練還是起到了很大的效果。
最後,作者將 API 預訓練模型得到的 API embedding 進行降維可視化,可以看到對 API 的語義或作用進行了很好的 embedding。 真是萬物皆可 embedding。
如有問題歡迎指正,轉載請註明出處。