Theano 通過 T.grad 實現符號微分,支援標量、向量、矩陣的高階導數計算。
x = T.dscalar('x')
y = x ** 2
gy = T.grad(y, x) # 符號導數 2*x
f = function([x], gy)
f(4) # 8.0
pp() 可打印優化前後的符號表達式。
x = T.dvector('x')
y = x ** 2
J, updates = theano.scan(lambda i, y, x: T.grad(y[i], x),
sequences=T.arange(y.shape[0]),
non_sequences=[y, x])
f = function([x], J, updates=updates)
f([4, 4]) # [[8, 0], [0, 8]]
x = T.dvector('x')
cost = (x ** 2).sum()
gy = T.grad(cost, x)
H, updates = theano.scan(lambda i, gy, x: T.grad(gy[i], x),
sequences=T.arange(gy.shape[0]),
non_sequences=[gy, x])
J * v:T.Rop(y, W, V)v^T * J:T.Lop(y, W, v)H * v:T.Rop(gy, x, v)這些操作避免了顯式構造大矩陣,對優化算法(如牛頓法、共軛梯度)至關重要。
T.grad 第一參數必須是標量,向量需先 T.sum()。scan 比 Python 循環構建符號圖效率高得多。2*x)。掌握 Theano 自動微分機制,能高效實現複雜梯度下降與二階優化算法。