一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

介紹基于不確定的語法條件生成類似Java的強(qiáng)類型程序

zhKF_jqr_AI ? 2018-02-08 18:11 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

已經(jīng)有不少使用神經(jīng)網(wǎng)絡(luò)生成程序的研究,但目前的工作基本上都基于嚴(yán)格的語義(semantic)限制。Rice大學(xué)的研究人員Vijayaraghavan Murali等將在ICLR 2018上做口頭報告,介紹他們的新研究,基于不確定的語法(syntactic)條件生成類似Java的強(qiáng)類型程序。

AML

對于程序生成而言,Java還是有些復(fù)雜。因此研究人員對Java做了一些簡化,設(shè)計了一門新的語言AML。AML刻畫了Java類語言的API使用的精髓。

AML使用有限的API數(shù)據(jù)類型的集合,類型同樣是由API方法名稱(包括constructor)指定的有限集合。方法a的類型簽名用(τ1, ..., τk) -> τ0表示。

介紹基于不確定的語法條件生成類似Java的強(qiáng)類型程序

AML語法

其中,c表示變量,x、x1……表示變量,let用于變量綁定。

訓(xùn)練數(shù)據(jù)

訓(xùn)練數(shù)據(jù)為標(biāo)注過的程序:

{(X1, Prog1), (X2, Prog2), ...

其中,Prog1、Prog2……為AML程序。X1、X2為標(biāo)簽。訓(xùn)練之后,模型將根據(jù)標(biāo)簽生成程序,因此標(biāo)簽應(yīng)當(dāng)包含關(guān)于代碼的信息。

具體是哪些信息呢?

首先,AML主要是基于API調(diào)用設(shè)計的語言,因此API調(diào)用是重要的信息。

其次,AML脫胎于Java這一靜態(tài)類型語言,因此類型也是重要的信息。

理論上,給定關(guān)鍵的API調(diào)用和類型,就可以生成程序。但實際上模型還沒有這么智能,有時還需要一些額外的信息,一些關(guān)鍵詞。

因此,標(biāo)簽共分3類:

X調(diào)用

X類型

X關(guān)鍵詞

其中,關(guān)鍵詞主要是根據(jù)類型和調(diào)用方法的命名CamelCase切分所得。例如,readLine會被切分為2個關(guān)鍵詞read和line。

草圖

如前一節(jié)所述,訓(xùn)練數(shù)據(jù)為標(biāo)簽(X)和AML程序(Prog)。然而,研究人員并沒有直接學(xué)習(xí)標(biāo)簽和程序間的關(guān)系。因為,程序包含一些低層的信息,這些信息其實無關(guān)緊要,并不需要學(xué)習(xí)。比如,具體的變量命名,替換一下,并不會影響程序的語義(λ演算中的α-等價)。因此,需要將程序再轉(zhuǎn)換一下,轉(zhuǎn)換成某種刻畫程序的高層結(jié)構(gòu)和形狀(控制結(jié)構(gòu)、API調(diào)用順序、參數(shù)類型、返回值類型)的表示?;谶@一思路,研究人員將程序中的一些低層信息(變量命名、基本操作)抽象掉,從而將程序轉(zhuǎn)化為草圖(Sketch),并基于標(biāo)簽學(xué)習(xí)草圖上的概率分布。之后,再使用組合方法將草圖具體化為類型安全的AML程序(通過類型引導(dǎo)的隨機(jī)搜索過程)。

介紹基于不確定的語法條件生成類似Java的強(qiáng)類型程序

Prog、X、Y的貝葉斯網(wǎng)絡(luò)

其中,Yi= α(Progi),Y(草圖)的語法如下:

介紹基于不確定的語法條件生成類似Java的強(qiáng)類型程序

可以看到,草圖的語法和AML的語法類似,抽象掉了其中的變量名稱(x、x1等),保留了控制結(jié)構(gòu)、類型信息和API調(diào)用。

對比草圖的語法和AML的語法,α函數(shù)(從程序中抽象出草圖的操作)的定義也就不言自明了:

介紹基于不確定的語法條件生成類似Java的強(qiáng)類型程序

GED

如前所述,模型將基于草圖進(jìn)行學(xué)習(xí):

介紹基于不確定的語法條件生成類似Java的強(qiáng)類型程序

上式表明,最終我們需要計算:

介紹基于不確定的語法條件生成類似Java的強(qiáng)類型程序

為了計算上式,研究人員提出了高斯編碼-解碼器(Gaussian Encoder-Decoder)(簡稱GED)模型,引入了一個潛向量Z,以隨機(jī)連接標(biāo)簽和草圖:

介紹基于不確定的語法條件生成類似Java的強(qiáng)類型程序

下面我們以編碼X調(diào)用為例,說明編碼器具體是如何工作的。

首先,將X調(diào)用的每個元素X調(diào)用,i轉(zhuǎn)換成one-hot向量表示,記為X'調(diào)用,i。然后,通過下式編碼X'調(diào)用,i

介紹基于不確定的語法條件生成類似Java的強(qiáng)類型程序

XCalls,i即X調(diào)用,i

其中,h為神經(jīng)隱藏單元的數(shù)量,Wh∈ R|調(diào)用| x h、bh∈ Rh、Wd∈ Rh x d、bd∈ Rd為網(wǎng)絡(luò)的權(quán)重和偏置,可通過訓(xùn)練學(xué)習(xí)。

基于f,可以計算P(X | Z,θ)

介紹基于不確定的語法條件生成類似Java的強(qiáng)類型程序

也就是說,X編碼后的值從以Z為中心的高維正態(tài)分布取樣。

P(X | Z,θ)的計算需要編碼,P(Y | Z,θ)的計算與之相反,需要解碼。

草圖Y可以看成一個樹形結(jié)構(gòu)。

介紹基于不確定的語法條件生成類似Java的強(qiáng)類型程序

研究人員采用了自頂向下的搜索方法,從樹形的頂端,一路往下,遞歸地計算輸出分布yi?!耙宦吠隆钡摹奥贰保芯咳藛T稱為生產(chǎn)路徑(production path)。生產(chǎn)路徑定義為有序?qū)Φ男蛄?(v1, e1), (v2, e2), ..., (vk, ek)>,其中,vi為草圖中的節(jié)點(即語法中的項),ei為連接vi與vi+1的邊的類型。具體而言,邊包括兩種類型:sibling(兄弟姊妹,上圖中的實線)和child(子女,上圖中的虛線)。

比如,上圖中有4條生產(chǎn)路徑:

(try,c), (FR.new(String),s), (BR.new(FR),s), (while,c), (BR.readLine(),c), (skip,·)

(try,c), (FR.new(String),s), (BR.new(FR),s), (while,s), (BR.close(),·)

(try,s), (catch,c), (FNFException,c), (T.printStackTrace(),·)

(try,s), (catch,s), (catch,c), (IOException,c), (T.printStackTrace(),·)

其中,·表示路徑的終結(jié)。另外,為了簡明,以上路徑均省略了(root,c),用s和c表示sibling和child,并縮寫了部分類名。

給定Z和某條生產(chǎn)路徑上的序列Yi= <(v1,e1), ..., (vi,ei)>,為了簡化計算,假定路徑中的下一個節(jié)點僅僅取決于Z和Yi,從而解碼器只需使用單個推理步驟即可計算概率P(vi+1| Yi,Z)。具體而言,解碼器使用了兩個循環(huán)神經(jīng)網(wǎng)絡(luò),一個用于c邊,一個用于s邊。

介紹基于不確定的語法條件生成類似Java的強(qiáng)類型程序

其中,v'i為vi轉(zhuǎn)換成的one-hot向量。h為解碼器的隱藏單元數(shù)目,|G|為解碼器的輸出詞匯。Whe、bhe為解碼器的隱藏狀態(tài)權(quán)重和偏置矩陣,Wve、bve為輸入權(quán)重和偏置矩陣,Wye、bye為輸出權(quán)重和偏置矩陣(e為邊的類型)。Wl和bl是“提升”權(quán)重和偏置,將d維向量Z提升到解碼器的高維隱藏空間h。

可視化

研究人員可視化了32維潛向量空間的聚類。研究人員從測試數(shù)據(jù)中得到標(biāo)簽X,然后從P(Z | X)取樣潛向量Z,進(jìn)而從P(Y | Z)取樣草圖Y。接著使用t-SNE降維Z到2維,然后基于Y中的API使用標(biāo)注每個點。下圖顯示了這一2維空間,每個標(biāo)簽對應(yīng)不同的顏色。

介紹基于不確定的語法條件生成類似Java的強(qiáng)類型程序

從上圖我們可以很明顯地看到,模型很好地根據(jù)API的不同學(xué)習(xí)了潛空間的聚類。

定量測試

研究人員基于1500個Android應(yīng)用(收集自網(wǎng)絡(luò)),進(jìn)行了測試。研究人員使用JADX反編譯這1500個Android應(yīng)用安裝文件(APK)到1億行源代碼,并從中提取出了15萬Java方法。隨后,研究人員將這15萬Java方法轉(zhuǎn)換成了AML程序。然后,從AML程序中提取出草圖Y和X調(diào)用、X類型、X關(guān)鍵詞,供模型訓(xùn)練。其中,分別隨機(jī)選擇了1萬個AML程序,作為驗證集和測試集。

理論上來說,驗證生成程序的正確性需要驗證程序的所有輸入對應(yīng)的輸出符合預(yù)期。然而,這是一個不可判定問題。因此,研究人員轉(zhuǎn)而使用一些間接的標(biāo)準(zhǔn)進(jìn)行衡量。

期望AST

介紹基于不確定的語法條件生成類似Java的強(qiáng)類型程序

API調(diào)用順序的相似程度(具體而言,研究人員使用了平均最小Jaccard距離)

介紹基于不確定的語法條件生成類似Java的強(qiáng)類型程序

API調(diào)用方法的相似程度(同樣基于平均最小Jaccard距離)

介紹基于不確定的語法條件生成類似Java的強(qiáng)類型程序

語句數(shù)目

介紹基于不確定的語法條件生成類似Java的強(qiáng)類型程序

控制結(jié)構(gòu)數(shù)目(例如,分支、循環(huán)、try-catch)數(shù)

介紹基于不確定的語法條件生成類似Java的強(qiáng)類型程序

上面5張表格中,“Input Label Observability”(輸入標(biāo)簽可觀察性)表示測試數(shù)據(jù)提供的輸入標(biāo)簽(API調(diào)用、類型、關(guān)鍵詞)的信息比例。研究人員試驗了75%、50%、25%的可觀察性,相應(yīng)的中位數(shù)分別為9、6、2。這樣,研究人員可以評估給定少量關(guān)于代碼的信息時,模型的預(yù)測能力。

下表顯示了在50%可觀察性下,模型在未見數(shù)據(jù)上的表現(xiàn)。

介紹基于不確定的語法條件生成類似Java的強(qiáng)類型程序

以上6個表格中,“Model”(模型)一列中,GED為研究人員所用的模型,GSNN(高斯隨機(jī)神經(jīng)網(wǎng)絡(luò))為當(dāng)前最先進(jìn)的條件生成式模型(Sohn等在2015年提出)。為了驗證草圖學(xué)習(xí)的有效性,研究人員進(jìn)行了消融測試。帶-Sk后綴的為基于草圖學(xué)習(xí)的模型,帶-AML后綴的為直接基于程序進(jìn)行學(xué)習(xí)的模型。

測試結(jié)果表明,研究人員提出的模型GED-Sk表現(xiàn)最優(yōu),超過了當(dāng)前的最先進(jìn)模型GSNN。另外,GSNN-Sk的表現(xiàn)也不錯,而直接基于程序進(jìn)行學(xué)習(xí)的模型表現(xiàn)很糟糕。這說明草圖學(xué)習(xí)是條件程序生成的關(guān)鍵。

定性測試

除了定量測試之外,研究人員也進(jìn)行了定性測試。

文件讀寫

研究人員希望Bayou能生成一個寫入文件的程序。想想看,如果你希望指示Bayou生成寫入文件的程序,你會給出怎么樣的提示呢?最低限度的提示,應(yīng)該是兩個關(guān)鍵詞,write、file,或者,甚至僅僅是一個類型FileWriter。Bayou還沒有這么智能,但它的表現(xiàn)已經(jīng)相當(dāng)搶眼了。研究人員給Bayou的輸入僅僅是一個類型和一個關(guān)鍵詞,幾乎就是最低限度的信息了:

X類型= {FileWriter}

X調(diào)用= {write}

X關(guān)鍵詞= {}

Bayou生成了如下的程序(選取自top-5):

BufferedWriter bw;

FileWriter fw;

try {

fw = newFileWriter($String, $boolean);

bw = newBufferedWriter(fw);

bw.write($String);

bw.newLine();

bw.flush();

bw.close();

} catch (IOException _e) {

}

注意,盡管輸入只提供了FileWriter類型,程序使用了BufferedWriter,因為在Java中,文件讀寫經(jīng)?;赽uffer。Bayou自行學(xué)習(xí)到了這一點。另外,Bayou也正確地在關(guān)閉文件前清空了buffer。

Android對話框

研究人員希望生成一個程序,設(shè)定Android對話框的標(biāo)題和信息。這次研究人員給定的輸入已經(jīng)到了最低限度:

X類型= {}

X調(diào)用= {}

X關(guān)鍵詞= {android, dialog, set, title, message}

生成的程序如下:

Builder builder2;

Builder builder1;

AlertDialog alertDialog;

Builder builder4;

Builder builder3;

builder1 = newBuilder($Context);

builder2 = builder1.setTitle($String);

builder3 = builder2.setMessage($String);

builder4 = builder3.setNeutralButton($String,

$OnClickListener);

alertDialog = builder4.show();

雖然輸入信息中沒有指定,Bayou很智能地使用了幫助類AlertDialog.Builder。另外,Bayou還額外給對話框加上了一個按鈕,這是因為Bayou學(xué)習(xí)到Android對話框經(jīng)常配備一個按鈕(通常用于關(guān)閉對話框)。

預(yù)覽拍攝

最后一個例子是生成預(yù)覽拍攝效果的程序。這次給定的輸入可以說是極簡了:

X類型= {}

X調(diào)用= {startPreview}

X關(guān)鍵詞= {}

Bayou生成的程序:

Parameters parameters;

parameters = $Camera.getParameters();

parameters.setPreviewSize($int, $int);

parameters.setRecordingHint($boolean);

$Camera.setParameters(parameters);

$Camera.startPreview();

這個例子充分體現(xiàn)了Bayou的智能之處。首先,Bayou自動識別出startPreview屬于camera API。其次,Bayou在開始預(yù)覽前,首先獲取了相機(jī)參數(shù),然后設(shè)定了預(yù)覽顯示尺寸。這正是Android camera API文檔的推薦做法!

實現(xiàn)細(xì)節(jié)

研究人員將整個系統(tǒng)命名為Bayou,該系統(tǒng)由兩部分組成,基于TensorFlow構(gòu)建的GED,以及基于Eclipse IDE構(gòu)建的草圖抽象和組合具體化。

研究人員基于網(wǎng)格搜索進(jìn)行交叉驗證,選擇表現(xiàn)最優(yōu)的模型。

超參數(shù)設(shè)定如下:

編碼器:調(diào)用64單元、類型32單元、關(guān)鍵詞64單元。

解碼器:128單元。

32維潛向量空間。

mini-batch尺寸:50。

Adam優(yōu)化,學(xué)習(xí)率0.0006。

epoch:50。

整個模型的訓(xùn)練大約需要10小時(AWS p2.xlarge、K80、12G Ram)

結(jié)語

這是首個使用神經(jīng)網(wǎng)絡(luò)基于不確定的條件生成程序的研究。未來的IDE可能基于類似的模型提供極為智能的代碼補(bǔ)全。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 神經(jīng)網(wǎng)絡(luò)

    關(guān)注

    42

    文章

    4814

    瀏覽量

    103709
  • JAVA
    +關(guān)注

    關(guān)注

    20

    文章

    2989

    瀏覽量

    109949

原文標(biāo)題:萊斯大學(xué)新研究:神經(jīng)草圖學(xué)習(xí),根據(jù)條件生成程序

文章出處:【微信號:jqr_AI,微信公眾號:論智】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    Java入門基礎(chǔ)知識了解

    速度非常的快,但是可執(zhí)行代碼已經(jīng)變成了一個整體,不可能再分開  1-2.Java對原程序文件的命名規(guī)則有什么要求?源程序文件編譯后生成什么文件?  回答:要求:源
    發(fā)表于 05-09 16:33

    N4373C:了解測量不確定度的規(guī)范和程序

    的? - 為了檢查這些規(guī)格,測量或計算這三種不確定性以及頻率響應(yīng)可重復(fù)性的程序是什么?測量條件是詳細(xì)的,但沒有測量器或測量的程序。 - 這種不確定
    發(fā)表于 12-06 16:05

    Java語言的特性介紹

      Java語言的語法簡單明了,容易掌握,而且是純面向?qū)ο蟮恼Z言。Java語言的簡單性主要體現(xiàn)在以下幾個方面:  語法規(guī)則和C++類似。從某
    發(fā)表于 01-20 14:44

    Java的基本數(shù)據(jù)類型條件結(jié)構(gòu)

    Java基礎(chǔ)入門》第二篇1 基本數(shù)據(jù)類型,運(yùn)算符與表達(dá)式,條件結(jié)構(gòu),循環(huán)結(jié)構(gòu)...
    發(fā)表于 12-23 08:02

    量測不確定條件下離散時間濾波系統(tǒng)的Cramer- Rao下限

    量測不確定條件下離散時間濾波系統(tǒng)的Cramer- Rao下限研究
    發(fā)表于 03-29 14:42 ?11次下載

    Java語言程序設(shè)計,下載

    Java語言程序設(shè)計 1. 了解Java語言的特點、用途、語法程序結(jié)構(gòu); 2. 了解Java
    發(fā)表于 04-28 16:35 ?0次下載

    測量誤差和測量不確定

    人們在使用誤差理論的過程中,又發(fā)展出了不確定度概念,如何正確使用這兩個概念,是基層計量人員需要解決的問題。測量誤差由于真值的不確定,所得誤差包含不確定因素。
    發(fā)表于 09-03 15:51 ?14次下載

    Java 基本語法練習(xí)

    實驗   Java 基本語法練習(xí) 一、實驗?zāi)康?      1. 了解 Java 的數(shù)據(jù)類型   2.
    發(fā)表于 09-23 18:56 ?3932次閱讀

    java生成json格式數(shù)據(jù) 和 java遍歷json格式數(shù)據(jù)

    本文檔內(nèi)容介紹了基于java生成json格式數(shù)據(jù) 和 java遍歷json格式數(shù)據(jù),供參考
    發(fā)表于 03-19 15:04 ?0次下載

    淺談Java編程學(xué)習(xí) Java基礎(chǔ)語法注意項

    每當(dāng)說到IT行業(yè)時,很多朋友們會想到java,隨著時代的發(fā)展,人們學(xué)習(xí)java的熱度依然只增不減,但關(guān)于java,有人會問基礎(chǔ)語法是怎樣的,該如何學(xué)習(xí)?
    發(fā)表于 05-30 16:34 ?1191次閱讀

    JAVA教程之JSP基礎(chǔ)語法的詳細(xì)資料說明

    本文檔的詳細(xì)介紹的是JAVA教程之JSP基礎(chǔ)語法的詳細(xì)資料說明主要內(nèi)容包括了:、掌握J(rèn)SP中注釋語句的使用;、掌握J(rèn)SP中Script的使用及使用的區(qū)別;、掌握page指令的作用;、掌握兩種包含語句及兩種包含語句的區(qū)別;、掌握跳
    發(fā)表于 02-22 10:27 ?5次下載
    <b class='flag-5'>JAVA</b>教程之JSP基礎(chǔ)<b class='flag-5'>語法</b>的詳細(xì)資料說明

    面向?qū)ο?b class='flag-5'>程序設(shè)計 - 課內(nèi)實驗1(Java語言概述)

    了解 Java的數(shù)據(jù)類型 掌握各種變量的聲明方式。 理解運(yùn)算符的優(yōu)先級。 掌握 Java基本數(shù)據(jù)類型、運(yùn)算符與表達(dá)式、數(shù)組的使用方法。 理解
    發(fā)表于 11-17 14:22 ?1次下載
    面向?qū)ο?b class='flag-5'>程序</b>設(shè)計 - 課內(nèi)實驗1(<b class='flag-5'>Java</b>語言概述)

    Java基本語法

    Java基本語法
    的頭像 發(fā)表于 01-12 15:23 ?1632次閱讀

    Java的基礎(chǔ)語法

    上一次我們學(xué)習(xí)了怎么安裝JDK和開發(fā)工具IDEA,同時也給大家寫了一個hello world的演示代碼。今天我們給大家從 hello world 展開講講Java的基礎(chǔ)語法。 話不多說,直接
    的頭像 發(fā)表于 10-10 16:21 ?737次閱讀
    <b class='flag-5'>Java</b>的基礎(chǔ)<b class='flag-5'>語法</b>

    JAVA程序開頭import怎么弄

    Java是一種面向?qū)ο蟮木幊陶Z言,它具有豐富的類庫和強(qiáng)大的跨平臺性能。在編寫Java程序時,我們常會使用import語句來引入外部的類或者類庫,以便我們可以在程序中使用它們。這篇文章將
    的頭像 發(fā)表于 11-22 15:02 ?1518次閱讀