代碼生成(Code Generation), 是指根據自然語言描述生成相關代碼片段的任務. 在軟件開發過程中, 常 常會面臨大量重復且技術含量較低的代碼編寫任務, 代碼生成作為最直接輔助開發人員完成編碼的工作受到學術 界和工業界的廣泛關注. 讓機器理解用戶需求, 自行完成程序編寫也一直是軟件工程領域重點關注的問題之一.**近年來, 隨著深度學習在軟件工程領域任務中的不斷發展, 尤其是預訓練模型的引入使得代碼生成任務取得了十分優異的性能. **本文系統梳理了當前基于深度學習的代碼生成的相關工作, 并將目前的基于深度學習的代碼生成 方法分為三類: 基于代碼特征的方法, 結合檢索的方法以及結合后處理的方法. 第一類是指使用深度學習算法利 用代碼特征進行代碼生成的方法, 第二類和第三類方法依托于第一類方法進行改進. 本文依次對每一類方法的已 有研究成果進行了系統的梳理, 總結與點評. 隨后本文還匯總分析了已有的代碼生成工作中經常使用的語料庫與 主要的評估方法, 以便于后續研究可以完成合理的實驗設計. 最后, 本文對總體內容進行了總結, 并針對未來值 得關注的研究方向進行了展望.
**1 引言 **
從計算機誕生開始, 雖然編程的形式隨著硬件及軟件的不斷進步而不停迭代, 但是從事計算機技術行業 的人員始終與編寫代碼的任務緊密聯系在一起. 因此如何提高軟件開發的效率和質量, 一直是軟件工程領域 的重要問題之一. 這一方面是由于在不同軟件開發過程中存在大量相似代碼復用的情況, 多次編寫重復代碼 會大大降低開發人員的開發效率以及創造熱情; 另一方面, 結構清晰, 功能完備的高質量代碼能夠使得軟件 開發過程明晰, 并能夠在后期有效降低維護成本.
除了互聯網領域的工作人員, 計算思維在當今信息社會對于每一位從業者都必不可少. 政府也在制定相 關專門文件推動和規范編程教育發展, 幫助學生理解并建立計算思維[1] . 但事實上, 對于大多數沒有經過系統 化學習的人而言, 從零開始上手編程并完整完成一段能夠實現具體功能的程序是極具挑戰的. 編程作為一種 手段來完成人們設想的功能, 本質上是一種工具, 但這樣的學習門檻使得想法與實際操作之間存在差異, 在 一定程度上阻礙了許多具有創意性思維程序的誕生.
程序自動生成方法是一項機器根據用戶需求自動生成相應代碼的技術. 智能化代碼生成具有多元形式, 一般地, 根據實際應用場景以及生成過程所需要的信息, 可以將智能化代碼生成分為代碼生成(Code Generation)和代碼補全(Code Completion)兩個任務. 前者是指根據開發人員利用自然語言編寫代碼的需求(部 分會加入輸入輸出樣例), 機器生成特定編程語言的代碼片段(部分方法加入后處理環節以保證代碼的可執行); 后者則是指在開發人員編寫代碼過程中, 代碼補全算法模型根據已編寫代碼上文自動理解開發人員的編寫意 圖并補全代碼. 根據補全的代碼粒度, 又可以將其分為詞元級別(token-level)以及行級別(line-level)[2] . 簡單來 說, 代碼生成接收的輸入是自然語言描述, 輸出是能夠一定程度實現自然語言描述功能的代碼片段; 而代碼 補全任務接收的輸入是當前代碼的上文, 輸出的是當前代碼的下文. 本文研究的智能化代碼生成限定于前者, 即代碼生成(Text-to-Code), 旨在根據自然語言描述生成特定編程語言的代碼片段. 具體來說, 本任務關注軟 件實際開發過程中使用的高級編程語言, 如 C++, Java 和 Python 等. 這里給出代碼生成問題的數學定義, 給定自然語言描述:
, 智能化代碼生成模型, 目的是生成代碼片段:
傳統的代碼生成方法主要依賴于高質量的詞匯表, 手工構建的模板和特定領域的語言特性, 要求程序員 人工編寫邏輯規則, 以便生成程序能夠根據其設定規則生成符合邏輯的代碼片段. Little 等人[3] 提出了一種將 關鍵字(自然語言)轉換為 Java 方法調用表達式的算法. Gvero 等人[4] 為 Java 編程語言和 API 調用構建了一種概 率上下文無關語法, 并提出算法可以將英文輸入映射為聲明, 最終生成有效的 Java 代碼片段. 這樣人工提取 的方法具有很大的局限性, 不能夠適應復雜多變的編程環境, 同時也增加了開發人員編寫邏輯規則的開銷. 因此隨著人工智能和深度學習算法的進步, 自動提取詞匯表及特征來生成可執行代碼片段也得到長足發展.
事實上, 最近十年來, 利用機器學習和深度學習算法解決計算機各個領域相關問題的研究已成為一種趨 勢. Hindle 等人[5] 發現代碼與自然語言在統計學上呈現相似的分布, 代碼同自然語言一樣是重復的, 有規律的 和可預測的. 這樣的研究結果為人工智能領域的相關算法模型應用到代碼領域相關的問題提供了理論基礎, 即 AI(Artificial Intelligence) for SE(Software Engineer). 最近, Chen 等人[6]對代碼的自然性及其應用的研究進展進行了系統的綜述, 有助于研究者更好地利用自然語言領域的思想來解決代碼領域的問題. 對于代碼生成任 務而言, 借助機器學習和深度學習算法, 利用數據驅動構建模型, 完成自動代碼生成已成為程序自動代碼生 成任務的解決范式, 稱為智能化代碼生成. 智能化代碼生成能夠有效應對不同的開發環境, 提高軟件開發的 效率和質量, 減輕開發人員的壓力, 降低代碼編寫的門檻.
然而, 代碼生成問題在研究時也面臨諸多嚴峻挑戰: 首先, 自然語言描述形式多種, 表達多樣, 對于同樣 的函數描述實現可能一百個人就有一百種表達方式. 因此, 能否正確理解自然語言所描述的意圖對于代碼生 成的質量具有決定性作用. 其次, 代碼生成本質是生成類任務, 使用到的模型在解碼過程中往往伴隨著巨大 的解空間, 針對復雜問題所生成的代碼可能存在無法被執行或對于實際問題沒有完全解決的情況, 如何在其 中找到正確的符合用戶需求的代碼仍需要被探索. 因此, 如何更好地利用已有的外部知識庫(例如 Stack Overflow 論壇)來提升代碼生成模型的效果成為了一個可能的解決方案. 上述這些問題雖隨著模型的一步步增 大帶來的性能提升有所緩解, 但仍未解決. 最后, 目前對于代碼生成的質量評估主要采用了自動評估的方式, 評估的指標從機器翻譯領域的指標轉向基于測試樣例的指標, 這一定程度上有助于實際模型性能的評價. 但 對于實際場景中的代碼生成, 缺乏人工評價的板塊, 使得目前代碼生成模型落地后的表現距開發人員的期待 仍存在一定的差距.
2 研究框架
為了對智能化代碼生成相關領域已有的研究工作和取得成果進行系統的梳理, 本文使用 code generation、 generating source code、 generating program、 program synthesis 作為關鍵詞在 ACM Digital Library、 IEEE Xplore Digital Library、 Elsevier ScienceDirect、 Springer Link Digital Library、 Google scholar 和 CNKI 在線 數據庫中進行檢索. 基于上述論文數據庫中檢索出來的相關文獻, 我們在人工篩選方法的基礎上, 通過分析 論文的標題、關鍵詞和摘要去除與代碼生成無關的文獻. 接著我們遞歸地對每篇文獻進行正向和反向滾雪球 搜索[7] , 最終選擇出與主題直接相關的高質量論文共 53 篇(截止到 2022 年 11 月).
如圖 1 所示, 從 2015 年到 2019 年, 智能化代碼生成相關論文的數量呈上升趨勢, 說明智能化代碼生成任 務逐漸被學界關注, 完成了部分研究并取得了一些成果. 隨著 2020 年 CodeBERT[26] 提出, 智能化代碼領域也 掀起了利用大型語言模型在代碼語料進行預訓練, 并在下游相關任務進行微調的熱潮. 因此 2021 年和 2022 年 相關的論文大幅增加. 尤其是 2022 年, 論文數量達到了 19 篇, 相關話題也在學界和工業界之外引起了社會的 廣泛討論. 值得一提的是企業的論文(如 PANGUCoder 與 AlphaCode)常常直接在網上進行模型架構的公開, 為 產品做技術支撐. 雖然這些論文不會在期刊或會議上發表, 但是其背后的思想及解決問題的工程方法具有很強的借鑒意義, 不容忽視. Hu 等人曾在 2019 年對基于深度學習的程序生成與補全技術進行了系統完備的中文綜述[8] , 但是隨著后 續智能化代碼生成任務相關研究成果的急劇增加, 領域內亟需對于此任務進行回顧與總結, 方便后續研究者 在此領域繼續深耕. 本文將主要內容放在生成高級程序語言所編寫的代碼生成任務上, 主要討論基于深度學 習(即神經網絡架構)的相關模型. 根據代碼生成方法的主要思想和核心部件, 本文主要將代碼生成方法分為三 類, 基于代碼特征的代碼生成方法, 結合檢索的代碼生成方法和結合后處理的代碼生成方法, 后兩者可以視 作基于第一類方法進行改進的代碼生成模型, 而第一類又可以根據使用的范式不同分為基于監督學習的代碼 生成方法和基于預訓練的代碼生成方法. 表 1 展示了本文所收集論文分類的概況. 本文主要關注智能化代碼生成任務使用的模型以及算法的創新性, 算法的評估指標(及優劣), 使用數據集 以及適用編程語言(即適用場景)四方面內容. 同時對之前工作中涉及到的數據集及評價指標單獨進行了整理, 并對于不同數據集涉及的編程語言類型, 規模和相關論文使用的情況進行了統計. 除此之外, 本文還針對擁 有檢索增強模塊以及后處理環節相關的論文進行單獨討論. 本文第 1 章為引言, 第 2 章介紹綜述的整體研究框架. 第 3 - 5 章分別介紹基于代碼特征, 結合檢索以及 基于后處理的代碼生成方法的相關研究工作, 并進行討論. 第 6 章匯總常用的代碼生成數據集. 第 7 章介紹代 碼生成評估指標. 第 8 章對全文進行總結并對未來值得研究的領域進行展望.
3 基于代碼特征的代碼生成方法
直觀上, 代碼生成任務可以簡單抽象為機器翻譯的問題, 即將自然語言描述翻譯為代碼表示. 在機器翻 譯問題中最常用的模型是序列到序列模型(Squence2Sequence Model), 其主要思想就是從訓練數據中學習自然 語言特征, 并利用代碼特征進行生成. 在這個過程中需要用到大量的自然語言-代碼對(), 以便模 型能夠從訓練數據中學習到雙模態數據的對應關系, 因此在本文中被稱作基于監督學習的代碼生成方法. 自 2017 年 Transformer 模型[9] 的提出, 大型預訓練模型在自然語言處理領域不斷發展, 對計算機視覺甚至 通用人工智能領域都產生了巨大的影響. 同樣, 代碼生成任務也積極引入大型預訓練模型, 試圖在已有挖掘 代碼特征的基礎上結合預訓練范式進一步提升模型性能. 預訓練模型主要存在兩個特征, 第一個是在預訓練 階段其所需數據往往是無標注的數據, 通過還原掩藏掉的部分詞元或片段來進行訓練[10] , 這樣的訓練過程被 稱為自監督訓練. 第二個是模型的規模以及所需數據量都非常大, 這是因為許多工作[11,12] 都發現隨著模型規 模的增大, 數據量的增多和計算量的提升, 模型的性能就會不斷提高. 直到本文完成的時刻, 尚未有工作發現 預訓練模型性能的瓶頸. 與其他領域任務一樣, 基于預訓練的代碼生成方法顯著提高了代碼生成的下限, 并 逐漸成為最近幾年研究代碼生成問題的主要解決方案. 因此, 本文將基于預訓練模型進行代碼生成任務的代 碼生成方法單獨列出, 作為本章的第二部分.
**3.1 基于監督學習的代碼生成方法 **
**3.1.1 簡述 **
在基于監督學習的代碼生成方法中, 最常用的模型是序列到序列模型[13] , 其對應的是編碼器-解碼器范式, 主要包含編碼器(Encoder)和解碼器(Decoder)兩部分, 被廣泛應用于自然語言處理中的生成類任務, 同樣也被 代碼生成類任務廣泛使用. 對于代碼生成任務而言, 編碼器將輸入自然語言描述轉變為固定長度的向量表示, 解碼器則將編碼器所產生的向量表示轉變為可運行程序輸出. 下面提到的相關模型均基于這樣的模型框架進 行, 由于比起自然語言, 代碼自身具有規律化和模塊化的特點, 因此模型往往對解碼的相關操作以及應用信 息進行改進. 使用到的數據均為的形式, 目的是從數據對中挖掘出文本和代碼之間的對應關系, 從而完成生成任務. **3.1.2 已有工作的分析 **
高級程序設計語言的智能化代碼生成流程首先由 2016 年 Ling 等人[14] 的工作定義. Ling 等人希望在卡牌 游戲萬智牌(Magic the Gathering)和爐石傳說(Hearth Stone)中, 可以通過自然語言描述某一張卡牌的能力或效 果, 讓模型自動地去生成對應的卡牌定義代碼(高級程序語言, 即 Java 和 Python)來減少開發人員編寫卡牌效 果的時間成本. 作者利用序列到序列模型來實現自然語言到代碼片段之間的轉換. 在傳統注意力機制模型中, 輸入的注意力是由 RNN(Recurrent Neural Network, 循環神經網絡)中每一個單元的輸出經過計算加權得來. 作 者將注意力機制模型進行改進, 在計算輸入的注意力時考慮了每一個輸入域并將各個輸入域都用作計算注意 力值. 但是由于每一個輸入域的值域和輸入規模都不一樣, 因此作者利用線性投影層將不同輸入投影到同一 個維度和值域上. 為了統一自然語言和代碼之中的實體(如變量名等)信息, 作者利用選擇預測器(select predictor)來預測自然語言中需要保留的字段, 并且結合序列到序列模型來生成代碼的主體框架, 然后填入自 然語言中的保留字段來實現對應卡牌代碼的生成. 2017 年, Yin 等人[15] 在 Ling 的工作上[14] 做出了進一步改進, 作者利用語法模型顯式地對目標語言的語法 進行建模, 并且作為先驗知識融入模型訓練之中. 模型的編碼器和之前工作一樣利用雙向長短期記憶網絡 (Long Short-Term Memory, LSTM)對自然語言進行編碼, 但是在解碼器端, 模型的目標生成是抽象語法樹 (Abstract Syntax Tree, AST)的構建動作序列而非可執行代碼. 得到構建動作序列之后再生成樹, 并轉化為相應 的可執行代碼. 經過實驗, 模型在多個數據集中達到了最好的結果. Rabinovich 等人[16] 則是引入抽象語法網絡(Abstract Syntax Networks, ASNs)作為標準編碼器-解碼器范式的 擴展. 與常規的序列到序列模型相比, 抽象語法網絡的輸出為抽象語法樹, 核心在于改變解碼器, 使其具有與 輸出樹結構平行的動態確定的模塊化結構. 作者在文中使用了抽象語言描述框架(Abstract Syntax Description Language, ASDL)將代碼片段表示為具有類型化節點的樹. 模塊化解碼器本質為相互遞歸的模塊集合, 其包含 的四個模塊根據給定輸入分別以自頂向下的方式遞歸生成可執行代碼的抽象語法樹. 經過這樣流程所產生樹 的語法結構就反映了生成過程的調用圖, 即完成了代碼生成任務. 2018 年, 在上述模型的基礎上, Iyer 等人[17] 在編碼器端構造了類型矩陣(Type Matrix)來標識方法名和變量 名數據類型, 并將矩陣拼接到編碼器輸入之后, 來一起計算輸入的嵌入向量; 在解碼器端, 作者利用兩步注意 力計算每一個 token 的注意力以及每一種類型和變量名的注意力, 最終利用第二步的注意力結果作為最后生 成代碼的先驗. 除此之外, 由于當下模型生成的類中有可能包含沒有被學習過的域信息, 所以作者利用監督 復制機制來決定哪一個標識符是需要復制到代碼中生成. Iyer 等人[18] 在一年后對此方法進行改進, 提出了一種 迭代方法, 通過反復整理大型源代碼體的最常出現的深度 - 2 子樹, 從大型源代碼語料庫中提取代碼習語的語 法樹, 并訓練語義分析器在解碼過程中應用這些習語. 這里的代碼習語是指代碼片段中最常見的結構(比如嵌 套循環, 條件判斷等), 文中用語法解析樹中經常出現的子樹表示. 相比于利用語法樹解析代碼習語并得到一 顆很深的語法樹, 直接將代碼習語應用到解碼過程中可以提升訓練速度和性能. 作者將所有的代碼習語壓縮 到一顆深度為 2 的簡化語法樹之中, 使得模型可以更精準地輸出對應的代碼. 同樣是在 2018 年, Yin 等人[19] 則是在之前自己工作的基礎上[14] 提出了 TranX, 一個基于 transition 的代碼生成模型. TranX 的核心在于 transition 系統, 其能將輸入的自然語言描述根據一系列樹構造動作映射到抽象語 法樹上. 模型以抽象語法樹作為中間表示, 對目標表示的特定領域結構進行抽象. 最后再利用一個由神經網 絡參數化的概率模型對每一個假定的抽象語法樹進行評分, 從而得到目標代碼的抽象語法樹, 進而完成代碼 生成的目的. 一年后, 作者又在此基礎上加以重排序(Reranking)技術[20] 進行優化, 主要使用了重排序模型對 代碼生成結果進行重排序來提升模型性能. 重排序主要由兩個方面內容完成, 一方面是根據生成的代碼來重 構真實輸入文本的概率進行評估; 二是利用匹配模型直接評估代碼與輸入文本的相關程度. 重排序模型也同 樣分為兩個部分來完成上面兩方面的評估, 一是生成重構模塊(Generative Reconstruction Feature), 使用一個帶 注意力機制的序列到序列模型, 通過生成的代碼極大似然估計出輸入的文本; 二是利用判別匹配模塊 (Discriminative Matching Feature), 將生成代碼與輸入文本的 token 借助注意力機制的神經網絡計算出結果. 2019 年, Sun 等人[21] 發現了程序代碼比起自然語言描述包含有更多有意義的 token, 因此之前工作使用 RNN來捕獲長距離序列可能并不恰當. 作者在文中提出了基于語法的結構化卷積神經網絡(Convolution Neural Network, CNN), 根據抽象語法樹中的語法構造規則來完成代碼生成任務. 詳細來講, 文章主要針對解碼器部 分進行了部分抽象語法樹(即已生成的代碼所構成的抽象語法樹)信息的補充, 并為提取抽象語法樹中不同粒 度的信息分別設計了卷積層, 最終將多種信息聚合達到增強模型的效果. 同年, Wei 等人[22] 提出代碼生成任務和代碼總結任務兩者是對偶任務(dual task), 于是作者利用對偶任務 學習的方法來同時提高兩者的性能, 即代碼生成(Code Generation)模型和代碼摘要(Code Summarization)模型 被同步地訓練, 其思想也被運用到后續的研究當中[23] . 2020 年, Sun 等人[24] 使用 Transformer 架構來解決代碼元素之間存在的長依賴問題, 并對模型進行修改提 出 TreeGen, 使其能夠結合代碼的結構信息. 具體來說, TreeGen 共分為三個部分: NL Reader, AST Reader 和 Decoder. 其中, NL Reader 用于對自然語言描述進行編碼, AST Reader 用于對已生成的部分代碼的語法樹進行 編碼, Decoder 則是用于聚合帶有自然語言描述的生成代碼的信息并預測接下來的語法規則. 本文將基于 AST 的代碼生成任務視作通過語法規則來擴展非終結符節點, 直至所有的葉子結點均為終結符停止的過程.
**3.2 預訓練模型 **
**3.2.1 簡述 **
近些年來, 預訓練模型在自然語言處理領域取得了巨大的成功. 從預訓練模型架構來看, 可以分為編碼 器-解碼器架構(Encoder-Decoder), 僅編碼器架構(Encoder-only)和僅解碼器架構(Decoder-only). 雖然模型總體 架構并無形式創新, 但是其核心思想與之前的基于監督學習的模型不同. 預訓練模型從大規模無標注的數據 中通過自監督的訓練策略獲取知識, 且絕大多基于 Transformer 架構進行. 首先在大規模的無標注的數據集上 對模型進行預訓練, 然后利用預訓練得到的表征在下游的有標注數據集上進行微調. 實驗證明這種方式可以 極大地提高模型的泛化性, 在多項任務上取得了很好的結果. 類似地, 研究人員在代碼領域也提出了對應的 預訓練模型, 并且在代碼生成任務上取得了優異的效果.
**3.2.2 已有工作的分析 **
CuBERT[25] 是首個提出代碼預訓練模型的工作, CuBERT 繼承 BERT[10] 的架構, 利用代碼語料進行訓練, 但和 CodeBERT[26] 相比, 其影響力較小. CodeBERT 是第一個多編程語言的大型雙模態(指自然語言描述 NL 與 編程語言 PL)預訓練模型, 后續在各個下游任務上被廣泛使用, 影響力較大. CodeBERT 的預訓練的任務為掩 蔽語言建模(Mask Language Modeling, MLM)[10] , 通過隨機掩蓋模型中的某些詞并讓模型去預測被掩蓋的詞, 在預訓練階段提高模型的理解能力. 在實際場景當中, CodeBERT 被用來作為編碼器對輸入的文本或代碼進行 編碼, 然后應用到各式各樣的下游任務中, 例如代碼生成, 代碼摘要以及代碼檢索等. 由于 CodeBERT 僅僅包含文本的語義信息, 所以 Guo 等人[27] 在 2021 年提出將代碼的結構信息數據流納 入預訓練的過程之中并提出 GraphCodeBERT, 同樣采用 MLM 對模型進行預訓練. 但不僅僅掩蓋文本信息中 的一些單詞, 而是也會在代碼的數據流圖之中隨機掩蓋某些數據節點然后讓模型去預測. 實驗證明在預訓練 過程中顯式地去考慮代碼的結構信息可以極大地提高代碼對模型的理解能力, 并提高在下游任務當中的性能. 上述預訓練模型僅僅包含編碼器端, 這種架構的預訓練模型在理解任務上的效果較好, 但無法很好地完 成生成式任務. 為了更好地完成根據自然語言描述進行代碼生成(Text-to-Code)的任務, CodeXGLUE[2] 中提出 了 CodeGPT 模型, 這是一個由代碼語料進行訓練, 與 GPT-2[28] 完全同架構的 12 層 Transformer 解碼器模型. 與僅編碼器架構的模型相比, 僅解碼器架構能夠更好地完成生成代碼的任務. 除了單獨使用 Transformer 的編碼器或解碼器結構, 后續也有相關工作同時使用了 Transformer 的兩端. Clement 等人[29] 對于代碼和自然語言描述采用了同一個詞匯表, 基于 T5(text-to-text transfer transformer)[30] 提出了多模態的翻譯模型 PYMT5, 通過單個模型既可以同時學習到代碼/自然語言生成并且理解二者之間的 關系. PYMT5 使用 T5 利用相似子序列掩藏目標(similar span-masking objective)進行預訓練, 其本質是一個基 于編碼器-解碼器架構的 Transformer 模型. 子序列掩藏目標是指隨機采樣一些連續的 3 個 token 的子序列使用 特殊標記(例如[MASK 0])對其進行掩藏, 然后訓練序列到序列模型來補全這些掩藏的 token, 訓練目標包含了 被隱藏 token 及其序號. 作者將 PYMT5 與在同樣數據集上進行預訓練的 GPT-2 相比取得了很大提升. Ahmad 等人[31] 提出的 PLBART 也是一個編碼器-解碼器模型, 在預訓練過程當中, 與 CodeBERT 做法一 樣, 作者隨機掩蓋某些單詞, 但是 PLBART 輸出的是一個完整的文本或單詞, 其中包括了被掩蓋的單詞. 通過 這種訓練方式, 作為一個序列到序列模型的 PLBART 就可以在預訓練階段在編碼器和解碼器端同時學習到很 好的初始化點, 讓預訓練好的模型可以更快更好地應用到下游任務當中. PLBART 提高了模型在生成任務上的 能力, 也提高了模型在代碼生成任務上的表現. 更進一步地, Wang 等人[32] 在 2021 年提出了 CodeT5, CodeT5 在預訓練階段充分考慮到了代碼的特點, 作 者從代碼片段中抽取標識符, 并重點讓模型去預測這些在代碼中具有實際意義的單詞, 實驗證明 CodeT5 在包 括生成任務在內的多項軟件工程領域任務均取得了更好的效果. 同一時間, Phan 等人提出了 CoTexT[33] , 同樣 使用了編碼器-解碼器架構, 模型初始化也使用了 T5. 唯一的區別在于為了縮小預訓練和調優之間的差異, CodeT5 利用了雙模態數據去訓練模型完成一個雙向生成的轉換. 具體來說, CodeT5 將 NL→PL 的生成與 PL→NL 的生成視作對偶任務(dual task), 并同時對模型進行優化. 根據兩篇文章中實驗結果的對比, CodeT5 的效果要好于 CoTexT, 但是如果只是在 T5 的基礎上利用多任務學習來提升代碼生成任務的性能, CodeT5 和 CoTexT 效果相當. 簡單來說, CodeT5 和 CoTexT 兩個模型在完成代碼生成任務的具體實現上最大 的差別在于是否使用代碼生成與代碼摘要作為對偶任務進行訓練. 這樣的實驗結果側面證明了將代碼生成和 代碼摘要任務作為對偶任務能夠提升模型的生成能力. Nijkamp 等人[34] 開源了大型預訓練模型 CodeGEN, 模型參數高達 16.1B, 依次在 THEPILE, BIGQUERY, BIGPYTHON 三個數據集上進行訓練, 數據量超過 800G. 與之前直接將自然語言輸入給預訓練模型不同, 作 者提出利用大型預訓練模型進行對話式程序生成的方法: 作者將編寫規范和程序的過程描述為用戶和系統之 間的多輪對話. 用戶分多次為系統提供自然語言, 同時以合成子程序的形式接收來自系統的響應, 這樣用戶 與系統一起在多輪對話后完成代碼生成. 分步提供自然語言規范的方式可以將較長且復雜的意圖分解為多個 簡單的意圖, 減少每一輪對話中模型的搜索空間. 除此之外, 作者還開發了一個多輪編程基準來衡量模型的 多輪程序綜合能力, 實驗結果表明以多輪方式提供給 CodeGEN 的相同意圖與單輪提供的相比顯著改進了代碼 生成的性能, 驗證了對話式代碼生成范式的有效性. 之前的代碼生成模型都是從左到右生成代碼序列, 然而在實際開發過程中, 代碼很少直接以從左到右的 方式編寫, 而是完成部分代碼編寫后反復編輯和完善. InCoder[35] 打破了先前從左至右的代碼生成預訓練模型 范式. 這是一種統一的生成模型, 可以執行程序合成(通過從左到右生成)以及編輯(通過掩蔽和填充). InCoder 的模型架構繼承自 GPT 架構, 不同點在于其對訓練語料進行順序打亂預測. 該方法隨機選擇一個跨度并將其 替換為掩碼 token, 并將跨度放置在序列之后作為目標. 利用這樣處理后的語料進行訓練, 使得模型具有填充 雙向上下文的能力. 這樣 InCoder 不僅可以從左到右預測 tokens, 而且可以根據兩端的 tokens 預測中間的 tokens, 實現了填充式的代碼生成技術. 這是第一個能夠填充任意代碼區域的大型生成代碼模型, 這種以雙向 上下文為條件的能力大大提高了代碼生成任務的性能.
越來越多基于 Transformer 體系結構的大型預訓練模型被提出并在代碼生成任務上取得最優結果. 因此, 一些企業機構著手于將大型預訓練代碼生成模型落地, 試圖為廣大開發人員提供便利, 并在此過程中為業界 提供了大量優質的代碼生成模型. 2021 年年末, OpenAI 最早發布的 CodeX[36] , 是基于 GPT-3 在公開數據集上預訓練得到的大規模模型, 基 于 CodeX 的 Copolit[37] 插件也已成為代碼生成輔助工具的標桿, 在 CodeX 論文中提出的 HumanEval 數據集也 成為后續代碼生成的常用基準數據集之一. 2022 年年初, DeepMind 公司研發的展現出強大編程能力的 AlphaCode[38] 在新聞上號稱打敗了一半的程序 員, 本質上也是基于公開代碼倉庫進行預訓練的大規模模型. 與 CodeX 不同, AlphaCode 更專注于競賽題目的 編寫, 因此選用了完整的 Transformer 架構的模型, 便于更好地理解較長的由自然語言描述的題目, 同時在調 優時也選擇了 CodeForces[39] 的競賽題目. 國內, 華為推出的 PanGu-Coder[40] 是基于 PanGu-alpha 模型在公開代碼數據集上進行預訓練. 之后基于此開發的 CodeArts 插件也已在實際開發場景中擁有不錯的表現, 對標基于 CodeX 的 Copoilt. 2022 年, aiXcoder[41] 團隊陸續推出了用于 Java 代碼補全的 13 億參數量的 aiXcoder L 和 130 億參數量的 aiXcoder XL 服務. aiXcoder L 基于 GPT-2, 在開源 Java 代碼上訓練得到. aiXcoder XL 基于自研的 masked language model 框架, 能做到單行、多行以及函數級代碼補全和生成. 最近, 清華大學聯合鵬城實驗室共同推出的大規模代碼生成預訓練模型 CodeGeeX[42] , 采用了標準的 Transformer 架構, 在公開代碼倉庫超過 20 多種編程語言上進行預訓練, 能夠支持較其他開源基線更高精度的 代碼生成性能, 能夠支持代碼片段在不同編程語言間進行自動翻譯轉換. 如表 2 所示, 匯總了本節涉及到的代碼生成預訓練模型相關內容. 除以上專門用于進行代碼生成任務的相關模型, ChatGPT[43] 雖作為問答模型, 但也被證實具有代碼編寫 的能力, 自 2022 年 12 月發布以來就引起了學術界和工業界的廣泛討論. ChatGPT 能夠適應不同的問題情境給 出接近甚至超過人類的回答, 并具有一定推理和代碼編寫能力. ChatGPT 與 InstructGPT[44] 使用了相似的訓練 方式. 主要流程分為三個步驟, 第一步是搜集帶標記的數據使用監督學習策略對已有的 GPT 模型進行調優; 第二步是搜集來自人類反饋的比較數據來訓練一個分類器(稱為 reward model)用于比較 GPT 模型生成若干答 案的好壞; 第三步是借助第二步訓練好的 reward model, 利用強化學習策略對模型進行進一步優化. 原有的提 示學習范式是通過調整模型的輸入使得下游任務更好地適配模型, 而通過 InstructGPT 的訓練過程及 ChatGPT 的出色表現可以發現, 模型的性能尚未被充分挖掘, 且可以通過人為標注反饋的方式, 讓模型更好地去理解 用戶的意圖, 達到讓模型適配用戶的目的.
**3.3 小結 **
本章主要對基于代碼特征的代碼生成方法相關工作進行了敘述與梳理, 并按照監督學習與預訓練-調優 范式分為兩節進行概述. 在基于監督學習的代碼生成方法中, 主要依托于編碼器-解碼器架構進行自然語言描述與代碼特征的挖 掘, 試圖從訓練數據中學習到自然語言與代碼之間的對應關系. 除此之外, 一些工作針對解碼器生成代碼的 部分進行了改動, 試圖將更多代碼相關的規則性信息融入其中, 取得了比僅使用 token 進行代碼生成更好地性 能. 在基于預訓練的代碼生成方法中, 主要對引入代碼生成任務的預訓練模型進行了簡單介紹. 這一小節的 方法的骨干模型(backbone)均來自于自然語言處理領域的大型語言預訓練模型. 將其應用于代碼生成任務的 一個大致流程為: 收集大量無標注的代碼語料, 其中包含代碼注釋, 利用試圖還原掩藏掉的部分代碼片段對 模型進行預訓練, 最后再使用對數據對預訓練模型進行調優. 最近, ChatGPT 所具備強大的語言理解能力和一定程度的推理能力引起學術界和工業界的廣泛關注, 其 背后通過反饋調整使模型來匹配用戶的思想, 為進一步挖掘大規模語言預訓練模型提供了新的解決思路.
**4 結合檢索的代碼生成模型 **
**4.1 簡述 **
對于第三章中的代碼生成模型而言, 其代碼生成過程的解空間過大, 這種現象在預訓練模型中的表現愈 發明顯[36] . 互聯網上存在的代碼片段數量非常龐大, 對于用戶的絕大部分要求而言, 其他開發人員可能存在 過類似的需求, 并已經與他人協作或自行完成相關代碼的設計與編寫. 因此, 檢索出類似已存在的代碼模板 這個任務本身就是有利于用戶更深刻理解任務的. 同時, 基于前人相關任務的代碼模板進行的改動也比直接 生成的代碼更具有實用價值. 編寫代碼是一個開放域(open-domain)的問題, 即在編寫代碼過程中不可避免需要參考前人工作與他人的 編程思路, 而在第二章中介紹的大部分工作則是直接將其視作封閉性質的任務(closed-book)[45] , 即只是根據訓 練數據的模式來完成代碼生成的任務. 從這個角度來看, 引入外部知識庫對原有訓練的模型進行補充是有意義有價值的. 事實上, 利用自然語言描述的編碼作為編碼過程中的先驗可能是不足的. 為了讓已有代碼生成 模型與外部代碼知識數據庫相結合, 有相關工作利用檢索操作對代碼生成過程進行增強. 通過檢索相似代碼 幫助解碼器進行代碼生成, 以減小解碼空間, 最終提升生成代碼的質量.
本章主要對結合檢索的代碼生成方法相關工作進行了簡單介紹.本章中提到的方法并沒有設計新的模型 架構, 而是通過結合檢索的方式生成代碼片段. 如圖 3 所示,結合檢索的代碼生成方法大致可以分為兩種形式, 第一種是圖 3 的上半部分(即圖中①部分): 從訓練數據或是外部知識庫檢索出與目標代碼相關或相似的代碼 片段, 將其作為模板進行編輯并返回結果; 第二種是圖 3 的下半部分(即圖中②部分): 將檢索得來的借過作為 原有模型的輸入, 試圖通過為自然語言描述補充代碼信息的方式提升模型的性能. 結合檢索的代碼生成方法 能夠大大降低生成模型解空間的規模, 同時也能在一定程度上利用外部知識庫使模型跳脫出自己訓練的固有 規則, 對于代碼生成任務是有幫助的. 在檢索的過程中, 往往將自然語言描述作為查詢的鍵(key), 并經模型處理后借助向量進行表示, 在訓練 數據或外部數據庫查找與查詢鍵(key)相關的代碼片段進行返回. 在這個過程中, 模型向量表示的能力決定了 檢索結果的質量. 因此, 嘗試多種自然語言表示形式與不同的模型表征方法可能是檢索增強的一條未來之路.
**5 基于后處理的代碼生成方法 **
**5.1 簡述 **
大規模預訓練語言模型往往將代碼視作普通的文本, 因此難以理解代碼更深層次的語法或語義[55] , 也就 不能夠產生具有質量和正確性保證的模型. 針對大規模預訓練語言模型, 一個重要的改進方向是通過測試樣 例對模型生成過程及生成結果進行測試并試圖加以改進[56, 57, 58] , 也有工作直接在模型的訓練過程中利用測試 樣例對其進行強化, 提升模型性能[60] . 通過測試樣例對生成的代碼進行改進可以視作機器執行過程的后處理, 而開發人員對生成代碼進行評估 可以視作人為測試代碼的過程, 因此有工作利用開發人員評估意見對已有代碼生成模型進行改進, 這可以被 視作人工測評過程的后處理[52] . 本章主要對結合后處理的模型生成方法進行了簡單介紹. 程序設計的目的就是解決實際問題, 測試樣例 與開發環境在一定程度上能夠作為實際場景中問題的采樣. 因此, 基于測試樣例與代碼實際運行環境對模型 進行改進一定程度上模擬了實際開發過程中所遇到的情形. 而對于遇到的問題或是錯誤進行修改就被稱為后 處理. 這種方式的處理流程類似于程序員面向 Bug 編程, 直觀而有效. 目前對于測試樣例的生成主要分為兩類, 人工編寫及模型自動生成. 對于生成測試樣例的質量仍未有一 個清晰的度量. 對于其他部署環境的后處理少有工作涉及.
6 代碼生成數據集
代碼生成任務用于訓練, 驗證和測試的數據集通常包含自然語言描述和對應的代碼片段. 一個代碼生成 數據集一般僅包含一種高級編程語言. 目前的代碼生成數據集有 Python 語言的 HearthStone[13] 和 CoNaLa[50] 、 Java 語言的 CONCODE[17] 、 SQL 語句的 Spider[59] 和 Lyra[61] 數據集, 以及基于 Django Web 框架的 Django[62] 數據集等. 目前有如下常見數據集用于訓練, 驗證和測試代碼生成任務: (1) HearthStone[13] : 2016 年首次使用該數據集來解決代碼生成問題. 該數據集是為紙牌游戲 HearthStone 實現的 Python 類集合, 包含 665 張不同的 HearthStone 游戲卡片, 每張卡片帶有一組字段和對應的 Python 代碼片段. 其中字段是卡牌的半結構化描述, 包含卡名, 成本, 攻擊, 描述和其他屬性.(2) Magic the Gathering[13] : 該數據集是為紙牌游戲 Magic the Gathering 實現的 Java 類集合, 包含 13297 張不同的游戲卡片. 和 HearthStone 數據集類似, 每張卡片帶有一組字段和對應的 Java 代碼片段. (3) Django[62] : Django 數據集是 Django Web 框架中的代碼的集合, 該數據集由 Oda 等人提供. 為了制作 該數據集, Oda 等人聘請了一名工程師撰寫代碼, 最終獲得了 18805 對 Python 語句和對應的英語偽代 碼. 該數據集最初創立是為了用于源代碼生成偽代碼的任務, 后續被用于代碼生成任務中. (4) CoNaLa[50] : 為了得到與自然語言具有細粒度對齊的代碼, Yin 等人提出一種新方法. 該方法可以在 Stack Overflow 中挖掘高質量對齊數據. 實驗表明該方法大大擴展了過往挖掘方法的覆蓋范圍和準確 性. Yin 等人使用該方法創建了 CoNaLa 數據集, 其中包含 2879 個手動注釋的問題及其在 Stack Overflow 上的 Python 解決方案示例, 這些示例涵蓋了由具有不同意圖的程序員發出的真實自然語言 查詢. (5) CONCODE[17] : 在 GitHub 上收集了大約 33000 個 Java 項目, 根據存儲庫劃分 10 萬個樣本用于訓練, 4000 個樣本用于驗證和測試. 基于存儲庫的劃分使測試集中的域與訓練集中的域保持分離, 因此提 供了接近零樣本的條件. 每個示例是由自然語言描述, 代碼環境和代碼段組成的元組. 其中代碼環境 為類中的其他成員變量和成員函數. (6) Spider[59] : 該數據集由 11 名大學生注釋完成, 是一個大規模的自然語言到 SQL 的數據集, 它由 10181 個問題和 5693 個獨特的復雜 SQL 查詢組成. (7) Lyra[61] : Liang 等人認為, 在實際開發中, SQL 語句通常以字符串的形式嵌入 Python 中. 為了貼合實 際應用場景, Liang 等人提出了 Turducken-Style 代碼生成:為給定的自然語言注釋生成具有嵌入式語 言的代碼, 同時發布了 Lyra 數據集. 該數據集內含自然語言注釋及其對應的 Python 程序, 且該 Python 程序內含嵌入式 SQL 語句. (8) XLCoST[63] : Zhu 等人從 GeeksForGeeks 收集了一個包含 8 種語言(C++, Java, Python, C#, JavaScript, PHP, C 和英語)的數據集 XLCoST (Cross-Lingual Code SnippeT dataset), 能夠支持 10 種跨語言任務的 評估. 其中, 比起之前的代碼生成數據集主要針對 Python 和 Java, XLCoST 能夠適應更多其他語言代 碼生成任務(例如 C 和 C++)的評估. (9) MCoNaLa[64] : 為了根據英語以外的自然語言生成代碼, Wang 等人提出了一個多語言數據集 McoNaLa, 用西班牙語, 日語和俄語三種語言標注了 896 個對.
**7 代碼生成評估 **
為了使用統一的標準對生成代碼的質量進行快速評估, 研究人員使用多種指標進行評估, 本章節主要使 用以下自動化指標進行測試. 7.1 Exact Match accuracy 代碼生成任務中常使用精確匹配(Exact Match)作為模型評價指標, 該精確度指標表示模型生成代碼與參 考代碼之間完全匹配的百分比. 7.2 BLEU BLEU[70] 是用來評價機器翻譯質量的指標, 在代碼生成技術中可以將生成的代碼看做看作是翻譯產生的 語句 7.3 CodeBLEU Ren 等人[71] 認為, 用于評價自然語言的 BLEU 指標忽略了代碼的語法和語義特征, 并不適合評估代碼. 為 了彌補這一缺陷, 引入了一個新的評價指標 CodeBLEU. 它吸收了 n-gram 匹配中 BLEU 的優點, 并進一步通 過抽象語法樹( AST )注入代碼語法, 通過數據流注入代碼語義. 7.4 pass@k BLEU 指標使用的是模糊匹配, 難以衡量生成代碼的可執行性. 針對這一問題, 2019 年 Kulal[72] 等人提出 pass@k 指標.
**8 總結與展望 **
**8.1 總結 **
本文對高級程序代碼生成任務目前國內外最新進展進行了比較詳盡的闡述與總結. 我們將當前的智能化 代碼生成技術分為了三類, 第一類是基于代碼特征的代碼生成方法, 第二類是結合檢索的代碼生成方法, 第 三類是結合后處理的代碼生成方法. 基于代碼特征的代碼生成方法又可以根據模型訓練的范式分為基于監督學習的代碼生成方法和基于預訓 練的代碼生成方法. 前者使用了傳統的編碼器-解碼器架構以及 RNN 與 CNN 模型, 并通過加入結構化信息, 對解碼器的改進等操作, 在相關數據集上取得了不錯的效果. 后者則是從自然語言處理領域的預訓練大規模 模型得到靈感, 使用軟件工程領域相關代碼數據對大規模模型進行預訓練與調優, 從而大幅提升模型的性能. 結合檢索的代碼生成方法和結合后處理的代碼生成方法可視作對基于第一類方法部分模塊的改進, 試圖 提升代碼生成模型的性能. 對于結合檢索的模型而言, 檢索的方式常常用于對已有的代碼生成模型進行增強, 可視作即插即用的組 件式模塊. 一方面, 檢索到的內容更多作為輸入數據的增強幫助原有模型更好地完成生成任務[44, 51] ; 另一方 面, 檢索能夠作為橋梁以便更加直接利用外部的文本和源碼信息作為原有模型的補充[49] . 結合后處理的模型通過實際運行過程借助測試樣例和開發環境對生成的代碼進行處理, 以提升其實際運 行表現, 一個趨勢是測試樣例的產生由人為編寫[56] 轉變為模型產生[58] . 不同的模型對于不同的測試樣例的用 法不盡相同, 但是核心思想和真實場景下編程相似, 即通過一些可能的錯誤來使得代碼本身更加健壯. 除此之外, 本文還概括介紹了智能化代碼生成任務中常用的數據集與評價指標, 以方便該領域后續研究 能夠進行合理的實驗設計. **8.2 展望 **
雖然目前的代碼生成方法在相關的數據集上已經取得了較好的結果, 但是相關技術仍然擁有許多挑戰值 得關注. **(1) 自然語言描述與代碼的對齊問題 **
自然語言與代碼在描述信息的角度與方法上有著巨大差異, 傳統上直接利用 token 訓練得到的序列到序 列模型很難去理解并提取自然語言中的功能表述并翻譯成對應的代碼. 基于此, 將代碼表示為樹來有效引入 代碼的結構信息成為提升模型性能的重要舉措, 但這并不是一項容易的任務, 因為語法樹中的節點數量通常 大大超過其對應自然語言描述的長度, 這樣的不對稱性會增加代碼生成任務的難度. 因此, 如何將自然語言 描述與代碼進行對齊對于傳統的序列到序列模型是一個極大的挑戰. 另一方面, 模型對于輸入自然語言的理解對于代碼生成任務的效果也格外重要. 自然語言描述多種多樣, 對于同樣的意思可能有多種表達的方式. 對輸入的多種自然語言進行重構, 為生成的代碼提供更加清晰明了 的需求, 可能是一項解決方法. 除此之外, 之前有工作[22, 23, 51, 52] 將代碼生成與代碼摘要兩個任務作為對偶任務對同一模型進行訓練取得 了不錯的效果, 尤其是 CodeT5 添加對偶任務后與 CoTexT 相比在代碼生成任務上的性能有顯著提升. 因此如 何將代碼生成與代碼摘要生成兩個任務更好的結合在一起仍需要被探索.
(2) 大規模預訓練模型的語法正確性問題
基于 AST 和語法的模型能夠產生語法正確的代碼, 但是一定程度上忽略了語義的正確性[27] ; 預訓練模型 大多能保證語義的信息, 但是不能保證語法的正確性[55] . 由于自然語言和代碼之間本身就存在的語義鴻溝, 直接基于語言模型的代碼生成模型在生成過程沒有足 夠的規則約束, 因此生成目標代碼時具有非常龐大的解空間. 這樣的問題在預訓練模型上表現尤為明顯, 雖 然在大量代碼庫上進行預訓練所得的大規模模型可以生成語義相關的代碼片段, 但是很容易導致生成代碼中 有語法錯誤以及生成代碼的可讀性較低. 如何在解空間中找到最優解或較優解成為了難題, 這導致輸出結果 中容易出現具有語法錯誤的, 無法通過編譯的代碼. 如何提取并學習源代碼中有效的結構信息, 填補自然語 言與代碼之間的差異, 從而對解碼過程進行約束仍是一個待探究的問題. 現有的預訓練模型大多都是繼承于自然語言處理領域的相關技術, 代碼領域相關研究一直沿著自然語言 處理領域的道路前進. 因此, 自然語言處理中的語法正確性問題在代碼生成任務中也普遍存在. 但有研究表 明, 自然語言處理中的標記化和嵌入方法可能在代碼領域中不是最優的, 脫離自然語言處理思維模式可能是 一種優化的思路[73] .
**(3) 大規模預訓練模型能力的挖掘 **
雖然近年來應用于代碼生成任務的大規模語言模型層出不窮, 但是已有許多論文[11, 12] 表明隨著訓練的繼 續進行, 模型的性能還能夠提高, 且一些預訓練模型還根據模型的大小將模型分為 small, base 和 large 來適應 不同的硬件條件下模型的應用. Wang 等人[74] 將自然語言處理中的提示學習(prompt learning)應用到代碼相關的 分類任務上, 取得的性能的提升. 2022 年初隨著思維鏈(chain-of-thought)[75] 的提出, 大規模預訓練模型的知識 被進一步挖掘. 鑒于 ChatGPT 強大的性能, 以及人類程序員在代碼編寫過程中的步驟化和模塊化的考量, 將 提示學習引入代碼生成任務, 更深一步挖掘已有大規模預訓練模型的性能在未來可能會成為一個重要的研究 方向. 除此之外, 還有相關研究[76, 77] 發現了將 Stack Overflow 中的問題和代碼答案作為雙模態數據用于模型調 優有助于模型性能的提升以及錯誤代碼生成的抑制, 證明了這樣的外部數據能夠成為挖掘大規模模型性能的 有效工具.
(4) 模型適應多種不同編程語言的能力 目前雖然能夠完成代碼生成任務的模型有很多, 但是對于高級程序語言而言, 大多圍繞 Java 和 Python 展 開. 這一方面是由于數據集的原因, 作為當今最為主流的兩大語言, Java 和 Python 在數據量和數據質量上都擁有得天獨厚的優勢. 另一方面是結構的問題, Java 和 Python 都是面向對象的編程語言, 與其它編程語言(比如 C 語言)相比, 因為完備的庫與 API 接口為相關功能的實現提供支撐, 所以他們可以完成具有更為簡潔直觀的 編寫方式, 在一定程度上與自然語言相匹配. 最近, 有一些工作創建了多種語言的代碼庫[38, 59, 63] , 如何合理利 用這樣的代碼庫讓模型能夠適應多種不同編程語言, 或許是提升模型性能的一種方式.
(5) 大型預訓練模型壓縮的問題 目前對于代碼生成類工具的普遍解決方案是將本地的代碼和軟件開發人員的相關需求傳送給服務器端, 由服務器端完成計算并將結果回傳給本地. 由于服務器端的模型需要實時的代碼和需求說明才能夠進行計算 并反饋結果, 因此代碼泄露成為不可忽視的一個隱藏問題. 為解決代碼泄漏的問題, 如何將高性能模型移植 到本地或其他受限資源的平臺上逐漸成為一項巨大的挑戰. 此外, 代碼生成任務的訓練和推理過程都對服務器端產生了巨大的壓力, 伴隨著模型的不斷增大, 如果 將訓練及推理代價與實際的計算資源進行權衡, 使得模型性能維持相對較高水平的情況下節省資源, 縮短代 碼生成時間, 為用戶帶來更好的體驗成為了第二項重大的挑戰. 以上兩項挑戰的解決可以歸結于大型模型的壓縮, 一方面可以將模型的規模變小, 使其能夠部署在一些 較低資源的平臺上, 節省計算資源; 另一方面可以提升模型的推理速度, 帶來代碼生成工具的體驗的提升.
**(6) 人工評估代碼生成方法性能 **
代碼生成技術的意義在于輔助軟件開發人員在實際開發過程中進行編碼, 要想評估代碼生成技術的實際 價值, 就需要對其進行人工評估, 人為地評判該技術在工程實踐中所發揮的作用. 但目前人工評估存在著評 判標準模糊, 評價指標不統一, 難以大規模快速評估的問題, 同時考慮到人工評估的代價巨大, 因此目前僅有 少量研究進行人工評估[78] , 但如果想要現在的優秀模型能夠落地成為普惠廣大用戶的代碼生成工具, 人工評 估方法的確定, 實際測試和廣泛討論必不可少.
任務語義可以用一組輸入到輸出的例子或一條文本指令來表示。傳統的自然語言處理(NLP)機器學習方法主要依賴于大規模特定任務樣本集的可用性。出現了兩個問題: **首先,收集特定于任務的標記示例,不適用于任務可能太復雜或太昂貴而無法注釋,或系統需要立即處理新任務的場景;其次,這對用戶來說并不友好,因為最終用戶可能更愿意在使用系統之前提供任務描述,而不是一組示例。**因此,社區對NLP的一種新的監督尋求范式付出了越來越大的興趣: 從任務指令中學習。盡管取得了令人印象深刻的進展,但社區仍面臨一些共同的問題。本文試圖從以下幾個方面對當前的指令學習研究進行總結:(1)什么是任務指令,存在哪些指令類型?(ii)如何為指令建模?(iii)哪些因素影響和解釋指令的執行?(四)指令中還存在哪些挑戰?據我們所知,這是第一次對文本指令的全面調查。
1. 引言
人工智能的一個目標是建立一個可以普遍理解和解決新任務的系統。標記示例作為主流任務表示,不太可能大量可用,甚至不存在。那么,是否有其他任務表示可以有助于任務理解?任務指令為表達任務語義提供了另一個監督維度,指令往往包含比單個標記示例更抽象和全面的目標任務知識。如圖1所示,通過任務指令的可用性,可以快速構建系統來處理新任務,特別是在特定于任務的注釋稀缺的情況下。**指令學習是受典型的人類對新任務的學習啟發,**例如,小孩可以通過從指令和幾個例子中學習來很好地解決一個新的數學任務(Fennema et al., 1996;)。這種新的學習范式最近引起了機器學習和NLP社區的主要關注(Radford等人,2019;Efrat和Levy, 2020;Brown等人,2020年)。
當談到任務指令時,我們大多數人首先會將這個概念與提示聯系起來——使用一個簡短的模板將新的輸入重新格式化為語言建模問題,以便為啟動PLM回復響應 (Liu et al., 2023)。盡管提示在文本分類、機器翻譯等中普遍存在,但提示只是指令的一種特殊情況。本文對指令驅動的NLP研究進行了全面和更廣泛的看法。具體來說,我們試圖回答以下問題:
什么是任務指令,存在哪些指令類型?
給定任務指令,如何對其進行編碼以幫助完成目標任務?
哪些因素(如模型大小、任務數量)影響指令驅動系統的性能,以及如何設計更好的指令?
指令學習能帶來什么應用?
指令學習中存在哪些挑戰,未來的方向是什么?
**據我們所知,這是第一篇調研文本指令學習的論文。**與一些現有的側重于特定上下文指令的調研相比,例如提示(Liu等人,2023)、按輸出輸入的演示(Dong等人,2023)或推理(Huang和Chang, 2022;Qiao et al., 2022),我們提供了一個更廣泛的視角,以有組織的方式連接該領域的不同研究。希望本文能呈現一個更好的指令學習故事,吸引更多同行來研究這個具有挑戰性的人工智能問題。我們還發布了本次調研的相應閱讀清單。
2. 基礎知識
對于任務式學習,目標是通過遵循指令來驅動系統達到給定輸入的輸出。因此,一個數據集由三個元素組成: Input (X): 實例的輸入;它可以是一段文本(如情感分類)或一組文本(如文本蘊涵、問題回答等)。 Output (Y): 實例的輸出;在分類問題中,它可以是一個或多個預定義標簽;在文本生成任務中,它可以是任何開放形式的文本。
模板(T): 一種文本模板,試圖單獨表達任務的含義,或者充當X和y之間的橋梁。T可能還不是一種組件結構。
3. 什么是任務指令?
在之前的零樣本和少樣本NLP任務中已經使用了各種類型的文本指令,例如提示(Hendrycks等人,2021;Srivastava等人,2022;Bach等人,2022,除其他外),Amazon Mechanical Turk 指令(Mishra等人,2022b;王等,2022c;Yin等人,2022年),輔以演示的指令 (Khashabi等人,2020年;Ye等人,2021;Min等人,2022b,特別是)和思維鏈解釋(Wei等人,2022b;Lampinen等人,2022;Li et al., 2022c,等。不同的指令最初是為不同的目標設計的(例如,Mturk指令最初是為人類標注者理解而創建的,提示是為了控制PLM)。在本節中,如圖2所示,我們首先將這些指令總結為三個類別,它們執行T、X和?Y的不同組合(面向蘊含、面向PLM和面向人),然后比較它們并提供指令的正式定義。
3.1 I=T^+Y:Entailment主導的指令
處理分類任務的一個傳統方案是將目標標簽轉換為索引,并讓模型決定輸入屬于哪個索引。這種范式側重于對輸入語義進行編碼,同時丟失標簽語義。為了讓系統識別新標簽而不依賴于大量標記的示例,Yin等人(2019)提出為每個標簽建立一個假設——然后,推導標簽的真值被轉換為確定假設的真值。如表1所示,這種方法內置在指令(I)中,將模板(T)與標簽Y相結合,以解釋每個目標標簽(Y)。由于這種范式自然地滿足文本蘊含的格式(TE,其中任務輸入和指令可以分別被視為前提和假設),這些類型的指令被稱為"面向蘊含(Entailment)的指令"。面向蘊含(entailment)的指令學習方法具有以下4個方面的優勢:(i)保持了標簽語義,使得輸入編碼和輸出編碼在建模輸入輸出關系時得到同等的重視;(ii)形成了一個統一的推理過程——文本蘊含——來處理各種NLP問題;(iii)它創造了利用現有TE數據集的間接監督的機會,以便預訓練TE模型有望在不進行特定任務微調的情況下在這些目標任務上工作;(iv)將原始的閉集標簽分類問題擴展為具有少量甚至零類屬類樣本的開放域開放形式標簽識別問題。因此,它被廣泛應用于各種少樣本/零樣本分類任務中,如分類主題(Yin等人,2019)、情感(Zhong等人,2021)、姿態(Xu等人,2022b)、實體類型(Li等人,2022a)和實體關系(Murty等人,2020;Xia等,2021;Sainz等人,2021,2022)。
3.2 I=T^+X:面向PLM的指令(如?提示)
提示是面向PLM的指令的代表,它通常是一個簡短的語句,前面加上任務輸入(前綴提示),或者一個完形填空問題模板(完形填空提示)。它主要用于從預訓練的語言模型(PLM)中查詢中間響應(可以進一步轉換為最終答案)。由于提示輸入符合PLM的預訓練目標(例如,完形風格的輸入滿足掩碼語言建模目標(Kenton和Toutanova, 2019)),它有助于擺脫對傳統監督微調的依賴,并大大減輕人工標注的成本。因此,快速學習在大量之前的少量/零樣本NLP任務上取得了令人印象深刻的結果,例如問答(Radford等人,2019;Lin等人,2021)、機器翻譯(Li等人,2022d)、情感分析(Wu和Shi, 2022)、文本蘊含(Schick和Schütze, 2021a,b)和命名實體識別(Cui等人,2021;王等,2022a)。
3.3 以人為本指示
以人為本的指令基本上是指在人類注釋平臺上用于眾包的指令(例如Amazon MTurk指令)。與面向人的指令不同,面向人的指令通常是一些人可讀的、描述性的、段落式的任務特定文本信息,由任務標題、類別、定義、要避免的事項等組成。因此,以人為本的指令更加友好,可以理想地應用于幾乎任何復雜的NLP任務。
4 如何為指令建模?在本節中,我們總結了幾種最流行的指令學習建模策略。總體而言,本文介紹了四種不同的建模方案:對于早期的基于機器學習的系統,(i)基于語義解析器的策略是編碼指令的常用方法;隨著神經網絡和預訓練語言模型的出現,(ii)基于提示模板和(iii)基于前綴指令的指令學習模式成為兩種備受青睞的范式;最近,(iv).基于超網絡的方法也引起了更大的興趣。
5 應用
5.1人機交互
文本指令可以自然地視為一種人機交互方式。之前的許多工作使用自然語言指令來"指導"計算機執行各種現實世界的任務。
對于非NLP(多模態)任務,大多數專注于基于環境的語言學習,即驅動智能體將自然語言指令與環境相關聯,并做出相應的反應,例如從圖像/視頻中選擇提到的對象(Matuszek等人,2012;Krishnamurthy和Kollar, 2013;Puig等人,2018),按照導航指示移動智能體(Tellex等人,2011;Kim和Mooney, 2012;陳,2012;Artzi和Zettlemoyer, 2013;Bisk et al., 2016),在地圖上繪制相應的痕跡(Vogel和Jurafsky, 2010;Chen和Mooney, 2011),基于給定規則玩足球/紙牌游戲(Kuhlmann等人,2004;愛森斯坦等人,2009;Branavan等人,2011;Babe s-Vroman等人,2012;Goldwasser和Roth, 2014),生成實時體育廣播(Chen和Mooney, 2008;Liang et al., 2009)、控制軟件(Branavan et al., 2010)和查詢外部數據庫(Clarke et al., 2010)等。與此同時,指令也被廣泛適用于幫助與系統溝通,以解決NLP任務,例如,遵循操作字符串的指令(Gaddy和Klein, 2019),根據給定的解釋對電子郵件進行分類(Srivastava等人,2017,2018),以及文本到代碼生成(Acquaviva等人,2021)。近年來,越來越多的研究傾向于以迭代和模塊化的方式設計人機通信過程。例如,Li et al.(2020)構建了一個系統來幫助用戶處理日常任務(例如,點咖啡或請求Uber)。得益于用戶友好的圖界面,系統可以迭代地詢問有關任務的問題,用戶可以不斷改進他們的指令,以避免不明確的描述或模糊的概念。類似地,Dwivedi-Yu等人(2022)提出了一個基準來迭代地指導PLM改進文本,其中每次迭代只使用具有精確目的的一小段指令(例如,“簡化文本”或“使文本中性”)。此外,Chakrabarty等人(2022)構建了一個協作寫詩系統,用戶可以最初提供一個模棱兩可的指令(例如,“寫一首關于蛋糕的詩”),然后通過觀察模型的中間輸出,用更多的細節逐步完善指令(例如,“包含單詞-‘巧克力’”)。同時,Mishra和Nouri(2022)提出了一個傳記生成系統,該系統逐步從用戶那里收集必要的個人信息(通過在對話場景中提出問題來引導用戶),并最終生成一個段落式的傳記。針對非專家用戶難以一次性編寫完整的指令的問題,在基于指令的人工智能系統設計中采用迭代式、模塊化的設計范式,可以引導用戶逐步豐富任務指令,從而有效地緩解用戶的思維需求,使系統更加面向用戶。鑒于其實用價值,本文強調了這一分支工作的重要性。
5.2 數據和特征增強
任務指令被認為是一種間接的監督資源,其中有時包含一些膚淺且武斷的規則。這些規則也被稱為標記函數,可以直接應用于注釋(例如,句子“a very fair price”是情感積極的,因為“單詞‘price’之前直接有‘fair’”)。因此,現有的一些工作還將指令作為遠程監督來執行數據或特征增強(Srivastava等人,2018;Hancock等人,2018;Ye等人,2020)。例如,Srivastava等人(2017)使用語義解析器將自然語言解釋轉換為邏輯形式,并將它們應用于數據集中的所有實例以生成額外的二進制特征。而Wang et al.(2020)利用標簽解釋自動標注原始語料庫,并在產生的噪聲數據上訓練分類器。除了直接的擴充外,Su等人(2022)進一步使用任務指令來豐富模型表示,并實現了較強的跨任務泛化。具體來說,他們在具有對比學習的不同指令數據集上訓練了一個嵌入模型(單個編碼器),然后使用該模型為下游未見過的任務生成基于指令的特定任務表示。
5.3 通用語言模型
根據通用人工智能(Artificial General Intelligence, AGI)的定義,“通用模型”通常是一個能夠勝任不同任務并在多變環境中可擴展的系統,這將遠遠超出其創造者最初的預期(Wang and Goertzel, 2007;Goertzel寫到,2014)。雖然特定于NLP領域,但通用語言模型應該是一個優秀的多任務助手,能夠以完全零樣本/少樣本的方式熟練處理各種現實世界的NLP任務和不同的語言(Arivazhagan等人,2019;Pratap等人,2020;Wei等,2022a)。由于許多現有工作證明了在跨任務泛化中使用指令的驚人能力(Wei等人,2022a;Sanh等人,2022;Mishra等人,2022b;王等,2022c;Chung等人,2022,除其他外),該指令很可能成為實現這一最終目標的突破。
值得注意的是,最近指令的兩個顯著應用,即InstructGPT (Ouyang et al., 2022)和ChatGPT,也表明在構建通用語言模型方面邁出了一大步。然而,與其他主要采用指令學習的工作不同,ChatGPT還采用了一些其他組件,如人工反饋的強化學習(RLHF) 14。雖然“哪個組件對ChatGPT的出色結果貢獻更大”的答案仍然是模糊的,需要進一步調研,但我們介紹了一些最近的工作,以強調指令學習的關鍵作用。例如,Chung等人(2022)進行了廣泛的實驗來評估人類對PaLM的偏好對齊(Chowdhery等人,2022)。他們發現,即使沒有任何人類反饋,指令微調也顯著降低了PaLM開放式世代的毒性,比如性別和職業偏見。此外,其他一些工作也單獨采用創造性指導而不是人工反饋,并取得了顯著的跨任務結果(Bai等人,2022;Honovich等人,2022a;王志強等,2022b)。盡管ChatGPT仍然存在許多不令人滿意的方面,距離通用語言模型還很遠(Qin等人,2023;郭等,2023;Koco 'n等人,2023;Wang et al., 2023),我們希望AGI的目標可以通過采用和發展更強大的技術來繼續推動,包括指令學習。
最近,ChatGPT與DALL-E-2[1]和Codex[2]一起受到了社會的廣泛關注。因此,許多人對相關資源感興趣,并試圖揭開其令人印象深刻的性能背后的背景和秘密。**事實上,ChatGPT和其他生成式AI (GAI)技術屬于人工智能生成內容(AIGC)的范疇,它涉及通過AI模型創建數字內容,如圖像、音樂和自然語言。AIGC的目標是使內容創建過程更加高效和可訪問,允許以更快的速度生產高質量的內容。**AIGC是通過從人類提供的指令中提取和理解意圖信息,并根據其知識和意圖信息生成內容來實現的。近年來,大規模模型在AIGC中變得越來越重要,因為它們提供了更好的意圖提取,從而改善了生成結果。隨著數據和模型規模的增長,模型可以學習的分布變得更加全面和接近現實,從而產生更加真實和高質量的內容。**本文全面回顧了生成模型的歷史,基本組件,以及AIGC的最新進展,從單模態交互和多模態交互。**從單模態的角度,介紹了文本和圖像的生成任務和相關模型。從多模態的角度出發,介紹上述模態之間的交叉應用。最后討論了AIGC存在的開放問題和未來的挑戰。
1. 引言
近年來,人工智能生成內容(Artificial Intelligence Generated Content, AIGC)受到了計算機科學界以外的廣泛關注,全社會開始關注大型科技公司[3]構建的各種內容生成產品,如ChatGPT[4]和DALL-E2[5]。AIGC指的是使用高級生成AI (GAI)技術生成的內容,而不是由人類作者創建的內容,AIGC可以在短時間內自動創建大量內容。例如,ChatGPT是OpenAI開發的用于構建對話式人工智能系統的語言模型,可以有效地理解并以有意義的方式響應人類的語言輸入。此外,DALL-E-2是另一個最先進的GAI模型,也是由OpenAI開發的,它能夠在幾分鐘內從文本描述中創建獨特的高質量圖像,如圖1所示的“一個宇航員以逼真的風格騎馬”。隨著AIGC的卓越成就,許多人認為這將是人工智能的新時代,并將對整個世界產生重大影響。
**從技術上講,AIGC是指給定人工指令,可以幫助教學和指導模型完成任務,利用GAI算法生成滿足指令的內容。**該生成過程通常包括兩個步驟:從人工指令中提取意圖信息和根據提取的意圖生成內容。然而,如之前的研究[6,7]所示,包含上述兩個步驟的GAI模型的范式并不完全新穎。與之前的工作相比,最近的AIGC的核心進展是在更大的數據集上訓練更復雜的生成模型,使用更大的基礎模型架構,并能夠訪問廣泛的計算資源。例如,GPT-3的主框架保持與GPT-2相同,但預訓練數據大小從WebText 8增長到CommonCrawl9,基礎模型大小從1.5B增長到175B。因此,在人類意圖提取等任務上,GPT-3比GPT-2具有更好的泛化能力。
除了數據量和計算能力增加帶來的好處,研究人員還在探索將新技術與GAI算法集成的方法。例如,ChatGPT利用來自人類反饋的強化學習(RLHF)[10-12]來確定給定指令的最適當響應,從而隨著時間的推移提高模型的可靠性和準確性。這種方法使ChatGPT能夠更好地理解人類在長對話中的偏好。同時,在計算機視覺領域,由Stability提出了穩定擴散[13]。AI在2022年也在圖像生成方面取得了巨大成功。與之前的方法不同,生成擴散模型可以通過控制探索和利用之間的權衡來幫助生成高分辨率圖像,從而將生成圖像的多樣性和與訓練數據的相似性和諧地結合起來。
結合這些進展,模型在AIGC任務上取得了顯著進展,并被應用于各個行業,包括藝術[14]、廣告[15]、教育[16]等。在不久的將來,AIGC將繼續成為機器學習的一個重要研究領域。因此,對過去的研究進行廣泛的調研并確定該領域的開放問題至關重要。對AIGC領域的核心技術和應用進行了綜述。 **這是對AIGC的首次全面綜述,從技術和應用兩個方面對GAI進行了總結。之前的研究從不同的角度關注GAI,包括自然語言生成[17],圖像生成[18],多模態機器學習中的生成[7,19]。**然而,之前的工作只關注AIGC的特定部分。本文首先回顧了AIGC中常用的基礎技術。進一步對先進的GAI算法進行了全面的總結,包括單峰生成和多峰生成,如圖2所示。此外,還討論了AIGC的應用和潛在挑戰。最后指出了該領域存在的問題和未來的研究方向。
綜上所述,本文的主要貢獻如下:
據我們所知,我們是第一個為AIGC和AI增強生成過程提供正式定義和徹底調研的人。
回顧了AIGC的歷史和基礎技術,并從單模態生成和多模態生成的角度對GAI任務和模型的最新進展進行了全面分析。
討論了AIGC面臨的主要挑戰以及AIGC未來的研究趨勢。
調研的其余部分組織如下。第二節主要從視覺模態和語言模態兩個方面回顧了AIGC的歷史。第3節介紹了目前在GAI模型訓練中廣泛使用的基本組件。第4節總結了GAI模型的最新進展,其中第4.1節從單模態角度回顧了進展,第4.2節從多模態生成的角度回顧了進展。在多模態生成中,介紹了視覺語言模型、文本音頻模型、文本圖模型和文本代碼模型。第5節和第6節介紹了GAI模型在AIGC中的應用以及與該領域相關的一些重要研究。第7、8節揭示了AIGC技術存在的風險、存在的問題和未來的發展方向。最后,我們在9中總結了我們的研究。2. 生成式人工智能的歷史生成模型在人工智能領域有著悠久的歷史,可以追溯到20世紀50年代,隱馬爾可夫模型(HMM)[20]和高斯混合模型(GMMs)[21]的發展。這些模型生成了語音和時間序列等順序數據。然而,直到深度學習的出現,生成模型才在性能上看到了顯著的改進。
在早期的深度生成模型中,不同的領域通常沒有太多的重疊。在自然語言處理(NLP)中,傳統的生成句子的方法是使用N-gram語言建模[22]學習單詞分布,然后搜索最佳序列。然而,該方法不能有效地適應長句子。為了解決這個問題,循環神經網絡(RNN)[23]后來被引入到語言建模任務中,允許對相對較長的依賴關系進行建模。隨后,長短期記憶(LSTM)[24]和門控循環單元(GRU)[25]的發育,它們利用門控機制在訓練過程中控制記憶。這些方法能夠處理樣本[26]中的約200個標記,與N-gram語言模型相比,這是一個顯著的改進。 同時,在計算機視覺(CV)領域,在基于深度學習的方法出現之前,傳統的圖像生成算法使用紋理合成[27]和紋理映射[28]等技術。這些算法基于手工設計的特征,在生成復雜多樣的圖像方面能力有限。2014年,生成對抗網絡(Generative Adversarial Networks, GANs)[29]被首次提出,在各種應用中取得了令人印象深刻的結果,是該領域的一個重要里程碑。變分自動編碼器(vae)[30]和其他方法,如擴散生成模型[31],也已開發用于對圖像生成過程進行更細粒度的控制和生成高質量圖像的能力
生成模型在不同領域的發展遵循不同的路徑,但最終出現了交叉的問題:transformer架構[32]。Vaswani等人在2017年引入了NLP任務,Transformer后來被應用于CV中,然后成為不同領域許多生成模型的主要骨干[9,33,34]。在NLP領域,許多著名的大型語言模型,如BERT和GPT,采用transformer架構作為其主要的構建塊,比之前的構建塊(如LSTM和GRU)具有優勢。在CV中,Vision Transformer (ViT)[35]和Swin Transformer[36]后來通過將Transformer架構與視覺組件相結合,進一步發展了這一概念,使其可以應用于基于圖像的下游。除了transformer給單個模態帶來的改進之外,這種交叉還使來自不同領域的模型能夠融合在一起,以完成多模態任務。多模態模型的一個例子是CLIP[37]。CLIP是一種視覺-語言聯合模型,將transformer架構與視覺組件相結合,允許它在大量文本和圖像數據上進行訓練。由于它在預訓練時結合了視覺和語言知識,因此也可以作為多模態提示生成中的圖像編碼器。總而言之,基于transformer的模型的出現徹底改變了人工智能的產生,并導致了大規模訓練的可能性。
近年來,研究人員也開始引入基于這些模型的新技術。例如,在NLP中,人們有時喜歡少樣本提示[38],而不是微調,這是指在提示中包括從數據集中選擇的一些示例,以幫助模型更好地理解任務需求。在視覺語言中,研究人員經常將特定模態模型與自監督對比學習目標相結合,以提供更魯棒的表示。在未來,隨著AIGC越來越重要,會有越來越多的技術被引入,讓這個領域充滿活力。
3. 生成式人工智能
我們將介紹最先進的單模態生成模型。這些模型被設計為接受特定的原始數據模態作為輸入,例如文本或圖像,然后以與輸入相同的模態生成預測。我們將討論這些模型中使用的一些最有前途的方法和技術,包括生成語言模型,如GPT3[9]、BART[34]、T5[56]和生成視覺模型,如GAN[29]、VAE[30]和歸一化流[57]。
多模態模型
多模態生成是當今AIGC的重要組成部分。多模態生成的目標是通過學習數據[7]的多模態連接和交互來學習生成原始模態的模型。模態之間的這種連接和相互作用有時是非常復雜的,這使得多模態表示空間與單模態表示空間相比很難學習。然而,隨著前面提到的強大的特定于模式的基礎架構的出現,越來越多的方法被提出來應對這一挑戰。在本節中,我們將介紹視覺語言生成、文本音頻生成、文本圖形生成和文本代碼生成中的最先進的多模態模型。由于大多數多模態生成模型總是與實際應用高度相關,本節主要從下游任務的角度進行介紹。
4. 應用
5. 效率
在過去的十年中,具有神經網絡的深度生成式人工智能模型一直主導著機器學習領域,其崛起歸功于2012年的ImageNet競賽[210],這導致了一場創建更深入和更復雜模型的競賽。這種趨勢也出現在自然語言理解領域,像BERT和GPT-3這樣的模型已經開發出了大量參數。然而,不斷增加的模型占用空間和復雜性,以及訓練和部署所需的成本和資源,給現實世界中的實際部署帶來了挑戰。核心挑戰是效率,可以分解如下:
推理效率: 這與部署用于推理的模型的實際考慮有關,即為給定的輸入計算模型的輸出。推理效率主要與推理期間模型的大小、速度和資源消耗(例如,磁盤和RAM使用)有關。 * 訓練效率: 這涵蓋了影響訓練模型的速度和資源需求的因素,如訓練時間、內存占用和跨多個設備的可伸縮性。它還可能包括考慮在給定任務上實現最佳性能所需的數據量。
隨著現代軟件的復雜性不斷升級,軟件工程已經成為一項越來越令人生畏且容易出錯的工作。近年來,神經代碼智能(NCI)領域已經成為一種有前途的解決方案,利用深度學習技術的力量來解決源代碼的分析任務,目標是提高編程效率,并最大限度地減少軟件行業中的人為錯誤。預訓練語言模型已經成為NCI研究的主導力量,在廣泛的任務中始終如一地提供最先進的結果,包括代碼摘要、生成和翻譯。在本文中,我們對NCI領域進行了全面的調研,包括對預訓練技術、任務、數據集和模型架構的全面回顧。我們希望這篇論文能成為自然語言和編程語言社區之間的橋梁,為這一快速發展領域的未來研究提供見解。
//www.zhuanzhi.ai/paper/d0c79cc69bdb9171339f34e916fc7c12
1. 引言
編程語言(Pierce, 2002)作為軟件的基礎,使人類能夠與計算機交流并指導計算機進行計算。使用編程語言開發軟件的過程,即軟件開發,已經成為一個蓬勃發展的行業,在現代數字世界中發揮著至關重要的作用。然而,軟件開發還包括編程之外的一系列任務,包括測試、文檔編寫和bug修復,眾所周知,這些任務具有挑戰性,需要高水平的人類專業知識(Brooks, 1978)。
為了簡化軟件開發,代碼智能工具作為一種自動分析源代碼并解決軟件工程任務的計算機輔助方法應運而生。以前,這些工具大多基于靜態分析技術。例如,Microsoft Intellisense是一個代碼智能工具,它通過靜態分析用戶代碼和構建定義、引用、類型簽名等數據庫來提供代碼補全建議和提示函數簽名。還有一些工具可以自動檢測源代碼中的漏洞(Ayewah et al., 2008;Engler and Musuvathi, 2004)。雖然這些工具在工業中被廣泛采用,但它們有局限性。主要的限制之一是,這些工具通常是為特定的編程語言構建的,需要大量的工作才能將它們遷移到新語言。此外,像Python這樣的動態語言很難進行靜態分析,這使得傳統的代碼智能工具對開發人員來說效率較低。
最近,研究人員已經開始將語言模型和預訓練策略應用于代碼智能任務,如程序合成(Chen et al., 2021; Wang et al., 2021b);,文檔生成(Wang et al., 2021b; Alon et al., 2019a; Feng et al., 2020),缺陷檢測和程序修復,這是受預訓練Transformer模型在序列數據建模上的成功啟發(Krizhevsky et al., 2017; Vaswani et al., 2017)。受軟件自然性假設的啟發(Hindle et al., 2016; Buratti et al., 2020),這表明編程語言可以像自然語言一樣被理解和生成,研究人員將源代碼視為順序數據并應用順序神經架構,如Transformer模型(Vaswani et al., 2017),以理解和生成程序(Feng et al., 2020;Guo et al., 2021)。在自然語言處理(NLP)社區中,人們觀察到,當有大量未注釋數據可用時,預訓練范式使模型能夠學習高質量的上下文token嵌入,并顯著提高下游性能(Krizhevsky等人,2017;Brown等人,2020)。同樣,可以在GitHub等開源平臺上找到大量編程語言的代碼片段(Chen et al., 2021)。因此,研究人員采用了預訓練范式(Devlin等人,2019)來解決各種代碼分析任務(Feng et al., 2020; Guo et al., 2021; Chen et al., 2021)。與靜態分析器相比,這種數據驅動的方法大大節省了開發支持不同任務和適應新的編程語言的代碼智能工具的工作量。迄今為止,預訓練代碼語言模型在廣泛的任務上取得了最先進的性能,并在不同語言中表現出令人滿意的泛化能力(Wang等人,2021b;Chen等人,2021;Li等人,2022)。值得注意的是,Codex (Chen等人,2021)在程序合成方面取得了一個重要的里程碑,并增強了Copilot2等編程智能工具的能力,這些工具甚至被應用于解決線性代數和數學應用題(Tang et al., 2021; Drori and Verma, 2021)。
盡管將預訓練語言模型應用于代碼智能任務取得了成功,該領域的研究也在蓬勃發展,但一直缺乏對不斷增長的文獻進行分類的系統綜述。之前的工作既沒有充分考慮基于語言的代碼模型,也沒有對現有的模型設計、下游任務和數據集進行全面的審查(Xu et al., 2022; Wu et al., 2022a; Allamanis et al., 2018)。為了建模和理解編程語言的語義,有必要討論預訓練和下游任務的可用數據集,以及如何設計合適的神經架構和有效的訓練方案。此外,由于源代碼本身具有豐富的結構信息(Xu等人,2022;Guo et al., 2021),如何在設計代碼智能模型時提取并利用這些結構作為先驗知識是一個至關重要的問題。這需要編程語言社區的理論和技術背景知識。Wu等人(2022b)綜述了用于結構化代碼理解的深度學習方法,并討論了基于序列和基于圖的建模技術。然而,這項工作更關注程序的結構方面,缺乏對語言模型和預訓練策略的深入討論。
為了連接NLP和PL社區的知識,本文將現有的用于代碼智能的預訓練語言模型分組為神經代碼智能(NCI),并對該領域進行了系統的回顧。從預處理技術、模型架構和學習范式方面回顧了編程語言的神經建模技術。討論了NCI的各種下游任務,以及用于訓練和評估代碼語言模型的可用數據集。探討了將語言建模方法應用于代碼智能的挑戰和機遇。此外,我們在GitHub存儲庫中維護了一個NCI研究、新聞和工具的列表3。希望該工作可以闡明該領域當前的研究前景,幫助新人了解最近的研究進展,并為未來的研究提供見解。
代碼語言模型預訓練
在本節中,我們將回顧代碼語言模型的設計和訓練。為了系統地回顧現有的文獻,將代碼語言建模方法拆分為一個由三個階段組成的管道:預處理、順序建模和訓練。流程如圖1所示,我們將依次介紹它們。
**預處理。**對于代碼語言模型,輸入將是預訓練語料庫中的源代碼片段或稍后在下游數據集上的源代碼片段。它必須首先對輸入代碼進行預處理,包括在代碼上運行標記化,并可選地從編程語言中提取先驗知識。
順序建模。然后,它將預處理的結果(主要是標記序列)輸入到語言模型中,將代碼編碼為密集表示,預測其屬性,或從中生成代碼序列。
預訓練和微調。用無監督目標訓練模型,并在下游任務上進一步微調。在預訓練階段,模型從大量的代碼語料庫中學習,沒有人工注釋,以獲得源代碼結構和語義的通用和可遷移的知識。然后,針對特定的下游任務對預訓練模型進行微調。除了上述的預訓練和微調策略,其他學習范式包括零樣本、少樣本和多任務學習也可以用于訓練模型。
近年來,預訓練模型在自然語言處理領域蓬勃發展,旨在對自然語言隱含的知識進行建模和表示,但主流預訓練模型大多針對英文領域。中文領域起步相對較晚,鑒于其在自然語言處理過程中的重要性,學術界和工業界都開展了廣泛的研究,提出了眾多的中文預訓練模型。文中對中文預訓練模型的相關研究成果進行了較為全面的回顧,首先介紹預訓練模型的基本概況及其發展歷史,對中文預訓練模型主要使用的兩種經典模型Transformer和BERT進行了梳理,然后根據不同模型所屬類別提出了中文預訓練模型的分類方法,并總結了中文領域的不同評測基準,最后對中文預訓練模型未來的發展趨勢進行了展望。旨在幫助科研工作者更全面地了解中文預訓練模型的發展歷程,繼而為新模型的提出提供思路。
1 引言
自然語言處理(NaturalLanguageProcessing,NLP)是計 算機利用人類定義的算法對自然語言形式的輸入進行加工處 理的過程,旨在讓計算機可以像人類一樣理解和生成語言,具 備如人類一樣的聽、說、讀、寫、問、答、對話、聊天等的能力,并 利用已有知識和常識進行推理分析.自然語言處理技術的發 展經歷了從基于規則到基于統計的過程.隨著深度學習的發 展,圖像、文本、聲音、視頻等不同形式的信息載體被自然語言 處理技術突破,大量的神經網絡被引入自然語言理解任務中, 如循環神經網絡1、卷積神經網絡2、注意力 機制3等.在特定的自然語言處理任 務中,神經網絡可以隱性地學習到序列的語義表示與內在特 征,因此,神經網絡成為了解決復雜自然語言處理任務最有效 的方法.隨著計算力的不斷增強,深度學習在自然語言處理 領域中不斷發展,分布式表示占據了主導地位,不僅在指定任 務中可以端到端地學習語義表示,而且可以在大規模無標注 的文本上進行自主學習,能更靈活地運用在各種下游任務中. 然而,早期在有監督數據上訓練淺層模型往往存在過擬合和 標注數據不足等問題,在訓練深層模型參數時,為了防止過擬 合,通常需 要 大 量 的 標 注 數 據,但 有 監 督 的 標 注 數 據 成 本較高,因此模型主要利用網絡中現存的大量無監督數據進行 訓練.在此背景下,預訓練技術被廣泛地應用在自然語言處 理領域.其中,最經典的預訓練模型是 BERT [4]模型,在多個 自然語言處理任務中取得了最好結果(StateoftheArt,SOG TA).此后出現了一系列基于 BERT 的預訓練模型,掀起了 深度學習與預訓練技術的發展浪潮。
隨著國內外研究者在預訓練模型方面的深入研究,目前 已有很多關于預訓練模型的綜述,但缺少專門針對中文領域 的相關綜述.當前,中文預訓練模型蓬勃發展并取得一定的 成績,因此,對現有研究成果進行全面的分析和總結非常必 要.本文期望能為中文預訓練相關領域的學者提供參考,幫 助科研工作者了解目前的研究現狀和未來的發展趨勢.本文 第2節概述預訓練模型的基本情況;第3節主要介紹兩種基 本模型,即 Transformer和 BERT;第4節根據不同模型的所 屬類別提出典型的中文預訓練模型的分類方法,并匯總了中 文預訓練模型的相關資源;第5節梳理了中文領域的不同評 測基準;最后總結全文并展望未來.
2 預訓練模型
2.1 預訓練模型發展史
從預訓練語言模型的發展時間來看,可以將其分為靜態 預訓練模型和動態預訓練模型.2013年,Mikolov等[5]在神 經網絡語言模型(NeuralNetworkLanguageModel,NNLM) 思想的基礎上提出 Word2Vec,并引入大規模預訓練的思路, 旨在訓練具有特征表示的詞向量,其中包括 CBOW 和 SkipG Gram 兩種訓練方式.相比 NNLM 模型,Word2Vec可以更 全面地捕捉上下文信息,彌補 NNLM 模型只能看到上文信息 的不足,提高模型的預測準確性,Word2Vec極大地促進了深 度學習在 NLP中的發展.自 Word2Vec模型被提出以來,一 批訓練詞向量的模型相繼涌現,例如,Glove [6]和 FastText [7] 等模型均考慮如何得到文本單詞較好的詞向量表示,雖然對 下游任務性能有所提升,但其本質上仍是一種靜態的預訓練 模型.
2018年,Peters等[8]提出的 ELMo模型將語言模型帶入 動態的預訓練時代.ELMo模型采用雙層雙向的 LSTM [9]編 碼器進行預訓練,提取上下文信息,并將各層詞嵌入輸入特定 下游任務中進行微調.該模型不僅可以學習到底層單詞的基 礎特征,而且可以學到高層的句法和語義信息.然而,ELMo 模型只能進行串行計算,無法并行計算,模型訓練的效率較 低;此外,該模型無法對長序列文本進行建模,常出現梯度消 失等問題.而 后,OpenAI提 出 了 GPT(GenerativePreGtraiG ning)[10]模 型.與 ELMo模 型 不 同,GPT 采 用 Transformer 深度神經網絡,其處理長文本建模的能力強于 LSTM,僅使用 Transformer解碼器進行特征提取,在機器翻譯等生成式任務 上表現驚人,但這一特點也導致 GPT 只利用到了當前詞前面 的文本信息,并沒有考慮到后文信息,其本質上依舊是一種單 向語言模型.為了解決 GPT等模型單向建模的問題,2018年, Devlin等[4]提出了 BERT 模型,該模型是第一個基于 Transformer的 雙 向 自 監 督 學 習 的 預 訓 練 模 型,在 英 文 語 言 理解評測基準[11]榜單中的多個任務上達到了SOTA 結果,此 后出現了一大批基于 BERT的預訓練模型,大幅提升了下游 自然語言處理任務的性能.中文預訓練模型雖然起步較晚, 但發展迅速,已經取得了一定成果,本文第4節將對其進行重 點介紹.
**2.2 研究中文預訓練模型的原因 **
首先,中文和英文分別是世界上使用人數最多和范圍最 廣的兩種語言,然而在自然語言處理領域,英文預訓練模型較 為普遍,例如,以 BERT 為首及其后出現的大量預訓練模型 均是在單一語料英文數據集上進行訓練,此外模型的設計理 念也更適用于英文,比如分詞方式及掩碼方式等.其次,中文 和英文語言本質上存在差異,它們的主要區別是,中文文本通 常由多個連續的字符組成,詞與詞之間沒有明顯的分隔符. 如果使用英文預訓練模型去處理常見的中文任務,效果往往 不佳.因此,為了推動中文領域自然語言處理技術和預訓練 模型在多語言任務方面的發展,構建以中文為核心的預訓練 模型勢在必行.
3 Transformer和 BERT
自2021年以來,中文預訓練模型進入井噴式的發展階 段,其架構主要基于 Transformer和 BERT 兩種基礎模型,本 節主要介紹這兩種模型. 圖1為典型的 Transformer架構,該架構由6個結構相 同的編碼器和解碼器堆疊而成.單個編碼器由堆疊的自注意 力層和前饋神經網絡組成,解碼器由堆疊的自注意力層、掩碼 注意力層 和 前 饋 神 經 網 絡 組 成.有 關 Transformer的 詳 細 細節介紹請參考文獻[14].
BERT
BERT [4] (Bidirectional Encoder Representations from Transformers)是由谷歌提出的一種面向自然語言處理任務 的無監督預訓練語言模型,由 Transformer的雙向編碼器表 示.BERT的架構如圖2所示.
圖2 BERT示意圖[4]
4 中文預訓練模型分類
**在自然語言處理領域,繼 Transformer和 BERT 出現之 后,涌現出大量的預訓練模型,這些模型主要針對英文領域, 中文領域的研究起步較晚.但在近兩年,中文預訓練模型受 到廣大學者的關注并取得了一定的研究成果.為了闡明現有 的中文預訓練模型,本節主要從以下6個方面對現有的預訓練 模型進行分類,圖3展示了典型的中文預訓練模型的分類圖. (1) 預訓練模型的方法改進,主要包括掩碼方式的轉變、 位置編碼的轉變、LN 層的位置變化、MoE 層的使用、多粒度訓練和其他改進. (2) 融入外部信息的預訓練,主要包括命名實體、知識圖 譜、語言學知識和特定知識.(3) 關于多模態融合的預訓練模型. (4) 側重于高效計算的預訓練,主要包括數據處理階段、 預訓練階段以及技術優化. (5) 指特定領域的預訓練,主要包括對話系統和其他領域 的預訓練模型. (6) 介紹一些其他變體,主要側重于典型的英文預訓練模 型開源的中文版本.
圖3 中文預訓練模型分類圖
5. 中文領域的評測基準
5.1 為什么建立中文領域的評測基準
首先,從使用人數上看,中國人口占世界人口的五分之 一,人數龐大,因此中文是世界上使用人數最多的語言;其次, 從語言體系上看,中文與英文差異較大;最后,從數據集角度 出發,中文領域公開可用的數據集較少,此前提出的中文預訓 練模型在英文評測基準上評估,無法完全體現出模型性能. 當下預訓練模型的發展極其迅速,英文領域的評測基準已步 入成熟階段,而中文領域的缺失必然會導致技術落后,因此中 文領域的評測基準必不可少.本節主要介紹4種不同的評測 基準.
6 研究趨勢與展望
中文預訓練模型已在多個領域實現商業化落地,并展現出一定的市場潛力,取得了長足發展,但也存在較多挑戰,例 如預訓練模型規模和性能之間的平衡問題;如何構建更加通 用型的預訓練模型;如何突破現有多模態和輕量化模型的瓶 頸;如何構建融入更多中文特色的預訓練模型等.本文主要 從以下幾個方面對未來進行展望.
6.1 規模隨著以 BERT和 GPT等為代表的大規模預訓練模型的 出現,逐漸掀起了預訓練模型朝大規模方向發展的浪潮.大 量的研究表明,模型參數量越大,訓練數據量越多的預訓練模 型表現更出色.中文領域存在眾多大規模預訓練模型,如源 1.0參數 2457億,訓練數據集達5000GB;ERNIE3.0Titan 參數2600億;中文多模態模型 M6參數量已經擴展至十萬億 級別.目前預訓練模型還未達到模型的性能極限,增大模型 參數量和訓練數據仍是提高模型性能最有效的手段,探索超 大規模預訓練模型的道路還將繼續,也需要更加注重模型的 創新性、訓練的低碳化和應用的高效性. 然而,訓練超大規模的模型仍存在很大挑戰.首先,使用 最大 GPU 也不可能在內存中擬合所有參數;其次,算法優化 不足會耗費極長的訓練時間;最后,搭建超大規模模型會帶來 巨大的成本,讓學術界和小型科技公司望而卻步.如何在模 型性能和成本之間取得平衡也是當前學者探索的另外一條道 路,如探索輕量化的預訓練模型.近期騰訊提出的“神農”、瀾 舟科技提出的“孟子”及IDEA 研究院提出的“二郎神”等輕量 化模型,僅以十億左右的參數量就在部分任務上達到了 SOG TA 結果,因此探索輕量化模型勢在必行.
6.2 融入外部信息預訓練模型在部分任務上已無限接近人類,甚至超越人 類,然而,其對知識的掌握依舊不足,如何讓預訓練模型真正 理解并運用知識是一個值得長期研究的課題,尤其是中華民 族上下五千年形成的文化知識頗多,比如“常識性知識”和“特 定領域的知識”等.特定領域的知識可以幫助模型挖掘不同 領域特有的知識,如果能夠將特定領域的行業知識與模型結 合起來訓練,不僅可以將預訓練模型更廣泛地應用到不同的 下游任務,在各行各業中實現良好的產業落地,而且可以與腦 科學、心理學、神經學等其他學科融合,更好地發展人工智能, 服務人類生活. 除了融入知識信息之外,還可以從中文字形和字音等方 面考慮.因為中文語言的特殊性,其字符的符號也包含一些額外信息,這些額外信息能增強中文自然語言的表現力,如 ChineseBERT [46]模型中提出將中文字形和拼音信息融入預 訓練模型中,以此增強模型對中文語料的建模能力,但這一方 向的研究還相對較少,仍有待完善.
6.3 多模態領域現實世界離不開語言,語言離不開語音和視覺信息,類似 于人的感覺器官:眼、耳、嘴,任何一樣的缺失都會影響生活. 當前,互聯網音視頻資源占比較大,純文本信息只能覆蓋互聯 網資源的一小部分,更加豐富的音視頻信息并沒有被充分利 用,因此預訓練模型必然朝著多模態的趨勢發展.目前,多模 態預訓練模型的研究大多只考慮了兩種模態,圖像文本或者 視頻文本,而音頻信息大多被忽視.中文預訓練模型起步雖 晚,但成績斐然.中科院自動化所提出了全球首個圖文音(視 覺G文本G語音)三模態的預訓練模型 OPT [51],該模型同時具 備跨模態理解與生成的能力.通過上述分析可知,多模態的 研究擁有很大的發展空間.
本文主要圍繞中文預訓練模型的研究現狀進行概述.從模型規模上看,中文預訓練模型的發展正處于兩條 道路上.一是朝著超大規模預訓練模型的方向發展;二是尋 求輕量化模型的發展.從外部信息來看,大多數的預訓練模 型都融入了各種知識,預訓練與先驗知識的深度融合刻不容 緩.從高效訓練上看,現有模型都在不斷地探索更加高效的 訓練方式.從多模態的角度上看,中文多模態預訓練模型的 發展正處于上升階段,正朝著更多模態、更加通用的方向發 展.從特定領域的模型來看,預訓練模型可應用于多種領域, 具有較大的發展潛力.綜上所述,中文預訓練模型雖然取得 了不可忽視的成績,但還有更大的發展空間,未來將朝著更大 規模、更加高效、適用更多領域的方向發展.
表格廣泛存在于科技文獻、財務報表、報紙雜志等各類文檔中,用于緊湊地存儲和展現數據,蘊含著大量有用信息。表格識別是表格信息再利用的基礎,具有重要的應用價值,也一直是模式識別領域的研究熱點之一。隨著深度學習的發展,針對表格識別的新研究和新方法紛紛涌現。然而,由于表格應用場景廣泛、樣式眾多、圖像質量參差不齊等因素,表格識別領域仍然存在著大量問題亟需解決。為了更好地總結前人工作,為后續研究提供支持,本文圍繞表格區域檢測、結構識別和內容識別等3個表格識別子任務,從傳統方法、深度學習方法等方面,綜述該領域國內外的發展歷史和最新進展。梳理了表格識別相關數據集及評測標準,并基于主流數據集和標準,分別對表格區域檢測、結構識別、表格信息抽取的典型方法進行了性能比較。然后,對比分析了國內相對于國外,在表格識別方面的研究進展與水平。最后,結合表格識別領域目前面臨的主要困難與挑戰,對未來的研究趨勢和技術發展目標進行了展望。
//www.cjig.cn/jig/ch/reader/view_abstract.aspx?file_no=20220609&flag=1
在大數據時代,高效地存取數據,以及從海量數 據中提取有效信息是各行各業都亟需利用的重要技 術。 表格作為數據的一種重要載體,具有信息精煉集 中、方便體現數據關系等特點,已經在各個行業得到 了廣泛應用。 在教育領域中,表格常常會出現在各類 試卷、題目中;在金融領域,表格用來展示和分析數 據;在科學領域,表格用來記錄各類實驗配置以及結 果;在現實生活中也常常在幻燈片、車站時刻牌上看 到表格。 因此對表格進行區域檢測、結構識別乃至對 其中信息進行識別理解都有著廣闊的應用前景。 表格在生成或存儲過程中往往以圖片或 PDF (portable document format)文件的形式存在,會丟失 易于計算機理解的原有結構信息。 若是采用人工手 段對表格進行重新處理錄入,會面臨效率低下、數據 量大導致出錯等問題。 因此,如何讓計算機從文檔 或圖像中自動識別表格、提取信息,成為文檔識別領 域一個重要的研究問題。 早期對于表格的識別大多是針對較為簡單或模 板化的表格。 從表格的布局結構出發,抽取表格線 條或抽取文本塊,然后使用規則方法進行分析,但這 些方法往往泛化能力較差,且難以處理復雜表格。 隨著深度學習的發展,無論是機器視覺方面還是自 然語言處理方面都獲得了巨大的進展,各種表格識 別的方案相繼提出,并有研究者開始嘗試對自然場 景下的表格進行處理。 本文將圍繞表格的區域檢測、表格結構識別和 表格內容識別 3 個表格識別子任務,從傳統方法、深 度學習方法等方面,綜述該領域國內國外的發展歷 史和最新進展,同時對國內國外的研究進行對比,對 未來的趨勢和技術發展目標進行展望。
隨著互聯網的興起,每天都有不同形式的大量的文本數據產生:新聞、研究文獻、 博客、論壇文字以及社交媒體評論等。很多重要有用的信息隱藏在其中,如何從這些自 由文本中自動抽取所需要的信息是一個關鍵并且重要的一步。信息抽取任務就是為此目 標而誕生。本文主要研究信息抽取子任務之一的實體關系抽取任務。該任務旨在識別文 本中出現的實體,并判斷出實體之間存在的關系。
傳統的有監督實體關系抽取通常采用基于流水線的方法,即實體模型和關系模型 分開訓練。在測試階段,先用實體模型識別出實體,然后關系模型找出這些實體之間的 關系。這種流水線的方法存在著錯誤傳播的缺點,前一個任務的錯誤會累積到后一個任 務。為了緩解這一問題,研究人員提出了聯合模型。聯合模型將兩個子模型統一建模, 可以進一步利用兩個任務之間的潛在信息,以緩解錯誤傳播的缺點。聯合模型的難點是 如何加強實體模型和關系模型之間的交互,比如實體模型和關系模型的輸出之間存在著 一定的約束,在建模的時候考慮到此類約束將有助于聯合模型的性能。
另一方面,為了解決實體關系抽取數據集難以獲得的問題,遠程監督的方法也被提 出來。其主要思想是利用知識庫和大規模文本數據對齊,自動構建大規模的訓練集。然 而,遠程監督方法的缺點是自動構建的訓練集中存在著很多的噪音數據,這些噪音數據 的存在對遠程監督實體關系抽取有著很大的負面影響。此外,在有些應用場景中可能沒 有現成的知識庫可以用來進行遠程監督,如何解決類似的數據噪音和數據缺失問題也是 一大挑戰。
根據實體關系抽取方法的研究現狀,本文從數據和聯合模型兩個角度探索了幾種實 體關系抽取聯合模型,并且探究了所提出模型的優勢和不足。具體來說,本文的主要貢 獻有
近年來,深度學習技術得到了快速發展。在自然語言處理(NLP)任務中,隨著文本表征技術從詞級上升到了文檔級,利用大規模語料庫進行無監督預訓練的方式已被證明能夠有效提高模型在下游任務中的性能。首先,根據文本特征提取技術的發展,從詞級和文檔級對典型的模型進行了分析;其次,從預訓練目標任務和下游應用兩個階段,分析了當前預訓練模型的研究現狀,并對代表性的模型特點進行了梳理和歸納;最后,總結了當前預訓練模型發展所面臨的主要挑戰并提出了對未來的展望。
在軟件的開發和維護過程中,與代碼對應的注釋經常存在缺失、不足或者與代碼實際內容不匹配等問題,但手工編寫代碼注釋對開發人員來說費時費力,且注釋質量難以保證,因此亟需研究人員提出有效的代碼注釋自動生成方法.代碼注釋自動生成問題是當前程序理解研究領域的一個研究熱點,論文對該問題進行了系統綜述.主要將已有的自動生成方法細分為三類:基于模板的方法、基于信息檢索的方法和基于深度學習的方法.論文依次對每一類方法的已有研究成果進行了系統的梳理、總結和點評.隨后分析了已有的實證研究中經常使用的語料庫和主要的注釋質量評估方法,以利于針對該問題的后續研究可以進行合理的實驗設計.最后總結全文,并對未來值得關注的研究方向進行了展望.
//www.jos.org.cn/jos/ch/reader/view_abstract.aspx?file_no=6258&flag=1
隨著軟件項目的復雜度和軟件產品迭代頻率的不斷提升,程序理解在整個軟件開發環節的重要性也日益 提高.最近的一項研究工作[1]表明:開發人員平均需要花費 59%的時間在程序理解上.無疑高質量的代碼注釋是 提高開發人員程序理解效率的關鍵[2].但開發人員由于項目開發預算有限、編程經驗不足或者對代碼注釋的重 視程度不夠,經常會造成代碼注釋的缺失、不足或者與代碼實際內容不匹配等問題.雖然借助一些工具(例如 JavaDoc[3]和 Doxygen?)可以輔助生成代碼注釋模板,但仍然不能自動生成與代碼實現功能和目的相關的描述. 如果由開發人員手工輸入代碼注釋則費時費力,并且注釋的質量很難得到保障.除此之外,已有的代碼注釋也需 要隨著相關代碼的持續演化而保持同步更新[4].因此亟需研究人員設計出有效的代碼注釋自動生成(code comment generation)方法.
代碼注釋自動生成是當前程序理解領域的一個研究熱點[5].代碼注釋可以描述相關代碼的實現功能和實 現目的.高質量的代碼注釋有助于提高代碼的可讀性和可理解性,因此在軟件開發和維護過程中具有重要的作 用.代碼注釋自動生成問題可以認為是將基于編程語言實現的代碼自動翻譯成基于自然語言描述的文本,同時 希望自動生成的注釋不僅可以描述代碼實現的功能,而且還可以給出代碼的實現目的或開發人員的設計意圖 等.例如:開發人員通過閱讀如下兩段注釋“uploads log files to the backup server”和“formats decimal values as scientific notation”,就可以直接對相關代碼的目的產生清晰的認識,而不需要再深入的去理解代碼的具體實現 細節.
代碼注釋的自動生成在很多軟件工程相關任務中都能起到重要的作用.例如:當開發人員新加入某個項目 的開發團隊,或者需要評估項目內的某個模塊是否需要使用新的類庫時,需要通過閱讀和理解代碼,來盡快熟悉 大規模軟件項目內的某個程序模塊.開發人員在審查某個程序模塊的時候,需要盡快了解該模塊的核心代碼變 更.在軟件的開發和維護過程中,開發人員需要盡快定位到自己感興趣的代碼段上.不難看出,高質量的代碼注 釋有助于協助開發人員提高上述任務的完成效率.
但代碼注釋自動生成問題在研究時也面臨諸多嚴峻挑戰:首先高質量的代碼注釋離不開對代碼結構和語 義的高質量分析,尤其是代碼語義分析在當前軟件工程領域仍然是一個開放問題.其次有時候如果僅分析代碼 本身,并不足以生成高質量的代碼注釋.因此還需要研究如何有效利用項目缺陷跟蹤系統和版本控制系統內的 領域知識和來在 Stack Overflow 和 Github 的眾包知識.最后當前對生成的代碼注釋進行質量評估時,主要采用 手工評估方法和自動評估方法.但使用手工評估方法打分時,受限于專家對編程語言和領域知識的熟悉程度,容 易存在主觀性較強的問題.而自動評估方法一般使用來自機器翻譯研究領域的評測指標,雖然可以自動給出生 成注釋的質量評分,但代碼注釋自動生成問題與機器翻譯問題相比,仍存在一定的差異性[6].
論文剩余內容的結構安排如下:第 1 節給出了綜述的整體研究框架,隨后第 2 節到第 4 節分別介紹基于模 板的生成方法、基于信息檢索的生成方法和基于深度學習的生成方法的相關研究工作,并進行了點評.第 5 節 總結了常用的代碼注釋語料庫.第 6 節將常用的代碼注釋質量評估方法分為兩類,并分別進行了分析.最后對該 領域未來值的關注的研究方向進行了展望