我有一個圖形如下,其中輸入x有兩條路徑到達y。它們與使用cMulTable的gModule結合使用。現在,如果我做gModule:向後(x,y),我得到一個包含兩個值的表格。它們是否對應於從兩條路徑導出的誤差導數? 通過gModule向後移動手電筒
但由於path2包含其他nn層,我想我需要以逐步的方式推導出此路徑中的派生值。但爲什麼我得到dy/dx的兩個值表?
爲了讓事情更清晰,代碼測試,這是如下:
input1 = nn.Identity()()
input2 = nn.Identity()()
score = nn.CAddTable()({nn.Linear(3, 5)(input1),nn.Linear(3, 5)(input2)})
g = nn.gModule({input1, input2}, {score}) #gModule
mlp = nn.Linear(3,3) #path2 layer
x = torch.rand(3,3)
x_p = mlp:forward(x)
result = g:forward({x,x_p})
error = torch.rand(result:size())
gradient1 = g:backward(x, error) #this is a table of 2 tensors
gradient2 = g:backward(x_p, error) #this is also a table of 2 tensors
那麼,什麼是錯我的步驟是什麼?
P.S,也許我已經找到了原因,因爲g:落後({x,x_p},error)導致同一個表。所以我猜這兩個值分別代表dy/dx和dy/dx_p。
嗨亞歷克斯,謝謝你的回答。我沒有使用單個輸入x,而是使用兩個輸入a和b創建了gModule,而b的值取決於a。我這樣做是因爲nn層比線性轉換更復雜。它有一個LSTM結構。 –
我還包括了我的代碼模擬,請查看@Alexander Lutsenko –