李宏毅深度学习2021春p5-9:神经网络训练技巧
李宏毅深度学习2021春p5-9:神经网络训练技巧
训练遇到的问题
参数不断的更新,training loss一开始下降,然后不会再下降,但距离0还有很远的gap;
一开始model就train不起来,不管怎么update参数,loss一直比较大。
导致上述问题的原因可能有很多,我们先回忆一下梯度下降算法在现实世界中面临的挑战:
问题1:局部最优(Stuck at local minima)
问题2:等于0(Stuck at saddle point)
问题3:趋近于0(Very slow at the plateau)
像这种gradient为0的点,统称critical point,我们先从问题1和问题2来看看如何“炼丹”。
局部最小值local minima和鞍点saddle point
Critical Point
gradient为0的点。
local minima
现在所在的位置已经是局部loss最低的点,往四周走 loss都会比较高,可能没有路可以走。
saddle point
saddle point从某个方向还 ...
BERT实战——(7)生成任务-语言模型
BERT实战——(7)生成任务-语言模型
引言
之前的分别介绍了使用 🤗 Transformers代码库中的模型开展one-class任务(文本分类、多选问答问题)、class for each token任务(序列标注)、copy from input任务(抽取式问答)以及general sequence任务(机器翻译、摘要抽取)。
这一篇将介绍如何使用语言模型任务微调 🤗 Transformers模型(关于什么是语言模型,回看之前的博客-语言模型)。
任务介绍
我们这里主要完成两类语言建模任务:
因果语言模型(Causal language modeling,CLM):模型需要预测句子中的下一位置处的字符(类似BERT类模型的decoder和GPT,从左往右输入字符)。模型会使用矩阵对角线attention mask机制防止模型提前看到答案。例如,当模型试图预测句子中的\(i+1\)位置处的字符时,这个掩码将阻止它访问\(i\)位置之后的字符。
掩码语言建模(Masked language modeling,MLM):模型需要恢复输入中被& ...
BERT实战——(6)生成任务-摘要生成
BERT实战——(6)生成任务-摘要生成
引言
这一篇将介绍如何使用 🤗 Transformers代码库中的模型来解决生成任务中的摘要生成问题。
任务介绍
摘要生成,用一些精炼的话(摘要)来概括整片文章的大意,用户通过读文摘就可以了解到原文要表达。
主要分为以下几个部分:
数据加载;
数据预处理;
微调预训练模型:使用transformer中的Seq2SeqTrainer接口对预训练模型进行微调(注意这里是Seq2SeqTrainer接口,之前的任务都是调用Trainer接口)。
前期准备
安装以下库:
pip install datasets transformers rouge-score nltk#transformers==4.9.2#datasets==1.11.0#rouge-score==0.0.4#nltk==3.6.2
数据加载
数据集介绍
我们使用XSum dataset数据集,其中包含了多篇BBC的文章和一句对应的摘要。
加载数据
该数据的加载方式在transformers库中进行了封装,我们可以通过以下语句进行数据加载: ...
BERT实战——(5)生成任务-机器翻译
BERT实战——(5)生成任务-机器翻译
引言
之前的分别介绍了使用 🤗 Transformers代码库中的模型开展one-class任务(文本分类、多选问答问题)、class for each token任务(序列标注)以及copy from input任务(抽取式问答)。
这一篇以及下一篇将介绍如何使用 🤗 Transformers代码库中的模型来解决general sequence任务(关于什么是生成序列任务,回看之前的博客,定位词:general sequence)。这一篇为解决生成任务中的机器翻译问题。
任务介绍
翻译任务,把一种语言信息转变成另一种语言信息。是典型的seq2seq任务,输入为一个序列,输出为不固定长度(由机器自行学习生成的序列应该多长)的序列。
比如输入一句中文,翻译为英文:
输入:我爱中国。输出:I love China.
主要分为以下几个部分:
数据加载;
数据预处理;
微调预训练模型:使用transformer中的Seq2SeqTrainer接口对预训练模型进行微调(注意这里是Seq2SeqTrainer接口,之前的任务都 ...
BERT实战——(4)问答任务-抽取式问答
BERT实战——(4)问答任务-抽取式问答
引言
我们将展示如何使用 🤗 Transformers代码库中的模型来解决问答任务中的机器问答任务。
任务介绍
注意我们这里主要解决的是抽取式问答任务:给定一个问题和一段文本,从这段文本中找出能回答该问题的文本片段(span)。抽取式问答任务是从文本中抽取答案,并不是直接生成答案。
比如:
输入: 问题:我家在哪里? 文本:我的家在东北。输出:东北
这在之前的博客【定位词:copy from input】中有详细介绍,这里简单复习一下,就是需要对每个token进行分类,看token是不是答案文本片段的start或是end。
主要分为以下几个部分:
数据加载
数据预处理
微调预训练模型:使用transformer中的Trainer接口对预训练模型进行微调;
模型评估。
前期准备
安装以下库:
pip install datasets transformers#transformers==4.9.2#datasets==1.11.0
数据加载
数据集介绍
我们使用的数据集是SQUAD 2, ...
BERT实战——(3)问答任务-多选问答
BERT实战——(3)问答任务-多选问答
引言
我们将展示如何使用 🤗 Transformers代码库中的模型来解决问答任务中的多选问答问题。
任务介绍
虽然叫多选问答,但实际上是指给出一个问题的多个可能的答案(备选项),选出其中一个最合理的,其实类似于我们平常做的单选题。该任务的实质同样是分类任务,在多个备选项中进行二分类,找到答案。
比如输入一句话的上半句,给出几个后半句的备选项,选出哪个选项是这个上半句的后半句:
输入:("离离原上草",["天安门一游","一岁一枯荣","春风吹又生"])输出:1
主要分为以下几个部分:
数据加载
数据预处理
微调预训练模型:使用transformer中的Trainer接口对预训练模型进行微调。
前期准备
安装以下库:
pip install datasets transformers#transformers==4.9.2#datasets==1.11.0
数据加载
数据集介绍
我们使用的数据集是SWAG。SWAG是一个关于 ...
BERT实战——(2)序列标注
BERT实战——(2)序列标注
引言
我们将展示如何使用 🤗 Transformers代码库中的模型来解决序列标注任务。
任务介绍
序列标注,通常也可以看作是token级别的分类问题:对每一个token进行分类。
token级别的分类任务通常指的是为文本中的每一个token预测一个标签结果。比如命名实体识别任务:
输入:我爱北京天安门输出:O O B-LOC I-LOC B-POI B-POI I-POI
常见的token级别分类任务:
NER (Named-entity recognition 名词-实体识别) 分辨出文本中的名词和实体 (person人名, organization组织机构名, location地点名...).
POS (Part-of-speech tagging词性标注) 根据语法对token进行词性标注 (noun名词, verb动词, adjective形容词...)
Chunk (Chunking短语组块) 将同一个短语的tokens组块放在一起。
主要分为以下几个部分:
数据加载
数据预处理
微调预训练模型:使用 ...
BERT实战——(1)文本分类
BERT实战——(1)文本分类
引言
我们将展示如何使用 🤗 Transformers代码库中的模型来解决文本分类任务,任务来源于GLUE Benchmark.
任务介绍
本质就是分类问题,比如对一句话的情感极性分类(正向1或负向-1或中性0):
输入:这部电影真不错!输出:1
主要分为以下几个部分:
数据加载
数据预处理
微调预训练模型:使用transformer中的Trainer接口对预训练模型进行微调;
超参数搜索
前期准备
安装以下两个库:
pip install datasets transformers#transformers==4.9.2#datasets==1.11.0
数据加载
数据集介绍
我们使用的是GLUE榜单的数据集:
GLUE_TASKS = ["cola", "mnli", "mnli-mm", "mrpc", "qnli", "qqp", "rte", "sst2 ...
BERT相关——(8)BERT-based Model代码分析
BERT相关——(8)BERT-based Model代码分析
引言
上一篇提到如何利用BERT开展下游任务,以及fine tuning的方法。BertModel的输出了每个句子每个词的embedding,我们在Bert模型后面接上不同的任务就可以构建不同的模型。
HuggingFace的transformers库封装好了各个任务最简易的API,帮助我们快速开始。
实现了以下几个任务:
BertForPreTraining
BertForSequenceClassification
BertForMultiChoice
BertForTokenClassification
BertForQuestionAnswering
如果我们想在其中增加一些模块,比如LSTM、CRF等优化模型,我们可以仿造这些封装好的API的写法,在这篇博客的最后将总结一下如何基于Bert模型进行扩展完成NLP任务。
下面来分析各个API的源码。
BertPreTrainedModel基类
HuggingFace的transformers库中基于 BERT 的模型都是基于Bert ...
BERT相关——(7)将BERT应用到下游任务
BERT相关——(7)将BERT应用到下游任务
引言
前面两篇介绍了如何从头预训练BERT并分析了BERT模型的源码。当有一个预训练模型之后,我们得到了上下文的word embedding,假设这个模型已经理解了自然语言。接着我们想在预训练模型上面再叠一些具体NLP任务的任务层,基于这个预训练模型做一些特定的NLP任务,这一步就叫微调Fine-tune。
如何使用BERT进行下游任务呢?包括两种方法:
直接接入下游任务层;
利用少量标注数据进行fine-tune。
内容主要来自李宏毅老师的深度学习与人类语言处理课程(2020)。
直接接入下游任务层
Input
预训练模型的输入部分本身不需要修改;
当NLP任务的输入为一个句子时,不需要做没有什么特殊处理,比如句子分类、命名实体识别任务;
在一些问题上,需要输入多个句子时,需要每个句子之间加“[SEP]”分隔符后再输入给预训练模型。比如QA问题,要将问题和文章一起输入给模型,NLI自然语言推理问题,要将前提和假设一起输入给模型。
Output
输出可以分为以下四种情况:
o ...