文本学习器

构建适用于 NLP 迁移学习的 Learner 所需的所有函数

本模块最重要的函数是 language_model_learnertext_classifier_learner。它们将帮助您使用预训练模型定义一个 Learner。请参阅 文本教程 了解使用示例。

加载预训练模型

在文本领域,加载预训练模型时,我们需要将预训练所用词汇表的 embedding 适应到当前语料库的词汇表。


源代码

match_embeds

 match_embeds (old_wgts:dict, old_vocab:list, new_vocab:list)

old_wgts 中的 embedding 转换为从 old_vocab 适应到 new_vocab

类型 详情
old_wgts dict Embedding 权重
old_vocab list 预训练语料库的词汇表
new_vocab list 当前语料库词汇表
返回值 dict

对于 new_vocab 中在 old_vocab 中没有对应匹配的单词,我们使用所有预训练 embedding 的平均值。

wgts = {'0.encoder.weight': torch.randn(5,3)}
new_wgts = match_embeds(wgts.copy(), ['a', 'b', 'c'], ['a', 'c', 'd', 'b'])
old,new = wgts['0.encoder.weight'],new_wgts['0.encoder.weight']
test_eq(new[0], old[0])
test_eq(new[1], old[2])
test_eq(new[2], old.mean(0))
test_eq(new[3], old[1])

源代码

load_ignore_keys

 load_ignore_keys (model, wgts:dict)

wgts 加载到 model 中,忽略键名,仅按顺序获取参数

类型 详情
model 模型架构
wgts dict 模型权重
返回值 tuple

源代码

clean_raw_keys

 clean_raw_keys (wgts:dict)

源代码

load_model_text

 load_model_text (file:str, model, opt:fastai.optimizer.Optimizer,
                  with_opt:bool=None, device:int|str|torch.device=None,
                  strict:bool=True)

file 加载 modelopt(如果可用且 with_opt 为 True)

类型 默认值 详情
file str 保存的文本模型文件名
model 模型架构
opt 优化器 用于拟合模型的 Optimizer
with_opt bool None 启用以加载 Optimizer 状态
device int | str | torch.device None 设置设备,如果未指定则使用 'cpu'
strict bool True 是否严格强制 file 的 state dict 键与模型 Module.state_dict 匹配

源代码

TextLearner

 TextLearner (dls:DataLoaders, model, alpha:float=2.0, beta:float=1.0,
              moms:tuple=(0.8, 0.7, 0.8), loss_func:Callable|None=None,
              opt_func:Optimizer|OptimWrapper=<function Adam>,
              lr:float|slice=0.001, splitter:Callable=<function
              trainable_params>, cbs:Callback|MutableSequence|None=None,
              metrics:Callable|MutableSequence|None=None,
              path:str|Path|None=None, model_dir:str|Path='models',
              wd:float|int|None=None, wd_bn_bias:bool=False,
              train_bn:bool=True, default_cbs:bool=True)

NLP 中 Learner 的基本类。

类型 默认值 详情
dls DataLoaders 文本 DataLoaders
model 一个标准的 PyTorch 模型
alpha float 2.0 RNNRegularizer 的参数
beta float 1.0 RNNRegularizer 的参数
moms tuple (0.8, 0.7, 0.8) Cosine Annealing Scheduler 的动量
loss_func 可选 None 损失函数。默认为 dls 的损失函数
opt_func fastai.optimizer.Optimizer | fastai.optimizer.OptimWrapper Adam 训练的优化函数
lr float | slice 0.001 默认学习率
splitter 可调用对象 (Callable) trainable_params 将模型分割成参数组。默认为一个参数组
cbs fastai.callback.core.Callback | collections.abc.MutableSequence | None None 要添加到 LearnerCallback
metrics Union None 在验证集上计算的 Metric
path str | pathlib.Path | None None 保存、加载和导出模型的父目录。默认为 dlspath
model_dir str | pathlib.Path models 保存和加载模型的子目录
wd float | int | None None 默认权重衰减
wd_bn_bias bool False 将权重衰减应用于归一化和偏置参数
train_bn bool True 训练冻结的归一化层
default_cbs bool True 包含默认 Callback

将一个带 alphabetaModelResetterRNNRegularizer 添加到回调函数中,其余与 Learner init 相同。

Learner 为基类添加了功能


源代码

TextLearner.load_pretrained

 TextLearner.load_pretrained (wgts_fname:str, vocab_fname:str, model=None)

加载预训练模型并使其适应数据词汇表。

类型 默认值 详情
wgts_fname str 保存权重的文件名
vocab_fname str pickle 格式保存的词汇表文件名
model NoneType None 加载参数的模型,默认为 Learner.model

wgts_fname 应该指向预训练模型的权重,vocab_fname 指向用于预训练的词汇表。


源代码

TextLearner.save_encoder

 TextLearner.save_encoder (file:str)

将编码器保存到模型目录中的 file 文件

类型 详情
file str Encoder 的文件名

模型目录是 Learner.path/Learner.model_dir


源代码

TextLearner.load_encoder

 TextLearner.load_encoder (file:str, device:int|str|torch.device=None)

从模型目录加载编码器 file,可选择确保其位于 device

类型 默认值 详情
file str 保存的编码器文件名
device int | str | torch.device None 用于加载的设备,默认为 dls 的设备

语言模型预测

对于语言建模,predict 方法与其他应用有很大不同,因此需要一个单独的子类。


源代码

decode_spec_tokens

 decode_spec_tokens (tokens)

解码 tokens 中的特殊 token

test_eq(decode_spec_tokens(['xxmaj', 'text']), ['Text'])
test_eq(decode_spec_tokens(['xxup', 'text']), ['TEXT'])
test_eq(decode_spec_tokens(['xxrep', '3', 'a']), ['aaa'])
test_eq(decode_spec_tokens(['xxwrep', '3', 'word']), ['word', 'word', 'word'])

源代码

LMLearner

 LMLearner (dls:DataLoaders, model, alpha:float=2.0, beta:float=1.0,
            moms:tuple=(0.8, 0.7, 0.8), loss_func:Callable|None=None,
            opt_func:Optimizer|OptimWrapper=<function Adam>,
            lr:float|slice=0.001, splitter:Callable=<function
            trainable_params>, cbs:Callback|MutableSequence|None=None,
            metrics:Callable|MutableSequence|None=None,
            path:str|Path|None=None, model_dir:str|Path='models',
            wd:float|int|None=None, wd_bn_bias:bool=False,
            train_bn:bool=True, default_cbs:bool=True)

处理语言模型时向 TextLearner 添加功能

类型 默认值 详情
dls DataLoaders 文本 DataLoaders
model 一个标准的 PyTorch 模型
alpha float 2.0 RNNRegularizer 的参数
beta float 1.0 RNNRegularizer 的参数
moms tuple (0.8, 0.7, 0.8) Cosine Annealing Scheduler 的动量
loss_func 可选 None 损失函数。默认为 dls 的损失函数
opt_func fastai.optimizer.Optimizer | fastai.optimizer.OptimWrapper Adam 训练的优化函数
lr float | slice 0.001 默认学习率
splitter 可调用对象 (Callable) trainable_params 将模型分割成参数组。默认为一个参数组
cbs fastai.callback.core.Callback | collections.abc.MutableSequence | None None 要添加到 LearnerCallback
metrics Union None 在验证集上计算的 Metric
path str | pathlib.Path | None None 保存、加载和导出模型的父目录。默认为 dlspath
model_dir str | pathlib.Path models 保存和加载模型的子目录
wd float | int | None None 默认权重衰减
wd_bn_bias bool False 将权重衰减应用于归一化和偏置参数
train_bn bool True 训练冻结的归一化层
default_cbs bool True 包含默认 Callback

源代码

LMLearner.predict

 LMLearner.predict (text, n_words=1, no_unk=True, temperature=1.0,
                    min_p=None, no_bar=False, decoder=<function
                    decode_spec_tokens>, only_last_word=False)

返回 text 和其后的 n_words 个词

单词根据每个索引的概率从预测结果中随机选取。no_unk 意味着我们永远不会选择 UNK token,temperature 应用于预测结果,如果传递了 min_p,则不考虑概率低于该值的索引。如果您不想显示进度条,将 no_bar 设置为 True,您还可以传递自定义的 decoder 来处理预测的 token。

Learner 便利函数


源代码

language_model_learner

 language_model_learner (dls, arch, config=None, drop_mult=1.0,
                         backwards=False, pretrained=True,
                         pretrained_fnames=None,
                         loss_func:Callable|None=None,
                         opt_func:Optimizer|OptimWrapper=<function Adam>,
                         lr:float|slice=0.001, splitter:Callable=<function
                         trainable_params>,
                         cbs:Callback|MutableSequence|None=None,
                         metrics:Callable|MutableSequence|None=None,
                         path:str|Path|None=None,
                         model_dir:str|Path='models',
                         wd:float|int|None=None, wd_bn_bias:bool=False,
                         train_bn:bool=True, moms:tuple=(0.95, 0.85,
                         0.95), default_cbs:bool=True)

dlsarch 创建一个带有语言模型的 Learner

类型 默认值 详情
dls DataLoaders 包含 fastai 或 PyTorch DataLoaders 的 DataLoaders
arch
config NoneType None
drop_mult float 1.0
backwards bool False
pretrained bool True
pretrained_fnames NoneType None
loss_func 可选 None 损失函数。默认为 dls 的损失函数
opt_func fastai.optimizer.Optimizer | fastai.optimizer.OptimWrapper Adam 训练的优化函数
lr float | slice 0.001 默认学习率
splitter 可调用对象 (Callable) trainable_params 将模型分割成参数组。默认为一个参数组
cbs fastai.callback.core.Callback | collections.abc.MutableSequence | None None 要添加到 LearnerCallback
metrics Union None 在验证集上计算的 Metric
path str | pathlib.Path | None None 保存、加载和导出模型的父目录。默认为 dlspath
model_dir str | pathlib.Path models 保存和加载模型的子目录
wd float | int | None None 默认权重衰减
wd_bn_bias bool False 将权重衰减应用于归一化和偏置参数
train_bn bool True 训练冻结的归一化层
moms tuple (0.95, 0.85, 0.95) 调度器的默认动量
default_cbs bool True 包含默认 Callback

您可以使用 config 自定义使用的架构(为此可以更改 awd_lstm_lm_config 中的值),pretrained 将使用 fastai 为此 arch 提供的预训练模型(如果可用),或者您可以传递包含您自己的预训练模型和相应词汇表的特定 pretrained_fnames。所有其他参数都传递给 Learner

path = untar_data(URLs.IMDB_SAMPLE)
df = pd.read_csv(path/'texts.csv')
dls = TextDataLoaders.from_df(df, path=path, text_col='text', is_lm=True, valid_col='is_valid')
learn = language_model_learner(dls, AWD_LSTM)

然后您可以使用 .predict 方法生成新文本。

learn.predict('This movie is about', n_words=20)
'This movie is about plans by Tom Cruise to win a loyalty sharing award at the Battle of Christmas'

默认情况下,在每个预测词之后,整个句子会再次馈送到模型中,这个小技巧显示出生成文本质量的改进。如果只想馈送最后一个词,请指定参数 only_last_word

learn.predict('This movie is about', n_words=20, only_last_word=True)
'This movie is about the J. Intelligent , ha - agency . Griffith , and Games on the early after'

源代码

text_classifier_learner

 text_classifier_learner (dls, arch, seq_len=72, config=None,
                          backwards=False, pretrained=True, drop_mult=0.5,
                          n_out=None, lin_ftrs=None, ps=None,
                          max_len=1440, y_range=None,
                          loss_func:Callable|None=None,
                          opt_func:Optimizer|OptimWrapper=<function Adam>,
                          lr:float|slice=0.001,
                          splitter:Callable=<function trainable_params>,
                          cbs:Callback|MutableSequence|None=None,
                          metrics:Callable|MutableSequence|None=None,
                          path:str|Path|None=None,
                          model_dir:str|Path='models',
                          wd:float|int|None=None, wd_bn_bias:bool=False,
                          train_bn:bool=True, moms:tuple=(0.95, 0.85,
                          0.95), default_cbs:bool=True)

dlsarch 创建一个带有文本分类器的 Learner

类型 默认值 详情
dls DataLoaders 包含 fastai 或 PyTorch DataLoaders 的 DataLoaders
arch
seq_len int 72
config NoneType None
backwards bool False
pretrained bool True
drop_mult float 0.5
n_out NoneType None
lin_ftrs NoneType None
ps NoneType None
max_len int 1440
y_range NoneType None
loss_func 可选 None 损失函数。默认为 dls 的损失函数
opt_func fastai.optimizer.Optimizer | fastai.optimizer.OptimWrapper Adam 训练的优化函数
lr float | slice 0.001 默认学习率
splitter 可调用对象 (Callable) trainable_params 将模型分割成参数组。默认为一个参数组
cbs fastai.callback.core.Callback | collections.abc.MutableSequence | None None 要添加到 LearnerCallback
metrics Union None 在验证集上计算的 Metric
path str | pathlib.Path | None None 保存、加载和导出模型的父目录。默认为 dlspath
model_dir str | pathlib.Path models 保存和加载模型的子目录
wd float | int | None None 默认权重衰减
wd_bn_bias bool False 将权重衰减应用于归一化和偏置参数
train_bn bool True 训练冻结的归一化层
moms tuple (0.95, 0.85, 0.95) 调度器的默认动量
default_cbs bool True 包含默认 Callback

您可以使用 config 自定义使用的架构(为此可以更改 awd_lstm_clas_config 中的值),pretrained 将使用 fastai 为此 arch 提供的预训练模型(如果可用)。drop_mult 是应用于控制所有 dropout 的全局乘数。n_out 通常从 dls 推断,但您也可以传递它。

该模型使用 SentenceEncoder,这意味着文本每次以 seq_len 个 token 的长度传递,并且仅在最后 max_len 个步骤上计算梯度。lin_ftrsps 被传递给 get_text_classifier

所有其他参数都传递给 Learner

path = untar_data(URLs.IMDB_SAMPLE)
df = pd.read_csv(path/'texts.csv')
dls = TextDataLoaders.from_df(df, path=path, text_col='text', label_col='label', valid_col='is_valid')
learn = text_classifier_learner(dls, AWD_LSTM)