Transformer经典案例
1、语言模型
以一个符合语言规律的序列为输入,模型将利用序列间关系等特征,输出在一个在所有词汇上的概率分布,这样的模型称为语言模型。
2、语言模型能解决的问题
根据语言模型定义,可以在它的基础上完成机器翻译,文本生成等任务,因为我们通过最后输出的概率分布来预测下一个词汇是什么
语言模型可以判断输入的序列是否为一句完整的话,因为我们可以根据输出的概率分布查看最大概率是否落在句子结束符上,来判断完整性
语言模型本身的训练目标是预测下一个词,因为它的特征提取部分会抽象很多语言序列之间的关系,这些关系可能同样对其它语言类任务有效果。因此可以作为预训练模型进行迁移学习
3、模型实现步骤
1、导包
2、导入wikiText-2数据集并作基本处理
3、构建用于模型输入的批次化数据
4、构建训练和评估函数
5、进行训练和评估(包括验证以及测试)
4、数据准备
wikiText-2数据集体量中等,训练集共有600篇文章,共208万左右词汇,在33278个不重复词汇,OVV(有多少正常英文词汇不在该数据集中的占比)为2.6%。验证集和测试集均为60篇。
torchtext重要功能
对文本数据进行处理,比如文本语料加载,文本迭代器构建等。
包含很多经典文本语料的预加载方法。其中包括的语料有:用于情感分析的SST和IMDB,用于问题分类TREC,用于及其翻译的WMT14,IWSLT,以及用于语言模型任务wikiText-2
# 1、导包
import math
import torch
import torch.nn as nn
import torch.nn.functional as F
#英文文本数据集工具包
import torchtext
#导入英文分词工具
#from torchtext.legacy.data import Field
from torchtext.data.utils import get_tokenizer
#from torchtext.legacy.data import *
#导入已经构建完成的Transformer包
from pyitcast.transformer import TransformerModel
import torch
import torchtext
from torchtext.legacy.data import Field,TabularDataset,Iterator,BucketIterator
TEXT=torchtext.data.Field(tokenize=get_tokenizer("basic_english"),
init_token ='<sos>',
eos_token ='<eos>',
lower = True)
print(TEXT)
# 2、导入wikiText-2数据集并作基本处理
train_txt,val_txt,test_txt = torchtext.datasets.WikiText2.splits(TEXT)
print(test_txt.examples[0].text[:10])
#将训练集文本数据构建一个vocab对象,可以使用vocab对象的stoi方法统计文本共包含的不重复的词汇总数
TEXT.build_vocab(train_txt)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
# 3、构建用于模型输入的批次化数据
def batchify(data,batch_size):
#data,之前得到的文本数据
# bsz,批次的样本量
#第一步使用TEXT的numericalize方法将单词映射成对应的联系数字
data = TEXT.numericaliz