前端也要懂演算法,不會演算法也能微調一個 NLP 預訓練模型

語言: CN / TW / HK

本文為來自 教育-智慧學習-前端團隊 成員的文章,已授權 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

  • 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://zhuanlan.zhihu.com/p/56802149
  • 自然語言理解 NLU

  • 自然語言生成 NLG

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

學習nlp繞不開的一個知識概念

神經網路基本原理

這是個有點大的概念,本文為了避免冗餘繁瑣,主要強調兩個地方,方便有個大體認知

神經元

單個神經元是神經網路的基礎,就像生物界的神經元(樹突決定輸入、輸出;軸突完成訊號傳遞)

數學表示如下:Output=f(∑n(x*w)+θ)

可以看出一個神經元可以接受多個引數(x1、x2、...、xn),每個引數會配置一個對應的權重w1、w2、wn,經過加權求和之後,加上一個偏置值 θj ,經過一個啟用函式 f 處理得到輸出。

啟用函式作用:加入非線性因素,解決線性模型表達能力的不足,擬合更多的情況

其中 w、θ 的值由 模型訓練 得到 ,一個神經網路訓練過程就是讓每個神經元模型的權重值調整到最佳,以使整體的預測效果最好

神經網路工作基本流程

image.png

損失函式:計算 輸出值、目標值 之間的誤差

反向傳播:把誤差傳遞給權重,讓權重做適當的調整,最終讓正向傳播的輸出結果與標籤間誤差最小

學習率:反向傳播中步長大小,控制調節幅度,在精度和速度之間找到一個平衡

優化器:一般需要反覆迭代才能找到適合的權重,比較耗時,所以我們通過 一套策略(優化器)利用演算法從而更快、更好的將引數調整到位

but,在程式碼編寫過程中,我們並不需要手寫一個損失函式,手寫一個優化器,Pytorch 會幫你封裝成了一個個api;而在大部分場景甚至都不需要再去手寫神經網路 或者 訓練別人寫好的神經網路, 因為我們可以直接使用預訓練模型,開箱即用

預訓練模型

前面有提到 bert模型,bert模型就是一個預訓練模型,下面簡單說下預訓練模型

具體可以回顧下: 前端工程師如何快速使用一個NLP模型

概念:什麼是預訓練模型

第三方(主要是三方機構)用資料集已經訓練好的模型,通常情況下,我們可以拿來即用

一些預訓練模型的訓練成本

如何使用預訓練模型

很多開源的預訓練模型大家會提交到 github 或者釋出到 huggingface [1]

國內也有類似 hugginface平臺- 百度paddle [2] ,但還是 huggingface使用人最多

huggingface主要用兩種方式:

方式1、藉助 huggingface 封裝好的 pipeline,一行程式碼呼叫

方式2、藉助huggingface transformers提供的原子化 api (model、tokenizer)等完成

原子化 api使用三個步驟:

  • 分詞:句子拆成詞,詞對映為一個可用於數學計算的向量序號

  • 預測:呼叫模型推理的過程

  • 解詞:推理得到的向量,反查對映表,轉換為詞,最後成句

預訓練模型優缺點

優點:

  1. 工程角度:開箱即用;節約訓練成本;減少訓練時長,加速生產

  1. 模型泛化能力強:預訓練模型經過海量資料訓練,更好地學到了資料中的普遍特徵,相比從頭開始訓練引數,預訓練模型具有會有更好的泛化效果

存在的問題:

預訓練模型就像一個 六邊形戰士,學到了海量資料中的特徵,從而各項能力指標都不錯,但在特定場景下,無法側重學習特定業務的某些特徵,從而不能像一把尖刀精準要害

那麼該如何解決呢?

答案是 微調預訓練模型 (fine-tuning):讓預訓練模型學習到 特定業務場景下資料集的特徵,從而在特定領域效果更佳。

微調 bert模型

在bert模型基礎上,微調一箇中文完形填空任務

之所以選擇 這個任務,是因為微調中文模型的文章比較少,而微調完形填空的就基本沒有找到..

什麼是Bert模型

BERT是通過 預測遮蔽子詞 來進行訓練的模型,這種方式在語句級的語義分析中取得了極好的效果。

遮蔽子詞:先將句子中的部分詞語遮蔽,再令模型去預測被遮蔽的詞語

掩碼例子

原句:我愛中國

掩碼後:我愛[MASK]國

Bert 將訓練文字15%的詞進行掩碼操作的,其中對於15% 需要掩碼的詞 如何掩蓋也有特殊規則:

  • 有80%的概率用 [MASK] 標記來替換

  • 有10%的概率用隨機取樣的一個單詞來替換

  • 有10%的概率不做替換

正常效果

微調目標

可以看到模型推理的結果還不錯,能推理出來常見的人名

但我們的目標是:"魔改歷史",讓模型 預測出來 "三國人物諸葛濤" ,實現穿越,那麼該如何做呢?

微調具體操作

線上操作地址:

http://colab.research.google.com/drive/12SCpFa4gtgufiJ4JepLMuItjkWb6yfck?usp=sharing

step1、準備自定義語料

train.json

載入語料程式碼

step2、定義訓練器

定義訓練集和測試集

step3、模型訓練

訓練程式碼

訓練日誌

訓練結束

驗證結果

成功把 “諸葛濤” 加入到預測中

總結

學完本篇課程,算是初探 level3 成功了!

兩個flag完成了嗎?

  • 回顧 NLP的一些概念

  • 學會微調一個 中文bert模型 完形填空任務

預訓練模型是普通使用者的福音,而通過微調預訓練模型,每個人都可以收集構造自己的語料,打造一個自己專屬的nlp模型,或許人人皆是調參工程師

參考學習

Huggingface course課程

  • http://huggingface.co/course/chapter7/3?fw=pt

  • http://huggingface.co/course/en/chapter5/5?fw=pt

《基於Bert模型的自然語言處理實戰》

參考資料

[1]

huggingface: http://huggingface.co/

[2]

百度paddle: http://www.paddlepaddle.org.cn/hublist

- END -

:heart: 謝謝支援

以上便是本次分享的全部內容,希望對你有所幫助^_^

喜歡的話別忘了 分享、點贊、收藏 三連哦~。

歡迎關注公眾號 ELab團隊 收貨大廠一手好文章

智慧學習前端團隊自創立以來,團隊專注於打破大眾對教育的刻板印象,突破固有的教學思維,攻破各類教學屏障。旨在為每一位學生制定最合適的學習方案,予以因材施教,使優質教育隨 " " 可達。

位元組 / :   C4QC2V7

:   http://job.toutiao.com/s/2jML178