计算神经网络的梯度

时间:2017-03-17 02:27:29

标签: python-3.x machine-learning tensorflow neural-network adversarial-machines

我正在阅读有关对抗性图像和破坏神经网络的信息。我正在尝试逐步完成这篇文章,但是由于我的经验不足,我很难理解以下说明。

目前,我有MNIST数据集的逻辑回归模型。如果您提供图像,它将预测最有可能的数字......

saver.restore(sess, "/tmp/model.ckpt")
# image of number 7
x_in = np.expand_dims(mnist.test.images[0], axis=0)
classification = sess.run(tf.argmax(pred, 1), feed_dict={x:x_in})
print(classification)

现在,文章指出,为了打破这个图像,我们需要做的第一件事是获得神经网络的渐变。换句话说,这将告诉我使图像看起来更像2或3所需的方向,即使它是7。

文章指出使用back propagation做起来相对简单。所以你可以定义一个函数......

compute_gradient(image, intended_label)

......这基本上告诉我们神经网络在那时寻找什么样的形状。

对于那些经验丰富的人来说,这似乎很容易实现,但这种逻辑让我感到厌恶。

从函数compute_gradient的参数中,我可以看到您为它提供了一个图像和一个标签数组,其中目标标签的值设置为1。

但我不知道这应该如何回归神经网络的形状。

无论如何,我想了解我应该如何实现这个back propagation算法来返回神经网络的梯度。如果答案不是很简单,我想逐步说明如何让我back propagation按照文章的建议进行工作。

换句话说,我不需要别人给我一些我可以复制的代码,但我想了解我如何实现它。

1 个答案:

答案 0 :(得分:1)

反向传播涉及根据输入和网络参数计算网络输出中的误差(成本函数),然后计算成本函数相对于每个参数的偏导数。这里要详细解释太复杂了,但this chapter from a free online book解释了在其通常的应用中作为训练深度神经网络的过程的反向传播。

生成欺骗神经网络的图像只需将此过程进一步扩展到输入层之外,再延伸到图像本身。我们不是稍微调整网络中的权重以减少错误,而是稍微调整像素值以增加错误,或者减少错误类别的错误。

使用Calc 101的技术可以很容易地(虽然计算密集)近似梯度:对于足够小的e,df / dx近似为(f(x + e) - f(x) )/ e。

类似地,为了使用这种技术计算相对于图像的梯度,计算在向单个像素添加小的变化之后损失/成本变化了多少,将该值保存为相对于该像素的近似偏导数,并重复每个像素。

然后关于图像的梯度大约是:

(
    (cost(x1+e, x2, ... xn) - cost(x1, x2, ... xn)) / e,
    (cost(x1, x2+e, ... xn) - cost(x1, x2, ... xn)) / e,
    .
    .
    .
    (cost(x1, x2, ... xn+e) - cost(x1, x2, ... xn)) / e
)
相关问题