天天看點

【論文筆記】Improving Automatic Source Code Summarization via Deep Reinforcement LearningImproving Automatic Source Code Summarization via Deep Reinforcement Learning

Improving Automatic Source Code Summarization via Deep Reinforcement Learning

1 本文背景

軟體維護占據軟體開發生命周期很大一部分,提供代碼執行任務的描述對于軟體維護來說是必須的,然而注釋代碼仍然是一項勞動密集型的任務,使得真實的軟體項目很少具備充分的代碼文檔以減少未來的維護成本。

本文作者提出:一個好的注釋論至少應該具備以下特征: a)正确性:正确地闡明代碼的意圖。b)流利:流暢的自然語言,易于維護者閱讀和了解。c)一緻性:遵循标準的樣式/格式。

代碼摘要是一項試圖了解代碼并直接從源代碼自動生成描述的任務。

本文将一個抽象文法樹結構以及代碼片段的順序内容合并到一個深度強化學習(DRL)架構中(具體: actor-critic網絡)。

2 模型架構

2.1 總體工作流程

【論文筆記】Improving Automatic Source Code Summarization via Deep Reinforcement LearningImproving Automatic Source Code Summarization via Deep Reinforcement Learning

a) 離線教育訓練階段

語料庫 → < code,comment> → 深度強化學習模型→ actor network

b) 線上總結階段

給定一個代碼片段,注釋經過訓練後的actor network生成。

2.2 模型具體架構

【論文筆記】Improving Automatic Source Code Summarization via Deep Reinforcement LearningImproving Automatic Source Code Summarization via Deep Reinforcement Learning

a) 混合代碼表示:将源代碼表示為隐藏空間,即編碼器。

b) 混合注意力層:在将已編碼的隐藏空間譯碼到注釋空間時,利用注意力層對代碼片段的token配置設定不同的權重,以便更好地進行生成。

c) 文本生成:RNN生成網絡,根據目前生成的單詞生成下一個單詞。

d) critic:評估生成詞的好壞。

a) 混合代碼表示

這一層使用LSTM來表示代碼的詞法,使用基于AST的LSTM來表示代碼的文法。

詞法級表示

源代碼的詞法級表示的關鍵:注釋總是從代碼的詞法中提取,比如函數名、變量名等等。本文使用LSTM來表示源代碼的序列資訊。

文法級表示

AST作為一種中間代碼,表示程式的層次文法結構。本文從AST嵌入的角度,提出一個基于AST的LSTM來表示源代碼的文法層次,公式如下所示:

【論文筆記】Improving Automatic Source Code Summarization via Deep Reinforcement LearningImproving Automatic Source Code Summarization via Deep Reinforcement Learning

其中j代表node,l代表l-th child,k=1, …,N,N是child的數量,x是某個node的word embedding,σ是logistic即sigmoid函數,點乘是vector按元素的相乘。

i代表input gate, f代表forget gate, AST-based LSTM有多個forget gate, o代表output gate, u代表更新memory cell的state, c代表memory cell, h代表hidden state。

本文在文法級表示中配合AST使用了樹形LSTM的結構,是以每個LSTM有多個子節點的隐藏狀态h輸入,因而有多個forget gate。

這一結構由子節點數N來控制,當N=1時,就是普通的LSTM結構。

具體如下圖所示:

【論文筆記】Improving Automatic Source Code Summarization via Deep Reinforcement LearningImproving Automatic Source Code Summarization via Deep Reinforcement Learning
【論文筆記】Improving Automatic Source Code Summarization via Deep Reinforcement LearningImproving Automatic Source Code Summarization via Deep Reinforcement Learning

圖(a)是基本RNN的結構,圖(b)是Tree-RNN結構。

對于不同AST的不同節點,子節點N的數量是不同的。

為了簡化,作者将AST轉換為二叉樹,具體做法:

  • 如果節點有多個child,除了最左邊的child,其餘child成為新的右child的child。自上而下重複直到每個node的child都不超過2個。
  • 将隻有一個child的node與其child結合

b)混合注意力層

注意力層有兩個注意力得分,一個用于結構表示𝛼𝑡𝑠𝑡𝑟,另一個用于序清單示𝛼𝑡𝑡𝑥𝑡 。

在解碼過程的第 t 步,𝛼𝑡^{𝑠𝑡𝑟 (𝑗)}^ 和 𝛼𝑡 ^𝑡𝑥𝑡 (𝑗)^的注意力得分計算如下:

【論文筆記】Improving Automatic Source Code Summarization via Deep Reinforcement LearningImproving Automatic Source Code Summarization via Deep Reinforcement Learning

st是源碼片段加上到 t 步得到的word {x ,y0,y1,…,yt} ,st+1={st,yt+1}。

分别将各自的注意力得分和隐藏狀态權重求和:

【論文筆記】Improving Automatic Source Code Summarization via Deep Reinforcement LearningImproving Automatic Source Code Summarization via Deep Reinforcement Learning

然後将𝑑_𝑡𝑠𝑡𝑟和𝑑_𝑡𝑡𝑥𝑡連接配接起來,輸入單層線性網絡得到上下文向量dt:

【論文筆記】Improving Automatic Source Code Summarization via Deep Reinforcement LearningImproving Automatic Source Code Summarization via Deep Reinforcement Learning

再通過一個額外的隐藏層為預測第t+1個詞做準備:

【論文筆記】Improving Automatic Source Code Summarization via Deep Reinforcement LearningImproving Automatic Source Code Summarization via Deep Reinforcement Learning

c)文本生成

模型利用 softmax 函數預測第t個單詞:

【論文筆記】Improving Automatic Source Code Summarization via Deep Reinforcement LearningImproving Automatic Source Code Summarization via Deep Reinforcement Learning

d)評論家網絡

在解讀評論家網絡之前,先了解一下什麼是強化學習。

【論文筆記】Improving Automatic Source Code Summarization via Deep Reinforcement LearningImproving Automatic Source Code Summarization via Deep Reinforcement Learning

強化學習算法基本思路:

上圖的大腦代表算法執行個體,對個體操作來做決策,即選擇一個合适的動作(Action)At。地球代表研究的環境,它有自己的狀态模型,在選擇動作At後,環境的狀态(State) St會變為St+1,同時得到了采取動作At的延時獎勵(Reward)Rt+1。

然後個體可以繼續選擇下一個合适的動作,環境的狀态又會變,又有新的獎勵值。

模型基本要素:環境的狀态S,個體的動作A,環境的獎勵R,個體的政策(policy)π,即狀态s時采取動作a的機率,采取行動後的價值(value)v,表示目前獎勵和後續獎勵的期望。

這裡隻是一個非常簡要的介紹,我個人感覺強化學習非常類似GAN,但是在最後的回報機制上與GAN是不同的計算方式。

更具體的内容可以參考部落格:

https://www.cnblogs.com/pinard/p/9385570.html

與actor網絡不同,critic network在每個解碼步驟上輸出一個值(對actor的評價)而不是一個機率分布,actor根據這個評價進行參數調整。

在給定policy π、sample action和reward function的情況下,value function是未來reward累加和的期望, h是代碼片段的表示,公式如下:

【論文筆記】Improving Automatic Source Code Summarization via Deep Reinforcement LearningImproving Automatic Source Code Summarization via Deep Reinforcement Learning

隻有在序列生成過程(或事件)完成後才能得到評價分數(BLEU)。當步長超過最大步長T或生成序列結束(EOS)令牌時,事件終止。是以,reward定義如下:

【論文筆記】Improving Automatic Source Code Summarization via Deep Reinforcement LearningImproving Automatic Source Code Summarization via Deep Reinforcement Learning

對critic最小化loss,𝑉^𝜋 (𝑠_𝑡)是目标值, 𝑉_𝜙^𝜋 (𝑠_𝑡) 是critic的預測值:

【論文筆記】Improving Automatic Source Code Summarization via Deep Reinforcement LearningImproving Automatic Source Code Summarization via Deep Reinforcement Learning

2.3模型訓練

對于整個模型,Loss為𝐿(Θ)=𝐿(𝜃)+𝐿(𝜙) ,前者是actor的Loss ,後者是critic的Loss 。

使用policy gradient來對模型進行優化。

關于actor參數的梯度為:

【論文筆記】Improving Automatic Source Code Summarization via Deep Reinforcement LearningImproving Automatic Source Code Summarization via Deep Reinforcement Learning

關于critic的參數梯度為:

【論文筆記】Improving Automatic Source Code Summarization via Deep Reinforcement LearningImproving Automatic Source Code Summarization via Deep Reinforcement Learning

最後還用了SGD+AdaGrad

3 實驗部分

3.1 資料集

資料收集于github,包含108726個<code, comment>對。

代碼和注釋的詞彙量分别為50400和31350。

訓練、測試、驗證比例劃分為6:2:2。

使用工具ast2lib将Python代碼解析為抽象文法樹。

用{., “ ’ : ; ) ( ! (space)}來token化代碼,{(space)}來token化注釋。

大多數代碼片段的長度在20到60之間。

幾乎所有注釋的長度都在5到15之間。

【論文筆記】Improving Automatic Source Code Summarization via Deep Reinforcement LearningImproving Automatic Source Code Summarization via Deep Reinforcement Learning

3.2 衡量名額

選擇自然語言處理領域的相關評價名額:

名額 計算方式
BLEU 用于分析候選譯文中有多少 n 元詞組出現在參考譯文中
METEOR 利用準确率和召回率的調和平均作評判标準,需要 WordNet 擴充同義詞集,同時需要考慮單詞詞性(比如like、likes都算對)
ROUGE-L 基于最長共有子句共現性精度和召回率 F-measure 統計
CIDER 把每個句子都看作“文檔”,将其表示成 tf-idf 向量的形式,然後計算參考caption與模型生成的caption的餘弦相似度作為打分。

3.3 實驗設定

基線:

Seq2Seq:基于LSTM的經典編碼器-解碼器架構

Seq2Seq+Attn:Seq2Seq模型的一個衍生版本,具有詞對齊的注意層

Tree2Seq:與Seq2Seq相同的體系結構,并采用基于AST的LSTM作為編碼器

Tree2Seq+Attn:是帶有注意層的Tree2Seq模型的衍生版本。

Hybrid2Seq(+Attn+DRL):代表了本文提出的模型的三個版本,是否有 Attn/DRL 元件。

3.4 實驗結果

RQ1:與基線相比

【論文筆記】Improving Automatic Source Code Summarization via Deep Reinforcement LearningImproving Automatic Source Code Summarization via Deep Reinforcement Learning

RQ2:元件分析

【論文筆記】Improving Automatic Source Code Summarization via Deep Reinforcement LearningImproving Automatic Source Code Summarization via Deep Reinforcement Learning

實驗結果——RQ3:參數分析

(1)不同的代碼長度

【論文筆記】Improving Automatic Source Code Summarization via Deep Reinforcement LearningImproving Automatic Source Code Summarization via Deep Reinforcement Learning

(2)不同的注釋長度

【論文筆記】Improving Automatic Source Code Summarization via Deep Reinforcement LearningImproving Automatic Source Code Summarization via Deep Reinforcement Learning

資料集中幾乎所有資料的注釋長度都小于20,是以缺乏對超過長度的性能分析

定性分析

【論文筆記】Improving Automatic Source Code Summarization via Deep Reinforcement LearningImproving Automatic Source Code Summarization via Deep Reinforcement Learning

繼續閱讀