【问题标题】:efficient computation Jacobian of layers in theanotheano中层的高效计算雅可比行列式
【发布时间】:2017-06-02 07:35:19
【问题描述】:

我想仔细看看全连接神经网络中每一层的雅可比矩阵,即∂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 个隐藏单元的多层网络和数千个样本时,这种方法会导致计算速度大大减慢。 (索引雅可比结果背后的想法可以在this question中找到)

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

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

【问题讨论】:

    标签: python theano backpropagation


    【解决方案1】:

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

    尽可能使用T.batched_dot 等批处理操作,而不是使用T.scanT.scan 总是会导致 CPU 循环。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-29
      • 2022-11-14
      相关资源
      最近更新 更多