亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        面向業(yè)務需求的算法路徑自組配模型

        2023-07-03 14:11:54陳一風
        計算機應用 2023年6期
        關鍵詞:排序結構模型

        劉 耀,童 昕,陳一風

        (1.中國科學技術信息研究所 信息技術支持中心,北京 100038;2.北京大學 軟件與微電子學院,北京 102600)

        0 引言

        本文立足于情報工作常用算法及相關算法平臺,數(shù)據(jù)集為項目中累積的面向業(yè)務的所有算法以及依據(jù)算法源代碼拆分后的算法代碼組件,這些算法及組件來源于基于業(yè)務劃定的算法范圍所構建的算法資源庫。本文選擇基于Python代碼實現(xiàn),面向業(yè)務中涉及的機器學習算法進行代碼解析與組配研究,從而實現(xiàn)智能化算法管理平臺中的算法結構化及算法業(yè)務流自組織。本文的主要工作包括3 個方面:

        1)代碼組件表示方法建模。本文在綜合研究抽象語法樹、控制流程圖等代碼結構提取方法的基礎上,提出一套對邏輯結構、數(shù)據(jù)流以及組件間的調用關系進行綜合解析的方法,并通過基于圖卷積網(wǎng)絡(Graph Convolutional Network,GCN)對代碼組件進行圖向量表示。

        2)提出了代碼路徑自組配模型。本文提出使用聚類的方法進行算法代碼的功能挖掘,發(fā)現(xiàn)算法代碼間的路徑關系,并基于排序實現(xiàn)算法路徑自組織。

        3)通過實驗驗證了對算法進行解析得到算法代碼組件,并在此基礎上進行算法路徑自組配可行性實驗及對比實驗。

        1 相關工作

        本文旨在基于代碼的結構特征與語義特征,從業(yè)務需求出發(fā)檢索資源庫中的代碼,在算法代碼的理解基礎上,根據(jù)業(yè)務需求匹配得到的代碼進行組配。在本文中,生成指對算法代碼的復用。對算法代碼復用的基礎是有能力拆分完整的算法代碼,拆分建立在對算法代碼的理解之上。

        1.1 代碼復用

        代碼復用[1]在企業(yè)中普遍使用,開發(fā)人員出于效率、成本、代碼準確性的考慮以多種形式實現(xiàn)代碼復用,已有的研究表明恰當?shù)拇a復用可以快速集成功能、提高代碼準確性。

        國內外關于代碼復用的研究經歷了3 個階段:1)傳統(tǒng)代碼復用階段,開發(fā)人員從互聯(lián)網(wǎng)手動獲取可復用代碼、代碼文檔、代碼用例等,并對代碼進行手動更改。2)基于數(shù)據(jù)挖掘的代碼復用階段,分為代碼片段級別和代碼功能模塊兩個維度的復用:在代碼片段級別,Lin 等[2]將克隆檢測結果與多段代碼之間的差異比較技術相結合,檢測實例間的差異,同時認為不同代碼的差異點可以轉化為代碼可變點;而代碼功能模塊的復用即從相似代碼塊中抽取功能相似的設計和模板,開發(fā)人員在此基礎上針對具體需求實現(xiàn)特定功能[3]。3)基于深度學習的代碼復用主要用于訓練和預測階段[4],基于傳統(tǒng)統(tǒng)計學習的代碼推薦方法[5-10]和基于深度學習的代碼推薦方法[11-13]將代碼視為序列,并將包含N元語法(N-gram)等在內的傳統(tǒng)統(tǒng)計模型或長短期記憶(Long Short-Term Memory,LSTM)人工神經網(wǎng)絡在內的深度學習模型用于學習和訓練,但這些研究方法缺乏對代碼的結構信息的考量,導致它們無法有效捕獲遠距離代碼間關系,同時并未實例化代碼中的參數(shù)。為了改進這一情況,基于Tree-LSTM(Treebased LSTM)的推薦方法DeepAPIRec[14]應運而生,通過訓練語句模型預測抽象代碼語句,并構造參數(shù)模型以實現(xiàn)代碼語句的實例化。

        基于此,本文確定了將算法代碼塊進行拆分可以實現(xiàn)復用這一思想,將算法代碼進行結構化處理,同時獲取代碼的語義信息,為代碼復用作準備。

        1.2 代碼理解

        為了實現(xiàn)代碼理解,研究界通常采用強化學習和隨機編譯進行超優(yōu)化[15-16],或者借用自然語言處理(Natural Language Processing,NLP)中的概念處理人工編寫的代碼。這一方式的理論基于軟件語料庫具有與自然語言語料庫相似的統(tǒng)計特性,這些特性可以用來構建更好的軟件工程工具[17]。在代碼字符(token)的上下文表示中,主流方法之一依賴于詞典編纂位置[11];另一種方法則是挖掘代碼的結構,使用數(shù)據(jù)流圖[18]、控制流圖(Control Flow Graph,CFG)[19-21]、抽象語法樹(Abstract Syntax Tree,AST)[22]、AST 中的路徑或擴展的AST[23],例如使用連接不同用途和對應于變量[18]的語法令牌的更新的附加邊。AST 是指一種用于表達源碼抽象語法結構的樹狀結構[24],Zettlemoyer 等[25]將AST 視作組合范疇語法(Combinatory Categorial Grammar,CCG)的輕量級版本,用來描繪代碼結構。

        算法代碼作為機器語言,包含嚴格的結構信息,同時作為可理解的自然語言,具備語義信息。充分表達代碼的結構和語義信息是進行代碼解析的基礎。以信息檢索(Information Retrieval,IR)為代表的傳統(tǒng)方法通常將代碼片段視為自然語言文本,并基于標簽對其進行建模。Kamiya等[26]和Sajnani 等[27]用標簽序列或一系列標簽表達代碼,并將之用于代碼克隆檢測。另外,潛在語義標引(Latent Semantic Indexing,LSI)[28]和文檔主題生成模型LDA(Latent Dirichlet Allocation)[29]也被應用于分析源碼,并取得一定的效果[30-31]。但這些方法忽略了代碼具有更豐富明確的結構信息,無法視為純自然語言或者基于代碼token 的方式進行處理[32]。

        2 面向業(yè)務的算法路徑自組配模型

        本文通過將算法代碼拆分為功能完整的可復用組件,以算法組件為基準構建算法代碼資源庫,并面向業(yè)務需求對算法組件進行檢索、選擇與自動組配,進而構建對應業(yè)務需求的算法代碼流程。面向業(yè)務的算法自組配的起點為面向業(yè)務描述的算法代碼檢索。通過自然語言描述的業(yè)務信息,首先需要從算法庫中找到與業(yè)務需求最符合的代碼組件集合;然后從這些組件中挖掘功能集合作為待構建的算法路徑的步驟,并依據(jù)先驗知識訓練得到的路徑發(fā)現(xiàn)與自組織模型;最后從面向業(yè)務的算法代碼組件集合中,構建面向業(yè)務的算法自組配模型的流程,如圖1所示。

        圖1 面向業(yè)務的算法自組配模型的流程Fig.1 Flow of algorithm path self-assembling model

        算法組配包括兩種場景,簡單需求直接匹配單一代碼塊,即輸入需求已被拆分為算法代碼步驟的最小顆粒度,進行排序重組即可。復雜需求表現(xiàn)為輸入需求顆粒度比現(xiàn)有算法代碼顆粒度大。此場景的處理機制是輸入需求,以需求為關鍵詞檢索代碼資源庫中所有相關包含結構信息的代碼組件,隨后將檢索到的代碼組件聚類,判斷該需求所需步驟以及步驟間的順序,即每一需求內部形成小型組配任務。該場景需要實現(xiàn)兩層組配,第一層是外層需求代碼間的組配,該層組配與簡單需求一致;第二層組配是單一需求拆分后的內部代碼的組配,兩層組配完成后,才能最終實現(xiàn)代碼的可運行。

        2.1 算法組件表示模型

        2.1.1 代碼結構提取

        在對算法代碼按照業(yè)務需求進行組配前,首先需要拆分算法代碼,拆分后的算法代碼塊應為一個算法代碼組件。一個組件通常包含了一個完整的功能,并且是組成算法的最小可復用單元。所謂最小,即拆分出來的代碼塊有且僅能實現(xiàn)單一步驟;所謂可復用,即拆分后的代碼塊需要具備一定的功能屬性,能實現(xiàn)具體的步驟,可以在其他代碼組合中運行。

        通過分析算法本身的業(yè)務流程,可以將算法劃分為一系列實現(xiàn)不同功能的步驟,每一個實現(xiàn)功能的步驟則可以被拆分為一個算法組件。本文面向的算法代碼為Python 語言,在Python 程序設計中,函數(shù)的設計一般滿足如上需求,因此對于算法組件的拆分,以函數(shù)為單位進行。

        本文結合AST 中詳細的變量之間賦值與操作關系,對代碼中隱含的數(shù)據(jù)流程的結構進行解析,并將解析所得到的數(shù)據(jù)流程結構與CFG 中基于流程控制的邏輯控制流程相結合,得到結合數(shù)據(jù)與流程的算法代碼結構。本文構建代碼的結構的步驟如下:

        1)對當前項目中的所有算法組件,分析它們的調用關系,并標注有調用關系的語句。

        2)對代碼的抽象語法樹進行解析,得到樹結構GAST,初始化代碼結構圖G。

        3)基于解析出的抽象語法樹,遍歷其中的節(jié)點V。

        4)對于邏輯結構和數(shù)據(jù)結構,分別構建邏輯控制流程節(jié)點集{vif,vfor,vwhile,vbreak,vcontinue,vreturn}、數(shù)據(jù)流程節(jié)點集{vassign,vop,vcall}和對應的數(shù)據(jù)節(jié)點集。

        5)對于當前節(jié)點,如果它屬于某個節(jié)點集,則將它加入結構G,如果它屬于邏輯控制流程開始的節(jié)點集或數(shù)據(jù)流程節(jié)點集,則將它作為當前子樹的頂點,遞歸構建邏輯結構與數(shù)據(jù)結構。

        6)遍歷完成GAST后,對返回的圖,遍歷其中的節(jié)點,將有組件間調用關系的節(jié)點進行連接,獲得組件間調用的關系結構,最終獲得代碼的結構圖G。

        本文從算法代碼庫中選取代碼對上述步驟進行說明,選取代碼為word2vec 算法中的word2vec-run 函數(shù)代碼組件。本文進行分析并構建對應的結構。在構建邏輯流程結構與數(shù)據(jù)流結構的基礎上,基于對算法package 內算法組件之間調用關系的分析[33],進一步從代碼中挖掘隱性結構?;诒竟?jié)提出的結構解析的步驟,對word2vec 的算法組件結構進行解析,最終共得到共37 條邊,35 個節(jié)點。對所構建的結構進行可視化,如圖2 所示。

        圖2 word2vec算法組件結構的可視化Fig.2 Visualization of component structure of word2vec algorithm

        可見,在基于CFG 對算法的隱含邏輯結構進行表示的基礎上,本節(jié)提出的結構解析方法能夠更加詳細地對算法組件中的變量等節(jié)點進行建模,能夠更加有效地挖掘與表示代碼的結構。

        與AST 過于詳細、復雜的結構相比,本文方法更加簡潔,能夠從代碼的顯性結構中,對隱含結構進行提?。慌c基于CFG 的簡略結構相比,本文方法更加詳盡,對CFG 中未解析的流程語句中所包含的豐富結構信息進行了挖掘,能在邏輯結構的基礎上添加更多有效信息,從而更加完備地對代碼的結構進行表達。在數(shù)據(jù)與控制流程的基礎上,進一步對算法組件間函數(shù)的調用關系進行分析,從而對組件間的依賴進行建模,更加有效地挖掘代碼中的隱性結構。

        2.1.2 代碼組件表示

        本文通過2.1.1 節(jié)步驟,實現(xiàn)了對代碼結構的解析。在此基礎上,使用GCN 以及結構中節(jié)點的word2vec 表示為輸入對代碼的結構與序列特征同時進行建模。本文所采用的代碼數(shù)據(jù)為拆分后的算法代碼庫中的所有算法代碼組件,共計424 個代碼組件,具體步驟如下。

        1)對于所有的代碼組件,提取其結構與相應節(jié)點的文本序列,并根據(jù)邏輯控制流程、數(shù)據(jù)流程等對節(jié)點劃分類型。

        2)將提取出的結構、文本序列與節(jié)點類型序列化為JavaScript 對象簡譜(JavaScript Object Notation,JSON)文件存儲。

        3)初始化GCN 模型,讀取結構文件并構建數(shù)據(jù)集。

        4)使用節(jié)點分類作為向量表示的訓練任務,根據(jù)節(jié)點在代碼組件中的類型,訓練模型預測節(jié)點的類型。

        5)訓練結束后,輸出模型最后一層的隱向量作為節(jié)點的向量表示。

        基于以上步驟所構建的數(shù)據(jù)集統(tǒng)計結果如表1 所示。

        表1 算法組件結構構建結果Tab.1 Results of algorithm component structure construction

        基于輸入的算法組件對,模型首先從中分別提取算法組件的結構信息,進而獲得組件結構的圖表示。其中,圖表示基于GCN,所獲得的表示為以圖中節(jié)點為單位的向量。在下一階段中,模型基于組件之間整體的結構與語義信息進行計算,因此,本文進一步使用注意力池化(Attention Pooling)的方法將圖結構中節(jié)點的向量編碼表示為整體的圖編碼。

        最常用的基于單位向量得到整體表示的方法為對所有的單位向量進行平均。在圖表示中,常用的平均方法為基于圖中節(jié)點度的加權平均方法:

        其中:un為節(jié)點n的向量表示,wn為基于節(jié)點度的重要性度量權重。然而,在代碼的結構圖中,節(jié)點的度信息無法很好地給出節(jié)點在圖中的重要性,基于度的加權方法無法很好地對代碼的整體結構信息進行表示。為了在圖結構的整體編碼中強調圖中更重要的節(jié)點,通常使用注意力機制(Attention Mechanism)為圖中節(jié)點增加可學習的權重,從而對基于節(jié)點對路徑關系的重要性對其向量進行加權表示。

        注意力機制在圖像處理與自然語言模型中被廣泛使用,并取得了廣泛的成功。在自然語言模型[34]中,通過在全連接網(wǎng)絡中使用注意力機制,模型可以對長距離依賴進行有效建模,同時避免了梯度問題與模型復雜度問題。在圖結構中,對于節(jié)點向量編碼U∈RN×D,本文在模型中增加權重參數(shù)矩陣W∈RD×D作為注意力權重,并通過注意力權重加權的節(jié)點向量與圖結構向量之間的內積作為最終的注意力得分,用于計算整體的圖結構信息。最終基于注意力的算法組件表示如式(2)所示:

        其中:fnorm為歸一化函數(shù),用于對最終的注意力得分進行歸一化;f1為非線性變換函數(shù);最終得到的VG為整體的圖結構表示。

        使用基于注意力的加權表示,模型分別對輸入的算法組件對進行結構與語義信息的向量表示,并使用向量表示作進一步的路徑計算。

        2.1.3 組件對融合向量表示

        模型通過計算圖結構之間的關系判斷組件之間是否存在路徑,其中組件結構信息的交互通過卷積計算進行。為了對結構之間的關系進行計算,本文借鑒ConvE(Convolutional two-dimensional knowledge graph Embeddings)[35]中獲得的知識圖譜三元組中實體與關系的二維向量表示,使用卷積網(wǎng)絡獲得兩個算法組件結構的融合向量,從而在基于目標使用反向傳播進行優(yōu)化時,將路徑信息通過卷積網(wǎng)絡獲得的融合向量分別傳播到各個組件的表示中,從而使得模型能夠同時利用輸入的算法組件中的結構信息并根據(jù)組件間的結構信息的交互計算判斷算法組件之間是否存在路徑。其中,輸入的算法組件的向量融合表示如式(3)所示:

        通過將組件對的結構表示進行卷積計算,模型得到了組件結構之間的融合向量,并以此為依據(jù)進行結構間關系的計算。

        2.2 基于語義擴充的檢索模型

        本文面向的對象主要為較為籠統(tǒng)的自然語言描述的業(yè)務需求。為了對自然語言中的檢索詞進行語義擴展,基于算法相關資源構建概念共現(xiàn)網(wǎng)絡。算法文檔和相關論文中包含的概念都可用于描述算法組件,因此將算法相關文檔、論文中的概念提取出來構建概念網(wǎng)絡。首先,在代碼庫的基礎上,構建與之關聯(lián)的文檔庫和論文庫,用于代碼組件檢索時進行語義擴充;然后,使用多語言BERT(Multilingual Bidirectional Encoder Representation from Transformers,M-BERT)在中英兩種語言上進行序列標注任務,從而識別中英文論文中的概念;最后,利用提取出的概念實體進行面向業(yè)務的代碼檢索模型構建。

        本文基于所構建的代碼表示模型,將算法代碼庫中的所有代碼進行向量化表示,并提取業(yè)務需求中的概念進行向量化,通過向量檢索的方式,從結構與語義的層面對代碼進行深度檢索,實現(xiàn)面向業(yè)務的算法代碼獲取。本文構建的檢索模型的步驟如下。

        1)給定業(yè)務需求,使用構建的概念識別模型,從中提取概念關鍵詞。

        2)在概念抽取的基礎上進行分詞并過濾停用詞,獲得業(yè)務需求的詞袋表示。

        3)基于拆分后的算法代碼組件,對于每個組件,提取其中的方法調用的變量名稱,將同一組件內的變量視為有共現(xiàn)關系,并提取與之關聯(lián)的算法文檔、論文中的概念,基于窗口構建概念的共現(xiàn)關系。遍歷所有組件,構建共現(xiàn)矩陣C。

        4)基于業(yè)務需求提取出的概念,從共現(xiàn)矩陣中檢索概念與變量名稱的共現(xiàn),得到共現(xiàn)矩陣C'中矩陣的元素為概念與變量共現(xiàn)的次數(shù)。

        5)對于業(yè)務需求中的概念i,從C′取與它共現(xiàn)次數(shù)最高的前e個詞作為業(yè)務需求的擴充概念,將它加入業(yè)務需求的詞袋表示,其中e的取值由閾值決定。

        6)基于業(yè)務需求的詞袋表示,獲得它基于詞袋的向量表示;使用該表示對算法代碼組件庫中所有組件的向量表示進行檢索。其中,檢索的分值由式(4)給出:

        其中:xq為業(yè)務需求的向量表示,xj為算法組件j的向量表示,常量ε作為約束值。

        2.3 路徑關系發(fā)現(xiàn)模型

        將通過2.1.3 節(jié)方法得到的融合向量使用全連接網(wǎng)絡輸出,并基于全連接網(wǎng)絡的輸入與目標之間計算誤差,從而對組件間的路徑關系建模。將路徑關系的挖掘視為二分類問題:將組件對輸入模型,如果組件之間存在路徑,模型應將關系預測為1;如果沒有路徑關系,則模型預測應接近0。然而,僅使用二分類任務對路徑挖掘建模,模型難以收斂。在此基礎上,本文同時將路徑發(fā)現(xiàn)任務視為排序任務,在聯(lián)合學習的框架下,同時對二分類任務與排序任務進行學習,從而對算法組件之間的路徑關系進行建模。具體地,模型在階段2 使用的二維卷積模型輸出的向量基礎上,使用2 層的全連接神經網(wǎng)絡將最終的表示分別映射到排序任務的向量輸出與二分類任務的向量輸出。在計算排序任務時,模型隨機從負例中抽樣算法組件對,并認為正例的組件對在排序上得分應高于負例的得分?;诼?lián)合訓練,模型的損失函數(shù)為:

        基于以上聯(lián)合損失,模型利用算法組件之間的結構特征,針對組件之間的路徑關系進行優(yōu)化。

        基于上述模型內容,研究所構建的算法組件間路徑發(fā)現(xiàn)模型如圖3 所示。

        圖3 路徑發(fā)現(xiàn)模型Fig.3 Path discovery model

        2.4 路徑自組織模型

        2.3節(jié)中通過構建路徑發(fā)現(xiàn)模型,從聚類挖掘出的功能集合中進一步構建了以算法組件對為單位的算法步驟,初步形成了算法路徑。然而,在這一步中挖掘出的路徑中的組件處于無序狀態(tài)。為了實現(xiàn)算法路徑的自組織,需要在構建出的路徑的基礎上,通過挖掘出的算法組件的結構信息與語義信息,依據(jù)所形成的路徑的整體結構與語義關系,使得作為步驟的算法組件能夠實現(xiàn)自組配,從而在路徑上形成有序的算法組件路徑,最終實現(xiàn)算法自組配。

        為了讓算法組件步驟能夠基于結構與語義信息自組配,可以將它視為面向整體算法流程的檢索任務:給定已經挖掘出的整體的無序算法路徑,為路徑中的算法組件給出分值,使得在組配流程中需要被組配到流程前列的算法組件得到更高的分值,而在流程中處于后列的算法組件得到更低的分值。

        以上問題可以形式化為:給定從功能集合中構建出的算法組件路徑子集D={d1,d2,…,dn},構建檢索函數(shù)f,應該返回一個排序r*,使得D中的算法組件的排序滿足在源代碼中的先驗分布?;谏弦还?jié)的路徑發(fā)現(xiàn)模型所構建出的算法步驟子集,其中的算法組件以組件對的形式被發(fā)現(xiàn),因此,本文基于對間(pairwise)的方式從構建出的算法路徑中,進一步構建排序模型,實現(xiàn)算法路徑的自組織。

        上一節(jié)中所構建的算法組件間路徑r與最佳排序r*可以視為滿足弱序條件(weak ordering)的D×D上的二元關系組,其中r?D×D且r*?D×D。對于r與r*中的算法組件di與dj,如果它們順序相同為同序對,不同則為異序對,數(shù)量分別為P和Q。在數(shù)量為n的有限算法組件子集D中,P和Q的和為則r與r*的kendall 系數(shù)定義為:

        其中ra和rb用于代表兩個路徑。

        可以看出,兩個路徑的kendall 系數(shù)只與Q有關,而Q給出了平均精度的下界:

        因此,要構建接近最優(yōu)算法路徑r*的算法組件子集,則要給定這一路徑的集合D作為檢索q,學習一個能夠最大化kendall 系數(shù)τ的函數(shù)f:

        對于本節(jié)研究所面向的算法組件子集,構建出的路徑以算法對(di,dj)的關系呈現(xiàn),因此對于學習函數(shù)f,可以將它視為根據(jù)集合D判斷組件對中哪個組件在路徑中的位置更靠前,即:

        其中:w是學習的權重向量;Φ(q,di)是檢索式q與文檔di之間的匹配關系映射所得的相關特征。函數(shù)f最大化kendell系數(shù)式,等價于最小化式中的Q,等價于學習一個w使得式中的二元組數(shù)量最大。因此,問題轉化為一個二分類問題,分類器通過學習w計算式,對二元組進行真值標注。在構建針對功能集合的算法路徑中,通過實驗發(fā)現(xiàn),在聯(lián)合學習的框架下進行訓練能夠使得模型更穩(wěn)定地收斂。因此,在上述任務的基礎上,將路徑中的算法組件對擴展到整條路徑中的算法組件子集,對于集合D與集合中所有的算法組件,模型同時學習一個函數(shù)f(w),從而對于集合中的算法組件dj,排在路徑中最前列的概率[36]為:

        因此,可以通過交叉熵損失最大化形成算法路徑的概率:

        其中y為最優(yōu)算法路徑r*中算法組件的得分序列。

        基于上述研究與所構建出的算法組件組成的無序算法路徑子集,在聯(lián)合學習的框架下,構建了算法路徑的自組織模型。模型接受3 組輸入:所有組成路徑的算法組件子集、待排序的算法組件1 和待排序的算法組件2。模型首先對以上的算法組件分別提取結構與序列信息,并基于注意力池化分別將輸入的組件表示為能夠對圖的整體結構與序列信息進行編碼的向量。模型進一步將所有組件子集的表示視為查詢向量query,將待排序的組件1 的表示視為鍵向量key,根據(jù)查詢向量query與鍵向量key,獲得它的融合向量vector;基于vector與組件2 的表示,給出組件1 與組件2 在所有組件子集的語境下的相對排序;同時,基于融合向量vector,獲得它在所有組件子集中的排序得分。本文基于源代碼中所包含的算法組件的先驗排序構建訓練集對模型進行訓練,從而得到算法路徑自組織模型,模型如圖4 所示。

        圖4 算法路徑自組織模型Fig.4 Self-assembling model of algorithm path

        3 實驗與結果分析

        3.1 基于功能的算法步驟挖掘

        在本節(jié)中,選取詞頻-逆向文件頻率(Term Frequency-Inverse Document Frequency,TF-IDF)相關的算法作為資源,作為進行算法自動組配實驗的數(shù)據(jù)。在本文構建的算法資源庫中,以TF-IDF 為關鍵詞進行檢索,檢索結果為庫中所有與TF-IDF 相關的算法,包括算法的源代碼以及拆分后的TF-IDF 的算法代碼,拆分后的算法塊為有完整功能的最小可復用單元,可以作為算法組件使用。檢索結果共包括5 個不同來源的TF-IDF 算法,總計25 個組件構成,數(shù)據(jù)統(tǒng)計如表2 所示。

        表2 實驗數(shù)據(jù)統(tǒng)計Tab.2 Experimental data statistics

        基于對算法代碼的向量表示,本文選取常用的聚類算法k-means 進行聚類。通過計算所有類簇數(shù)量k取值范圍內的評測指標,并選取最優(yōu)指標對應的類簇數(shù)量,確定所需k的取值。k是一個相對重要的參數(shù):若k取值過低,則無法有效區(qū)分不同的算法組件,導致原本需要進行組配的兩類算法組件在同一個類里,從而影響組配進行;若k取值過高,則會產生冗余的組件類型。定義k的取值范圍為k∈range(5,12)。

        為了確定最優(yōu)k值,本文提出基于輪廓系數(shù)(Silhouette Coefficient)與方差比準則(Calinski-Harabasz score)的加權指標進行類簇數(shù)量確定的方法。該指標計算方式如下:

        其中:最終的評價指標為輪廓系數(shù)與方差比準則的加權和,評價指標值越高,表明k的取值越好;權重大小根據(jù)經驗確定,在實驗中選取α=0.2,β=0.8。選用式(14)中提出的加權指標,對聚類模型的類簇數(shù)量進行確定。根據(jù)實驗結果,在k=6 時,得到最優(yōu)指標。其中k取不同值時的指標變化如圖5 所示。

        圖5 k取不同值時的指標變化Fig.5 Influence of k on Score

        從表3 聚類結果可見,大部分類簇所包含的功能均得到了有效區(qū)分。分析未能正確聚類的算法組件,所實現(xiàn)的功能、其中所包含的變量命名以及文檔與被聚在同類的其余組件均較為相似,因此未能正確聚類。在類簇0 中,對構建字典的代碼內容分析,其本質為統(tǒng)計語料庫中不同詞出現(xiàn)的次數(shù)并構建字典,大部分實現(xiàn)與計算TF 值的實現(xiàn)一致,因此被聚在同一類中。實驗結果表明,本文提出的使用聚類模型對所有的候選代碼組件進行功能區(qū)分以及步驟挖掘的方法能夠較好地區(qū)分出不同功能的候選代碼,且基于聚類模型制定的k值評價指標能夠有效挖掘算法流程中步驟數(shù),從而為進一步的代碼組配提供依據(jù)。

        表3 TF-IDF算法組件聚類結果Tab.3 Component clustering results of TF-IDF algorithm

        3.2 算法路徑關系發(fā)現(xiàn)

        本文選取算法代碼庫中所有拆分后的代碼,根據(jù)源代碼中函數(shù)執(zhí)行的順序作為路徑的先驗知識,對算法組件之間的路徑關系進行標注。同一源代碼中的算法組件之間存在路徑關系,本質是同一源代碼的算法組件之間因為變量命名、函數(shù)調用以及輸入、輸出的參數(shù)等變量所構成的圖結構之間存在一定先驗聯(lián)系。在源代碼中,如果兩個算法組件存在執(zhí)行的先后順序,則認為這兩個組件之間存在路徑關系,對于存在路徑的算法組件,將這兩個組件之間的關系標為1。標注完畢后,選取不同的算法源代碼,不同算法之間功能不同的算法組件不存在路徑關系。按照這樣的策略,從所有樣本中獲取負例樣本,數(shù)量遠大于正例樣本,因此,在進行訓練時,根據(jù)不同算法之間功能不同的算法組件不存在路徑關系這一假設,制定了抽樣策略,在更新模型參數(shù)時,根據(jù)抽樣策略隨機抽動態(tài)樣出不存在路徑關系的組件對,將路徑關系標為0。最終,共得到正例樣本385 個。本文對樣本進行隨機排序,并按照4∶1 的比例從獲得的正例樣本中構建訓練集與測試集,并根據(jù)抽樣策略抽取了80 個算法組件對作為負例樣本的測試集。使用算法組件先驗知識得到的數(shù)據(jù)集進行訓練后,使用得到的模型,進一步從3.1 節(jié)聚類挖掘出的不同功能類別的算法組件中,進行算法路徑的挖掘,以進一步驗證模型的有效性。

        初始化上述路徑發(fā)現(xiàn)模型使用的參數(shù)如表4。

        表4 路徑發(fā)現(xiàn)模型的初始化參數(shù)Tab.4 Initialization parameters for path discovery model

        使用準確率(Accuracy)作為模型的評價指標,對模型預測算法組件之間是否存在路徑關系的性能進行評估。采用模型第2 層全連接層的輸出并使用sigmoid 函數(shù)進行歸一化,作為路徑存在的概率,并劃定閾值,作為依據(jù)概率判斷路徑是否存在的依據(jù)。實驗中,存在路徑的閾值定為0.85,不存在路徑的閾值定位0.15。最終,在訓練至第300 次時,模型準確率達到最高為0.95,訓練集損失值最低為3.98,在測試集上的最高準確率達到0.72。

        由結果可知,模型可以較好地擬合根據(jù)先驗路徑關系構建的訓練數(shù)據(jù),并在測試集上具有較好的泛化能力,說明模型可以較好地建立從源代碼中的路徑關系到算法代碼結構與語義信息的聯(lián)系。進一步選取聚類所得到的6 類算法步驟,從中進行算法路徑挖掘,步驟如下。

        1)從聚類得到的第一個類簇#0 出發(fā),遍歷其余所有聚類得到的功能集合。

        2)遍歷類簇#0 中的算法組件。

        3)對于其中的每個組件,計算和后一個類簇中的所有組件形成路徑的概率。

        4)選取概率最高的組件對,將當前的算法組件添加到路徑,并從組件對中屬于下一個類簇的組件開始,計算和后一個類簇中的所有組件形成路徑的概率。

        5)如果當前組件和下一類簇的所有組件都無法形成路徑,則跳過下一類簇。

        6)重復步驟3)~4),直到對聚類得到的所有類簇遍歷完成。

        基于以上步驟,能挖掘出所有的功能集合中可組成算法路徑的概率最大的算法組件集。在挖掘完成后,還可以通過從聚類類簇中去掉已經挖掘出的算法步驟,重復執(zhí)行算法,挖掘出所有可能的算法路徑。

        從表3 中聚類得到的算法功能類別數(shù)據(jù),進行算法路徑的構建。選取所構建出概率最大的路徑,如表5 所示。

        表5 算法組件間的路徑發(fā)現(xiàn)結果Tab.5 Results of path discovery among algorithm components

        根據(jù)路徑概率,可計算該條算法路徑形成的置信度為0.904,為聚類數(shù)據(jù)中置信度最高的路徑。分析所構建的路徑,發(fā)現(xiàn)模型能夠利用訓練數(shù)據(jù)中算法組件結構與序列信息之間的先驗數(shù)據(jù),將結構與語義最為匹配的算法組件挖掘出來,構成算法流程。

        基于路徑發(fā)現(xiàn)模型,可以有效構建出算法流程中所需要的所有算法組件,形成算法步驟。然而,這些算法步驟之間并沒有順序關系,因此,進一步構建路徑自組織模型,基于所發(fā)現(xiàn)的所有算法步驟,對其中的算法組件進行排序,從而最終實現(xiàn)算法的自組配。

        3.3 基于排序的算法路徑自組織

        訓練數(shù)據(jù)來源于拆分后的算法組件及其源代碼,以源代碼中算法組件的調用順序作為算法路徑構建中算法組件順序的先驗知識來源,統(tǒng)計數(shù)據(jù)如圖6 所示。

        圖6 排序數(shù)據(jù)集的統(tǒng)計Fig.6 Statistics of ranking datasets

        對于同一個流程中不同的算法組件,本文對組件進行遍歷構建組件三元組,三元組包括算法流程中的兩個算法組件,以及源代碼的所有組件。將三元組中,組件1 排序靠前的作為正例,組件2 排序靠前的作為負例;在三元組的基礎上,進一步根據(jù)組件在算法流程中的順序,獲得其中組件1與組件2 的排序得分。排序分數(shù)的范圍來源于排序數(shù)據(jù)集中包含最多算法組件的算法流程中算法組件數(shù)。根據(jù)所統(tǒng)計的排序數(shù)據(jù)集,制定排序分數(shù)范圍為Score=range(0,25)。對于算法流程中的算法組件di,如果它在算法流程中的排序為i,其排序得分Si=max(Score) -i。在三元組的基礎上,加入組件1 與組件2 的排序得分,形成包括組件1、組件2、源代碼組件集合和組件得分這4 個元素的數(shù)據(jù),作為數(shù)據(jù)集中每條數(shù)據(jù)的字段。最終構建的路徑自組織數(shù)據(jù)集共包含正負例各2 316 條數(shù)據(jù)。研究采用4∶1 的比例劃分訓練集與驗證集,在模型上進行訓練并驗證模型對算法對排序的性能。

        本文采用表6 所示參數(shù)初始化路徑自組織模型。

        表6 路徑自組織模型的初始化參數(shù)Tab.6 Initialization parameters for path self-assembling model

        使用準確率作為對模型預測組件對排序的評價指標,對模型預測某一算法路徑中算法步驟順序的性能進行評價。其中,針對模型輸出的對算法組件對的排序,采用模型輸出二元排序分數(shù)的全連接層的輸出,并劃分閾值,作為排序打分。其中,組件1 排序高于組件2 排序的閾值設置為0.85,組件1 排序低于組件2 排序的閾值設置為0.15。在模型訓練過程中,采用早停策略,在第40 個epoch 時,模型在測試集上的準確率達到0.92,在訓練集上的準確率達到0.98。模型訓練過程中的損失值最低為0.17。

        依據(jù)本節(jié)所構建的自組織模型,進一步使用3.2 節(jié)中的算法組件集構成的路徑,依據(jù)算法組件間的排序分值對其進行自組織,最終構建出自組配的算法路徑,以驗證算法路徑自組織模型的有效性?;诒? 中的路徑步驟數(shù)據(jù),路徑自組織模型給出其中算法組件對的排序概率分值,如表7所示。

        表7 算法組件對間的排序分值Tab.7 Ranking scores among pairs of algorithm components

        根據(jù)排序算法,輸出最終的算法路徑,如表8 所示。根據(jù)模型輸出的分值數(shù)據(jù),可以看到,模型能夠很好地利用從算法源代碼中所學到的先驗路徑排序知識,對形成算法路徑的組件輸出正確的排序,從而實現(xiàn)算法路徑中不同算法步驟的自組織,最終實現(xiàn)算法自組配,生成正確的算法流程路徑。為了進一步驗證所提出的算法自組配流程的有效性,選取更為復雜的決策樹算法,對其拆分后的代碼組件進行組配。拆分得到的決策樹算法組件統(tǒng)計如表9 所示。

        表8 TF-IDF算法組件自組配結果Tab.8 Component self-assembling results of TF-IDF algorithm

        表9 決策樹算法組件統(tǒng)計Tab.9 Component statistics of decision tree algorithm

        對決策樹組件進行組配,輸出的算法路徑功能步驟組配結果為:1)讀取txt;2)劃分數(shù)據(jù);3)計算信息熵;4)計算信息增益;5)ID3 選擇特征;6)多數(shù)決定葉子節(jié)點分類;7)生成樹。

        分析組配得到的結果可以看到,更為復雜的決策樹算法上,從拆分得到的組件集合中,模型都能夠很好地挖掘功能不同的組件子集,并通過路徑發(fā)現(xiàn)與排序模型對算法組件進行自組織,最終生成順序正確的算法流程,驗證了本文所構建的算法自組配方法的有效性。

        3.4 面向業(yè)務需求的算法路徑自組配

        本文評估基于單個業(yè)務需求,對于面向業(yè)務流程的自組配評估,僅需對流程上的各個步驟的評估指標進行平均即可得到業(yè)務流程的評估結果,因此采用的評估方式基于單個業(yè)務需求。

        對于業(yè)務需求q最終組配得到的算法代碼,評價指標由代碼自組配系統(tǒng)的召回率Rec(Recall)與平均精確度AP(Average Precision)聯(lián)合給出:

        其中:GroundTruth為人工標注的所有相關的算法數(shù);p@k為第k個樣本時的精確度;rel@k用來評估第k個樣本是否與檢索相關,如果相關則為1;Rh表示召回的所有算法組件;Rt表示召回的組件中正確的組件數(shù)。

        在實際實驗中發(fā)現(xiàn),對于特定業(yè)務需求,算法代碼自組配系統(tǒng)首先根據(jù)算法代碼的向量表示檢索相關的算法組件,并進行自動組配。然而,算法組件組配的路徑并不唯一,即對于同一需求,可能存在多條合理的算法組配路徑實現(xiàn)這一需求,而自組配系統(tǒng)基于算法代碼表示,給出其中的一條路徑,因此使用人工制定的標準進行評估,難以對每個需求都制定一個標準代碼檢索結果與組配路徑,導致使用上述評估指標時,自動算法組配的指標計算值過低。

        因此,對上述評分公式進行改進。改進后的評分公式不進行精確匹配,而對功能相似度進行匹配。對于排序@k(@表示top)上的代碼組件,如k1為人工選取的代碼組件,k2為自動組配系統(tǒng)選取的代碼組件,其相似度sim(k1,k2)為:

        其中:代碼組件的向量由網(wǎng)絡表示模型給出,vec()表示向量,如vec(k1)就是指代碼組件k1的向量。基于上述相似度計算公式,改進后的代碼評分準則中召回率、精確度的計算基于相似度閾值而非精確匹配,其中,判斷自動組配系統(tǒng)給出的候選代碼組件與人工給出的候選代碼組件是否一致的標準由rel@k給出,即:

        其中threshold為人工設定的相似度閾值。

        本文在所有算法組件數(shù)據(jù)集的基礎上共構建了3 個自然語言描述的業(yè)務需求作為檢索條件,并基于業(yè)務需求,人工選取排名靠前的20 個算法組件,作為最優(yōu)檢索排序,并分別使用基線模型與本文提出的檢索模型分別面向所構建的業(yè)務需求進行檢索。其中,研究所構建的業(yè)務需求分別為:

        query1:“給定多篇txt 格式的文本,讀取文本,并使用BM25 對讀取后的文檔進行排序”。

        query2:“基于一篇或多篇txt 格式的文本,使用textrank算法,從文本中包含的內容中提取關鍵詞”。

        query3:“給定語料庫,其中包含多篇文本,每篇文本有多行文字,每行文字代表一句話,其中詞由空格隔開,使用word2vec 算法獲取其中的詞向量”。

        在此基礎上,選取信息檢索領域常用的檢索模型作為基線模型,與本文方法進行對比。本文所采用的基線模型為基于關鍵詞的BM25(Okapi BM25)排序算法,定義如式(20)所示:

        其中:k、b為可調節(jié)的參數(shù),|D|為檢索的文檔的長度,即為算法組件的詞袋表示的長度,avgdl為文檔的平均長度。在基于BM25 的方法中,僅對業(yè)務需求的自然語言描述進行分詞,將分詞后獲得的詞作為語素,從算法代碼的詞袋表示中,使用字符串匹配的方式進行檢索并計算BM25 分值,作為基線模型。

        在實際檢索時,由于本文所構建的算法代碼庫大多基于英文,因此首先將所制定的query 轉為英文,采用檢索得到的算法組件,并依據(jù)相關性篩選出相關性過低的組件,將算法組件輸入本文所構建的路徑發(fā)現(xiàn)與自組配模型中,得到自組配的算法流程?;谏鲜鲈u價指標,分別使用不同的算法組件表示方法進行實驗,并分析最終構建出的路徑的結果?;诼窂桨l(fā)現(xiàn)與自組配模型,本文構建了3 種不同的表示模型進行實驗:基于BM25 檢索與詞袋表示的模型;基于語義擴充檢索與詞袋表示的模型;基于語義擴充檢索與融合結構、序列表示的模型?;谏鲜鲈u價指標,實驗結果如表10所示。

        表10 基于不同表示方法的檢索對比實驗結果Tab.10 Comparative experiment results on retrieval based on different representation methods

        分析結果可見,本文所采用的模型與傳統(tǒng)的排序算法相比有較大的提升。在基本結構相似的情況下(對向量的表示均采用skip-gram/cbow 結構),本文所構建的檢索方法能夠較大地提升檢索結果中相關算法組件的數(shù)量,從而顯著提高算法組配的結果,而傳統(tǒng)排序算法僅僅基于分詞后的詞相關度進行排序,因此無法針對算法的語義與結構進行檢索。僅使用詞袋方法進行語義表示的代碼表示方法,無法有效利用算法的結構信息,因此無法形成有邏輯的組配路徑,而本文排序模型來源于源代碼的先驗知識,與使用傳統(tǒng)的表示方法相比,有較大的提升,說明算法代碼組件及其資源的結構與語義知識對于算法的自組配有較大的作用。

        4 結語

        本文構建了算法路徑自組配模型,為實現(xiàn)算法結構化管理提供依據(jù)。首先,基于情報工程算法平臺,對代碼以最小可復用單元進行拆分,使它與業(yè)務步驟相對應,為算法組配的實現(xiàn)奠定基礎;接著,結合AST 和CFG 等對算法代碼進行結構提取,并使用GCN 和word2vec 對算法組件進行圖向量表示;然后,在此基礎上使用聚類模型進行步驟挖掘,通過組件對融合向量計算進行組件間路徑發(fā)現(xiàn);最后,使用排序算法實現(xiàn)算法路徑自組配。

        基于本文提出的自組配算法得到算法組件的自組織路徑后,仍有部分算法組件間的輸入輸出無法完全使用自動化的方式進行數(shù)據(jù)流的傳輸,需要人工介入對數(shù)據(jù)類型的調整來進行算法管道構建。在未來的工作中,將進一步對算法組件間數(shù)據(jù)的規(guī)范化進行研究,并結合現(xiàn)有自動機器學習技術,如超參數(shù)搜索等,進一步構建效率更高的算法自組配系統(tǒng)。

        猜你喜歡
        排序結構模型
        一半模型
        排序不等式
        《形而上學》△卷的結構和位置
        哲學評論(2021年2期)2021-08-22 01:53:34
        重要模型『一線三等角』
        重尾非線性自回歸模型自加權M-估計的漸近分布
        恐怖排序
        論結構
        中華詩詞(2019年7期)2019-11-25 01:43:04
        節(jié)日排序
        刻舟求劍
        兒童繪本(2018年5期)2018-04-12 16:45:32
        論《日出》的結構
        国产成人一区二区三区视频免费蜜| 国产精品久久久久aaaa| 国产日韩精品中文字无码| 欧美色色视频| 激情视频国产在线观看| 久久国内精品自在自线| 成l人在线观看线路1| 国产欧美精品一区二区三区–老狼 | AⅤ无码精品视频| 亚洲精品在线97中文字幕| 日韩乱码人妻无码系列中文字幕| 久久久久久国产精品无码超碰动画 | 亚洲男人天堂| 国内精品91久久久久| 特级国产一区二区三区| 丰满少妇被粗大猛烈进人高清| 人成午夜免费大片| 国产亚洲精品性爱视频| 中国亚洲av第一精品| 蜜臀性色av免费| 亚洲一区中文字幕在线电影网 | 久久亚洲国产高清av一级 | 精品国产网红福利在线观看| 国产一区二区黑丝美女| 青青草大香蕉视频在线观看| 久久精品国产69国产精品亚洲 | 成人无码区免费a片www| 无遮高潮国产免费观看韩国| 久久一区二区三区老熟女| 中文字幕无码毛片免费看| 五月天欧美精品在线观看| 少妇一级内射精品免费| 日产乱码一二三区别免费l| 女同性黄网aaaaa片| 亚洲一区二区精品久久岳| 在线播放国产自拍av| 国产中文字幕乱人伦在线观看| 无码中文日韩Av| 色婷婷一区二区三区久久亚洲| 亚洲欧洲国产成人综合在线| 久久艹影院|