ai_tools
版权申明:本文为原创文章,转载请注明原文出处
ai_tools
SOME USEFUL TOOLS
记录一些方便进行实验的tools
wandb
weight & Bias缩写,参数可视化平台,比TensorBoard更强大,优势如下
- 更有利于复现模型
- 自动上传云端,可便捷查看旧实验结果
- 快速集成,每次运行模型可记录完备指标和记录
- 集中式指示版
常用函数
wandb.init():初始化project:字符串格式,定义项目名称name:字符串格式,具体名称(项目可能用不同版本)config:可用wandb.config.update()更新,训练参数配置(比如lr,batchsize,epoch)resume:定义程序意外中断时是否继续,默认为None
1
2
3
4wandb.init(project='project',
name='name',
config=config,
resume='None')wandb.log():将log内的参数值自动上传更新,wandb.Image()为图像显示1
2
3
4
5wandb.log({'loss': loss, 'epoch': epoch, 'learning rate': cur_lr,
'images': wandb.Image(images.float()),
'masks': {'true': wandb.Image(targets.float()),
'pred': wandb.Image(pred.float())}
})wandb.save():保存运行项相关文件,如模型权重wandb.restore():运行指定运行项时恢复代码状态
pytorch支持的优化器
| 原理 | 优点 | 缺点 | 适用场景 | |
|---|---|---|---|---|
SGD |
直接计算梯度进行参数更新 \(\theta_{t+1}=\theta_t-\eta\nabla_\theta L(\theta_t)\) |
更用mini-batch的时候,可以收敛得很快 | ①在随机选择梯度的同时会引入噪声,使得权值更新的方向不一定正确;②不能解决局部最优解的问题 | 大规模数据集,以及不需要精细调整超参数的简单模型训练 |
SGD+Momentum |
在SGD基础上引入历史梯度累积 \(v_{t+1}=\beta v_t+(1-\beta)\nabla_\theta L(\theta_t)\\\theta_{t+1}=\theta_t-\eta v_{t+1}\) |
加快收敛速度,有一定摆脱局部最优的能力,一定程度上缓解了没有动量的时候的问题 | 更新的时候 在一定程度上保留之前更新的方向,仍然继承了一部分SGD的缺点 |
参数空间较复杂 |
Adam |
结合了SGD和Momentum,并对每个参数梯度进行更新 \(\begin{gathered}m_t=\beta_1m_{t-1}+(1-\beta_1)\nabla_\theta L(\theta_t)\\v_t=\beta_2v_{t-1}+(1-\beta_2)(\nabla_\theta L(\theta_t))^2\\\hat{m}_t=\frac{m_t}{1-\beta_1^t},\quad\hat{v}_t=\frac{v_t}{1-\beta_2^t}\\\theta_{t+1}=\theta_t-\eta\frac{\hat{m}_t}{\sqrt{\hat{v}_t}+\epsilon}\end{gathered}\) |
计算效率高,收敛速度快,自动调整学习率 | 在某些情况不如SGD的泛化能力,需要调整超参数 |
对收敛速度和稳定性有较高要求、大规模数据集 |
Adagrad |
累计每个参数平方梯度 \(G_t=G_{t-1}+\nabla_\theta L(\theta_t)^2\\\theta_{t+1}=\theta_t-\eta\frac{\nabla_\theta L(\theta_t)}{\sqrt{G_t}+\epsilon}\) |
为每个参数自适应调整学习率,适合稀疏数据 | 学习率会逐步降低,训练后期速度慢 | 处理稀疏数据或具有不同频率要求的参数更新 |
Adadelta |
Adagrad改进,限制累计历史梯度范围避免学习率过早减小\(\begin{gathered}E[g^2]_t=\rho E[g^2]_{t-1}+(1-\rho)g_t^2\\\theta_{t+1}=\theta_t-\frac{\eta\nabla_\theta L(\theta_t)}{\sqrt{E[g^2]_t+\epsilon}}\end{gathered}\) |
避免在训练后期,学习率过小;初期和中期,加速效果不错,训练速度快 | 需要手动指定初始学习率,初始梯度过大会导致整个训练过程的学习率一直很小,在模型训练的后期,模型会反复地在局部最小值附近抖动,从而导致学习时间变长 | 需要自动调整学习率但不希望学习率逐渐降低 |
RMSprop |
字数应学习率优化器,通过计算每个参数梯度指数加权平均调整 \(v_t=\beta v_{t-1}+(1-\beta)(\nabla_\theta L(\theta_t))^2\\\theta_{t+1}=\theta_t-\eta\frac{\nabla_\theta L(\theta_t)}{\sqrt{v_t}+\epsilon}\) |
类似于Adadelta,收敛较快 |
与Adam类似,需要更精细的超参数调整,不适用于小批量数据 |
需要快速收敛,稀疏数据任务 |
AdamW |
权重衰减 \(\begin{gathered}m_t=\beta_1m_{t-1}+(1-\beta_1)\nabla_\theta L(\theta_t)\\v_t=\beta_2v_{t-1}+(1-\beta_2)(\nabla_\theta L(\theta_t))^2\\\hat{m}_t=\frac{m_t}{1-\beta_1^t},\quad\hat{v}_t=\frac{v_t}{1-\beta_2^t}\\\theta_{t+1}=\theta_t-\eta\frac{\hat{m}_t}{\sqrt{\hat{v}_t}+\epsilon}-\eta\lambda\theta_t\end{gathered}\) |
带权重衰减的Adam,防止过拟合 |
需要调整超参数 | 需要防止过拟合 |
Adamax |
计算梯度的加权平方和时,使用的是过去梯度的最大值,而不是加权平方和的平方根 \(u_t=\max(\beta_2u_{t-1},|\nabla_\theta L(\theta_t)|)\\m_t=\beta_1m_{t-1}+(1-\beta_1)\nabla_\theta L(\theta_t)\\\theta_{t+1}=\theta_t-\eta\frac{m_t}{u_t+\epsilon}\) |
在处理稀疏梯度时表现较好,尤其是在一些梯度不稳定或参数变化范围较大的场景中 | 收敛速度稍慢,对超参数选择敏感 | 需要稳定训练,尤其是学习率选择较为困难 |
SGD
优点:计算效率高,对于某些模型和数据集泛化能力较好
缺点:收敛速度慢,容易陷入局部最小值
You need to set
install_url to use ShareThis. Please set it in _config.yml.


