通常,神经网络是一个多变量,矢量值函数,如下所示:
函数f有一些参数θ(神经网络的权重),它将一个N维向量x(即猫图片的N像素)映射到一个m维矢量(例如,x属于M个不同类别中的每个类别的概率):
在训练过程中,通常会给输出附加一个标量损失值——分类的一个典型例子是预测类概率的交叉熵损失。当使用这样的标量损失时,M = 1,然后通过执行(随机)梯度下降来学习参数,在此期间重复计算相对于θ的损失函数的梯度。因此,在训练期间计算标量输出值相对于网络参数的梯度是很常见的,并且所有常见的机器学习库都可以这样做,通常使用自动微分非常有效。
然而,在推理时网络的输出通常是一个向量(例如,类概率)。在这种情况下,查看网络的雅可比矩阵可能会很有趣。在这篇文章中,我解释一下什么是雅可比矩阵,然后我探索和比较一些可能实现用Python来完成。
什么是雅可比矩阵,为什么我们会关心?
我们称y为f的输出向量。f的雅可比矩阵包含y的每个元素的偏导数,相对于输入x的每个元素:
该矩阵告诉我们神经网络输入的local perturbations将如何影响输出。在某些情况下,这些信息可能很有价值。例如,在用于创造性任务的机器学习(ML)系统中,让系统为用户提供一些交互式反馈可以很方便,告诉他们修改每个输入维度将如何影响每个输出类。
Tensorflow
让我们一起尝试使用Tensorflow。首先,我们需要一个示例网络来玩。在这里,我只对在测试时计算现有网络f的雅可比行列式感兴趣,所以我不专注于训练。假设我们有一个简单的网络[affine → ReLU → affine → softmax]。我们首先定义一些随机参数:
import numpy as np
N = 500 # Input size
H = 100 # Hidden layer size
M = 10 # Output size
w1 = np.random.randn(N, H) # first affine layer weights
b1 = np.random.randn(H) # first affine layer bias
w2 = np.random.randn(H, M) # second affine layer weights
b2 = np.random.randn(M) # second affine layer bias
使用Keras,我们按如下方式实施我们的神经网络:
import tensorflow as tf
from tensorflow.keras.layers import Dense
sess = tf.InteractiveSession()
sess.run(tf.initialize_all_variables())
model = tf.keras.Sequential()
model.add(Dense(H, activation='relu', use_bias=True, input_dim=N))
model.add(Dense(O, activation='softmax', use_b