論文研讀(1)《Summarizing Source Code with Transferred API Knowledge》

前言

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 s_{t-1},這相較於當前時刻t來說其實是滯後的,而當前時刻的注意力機制計算體現在t+1時刻,所以這裏在計算當前時刻的 hidden state 時加入的 context vector 其作用其實是對上一時刻 hidden state s_{t-1} 的修正和補充。當前時刻的 hidden state s_{t} 在下一時刻纔會使用注意力機制來更新。這與傳統的 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。

 

 

 

如有問題歡迎指正,轉載請註明出處。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章