Update 4.0 基于Hugging Face -Transformers的预训练模型微调.md
This commit is contained in:
parent
908dcf9937
commit
480b0c80d1
|
@ -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 模型(简短)历史中的一些参考点:
|
||||

|
||||
|
@ -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这样的,模型结构就定死了。***
|
||||
|
||||
在上面的代码示例中,我们没有使用 BertConfig(BertConfig是初始化的模型,没有经过任何训练),而是通过标识符"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:以上加粗的斜体字都是笔者的注释,是对原文部分内容的解读。本教程中如果发现问题请及时反馈,谢谢。
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue