根据神经网络中的给定输出获取可能的输入

Get probable input based on a given output in a neural network

我开始学习神经网络,我刚刚制作了一个程序来学习如何非常准确地识别手写数字(通过反向传播训练)。现在我希望能够看到网络认为一个完美的数字是什么样的(本质上是获得一个像素数组,它产生所需的数字但不是来自数据集)。我的研究一无所获,但我在另一个网站上发帖,并被建议查看对输入的反向传播。我没有太多的数学背景,所以有人可以为我指出正确的方向来实现它(或实现我的目标的任何其他方法)吗?

您可以通过反转得到多class classifier 神经网络 (NN) 中每个 classes 的 "ideal" 输入的一些想法模型并可视化输出层的权重,投影到输入层的像素上。

假设您有一个简单的线性 classifier NN,它有 784 个输入(MNIST 数字图像中的像素数)和 10 个输出(数字 classes 的数量)——没有隐藏层。给定输入图像 x(784 元素列向量)的输出层的激活 zz = f(x) = Wx + b 给出,其中 W 是 10 x 784 权重矩阵,并且b 是 10 元素偏置向量。

您可以进行一些代数运算并轻松地反转此模型,以便在给定 z 的情况下计算 xx = f^-1(z) = W^-1 (z - b)。现在假设您想查看 4 class 的最佳输入。此 class 的目标输出将是 z = [0 0 0 0 1 0 0 0 0 0]^T;如果我们暂时忽略偏差,那么您只需要计算 W 的倒数的第 4 列(从 0 开始),一个 784 元素的列向量,将其重新排列回 28 x 28 图像, 并查看。这是最佳输入,因为输出层激活与输入和 class 的权重向量的点积成正比,因此输入向量与 class [=19] 的权重向量相同=] 将在输出层最大限度地激活 class。

如果向模型添加更多层和非线性,事情会变得更加复杂,但一般方法保持不变。您想要某种方法来计算给定模型的目标输出 z* 的最佳输入 x*,但您只知道从输入到目标的(可能很复杂的)正向映射 z = f(x)。您可以将其视为优化问题:您正在尝试计算 x* = f^-1(z*) 并且您知道 fz*。如果您对 f 的了解允许您计算封闭形式的符号逆,那么您只需插入 z* 并得到 x*。如果你不能这样做,你总是可以使用迭代优化过程来计算连续更好的近似值 x1, x2, ..., xn 给定起始猜测 x0.这是使用 scipy.optimize:

执行此操作的一些 Python 伪代码
import numpy as np
import scipy.optimize

# our forward model, paired layers of already-trained
# weights and biases.
weights = [np.array(...) ...]
biases = [np.array(...) ...]
def f(x):
    for W, b in zip(weights, biases):
        # relu activation.
        x = np.clip(np.dot(W, x) + b, 0, np.inf)
    return x

# set our sights on class #4.
zstar = np.array([0, 0, 0, 0, 1, 0, 0, 0, 0, 0])

# the loss we want to optimize: minimize difference
# between zstar and f(x).
def loss(x):
    return abs(f(x) - zstar).sum()

x0 = np.zeros(784)
result = scipy.optimize.minimize(loss, x0)

顺便说一下,这个过程基本上是最近 "Inceptionism" images from Google 的核心——优化过程试图确定复制复杂网络中特定隐藏层状态的输入像素。由于卷积等原因,在这种情况下更加复杂,但想法相似。