广西城乡和建设厅网站,p2p网站如何做推广,模板网字体库免费,wordpress国外主题安装优化器Optimizer
什么是优化器
pytorch的优化器#xff1a;管理并更新模型中可学习参数的值#xff0c;使得模型输出更接近真实标签
导数#xff1a;函数在指定坐标轴上的变化率 方向导数#xff1a;指定方向上的变化率#xff08;二元及以上函数#xff0c;偏导数管理并更新模型中可学习参数的值使得模型输出更接近真实标签
导数函数在指定坐标轴上的变化率 方向导数指定方向上的变化率二元及以上函数偏导数 梯度一个向量方向是使得方向导数取得最大值的方向
Pytorch的Optimizer 参数
defaults优化器超参数state参数的缓存如momentum的缓存param_groups管理的参数组_step_count记录更新次数学习率调整中使用
基本方法
zero_grad()清空所管理参数的梯度
pytorch特性张量梯度不会自动清零 step()执行一步更新 add_param_group()添加参数组 state_dict()获取优化器当前状态信息字典 load_state_dict()加载状态信息字典
使用代码帮助理解和学习
import os
import torch
import torch.optim as optimBASE_DIR os.path.dirname(os.path.abspath(__file__))weight torch.randn((2, 2), requires_gradTrue)
weight.grad torch.ones((2, 2))# 需要传入一个可迭代对象
optimizer optim.SGD([weight], lr1)print(weight before step:{}.format(weight.data))
optimizer.step()
print(weight after step:{}.format(weight.data))weight before step:tensor([[-0.0606, -0.3197],[ 1.4949, -0.8007]])
weight after step:tensor([[-1.0606, -1.3197],[ 0.4949, -1.8007]])
weight weight - lr * weight.grad 上面学习率是1把学习率改为0.1试一下
optimizer optim.SGD([weight], lr0.1)weight before step:tensor([[ 0.3901, 0.2167],[-0.3428, -0.7151]])
weight after step:tensor([[ 0.2901, 0.1167],[-0.4428, -0.8151]])接着上面的代码我们再看一下add_param_group方法
# add_param_group方法
print(optimizer.param_groups is \n{}.format(optimizer.param_groups))w2 torch.randn((3, 3), requires_gradTrue)
optimizer.add_param_group({params: w2, lr: 0.0001})
print(optimizer.param_groups is\n{}.format(optimizer.param_groups))optimizer.param_groups is
[{params: [tensor([[ 0.1749, -0.2018],[ 0.0080, 0.3517]], requires_gradTrue)], lr: 0.1, momentum: 0, dampening: 0, weight_decay: 0, nesterov: False}]optimizer.param_groups is
[{params: [tensor([[ 0.1749, -0.2018],[ 0.0080, 0.3517]], requires_gradTrue)], lr: 0.1, momentum: 0, dampening: 0, weight_decay: 0, nesterov: False}, {params: [tensor([[ 0.4538, -0.8521, -1.3081],[-0.0158, -0.2708, 0.0302],[-0.3751, -0.1052, -0.3030]], requires_gradTrue)], lr: 0.0001, momentum: 0, dampening: 0, weight_decay: 0, nesterov: False}]
关于zero_grad()、step()、state_dict()、load_state_dict()这几个方法比较简单就不再赘述。
SGD随机梯度下降
learning_rate学习率 这里学习率为1可以看到并没有达到梯度下降的效果反而y值越来越大这是因为更新的步伐太大。 我们以y 4*x^2这个函数举例将y值作为要优化的损失值那么梯度下降的过程就是为了找到y的最小值即此函数曲线的最小值如果我们把学习率设置为0.2就可以得到这样一个梯度下降的图
def func(x):return torch.pow(2*x, 2)x torch.tensor([2.], requires_gradTrue)
iter_rec, loss_rec, x_rec list(), list(), list()
lr 0.2
max_iteration 20for i in range(max_iteration):y func(x)y.backward()print(iter:{}, x:{:8}, x.grad:{:8}, loss:{:10}.format(i, x.detach().numpy()[0], x.grad.detach().numpy()[0], y.item()))x_rec.append(x.item())x.data.sub_(lr * x.grad)x.grad.zero_()iter_rec.append(i)loss_rec.append(y.item())plt.subplot(121).plot(iter_rec, loss_rec, -ro)
plt.xlabel(Iteration)
plt.ylabel(Loss value)x_t torch.linspace(-3, 3, 100)
y func(x_t)
plt.subplot(122).plot(x_t.numpy(), y.numpy(), labely 4*x^2)
plt.grid()y_rec [func(torch.tensor(i)).item() for i in x_rec]
plt.subplot(122).plot(x_rec, y_rec, -ro)
plt.legend()
plt.show()这里其实存在一个下降速度更快的学习率那就是0.125一步就可以将loss更新为0这是因为我们已经了这个函数表达式而在实际神经网络模型训练的过程中是不知道所谓的函数表达式的所以只能选取一个相对较小的学习率然后以训练更多的迭代次数来达到最优的loss。 动量Momentum又叫冲量
结合当前梯度与上一次更新信息用于当前更新
为什么会出现动量这个概念
当学习率比较小时往往更新比较慢通过引入动量使得后续的更新受到前面更新的影响可以更快的进行梯度下降。
指数加权平均当前时刻的平均值Vt与当前参数值θ和前一时刻的平均值Vt-1的关系。 根据上述公式进行迭代展开因为0β1当前时刻的平均值受越近时刻的影响越大更近的时刻其所占的权重更高越远时刻的影响越小我们可以通过下面作图来看到这一变化。
import numpy as np
import matplotlib.pyplot as pltdef exp_w_func(beta, time_list):return [(1-beta) * np.power(beta, exp) for exp in time_list]beta 0.9
num_point 100
time_list np.arange(num_point).tolist()weights exp_w_func(beta, time_list)plt.plot(time_list, weights, -ro, labelBeta: {}\n B * (1-B)^t.format(beta))
plt.xlabel(time)
plt.ylabel(weight)
plt.legend()
plt.title(exponentially weighted average)
plt.show()这里β是一个超参数设置不同的值其对于过去时刻的权重计算如下图
beta_list [0.98, 0.95, 0.9, 0.8]
w_list [exp_w_func(beta, time_list) for beta in beta_list]
for i, w in enumerate(w_list):plt.plot(time_list, w, labelBeta: {}.format(beta_list[i]))plt.xlabel(time)plt.ylabel(weight)
plt.legend()
plt.show()从图中可以得到这一结论β值越小记忆周期越短β值越大记忆周期越长。
pytorch中带有momentum参数的更新公式 对于y4*x^2这个例子在没有momentum时我们对比学习率分别为0.01和0.03会发现0.03收敛的更快。 如果我们给learning_rate0.01增加momentum参数会发现其可以先一步0.03的学习率到达loss的较小值但是因为动量较大的因素在达到了最小值后还会反弹到一个大的值。 Pytorch中的优化器
optim.SGD
主要参数
params管理的参数组lr学习率momentum动量系数贝塔weight_decayL2正则化系数nesterov是否采用NAG默认False
optim.Adagrad自适应学习率梯度下降法
optim.RMSpropAdagrad的改进
optim.AdadeltaAdagrad的改进
optim.AdamRMSprop结合Momentum
optim.AdamaxAdam增加学习率上限
optim.SparseAdam稀疏版的Adam
optim.ASGD随机平均梯度下降
optim.Rprop弹性反向传播
optim.LBFGSBFGS的改进
学习率调整
前期学习率大后期学习率小
pytorch中调整学习率的基类
class _LRScheduler
主要属性
optimizer关联的优化器last_epoch记录epoch数base_lrs记录初始学习率
主要方法
step()更新下一个epoch的学习率get_lr()虚函数计算下一个epoch的学习率
StepLR
等间隔调整学习率
主要参数
step_size调整间隔数gamma调整系数
调整方式lr lr * gamma
import torch
import torch.optim as optim
import matplotlib.pyplot as pltLR 0.1
iteration 10
max_epoch 200weights torch.randn((1,), requires_gradTrue)
target torch.zeros((1, ))optimizer optim.SGD([weights], lrLR, momentum0.9)scheduler_lr optim.lr_scheduler.StepLR(optimizer, step_size50, gamma0.1) # 设置学习率下降策略lr_list, epoch_list list(), list()
for epoch in range(max_epoch):lr_list.append(scheduler_lr.get_lr())epoch_list.append(epoch)for i in range(iteration):loss torch.pow((weights-target), 2)loss.backward()optimizer.step()optimizer.zero_grad()scheduler_lr.step()plt.plot(epoch_list, lr_list, labelStep LR Scheduler)
plt.xlabel(Epoch)
plt.ylabel(Learning Rate)
plt.legend()
plt.show() MultiStepLR
功能按给定间隔调整学习率
主要参数
milestones设定调整时刻数gamma调整系数
调整方式lr lr * gamma
# MultiStepLR
milestones [50, 125, 160]
scheduler_lr optim.lr_scheduler.MultiStepLR(optimizer, milestonesmilestones, gamma0.1)
只需要改变这里代码其他部分与StepLR中基本一致 ExponentialLR
功能按指数衰减调整学习率
主要参数
gamma指数的底
调整方式lr lr * gamma ** epoch
# Exponential LR
gamma 0.95
scheduler_lr optim.lr_scheduler.ExponentialLR(optimizer, gammagamma) CosineAnnealingLR
功能余弦周期调整学习率
主要参数
T_max下降周期eta_min学习率下限
调整方式 # CosineAnnealingLR
t_max 50
scheduler_lr optim.lr_scheduler.CosineAnnealingLR(optimizer, T_maxt_max, eta_min0) ReduceLRonPlateau
功能监控指标当指标不再变化则调整学习率
主要参数
modemin/max两种模式min观察下降max观察上升factor调整系数patience“耐心”接受几次不变化cooldown“冷却时间”停止监控一段时间verbose是否打印日志min_lr学习率下限eps学习率衰减最小值
# Reduce LR on Plateau
loss_value 0.5
accuray 0.9factor 0.1
mode min
patience 10
cooldown 10
min_lr 1e-4
verbose Truescheduler_lr optim.lr_scheduler.ReduceLROnPlateau(optimizer, factorfactor, modemode, patiencepatience,cooldowncooldown, min_lrmin_lr, verboseverbose)
for epoch in range(max_epoch):for i in range(iteration):optimizer.step()optimizer.zero_grad()# if epoch 5:# loss_value 0.4# 把要监控的指标传进去scheduler_lr.step(loss_value)Epoch 12: reducing learning rate of group 0 to 1.0000e-02.
Epoch 33: reducing learning rate of group 0 to 1.0000e-03.
Epoch 54: reducing learning rate of group 0 to 1.0000e-04.
LambdaLR
功能自定义调整策略
主要参数
lr_lambdafunction or list
# lambda LRlr_init 0.1
weights_1 torch.randn((6, 3, 5, 5))
weights_2 torch.ones((5, 5))optimizer optim.SGD([{params: [weights_1]},{params: [weights_2]}
], lrlr_init)lambda1 lambda epoch: 0.1 ** (epoch // 20)
lambda2 lambda epoch: 0.95 ** epochscheduler torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda[lambda1, lambda2])lr_list, epoch_list list(), list()
for epoch in range(max_epoch):for i in range(iteration):optimizer.step()optimizer.zero_grad()scheduler.step()lr_list.append(scheduler.get_lr())epoch_list.append(epoch)print(epoch: {:5d}, lr:{}.format(epoch, scheduler.get_lr()))