Update 4.0 基于Hugging Face -Transformers的预训练模型微调.md

This commit is contained in:
老张 2021-09-12 21:40:43 +08:00 committed by GitHub
parent 908dcf9937
commit 480b0c80d1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 14 additions and 12 deletions

View File

@ -1,4 +1,4 @@
本文参考资料是[Hugging Face主页](https://huggingface.co/)Resources下的课程。在此课程基础上做了一些翻译工作,节选部分内容并注释加粗斜体加了Trainer和args主要参数介绍。感兴趣的同学可以去查看[原文](https://huggingface.co/course/chapter1)。
本文参考资料是[Hugging Face主页](https://huggingface.co/)Resources下的课程。在此课程基础上做了一些翻译工作,节选部分内容并注释(加粗斜体),加了Trainer和args主要参数介绍。感兴趣的同学可以去查看[原文](https://huggingface.co/course/chapter1)。
****
本章节主要内容包含两部分内容:
- pipeline工具演示NLP任务处理
@ -28,7 +28,7 @@
- [Dynamic padding——动态填充技术](#dynamic-padding动态填充技术)
## 1. 简介
本章节将使用 [Hugging Face 生态系统中的库](https://github.com/huggingface)——🤗 Transformers、🤗 Datasets、🤗 Tokenizers 和 🤗 Accelerate——以及 Hugging Face Hub,来进行自然语言处理工作(NLP)。
本章节将使用 [Hugging Face 生态系统中的库](https://github.com/huggingface)——🤗 Transformers来进行自然语言处理工作(NLP)。
### Transformers的历史
以下是 Transformer 模型(简短)历史中的一些参考点:
![transformers_chrono](https://img-blog.csdnimg.cn/3ba51fe4f21d4d528ca7b0f2fd78aee4.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA56We5rSb5Y2O,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
@ -48,16 +48,16 @@
- BART/T5 类Transformer-encoder-decoder模型
### Architectures和checkpoints
当我们在本课程中深入研究 Transformer 模型时您会看到架构Architectures和检查点checkpoints以及模型的提及。 这些术语的含义略有不同:
对Transformer模型的研究中会出现一些术语架构Architecture和检查点checkpoint以及Model。 这些术语的含义略有不同:
Architectures这是模型的骨架——对模型每一层的定义和模型中发生的每个操作。
Architecture:定义了模型的基本结构和基本运算
checkpoints模型的某个训练状态加载此checkpoint会加载此时的权重。训练时可以选择自动保存checkpoint
checkpoint模型的某个训练状态加载此checkpoint会加载此时的权重。训练时可以选择自动保存checkpoint
Model:这是一个总称,不像“架构”或“检查点”那样精确它可以同时表示两者。 当需要减少歧义时,本课程将指定架构或检查点。<br>
Model:这是一个总称,不像“架构”或“检查点”那样精确它可以同时表示两者。 当需要减少歧义时,本课程将指定架构或检查点。<br>
例如BERT 是一种 Architectures而 bert-base-cased谷歌团队为 BERT 的第一个版本训练的一组权重是一个checkpoints。 但是可以说“the BERT model”和“the bert-base-cased model”。
***checkpoint概念在大数据里面说的比较多。我的理解是模型在训练时可以设置自动保存于某个时间点比如模型训练了一轮epoch更新了参数将这个状态的模型保存下来为一个checkpoint。
***checkpoint概念在大数据里面说的比较多。模型在训练时可以设置自动保存于某个时间点比如模型训练了一轮epoch更新了参数将这个状态的模型保存下来为一个checkpoint。
所以每个checkpoint对应模型的一个状态一组权重。大数据中检查点是一个数据库事件存在的根本意义是减少崩溃时间。即减少因为意外情况数据库崩溃后重新恢复的时间。***
### The Inference API
[Model Hub](https://huggingface.co/models)模型中心包含多语言模型的checkpoints。您可以通过单击语言标签来优化对模型的搜索然后选择生成另一种语言文本的模型。
@ -110,7 +110,7 @@ classifier([
- zero-shot-classification零样本分类
您也可以从 Hub 中针对特定任务来选择特定模型的管道 例如,文本生成。转到 [Model Hub](https://huggingface.co/models)并单击左侧的相应标签,页面将会仅显示文本生成任务支持的模型。
(***除了模型要匹配任务,更进一步考虑的因素之一是:预训练模型训练时使用的数据集,要尽可能的接近你需要处理的任务包含的数据集,两个数据集越接近越好。我扯这么多也是想提供点思路***
(***除了模型要匹配任务,更进一步考虑的因素之一是:预训练模型训练时使用的数据集,要尽可能的接近你需要处理的任务包含的数据集,两个数据集越接近越好。***
Transformers pipeline API 可以处理不同的 NLP 任务。您可以使用完整架构,也可以仅使用编码器或解码器,具体取决于您要解决的任务类型。 下表总结了这一点:
@ -217,7 +217,7 @@ Model heads:将隐藏状态的高维向量也就是logits向量作为输
以情感分类为例我们需要一个带有序列分类的Model head能够将句子分类为正面或负面。 因此,我们实际上不会使用 AutoModel 类,而是使用 AutoModelForSequenceClassification
***也就是前面写的model = AutoModel.from_pretrained(checkpoint)并不能得到情感分类任务的结果因为没有加载Model head***
***也就是前面写的model = AutoModel.from_pretrained(checkpoint)并不能得到情感分类任务的结果因为没有加载Model head***
```python
from transformers import AutoModelForSequenceClassification
@ -639,10 +639,10 @@ Trainer 默认支持 多GPU/TPU也支持混合精度训练可以在训练
- 特征提取(预训练模型不做后续训练,不调整权重)
- 微调根据下游任务简单训练几个epoch调整预训练模型权重
某个人说的是:就像BERT论文第五部分实验写的虽然BERT做NLP任务有两种方法但是不建议不训练模型就直接输出结果来预测。而且Hugging Face的作者推荐大家使用Trainer来训练模型。
BERT论文第五部分实验写的虽然BERT做NLP任务有两种方法但是不建议不训练模型就直接输出结果来预测。而且Hugging Face的作者推荐大家使用Trainer来训练模型。
实际中,微调的效果也会明显好于特征提取(除非头铁,特征提取后面接一个很复杂的模型)。
至于为什么用Trainer,之前已经说了。Trainer是专门为Transformers写的一个PyTorch 训练和评估循环,否则就要自定义训练循环。
至于为什么用Trainer来微调,之前也已经说了:Trainer是专门为Transformers写的一个PyTorch训练和评估循环API使用相对简单一点。否则就要自定义训练循环。
这一小段是我的理解不在HF主页课程中。
@ -717,7 +717,7 @@ model = BertModel.from_pretrained("bert-base-cased")
```
正如您之前看到的,我们可以用 AutoModel 类替换 BertModel效果是一样的。后面我们会使用AutoModel类这样做的好处是设定模型结构的部分可以不影响checkpoint。如果您的代码适用于一个checkpoint那么也可以用于另一个checkpoint。甚至即使模型结构不同只要checkpoint是针对类似任务训练的也适用。
***感觉这句话意思是,使用AutoModel类传入不同的ckeckpoint就可以实现不同的模型来处理任务只要这个模型的输出可以处理此任务。如果选择BertModel这样的模型结构就定死了。***
***使用AutoModel类传入不同的ckeckpoint就可以实现不同的模型来处理任务只要这个模型的输出可以处理此任务。如果选择BertModel这样的模型结构就定死了。***
在上面的代码示例中,我们没有使用 BertConfigBertConfig是初始化的模型没有经过任何训练而是通过标识符"bert-base-cased"加载了一个预训练模型的checkpoint这个checkpoint由 BERT 的作者自己训练。您可以在其[model card](https://huggingface.co/bert-base-cased)中找到有关它的更多详细信息。
@ -767,6 +767,8 @@ batch = data_collator(samples)
'labels': torch.Size([8])}
```
Tips以上加粗的斜体字都是笔者的注释是对原文部分内容的解读。本教程中如果发现问题请及时反馈谢谢。