可解释性是深度学习中最具挑战性的方面之一。理解一个神经网络,它有成千上万的神经元分布在数千个隐藏层中。大多数深层神经网络的互联性和复杂性使其不适合于传统的调试工具。
因此,数据科学家通常依赖可视化技术来帮助他们理解神经网络是如何做出决定的,这成为一个持续的挑战。为了推进这一领域的发展,OpenAI刚刚推出了Microscope和Lucid库,使神经网络中的神经元可以进行视化。
在需要牺牲其他方面(例如准确性)之前,可解释性是深度神经网络解决方案中的理想判断属性。深度学习模型的可解释性和准确性能力之间的矛盾,其实就是能够完成复杂的知识任务与理解如何完成这些任务之间矛盾。
知识与可控性,效果与可衡量性,效率与简单性……都可以通过在准确性和可解释性之间进行权衡取舍来进行衡量。许多深度学习技术本质上是复杂的,尽管它们在许多情况下都非常准确,但是它们却难以解释。所有深度学习模型都具有一定程度的可解释性,但是其细节取决于一些关键的构建块。
可解释性的构成要素
对于深度学习模型,可解释性不是一个单一的概念,而是不同原则的组合。在最近的一篇论文中,谷歌的研究人员概述了他们所认为的解释能力的一些基本组成部分。本文介绍了使模型具有可解释性的三个基本特征:
了解隐藏层的作用:深度学习模型中的大部分知识是在隐藏层中形成的。理解不同隐藏层在宏观层面上的功能对于理解深度学习模型至关重要。
了解节点是如何被激活的:可解释性的关键不在于理解网络中单个神经元的功能,而在于理解在同一空间位置一起发射的一组相互连接的神经元组。通过一组相互连接的神经元来分割一个网络,将提供一个更简单的抽象层次来理解其功能。
理解概念是如何形成的:理解神经网络如何形成单个概念,然后将这些概念组装到最终输出中,是可解释性的另一个关键组成部分。
从自然科学中汲取灵感
目前大多数深度学习社区甚至没有神经网络的可解释性的统一的和正确的定义。
在对有机体的结构没有基本一致意见的时候,显微镜的发明使细胞的可视化成为可能,从而推动了细胞生物学的革命。
也许我们需要一个神经网络显微镜(Microscope)。
OpenAI Microscope
OpenAI Microscope是一组常见的深层神经网络的可视化集合,以便于它们的解释。Microscope使我们更容易分析这些神经网络内部形成的特征以及神经元之间的联系
让我们以著名的AlexNet神经网络为例,它是ILSVRC 2012的获奖作品。它解决了图像分类问题,输入是1000个不同类别(如猫、狗等)中的一个的图像,输出是1000个数字的矢量。
使用OpenAI Microscope,我们可以选择一个样本数据集,并可视化AlexNet的核心架构以及每一层图像分类过程的状态。
选择特定层(例如:conv5_1)后,Microscope将显示该层中不同隐藏单元的可视化效果。
选择一个图层后,Microscope将显示相应的特征以及与其形成相关的训练数据集的元素。
通过Microscope导航可以帮助说明可视化是如何帮助提高特定深层神经网络的可解释性的。为了在最初的研究中进行扩展,OpenAI还开源了一个框架来重用一些现有的可视化模型。
The Lucid Library
Lucid库是一个开源框架,用于改进对深层神经网络的解释。目前的版本包括所有Microscope中的视觉化内容。
使用Lucid非常简单。框架可以作为一个简单的Python包安装。
# Install Lucid !pip install --quiet lucid==0.2.3 #!pip install --quiet --upgrade-strategy=only-if-needed git+https://github.com/tensorflow/lucid.git # %tensorflow_version only works on colab %tensorflow_version 1.x # Imports import numpy as np import tensorflow as tf assert tf.__version__.startswith('1') import lucid.modelzoo.vision_models as models from lucid.misc.io import show import lucid.optvis.objectives as objectives import lucid.optvis.param as param import lucid.optvis.render as render import lucid.optvis.transform as transform # Let's import a model from the Lucid modelzoo! model = models.InceptionV1( model.load_graphdef() 使用Lucid可视化神经元只是调用render-vis _ = render.render_vis(model, "mixed4a_pre_relu:476")
此外,Lucid可以产生不同类型的可视化,帮助解释层和神经元:
目标:你希望模型可视化什么?
参数化:如何描述图像?
转换:您希望您的可视化展示什么样的转换?
下面的代码可视化了一个具有特定目标的神经元。
# Let's visualize another neuron using a more explicit objective: obj = objectives.channel("mixed4a_pre_relu", 465) _ = render.render_vis(model, obj)
Microscope和Lucid库都是模型可解释性领域的主要改进。理解特征和神经元之间的关系是我们理解深度学习模型的基础,像Microscope和Lucid这样的库是朝着正确方向迈出的坚实一步。