文章閱讀總結:OpenAI-Codex
文章閱讀總結:OpenAI-Codex
文章目錄
- 1. Abstract 關鍵點
- 2. 代碼評估框架及其中的重點
- 3. 微調訓練
- 4. 有監督微調
- 5. 限制
https://openai.com/blog/openai-codex/ :Codex工作是一個標準的應用型文章,將訓練好的GPT3應用于一個實際的工作之中,在網絡結構上基本沒有創新,主要工作難點在于收集數據、微調模型,但是其關注的問題非常大,涉及到代碼書寫這個敏感問題。
1. Abstract 關鍵點
- CodeX是基于GPT語言模型進行微調得到的一個專門用于代碼生成/文檔生成的模型
- 為了測試模型的精度,OpenAI制作了一個評估數據集
HumanEval
- 使用原始的GPT-3進行寫代碼,其精度基本上為0%,進行
微調
之后精度可以達到28.8% - 進行100次隨機代碼生成,至少有一個代碼是正確的概率達到了70.2%

100次隨機代碼生成至少又一個是正確額的概率對我們實際工作意義不大,所以我們更多地關注紅色線條表示的一個對數平均排序得到的準確率。這里說明了隨著模型參數的增加,代碼生成的精度增加,而且有一定的線性趨勢。
2. 代碼評估框架及其中的重點

-
對于傳統的語言模型問題,我們可以使用BLUE score來進行模糊匹配評估,只要預測結果和真實結果的子序列的相似度夠高,我們的BLUE socre就非常大;但是對于代碼而言子序列相似度高不代表代碼可以運行,所以這里提出了一種新的評估方法
pass@k
- 其原理很簡單,對于每個任務隨機生成n種結果,其中有c種結果是正確的(即可以通過單元測試),從中隨機抽取k種結果,如果一個正確結果都沒有用(kn?c)(_k^{n-c} )(kn?c?)表示,其概率用(kn?c)(kn)\frac{(_k^{n-c} )}{(_k^n)}(kn?)(kn?c?)?表示,我們需要至少有一個正確結果的概率,即用1減去即可。
- 為了數值的穩定(計算的時候是累乘,容易超過數值精度位數),所以可以用簡單的形式表示,即1?(1?p^)k1 - (1-\hat{p})^k1?(1?p^?)k,上圖右側是使用python的簡單實現!
-
由于使用Github的代碼進行訓練,不可避免地會有很多的代碼容易出現數據泄漏,所以這里測試使用人工手動書寫的代碼數據集
HumanEval
-
直接測試各種代碼存在很多的風險(例如數據泄漏、不可中斷循環、攻擊行為等),所以對代碼的正確性進行測試的時候在
沙盒環境
種進行
3. 微調訓練
- 首先,CodeX直接使用GPT3預訓練模型進行測試發現基本沒有效果
- 使用GPT3預訓練模型,然后加上微調發現預訓練對精度的提高沒有明顯的效果,但是會加快模型收斂
- 由于代碼(特比是python)中使用了大量的不同長度的空格和換行等特殊字符,所以需要進行特別的處理(加入訓練),這樣可以大大減小模型第一和最后一一層的參數量
- 結果展示

- 圖4展示了隨著參數量的增加,測試誤差下降(但是誤差線性下降,參數量指數增加)
- 圖5展示的是由于
Pass@k
指標種有一個超參數k,這個k和我們的溫度參數有關(比如k=1的時候我們希望選擇概率最大的值,但是隨著k越多了,我們希望也可以選擇一些概率大但并非最大的值)

- 圖7展示了不同刻度的精確度,我們仍然最關心的是紅色曲線表示的對數平均精度,藍色線條表示的是k次采樣,有一次正確就正確的概率。紅藍兩條線有一定的線性趨勢,而其他幾條線表示的沒有明顯的變化。
- 圖8說明了使用BLEU socre進行評判,正確和錯誤的內容基本無法取分,也就是不能作為評判精度的指標!
4. 有監督微調
??這里的監督是相對于前面的微調(傳統的GPT3微調,給很多沒有標簽的數據進行專門化訓練),OpenAI團隊從競賽級別的代碼中收集了40000個代碼數據進行專門的監督微調(即這里的代碼是有標準答案的)

- 可以看到,實線表示的監督訓練的精度變化曲線比沒有監督訓練的結果高了很多,效果非常明顯
- 圖10的橙色線表示的平均對數精度變化也非常明顯!
5. 限制
- 樣本數量太少(訓練和測試的樣本都太少了)
- 對于一個人而言,不同的注釋只要描述的是同一個事情其書寫的代碼是相同的,但是對于網絡而言只要注釋變化其代碼就發生了變化,其沒有理解到注釋的核心內容
- 注釋的長度越長,給出的代碼的精度越低,網絡對于長注釋/描述的效果不是很好

- 網絡對數學語言描述這種比較精確的描述不能充分理解
