NLP——迁移学习
一、迁移学习的概念
1.预训练模型(Pretrained model)
定义: 简单来说别人训练好的模型。一般预训练模型具备复杂的网络模型结构;一般是在大量的语料下训练完成的。
2.微调(Fine-tuning)
定义:一般是对预训练语言模型,进行垂直领域数据的微调,可以将预训练模型的参数全部微调或者部分微调或者不微调,但是一般我们在做任务的时候,会在预训练模型后加入自定义网络,自定义网络模型的参数需要训练。
3.迁移学习的两种方式
① 开箱即用: 当预训练模型的任务和我们要做的任务相似时,可以直接使用预训练模型来解决对应的任务。
② 微调: 进行垂直领域数据的微调,一般在预训练网络模型后,加入自定义网络,自定义网络模型的参数需要训练,但是预训练模型的参数可以全部微调或者部分微调或者不微调。
二、fasttaxt工具介绍
1.作用
作为NLP工程领域常用的工具包, fasttext有两大作用:
① 进行文本分类
② 训练词向量
2.fasttext工具包的优势
在保持较高精度的情况下, 能够快速的进行训练和预测。
原因:
① fasttext工具包中内含的fasttext模型具有十分简单的网络结构。
② 使用fasttext模型训练词向量时使用层次softmax结构, 来提升超多类别下的模型性能。
③ 由于fasttext模型过于简单无法捕捉词序特征, 因此会进行n-gram特征提取以弥补模型缺陷提升精度。
3.安装方法
pip install fasttext
三、fasttext文本分类
1.文本分类介绍
概念:文本分类的是将文档(例如电子邮件,帖子,文本消息,产品评论等)分配给一个或多个类别. 当今文本分类的实现多是使用机器学习方法从训练数据中提取分类规则以进行分类, 因此构建文本分类器需要带标签的数据。
2.文本分类种类
① 二分类
文本被分类两个类别中, 往往这两个类别是对立面。
二分类中输出层神经元有两种情况:
Ⅰ:只有一个神经元:该情况使用sigmoid激活函数;输出一个0到1范围的值,根据输出值是否大于0.5,预测正反类,当大于等于0.5是预测为正类,反之为反类;交叉熵损失函数使用二分类交叉熵,形式为
−[y log( p )+(1−y)log(1−p)],其中y是真实值标签(0或1),p是模型预测的属于正类的概率。
Ⅱ:使用两个神经元:通常使用Softmax函数;输出两个加和为1的概率,取最大的概率作为预测结果;交叉熵损失函数使用多分类交叉熵,
其中yi是真实标签的one-hot编码,pi是模型预测的对应类别的概率。
② 单标签多分类
文本被分到多个类别中, 且每条文本只能属于某一个类别(即一个标签)。
③ 多标签多分类
文本被分到多个类别中, 但每条文本可以属于多个类别(即多个标签)。
3.Fasttext模型架构
FastText 模型架构和 Word2Vec 中的 CBOW 模型很类似,,不同之处在于,FastText 预测标签, 而 CBOW 模型预测中间词。
模型架构分为三层:
输入层: 是对文档embedding之后的向量, 包含N-gram特征
隐藏层: 是对输入数据的求和平均
输出层: 是文档对应的label
4.文本分类的过程
第一步: 获取数据
第二步: 训练集与验证集的划分
第三步: 训练模型
import fasttext
# 对分割好的训练集进行训练
model = fasttext.train_supervised('./fasttext_data/cooking.train')
第四步: 使用模型进行预测并评估
result1 = model.predict("Which baking dish is best to bake a banana bread ?")
print(result1)
valid_result = model.test('./fasttext_data/cooking.valid')
print(f'valid_result--》{valid_result}')
第五步: 模型调优
第六步: 模型保存与重加载
# 1.清洗数据后,再进行训练和验证
def dm01_clearn_data():model = fasttext.train_supervised('./fasttext_data/cooking_pre_train.txt')valid_result = model.test('./fasttext_data/cooking_pre_valid.txt')print(f'清洗数据后,valid_result--》{valid_result}')# 2 : 增加训练轮次
def dm02_add_epoch():model = fasttext.train_supervised('./fasttext_data/cooking_pre_train.txt', epoch=25)valid_result = model.test('./fasttext_data/cooking_pre_valid.txt')print(f'增加训练轮次后,valid_result--》{valid_result}')# 3: 改变学习率
def dm03_change_lr():model = fasttext.train_supervised('./fasttext_data/cooking_pre_train.txt', epoch=25, lr=1.0)valid_result = model.test('./fasttext_data/cooking_pre_valid.txt')print(f'改变学习率后,valid_result--》{valid_result}')# 4: 添加ngram
def dm04_add_ngram():model = fasttext.train_supervised('./fasttext_data/cooking_pre_train.txt', epoch=25, lr=1.0, wordNgrams=2)valid_result = model.test('./fasttext_data/cooking_pre_valid.txt')print(f'添加ngram后,valid_result--》{valid_result}')# 5: 改变loss-->层次softmax
def dm05_change_loss():model = fasttext.train_supervised('./fasttext_data/cooking_pre_train.txt', epoch=25, lr=1.0, wordNgrams=2,loss='hs')valid_result = model.test('./fasttext_data/cooking_pre_valid.txt')print(f'改变loss-->层次softmax后,valid_result--》{valid_result}')# 6:自动寻找最优超参数
def dm06_auto_find_best_param():model = fasttext.train_supervised('./fasttext_data/cooking_pre_train.txt',autotuneValidationFile='./fasttext_data/cooking_pre_valid.txt',autotuneDuration=60)valid_result = model.test('./fasttext_data/cooking_pre_valid.txt')print(f'自动模型超参数调优之后的模型表现--》{valid_result}')
# 7. 多标签多分类变成多个二分类
def dm07_ova():model = fasttext.train_supervised('./fasttext_data/cooking_pre_train.txt', epoch=50, lr=0.2, wordNgrams=2, loss='ova')# 在验证集上查看模型的表现valid_result = model.test('./fasttext_data/cooking_pre_valid.txt')print(f'修改成ova之后的模型表现--》{valid_result}') # 模型的保存:model.save_model('cooking_model1.bin')# 模型重加载model = fasttext.load_model('cooking_model1.bin')result1 = model.predict("Why not put knives in the dishwasher?", threshold=0.001, k=-1)print(f'result1--》{result1}')
四、NLP中的常用预训练模型
当下NLP中流行的预训练模型: BERT、GPT 、GPT-2 、Transformer-XL 、XLNet 、RoBERTa 、DistilBERT、 ALBERT。
上述预训练模型及其变体都是以transformer为基础,只是在模型结构如神经元连接方式,编码器隐层数,多头注意力的头数等发生改变,这些改变方式的大部分依据都是由在标准数据集上的表现而定。
1.BERT及其变体
· bert-base-uncased: 编码器具有12个隐层, 输出768维张量, 12个自注意力头, 共110M参数量, 在小写的英文文本上进行训练而得到。
· bert-large-uncased: 编码器具有24个隐层, 输出1024维张量, 16个自注意力头, 共340M参数量, 在小写的英文文本上进行训练而得到。
· bert-base-cased: 编码器具有12个隐层, 输出768维张量, 12个自注意力头, 共110M参数量, 在不区分大小写的英文文本上进行训练而得到。
· bert-large-cased: 编码器具有24个隐层, 输出1024维张量, 16个自注意力头, 共340M参数量, 在不区分大小写的英文文本上进行训练而得到。
· bert-base-multilingual-uncased: 编码器具有12个隐层, 输出768维张量, 12个自注意力头, 共110M参数量, 在小写的102种语言文本上进行训练而得到。
· bert-large-multilingual-uncased: 编码器具有24个隐层, 输出1024维张量, 16个自注意力头, 共340M参数量, 在小写的102种语言文本上进行训练而得到。
· bert-base-chinese: 编码器具有12个隐层, 输出768维张量, 12个自注意力头, 共110M参数量, 在简体和繁体中文文本上进行训练而得到。
2.GPT/GPT-2
· openai-gpt: 解码器具有12个隐层, 输出768维张量, 12个自注意力头, 共110M参数量, 由OpenAI在英文语料上进行训练而得到。
· gpt2: 解码器具有12个隐层, 输出768维张量, 12个自注意力头, 共117M参数量, 在OpenAI GPT-2英文语料上进行训练而得到。
3.Transformer-XL
· transfo-xl-wt103: 编码器具有18个隐层, 输出1024维张量, 16个自注意力头, 共257M参数量, 在wikitext-103英文语料进行训练而得到。
4.XLNet及其变体
· xlnet-base-cased: 编码器具有12个隐层, 输出768维张量, 12个自注意力头, 共110M参数量, 在英文语料上进行训练而得到。
· xlnet-large-cased: 编码器具有24个隐层, 输出1024维张量, 16个自注意力头, 共340参数量, 在英文语料上进行训练而得到。
5.RoBERTa及其变体
· roberta-base: 编码器具有12个隐层, 输出768维张量, 12个自注意力头, 共125M参数量, 在英文文本上进行训练而得到。
· roberta-large: 编码器具有24个隐层, 输出1024维张量, 16个自注意力头, 共355M参数量, 在英文文本上进行训练而得到。
6.DistilBERT及其变体
· distilbert-base-uncased: 基于bert-base-uncased的蒸馏(压缩)模型, 编码器具有6个隐层, 输出768维张量, 12个自注意力头, 共66M参数量。
· distilbert-base-multilingual-cased: 基于bert-base-multilingual-uncased的蒸馏(压缩)模型, 编码器具有6个隐层, 输出768维张量, 12个自注意力头, 共66M参数量。
7.ALBERT
· albert-base-v1: 编码器具有12个隐层, 输出768维张量, 12个自注意力头, 共125M参数量, 在英文文本上进行训练而得到。
· albert-base-v2: 编码器具有12个隐层, 输出768维张量, 12个自注意力头, 共125M参数量, 在英文文本上进行训练而得到, 相比v1使用了更多的数据量, 花费更长的训练时间。
五、Transformers库使用
1.Transformers库介绍
Huggingface Transformers 是基于一个开源基于 transformer 模型结构提供的预训练语言库。它支持 Pytorch,Tensorflow2.0,并且支持两个框架的相互转换。Transformers 提供了NLP领域大量state-of-art的 预训练语言模型结构的模型和调用框架。
框架支持了最新的各种NLP预训练语言模型,使用者可快速的进行模型调用,并且支持模型further pretraining 和 下游任务fine-tuning。
2.Transformers库三层应用结构
· 管道(Pipline)方式:高度集成的极简使用方式,只需要几行代码即可实现一个NLP任务。
· 自动模型(AutoMode)方式:可载入并使用BERTology系列模型。
· 具体模型(SpecificModel)方式:在使用时,需要明确指定具体的模型,并按照每个BERTology系列模型中的特定参数进行调用,该方式相对复杂,但具有较高的灵活度。
自定义下游任务网络模型的作用和实现方式: