transformer初始用于自然语言处理任务而产生的,也要用于自然语言处理的任务中,下面介绍9种任务。
〇、9种任务
- 文本二分类
- 文本多标签分类
- 句子相似性识别
- 实体命名识别
- 多项选择
- 文本生成
- 文本摘要
- 文本翻译
- 抽取式问答
一、文本二分类
1.1 介绍
根据给出的文本及标签对文本进行分类。
如:
Label,Content
1,6月下旬去丹东,在携程网上预定了丹东国际酒店2天的住宿。24日傍晚抵丹东,便打车去酒店。丹东城市不大,一说国际酒店,司机都知道。酒店在一条不起眼的小街上,周围环境一般。到总台一问,接待员说没有收到携程的预定单。我给他们看了手机收到的携程确认短信,接待员说那好吧,就按携程预定价住下吧。我说,能不能给个朝鸭绿江的房间,接待查了一下电脑,说可以,不过房间小了点,我说没关系,反正一个人住。安排的是15层(接待员还真满足了客人看江的要求),进了房间,往窗外一看,蜿蜒的鸭绿江就在眼前,朝鲜一侧的房屋和农田也清晰可见,稍远处隐约可见鸭绿江桥!房间略显旧了些,但床、被还较整洁、干净。这江景房的性价比应该是超值的!想当年国际酒店在丹东大概是数一数二的,现在来看,装修上比不上新开业的,大堂不太光亮,楼层的电梯口也只开了一小部分灯光,但服务上还不错。服务员遇到客人都会问好。特别值得一提的是23楼的旋转餐厅,可以与深圳国贸和上海新锦江顶楼的旋转餐厅相比拼!毕竟是在丹东那么一个边境小城里。20元的自助早餐较丰盛,再加上可以面对鸭绿江,饱览异国风光(尽管是农田沙洲景色)。在丹东国际酒店2天的停留还是给我留下来不错的印象。
1.2 基本思路
1)pre-trained
- 确定输入文本的最大长度
- tokenizer将文本转为id,超过最大长度截断、少于最大长度pad补齐
- 使用attention_mask记录哪些是pad哪些不是,不在pad上计算attention
- 使用bert_model计算句子的pooled_output表示
2)fine-tuned
- 建立全连接层,将pooled_output计算为2个值,分别代表类别1与类别2的概率。
二、文本多标签分类
2.1 介绍
与二分类类似,根据给出的文本及标签对文本进行分类,类别较多。
如:
THUCNews是根据新浪新闻RSS订阅频道2005~2011年间的历史数据筛选过滤生成,包含74万篇新闻文档(2.19 GB),均为UTF-8纯文本格式。我们在原始新浪新闻分类体系的基础上,重新整合划分出14个候选分类类别:财经、彩票、房产、股票、家居、教育、科技、社会、时尚、时政、体育、星座、游戏、娱乐。
2.2 基本思路
使用transformer自带的AutoModelForSequenceClassification模型进行训练。查看模型的结构,可以看到最后自己带了分类器。
BertForSequenceClassification(
(bert): BertModel(
(embeddings): BertEmbeddings(
(word_embeddings): Embedding(30522, 128, padding_idx=0)
(position_embeddings): Embedding(512, 128)
(token_type_embeddings): Embedding(2, 128)
(LayerNorm): LayerNorm((128,), eps=1e-12, elementwise_affine=True)
(dropout): Dropout(p=0.1, inplace=False)
)
(encoder): BertEncoder(
(layer): ModuleList(
(0): BertLayer(
(attention): BertAttention(
(self): BertSelfAttention(
(query): Linear(in_features=128, out_features=128, bias=True)
(key): Linear(in_features=128, out_features=128, bias=True)
(value): Linear(in_features=128, out_features=128, bias=True)
(dropout): Dropout(p=0.1, inplace=False)
)
(output): BertSelfOutput(
(dense): Linear(in_features=128, out_features=128, bias=True)
(LayerNorm): LayerNorm((128,), eps=1e-12, elementwise_affine=True)
(dropout): Dropout(p=0.1, inplace=False)
)
)
(intermediate): BertIntermediate(
(dense): Linear(in_features=128, out_features=512, bias=True)
(intermediate_act_fn): GELUActivation()
)
(output): BertOutput(
(dense): Linear(in_features=512, out_features=128, bias=True)
(LayerNorm): LayerNorm((128,), eps=1e-12, elementwise_affine=True)
(dropout): Dropout(p=0.1, inplace=False)
)
)
(1): BertLayer(
(attention): BertAttention(
(self): BertSelfAttention(
(query): Linear(in_features=128, out_features=128, bias=True)
(key): Linear(in_features=128, out_features=128, bias=True)
(value): Linear(in_features=128, out_features=128, bias=True)
(dropout): Dropout(p=0.1, inplace=False)
)
(output): BertSelfOutput(
(dense): Linear(in_features=128, out_features=128, bias=True)
(LayerNorm): LayerNorm((128,), eps=1e-12, elementwise_affine=True)
(dropout): Dropout(p=0.1, inplace=False)
)
)
(intermediate): BertIntermediate(
(dense): Linear(in_features=128, out_features=512, bias=True)
(intermediate_act_fn): GELUActivation()
)
(output): BertOutput(
(dense): Linear(in_features=512, out_features=128, bias=True)
(LayerNorm): LayerNorm((128,), eps=1e-12, elementwise_affine=True)
(dropout): Dropout(p=0.1, inplace=False)
)
)
)
)
(pooler): BertPooler(
(dense): Linear(in_features=128, out_features=128, bias=True)
(activation): Tanh()
)
)
(dropout): Dropout(p=0.1, inplace=False)
(classifier): Linear(in_features=128, out_features=6, bias=True)
)
三、句子相似性识别
3.1 介绍
判断句子A与句子B是否相似。
如:
{"sentence1": "花呗分期支付的时候,明明显示了可以分期,但是为什么支付的时候,却扣全额款", "sentence2": "宝贝可用花呗分期,下单时提示支付全额,并没有提示花呗分期支付", "label": "0"}
{"sentence1": "花呗现在不能订酒店了吗", "sentence2": "花呗预定酒店服务怎么不见了", "label": "1"}
3.2 基本思路
1)pre-tuned
- 设置最大长度,为句子1 + 句子2的最大长度
- 分词tokenizer,将句子1与句子2分别放入函数,分词后的token_type_ids数组中0代表第一句、1代表第二句;句子与句子之间用[SEP]区分。
如:
['[CLS]', '今', '天', '早', '上', '9', '点', '半', '起', '床', ',', '我', '在', '学', '习', '预', '训', '练', '模', '型', '的', '使', '用', '.', '[SEP]', '啊', '哈', '哈', '哈', '哈', '啊', '哈', '.', '[SEP]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]'] - 选择模型如roberta-base
2)pre-tuned
加入分类输出层,固定Bert层,进行训练。
四、命名实体识别
4.1 介绍
将每个元素标注为“B-X”、“I-X”或者“O”。其中,“B-X”表示此元素所在的片段属于X类型并且此元素在此片段的开头,“I-X”表示此元素所在的片段属于X类型并且此元素在此片段的中间位置,“O”表示不属于任何类型。
如:
今(O)年(O)海(O)钓(O)比(O)赛(O)在(O)厦(B-LOC)门(I-LOC)市(E-LOC)与(O)金(B-LOC)门(E-LOC)之(O)间(O)的(O)海(O)域(O)举(O)行(O)。
命名实体识别类似于多分类任务,即对分词后的每个词预测类别。
4.2 基本做法
1、分词(n个词)
2、预测输出(n个词*m个类别)
五、多项选择
5.1 介绍
类似于阅读理解的多项选择题。
例如:
女: 怎么样?买到票了吗?
男: 火车站好多人啊,我排了整整一天的队,等排到我了,他们说没票了,要等过了年才有。
女: 没关系,过了年回来也是一样的。
男: 公司初六就上班了,我怕过了年来不及。要不今年您和我爸来上海过年吧?
女: 我这老胳膊老腿的不想折腾了。
男: 一点儿不折腾,等我帮你们买好票,你们直接过来就行。
Q2 男的遇到了什么困难?
A. 公司不放假
B. 过年东西贵
C. 没买到车票 ✔
D. 找不到车站
5.2 基本做法
- 构造样本集,对于Reference QA的,可以变成数据集feature: [Reference + Q + A1, Reference + Q + A2, Reference + Q + A3, Reference + Q + A4], lable: 0/1/2/3。
- 选取句子截断长度、分词等
- 选择AutoModelForMultipleChoice的模型进行训练
六、文本生成
6.1 介绍
文本生成可以包含很多子任务,但代表性的就是让机器写文章,在工业上并不好套用。
6.2 基本做法
- 分词
- 预测下一个词(分类)
- 分词
- 预测下一个词(分类)
...
七、文本摘要
7.1 介绍
摘要是一个经典的序列到序列(seq2seq)任务,有一个输入文本和一个目标文本。
图片来源:NLP知识普及 —— Encoder-Decoder 和 Seq2Seq
7.2 基本做法
- Encoder端为原文,Decoder端会构造很多样本,如:
步骤 | Decoder输入 | 输出 |
---|---|---|
1 | [SOS] | Knowledge |
2 | [SOS] Knowledge | is |
2 | [SOS] Knowledge is | power |
2 | [SOS] Knowledge is power | [EOS] |
- 训练
使用AutoModelForSeq2SeqLM模型训练,使用DataCollatorForSeq2Seq构造样本。因为构造出很多样本,所以训练集特别大。
八、文本翻译
与七、文本摘要类似
九、问答
9.1 介绍
问答与阅读理解的多项选择类似,但是没有固定选项。问答阅读理解的一般任务形式为:给定一段或多段文本作为数据来源, 输入问题,经过处理后输出一段文本作为问题的答案。依据答案是否直接来自文本,可将阅读理解划分为抽取式阅读理解与生成式阅读理解。
抽取式问答模型通常采用纯 Encoder 框架(例如 BERT),它更适用于处理事实性问题,例如“谁发明了 Transformer 架构?”;而生成式问答模型则通常采用 Encoder-Decoder 框架(例如 T5、BART),它更适用于处理开放式问题,例如“天空为什么是蓝色的?”。
抽取式的做法
抽取句子中的词作为答案,所以是分类任务,求取start_index与end_index。
9.2 基本做法
- 构造样本
input: [CLS] question [SEP] context [SEP]
output: start_index, end_index - 分词
- 训练