优雅の使用transformer系列之text-classification

前言

 自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,并且提供了一个代码实现,写这个的时候也是踩过不少坑,说多了也是泪,希望大家玩的开心吧。

你可能感兴趣的:(优雅の使用transformer系列之text-classification)