作者:你问什么只为她停留_538 | 来源:互联网 | 2023-06-11 15:21
我遇到过许多研究出版物,Q&A讨论了检查RNN权重的必要性;一些相关的答案朝着正确的方向提出了建议get_weights()
-但是我如何真正可视化权重有意义地?也就是说,LSTM和GRU具有门,所有RNN具有通道作为独立的特征提取器-因此,我如何(1)提取每个门权重,然后(2)以信息方式绘制权重?
Keras / TF以明确定义的顺序构建RNN权重,可以从源代码中或直接通过layer.__dict__
进行检查-然后用于获取每个内核的 和每关权重;给定张量的形状,然后可以使用每通道处理。以下代码和说明涵盖了Keras / TF RNN的所有可能情况,并且应该可以轻松扩展到将来的任何API更改。
另请参见可视化RNN渐变以及对RNN regularization的应用;与前一篇文章不同,我不会在此处包括一个简化的变体,因为从重量提取和组织的本质来看,它仍然相当庞大和复杂;相反,只需在存储库中查看相关的源代码即可(请参阅下一节)。
代码源:See RNN(此文章包含大图),我的存储库;包括:
- 激活可视化
- 重量可视化
- 激活梯度可视化
- 重量梯度可视化
- 说明所有功能的文档字符串
- 支持Eager,Graph,TF1,TF2和
from keras
和from tf.keras
- 比示例中显示的视觉自定义性更高
可视化方法:
- 二维热图:绘制每个门,每个内核,每个方向的重量分布; 清楚地显示了内核与隐藏的关系
- 直方图:绘制每个门,每个内核,每个方向的权重分布; 丢失上下文信息
EX 1:uni-LSTM,256个单位,重量-batch_shape = (16,100,20)
(输入)
rnn_histogram(model,'lstm',equate_axes=False,show_bias=False)
rnn_histogram(model,equate_axes=True,show_bias=False)
rnn_heatmap(model,'lstm')
- 顶部图是直方图子图网格,显示每个内核以及每个内核中每个门的权重分布
- 第二个图集
equate_axes=True
用于在内核和门之间进行均匀比较,提高了比较质量,但可能会降低视觉吸引力
- 最后一幅图是具有相同权重的热图,其中栅极间隔由垂直线标记,并且还包括偏置权重
- 与直方图不同,热图保留通道/上下文信息:可以清楚地区分输入到隐藏和隐藏到隐藏的转换矩阵
- 请注意,在“忘记”门口大量集中了最大值;作为琐事,在Keras(通常是)中,除“忘记”偏置(初始化为1)之外,所有偏置门均初始化为零。
EX 2:bi-CuDNNLSTM,256个单位,重量-batch_shape = (16,16)
(输入)
rnn_histogram(model,'bidir',equate_axes=2)
rnn_heatmap(model,norm=(-.8,.8))
两者均支持双向。此示例中包含的直方图偏差
- 再次注意偏差热图;它们似乎不再与EX 1中位于相同的位置。确实,
CuDNNLSTM
(和CuDNNGRU
)偏差的定义和初始化方式不同-无法从直方图推断出这一点
EX 3:uni-CuDNNGRU,64个单位,权重梯度-batch_shape = (16,16)
(输入)
rnn_heatmap(model,'gru',mode='grads',input_data=x,labels=y,cmap=None,absolute_value=True)
- 我们可能希望可视化渐变强度,这可以通过
absolute_value=True
和灰度色图来实现
在此示例中,即使没有显式的分隔线,- 门分隔也是显而易见的:
-
New
是最活跃的内核门(输入到隐藏),建议对允许信息流 进行更多的纠错
-
Reset
是最不活跃的循环门(隐藏到隐藏),建议在内存保存方面的错误校正最少
Bonus EX:LSTM NaN检测,512个单位,权重-batch_shape = (16,16)
(输入)
- 热图和直方图都带有内置的NaN检测-内核,门和方向
- Heatmap将打印NaN到控制台,而直方图会将其直接标记在图上
- 两者都将在绘制之前将NaN值设置为零;在下面的示例中,所有相关的非NaN权重已经为零