首页 > 其他分享 >模型训练

模型训练

时间:2023-06-16 14:26:32浏览次数:35  
标签:optimizer 训练 模型 学习 lr scheduler 向量

1. bert为什么attention除以根号下d

原因:因为点积的数量级增长很大,因此将 softmax 函数推向了梯度极小的区域。
案例:
在没有除以根号d时, raw_tensor = torch.tensor([[2.1,3.3,0.5,-2.7]])
    torch.softmax(raw_tensor ,dim=1)的结果是:tensor([[0.2207, 0.7329, 0.0446, 0.0018]])
    发现某些值比较大,而其他的都比较小,不利于参数优化
除以根号下d的向量如下:process_tensor = raw_tensor /3  向量是tensor([[ 0.7000,  1.1000,  0.1667, -0.9000]]),
    经过torch.softmax(process_tensor ,dim=1)的结果是tensor([[0.3048, 0.4548, 0.1788, 0.0615]])相对于没有除以根号d之前,
    softmax的值相对平缓了。

在计算注意力分数时,为了确保分数不会因为输入的维度过高而变得过大,BERT模型中的注意力分数进行了归一化。具体而言,
每个头的注意力分数除以了根号d,其中d是模型的隐藏层维度。
为什么要这样做呢?这是因为注意力分数是由输入向量乘以一个查询向量、键向量和值向量的内积计算得到的。
如果输入向量的维度d比较大,那么内积的结果也可能非常大,这会导致注意力分数也变得非常大,这可能会使得softmax函数的
计算变得不稳定,并且会影响模型的训练和推理效果。通过除以根号d,可以将注意力分数缩小到一个合适的范围内,从而使
softmax函数计算更加稳定,并且更容易收敛。

2. layernorm的作用

1.增加模型的鲁棒性。由于LayerNorm可以对输入进行归一化,使得每个神经元的输入具有相似的分布特征,从而有助于网络的训练和泛化性能。
此外,由于归一化的系数是可学习的,网络可以根据输入数据的特点自适应地学习到合适的归一化系数。

2.加速模型的训练。由于输入已经被归一化,不同特征之间的尺度差异较小,因此优化过程更容易收敛,加快了模型的训练速度。

3. 减少模型的过拟合。由于LayerNorm可以使得每个神经元的输入具有相似的分布特征,从而减少了模型过拟合的风险,提高了模型的泛化能力。

3. warmup预热学习率

在深度学习中,warmup预热学习率是指在训练开始时逐渐增加学习率的策略。
其主要作用是解决在训练开始时由于学习率过高而导致的模型不稳定(模型震荡)、梯度爆炸等问题。

在训练开始时,模型的参数初始值是随机的,模型还没有学到有效的特征表示。如果此时直接使用较大的学习率进行训练,
可能会导致模型的参数值更新过快,从而影响模型的稳定性和收敛速度。
此时使用warmup预热学习率的策略可以逐渐增加学习率,使得模型参数逐渐收敛到一定的范围内,提高模型的稳定性和收敛速度。

具体来说,warmup预热学习率的调整可以分为两个阶段:
    1.预热阶段:在训练开始的若干个epoch中,逐渐增加学习率,使得模型可以快速学习到有效的特征表示。
    2.正常阶段:在预热阶段后,保持较高的学习率(这是你定义的学习率),继续对模型参数进行更新,直到模型收敛或达到一定的训练轮数。

4. 退火学习率

退火学习率是一种常用的学习率策略,其主要作用是在训练的早期阶段使用较高的学习率,以加速模型的收敛;
在训练后期逐渐降低学习率,以使得模型的学习更加稳定。具体来说,退火学习率会通过一个退火过程,逐渐降低学习率,
从而使得模型能够更好地适应数据,并达到更好的泛化性能。

在退火学习率中,通常会设置一个初始学习率和一个退火的步长,以及一个退火的策略,比如线性退火、余弦退火等。
其中,初始学习率和退火的步长可以根据数据集的大小和模型的复杂度进行调整。退火的策略通常会根据训练数据的大小和模型的训练情况进行选择。

5. 退火学习率怎么模型跳出局部

一种常用的技巧是使用随机扰动的方式,在退火过程中加入一些噪声。具体来说,可以在学习率下降的过程中,随机加入一个小的扰动,
使得模型的状态发生一定程度的变化,从而避免模型陷入局部最优解。

另一种技巧是使用模拟退火的方法,这种方法类似于物理中的退火过程。具体来说,模拟退火会在训练过程中,
以一定的概率接受一些劣解,从而避免模型陷入局部最优解。这种方法的优点是可以在不降低学习率的情况下,
帮助模型跳出局部最优解,但需要适当调整概率参数,否则可能会影响模型的收敛速度和稳定性。

6.bert为什么使用正弦作为位置编码

1.可以提供位置信息
BERT是一种基于Transformer的模型,它的输入是一个序列,而且序列中每个词的位置是不同的。
位置编码的计算中包含了一个正弦函数和一个余弦函数,而且它们的参数都和位置和维度有关。
这样的设计可以让不同位置的词汇的位置编码是不同的,从而让模型能够更好地学习到位置信息。
因此,在进行词汇表示时,需要对不同位置的词汇进行区分。位置编码可以提供位置信息,让不同位置的词汇可以在表示中得到区分。
使用正弦函数作为位置编码的好处是,可以让不同位置的词汇的位置编码是不同的,从而让模型能够更好地学习到位置信息。
2.可以保持位置编码的连续性
在进行位置编码时,需要考虑到不同位置的词汇之间的位置信息是连续的。如果采用一种不连续的位置编码方法,
可能会导致模型在学习位置信息时产生不必要的困难。使用正弦函数作为位置编码的好处是,可以保持位置编码的连续性,
从而避免不同位置的词汇之间产生突变。

7. cross attention

Cross Attention通常由一个query向量集合和一个key-value向量集合组成。对于一个query向量,
首先需要计算它与所有key向量之间的相似度,然后通过一个softmax函数将相似度转化为一个权重分布,
最后利用这个权重分布对value向量进行加权求和,得到一个加权表示。这个加权表示就是Cross Attention的输出。

为什么选encode的key-value向量?
首先,通过使用key向量,模型可以学习到不同模块之间的相似性和差异性,即对于不同的query向量,
它可以通过计算query向量与key向量之间的相似度,来确定哪些key向量与该query向量最相似。
这样就能够有效地捕捉到不同模块之间的交互关系。

其次,使用value向量可以将注意力分布应用到目标模块上。具体来说,对于每个query向量,
模型都可以使用与之对应的注意力分布来计算value向量的加权和,从而得到该query向量在不同模块中的表示。
这样可以有效地将不同模块之间的信息交互整合到一个统一的表示空间中。


1 函数衰减 LambdaLR

import torch
from torch import nn
from torch.optim.lr_scheduler import LambdaLR
import numpy as np

NUM_EPOCHS = 100
model = nn.Linear(2, 1)

def scheduler_lr(optimizer, scheduler):
  lr_history = []

  """optimizer的更新在scheduler更新的前面"""
  for epoch in range(NUM_EPOCHS):
      optimizer.step() # 更新参数
      lr_history.append(optimizer.param_groups[0]['lr'])
      scheduler.step() # 调整学习率
  return lr_history


"""设置优化器,初始化学习率"""
optimizer = torch.optim.SGD(model.parameters(), lr=1e-3) 

"""设置lr策略"""
lr_lambda = lambda epoch:1.0 if epoch<10 else np.math.exp(0.1*(10-epoch))
scheduler = LambdaLR(optimizer=optimizer,lr_lambda=lr_lambda)
lr_history = scheduler_lr(optimizer, scheduler)

 

from torch.optim.lr_scheduler import StepLR
optimizer = torch.optim.SGD(model.parameters(), lr=1e-3)
scheduler = StepLR(optimizer=optimizer, step_size=10, gamma=0.9) // 每一个step_size,乘以gamma,进行衰减
lr_history = scheduler_lr(optimizer, scheduler)

6 LinearLR

通过线性改变小的乘法因子来衰减每个参数组的学习率,直到 epoch 的数量达到预定义的milestone:total_iters。

from torch.optim.lr_scheduler import LinearLR
optimizer = torch.optim.SGD(model.parameters(),lr=1e-3)
scheduler = LinearLR(optimizer=optimizer,start_factor=1.0/3,end_factor=1.0,total_iters=15)
lr_history = scheduler_lr(optimizer, scheduler)

7 指数衰减 ExponentialLR

指数衰减,就是每一个epoch都会衰减的StepLR,其gamma就是对应的底数,epoch就是指数。

from torch.optim.lr_scheduler import ExponentialLR
optimizer = torch.optim.SGD(model.parameters(), lr=1e-3)
scheduler = ExponentialLR(optimizer=optimizer, gamma=0.9)
lr_history = scheduler_lr(optimizer, scheduler)

13 warm up

warm up衰减策略与上述的策略有些不同,它是先从一个极低的学习率开始增加,增加到某一个值后再逐渐减少。

initial 是初始学习率,step是步数,也就是step了几次,这里也可以换成 epoch。warm 表示热身的步数也就是前面增长的步数。

自定义版:

class WarmupLR:
 def __init__(self, optimizer, num_warm) -> None:
  self.optimizer = optimizer
  self.num_warm = num_warm
  self.lr = [group['lr'] for group in self.optimizer.param_groups]
  self.num_step = 0
 
 def __compute(self, lr) -> float:
  return lr * min(self.num_step ** (-0.5), self.num_step * self.num_warm ** (-1.5))
 
 def step(self) -> None:
  self.num_step += 1
  lr = [self.__compute(lr) for lr in self.lr]
  for i, group in enumerate(self.optimizer.param_groups):
      group['lr'] = lr[i]


optimizer = torch.optim.SGD(model.parameters(), lr=1e-3)
scheduler = WarmupLR(optimizer=optimizer, num_warm=10)
lr_history = scheduler_lr(optimizer, scheduler)

optimizer2 = torch.optim.SGD(model.parameters(), lr=1e-3)
scheduler2 = WarmupLR(optimizer=optimizer2, num_warm=20)
lr_history2 = scheduler_lr(optimizer2, scheduler2)
 

标签:optimizer,训练,模型,学习,lr,scheduler,向量
From: https://www.cnblogs.com/qiaoqifa/p/17485221.html

相关文章

  • 人工智能领域:面试常见问题超全(深度学习基础、卷积模型、对抗神经网络、预训练模型、计
    人工智能领域:面试常见问题超全(深度学习基础、卷积模型、对抗神经网络、预训练模型、计算机视觉、自然语言处理、推荐系统、模型压缩、强化学习、元学习)人工智能领域:面试常见问题1.深度学习基础为什么归一化能够提高求解最优解的速度?为什么要归一化?归一化与标准化有什么联系......
  • 深度学习实践篇[17]:模型压缩技术、模型蒸馏算法:Patient-KD、DistilBERT、DynaBERT、Ti
    深度学习实践篇[17]:模型压缩技术、模型蒸馏算法:Patient-KD、DistilBERT、DynaBERT、TinyBERT1.模型压缩概述1.2模型压缩原有理论上来说,深度神经网络模型越深,非线性程度也就越大,相应的对现实问题的表达能力越强,但相应的代价是,训练成本和模型大小的增加。同时,在部署时,大模型预测......
  • 了解基于模型的元学习:Learning to Learn优化策略和Meta-Learner LSTM
    摘要:本文主要为大家讲解基于模型的元学习中的LearningtoLearn优化策略和Meta-LearnerLSTM。本文分享自华为云社区《深度学习应用篇-元学习[16]:基于模型的元学习-LearningtoLearn优化策略、Meta-LearnerLSTM》,作者:汀丶。1.LearningtoLearnLearningtoLearnbyGradien......
  • 漫画 |【No.5 福格行为模型】 如何做出“ins”一样的爆款产品?
     在内卷严重的时代,让我们从思维开始,不断精进不断向上。101个思维模型系列小视频正陆续更新中,请戳:思维模型系列视频......
  • 基于栅格的分布式新安江模型构建与分析 - 姚成 - 2007
    摘要:基于DEM的分布式水文模型是现代水文学同计算机,3S等高科技技术相结合的产物,是水文模型新的发展方向.本文是在数字高程模型的基础上,研究和归纳了流域信息提取的方法和算法,利用DEM数据提取了河网,水系,水流路径等相关的流域特征,并根据三水源新安江模型的理论,建立了一个基......
  • R语言用灰色模型 GM (1,1)、神经网络预测房价数据和可视化|附代码数据
    以苏州商品房房价为研究对象,帮助客户建立了灰色预测模型GM(1,1)、BP神经网络房价预测模型,利用R语言分别实现了GM(1,1)和BP神经网络房价预测可视化由于房价的长期波动性及预测的复杂性,利用传统的方法很难准确预测房价,而灰色模型GM(1,1)和神经网络的结合在一定程度上可以......
  • 基于神经网络的大模型在图像识别中的应用
    目录1.引言2.技术原理及概念3.实现步骤与流程4.示例与应用5.优化与改进6.结论与展望随着深度学习技术的不断发展,特别是在计算机视觉领域,基于神经网络的大模型在图像识别中的应用越来越广泛。这些模型能够在处理大量图像数据的同时,准确地识别出各种物体和场景,取得了令人瞩目......
  • 文本分类与情感分析:基于深度学习的大型语言模型应用
    目录1.引言2.技术原理及概念3.实现步骤与流程4.示例与应用5.优化与改进6.结论与展望7.附录:常见问题与解答文本分类和情感分析是人工智能领域中非常重要的技术,其应用广泛,包括自然语言处理、语音识别、计算机视觉等多个领域。本文将介绍基于深度学习的大型语言模型应用文本......
  • 深度学习神经网络大模型在文本分类中的应用
    目录1.引言2.技术原理及概念2.1基本概念解释2.2技术原理介绍2.3相关技术比较3.实现步骤与流程3.1准备工作:环境配置与依赖安装3.2核心模块实现3.3集成与测试4.示例与应用4.1实例分析4.2应用场景介绍5.优化与改进5.1性能优化5.2可扩展性改进5.3安全性加固深度学习......
  • 代码随想录算法训练营第八天| 28. 实现 strStr() 459.重复的子字符串
    28.实现strStr()  难点:1,制作KMP算法2,next数组要求的是,找到的下标:0/s[i]==s[j]才可以跳出来代码:1vector<int>getNextList(stringneedle)2{3vector<int>next(needle.size());4intj=0;5next[0]=0;67for(inti=1;i......