体重内省是一项相当高级的工作,需要针对特定模型的处理。可视化权重在很大程度上是一项技术挑战,但如何处理这些信息则是另一回事 - 我将主要讨论前者,但会涉及后者。
Update: 我也推荐See RNN用于权重、梯度和激活可视化。
可视化权重:一种方法如下:
- 检索感兴趣层的权重。Ex:
model.layers[1].get_weights()
- 了解权重角色和维度。Ex:LSTM 有三组权重:
kernel
, recurrent
, and bias
,每个都有不同的目的。Within每个权重矩阵是gate权重 - 输入、单元格、忘记、输出。对于 Conv 层,区别在于过滤器 (dim0)、内核和步幅之间。
- 根据 (2) 以有意义的方式组织权重矩阵以进行可视化。Ex:对于 Conv 来说,与 LSTM 不同,特定特征的处理并不是真正必要的,我们可以简单地展平核权重和偏差权重,并在直方图中将它们可视化
- 选择可视化方法:直方图、热图、散点图等 - 对于扁平化数据,直方图是最佳选择
解释重量: 一些方法是:
-
Sparsity:如果权重范数(“平均”)较低,则模型是稀疏的。可能有好处,也可能没有好处。
-
Health:如果太多权重为零或接近于零,则表明有太多死亡神经元;这对于调试很有用,因为一旦某个层处于这种状态,它通常不会恢复 - 因此应该重新开始训练
-
稳定:如果权重变化很大且很快,或者有很多高值权重,则可能表明梯度性能受损,可以通过例如梯度裁剪或权重约束
型号对比:没有一种方法可以简单地并排查看来自不同模型的两个权重并决定“这是更好的一个”;分别分析每个模型,例如如上所述,然后决定哪个模型的优点大于缺点。
然而,最终的决胜局将是验证性能- 而且这也是更实用的一种。它是这样的:
- 训练多个超参数配置的模型
- 选择具有最佳验证性能的一个
- 微调该模型(例如通过进一步的超参数配置)
权重可视化应该主要作为一种调试或记录工具 - 简而言之,即使我们目前对神经网络有最好的理解,也无法仅通过查看权重来判断模型的泛化效果如何。
建议:也可视化层outputs - see 这个答案和底部的示例输出。
视觉示例:
from tensorflow.keras.layers import Input, Conv2D, Dense, Flatten
from tensorflow.keras.models import Model
ipt = Input(shape=(16, 16, 16))
x = Conv2D(12, 8, 1)(ipt)
x = Flatten()(x)
out = Dense(16)(x)
model = Model(ipt, out)
model.compile('adam', 'mse')
X = np.random.randn(10, 16, 16, 16) # toy data
Y = np.random.randn(10, 16) # toy labels
for _ in range(10):
model.train_on_batch(X, Y)
def get_weights_print_stats(layer):
W = layer.get_weights()
print(len(W))
for w in W:
print(w.shape)
return W
def hist_weights(weights, bins=500):
for weight in weights:
plt.hist(np.ndarray.flatten(weight), bins=bins)
W = get_weights_print_stats(model.layers[1])
# 2
# (8, 8, 16, 12)
# (12,)
hist_weights(W)
Conv1D 输出可视化: (source)