前端也要懂演算法,不會演算法也能微調一個 NLP 預訓練模型
本文為來自 教育-智慧學習-前端團隊 成員的文章,已授權 ELab 釋出。
智慧學習前端團隊自創立以來,團隊專注於打破大眾對教育的刻板印象,突破固有的教學思維,攻破各類教學屏障。旨在為每一位學生制定最合適的學習方案,予以因材施教,使優質教育隨 " 觸 " 可達。
前言
學習nlp的過程,就像升級打怪,每一個階段都是一個坎,要想出新手村,需要跨過這幾個坎
-
level 1、瞭解nlp的概念 和 能做的邊界
-
level 2、會用一個已有的模型
-
level 3、學會微調一個自己業務專屬的模型
-
level 4、定義一個全新的模型
之前有分享過 前端工程師如何快速使用一個NLP模型 ,本文是該文的一個小進階
-
初探level3
本文預計需要30min,通過本文主要獲得幾個知識點:
-
回顧 NLP的一些概念
-
學會微調一個 中文bert模型 完形填空任務
nlp介紹
發展歷史
NLP任務的發展有兩個明顯的階段,我們以bert模型為區分點,前半段是基礎的神經網路階段(bert模型之前的階段),後半段是BertTology階段(bert模型之後的階段)
參考 https://zhuanlan.zhihu.com/p/148007742

-
1950-1970 - 採用 基於規則 的方法
-
人們定義了大量語言規則,但因規則的侷限性,只能解決一些簡單問題
-
1970-20世紀初 - 採用 基於統計 的方法
-
隨著技術發展 和 語料庫豐富,基於統計的方案逐漸代替了基於規則的方法,開始走向實際應用
-
2008-2018 - 引入深度學習 的RNN、LSTM、GRU
-
在影象識別和語音識別領域的成果激勵下,人們也逐漸開始引入深度學習來做自然語言處理研究,由最初的詞向量到2013年的word2vec,將深度學習與自然語言處理的結合推向了高潮,並在機器翻譯、問答系統、閱讀理解等領域取得了一定成功
-
現今
-
2017年穀歌提出了Transformer架構模型,2018年底,基於Transformer架構,谷歌推出了bert模型,bert模型一誕生,便在各大11項NLP基礎任務中展現出了卓越的效能(https://gluebenchmark.com/leaderboard) ,現在很多模型都是基於或參考Bert模型進行改造
bert 大家族


目前研究方向
方向分為兩個方向
https://zhuanlan.zhihu.com/p/56802149
-
自然語言理解 NLU
-
自然語言生成 NLG

下圖是huggingface上提供的nlp任務類別

學習nlp繞不開的一個知識概念
神經網路基本原理
這是個有點大的概念,本文為了避免冗餘繁瑣,主要強調兩個地方,方便有個大體認知
神經元
單個神經元是神經網路的基礎,就像生物界的神經元(樹突決定輸入、輸出;軸突完成訊號傳遞)
數學表示如下:Output=f(∑n(x*w)+θ)

可以看出一個神經元可以接受多個引數(x1、x2、...、xn),每個引數會配置一個對應的權重w1、w2、wn,經過加權求和之後,加上一個偏置值 θj ,經過一個啟用函式 f 處理得到輸出。
啟用函式作用:加入非線性因素,解決線性模型表達能力的不足,擬合更多的情況
其中 w、θ 的值由 模型訓練 得到 ,一個神經網路訓練過程就是讓每個神經元模型的權重值調整到最佳,以使整體的預測效果最好
神經網路工作基本流程

損失函式:計算 輸出值、目標值 之間的誤差
反向傳播:把誤差傳遞給權重,讓權重做適當的調整,最終讓正向傳播的輸出結果與標籤間誤差最小
學習率:反向傳播中步長大小,控制調節幅度,在精度和速度之間找到一個平衡
優化器:一般需要反覆迭代才能找到適合的權重,比較耗時,所以我們通過 一套策略(優化器)利用演算法從而更快、更好的將引數調整到位
but,在程式碼編寫過程中,我們並不需要手寫一個損失函式,手寫一個優化器,Pytorch 會幫你封裝成了一個個api;而在大部分場景甚至都不需要再去手寫神經網路 或者 訓練別人寫好的神經網路, 因為我們可以直接使用預訓練模型,開箱即用

預訓練模型
前面有提到 bert模型,bert模型就是一個預訓練模型,下面簡單說下預訓練模型
具體可以回顧下: 前端工程師如何快速使用一個NLP模型
概念:什麼是預訓練模型
第三方(主要是三方機構)用資料集已經訓練好的模型,通常情況下,我們可以拿來即用
一些預訓練模型的訓練成本

如何使用預訓練模型
很多開源的預訓練模型大家會提交到 github 或者釋出到 huggingface [1] 中
國內也有類似 hugginface平臺- 百度paddle [2] ,但還是 huggingface使用人最多
huggingface主要用兩種方式:
方式1、藉助 huggingface 封裝好的 pipeline,一行程式碼呼叫
方式2、藉助huggingface transformers提供的原子化 api (model、tokenizer)等完成
原子化 api使用三個步驟:
-
分詞:句子拆成詞,詞對映為一個可用於數學計算的向量序號
-
預測:呼叫模型推理的過程
-
解詞:推理得到的向量,反查對映表,轉換為詞,最後成句
預訓練模型優缺點
優點:
-
工程角度:開箱即用;節約訓練成本;減少訓練時長,加速生產
-
模型泛化能力強:預訓練模型經過海量資料訓練,更好地學到了資料中的普遍特徵,相比從頭開始訓練引數,預訓練模型具有會有更好的泛化效果
存在的問題:
預訓練模型就像一個 六邊形戰士,學到了海量資料中的特徵,從而各項能力指標都不錯,但在特定場景下,無法側重學習特定業務的某些特徵,從而不能像一把尖刀精準要害
那麼該如何解決呢?

答案是 微調預訓練模型 (fine-tuning):讓預訓練模型學習到 特定業務場景下資料集的特徵,從而在特定領域效果更佳。
微調 bert模型
在bert模型基礎上,微調一箇中文完形填空任務
之所以選擇 這個任務,是因為微調中文模型的文章比較少,而微調完形填空的就基本沒有找到..
什麼是Bert模型
BERT是通過 預測遮蔽子詞 來進行訓練的模型,這種方式在語句級的語義分析中取得了極好的效果。
遮蔽子詞:先將句子中的部分詞語遮蔽,再令模型去預測被遮蔽的詞語
掩碼例子
原句:我愛中國
掩碼後:我愛[MASK]國
Bert 將訓練文字15%的詞進行掩碼操作的,其中對於15% 需要掩碼的詞 如何掩蓋也有特殊規則:
-
有80%的概率用 [MASK] 標記來替換
-
有10%的概率用隨機取樣的一個單詞來替換
-
有10%的概率不做替換
正常效果

微調目標
可以看到模型推理的結果還不錯,能推理出來常見的人名
但我們的目標是:"魔改歷史",讓模型 預測出來 "三國人物諸葛濤" ,實現穿越,那麼該如何做呢?
微調具體操作
線上操作地址:
https://colab.research.google.com/drive/12SCpFa4gtgufiJ4JepLMuItjkWb6yfck?usp=sharing
step1、準備自定義語料
train.json

載入語料程式碼

step2、定義訓練器
定義訓練集和測試集


step3、模型訓練
訓練程式碼

訓練日誌

訓練結束

驗證結果


成功把 “諸葛濤” 加入到預測中
總結
學完本篇課程,算是初探 level3 成功了!
兩個flag完成了嗎?
-
回顧 NLP的一些概念
-
學會微調一個 中文bert模型 完形填空任務
預訓練模型是普通使用者的福音,而通過微調預訓練模型,每個人都可以收集構造自己的語料,打造一個自己專屬的nlp模型,或許人人皆是調參工程師

參考學習
Huggingface course課程
-
https://huggingface.co/course/chapter7/3?fw=pt
-
https://huggingface.co/course/en/chapter5/5?fw=pt
《基於Bert模型的自然語言處理實戰》
參考資料
huggingface: https://huggingface.co/
百度paddle: https://www.paddlepaddle.org.cn/hublist
- END -
:heart: 謝謝支援
以上便是本次分享的全部內容,希望對你有所幫助^_^
喜歡的話別忘了 分享、點贊、收藏 三連哦~。
歡迎關注公眾號 ELab團隊 收貨大廠一手好文章
智慧學習前端團隊自創立以來,團隊專注於打破大眾對教育的刻板印象,突破固有的教學思維,攻破各類教學屏障。旨在為每一位學生制定最合適的學習方案,予以因材施教,使優質教育隨 " 觸 " 可達。
位元組 跳 動 校 / 社 招 內 推 碼 : C4QC2V7
投 遞 鏈 接 : https://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