前言
?自bert問世之后,如今的NLP行業無論是研究、賽事還是工程上,都會優先使用bert及其衍生模型進行遷移學習。當然我也不例外。但是怎樣使用bert相關的東西才算優雅呢,這是個難題。
?最早之前我使用過bert-as-service,純將bert變成一個獲取feature的服務來使用。后面接觸和使用過CyberZHG大佬的keras-bert,以及基于keras-bert實現的kashgari。再到后面也使用過蘇劍林大佬的bert4keras。但總覺得不夠好,可能是我理解不夠通透的緣故吧。
?直到最近正兒八經地使用過huggingface的transformers,并結合了pytorch-lightning,瞬間感覺真香??。從開源角度來說,huggingface的transformers會更好,因為contributors更多,社區更活躍,所以算是入坑了??
Text-Classification
?代碼傳送門:bert4pl
?Text-Classification的算法實現比較簡單,首先經過bert的encoder之后取output第一維度的值也就是[CLS]的向量,[CLS]代表著這句話的句向量,然后接一個dropout層和一個全連接層,損失函數是交叉熵損失函數(CrossEntropyLoss)。所以本文就展示下如何優雅の實現text-classification這個功能。
Pytorch-Lightning
?pytorch-lightning的優勢很多,它重構了你的pytorch代碼,抽出了復雜重復的部分,讓你專注于核心的構建,讓你實驗更簡便快速,讓你部署訓練遷移更簡便。
?其實關于pytorch-lightning網上的文章很多,這里我列一下我認為比較重要的點,就是需要理解pytorch-lightning的生命周期,只有理解了這個你才能避免不少坑,因為這些坑我剛好踩過。
- 首先是準備工作,這部分代碼只會執行一次。
1. __init__ (初始化LightningModule)
2. prepare_data() (準備數據,預處理數據)
3. configure_optimizers() (配置優化器)
- 加載dataloader,包括訓練和驗證數據(這個可以沒有)
1. train_dataloader()
2. val_dataloader()
- 循環訓練與驗證
1. training_step()
2. validation_step()
3. validation_epoch_end()
- 最后訓練完了,如果需要測試需要手動調用
.test()
1. test_dataloader()
2. test_step()
3. test_epoch_end()
?至此結束,是不是特別一目了然和優雅。pytorch-lightning還擁有很多高級用法,比如:設置Checkpointing、分布式訓練、混合精度訓練、單多GPU訓練、快速調試驗證、參數快照、日志功能、使用tensorboard等等的用法。
結束語
?本身text-classification沒太多需要擴展說的,所以本文只是安利大家transformer以及pytorch-lightning,并且提供了一個代碼實現,寫這個的時候也是踩過不少坑,說多了也是淚,希望大家玩的開心吧。