現(xiàn)在的大型語言模型,能力個(gè)個(gè)都挺強(qiáng)。但,它們的計(jì)算能力都不太行:比如 GPT-3,沒法做超過三位數(shù)的加法。再比如它們當(dāng)中的大多數(shù)都可以寫代碼,但是理解代碼卻很費(fèi)勁 —— 稍微遇到點(diǎn)帶循環(huán)的程序就“GG”。
不過,來自 MIT 和谷歌的研究人員發(fā)現(xiàn):不用修改模型的底層架構(gòu),只需訓(xùn)練它們學(xué)會像程序員 debug 時(shí)那樣“打斷點(diǎn)”,讀代碼的能力就唰唰唰地漲上去了。
將同樣的思路用于大數(shù)加法、多項(xiàng)式計(jì)算,那就更不在話下了。所以,語言模型的數(shù)學(xué)能力終于也要跟上了?!
教語言模型用“打斷點(diǎn)”的方法做加法、讀程序
前面說的“打斷點(diǎn)”,其實(shí)指的是在計(jì)算步驟較多的程序中,讓模型把每一步都編碼為文本,并將它們記錄到一個(gè)稱為“便簽”的暫存器中,或者叫“草稿紙”。
聽起來是個(gè)“笨”方法,但正是這樣才使得模型的計(jì)算過程變得清晰有條理,性能也就比以往直接計(jì)算的方式提升了很多。
具體操作也很簡單。就比如在簡單的加法計(jì)算中,計(jì)算“29+57”的方式就是像這樣的:
其中 C 表示進(jìn)位,#表注釋。先計(jì)算 9+7,進(jìn)位 1;再計(jì)算 2+5 + 進(jìn)位 1,最后得出 86。
從上可以看出,這個(gè)訓(xùn)練示例由“輸入”和“目標(biāo)”組成。訓(xùn)練時(shí)將兩者都喂給模型;測試時(shí),模型就能根據(jù)“輸入”預(yù)測出正確的“目標(biāo)”。
而“目標(biāo)”就是要發(fā)送到臨時(shí)暫存器上的內(nèi)容,通過關(guān)注其上下文就可以引用;實(shí)際操作中,還可以對“草稿”內(nèi)容進(jìn)行檢查糾錯。
顯著提高語言模型的計(jì)算能力
研究人員選用了僅含解碼器結(jié)構(gòu)的 Transformer 語言模型來實(shí)驗(yàn),其參數(shù)規(guī)模介于 200 萬到 1370 億之間。原則上,任何序列模型都可以使用這個(gè)方法,包括編-解碼器模型或循環(huán)網(wǎng)絡(luò)等。
首先,他們按這種“打斷點(diǎn)”的方式訓(xùn)練語言模型進(jìn)行 1-8 位數(shù)的整數(shù)加法。訓(xùn)練包含 10 萬個(gè)示例,并進(jìn)行了 5000 步的微調(diào),batch size 為 32。然后分別用 1 萬個(gè)數(shù)據(jù)來測試訓(xùn)練分布內(nèi)的加法;1 千個(gè)數(shù)據(jù)來測試訓(xùn)練分布之外,也就是 9 位和 10 位數(shù)的加法。
將結(jié)果分別與直接運(yùn)算的語言模型進(jìn)行比較,發(fā)現(xiàn):即使超出臨界模型大小,用了“打斷點(diǎn)”法的模型也能夠進(jìn)行加法運(yùn)算,而直接運(yùn)算的基線模型就沒法做到這一點(diǎn)。
而在分布外的任務(wù)中,直接運(yùn)算的基線模型完全掛掉 ——“沒練過就不會做”,而用了“斷點(diǎn)”法的模型隨著規(guī)模的增大 hold 住了 9-10 位數(shù)的加法。
好,大數(shù)加法搞定。接下來上多項(xiàng)式。他們生成了一個(gè)包含 1 萬個(gè)多項(xiàng)式的訓(xùn)練數(shù)據(jù)集和 2000 個(gè)數(shù)據(jù)的測試集。其中項(xiàng)數(shù)一般不超過 3 項(xiàng),系數(shù)范圍在-10 到 + 10 之間,結(jié)果在-1000 到 + 10000 之間。多項(xiàng)式的訓(xùn)練示例如下:
結(jié)果發(fā)現(xiàn):無論是微調(diào)還是少樣本訓(xùn)練之后,“斷點(diǎn)”法的性能都優(yōu)于直接預(yù)測。
最后就是讀 Python 代碼了。
代碼的訓(xùn)練示例中,記錄了正在執(zhí)行的是哪行代碼,以及此時(shí)各變量的值,用 json 格式表示。
此前的語言模型讀代碼的能力都表現(xiàn)不佳。“打斷點(diǎn)”的方式可以讓它們一改常態(tài)么?
首先,經(jīng)過 200 個(gè)程序(都是人工編寫的,包括簡單的 while 循環(huán)和 if 語句)的測試發(fā)現(xiàn),“斷點(diǎn)法”整體執(zhí)行精度更高。與直接執(zhí)行的模型相比,微調(diào)還可以將模型性能從 26.5% 提高到 41.5%。
一個(gè)真實(shí)例子:
“斷點(diǎn)”法經(jīng)過 3 次 while 循環(huán),最終給出了正確的變量值。
接著,他們又用包含了 1000 個(gè)程序的 MBPP 數(shù)據(jù)集進(jìn)行訓(xùn)練和測試。這些程序涉及多種數(shù)據(jù)類型的計(jì)算,包括整數(shù)、字符串、浮點(diǎn)數(shù)等,以及涉及循環(huán)、API 調(diào)用和遞歸等流程結(jié)構(gòu)。并添加訓(xùn)練數(shù)據(jù)之外的“single line”程序集和 CodeNet 程序集進(jìn)行測試。
結(jié)果發(fā)現(xiàn),模型也可以很好地?cái)U(kuò)展。
當(dāng)然,這個(gè)方法也有局限性:比如復(fù)雜的計(jì)算可能需要很“長”的暫存器,這可能需要進(jìn)一步改進(jìn) Transformer 生成窗口的大小。好在這也是 NLP 領(lǐng)域的一個(gè)活躍研究領(lǐng)域。而在未來,他們可能會嘗試在無監(jiān)督情況下用強(qiáng)化學(xué)習(xí)讓語言模型學(xué)會“打斷點(diǎn)”。
總之,語言模型的計(jì)算能力、讀代碼的能力會越來越強(qiáng)。
論文地址:
https://arxiv.org/abs/2112.00114
廣告聲明:文內(nèi)含有的對外跳轉(zhuǎn)鏈接(包括不限于超鏈接、二維碼、口令等形式),用于傳遞更多信息,節(jié)省甄選時(shí)間,結(jié)果僅供參考,IT之家所有文章均包含本聲明。