梯度
导数-损失值(y)与 特征值(x) 的导数,这里是特征值还是权值和偏置我也在推敲,根据求导原理,是对x求导,那么x不管为多少都不会影响导数值,所以肯定不是权值和偏置。
梯度越小,求出的损失值便越小,真实值与预测值的差距便越小,妙啊!
- 为什么loss.backward() 可以获取当前梯度?
计算损失会传递两个值:预测值tensor,真实值tensor,而预测值tensor会包含整个计算过程,由哪些特征值、权值、偏置计算而来,从而求得梯度,(optimizer.step())再通过当前学习率的梯度下降算法,降低各梯度,求得新的权值和偏置。
优化器(optimizer)
为了优化我们的神经网络,使它在我们的训练过程中快起来,节省社交网络训练的时间,基于计算梯度(常用梯度下降)更新参数,深度学习里很多思想源于生活,优化参数通过主要通过梯度下降,而这个意相类似与人类生活中的下坡,如何让这个人合理、快速地走到正确位置,提出针对势能这些因素地方案思考
作用
通过学习率优化梯度。
参数
要更新的网络参数,学习率(lr),权重衰减等
- learning rate(学习率)
学习率较小时,收敛到极值的速度较慢。
学习率较大时,容易在搜索过程中发生震荡。 - weight decay(权重衰减)
有效限制模型中的自由参数数量以避免过度拟合,在实践中,这会惩罚较大的权重,并有效地限制模型中的自由度 - learning rate decay (学习率衰减)
简而言之,控制学习率
decay越小,学习率衰减地越慢,当decay = 0时,学习率保持不变。
decay越大,学习率衰减地越快,当decay = 1时,学习率衰减最快。 - momentum
“冲量”这个概念源自于物理中的力学,表示力对时间的积累效应。
每次x的更新量v为v=−dx∗lr,dx为目标函数func(x)对x的一阶导数,当使用冲量时,则把每次x的更新量v考虑为本次的梯度下降量−dx∗lr与上次x的更新量v乘上一个介于[0,1]的因子momentum的和即:v=−dx∗lr+v∗momemtum
简而言之,
当本次梯度下降- dx * lr的方向与上次更新量v的方向相同时,上次的更新量能够对本次的搜索起到一个正向加速的作用。
当本次梯度下降- dx * lr的方向与上次更新量v的方向相反时,上次的更新量能够对本次的搜索起到一个减速的作用。
常用方法/类
- SGD(梯度下降)
寻常训练方法:重复不断的把整套数据放入神经网络NN中训练,相比寻常方法,SGD会把数据拆分后再分批不断放入 NN 中计算,缺点是:不能反映整体数据的情况,优点是加速了 NN 的训练过程, 而且也不会丢失太多准确率 - Momentum
我们把一个人从平地上放到了一个斜坡上, 只要他往下坡的方向走一点点, 由于向下的惯性, 他不自觉地就一直往下走, 走的弯路也变少了. 这就是 Momentum 参数更新 - AdaGrad
不是给喝醉酒的人安排另一个下坡, 而是给他一双不好走路的鞋子, 使得他一摇晃着走路就脚疼, 鞋子成为了走弯路的阻力, 逼着他往前直着走 - RMSProp
遵循momentum 的惯性原则,加上 adagrad 的对错误方向的阻力 - Adam
计算m 时有 momentum 下坡的属性, 计算 v 时有 adagrad 阻力的属性, 然后再更新参数时 把 m 和 V 都考虑进去
学习率调度器(lr_scheduler)
在将optimizer传给scheduler后,在shcduler类的__init__方法中会给optimizer.param_groups列表中的那个元素(字典)增加一个key = "initial_lr"的元素表示初始学习率,等于optimizer.defaults[‘lr’]。
作用
提供了一些根据epoch训练次数来调整学习率(learning rate)的方法。与optimizer的区别是一个是通过学习率用冲量等算法调整梯度,一个是通过epoch等调整调整学习率
评价指标
准确率
预测正确值占比
召回率
不漏掉罪人的能力
精确度
不错怪好人的能力
引用
感谢以下博客提供的资料!
https://blog.csdn.net/qq_34690929/article/details/79932416