在傳統缺陷定位的研究工作中,很多研究人員把缺陷定位視為一個推薦問題,旨在推薦出哪一片代碼或者哪一行代碼更有可能出錯。典型的工作包含(但不限于):
基于頻譜的缺陷定位:SBFL — Spectrum-based Fault Localization 給定一組測試用例,有些用例通過有些用例失敗。根據某一代碼行是否更多地被通過(或失?。┑臏y試用例所覆蓋的基本想法,SBFL 可以給出每一行代碼的出錯概率。
給定一個代碼數據庫,其中每一片代碼都會被標注為包含或者不包含缺陷。該方法對代碼提取特征(如歷史上的修改次數,代碼行數,代碼特征,圈復雜度等等),然后用特征向量訓練一個分類器來計算每一片代碼的出錯概率。
Delta 調試:Delta-Debugging
給定一個錯誤版本和一個(過去的)正確版本, 以及一個測試用例在正確版本上通過但在錯誤版本上不通過,該方法計算這兩個版本之間的哪一個差異是導致錯誤版本出錯的原因。
# 我們的基于軌跡的調試工作#
然而,在程序員調試的時候,僅僅推薦出代碼在一個位置上 的出錯概率(比如 70%)很多時候幫助有限。首先,程序員們很難在沒有理解出錯的成因情況下完成自己的任務。其次,實際情況下,關于如何界定缺陷位置以及如何修改缺陷,不少時候見仁見智。所以相比于告訴程序員哪里出錯了,更重要的是告訴他為什么出錯。我們認為一個好的調試器,會同時擁有定位和解釋兩大功能。除了定位,好的調試器還應當來主動地幫助程序員在腦海中構建關于代碼的知識。
目前我們采取了軌跡驅動的做法,希望把代碼調試的問題轉化成一個在軌跡上查找第一個出錯步驟的搜索問題。我們希望能產生這個搜索結果(推薦結果)以及搜索過程(解釋)。
# 反饋驅動的調試方法
第一種通過程序員跟程序的交互收集程序員的調試行為來完成定位推薦。我們讓程序員在軌跡上做反饋,希望用盡可能少的反饋,推薦出最早的錯誤步驟,這個推薦的過程具有引導性和解釋性,在程序員定位到的那一刻,整個在軌跡上的交互過程能幫助理解和分析出錯誤的原因。
這是我們設計的工具截圖,軌跡在左邊以可視化的方式進行展開,程序員在右邊可以給出反饋。工具根據反饋做出推薦并學習反饋提高推薦效率。每次推薦也輔之以推薦原因。
Feedback as Specification 工作截圖
# 軌跡對比的調試方法
第二種方法是把程序的執(zhí)行認為是一種特殊的參照,來定位和解釋根因。
這個方法的應用場景是回歸錯誤(Regression Bug)[3]。對一個回歸錯誤,我們有一個錯誤的版本和(過去)正確的版本,以及一個無法通過的測試用例。我們對比兩個版本的執(zhí)行軌跡,來生成調試過程。
在下圖中,我們可以在工具中看到可視化的軌跡,左邊是錯誤的軌跡,然后右邊是正確執(zhí)行的軌跡。
我們自動匹配兩條軌跡,來得到兩個版本的執(zhí)行差異 (比如,相同時刻是否讀取和寫入了不同的變量,哪一步驟沒有被執(zhí)行等信息)。
我們使用軌跡匹配關系來支持程序員在工具中分析和理解缺陷。我們會高亮每個匹配的步驟所對應的源代碼。我們的工具可以推薦一個全自動化的調試過程;也可以輔助完成交互式調試過程,即,讓程序員交互式地分析和探索特定步驟來理解代碼(比如用戶在下方可以直接反饋這個步驟到底是否應該被執(zhí)行,是否讀取了一些錯誤的變量)。
Program Execution as Specification 工作截圖
利用軌跡匹配關系,工具可以完成雙邊切片,在兩邊軌跡上同時做切片,可以回答以下問題:
在過去的版本當中某個(正確)變量何時賦值?
現在這個版本當中某個(錯誤)變量何時賦值?
為何(在正確版本中)本該執(zhí)行的步驟在現有版本中沒有執(zhí)行?
為何(在正確版本中)不該執(zhí)行的步驟在現有版本中執(zhí)行?
Video demo 1(90 秒):https://github.com/llmhyy/tregression
Video demo2(20 秒):https://youtu.be/LoZOLyLGaxc
這個視頻展示了我們工具的調試過程模擬能力。根據軌跡對比,我們自動生成程序員在軌跡上的觀察和調試過程。
# 技術原理#
# Trace Alignment 的挑戰(zhàn)
這個工作中,我們假設存在一種完美的代碼匹配方式。在軌跡匹配上,我們需要解決一些挑戰(zhàn):
挑戰(zhàn) 1:效率問題
一條軌跡可以被視為一連串步驟,如果我們使用經典的字符串匹配算法,一條軌跡是長度是 m ,另外一條軌跡長度是 n ,那它的復雜度就是 O(mn)。一般的軌跡長度約為 100 萬步。一般的單機就難以支持實際匹配效率。
挑戰(zhàn) 2:匹配選擇
程序的執(zhí)行中會有很多循環(huán)迭代。每次迭代都會執(zhí)行完全相同的指令,我們如何匹配這些指令的執(zhí)行?
挑戰(zhàn) 3:版本變更
最后,兩個版本的代碼存在代碼修改導致的差異。這些修改可能會改變控制流。然而,代碼層面上控制流的變化有時候并不會影響匹配邏輯。比如說當一個 while 循環(huán)被修改為一個 if 條件判斷,第一次的循環(huán)執(zhí)行可以跟這個 if 條件判斷的執(zhí)行所配上,我們在算法上如何兼容這種情況?
# Trace Alignment 的性質
在這個工作中,我們提出軌跡匹配的復雜度是線性的,這意味著軌跡匹配其實可以比字符串匹配“便宜”的多。這得益于程序的結構信息可以幫助我們剪枝大量搜索空間,提高運行效率。這里,我們提出了三個軌跡匹配性質,來加速匹配過程。
這里,我們提出了三個軌跡匹配性質,來加速匹配過程。
迭代執(zhí)行的原子性
Iteration Boundary Preserving (IBP) Property
程序執(zhí)行的時候會產生很多迭代,而每一次循環(huán)執(zhí)行所產生的迭代具有匹配上的原子性。因此,我們可以根據循環(huán)把軌跡分段,迭代段中的步驟不能跨段匹配。
迭代執(zhí)行的匹配時序性
Iteration order preserving (IOP) property
一個循環(huán)可以產生很多迭代段,我們提出,段和段的匹配只能按照順序。具體原理參加我們論文的證明。
基于剛才的兩個性質,我們可以把兩條軌跡轉化成兩棵樹。樹里面每一個父節(jié)點表示一個迭代段,每個葉節(jié)點代表一個步驟。通過這個樹的形式,我們可以自頂向下進行匹配,顯然這個算法是線性的。
首次迭代匹配的寬松性 Firstiterationrelaxation (FIP) property
修改會改變控制流語義。這個性質中,我們定義什么樣的控制流修改并不會影響匹配語義。這里,我們調整了樹的構造方法來兼容這種情況。具體細節(jié)請參見我們的論文。
# 軌跡匹配的分類
當兩條軌跡的匹配關系被確定,那我們就可以分類出如下匹配關系:
執(zhí)行不變(Identical):如果錯誤軌跡上的一步可以跟正確軌跡上的一步配起來,并且它們擁有相同的讀寫變量,我們認為它是一個正確的步驟。
變量變化(Data-different):如果錯誤軌跡上的一步可以跟正確軌跡上的一步配起來,但是它們讀了不同的變量,那我們認為它的數據流產生了錯誤,此時就可以在雙邊做切片,去追溯這個正確和錯誤變量的來源。
執(zhí)行流變化(Control-different):如果錯誤軌跡上的一個步驟,它不涉及代碼修改,卻沒有辦法配到正確軌跡上的任何一步,那我們認為它的控制流出錯了,那此時通過控制流的切片以及其他一些方式的分析,去了解為什么這一步不應該發(fā)生。
代碼變化(Code different):執(zhí)行的代碼發(fā)生了變化。
由此,我們從軌跡上的最終報錯開始,不斷在兩條軌跡上做雙邊切片,生成調試過程,并作為解釋。
# 實驗和結果
在實驗中,我們收集了 24 個現實中的回歸錯誤。實驗結果表明我們的技術在查準和查全上具有優(yōu)勢。
更重要的是,相比于傳統切片,我們的解釋具有很好的簡潔性。
總結:我們通過生成這樣的調試方式,并輔助以交互式工具設計,讓程序員更好的去學習、理解和分析代碼。一旦他們能夠理解此中原理,如果定位和修復,是程序員自己見仁見智的決定。
# 從程序執(zhí)行到模型訓練#
程序執(zhí)行在傳統軟件當中其實是非常重要的手段,有時候我們稱之為 record & reply debugging。在下一個工作中,我們把同樣的思想運用在模型訓練上,來幫助數據科學家以及程序員們理解模型訓練過程。從人工智能的視角上,我們也拓展了基于過程的可解釋AI這一領域。
# 可解釋 AI 領域工作的梳理
目前的可解釋 AI 工作可以分類為以下兩類。
attribution problem
這類工作旨在分析一個樣本的哪些部分對最后的預測影響最大。典型的工作包含 integral gradient 和 gradcam。
influence function problem
這類工作旨在找到對某個預測結果影響最大的訓練樣本。
# From "What" to "How"
而我們希望了解模型(以及其預測能力)是通過多次迭代訓練產生的,比如我們在調試模型中希望能回答以下問題:
對于高維空間中的分類邊界和高維表示,他們是如何真正形成的?
哪些樣本相比于其他樣本,被模型學習較為困難的原因?
模型在訓練過程中是如何取舍學習樣本的?
......
# Deep Visual Insight (DVI) 工具
基于這些想法,我們提出了Time-travelling Visualization框架 ,支持深度神經網絡分類器的可視化。我們希望把在高維上發(fā)生的事情在低維上可視化呈現,以便讓人進一步的理解和分析。
以下圖為例,每一種顏色對應一種分類,每一塊區(qū)域對應高維空間上的一個分類區(qū)域,每一個點對應一個樣本,點的顏色代表這個樣本的標簽,這個點的所在區(qū)域就代表模型把這個點預測成了類。比如,一個紅色的點且在一個紅色區(qū)域里,可以代表一張圖片狗被預測成了狗這一個分類;而一個棕色點在一個紅色區(qū)域里面,可能是一架飛機被預測成了一個狗。
給定一個模型,我們把它的高維分類邊界可視化在畫布上。這樣我們就能知道,每個樣本離分類邊界有多遠,樣本與樣本之間有多近,等信息。
更進一步,我們可以記錄模型訓練過程中的各種“快照”。每個快照可以得到一副畫布,通過組合畫布,我們就能得到訓練過程的一個動畫。
在這個動畫上人們可以從概念上去理解,在整個高維空間上分類邊界是怎么樣被重塑和改變的。而它的點可以認為是在高維的 embedding,它是怎么被學到的,點和點之間的鄰居關系是怎么形成的?
# 示例說明
這里,我以模型的對抗訓練為例來說明這個工具所能提供的幫助。給定一個模型,我們對這個模型產生對抗樣本。為了增強模型的魯棒性,我們可以把這些對抗樣本喂到模型里重新訓練。
我們可以看到在原來測試集上這個模型表現良好,測試準確率能達到 92%;但是對生成的對抗樣本來說,它的預測準確率只有 50%。
Accuracy | |
---|---|
Adversarial Samples | 51.3% |
Testing Samples | 92.3% |
在得到對抗樣本之后,在對抗訓練之前,我們可以看到下圖所示的可視化效果。這個紅色的點是一個測試樣本,它被模型正確預測。我們可以看到紅色點落在紅色的區(qū)域里,同時有 10 個相鄰的對抗樣本為棕色,表示它們都預測錯了。
在做第一輪對抗訓練的時候,我們在下圖上發(fā)現這個紅色點被挪走了。這是因為模型為了預測他周圍的一些對抗樣本鄰居,需要把它們挪到其他區(qū)域。通俗而言,紅色的點被“帶跑”了。
我們看指標,發(fā)現對抗樣本的準確率確實提高了,但測試樣本的準確率反而下降了。這個現象在后續(xù)訓練中會不斷變得明顯。
最后我們會發(fā)現就是不止這幾個點,有很多的對抗樣本點都被拉回了自己的區(qū)域,但它們被拉回自己區(qū)域的時候,他們附近的訓練樣本,也跟著被“帶跑”了。
Accuracy | |
---|---|
Adversarial Samples | 67.8%(提升16.5%) |
Testing Samples | 90.3%(降低 2.0%) |
通過這個現象,我們可以得到一些思考。
比如說要使用對抗樣本或者對抗學習這樣的技術,現有模型的表示能力是不是太弱了?模型在權衡不同樣本時,會做什么樣的取舍?或者說我們?yōu)榱唆敯粜?,應該要犧牲多大的正確性?
可視化本身也許無法回答這些問題,但是可視化的意義在于把這個現象展示出來,引發(fā)人們更多的思考。
然后另外一個現象是,當我們把整個可視化的過程記錄下來之后,我們會發(fā)現臟數據的移動和正常數據移動其實也很不一樣。對于正常數據即橘黃色的點來說,他在第一和第二個 epoch 中就已經學得差不多了。而對于那些黑色的點即臟數據的點,一般都非?!邦B固”,最后是被模型強行拉回 Label 所指定的區(qū)域。所以這些現象也可以輔助我們去分析。
#DVI Tool: A Tensorboard Plugin#
我們基于 Tensorboard 框架完成了我們的工具。我們的工具還包含了如何幫助用戶理解、查詢、分析、高亮一些點,比如可以讓用戶看一些具體的圖片,具體的例子等。
# 可視化模型技術實現
## 假設
我們假設,一個分類模型需要有兩部分組成。一部分是表征學習,即,一個樣本會被轉化成一個表征;一部分是表征擬合,即,學習的表征學習被進一步擬合到一個特定的分類。
對于圖像識別來說,前端的表征學習可以是卷積層,然后卷完之后會輸出一個 gap 向量被進一步預測分類。對于自然語言處理來說,那前端有可能是用 transformer,然后后面接個 fitter,去預測分類。
## 概述
我們的可視化模型分兩部分。
第一個部分是降維的過程,給一個高維的表征,我們希望把它從高維降到低維,由此我們可以確定每個樣本在畫布上的位置。
第二個部分是升維的過程,這個升維過程是希望把任意一個坐標返回到高維,如果都能往高維投射的話,任意一個點就會投射成一個表征,這個表征就可以喂給 fitter 去做一次預測。有了這樣的過程之后,就可以對畫布上的每個像素點進行染色。
## 空間 & 時間性質
這兩步實現之后,我們就能完成從高到低進行降維,從低到高維去畫背景。從高維到低維,一定會有信息丟失;從低維到高維,也需要有信息增強。由此,我們定義了時間上和空間上的性質,讓模型學習的時候能夠知道哪些信息需要優(yōu)先保留和增強。
Neighbor Preserving:高維的鄰居在低維也必須是鄰居,即鄰居保持屬性。
Boundary Distance Preserving:在高維上距離比較近的邊界上的鄰居,也能夠在低維上被保持。
Inverse Projection Preserving:一個點從高維到低維,再從低維重新增強到高維的過程中,要使信息丟失率最小。
Temporal Continuity:由于歷史上的模型訓練快照會被記錄,要使相鄰兩個快照的可視化結果是相近的(該性質考慮進去之后,用戶看起來就會更加的方便)。
在實踐層面上,我們用一個 auto-encoder 來實現升維和降維能力。auto-encoder 的編碼的部分就是降維的過程,而它的解碼的部分就是升維的過程,我們會為每一個 classifier 學習一個 auto-encoder。在訓練 auto-encoder 時,我們把以上的性質轉化為訓練的損失函數。
# 實驗和結果
這里是我們實驗的結果,在剛才所述的 4 個屬性上,整體效果比較好。相比于以往的降維技術,我們在效率和準確率上有較大的提升。同時,也是第一款生成動畫的技術。
# 總結#
在這個報告中,我簡述了我們基于軌跡的代碼調試和模型調試技術?;镜乃枷攵际怯涗洺绦驁?zhí)行或者模型訓練的軌跡,在軌跡收集之上我們做了更多的分析來支持程序員和數據科學家來觀察、理解和分析目標程序和模型。
對于程序分析技術,我們希望把兩個軌跡對比起來,這樣我們可以在某種程度上生成調試的過程,生成定位的解釋,這樣可以更加有效的輔助程序員學習這個代碼,并且?guī)椭ㄎ?。通俗而言:錯誤定位可能是程序員見仁見智的決定,但是是否能幫助程序員更好地理解代碼應該是未來代碼調試器要做更重要的事。
對于可視化分析,我們希望把高維上發(fā)生的事件,以直觀的方式展現在數據科學家和程序員之前。由此,幫助他們進一步觀察和分析各種訓練時的現象。
審核編輯:劉清
-
調試器
+關注
關注
1文章
313瀏覽量
24328 -
機器學習
+關注
關注
66文章
8503瀏覽量
134631
原文標題:基于軌跡的調試技術:從傳統軟件到 AI 模型開發(fā)
文章出處:【微信號:編程語言Lab,微信公眾號:編程語言Lab】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
Nordic收購 Neuton.AI 關于產品技術的分析
AI正面吊集裝箱識別系統如何革新港口自動化管理?
普源MSO8000系列示波器多總線調試的自動化方案

18650動力電池組PACK生產線:半自動化生產的卓越之選
首創(chuàng)開源架構,天璣AI開發(fā)套件讓端側AI模型接入得心應手
自動化標注技術推動AI數據訓練革新
工業(yè)射頻RFID讀寫器對半自動化制造生產的應用案例
HFSS 自動化建模工具
AI自動化生產:深度學習在質量控制中的應用

AI編程在工業(yè)自動化設備上應用趨勢
語言模型自動化的優(yōu)點
自動化AI開發(fā)平臺功能介紹
AI大模型在智能座艙軟件測試中的應用與思考

評論