Pytorch: autograd 与逻辑回归的实现
文章和代码已经归档至【Github 仓库:https://github.com/timerring/dive-into-AI 】或者公众号【AIShareLab】回复 pytorch 教程 也可获取。
autograd 自动求导系统
torch.autograd
autograd
torch.autograd.backward
torch.autograd.backward ( tensors, grad_tensors=None,retain_graph=None,create_graph=False)
功能:自动求取梯度
tensors : 用于求导的张量,如 loss
retain_graph : 保存计算图
create_graph:创建导数计算图,用于高阶求导
grad_tensors :多梯度权重(用于设置权重)
注意:张量类中的 backward 方法,本质上是调用的 torch.autogtad.backward。
使用 grad_tensors 可以设置每个梯度的权重。
这个结果是由每一部分的梯度乘它对应部分的权重得到的。
torch.autograd.grad
torch.autograd.grad (outputs, inputs, grad_outputs=None,retain_graph= None, create_graph=False)
功能:求取梯度
outputs : 用于求导的张量,如 loss
inputs : 需要梯度的 张量
create_graph: 创建导数计算图,用于高阶求导
retain_graph : 保存计算图
grad_outputs :多梯度权重
注意:由于是元组类型,因此再次使用求导的时候需要访问里面的内容。
1.梯度不自动清零
2.依赖于叶子结点的结点, requires_grad 默认为 True
3.叶子结点不可执行 in place
什么是 in place?
试比较:
a = torch.ones((1, )) print(id(a), a) a = a + torch.ones((1, )) print(id(a), a) a += torch.ones((1, )) print(id(a), a) # After executing in place, the stored address does not change
2413216666632 tensor([1.]) 2413216668472 tensor([2.]) 2413216668472 tensor([3.])
叶子节点不能执行 in place,因为反向传播时会用到叶子节点张量的值,如 w。而取值是按照 w 的地址取得,因此如果 w 执行 inplace,则更换了 w 的值,导致反向传播错误。
逻辑回归 Logistic Regression
逻辑回归是线性的二分类模型
模型表达式:
f(x) 称为 Sigmoid 函数,也称为 Logistic 函数
逻辑回归
线性回归是分析自变量 x 与 因变量 y( 标量 ) 之间关系的方法
逻辑回归是分析自变量 x 与 因变量 y( 概率 ) 之间关系的方法
逻辑回归也称为对数几率回归(等价)。
表示对数几率。表示样本 x 为正样本的可能性。
证明等价:
线性回归
自变量:X 因变量:y 关系:y=𝑊𝑋+𝑏
本质就是用 WX+b 拟合 y。
对数回归
lny=𝑊𝑋+𝑏
就是用𝑊𝑋+𝑏拟合 lny。
同理,对数几率回归就是用 WX+b 拟合对数几率。
机器学习模型训练步骤
数据采集,清洗,划分和预处理:经过一系列的处理使它可以直接输入到模型。
模型:根据任务的难度选择简单的线性模型或者是复杂的神经网络模型。
损失函数:根据不同的任务选择不同的损失函数,例如在线性回归中采用均方差损失函数,在分类任务中可以选择交叉熵。有了 Loss 就可以求梯度。
得到梯度可以选择某一种优化方式,即优化器。采用优化器更新权值。
最后再进行迭代训练过程。
逻辑回归的实现
实现一个逻辑回归步骤如上。后续会慢慢解释。
版权声明: 本文为 InfoQ 作者【timerring】的原创文章。
原文链接:【http://xie.infoq.cn/article/3989b8781a19da21fd782cc56】。未经作者许可,禁止转载。
评论