自然語(yǔ)言語(yǔ)義代碼搜索之路

姓名:劉成龍 ?學(xué)號(hào):16020199016

轉(zhuǎn)載自:https://www.jiqizhixin.com/articles/towards-natural-language-semantic-code-search,有刪節(jié)。

【嵌牛導(dǎo)讀】:自然語(yǔ)言語(yǔ)義代碼搜索之路

【嵌牛鼻子】:深度學(xué)習(xí)??自然語(yǔ)言語(yǔ)義搜索

【嵌牛提問(wèn)】:如何利用深度學(xué)習(xí)技術(shù)促進(jìn)自然語(yǔ)言語(yǔ)義搜索的發(fā)展

【嵌牛正文】:

研究動(dòng)機(jī)

目前,在 GitHub 上搜索代碼還局限于關(guān)鍵字搜索。這建立在假設(shè)用戶了解句法,或者可以預(yù)測(cè)出他們要找的代碼周?chē)淖⑨屩锌赡苡惺裁搓P(guān)鍵字的基礎(chǔ)上。我們的機(jī)器學(xué)習(xí)科學(xué)家一直在研究能夠?qū)Υa進(jìn)行語(yǔ)義搜索(https://en.wikipedia.org/wiki/Semantic_search)的方法。

如果讀者想要充分了解語(yǔ)義搜索的概念,可以想一想下面的搜索查詢「ping REST api and return results」

請(qǐng)注意,即使在搜索查詢和文本之間并不存在共有的關(guān)鍵字(在代碼和注釋中并沒(méi)有找到「Ping」、「REST」或「api」字樣),我們的語(yǔ)義搜索算法也能返回有意義的結(jié)果!通過(guò)語(yǔ)義搜索增強(qiáng)關(guān)鍵字搜索是意義深遠(yuǎn)的。例如,這種能力可以加快新的軟件工程師上手軟件項(xiàng)目的過(guò)程,并且普遍提高代碼被發(fā)現(xiàn)的可能性。

在本文中,我們想向讀者分享我們是如何利用深度學(xué)習(xí)技術(shù)在自然語(yǔ)言語(yǔ)義搜索領(lǐng)域取得進(jìn)步的。我們也分享了一個(gè)開(kāi)源的示例,以及復(fù)現(xiàn)這些結(jié)果所需的代碼和數(shù)據(jù)。

引言

目前,對(duì)實(shí)體的表示學(xué)習(xí)是 GitHub 上正在進(jìn)行的機(jī)器學(xué)習(xí)研究的關(guān)鍵領(lǐng)域之一,這里的實(shí)體包括代碼倉(cāng)庫(kù)、代碼、問(wèn)題單、文件和用戶。我們通過(guò)學(xué)習(xí)與文本共享一個(gè)向量空間的代碼的表征,在促進(jìn)語(yǔ)義搜索方面取得了顯著的進(jìn)步。我們不妨看一看下面的示意圖中的例子:

在上面的例子中,Text 2(藍(lán)色)是對(duì)代碼的合理描述,而 Text1(紅色)則與代碼完全無(wú)關(guān)。我們的目標(biāo)是讓學(xué)習(xí)到的描述相同概念的文本、代碼對(duì)的表征比較接近。而不相關(guān)的文本、代碼對(duì)的表征的距離較遠(yuǎn)。通過(guò)在相同的向量空間中表征代碼和文本,我們可以將用戶的搜索查詢向量化,并查找最接近的表示代碼的向量。下面是我們目前用來(lái)完成這項(xiàng)任務(wù)的方法的四個(gè)步驟:

1. 學(xué)習(xí)代碼的表征

為了學(xué)習(xí)代碼的表征,我們訓(xùn)練了一個(gè)序列到序列(Seq2Seq)模型,它能夠?qū)W著對(duì)代碼進(jìn)行總結(jié)。在 Python 環(huán)境下實(shí)現(xiàn)這一目的一種方法是提供(代碼,文檔字符串)對(duì),其中文檔字符串是模型試圖預(yù)測(cè)的目標(biāo)變量。對(duì)我們來(lái)說(shuō),引入對(duì)特定領(lǐng)域(如基于樹(shù)結(jié)構(gòu)的?LSTM、門(mén)控圖網(wǎng)絡(luò)以及有語(yǔ)法意識(shí)的分詞處理)的優(yōu)化是一個(gè)熱點(diǎn)的研究領(lǐng)域。下圖展示了代碼總結(jié)模型的工作過(guò)程。在這個(gè)例子中,有兩個(gè) python 函數(shù)作為輸入,在這兩種情況下,模型都將合理的代碼總結(jié)作為輸出:

應(yīng)當(dāng)指出,在上面的例子中,模型通過(guò)使用整段代碼塊而不僅僅是函數(shù)名來(lái)生成對(duì)代碼的總結(jié)。

構(gòu)建代碼總結(jié)器本身是一個(gè)非常激動(dòng)人心的項(xiàng)目,然而,我們還可以利用這個(gè)模型的編碼器作為代碼的通用特征提取器。從這個(gè)模型中提取出編碼器后,我們可以對(duì)它進(jìn)行調(diào)優(yōu),從而建立代碼到自然語(yǔ)言的向量空間的映射。

我們可以客觀地使用 BLEU 得分來(lái)評(píng)估這個(gè)模型。目前,我們已經(jīng)能夠使用 fairseq-py 代碼庫(kù)(https://github.com/pytorch/fairseq)構(gòu)建?Seq2Seq?模型,在一個(gè) python 代碼驗(yàn)證集上獲得 13.5 的 BLEU 得分。

2. 學(xué)習(xí)短文本的表征

除了學(xué)習(xí)代碼的表征以外,我們還需要為短文本(例如在 Python 文檔字符串中找到的句子)找到合適的表征。最初,我們嘗試使用通用的句子編碼器,這是一個(gè)預(yù)訓(xùn)練好的文本編碼器,可以從?TensorFlow Hub(https://www.tensorflow.org/hub/modules/google/universal-sentence-encoder/1)上獲取。盡管目前嵌入技術(shù)的性能已經(jīng)很好,我們發(fā)現(xiàn)學(xué)習(xí)針對(duì)于軟件開(kāi)發(fā)的詞匯和語(yǔ)義的嵌入仍然是有益的。目前正在進(jìn)行一個(gè)研究領(lǐng)域旨在評(píng)估用于訓(xùn)練我們模型的不同特定領(lǐng)域的語(yǔ)料庫(kù),其范圍涵蓋從 GitHub 問(wèn)題單到第三方數(shù)據(jù)集的諸多領(lǐng)域。

為了學(xué)習(xí)短文本的表征,我們利用 fast.ai 庫(kù)訓(xùn)練了一個(gè)神經(jīng)語(yǔ)言模型。這個(gè)庫(kù)讓我們可以很容易使用像 AWD?LSTM?這樣最先進(jìn)的架構(gòu),以及類(lèi)似帶隨機(jī)重啟的周期性學(xué)習(xí)率(cyclical learning rates with random restarts)這樣的技術(shù)。我們使用

《Universal Language Model Fine-tuning for Text?Classification》中提出的級(jí)聯(lián)池化(concat pooling)技術(shù)通過(guò)總結(jié)隱藏狀態(tài)從該模型中抽取出對(duì)短文本的表征。

這項(xiàng)工作一個(gè)最具挑戰(zhàn)性的方面是評(píng)估這些嵌入的質(zhì)量。我們目前正在構(gòu)建各種類(lèi)似于《SentEval: evaluation toolkit for sentence embeddings》(https://github.com/facebookresearch/SentEval)中概述 (https://github.com/facebookresearch/SentEval) 的下游監(jiān)督任務(wù),它們將幫助我們客觀地評(píng)估這些嵌入的質(zhì)量。與此同時(shí),我們還通過(guò)手動(dòng)檢驗(yàn)相似短文本之間的相似程度來(lái)檢查我們的嵌入。下面的截圖展示了一些示例,我們?cè)谶@里根據(jù)用戶提供的短文本和向量化的文檔字符串間的相似程度進(jìn)行搜索。

3. 將代碼表征映射到具有相同向量空間的文本上

接下來(lái),我們將把從代碼總結(jié)模型(第 1 部分)中學(xué)到的代碼表征映射到文本的向量空間。我們通過(guò)對(duì)該模型的編碼器進(jìn)行調(diào)優(yōu)來(lái)實(shí)現(xiàn)這一點(diǎn)。這個(gè)模型的輸入仍然是代碼塊,然而模型的目標(biāo)變量現(xiàn)在變成了文檔字符串的向量化版本。這些文檔字符串使用上一節(jié)介紹的方法進(jìn)行了向量化處理。

具體而言,我們使用余弦近似損失(即預(yù)測(cè)值與真實(shí)標(biāo)簽的余弦距離平均值的相反數(shù))進(jìn)行多維回歸,將編碼器的隱藏狀態(tài)帶入與文本相同的向量空間。

我們正在積極研究直接學(xué)習(xí)代碼和自然語(yǔ)言的聯(lián)合向量空間的方法,我們的研究借鑒了《Efficient Natural Language Response Suggestion for Smart Reply》中介紹的一些思路。

4. 創(chuàng)建一個(gè)語(yǔ)義搜索系統(tǒng)

最后,在成功地創(chuàng)建了一個(gè)可以將代碼向量化到與文本相同的向量空間的模型之后,我們可以創(chuàng)建一個(gè)語(yǔ)義搜索機(jī)制。最簡(jiǎn)單的形式是,我們可以在一個(gè)數(shù)據(jù)庫(kù)中存儲(chǔ)所有代碼的向量化版本,對(duì)向量化的搜索查詢執(zhí)行最近鄰查找。

我們研究的另一個(gè)熱點(diǎn)領(lǐng)域是確定用語(yǔ)義結(jié)果增強(qiáng)現(xiàn)有關(guān)鍵字搜索的最佳方法,以及如何引入上下文語(yǔ)境和相關(guān)性等額外的信息。此外,我們正在積極探索如何評(píng)估搜索結(jié)果的質(zhì)量,使我們能夠在這個(gè)問(wèn)題上快速迭代開(kāi)發(fā)。我們未來(lái)將在博文中繼續(xù)討論這些話題。

總結(jié)

下面的示意圖總結(jié)了我們當(dāng)前的語(yǔ)義搜索工作流程中所有的步驟:

我們正在探索如何改進(jìn)這種方法的幾乎每一個(gè)組成部分,包括數(shù)據(jù)準(zhǔn)備、模型架構(gòu)、評(píng)估過(guò)程以及整體的系統(tǒng)設(shè)計(jì)。本文所介紹的只是一個(gè)基礎(chǔ)的最小的示例。

開(kāi)源示例

我們的開(kāi)源端到端教程(https://towardsdatascience.com/semantic-code-search-3cd6d244a39c)包含了本文中概述的方法的詳細(xì)演示過(guò)程,以及你可以用來(lái)復(fù)現(xiàn)結(jié)果的代碼和數(shù)據(jù)。(https://towardsdatascience.com/semantic-code-search-3cd6d244a39c)

該開(kāi)源示例(進(jìn)行了一些修改)也被用作 kubeflow 項(xiàng)目的教程,具體實(shí)現(xiàn)請(qǐng)參閱:https://github.com/kubeflow/examples/tree/master/code_search

局限性及可能的用例場(chǎng)景

我們認(rèn)為,相對(duì)于通常使用的「如何...」這種形式的查詢,語(yǔ)義代碼搜索將最有益于針對(duì)諸如代碼倉(cāng)庫(kù)、組織或用戶等特定實(shí)體的代碼搜索。在我們最近發(fā)布的實(shí)驗(yàn)網(wǎng)站(https://blog.github.com/2018-09-18-introducing-experiments-an-ongoing-research-effort-from-github/)上,語(yǔ)義代碼搜索的實(shí)時(shí)演示(https://blog.github.com/2018-09-18-introducing-experiments-an-ongoing-research-effort-from-github/)不允許用戶針對(duì)代碼倉(cāng)庫(kù)進(jìn)行特定的搜索。實(shí)際上,這種演示只是為了分享可能得到的效果,并且只搜索一組受限的、靜態(tài)的 python 代碼集。

此外,與所有的機(jī)器學(xué)習(xí)技術(shù)一樣,該方法的效果也受限于使用的訓(xùn)練數(shù)據(jù)。例如,用于訓(xùn)練這些模型的數(shù)據(jù)是(代碼,文檔字符串)對(duì)。因此,與文檔字符串最相似的搜索查詢成功的幾率最大。另一方面,如果查詢與文檔字符串差別很大或者含有支撐數(shù)據(jù)很少的概念,該模型可能不會(huì)產(chǎn)生很好的搜索結(jié)果。因此,這對(duì)于我們進(jìn)行實(shí)時(shí)演示是一個(gè)挑戰(zhàn)。盡管如此,我們初步的結(jié)果表明,這是一個(gè)碩果累累的研究領(lǐng)域,我們很高興與你們分享。

語(yǔ)義代碼搜索還有更多的用例場(chǎng)景。例如,我們可以對(duì)本文介紹的想法進(jìn)行擴(kuò)展,允許用戶使用他們選擇的自然語(yǔ)言(法語(yǔ)、普通話、阿拉伯語(yǔ)等)同時(shí)對(duì)用許多不同的編程語(yǔ)言編寫(xiě)的代碼進(jìn)行搜索。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容