前言
?自bert問世之后,如今的NLP行業(yè)無論是研究、賽事還是工程上赛惩,都會優(yōu)先使用bert及其衍生模型進行遷移學習墓毒。當然我也不例外别威。但是怎樣使用bert相關(guān)的東西才算優(yōu)雅呢,這是個難題。
?最早之前我使用過bert-as-service,純將bert變成一個獲取feature的服務來使用歉提。后面接觸和使用過CyberZHG大佬的keras-bert,以及基于keras-bert實現(xiàn)的kashgari区转。再到后面也使用過蘇劍林大佬的bert4keras苔巨。但總覺得不夠好,可能是我理解不夠通透的緣故吧废离。
?直到最近正兒八經(jīng)地使用過huggingface的transformers侄泽,并結(jié)合了pytorch-lightning,瞬間感覺真香??蜻韭。從開源角度來說悼尾,huggingface的transformers會更好柿扣,因為contributors更多,社區(qū)更活躍诀豁,所以算是入坑了??
Text-Classification
?代碼傳送門:bert4pl
?Text-Classification的算法實現(xiàn)比較簡單窄刘,首先經(jīng)過bert的encoder之后取output第一維度的值也就是[CLS]的向量,[CLS]代表著這句話的句向量舷胜,然后接一個dropout層和一個全連接層,損失函數(shù)是交叉熵損失函數(shù)(CrossEntropyLoss)活翩。所以本文就展示下如何優(yōu)雅の實現(xiàn)text-classification這個功能烹骨。
Pytorch-Lightning
?pytorch-lightning的優(yōu)勢很多,它重構(gòu)了你的pytorch代碼材泄,抽出了復雜重復的部分沮焕,讓你專注于核心的構(gòu)建,讓你實驗更簡便快速拉宗,讓你部署訓練遷移更簡便峦树。
?其實關(guān)于pytorch-lightning網(wǎng)上的文章很多,這里我列一下我認為比較重要的點旦事,就是需要理解pytorch-lightning的生命周期魁巩,只有理解了這個你才能避免不少坑,因為這些坑我剛好踩過姐浮。
- 首先是準備工作谷遂,這部分代碼只會執(zhí)行一次。
1. __init__ (初始化LightningModule)
2. prepare_data() (準備數(shù)據(jù)卖鲤,預處理數(shù)據(jù))
3. configure_optimizers() (配置優(yōu)化器)
- 加載dataloader肾扰,包括訓練和驗證數(shù)據(jù)(這個可以沒有)
1. train_dataloader()
2. val_dataloader()
- 循環(huán)訓練與驗證
1. training_step()
2. validation_step()
3. validation_epoch_end()
- 最后訓練完了,如果需要測試需要手動調(diào)用
.test()
1. test_dataloader()
2. test_step()
3. test_epoch_end()
?至此結(jié)束蛋逾,是不是特別一目了然和優(yōu)雅集晚。pytorch-lightning還擁有很多高級用法,比如:設置Checkpointing区匣、分布式訓練偷拔、混合精度訓練、單多GPU訓練沉颂、快速調(diào)試驗證条摸、參數(shù)快照、日志功能铸屉、使用tensorboard等等的用法钉蒲。
結(jié)束語
?本身text-classification沒太多需要擴展說的,所以本文只是安利大家transformer以及pytorch-lightning彻坛,并且提供了一個代碼實現(xiàn)顷啼,寫這個的時候也是踩過不少坑踏枣,說多了也是淚,希望大家玩的開心吧钙蒙。