亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Pytorch Autograd在使用.clamp而不是torch.relu時給出不同的漸變

Pytorch Autograd在使用.clamp而不是torch.relu時給出不同的漸變

躍然一笑 2022-08-25 16:37:04
我仍在努力理解PyTorch autograd系統。我正在努力的一件事是理解為什么,并且似乎有不同的向后傳球。.clamp(min=0)nn.functional.relu()它特別令人困惑,因為它等效于PyTorch教程中的使用,例如 https://pytorch.org/tutorials/beginner/pytorch_with_examples.html#pytorch-nn。.clamprelu在分析具有一個隱藏層和一個relu激活(輸出層中的線性)的簡單全連接網絡的梯度時,我發現了這一點。據我所知,以下代碼的輸出應該只是零。我希望有人能向我展示我錯過了什么。import torchdtype = torch.floatx = torch.tensor([[3,2,1],                  [1,0,2],                  [4,1,2],                  [0,0,1]], dtype=dtype)y = torch.ones(4,4)w1_a = torch.tensor([[1,2],                     [0,1],                     [4,0]], dtype=dtype, requires_grad=True)w1_b = w1_a.clone().detach()w1_b.requires_grad = Truew2_a = torch.tensor([[-1, 1],                     [-2, 3]], dtype=dtype, requires_grad=True)w2_b = w2_a.clone().detach()w2_b.requires_grad = Truey_hat_a = torch.nn.functional.relu(x.mm(w1_a)).mm(w2_a)y_a = torch.ones_like(y_hat_a)y_hat_b = x.mm(w1_b).clamp(min=0).mm(w2_b)y_b = torch.ones_like(y_hat_b)loss_a = (y_hat_a - y_a).pow(2).sum()loss_b = (y_hat_b - y_b).pow(2).sum()loss_a.backward()loss_b.backward()print(w1_a.grad - w1_b.grad)print(w2_a.grad - w2_b.grad)# OUT:# tensor([[  0.,   0.],#         [  0.,   0.],#         [  0., -38.]])# tensor([[0., 0.],#         [0., 0.]])# 
查看完整描述

1 回答

?
侃侃無極

TA貢獻2051條經驗 獲得超10個贊

原因是,并在 處產生不同的梯度。使用標量張量檢查兩個版本:與 .結果是針對該版本,但它是針對該版本。這意味著選擇,而選擇。clamprelu0x = 0(x.clamp(min=0) - 1.0).pow(2).backward()(relu(x) - 1.0).pow(2).backward()x.grad0relu-2clamprelux == 0 --> grad = 0clampx == 0 --> grad = 1



查看完整回答
反對 回復 2022-08-25
  • 1 回答
  • 0 關注
  • 172 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號