[nnabla]特定のレイヤーの勾配計算をさせない方法
はじめに
nnablaにおいて、特定の計算からの勾配を伝搬させたくないという状況を実装した時の備忘録。
例えば、
環境
python==3.8.0
nnabla==1.30.0
実装
式
この時、
この時、(5)における
コードと結果
下記の形で実装した。
import nnabla as nn
x = nn.Variable(need_grad=True)
x.d = 3
y = nn.Variable(need_grad=True)
y.d = 5
L1 = x ** 2
w = 2 * y
L = w * L1
L.forward()
L.backward()
上記のコードを実行すると以下の結果が得られた。
L.d = 90
x.g = 60
y.g = 18
実際、
ここで、
import nnabla as nn
import nnabla.functions as F
x = nn.Variable(need_grad=True)
x.d = 3
y = nn.Variable(need_grad=True)
y.d = 5
L1 = x ** 2
w = 2 * y
w_i = F.identity(w)
w_i.need_grad = False # <-- 勾配計算をFalse
L = w_i * L1 + w - w_i # <-- 勾配が0にならないように工夫
L.forward()
L.backward()
上記のコードを実行すると以下の結果が得られる。
上記のコードでは、11行目において、第1項目でL1の勾配は計算できるようにしつつ、w_iの勾配は10行目で止めているので計算されない。しかし、このままだとwの勾配が0(初期値)のまま伝搬されるので、wを加算し、forwardの計算結果が変わらないようにw_iで引いている。これによって、11行目の計算におけるwの勾配は第2項目で計算される1のみとなる。
L.d = 90
x.g = 60
y.g = 2
実際、(5)において
Discussion