Python 层数雅可比矩阵的高效计算

Python 层数雅可比矩阵的高效计算,python,theano,backpropagation,Python,Theano,Backpropagation,我想更仔细地看看全连接神经网络中每一层的雅可比矩阵,即。∂y/∂x,其中x是该层的输入向量(上一层的激活),y是该层的输出向量(该层的激活) 在在线学习计划中,可以通过以下方式轻松完成: import theano import theano.tensor as T import numpy as np x = T.vector('x') w = theano.shared(np.random.randn(10, 5)) y = T.tanh(T.dot(w, x)) # computati

我想更仔细地看看全连接神经网络中每一层的雅可比矩阵,即。∂y/∂x,其中x是该层的输入向量(上一层的激活),y是该层的输出向量(该层的激活)

在在线学习计划中,可以通过以下方式轻松完成:

import theano
import theano.tensor as T
import numpy as np

x = T.vector('x')
w = theano.shared(np.random.randn(10, 5))
y = T.tanh(T.dot(w, x))

# computation of Jacobian
j = T.jacobian(y, x)
在批量学习时,需要额外扫描以获取每个样本的雅可比矩阵

x = T.matrix('x')
...

# computation of Jacobian
j = theano.scan(lambda i, a, b : jacobian(b[i], a)[:,i], 
    sequences = T.arange(y.shape[0]), non_sequences = [x, y]
)
这对于玩具示例非常有效,但当学习具有1000个隐藏单元和数千个样本的多层网络时,这种方法会导致计算速度大幅降低。(雅可比矩阵结果索引背后的思想可以在中找到)

问题是,我相信当我们已经在计算损失的导数时,不需要这种显式的雅可比计算。毕竟,与网络输入等相关的损耗梯度可以分解为
∂L(y,yL)/∂x=∂L(y,yL)/∂伊尔∂伊尔/∂y(L-1)∂y(L-1)/∂y(L-2)。。。∂y2/∂y1∂y1/∂x
i、 e.损耗梯度w.r.t.x是每层导数的乘积(L是这里的层数)


因此,我的问题是是否(以及如何)有可能避免额外的计算并使用上面讨论的分解。我认为这应该是可能的,因为自动微分实际上是链式规则的一种应用(据我所知)。然而,我似乎找不到任何支持这个想法的东西。任何建议、提示或指针?

T.jacobian
非常低效,因为它在内部使用scan。如果您计划将雅可比矩阵与某物相乘,则应分别使用
T.Lop
T.Rop
进行左/右相乘。目前,梯度模块中不存在“智能”雅可比矩阵。如果你想要优化雅可比矩阵,你必须手工制作它们


在可能的情况下,不要使用
T.scan
,而是使用批处理Op,例如
T.batched\u dot
T.scan
将始终导致CPU循环。

T.jacobian
非常低效,因为它在内部使用scan。如果您计划将雅可比矩阵与某物相乘,则应分别使用
T.Lop
T.Rop
进行左/右相乘。目前,梯度模块中不存在“智能”雅可比矩阵。如果你想要优化雅可比矩阵,你必须手工制作它们

在可能的情况下,不要使用
T.scan
,而是使用批处理Op,例如
T.batched\u dot
<代码>T。扫描将始终导致CPU循环