如何在 Keras/TensorFlow 中可视化 RNN/LSTM 权重?

Ove*_*gon 3 python visualization keras tensorflow recurrent-neural-network

我遇到过研究出版物和问答讨论检查 RNN 权重的必要性;一些相关的答案是在正确的方向,建议get_weights()- 但我如何真正有意义地可视化权重?也就是说,LSTM 和 GRU 都有,并且所有RNN 都有用作独立特征提取器的通道- 那么我如何(1)获取每个门的权重,以及(2)以信息丰富的方式绘制它们?

Ove*_*gon 7

Keras/TF 以明确定义的顺序构建 RNN 权重,可以从源代码或layer.__dict__直接检查 - 然后用于获取每个内核每个门的权重;给定张量的形状,然后可以采用每通道处理。下面的代码和解释涵盖了 Keras/TF RNN 的所有可能情况,并且应该可以轻松扩展到任何未来的 API 更改。

另请参阅可视化 RNN 梯度和RNN 正则化的应用;与前一篇文章不同,我不会在这里包含一个简化的变体,因为根据权重提取和组织的性质,它仍然相当大和复杂;相反,只需查看存储库中的相关源代码(请参阅下一节)。


代码来源参见 RNN(这篇文章包含更大的图像),我的存储库;包括:

  • 激活可视化
  • 权重可视化
  • 激活梯度可视化
  • 权重梯度可视化
  • 解释所有功能的文档字符串
  • 支持 Eager、Graph、TF1、TF2 和from keras&from tf.keras
  • 比示例中显示的更具视觉可定制性

可视化方法

  • 2D 热图:绘制每个门、每个内核、每个方向的权重分布;清楚地显示内核到隐藏的关系
  • 直方图:绘制每个门、每个内核、每个方向的权重分布;丢失上下文信息

EX 1:uni-LSTM,256 个单位,权重—— batch_shape = (16, 100, 20)(输入)
rnn_histogram(model, 'lstm', equate_axes=False, show_bias=False)
rnn_histogram(model, 'lstm', equate_axes=True, show_bias=False)
rnn_heatmap(model, 'lstm')

  • 顶部图是直方图子图网格,显示每个内核的权重分布,以及每个内核内每个门的权重分布
  • 第二个图集equate_axes=True用于跨内核和门进行均匀比较,提高比较质量,但可能会降低视觉吸引力
  • 最后一张图是相同权重的热图,用垂直线标记门分离,还包括偏置权重
  • 与直方图不同,热图保留了通道/上下文信息:可以清楚地区分输入到隐藏和隐藏到隐藏的转换矩阵
  • 请注意忘记门处的最大值的大量集中;作为琐事,在 Keras(通常)中,偏置门都初始化为零,除了忘记偏置,它被初始化为 1


EX 2:bi-CuDNNLSTM,256 个单位,权重-- batch_shape = (16, 100, 16)(输入)
rnn_histogram(model, 'bidir', equate_axes=2)
rnn_heatmap(model, 'bidir', norm=(-.8, .8))

  • 两者都支持双向;此示例中包含的直方图偏差
  • 再次注意偏差热图;它们似乎不再与 EX 1 位于同一位置。 事实上,CuDNNLSTM(和CuDNNGRU)偏差的定义和初始化方式不同——这是无法从直方图中推断出来的

在此处输入图片说明 在此处输入图片说明


EX 3:uni-CuDNNGRU,64 个单位,权重梯度—— batch_shape = (16, 100, 16)(输入)
rnn_heatmap(model, 'gru', mode='grads', input_data=x, labels=y, cmap=None, absolute_value=True)

  • 我们可能希望可视化梯度强度,这可以通过absolute_value=True灰度颜色图来完成
  • 即使在此示例中没有明确的分隔线,门分隔也很明显:
    • New是最活跃的内核门(输入到隐藏),建议对允许信息流进行更多的纠错
    • Reset 是最不活跃的循环门(隐藏到隐藏),表明对记忆保持的纠错最少


奖励 EX:LSTM NaN 检测,512 个单位,权重-- batch_shape = (16, 100, 16)(输入)

  • 热图和直方图都带有内置的 NaN 检测 - 内核、门和方向
  • 热图会将 NaN 打印到控制台,而直方图将直接在绘图上标记它们
  • 两者都会在绘图前将 NaN 值设置为零;在下面的示例中,所有相关的非 NaN 权重都已经为零

  • 首先,干得好!然而,通过这个我觉得这是一个很好的工具,用于调试监控顺序模型是否有任何不良行为/错误。但这里有可解释性的成分吗?例如,您可以从模型所学内容的可视化中提取见解吗? (2认同)