8.1 迁移学习介绍

迁移学习

1.迁移学习理论

学习目标:

了解迁移学习中的有关概念.

掌握迁移学习的两种迁移方式.

1.1 迁移学习中的有关概念:

预训练模型

微调

微调脚本

1.2 预训练模型(Pretrained model):

一般情况下预训练模型都是大型模型,具备复杂的网络结构,众多的参数量,以及在足够大的数据集下进行训练而产生的模型. 在NLP领域,预训练模型往往是语言模型,因为语言模型的训练是无监督的,可以获得大规模语料,同时语言模型又是许多典型NLP任务的基础,如机器翻译,文本生成,阅读理解等,常见的预训练模型有BERT, GPT, roBERTa, transformer-XL等.

1.3 微调(Fine-tuning):

根据给定的预训练模型,改变它的部分参数或者为其新增部分输出结构后,通过在小部分数据集上训练,来使整个模型更好的适应特定任务.

1.4 微调脚本(Fine-tuning script):

实现微调过程的代码文件。这些脚本文件中,应包括对预训练模型的调用,对微调参数的选定以及对微调结构的更改等,同时,因为微调是一个训练过程,它同样需要一些超参数的设定,以及损失函数和优化器的选取等, 因此微调脚本往往也包含了整个迁移学习的过程.

关于微调脚本的说明:

一般情况下,微调脚本应该由不同的任务类型开发者自己编写,但是由于目前研究的NLP任务类型(分类,提取,生成)以及对应的微调输出结构都是有限的,有些微调方式已经在很多数据集上被验证是有效的,因此微调脚本也可以使用已经完成的规范脚本.

1.5 两种迁移方式:

(1)直接使用预训练模型,进行相同任务的处理,不需要调整参数或模型结构,这些模型开箱即用。但是这种情况一般只适用于普适任务, 如:fasttest工具包中预训练的词向量模型。另外,很多预训练模型开发者为了达到开箱即用的效果,将模型结构分各个部分保存为不同的预训练模型,提供对应的加载方法来完成特定目标.

(2)更加主流的迁移学习方式是发挥预训练模型特征抽象的能力,然后再通过微调的方式,通过训练更新小部分参数以此来适应不同的任务。这种迁移方式需要提供小部分的标注数据来进行监督学习.

关于迁移方式的说明:

直接使用预训练模型的方式, 已经在fasttext的词向量迁移中学习. 接下来的迁移学习实践将主要讲解通过微调的方式进行迁移学习.

2.NLP标准数据集

学习目标:

了解NLP中GLUE标准数据集合的相关知识.

掌握GLUE标准数据集合的下载方式, 数据样式及其对应的任务类型.

2.1 GLUE数据集合的介绍:

GLUE由纽约大学, 华盛顿大学, Google联合推出, 涵盖不同NLP任务类型, 截止至2020年1月其中包括11个子任务数据集, 成为衡量NLP研究发展的衡量标准.

2.2 GLUE数据集合包含以下数据集:

diagnostics数据集(官方未完善)

CoLA: 语句的语法是否正确, 二分类

SST-2: 情感分析语句积极, 消极, 二分类

MRPC: 判断句子对含义是否相同, 二分类

SST-B: 衡量句子对的相似度, 多分类/回归, 相似度评分[0.0 - 5.0]

QQP: 判断句子对是否重复性问题, 二分类

MNLI(SNLI): 判断句子对的语义信息的关系, 三分类 (蕴含, 矛盾, 不蕴含不矛盾)

QNLI(RTE, WNLI): 判断句子对是否蕴含关系, 二分类

2.3 下载GLUE数据集:

下载脚本代码:略

3. NLP中的常用预训练模型:

    BERT

    GPT

    GPT-2

    Transformer-XL

    XLNet

    XLM

    RoBERTa

    DistilBERT

    ALBERT

    T5

    XLM-RoBERTa

4. 加载和使用预训练模型:

在这里我们使用torch.hub工具进行模型的加载和使用.

这些预训练模型由世界先进的NLP研发团队huggingface提供.

加载和使用预训练模型的步骤:

第一步: 确定需要加载的预训练模型并安装依赖包.

第二步: 加载预训练模型的映射器tokenizer.

第三步: 加载带/不带头的预训练模型.

第四步: 使用模型获得输出结果.

5. 迁移学习实践:

5.1 指定任务类型的微调脚本:

huggingface研究机构向我们提供了针对GLUE数据集合任务类型的微调脚本, 这些微调脚本的核心都是微调模型的最后一个全连接层.

通过简单的参数配置来指定GLUE中存在任务类型(如: CoLA对应文本二分类, MRPC对应句子对文本二分类, STS-B对应句子对文本多分类), 以及指定需要微调的预训练模型.

huggingface研究机构向我们提供了针对GLUE数据集合任务类型的微调脚本, 这些微调脚本的核心都是微调模型的最后一个全连接层.

通过简单的参数配置来指定GLUE中存在任务类型(如: CoLA对应文本二分类, MRPC对应句子对文本二分类, STS-B对应句子对文本多分类), 以及指定需要微调的预训练模型.

5.2 指定任务类型的微调脚本使用步骤:

第一步: 下载微调脚本文件

第二步: 配置微调脚本参数 , 创建run_glue.sh文件

# 定义DATA_DIR: 微调数据所在路径, 这里我们使用glue_data中的数据作为微调数据

export DATA_DIR="../../glue_data"

# 定义SAVE_DIR: 模型的保存路径, 我们将模型保存在当前目录的bert_finetuning_test文件中

export SAVE_DIR="./bert_finetuning_test/"

# 使用python运行微调脚本

# --model_type: 选择需要微调的模型类型, 这里可以选择BERT, XLNET, XLM, roBERTa, distilBERT, ALBERT

# --model_name_or_path: 选择具体的模型或者变体, 这里是在英文语料上微调, 因此选择bert-base-uncased

# --task_name: 它将代表对应的任务类型, 如MRPC代表句子对二分类任务

# --do_train: 使用微调脚本进行训练

# --do_eval: 使用微调脚本进行验证

# --data_dir: 训练集及其验证集所在路径, 将自动寻找该路径下的train.tsv和dev.tsv作为训练集和验证集

# --max_seq_length: 输入句子的最大长度, 超过则截断, 不足则补齐

# --learning_rate: 学习率

# --num_train_epochs: 训练轮数

# --output_dir $SAVE_DIR: 训练后的模型保存路径

# --overwrite_output_dir: 再次训练时将清空之前的保存路径内容重新写入

python run_glue.py \

 --model_type BERT \ 

 --model_name_or_path bert-base-uncased \

 --task_name MRPC \ 

 --do_train \ 

 --do_eval \

 --data_dir $DATA_DIR/MRPC/ \

 --max_seq_length 128 \ 

 --learning_rate 2e-5 \ 

 --num_train_epochs 1.0 \ 

 --output_dir $SAVE_DIR \

 --overwrite_output_dir

第三步: 运行并检验效果  sh run_glue.sh(启动脚本会调用run_glue.py文件来执行微调程序。程序主要有三部分功能:加载模型,加载数据,进行微调(训练,验证,预测)。

5.3 通过微调脚本微调后模型的使用步骤:

第一步: 在https://huggingface.co/join上创建一个帐户

第二步: 在服务器终端使用transformers-cli登陆

第三步: 使用transformers-cli上传模型并查看      

# 选择正确的微调模型路径$ transformers-cli upload ./bert_finetuning_test/

# 查看上传结果$ transformers-cli ls

第四步: 使用pytorch.hub加载模型进行使用

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。