前端也要懂演算法,不會演算法也能微調一個 NLP 預訓練模型
本文為來自 教育-智慧學習-前端團隊 成員的文章,已授權 ELab 釋出。
智慧學習前端團隊自創立以來,團隊專注於打破大眾對教育的刻板印象,突破固有的教學思維,攻破各類教學屏障。旨在為每一位學生制定最合適的學習方案,予以因材施教,使優質教育隨 " 觸 " 可達。
前言
學習nlp的過程,就像升級打怪,每一個階段都是一個坎,要想出新手村,需要跨過這幾個坎
-
level 1、瞭解nlp的概念 和 能做的邊界
-
level 2、會用一個已有的模型
-
level 3、學會微調一個自己業務專屬的模型
-
level 4、定義一個全新的模型
之前有分享過 前端工程師如何快速使用一個NLP模型 ,本文是該文的一個小進階
-
初探level3
本文預計需要30min,通過本文主要獲得幾個知識點:
-
回顧 NLP的一些概念
-
學會微調一個 中文bert模型 完形填空任務
nlp介紹
發展歷史
NLP任務的發展有兩個明顯的階段,我們以bert模型為區分點,前半段是基礎的神經網路階段(bert模型之前的階段),後半段是BertTology階段(bert模型之後的階段)
參考 http://zhuanlan.zhihu.com/p/148007742
![](http://mdimg.wxwenku.com/getimg/356ed03bdc643f9448b3f6485edc229bfd8e478f13d3179e661ec56aea442a380dde654aefe8a68afec2e0213d03da7e.jpg)
-
1950-1970 - 採用 基於規則 的方法
-
人們定義了大量語言規則,但因規則的侷限性,只能解決一些簡單問題
-
1970-20世紀初 - 採用 基於統計 的方法
-
隨著技術發展 和 語料庫豐富,基於統計的方案逐漸代替了基於規則的方法,開始走向實際應用
-
2008-2018 - 引入深度學習 的RNN、LSTM、GRU
-
在影象識別和語音識別領域的成果激勵下,人們也逐漸開始引入深度學習來做自然語言處理研究,由最初的詞向量到2013年的word2vec,將深度學習與自然語言處理的結合推向了高潮,並在機器翻譯、問答系統、閱讀理解等領域取得了一定成功
-
現今
-
2017年穀歌提出了Transformer架構模型,2018年底,基於Transformer架構,谷歌推出了bert模型,bert模型一誕生,便在各大11項NLP基礎任務中展現出了卓越的效能(http://gluebenchmark.com/leaderboard) ,現在很多模型都是基於或參考Bert模型進行改造
bert 大家族
![](http://mdimg.wxwenku.com/getimg/356ed03bdc643f9448b3f6485edc229bdd7a3b82e3fe8b7dad692c51a6bb2d6012cd503a9983ab356530545c7a3ec604.jpg)
![](http://mdimg.wxwenku.com/getimg/356ed03bdc643f9448b3f6485edc229bab1703ae9d571a1a473ba3e8748c3d378d0a29973e95335c3045b4c694eb7345.jpg)
目前研究方向
方向分為兩個方向
http://zhuanlan.zhihu.com/p/56802149
-
自然語言理解 NLU
-
自然語言生成 NLG
![](http://mdimg.wxwenku.com/getimg/6b990ce30fa9193e296dd37902816f4b3d827c2891d1e17051fb810485e879a60a05aef4565486eb5de6f8381f1e419e.jpg)
下圖是huggingface上提供的nlp任務類別
![](http://mdimg.wxwenku.com/getimg/6b990ce30fa9193e296dd37902816f4b3bcf741a39c18b9c20ca022f41d714e54095a16cba029c9b7c1bf704bdf6a09f.jpg)
學習nlp繞不開的一個知識概念
神經網路基本原理
這是個有點大的概念,本文為了避免冗餘繁瑣,主要強調兩個地方,方便有個大體認知
神經元
單個神經元是神經網路的基礎,就像生物界的神經元(樹突決定輸入、輸出;軸突完成訊號傳遞)
數學表示如下:Output=f(∑n(x*w)+θ)
![](http://mdimg.wxwenku.com/getimg/356ed03bdc643f9448b3f6485edc229bd6f7ee92ee1151074bc985e856b20268d988050d94da568fabdc02151e9246b6.jpg)
可以看出一個神經元可以接受多個引數(x1、x2、...、xn),每個引數會配置一個對應的權重w1、w2、wn,經過加權求和之後,加上一個偏置值 θj ,經過一個啟用函式 f 處理得到輸出。
啟用函式作用:加入非線性因素,解決線性模型表達能力的不足,擬合更多的情況
其中 w、θ 的值由 模型訓練 得到 ,一個神經網路訓練過程就是讓每個神經元模型的權重值調整到最佳,以使整體的預測效果最好
神經網路工作基本流程
![](http://mdimg.wxwenku.com/getimg/6b990ce30fa9193e296dd37902816f4b3b3fca72ad2ffb94251204fb91d8b0943da56e9efa292c9c9d3f2395dcff1d59.jpg)
損失函式:計算 輸出值、目標值 之間的誤差
反向傳播:把誤差傳遞給權重,讓權重做適當的調整,最終讓正向傳播的輸出結果與標籤間誤差最小
學習率:反向傳播中步長大小,控制調節幅度,在精度和速度之間找到一個平衡
優化器:一般需要反覆迭代才能找到適合的權重,比較耗時,所以我們通過 一套策略(優化器)利用演算法從而更快、更好的將引數調整到位
but,在程式碼編寫過程中,我們並不需要手寫一個損失函式,手寫一個優化器,Pytorch 會幫你封裝成了一個個api;而在大部分場景甚至都不需要再去手寫神經網路 或者 訓練別人寫好的神經網路, 因為我們可以直接使用預訓練模型,開箱即用
![](http://mdimg.wxwenku.com/getimg/ccdf080c7af7e8a10e9b88444af98393655e39e025c8fc758a36326623d53b5e234f22fc5fcbbdac7eff9a16e2b37dbe.jpg)
預訓練模型
前面有提到 bert模型,bert模型就是一個預訓練模型,下面簡單說下預訓練模型
具體可以回顧下: 前端工程師如何快速使用一個NLP模型
概念:什麼是預訓練模型
第三方(主要是三方機構)用資料集已經訓練好的模型,通常情況下,我們可以拿來即用
一些預訓練模型的訓練成本
![](http://mdimg.wxwenku.com/getimg/356ed03bdc643f9448b3f6485edc229b3f308f49026ab7656c17f9f5a3ae6e96a6dcfd0b7d1fad37afa4327d1d6e705a.jpg)
如何使用預訓練模型
很多開源的預訓練模型大家會提交到 github 或者釋出到 huggingface [1] 中
國內也有類似 hugginface平臺- 百度paddle [2] ,但還是 huggingface使用人最多
huggingface主要用兩種方式:
方式1、藉助 huggingface 封裝好的 pipeline,一行程式碼呼叫
方式2、藉助huggingface transformers提供的原子化 api (model、tokenizer)等完成
原子化 api使用三個步驟:
-
分詞:句子拆成詞,詞對映為一個可用於數學計算的向量序號
-
預測:呼叫模型推理的過程
-
解詞:推理得到的向量,反查對映表,轉換為詞,最後成句
預訓練模型優缺點
優點:
-
工程角度:開箱即用;節約訓練成本;減少訓練時長,加速生產
-
模型泛化能力強:預訓練模型經過海量資料訓練,更好地學到了資料中的普遍特徵,相比從頭開始訓練引數,預訓練模型具有會有更好的泛化效果
存在的問題:
預訓練模型就像一個 六邊形戰士,學到了海量資料中的特徵,從而各項能力指標都不錯,但在特定場景下,無法側重學習特定業務的某些特徵,從而不能像一把尖刀精準要害
那麼該如何解決呢?
![](http://mdimg.wxwenku.com/getimg/356ed03bdc643f9448b3f6485edc229b5a7e94e1cbb7e1bce1318fdcff1db4a39899abd43dccd8166aa3154263f87be3.jpg)
答案是 微調預訓練模型 (fine-tuning):讓預訓練模型學習到 特定業務場景下資料集的特徵,從而在特定領域效果更佳。
微調 bert模型
在bert模型基礎上,微調一箇中文完形填空任務
之所以選擇 這個任務,是因為微調中文模型的文章比較少,而微調完形填空的就基本沒有找到..
什麼是Bert模型
BERT是通過 預測遮蔽子詞 來進行訓練的模型,這種方式在語句級的語義分析中取得了極好的效果。
遮蔽子詞:先將句子中的部分詞語遮蔽,再令模型去預測被遮蔽的詞語
掩碼例子
原句:我愛中國
掩碼後:我愛[MASK]國
Bert 將訓練文字15%的詞進行掩碼操作的,其中對於15% 需要掩碼的詞 如何掩蓋也有特殊規則:
-
有80%的概率用 [MASK] 標記來替換
-
有10%的概率用隨機取樣的一個單詞來替換
-
有10%的概率不做替換
正常效果
![](http://mdimg.wxwenku.com/getimg/356ed03bdc643f9448b3f6485edc229b9009587e71367429bec8a8384ab521f3ea54e78bbbacbca28732451684f64ddd.jpg)
微調目標
可以看到模型推理的結果還不錯,能推理出來常見的人名
但我們的目標是:"魔改歷史",讓模型 預測出來 "三國人物諸葛濤" ,實現穿越,那麼該如何做呢?
微調具體操作
線上操作地址:
http://colab.research.google.com/drive/12SCpFa4gtgufiJ4JepLMuItjkWb6yfck?usp=sharing
step1、準備自定義語料
train.json
![](http://mdimg.wxwenku.com/getimg/ccdf080c7af7e8a10e9b88444af9839388dc7de7103cbef2924cedc1040f10b62ca55db756fe1ee086d7c2548daa3c45.jpg)
載入語料程式碼
![](http://mdimg.wxwenku.com/getimg/356ed03bdc643f9448b3f6485edc229be4d0b193f41b3e0cf2960ca2aa13caf89da5e4c6fafbfe424f6e7a137bb44ee2.jpg)
step2、定義訓練器
定義訓練集和測試集
![](http://mdimg.wxwenku.com/getimg/6b990ce30fa9193e296dd37902816f4bbfacfe252495f00abcc42071d458e5dcdd1960f94585f7b242e959f242a471a7.jpg)
![](http://mdimg.wxwenku.com/getimg/356ed03bdc643f9448b3f6485edc229b37fa4e03d15647c32cd6ba3d32db3c1309af6ad2a74b9b5d7c48b505f3ffb35b.jpg)
step3、模型訓練
訓練程式碼
![](http://mdimg.wxwenku.com/getimg/ccdf080c7af7e8a10e9b88444af983933b5202677e996ae611c609a56194e61a05a90357235d3f65cd20ee48059ea83c.jpg)
訓練日誌
![](http://mdimg.wxwenku.com/getimg/ccdf080c7af7e8a10e9b88444af983933712e1fc271d1aea50b58dccf1d42edd32c525c3f5193dda409cce4023c9a5f4.jpg)
訓練結束
![](http://mdimg.wxwenku.com/getimg/ccdf080c7af7e8a10e9b88444af983931aa4a69bdaa46169f50190bb77167c8ba2ce3ff99836b6e98d8e9d61bc8b81fd.jpg)
驗證結果
![](http://mdimg.wxwenku.com/getimg/ccdf080c7af7e8a10e9b88444af983934a53a2ada90892f85b9d20e951a0272e722746880c0017e24263ade799ee5301.jpg)
![](http://mdimg.wxwenku.com/getimg/ccdf080c7af7e8a10e9b88444af98393ba1ffd0fe4cdbed2070e688354e09ed0bd3ff49d6fca64ad41e0d8c6022a38c0.jpg)
成功把 “諸葛濤” 加入到預測中
總結
學完本篇課程,算是初探 level3 成功了!
兩個flag完成了嗎?
-
回顧 NLP的一些概念
-
學會微調一個 中文bert模型 完形填空任務
預訓練模型是普通使用者的福音,而通過微調預訓練模型,每個人都可以收集構造自己的語料,打造一個自己專屬的nlp模型,或許人人皆是調參工程師
![](http://mdimg.wxwenku.com/getimg/ccdf080c7af7e8a10e9b88444af98393d9576344fdff35dabca146126500524c78a45332c07f31ee82d8331017595be8.jpg)
參考學習
Huggingface course課程
-
http://huggingface.co/course/chapter7/3?fw=pt
-
http://huggingface.co/course/en/chapter5/5?fw=pt
《基於Bert模型的自然語言處理實戰》
參考資料
huggingface: http://huggingface.co/
百度paddle: http://www.paddlepaddle.org.cn/hublist
- END -
:heart: 謝謝支援
以上便是本次分享的全部內容,希望對你有所幫助^_^
喜歡的話別忘了 分享、點贊、收藏 三連哦~。
歡迎關注公眾號 ELab團隊 收貨大廠一手好文章
智慧學習前端團隊自創立以來,團隊專注於打破大眾對教育的刻板印象,突破固有的教學思維,攻破各類教學屏障。旨在為每一位學生制定最合適的學習方案,予以因材施教,使優質教育隨 " 觸 " 可達。
位元組 跳 動 校 / 社 招 內 推 碼 : C4QC2V7
投 遞 鏈 接 : http://job.toutiao.com/s/2jML178
- 使用 WebAssembly 打造定製 JS Runtime
- 前端也要懂演算法,不會演算法也能微調一個 NLP 預訓練模型
- 聯機遊戲原理入門即入土 -- 入門篇
- Plasmo Framework:次世代的瀏覽器外掛開發框架
- 深入理解 Mocha 測試框架:從零實現一個 Mocha
- Single Source of Truth:XCode SwiftUI 的介面編輯的設計理念
- 深入理解 D3.js 視覺化庫之力導向圖原理與實現
- 淺析神經網路 Neural Networks
- Cutter - Web視訊剪輯工具原理淺析
- 你可能需要一個四捨五入的工具函式
- 淺析eslint原理
- 最小編譯器the-super-tiny-compiler
- Git儲存原理及部分實現
- 淺談短鏈的設計
- Web元件構建庫-Lit
- 使用Svelte開發Chrome Extension
- Web3.0開發入門
- vscode外掛原理淺析與實戰
- 深入淺出 Web Audio API
- 探祕HTTPS