赞
踩
模型需要提前设定随机种子和框架样式,这里的框架样式主要是指在进行卷积计算时候选择的算法。
这里的随机种子包括系统的,numpy的,torch自身的,CUDA的。
random.seed(seed)
np.random.seed(seed)
torch.manual_seed(seed) # 所有设别设置随机种子
torch.cuda.manual_seed_all(seed) # 设置所有GPU的随机种子,如果没有GPU,会默认忽视
在加速器cuDnn中,针对卷积有多种优化算法,不同的优化算法会对结果产生差异。
torch.backends.cudnn.deterministic = True
True每次返回的卷积算法将是确定的,默认的,结合确定的随机种子,可以确保结果可复现,缺点是速度性能会慢。
torch.backends.cudnn.benchmark = False
cudnn为了提升性能使用了基准测试,每次调用cuDNN卷积算法,利用基准测试找到最快的。
设置为True的条件是使用网络结构固定(非动态变化),输入变量维度固定,单一平台(不考虑跨平台带来的机器性能变化)。
注意,如果不是上述这种形式,返回结果将不是随机的。
参考资料:
复现性说明
复现性讲的非常透彻的文章
输入需要载入预训练的tokenizer,tokenizer可以理解是将原本输入的词(自然语言)转化为词袋(字典)和其他内容,用于作为BERT模型的输入。
详细的tokenizer介绍可以看huggingface的tokenizer说明
默认返回的三个变量(其实是向量)分别是:
这里要注意,如果设置了max_length或者模型本身自带max_length设置(如BERT),则返回的是截断结果。如果模型本身无max_length且没有设置max_length,则padding参数无效。
这里的Tensordataset是将多个tensor向量以第一个维度为索引合并成一个矩阵。这里的第一维度就是有几个文本输入。
相关代码参考如下
def encode_fn(self, text_list): """ 将text_list转化为bert可用的输入形式 :param text_list: [string, string,...,string] :return: input_ids, token_type_ids, attention_mask,默认返回的三个向量 """ tokenizer = self.tokenizer( text_list, padding=True, truncation=True, max_length=self.max_len, return_tensors='pt' # 返回的类型为pytorch tensor ) input_ids = tokenizer['input_ids'] # 字典的ids token_type_ids = tokenizer['token_type_ids'] # 区分两个句,如[0,0,0,...,0,1,1,1,...,1] attention_mask = tokenizer['attention_mask'] # 0标注padding的部分,1标注正文,所以模型不会注意到这部分 return input_ids, token_type_ids, attention_mask def load_data(self, path): """ 载入pkl文件,将数据转化为模型可接受的形式 :param path: pkl地址 :return: TensorData """ data = pd.read_pickle(path) text_list, labels = list(data['content']), list(data['flag']) # input_ids, token_type_ids, attention_mask = self.encode_fn(text_list) labels = torch.tensor(labels) # 转化为torch下的tensor向量 data = TensorDataset(input_ids, token_type_ids, attention_mask, labels) # 要求第一个维度一样 return data
用于将数据转化为可以多个batch的迭代类
DataLoader(TensorDataset, batch_size, shuffle)
学习预热机制是指学习率的动态调度,即从0开始线性上升到一个定值(预热截断),然后线性缓慢下降到0。
由于刚开始训练时,模型的权重(weights)是随机初始化的,此时若选择一个较大的学习率,可能带来模型的不稳定(振荡),选择Warmup预热学习率的方式,可以使得开始训练的几个epoches或者一些steps内学习率较小,在预热的小学习率下,模型可以慢慢趋于稳定,等模型相对稳定后再选择预先设置的学习率进行训练,使得模型收敛速度变得更快,模型效果更佳。
来源学习率预热说明
下文代码中设置num_warmup_steps=0,实际上就是意味着没有预热的阶段。
scheduler = get_linear_schedule_with_warmup(optimizer, num_warmup_steps=0, num_training_steps=total_steps) # 预热学习率调度器
pytorch有两种模式,分别是训练模式和验证模式,区别在于dropout在验证模式中不用做。
在进行训练和验证的时候,需要切换模式
# 训练模式
model.train()
# 验证模式
model.eval()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。