图解nlp——预训练模型做文本分类

背景

  1. 现在关于NLP的实在是太火了,各种神奇的模型,比如chatgpt,SD等。
  2. 现在大模型、预训练模型非常火爆。
  3. 其实现在的nlp技术门槛,已经非常低了,基本上你只要熟练掌握python和transfromers库的用法就行了。
  4. 我们上一期就是介绍的transformers库,然后里面有个文本分类的任务,有的读者竟然还去尝试了一下,然后发现代码没跑通(确实是我代码问题)。
  5. 其实分类这个任务,在现实生活中,也是非常常见和重要的任务。
  6. 我还发现,还有人在手写什么cnn、lstm等传统的算法,做文本分类。如果硬件资源不紧张的话,为什么不试一试大模型呢?

因此,在本文,将使用transformers库、使用大模型、做一个文本分类任务。这也只是作为一个开始,后面也会介绍更多的nlp任务。

背景2

本文虽然是介绍一个大模型做文本分类任务,难道我就是单纯的上代码?并不是

  1. 这次我加上了图解功能,通过图解,看整体的数据传递,其实更加的轻松。
  2. 本文强调一些数据细节,比如文本分类要求的数据格式到底是什么样子的?Tokenizer和模型到底是有什么功能,他们是怎么管理数据的。

背景3

  1. 其实搞nlp科学难,但是搞nlp技术不难
  2. 这些花里胡哨的算法或者模型,其实就是去看数据流流向、形式、格式就行了。然后再看代码,其实一目了然,再结合论文和公式,你发现很多算法也就那样。

那就这样,让我们进入文本分类任务中吧

1. 处理数据code_01_processdata.ipynb

数据介绍

  1. 本案例使用的是一个外卖平台的评论数据,对评论的文本做了分类(分为好评和差评)
  2. 当你把code_01_processdata.ipynb文件跑完之后,就可以看到在data_all里面有一个data,里面有三个文件,样式都是像下面这样的

图解nlp——预训练模型做文本分类_第1张图片

上图是一个batch的数据,或者所有的文本分类的数据样式:

  1. text下面的红色条,就是一个个句子。
  2. label里面有红色有绿色,就是表示标签分类。
  3. transformers包做分类的时候,数据要求就这两列。

注意点:

  1. 数据需要分为train_data.csv,test_data.csv,valid_data.csv,这三个csv文件注意是使用,分割开的。
  2. 数据不可以有缺失值
  3. 数据最好只含有两列:label,text
  • label:表示标签,最好为整型数值。0,1,2,3,4等
  • text:表示文本,(看你需求,可以有符号,也可以没有标点符号)
  1. train_data.csv,test_data.csv,valid_data.csv这三个数据里面,不要有数据相同的,不然会造成数据泄漏。

2. 训练模型code_02_trainmodel.ipynb

图解nlp——预训练模型做文本分类_第2张图片

数据训练流程

以一个batch为例:

  1. Tokenizer会将数据中的text转换成三个矩阵(或者叫三个Tensor),分别叫input_ids,token_type_ids,attention_mask,至于怎么转换的,我们先不做详细介绍(本仓库后续会介绍)。
  2. pretrained model在被加载之前,需要设置一大堆模型的参数,至于要设置什么参数,我们也不做详细介绍。
  3. Trainer就是一个训练器,也需要预先设置好一大堆参数。至于要设置什么参数,我们也不做详细介绍。
  4. Trainer会把input_ids,token_type_ids,attention_mask;还有数据自带的标签label;还有pretrained model都加载进来,进行训练;
  5. 当所有batch的数据更新完之后,最终就会生成一个模型。your new model就诞生了。
  6. 对于刚开始学习大模型做nlp分类的任务,其实不需要考虑那么多细节,只需要注意数据流程。

注意点:

  1. 这个步骤非常看显存大小。显卡显存越大越好。batch_size,eval_size大小取决于显存大小。
  2. 在实际工程中,会先使用Tokenizer把所有的文本转换成input_ids,token_type_ids,attention_mask,然后在训练的时候,这步就不再做了,目的是减少训练过程中cpu处理数据的时间,不给显卡休息时间。
  3. 在使用Tokenizer把所有的文本做转换的期间,如果设置的文本的长度上限为64,那么会把大于64的文本截断;那些少于64的文本,会在训练的时候,在喂入模型之前,把长度补齐,这么做就是为了减少数据对内存的占用。

3. 预测code_03_predict.ipynb

  1. 这个时候,就是搞个句子,然后丢给一个pipeline(这个就是把Tokenizer你的大模型放在一起了),然后这个pipeline就给你返回一个分类结果。
  2. 常见的就是使用pipeline,如果更加复杂的话,比如修改模型,这个时候,就比较复杂了(后面会再次介绍)。

4. 部署

  1. 简单的部署相对于预测,其实就是再加一层web端口,fastapi包就可以实现。
  2. 高级一点的部署相对于预测,就需要把模型从pytorch转换成onnx格式的,这样可以提高推理效率(也不一定,就是举个例子),可能也不会使用web端口(http协议)了,会使用rpc协议等方法。这部分现在先不看。

最后

  1. 代码和数据全都在中:https://github.com/yuanzhoulvpi2017/zero_nlp
  2. 后面将会添加更多任务,敬请期待~

图解nlp——预训练模型做文本分类_第3张图片

你可能感兴趣的:(nlp,自然语言处理,分类,人工智能)