一、遷移學習的概念
1.預訓練模型(Pretrained model)
定義: 簡單來說別人訓練好的模型。一般預訓練模型具備復雜的網絡模型結構;一般是在大量的語料下訓練完成的。
2.微調(Fine-tuning)
定義:一般是對預訓練語言模型,進行垂直領域數據的微調,可以將預訓練模型的參數全部微調或者部分微調或者不微調,但是一般我們在做任務的時候,會在預訓練模型后加入自定義網絡,自定義網絡模型的參數需要訓練。
3.遷移學習的兩種方式
① 開箱即用: 當預訓練模型的任務和我們要做的任務相似時,可以直接使用預訓練模型來解決對應的任務。
② 微調: 進行垂直領域數據的微調,一般在預訓練網絡模型后,加入自定義網絡,自定義網絡模型的參數需要訓練,但是預訓練模型的參數可以全部微調或者部分微調或者不微調。
二、fasttaxt工具介紹
1.作用
作為NLP工程領域常用的工具包, fasttext有兩大作用:
① 進行文本分類
② 訓練詞向量
2.fasttext工具包的優勢
在保持較高精度的情況下, 能夠快速的進行訓練和預測。
原因:
① fasttext工具包中內含的fasttext模型具有十分簡單的網絡結構。
② 使用fasttext模型訓練詞向量時使用層次softmax結構, 來提升超多類別下的模型性能。
③ 由于fasttext模型過于簡單無法捕捉詞序特征, 因此會進行n-gram特征提取以彌補模型缺陷提升精度。
3.安裝方法
pip install fasttext
三、fasttext文本分類
1.文本分類介紹
概念:文本分類的是將文檔(例如電子郵件,帖子,文本消息,產品評論等)分配給一個或多個類別. 當今文本分類的實現多是使用機器學習方法從訓練數據中提取分類規則以進行分類, 因此構建文本分類器需要帶標簽的數據。
2.文本分類種類
① 二分類
文本被分類兩個類別中, 往往這兩個類別是對立面。
二分類中輸出層神經元有兩種情況:
Ⅰ:只有一個神經元:該情況使用sigmoid激活函數;輸出一個0到1范圍的值,根據輸出值是否大于0.5,預測正反類,當大于等于0.5是預測為正類,反之為反類;交叉熵損失函數使用二分類交叉熵,形式為
?[y log( p )+(1?y)log(1?p)],其中y是真實值標簽(0或1),p是模型預測的屬于正類的概率。
Ⅱ:使用兩個神經元:通常使用Softmax函數;輸出兩個加和為1的概率,取最大的概率作為預測結果;交叉熵損失函數使用多分類交叉熵,
其中yi是真實標簽的one-hot編碼,pi是模型預測的對應類別的概率。
② 單標簽多分類
文本被分到多個類別中, 且每條文本只能屬于某一個類別(即一個標簽)。
③ 多標簽多分類
文本被分到多個類別中, 但每條文本可以屬于多個類別(即多個標簽)。
3.Fasttext模型架構
FastText 模型架構和 Word2Vec 中的 CBOW 模型很類似,,不同之處在于,FastText 預測標簽, 而 CBOW 模型預測中間詞。
模型架構分為三層:
輸入層: 是對文檔embedding之后的向量, 包含N-gram特征
隱藏層: 是對輸入數據的求和平均
輸出層: 是文檔對應的label
4.文本分類的過程
第一步: 獲取數據
第二步: 訓練集與驗證集的劃分
第三步: 訓練模型
import fasttext
# 對分割好的訓練集進行訓練
model = fasttext.train_supervised('./fasttext_data/cooking.train')
第四步: 使用模型進行預測并評估
result1 = model.predict("Which baking dish is best to bake a banana bread ?")
print(result1)
valid_result = model.test('./fasttext_data/cooking.valid')
print(f'valid_result--》{valid_result}')
第五步: 模型調優
第六步: 模型保存與重加載
# 1.清洗數據后,再進行訓練和驗證
def dm01_clearn_data():model = fasttext.train_supervised('./fasttext_data/cooking_pre_train.txt')valid_result = model.test('./fasttext_data/cooking_pre_valid.txt')print(f'清洗數據后,valid_result--》{valid_result}')# 2 : 增加訓練輪次
def dm02_add_epoch():model = fasttext.train_supervised('./fasttext_data/cooking_pre_train.txt', epoch=25)valid_result = model.test('./fasttext_data/cooking_pre_valid.txt')print(f'增加訓練輪次后,valid_result--》{valid_result}')# 3: 改變學習率
def dm03_change_lr():model = fasttext.train_supervised('./fasttext_data/cooking_pre_train.txt', epoch=25, lr=1.0)valid_result = model.test('./fasttext_data/cooking_pre_valid.txt')print(f'改變學習率后,valid_result--》{valid_result}')# 4: 添加ngram
def dm04_add_ngram():model = fasttext.train_supervised('./fasttext_data/cooking_pre_train.txt', epoch=25, lr=1.0, wordNgrams=2)valid_result = model.test('./fasttext_data/cooking_pre_valid.txt')print(f'添加ngram后,valid_result--》{valid_result}')# 5: 改變loss-->層次softmax
def dm05_change_loss():model = fasttext.train_supervised('./fasttext_data/cooking_pre_train.txt', epoch=25, lr=1.0, wordNgrams=2,loss='hs')valid_result = model.test('./fasttext_data/cooking_pre_valid.txt')print(f'改變loss-->層次softmax后,valid_result--》{valid_result}')# 6:自動尋找最優超參數
def dm06_auto_find_best_param():model = fasttext.train_supervised('./fasttext_data/cooking_pre_train.txt',autotuneValidationFile='./fasttext_data/cooking_pre_valid.txt',autotuneDuration=60)valid_result = model.test('./fasttext_data/cooking_pre_valid.txt')print(f'自動模型超參數調優之后的模型表現--》{valid_result}')
# 7. 多標簽多分類變成多個二分類
def dm07_ova():model = fasttext.train_supervised('./fasttext_data/cooking_pre_train.txt', epoch=50, lr=0.2, wordNgrams=2, loss='ova')# 在驗證集上查看模型的表現valid_result = model.test('./fasttext_data/cooking_pre_valid.txt')print(f'修改成ova之后的模型表現--》{valid_result}') # 模型的保存:model.save_model('cooking_model1.bin')# 模型重加載model = fasttext.load_model('cooking_model1.bin')result1 = model.predict("Why not put knives in the dishwasher?", threshold=0.001, k=-1)print(f'result1--》{result1}')
四、NLP中的常用預訓練模型
當下NLP中流行的預訓練模型: BERT、GPT 、GPT-2 、Transformer-XL 、XLNet 、RoBERTa 、DistilBERT、 ALBERT。
上述預訓練模型及其變體都是以transformer為基礎,只是在模型結構如神經元連接方式,編碼器隱層數,多頭注意力的頭數等發生改變,這些改變方式的大部分依據都是由在標準數據集上的表現而定。
1.BERT及其變體
· bert-base-uncased: 編碼器具有12個隱層, 輸出768維張量, 12個自注意力頭, 共110M參數量, 在小寫的英文文本上進行訓練而得到。
· bert-large-uncased: 編碼器具有24個隱層, 輸出1024維張量, 16個自注意力頭, 共340M參數量, 在小寫的英文文本上進行訓練而得到。
· bert-base-cased: 編碼器具有12個隱層, 輸出768維張量, 12個自注意力頭, 共110M參數量, 在不區分大小寫的英文文本上進行訓練而得到。
· bert-large-cased: 編碼器具有24個隱層, 輸出1024維張量, 16個自注意力頭, 共340M參數量, 在不區分大小寫的英文文本上進行訓練而得到。
· bert-base-multilingual-uncased: 編碼器具有12個隱層, 輸出768維張量, 12個自注意力頭, 共110M參數量, 在小寫的102種語言文本上進行訓練而得到。
· bert-large-multilingual-uncased: 編碼器具有24個隱層, 輸出1024維張量, 16個自注意力頭, 共340M參數量, 在小寫的102種語言文本上進行訓練而得到。
· bert-base-chinese: 編碼器具有12個隱層, 輸出768維張量, 12個自注意力頭, 共110M參數量, 在簡體和繁體中文文本上進行訓練而得到。
2.GPT/GPT-2
· openai-gpt: 解碼器具有12個隱層, 輸出768維張量, 12個自注意力頭, 共110M參數量, 由OpenAI在英文語料上進行訓練而得到。
· gpt2: 解碼器具有12個隱層, 輸出768維張量, 12個自注意力頭, 共117M參數量, 在OpenAI GPT-2英文語料上進行訓練而得到。
3.Transformer-XL
· transfo-xl-wt103: 編碼器具有18個隱層, 輸出1024維張量, 16個自注意力頭, 共257M參數量, 在wikitext-103英文語料進行訓練而得到。
4.XLNet及其變體
· xlnet-base-cased: 編碼器具有12個隱層, 輸出768維張量, 12個自注意力頭, 共110M參數量, 在英文語料上進行訓練而得到。
· xlnet-large-cased: 編碼器具有24個隱層, 輸出1024維張量, 16個自注意力頭, 共340參數量, 在英文語料上進行訓練而得到。
5.RoBERTa及其變體
· roberta-base: 編碼器具有12個隱層, 輸出768維張量, 12個自注意力頭, 共125M參數量, 在英文文本上進行訓練而得到。
· roberta-large: 編碼器具有24個隱層, 輸出1024維張量, 16個自注意力頭, 共355M參數量, 在英文文本上進行訓練而得到。
6.DistilBERT及其變體
· distilbert-base-uncased: 基于bert-base-uncased的蒸餾(壓縮)模型, 編碼器具有6個隱層, 輸出768維張量, 12個自注意力頭, 共66M參數量。
· distilbert-base-multilingual-cased: 基于bert-base-multilingual-uncased的蒸餾(壓縮)模型, 編碼器具有6個隱層, 輸出768維張量, 12個自注意力頭, 共66M參數量。
7.ALBERT
· albert-base-v1: 編碼器具有12個隱層, 輸出768維張量, 12個自注意力頭, 共125M參數量, 在英文文本上進行訓練而得到。
· albert-base-v2: 編碼器具有12個隱層, 輸出768維張量, 12個自注意力頭, 共125M參數量, 在英文文本上進行訓練而得到, 相比v1使用了更多的數據量, 花費更長的訓練時間。
五、Transformers庫使用
1.Transformers庫介紹
Huggingface Transformers 是基于一個開源基于 transformer 模型結構提供的預訓練語言庫。它支持 Pytorch,Tensorflow2.0,并且支持兩個框架的相互轉換。Transformers 提供了NLP領域大量state-of-art的 預訓練語言模型結構的模型和調用框架。
框架支持了最新的各種NLP預訓練語言模型,使用者可快速的進行模型調用,并且支持模型further pretraining 和 下游任務fine-tuning。
2.Transformers庫三層應用結構
· 管道(Pipline)方式:高度集成的極簡使用方式,只需要幾行代碼即可實現一個NLP任務。
· 自動模型(AutoMode)方式:可載入并使用BERTology系列模型。
· 具體模型(SpecificModel)方式:在使用時,需要明確指定具體的模型,并按照每個BERTology系列模型中的特定參數進行調用,該方式相對復雜,但具有較高的靈活度。
自定義下游任務網絡模型的作用和實現方式: