PyTorch自动求导:Autograd

image

** PyTorch中,所有神经网络的核心是 autograd 包。autograd** 包为张量上的所有操作提供了自动求导机制。它是一个在运行时定义(define-by-run)的框架,这意味着反向传播是根据代码如何运行来决定的,并且每次迭代可以是不同的。


张量

image

张量:n维向量

** torch.Tensor 是这个包的核心类。如果设置它的属性 .requires_gradTrue,那么它将会追踪对于该张量的所有操作。当完成计算后可以通过调用 .backward(),来自动计算所有的梯度。这个张量的所有梯度将会自动累加到.grad**属性。

x = torch.ones(2, 2, requires_grad=True)#创建一个张量并设置requires_grad=True用来追踪其计算历史
image
    要阻止一个张量被跟踪历史,可以调用** .detach() **方法将其与计算历史分离,并阻止它未来的计算记录被跟踪。
image
    为了防止跟踪历史记录(和使用内存),可以将代码块包装在 **with torch.no_grad(): **中。在评估模型时特别有用,因为模型可能具有 **requires_grad = True** 的可训练的参数,但是我们不需要在此过程中对他们进行梯度计算。

    还有一个类对于**autograd**的实现非常重要:**Function**。

** Tensor Function 互相连接生成了一个无圈图(acyclic graph**),它编码了完整的计算历史。每个张量都有一个 .grad_fn 属性,该属性引用了创建 Tensor 自身的Function(除非这个张量是用户手动创建的,即这个张量的 **grad_fn **是 None )。

image
    如果需要计算导数,可以在** Tensor **上调用** .backward()**。如果** Tensor** 是一个标量(即它包含一个元素的数据),则不需要为 **backward() **指定任何参数,但是如果它有更多的元素,则需要指定一个 **gradient **参数,该参数是形状匹配的张量。
y = x + 2  # 对这个张量做一次运算
image

** y是计算的结果,所以它有grad_fn**属性。

image
z = y * y * 3  # 对y进行更多操作
image

** .requires_grad_(...) 原地改变了现有张量的 requires_grad 标志。如果没有指定的话,默认输入的这个标志是 False**。

a = torch.randn(2, 2)
image

梯度

image

梯度:方向导数,函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)。

    现在开始进行反向传播,因为** out** 是一个标量,因此 **out.backward() **和**out.backward(torch.tensor(1.)) **等价。
out.backward()
    输出导数** d(out)/dx**
print(x.grad)
image
    我们的得到的是一个数取值全部为**4.5**的**矩阵**。

    计算步骤:
image
image
image
image
    数学上,若有向量值函数** y =f(x )**,那么** y **相对于 **x** 的梯度是一个雅可比矩阵:
image
    通常来说,**torch.autograd **是计算雅可比向量积的一个“**引擎**”。根据链式法则,雅可比向量积:
image
    雅可比向量积的这一特性使得将**外部梯度输入到具有非标量输出的模型中**变得非常方便。

    现在我们来看一个雅可比向量积的例子:
x = torch.randn(3, requires_grad=True)
image
    在这种情况下,**y **不再是标量。**torch.autograd **不能直接计算完整的雅可比矩阵,但是如果我们只想要雅可比向量积,只需将这个向量作为参数传给** backward**:
v = torch.tensor([0.1, 1.0, 0.0001], dtype=torch.float)
image
    也可以通过将代码块包装在 **with torch.no_grad(): **中,来阻止**autograd**跟踪设置了** .requires_grad=True **的张量的历史记录。
print(x.requires_grad)
image
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349