【发布时间】:2016-03-29 06:25:29
【问题描述】:
假设我有一个具有 5 个隐藏层的人工神经网络。暂时忘记神经网络模型的细节,例如偏差、使用的激活函数、数据类型等等......。当然,激活函数是可微的。
通过符号微分,以下计算目标函数相对于层权重的梯度:
w1_grad = T.grad(lost, [w1])
w2_grad = T.grad(lost, [w2])
w3_grad = T.grad(lost, [w3])
w4_grad = T.grad(lost, [w4])
w5_grad = T.grad(lost, [w5])
w_output_grad = T.grad(lost, [w_output])
这样,要计算 w.r.t w1 的梯度,必须首先计算 w.r.t w2、w3、w4 和 w5 的梯度。与计算梯度 w.r.t w2 类似,必须首先计算 w.r.t w3、w4 和 w5 的梯度。
但是,我可以使用以下代码计算每个权重矩阵的梯度 w.r.t:
w1_grad, w2_grad, w3_grad, w4_grad, w5_grad, w_output_grad = T.grad(lost, [w1, w2, w3, w4, w5, w_output])
我想知道,这两种方法在性能方面有什么区别吗? Theano 是否足够智能,可以避免使用第二种方法重新计算梯度?智能是指计算 w3_grad,Theano 应该 [preferably] 使用预先计算好的 w_output_grad、w5_grad 和 w4_grad 梯度,而不是再次计算它们。
【问题讨论】:
-
有趣的问题。您是否简单地尝试并测量了这两种方法的运行时间?
-
@hbaderts 还没有,我会做一些实验,把性能结果贴在这里。
-
@hbaderts 解决方案现已发布。
-
Amir,您一直在将新标签(jacobean、hessian)编辑成一堆旧问题,但我不相信标签是必要的 - 我认为它们是 "meta tags",因为它们真的无法自立。它们当然不够重要,不足以证明对有很多其他问题的旧帖子进行仅标记编辑是合理的。我建议你发表一个元帖子来讨论是否欢迎这些标签;如果有社区支持添加它们,则不需要一个人的努力。
-
@Amir 我们并不是说它们不应该在这里存在,只是说你开始讨论元数据,因为我们犹豫是否同意你的看法关于这些标签的元状态,就像它一样。如果您可以在那里提供令人信服的论点,以及提供准确使用指导的良好标签描述(目前没有),那么正如 Mogsdad 所说,其他人甚至可以帮助您将这些标签添加到适当的问题中。
标签: python-2.7 neural-network gradient theano automatic-differentiation