遷移學(xué)習(xí)
1.遷移學(xué)習(xí)理論
學(xué)習(xí)目標(biāo):
了解遷移學(xué)習(xí)中的有關(guān)概念.
掌握遷移學(xué)習(xí)的兩種遷移方式.
1.1 遷移學(xué)習(xí)中的有關(guān)概念:
預(yù)訓(xùn)練模型
微調(diào)
微調(diào)腳本
1.2 預(yù)訓(xùn)練模型(Pretrained model):
一般情況下預(yù)訓(xùn)練模型都是大型模型,具備復(fù)雜的網(wǎng)絡(luò)結(jié)構(gòu),眾多的參數(shù)量,以及在足夠大的數(shù)據(jù)集下進(jìn)行訓(xùn)練而產(chǎn)生的模型. 在NLP領(lǐng)域,預(yù)訓(xùn)練模型往往是語(yǔ)言模型,因?yàn)檎Z(yǔ)言模型的訓(xùn)練是無(wú)監(jiān)督的,可以獲得大規(guī)模語(yǔ)料,同時(shí)語(yǔ)言模型又是許多典型NLP任務(wù)的基礎(chǔ),如機(jī)器翻譯,文本生成,閱讀理解等,常見(jiàn)的預(yù)訓(xùn)練模型有BERT, GPT, roBERTa, transformer-XL等.
1.3 微調(diào)(Fine-tuning):
根據(jù)給定的預(yù)訓(xùn)練模型,改變它的部分參數(shù)或者為其新增部分輸出結(jié)構(gòu)后,通過(guò)在小部分?jǐn)?shù)據(jù)集上訓(xùn)練,來(lái)使整個(gè)模型更好的適應(yīng)特定任務(wù).
1.4 微調(diào)腳本(Fine-tuning script):
實(shí)現(xiàn)微調(diào)過(guò)程的代碼文件。這些腳本文件中,應(yīng)包括對(duì)預(yù)訓(xùn)練模型的調(diào)用,對(duì)微調(diào)參數(shù)的選定以及對(duì)微調(diào)結(jié)構(gòu)的更改等,同時(shí),因?yàn)槲⒄{(diào)是一個(gè)訓(xùn)練過(guò)程,它同樣需要一些超參數(shù)的設(shè)定,以及損失函數(shù)和優(yōu)化器的選取等, 因此微調(diào)腳本往往也包含了整個(gè)遷移學(xué)習(xí)的過(guò)程.
關(guān)于微調(diào)腳本的說(shuō)明:
一般情況下,微調(diào)腳本應(yīng)該由不同的任務(wù)類(lèi)型開(kāi)發(fā)者自己編寫(xiě),但是由于目前研究的NLP任務(wù)類(lèi)型(分類(lèi),提取,生成)以及對(duì)應(yīng)的微調(diào)輸出結(jié)構(gòu)都是有限的,有些微調(diào)方式已經(jīng)在很多數(shù)據(jù)集上被驗(yàn)證是有效的,因此微調(diào)腳本也可以使用已經(jīng)完成的規(guī)范腳本.
1.5 兩種遷移方式:
(1)直接使用預(yù)訓(xùn)練模型,進(jìn)行相同任務(wù)的處理,不需要調(diào)整參數(shù)或模型結(jié)構(gòu),這些模型開(kāi)箱即用。但是這種情況一般只適用于普適任務(wù), 如:fasttest工具包中預(yù)訓(xùn)練的詞向量模型。另外,很多預(yù)訓(xùn)練模型開(kāi)發(fā)者為了達(dá)到開(kāi)箱即用的效果,將模型結(jié)構(gòu)分各個(gè)部分保存為不同的預(yù)訓(xùn)練模型,提供對(duì)應(yīng)的加載方法來(lái)完成特定目標(biāo).
(2)更加主流的遷移學(xué)習(xí)方式是發(fā)揮預(yù)訓(xùn)練模型特征抽象的能力,然后再通過(guò)微調(diào)的方式,通過(guò)訓(xùn)練更新小部分參數(shù)以此來(lái)適應(yīng)不同的任務(wù)。這種遷移方式需要提供小部分的標(biāo)注數(shù)據(jù)來(lái)進(jìn)行監(jiān)督學(xué)習(xí).
關(guān)于遷移方式的說(shuō)明:
直接使用預(yù)訓(xùn)練模型的方式, 已經(jīng)在fasttext的詞向量遷移中學(xué)習(xí). 接下來(lái)的遷移學(xué)習(xí)實(shí)踐將主要講解通過(guò)微調(diào)的方式進(jìn)行遷移學(xué)習(xí).
2.NLP標(biāo)準(zhǔn)數(shù)據(jù)集
學(xué)習(xí)目標(biāo):
了解NLP中GLUE標(biāo)準(zhǔn)數(shù)據(jù)集合的相關(guān)知識(shí).
掌握GLUE標(biāo)準(zhǔn)數(shù)據(jù)集合的下載方式, 數(shù)據(jù)樣式及其對(duì)應(yīng)的任務(wù)類(lèi)型.
2.1 GLUE數(shù)據(jù)集合的介紹:
GLUE由紐約大學(xué), 華盛頓大學(xué), Google聯(lián)合推出, 涵蓋不同NLP任務(wù)類(lèi)型, 截止至2020年1月其中包括11個(gè)子任務(wù)數(shù)據(jù)集, 成為衡量NLP研究發(fā)展的衡量標(biāo)準(zhǔn).
2.2 GLUE數(shù)據(jù)集合包含以下數(shù)據(jù)集:
diagnostics數(shù)據(jù)集(官方未完善)
CoLA: 語(yǔ)句的語(yǔ)法是否正確, 二分類(lèi)
SST-2: 情感分析語(yǔ)句積極, 消極, 二分類(lèi)
MRPC: 判斷句子對(duì)含義是否相同, 二分類(lèi)
SST-B: 衡量句子對(duì)的相似度, 多分類(lèi)/回歸, 相似度評(píng)分[0.0 - 5.0]
QQP: 判斷句子對(duì)是否重復(fù)性問(wèn)題, 二分類(lèi)
MNLI(SNLI): 判斷句子對(duì)的語(yǔ)義信息的關(guān)系, 三分類(lèi) (蘊(yùn)含, 矛盾, 不蘊(yùn)含不矛盾)
QNLI(RTE, WNLI): 判斷句子對(duì)是否蘊(yùn)含關(guān)系, 二分類(lèi)
2.3 下載GLUE數(shù)據(jù)集:
下載腳本代碼:略
3. NLP中的常用預(yù)訓(xùn)練模型:
????BERT
????GPT
????GPT-2
????Transformer-XL
????XLNet
????XLM
????RoBERTa
????DistilBERT
????ALBERT
????T5
????XLM-RoBERTa
4.?加載和使用預(yù)訓(xùn)練模型:
在這里我們使用torch.hub工具進(jìn)行模型的加載和使用.
這些預(yù)訓(xùn)練模型由世界先進(jìn)的NLP研發(fā)團(tuán)隊(duì)huggingface提供.
加載和使用預(yù)訓(xùn)練模型的步驟:
第一步: 確定需要加載的預(yù)訓(xùn)練模型并安裝依賴(lài)包.
第二步: 加載預(yù)訓(xùn)練模型的映射器tokenizer.
第三步: 加載帶/不帶頭的預(yù)訓(xùn)練模型.
第四步: 使用模型獲得輸出結(jié)果.
5.?遷移學(xué)習(xí)實(shí)踐:
5.1 指定任務(wù)類(lèi)型的微調(diào)腳本:
huggingface研究機(jī)構(gòu)向我們提供了針對(duì)GLUE數(shù)據(jù)集合任務(wù)類(lèi)型的微調(diào)腳本, 這些微調(diào)腳本的核心都是微調(diào)模型的最后一個(gè)全連接層.
通過(guò)簡(jiǎn)單的參數(shù)配置來(lái)指定GLUE中存在任務(wù)類(lèi)型(如: CoLA對(duì)應(yīng)文本二分類(lèi), MRPC對(duì)應(yīng)句子對(duì)文本二分類(lèi), STS-B對(duì)應(yīng)句子對(duì)文本多分類(lèi)), 以及指定需要微調(diào)的預(yù)訓(xùn)練模型.
huggingface研究機(jī)構(gòu)向我們提供了針對(duì)GLUE數(shù)據(jù)集合任務(wù)類(lèi)型的微調(diào)腳本, 這些微調(diào)腳本的核心都是微調(diào)模型的最后一個(gè)全連接層.
通過(guò)簡(jiǎn)單的參數(shù)配置來(lái)指定GLUE中存在任務(wù)類(lèi)型(如: CoLA對(duì)應(yīng)文本二分類(lèi), MRPC對(duì)應(yīng)句子對(duì)文本二分類(lèi), STS-B對(duì)應(yīng)句子對(duì)文本多分類(lèi)), 以及指定需要微調(diào)的預(yù)訓(xùn)練模型.
5.2 指定任務(wù)類(lèi)型的微調(diào)腳本使用步驟:
第一步: 下載微調(diào)腳本文件
第二步: 配置微調(diào)腳本參數(shù) , 創(chuàng)建run_glue.sh文件
# 定義DATA_DIR: 微調(diào)數(shù)據(jù)所在路徑, 這里我們使用glue_data中的數(shù)據(jù)作為微調(diào)數(shù)據(jù)
export DATA_DIR="../../glue_data"
# 定義SAVE_DIR: 模型的保存路徑, 我們將模型保存在當(dāng)前目錄的bert_finetuning_test文件中
export SAVE_DIR="./bert_finetuning_test/"
# 使用python運(yùn)行微調(diào)腳本
# --model_type: 選擇需要微調(diào)的模型類(lèi)型, 這里可以選擇BERT, XLNET, XLM, roBERTa, distilBERT, ALBERT
# --model_name_or_path: 選擇具體的模型或者變體, 這里是在英文語(yǔ)料上微調(diào), 因此選擇bert-base-uncased
# --task_name: 它將代表對(duì)應(yīng)的任務(wù)類(lèi)型, 如MRPC代表句子對(duì)二分類(lèi)任務(wù)
# --do_train: 使用微調(diào)腳本進(jìn)行訓(xùn)練
# --do_eval: 使用微調(diào)腳本進(jìn)行驗(yàn)證
# --data_dir: 訓(xùn)練集及其驗(yàn)證集所在路徑, 將自動(dòng)尋找該路徑下的train.tsv和dev.tsv作為訓(xùn)練集和驗(yàn)證集
# --max_seq_length: 輸入句子的最大長(zhǎng)度, 超過(guò)則截?cái)? 不足則補(bǔ)齊
# --learning_rate: 學(xué)習(xí)率
# --num_train_epochs: 訓(xùn)練輪數(shù)
# --output_dir $SAVE_DIR: 訓(xùn)練后的模型保存路徑
# --overwrite_output_dir: 再次訓(xùn)練時(shí)將清空之前的保存路徑內(nèi)容重新寫(xiě)入
python run_glue.py \
?--model_type BERT \?
?--model_name_or_path bert-base-uncased \
?--task_name MRPC \?
?--do_train \?
?--do_eval \
?--data_dir $DATA_DIR/MRPC/ \
?--max_seq_length 128 \?
?--learning_rate 2e-5 \?
?--num_train_epochs 1.0 \?
?--output_dir $SAVE_DIR \
?--overwrite_output_dir
第三步: 運(yùn)行并檢驗(yàn)效果??sh run_glue.sh(啟動(dòng)腳本會(huì)調(diào)用run_glue.py文件來(lái)執(zhí)行微調(diào)程序。程序主要有三部分功能:加載模型,加載數(shù)據(jù),進(jìn)行微調(diào)(訓(xùn)練,驗(yàn)證,預(yù)測(cè))。
5.3 通過(guò)微調(diào)腳本微調(diào)后模型的使用步驟:
第一步: 在https://huggingface.co/join上創(chuàng)建一個(gè)帳戶
第二步: 在服務(wù)器終端使用transformers-cli登陸
第三步: 使用transformers-cli上傳模型并查看? ? ??
# 選擇正確的微調(diào)模型路徑$ transformers-cli upload ./bert_finetuning_test/
# 查看上傳結(jié)果$ transformers-cli ls
第四步: 使用pytorch.hub加載模型進(jìn)行使用