PyTorch Autograd自动区分功能

时间:2018-06-27 04:38:41

标签: python machine-learning computer-vision pytorch

我只是想知道,PyTorch如何跟踪张量上的操作(将public function store(Request $request) { $data = $request->all(); $leads = $data['Lead_id']; $subject_ids = $data['Subject_id']; //insert using foreach loop foreach($leads as $key => $input) { $scores = new Score(); $scores->Subject_id = isset($leads[$key]) ? $leads[$key] : ''; //add a default value here $scores->Lead_id = isset($subject_ids[$key]) ? $subject_ids[$key] : ''; //add a default value here $scores->save(); } //insert using array at once $rows = []; foreach($leads as $key => $input) { array_push($rows, [ 'Subject_id' => isset($leads[$key]) ? $leads[$key] : '', //add a default value here 'Lead_id' => isset($subject_ids[$key]) ? $subject_ids[$key] : '' //add a default value here ]); } Score::insert($rows); return redirect()->route('scores.create')->with('notif', 'Success.'); } 设置为.requires_grad之后,以后如何自动计算梯度。请帮助我理解后面的想法True。谢谢。

1 个答案:

答案 0 :(得分:5)

这是一个很好的问题! 通常,自动区分(AutoDiff)的想法是基于多变量链规则,即 \frac{\partial x}{\partial z} = \frac{\partial x}{\partial y}\cdot \frac{\partial y}{\partial z}
这意味着您可以通过“代理”变量y表示x相对于z的导数;实际上,这使您可以分解一堆更简单(或原子)的操作中的几乎所有操作,然后将这些操作“链接”在一起。
现在,像AutoDiff这样的Autograd包所做的只是存储这种原子运算块的派生词,例如除法,乘法等。 然后,在运行时,可以轻松地将您提供的前向传递公式(包含多个这些模块)转换为精确的导数。同样,如果您认为AutoDiff不能完全按照自己的意愿进行操作,则还可以为自己的操作提供衍生工具。

AutoDiff优于finite differences之类的导数逼近的优点仅仅是因为这是一个 exact 解决方案。

如果您进一步对它的内部工作方式感兴趣,我强烈建议您使用AutoDidact project,它旨在简化自动微分器的内部,因为通常还涉及很多代码优化。 另外,我参加的这次演讲中的set of slides确实有助于理解。