BERT可以上几年级了?Seq2Seq“硬刚”小学数学应用题
?PaperWeekly 原創 ·?作者| 蘇劍林
單位|追一科技
研究方向|NLP、神經網絡
▲“雞兔同籠”的那些年“盈虧問題”、“年齡問題”、“植樹問題”、“牛吃草問題”、“利潤問題”...,小學階段你是否曾被各種花樣的數學應用題折磨過呢?沒關系,現在機器學習模型也可以幫助我們去解答應用題了,來看看它可以上幾年級了?
本文將給出一個求解小學數學應用題(Math Word Problem)的 baseline,基于ape210k 數據集 [1]?訓練,直接用 Seq2Seq 模型生成可執行的數學表達式,最終 Large 版本的模型能達到?73%+?的準確率,高于 ape210k 論文所報告的結果。
所謂“硬剛”,指的是沒有對表達式做特別的轉換,也沒有通過模板處理,就直接生成跟人類做法相近的可讀表達式。
數據處理
這里我們先觀察一下 ape210k 數據集的情況:
{"id":?"254761","segmented_text":?"小?王?要?將 150?千?克?含?藥?量 20%?的?農?藥?稀?釋?成?含?藥?量 5%?的?藥?水?.?需?要?加?水?多?少?千?克??","original_text":?"小王要將150千克含藥量20%的農藥稀釋成含藥量5%的藥水.需要加水多少千克?","ans":?"450","equation":?"x=150*20%/5%-150" }{"id":?"325488","segmented_text":?"一?個?圓?形?花?壇?的?半?徑?是?4?米?,?現?在?要?擴?建?花?壇?,?將?半?徑?增?加?1?米?,?這?時?花?壇?的?占?地?面?積?增?加?了?多?少?米?*?*?2?.","original_text":?"一個圓形花壇的半徑是4米,現在要擴建花壇,將半徑增加1米,這時花壇的占地面積增加了多少米**2.","ans":?"28.26","equation":?"x=(3.14*(4+1)**2)-(3.14*4**2)" }可以看到,我們主要關心的是?original_text、equation、ans?字段,其中?original_text?就是題目,equation?則是運算過程(一般以 x= 開頭),而?ans?是最終答案。我們希望訓練一個模型,由?original_text?來生成?equation,然后經由 python 的 eval 函數直接得到?ans。
不過,我們需要做一些前處理,因為 ape210k 給出的?equation?并不是都可以直接 eval 的,像上面的例子 150*20%/5%-150 對 python 來說就是一個非法表達式。筆者所做的處理如下:
對于a%這樣的百分數,統一替換為(a/100);
對于a(b/c)這樣的帶分數,統一替換為(a+b/c);
對于(a/b)這樣的真分數,在題目中去掉括號變為a/b;
對于比例的冒號:,統一替換為/。
經過這樣處理后,大部分?equation?都可以直接 eval 了,并且可以與ans進行答案對比,只保留結果一致的題目。
不過,還有一點改進的地方,就是這樣得到的表達式可能會帶有一些冗余的括號(也就是去掉括號后與原來的等價),因此還要加上一步去括號,即遍歷每一組括號,如果去掉該組括號結果與原來的等價,那么就去掉該組括號,這樣可以得到平均長度更短的表達式,而長度越短越容易生成。
最終,我們得到了如下可用的數據集:
剩下的基本上是一些錯題、亂題了,暫時忽略。
模型簡介
模型其實是最沒什么好講的,就是以?original_text?為輸入、equation?為輸出,以“BERT+UniLM”為基礎架構,訓練一個 Seq2Seq 模型。如果對模型還有什么疑惑的地方,請閱讀從語言模型到Seq2Seq:Transformer如戲,全靠Mask。
項目鏈接:?
http://github.com/bojone/ape210k_baseline
筆者的訓練是用 22G 的單卡 TITAN RTX 跑的,優化器是 Adam,學習率是 2e-5。Base 版本的用了 batch_size=32,大概需要訓練 25 個 epoch,每個 epoch 約 50 分鐘(算上驗證集的評測時間);而 large 版本則是 batch_size=16,大概需要訓練 15 個 epoch,每個 epoch 約 2 小時(算上驗證集的評測時間)。
對了,說到 Large,由于 UniLM 借用了 MLM 部分權重,所以我們不能用哈工大開源的 RoBERTa-wwm-ext-large [2]?,因為這個版本的 MLM 權重是隨機初始化的(但它的 Base 版本是正常的,可以用)。Large 版本推薦用騰訊 UER [3]?開源的權重,原本是 PyTorch 版的,筆者將它轉換為 TF 版了,可以通過下方鏈接下載。
網盤鏈接:
https://pan.baidu.com/s/1Xp_ttsxwLMFDiTPqmRABhg
提取碼:l0k6
效果如下表:
Large 模型的結果已經比 ape210k 的論文 Ape210K: A Large-Scale and Template-Rich Dataset of Math Word Problems?[4] 所報告的 70.20% 要明顯高了,因此說明我們這里的模型是一個不算太差的 baseline。
感覺如果用一些 Seq2Seq 的技巧來緩解一下 Exposure Bias 問題(參考Seq2Seq中Exposure Bias現象的淺析與對策),模型還能有進一步提升;還有或許可以引入 copy 機制,增強輸出與輸入數字的一致性;還有可以想辦法進一步縮短序列長度(比如四個字符的 3.14 替換為兩個字母 pi)。這些就留給大家嘗試了。
標準輸出
如果純粹從建模的角度來看,其實我們的任務已經完成了,即模型只需要輸出式子就行了,評測的時候則只需要判斷式子 eval 后的結果跟參考答案是否一致就好。
但是從實際實用的角度,我們還需要對輸出做進一步的標準化,即根據不同的題目決定輸出的是小數、整數、分數還是百分數等,這就需要我們:1)決定什么時候該輸出什么格式;2)根據指定格式對結果進行轉換。
第一步比較簡單,一般來說根據題目或方程的一些關鍵字就可以判斷了。比如表達式里邊如果有小數的,那么輸出結果一般也是小數;如果題目是問“多少輛”、“多少個”、“多少人”之類的,那么輸出的都是整數;如果直接問“幾分之幾”或“百分之幾”的,那么相應地就是分數或百分數了。
比較困難是應該是取整類題目,比如“每盒蛋糕 7.90 元,50 元最多可以買多少盒蛋糕?”要求我們對 50/7.90 進行下取整,但有時候則是上取整。不過讓筆者很意外的是,ape210k 里邊并沒有取整類題目,所以也就不存在這個問題。如果遇到有取整的數據集,如果規則判斷起來比較困難,那么最直接的方法就是把取整符號也加入到 equation 中讓模型去預測。
第二步看起來有點復雜,主要是分數的場景,一般讀者可能不知道如何讓式子保留分數運算結果,如果直接 eval('(1+2)/4'),那么得到的是 0.75(Python3),但有時我們希望得到的是分數結果 3/4。
事實上,保持分數的運算屬于 CAS 的范疇(Computer Algebra System,計算機代數系統),說白了就是符號運算而不是數值運算,而 Python 中剛好也有這樣的工具,那就是?SymPy [5]?,利用 SymPy 就能達到我們的目的了。具體請看下面的例子:
from?sympy?import?Integer import?rer?=?(Integer(1)?+?Integer(2))?/?Integer(4) print(r)??#?輸出是?3/4?而不是?0.75equation?=?'(1+2)/4' print(eval(equation))??#?輸出是?0.75new_equation?=?re.sub('(\d+)',?'Integer(\\1)',?equation) print(new_equation)??#?輸出是?(Integer(1)+Integer(2))/Integer(4) print(eval(new_equation))??#?輸出是?3/4文章小結
本文介紹了用 Seq2Seq 模型做數學應用題的一個 baseline,主要思路就是通過“BERT+UniLM”直接將問題轉換為可 eval 的表達式,然后分享了一些結果標準化的經驗。通過 BERT Large 模型的 UniLM,我們達到了73%+的準確率,超過了原論文開源的結果。
所以,你覺得它能上幾年級了呢?
參考文獻
[1] https://github.com/Chenny0808/ape210k
[2] https://github.com/ymcui/Chinese-BERT-wwm
[3] hhttps://github.com/dbiir/UER-py
[4] https://arxiv.org/pdf/2009.11506v1.pdf
[5] https://www.sympy.org/en/index.html
更多閱讀
#投 稿?通 道#
?讓你的論文被更多人看到?
如何才能讓更多的優質內容以更短路徑到達讀者群體,縮短讀者尋找優質內容的成本呢?答案就是:你不認識的人。
總有一些你不認識的人,知道你想知道的東西。PaperWeekly 或許可以成為一座橋梁,促使不同背景、不同方向的學者和學術靈感相互碰撞,迸發出更多的可能性。?
PaperWeekly 鼓勵高校實驗室或個人,在我們的平臺上分享各類優質內容,可以是最新論文解讀,也可以是學習心得或技術干貨。我們的目的只有一個,讓知識真正流動起來。
?????來稿標準:
? 稿件確系個人原創作品,來稿需注明作者個人信息(姓名+學校/工作單位+學歷/職位+研究方向)?
? 如果文章并非首發,請在投稿時提醒并附上所有已發布鏈接?
? PaperWeekly 默認每篇文章都是首發,均會添加“原創”標志
?????投稿郵箱:
? 投稿郵箱:hr@paperweekly.site?
? 所有文章配圖,請單獨在附件中發送?
? 請留下即時聯系方式(微信或手機),以便我們在編輯發布時和作者溝通
????
現在,在「知乎」也能找到我們了
進入知乎首頁搜索「PaperWeekly」
點擊「關注」訂閱我們的專欄吧
關于PaperWeekly
PaperWeekly 是一個推薦、解讀、討論、報道人工智能前沿論文成果的學術平臺。如果你研究或從事 AI 領域,歡迎在公眾號后臺點擊「交流群」,小助手將把你帶入 PaperWeekly 的交流群里。
總結
以上是生活随笔為你收集整理的BERT可以上几年级了?Seq2Seq“硬刚”小学数学应用题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 重磅发布!最新版《动手学深度学习》PDF
- 下一篇: 结婚梳头的梳子能拿走一个吗