有效的计算层雅可比

2024-05-16 20:05:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我想更仔细地看一个完全连接的神经网络中每一层的雅可比,即∂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)

在批量学习时,您需要额外扫描以获得每个样本的雅可比矩阵

^{pr2}$

这对于玩具例子来说非常有效,但是当学习一个具有1000个隐藏单元的多层网络和数千个样本时,这种方法会导致计算的巨大减速。(在this question中可以找到索引Jacobian结果的思想)

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

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


Tags: import网络asnp神经网络theano向量计划
1条回答
网友
1楼 · 发布于 2024-05-16 20:05:13

T.jacobian效率非常低,因为它在内部使用扫描。如果你打算用某些东西来乘法雅可比矩阵,你应该分别使用T.Lop或{}进行左/右乘法。目前“智能”雅可比在梯度模中不存在。如果你想要优化的雅可比矩阵,你必须手工制作它们。在

不要使用T.scan,尽可能使用批处理操作,如T.batched_dotT.scan将始终导致CPU循环。在

相关问题 更多 >