机器学习模型可视化:指南和工具(Neptune)

1,563 阅读24分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第3天,点击查看活动详情

概述

“如果你拒绝相信你不完全理解的过程的决策,那为什么还要雇人工作呢? 没有人知道人类大脑(拥有数千亿个神经元)是如何做出决定的。” –-- 卡西·科兹尔科夫

这句话被一些人用来批评最近可解释人工智能的推动。 一开始这听起来像是一个有效的观点,对吧? 但它没有考虑到我们不想复制人类的思想。 我们想建立更好的东西。

机器学习模型正在使用 TB 级的数据进行训练,目的是提高效率,同时做出正确的决策,而人类在这方面做得很好。

我们赋予 ML 模型的责任意味着我们需要能够使它们尽可能透明,否则我们将无法信任它们。

image.png

为此,我们需要可视化 ML 模型。 为了理解这一点,让我们进入模型可视化的 5 个 W:Why, Who, What, When 和 Where。

机器学习中模型可视化的 5 个 W

1. 为什么要可视化模型?(Why)

尽管我们已经在概述中对此进行了一些讨论,下面我们进入细节。

可解释性

我们需要了解模型的决策过程。 这个问题的严重程度在神经网络的情况下变得尤为明显。

现实世界的神经网络模型具有数百万个参数和极端的内部复杂性,因为它们在训练期间使用了许多非线性变换。 将如此复杂的模型可视化将有助于我们建立对自动驾驶汽车、帮助医生诊断的医学成像模型或对救援计划或安全工作至关重要的卫星图像模型的信任

深入挖掘:ML 中的可解释性和可审计性:定义、技术和工具

调试和改进

构建机器学习模型是一个充满实验的迭代过程。 找到超参数的最佳组合可能非常具有挑战性。 可视化可以加速这个过程。

反过来,即使模型在此过程中遇到一些问题,这也可以加快整个开发过程。

比较与选择

从一组表现良好的模型中选择最佳模型的行为可以简单地简化为可视化模型中提供最高准确率或最低损失的部分,同时确保模型不会过拟合。

可以设计框架来比较单个模型在一段时间内训练时的不同快照,即在 n1 个 epoch 之后比较模型和在 n2 个 epoch 训练时间之后比较相同模型。

详情请阅读:如何比较机器学习模型和算法

讲授概念

也许教学是可视化最有用的地方,用于教育新手用户了解机器学习的基本概念。

可以设计交互式平台,用户可以在其中使用多个数据集并切换参数以观察对模型中间状态和输出的影响。 这可以极大地帮助建立关于模型如何工作的直觉。

2. 谁应该使用可视化?(Who)

数据科学家/机器学习工程师

主要专注于开发、试验和部署模型的人将从可视化中受益最多。

许多从业者已经使用的一些著名工具包括 TensorBoard、DeepEyes 或 Blocks。所有这些工具都让用户可以扩展控制超参数调优、修剪不必要的层等内容,从而使他们的模型能够获得更好的性能。

模型用户

可视化可能对其他利益相关者有好处,可能有一些技术背景,但主要处理通过 API 使用模型的服务。

示例包括 Activis,这是 Facebook 为他们自己的工程师开发的视觉分析系统,用于探索内部部署的神经网络。

这种可视化工具对于那些只想使用预训练模型来为自己的任务进行预测的人来说非常有用。

新手用户

在“为什么”部分,我提到了可视化如何帮助新手了解机器学习是什么,这一点在这里也是成立的。

这一群体还可以进一步扩展,以包括好奇的消费者,他们由于担心隐私受到侵犯而对使用 ML 驱动的应用程序犹豫不决。

一些基于 Web 的 JavaScript 框架,如 ConvNetJS 和 TensorFlow.js,使开发人员能够为模型创建高度交互的可探索解释。

3. 我们可以可视化什么?(What)

模型架构

您可以可视化的第一件事也是主要的事情是模型架构。它告诉我们有多少层,它们的位置顺序等等。

这部分还包括计算图,它定义了模型在 epoch 迭代后如何训练、测试、保存到磁盘和检查点(checkpoint)。

所有这些都可以帮助开发人员更好地了解他们的模型内部发生了什么。

学习参数

在训练的反向传播阶段调整的参数属于这一类。

可视化权重和偏差可能有助于理解模型学到了什么。同样,在卷积神经网络中,我们可以看一下学习到的过滤器,看看模型学习了什么样的图像特征。

模型指标

每个时期计算的诸如损失、准确率和其他误差度量的汇总统计数据可以表示为模型训练过程中的时间序列。

通过一组数字表示模型可能看起来有点抽象,但是,它们有助于在训练时跟踪模型的进度。

这些指标不仅描述了单个模型的性能,而且对于同时比较多个模型也至关重要。

4. 什么时候可视化最有价值?(When)

在训练中

在训练时使用可视化是监控和跟踪模型性能的好方法。有很多工具可以准确地解决这个问题(neptune.ai、WandB(weights and biases)等),我们稍后会讨论它们。

例如,Deep View 使用自己的监控指标(例如:可辨别性和密度指标)来可视化模型,这有助于通过在训练阶段早期观察神经元密度来检测过度拟合。

另一个工具 Deep Eyes 可以识别稳定和不稳定的层和神经元。因此,用户可以修剪他们的模型以加快训练速度。

训练结束后

有诸如属性可视化之类的技术,可以重新生成突出显示重要区域的图像,以及特征可视化,以生成一个代表同一类的全新图像。它们通常在训练模型后在计算机视觉领域执行。

一些工具,例如:Embedding Projector,专门用于可视化由经过训练的神经网络产生的 2D 和 3D embeddings。

同样,如前所述,ActiVis、RNNVis、LSTMVis 等工具也在训练后用于可视化甚至比较不同的模型。

5. 可视化可以应用在哪里?(Where)

应用领域

可视化已在自动驾驶、城市规划、医学成像等领域大量使用,以增加用户对模型的信任。

正在开发可视化分析系统以更多地了解更难的网络类型,如 GAN,这些网络仅出现了几年,但在数据生成方面已经产生了显著的成果。

示例包括 DGMTracker 和 GANViz,它们专注于了解 GAN 的训练动态,以帮助模型开发人员更好地训练这些复杂模型。

研究

将可视化与研究相结合,催生了用于模型可解释性和民主化的工具和框架。这个快速发展的领域的另一个后果是,新工作会立即公开和开源,而无需等待它在某个会议上“正式”发布。

例如,用于实现神经网络的最受欢迎的库是开源的,并且对改进代码库的所有领域都有持续的贡献。

到目前为止,我们已经讨论了进行可视化的所有理论方面,现在让我们来看看最重要的一个。

我们如何可视化模型?

当我们谈论可视化模型时,我们真正讨论的是绘制关键组成部分的图画,这些组成部分允许模型学习和产生推理。

如果我们可视化,我们可以很好地了解内部:

1. 模型结构

模型的设计很好地说明了数据如何在其内部流动。可视化它有助于跟踪在哪个阶段应用了哪些操作。

一种流行的方法,特别是在神经网络中,使用节点链接图,其中神经元显示为节点,边权重显示为链接。由于 Tensorboard 越来越受欢迎,这种方法也正在成为标准。

除此之外,如果您想窥探内部,某些机器学习算法具有内置规定。我们将在下一节中看一下这方面的例子。

2.模型训练

监视和观察一个又一个时期计算的许多指标(如损失和准确率)有助于在训练阶段跟踪模型进展。

这可以通过将指标视为时间序列并将它们绘制在折线图中来实现,这一步不需要外部帮助。

另一种方法是使用专门为此目的设计的复杂工具,例如:Tensorboard。使用框架的好处是它们非常灵活、交互式,并且可以节省大量时间。

3.模型推理

推理是从经过训练的模型中得出结论的过程。将结果可视化有助于解释和追溯模型如何生成其估计值。有几种方法可以做到这一点:

  • 可视化实例级观察,在整个网络中对单个数据实例的转换过程进行深入分析和审查,并最终对其进行最终输出。
  • 这可以进一步扩展到在混淆矩阵或热力图的帮助下识别和分析错误分类的实例。这将使我们能够了解特定实例何时会失败以及它是如何失败的。
  • 这个阶段的可视化是进行交互式实验的好方法——用输入数据或超参数进行实验,看看它如何影响结果。 Tensorflow playground就是一个很好的例子。

到目前为止,我们已经了解了进入可视化世界所需的所有先决条件。现在,我们来查看一些适合这项工作(如何可视化模型)的工具。

模型可视化的工具和框架

模型结构可视化

1.sklearn/dTreeViz

由于是树状结构,决策树是易于解释的模型。 您可以简单地检查分支上的条件并跟踪模型中的预测结果。

有几种方法可以可视化决策树。 我们从 sklearn 本身提供的那个开始。

进行所需的模块的导入。

import matplotlib.pyplot as plt
from sklearn import tree
from sklearn.datasets import load_iris

如您所见,我们将在此示例中使用著名的 iris 数据集。

下一步是定义树并将其拟合到数据中。

iris = load_iris()
X, y = iris.data, iris.target
clf = tree.DecisionTreeClassifier(max_depth=4)
clf = clf.fit(x, y)

现在让我们绘制拟合树。

plt.figure(figsize=(12,8)) 
tree.plot_tree(clf, filled=True, fontsize=10)
plt.show()

image.png

  • 我们的数据集中有 4 个特征,萼片长度、萼片宽度、花瓣长度、花瓣宽度,顺序相同。 根节点根据花瓣长度分割整个种群。
  • 这导致叶节点具有分类样本,而其余的在花瓣宽度上再次分裂,因为相关的基尼系数(Gini impurity index)仍然很高。
  • 这个循环一直持续到我们获得具有低基尼系数(Gini impurity index)的同质节点,或者达到 MAX_DEPTH。
  • 总而言之,我们对分类决策树模型的架构有了一个相当不错的了解。

另一种可视化决策树的方法是使用 dTreeViz 库。 它不仅适用于 scikit-learn 树,而且还支持 XGBoost、Spark MLlib 和 LightGBM 树。

让我们看看它与 sklearn 的功能有何不同。

首先,该库需要通过 pip 或 conda 安装,您可以在此处找到说明。

安装完成后,进行所需的模块的导入了。

from sklearn import tree 
from sklearn.datasets import load_iris 
import matplotlib.pyplot as plt 
from dtreeviz.trees import *

然后定义、拟合和绘制树。

classifier = tree.DecisionTreeClassifier(max_depth=4) 
iris = load_iris()
classifier.fit(iris.data, iris.target)
viz = dtreeviz(classifier, iris.data, iris.target,
target_name='variety',
feature_names= iris.feature_names, 
class_names=["setosa", "versicolor", "virginica"])

viz.view()

这就是我们得到的结果。

image.png

  • 获得的图传达了与 sklearn 非常相似的含义,但它对每个决策节点的直方图更具描述性。
  • 您可以通过设置参数 fancy=False 来关闭这些绘图。
  • 同样,您还可以借助该库可视化回归树、特征目标空间热力图和决策边界。

2. ANN Visualizer

如果您正在研究需要可视化的神经网络模型,这可能是一种方法。 让我们来看看如何利用它来发挥我们的优势。

与 dVizTree 类似,这个库也依赖于需要安装的 graphviz。 您可以在此处找到安装说明。

进行所需的结构的导入。

import keras
from keras.models import Sequential
from keras.layers import Dense
from ann.visualizer.visualize import ann_viz

现在让我们定义我们的神经网络。

network = Sequential()
network.add(Dense(units=6, activation='relu', 
kernel_initializer='uniform', input_dim=7))
network.add(Dense(units=4, activation='relu', 
kernel_initializer='uniform'))
network.add(Dense(units=1, activation='sigmoid', 
kernel_initializer='uniform'))

绘制网络。

ann_viz(network, view=True, title=’Example ANN’)

输出结果。

image.png

  • 这很好地概述了我们定义的神经网络模型的架构。
  • 我们可以用代码计算每一层的神经元数量,看看它是否符合我们的要求。
  • 这个库的唯一缺点是它只适用于 Keras。

我们刚刚看到了一个如何可视化人工神经网络架构的示例,但这并不是这个库所能做的全部。 我们还可以使用这个库来可视化卷积神经网络。 让我们看看如何。

首先,像往常一样,我们定义 CNN。

def build_cnn_model(): 
    model=keras.models.Sequential()

    model.add(Conv2D(32, (3, 3), padding="same",
    input_shape=(32, 32, 3), activation="relu"))

    model.add(Conv2D(64, (3, 3), padding="same",
    input_shape=(32, 32, 3),activation="relu")) 

    model.add(MaxPooling2D(pool_size=(2, 2)))

    model.add(Flatten()) 
    model.add(Dense(512, activation="relu"))
    model.add(Dropout(0.2))
    model.add(Dense(10, activation="softmax"))

    return model

出于可视化目的,我们将网络保持在较小的尺寸。 现在让我们绘制它,看看我们得到了什么。

image.png

  • 这确实为我们的 CNN 设计描绘了一幅非常好的画面,所有层都描述得很好。
  • 您只需要修改网络代码即可获得新的可视化效果。

3. Netron

正如其创建者所描述的,Netron 是一种用于深度学习和机器学习模型的可视化工具,它可以为模型的结构生成具有描述性的可视化。

它是一个跨平台的工具,可以在 Mac、Linux 和 Windows 上运行,并且支持多种框架和格式,如 Keras、TensorFlow、Pytorch、Caffe 等。那我们如何使用这个工具呢?

作为一个独立于操作系统的工具,您可以按照这些说明将其安装在您的机器上,也可以简单地使用我们将在此处使用的他们的网络应用程序。

让我们可视化我们为上一个工具定义的 CNN。 我们需要做的就是保存模型并以 .h5 格式或任何其他支持的格式上传保存的文件。 这是我们得到的:

image.png

  • 起初,它可能看起来与我们使用 ANN 可视化器得到的相似,但两者之间有一个很大的区别——Netron 更具交互性。
  • 我们可以根据自己的需要将图表的方向更改为水平或垂直。
  • 不仅如此,所有的彩色节点都是可展开的,可以点击查看各个节点的属性,更好地理解。 例如,当我们单击 max_pooling2d 时,我们会得到:

image.png

  • 我们可以看到,可以从中推断出点击节点的许多属性,如数据类型、步幅大小、可训练的等,使其比我们之前的工具好一点。

4.NN-SVG

该工具主要用于以参数方式说明神经网络 (NN) 并将这些绘图导出为可缩放矢量图形 (SVG),因此得名 NN-SVG。

该工具可以生成三种类型的图形:

  • 经典的全连接神经网络 (FCNN) 图
  • 卷积神经网络 (CNN) 图
  • 深度神经网络图形,遵循 AlexNet 论文中介绍的风格。

该工具是托管的,因此无需任何安装。 以下是借助此工具创建的简单神经网络架构示例:

image.png

  • 我们在这里有很多选择,例如:

    1. 边缘宽度与边缘权重成正比,
    2. 边缘不透明度与边缘权重成正比,
    3. 边缘颜色与边缘权重成正比,
    4. 层间距,
    5. 控制结构和权重。
  • 所有这些选项都可以让您快速创建直观的插图。

如上所述,我们还可以使用此工具创建卷积神经网络的设计,如下例所示:

image.png

  • 我们在 CNN 中也有各种选择,就像我们对神经网络所做的那样。
  • 您可以在此处简单地操作架构以获得新的输出,该工具非常具有交互性并且是一个非常好的选择。
  • 该工具在为研究和出版物创建网络图表方面非常流行。

5. TensorBoard

没有 TensorFlow 的开源可视化工具包 TensorBoard,任何模型可视化教程都是不完整的。 我把它留到最后,因为它很大。 我们在这里只讨论它在模型架构中的用途,我们将在下一节中再次讨论它。

因此,首先,TensorBoard 安装可以通过这些命令中的任何一个来完成。

pip install tensorboard
# or
conda install -c conda-forge tensorboard

现在让我们通过在单元格中运行此命令将 TensorBoard 加载到我们的notebook中。

%load_ext tensorboard

加载后,我们必须创建一个日志目录,TensorBoard 将在其中存储所有日志并从中读取以显示各种可视化效果,之后必须重新加载 TensorBoard 进行更改。

log_folder=’logs’
%reload_ext tensorboard

现在让我们进行所需的导入并定义我们的模型。 在本练习中,我们将模型拟合到 MNIST 数据集。

import tensorflow as tf 
from tensorflow.keras.callbacks import TensorBoard

mnist = tf.keras.datasets.mnist

(X_train, y_train), (X_test, y_test) = mnist.load_data() 
X train, X_test = X_train / 255.0, X_test / 255.0

model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(input_shape=(28, 28)),
  tf.keras.layers.Dense(512, activation='relu'), 
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(10, activation='softmax')])

model.compile(optimizer='sgd',
  loss='sparse_categorical_crossentropy',
  metrics=['accuracy'])

现在我们需要创建一个 TensorBoard 回调,它负责记录所有事件,然后指定我们创建的日志目录。

callbacks = [TensorBoard(log_dir=log_folder, histogram_freq=1, 
 write_graph=True, write_images=True,     
 update_freq='epoch', profile_batch=2)]

最后,我们将模型拟合到我们的数据并传入回调,以便以后可以可视化所有内容。

model.fit(X_train, y_train, epochs=5, 
    validation_split=0.15, callbacks=callbacks)

现在让我们通过运行以下命令将 TensorBoard 窗口直接加载到我们的 jupyter notebook 中:

%tensorboard --logdir={log_folder}

接下来,如果我们导航到图表选项卡,我们将看到以下输出:

image.png

因此,这就是我们如何使用 TensorBoard 查看模型结构的方式。

我们已经探索了可视化模型结构的工具和框架,现在让我们继续下一部分——训练可视化。

模型训练可视化

1. TensorBoard

在上一节中,我们将神经网络安装到 MNIST 数据集并检查了“Graphs”选项卡。 但是,事实证明,在 TensorBoard 中还有很多其他选项卡可供探索。

让我们从“Scalars”开始。

如下图所示,此选项卡处理经过 epoch 计算的损失和准确率图。

image.png

下一个选项卡是“Images”。

此选项卡可视化权重和偏差。 每个图像都有一个滑块,我们可以调整它以显示不同时期的参数。

image.png

接下来,“Distributions”选项卡。

它显示了每个时期某个密集层的权重和偏差分布。

image.png

“Histograms”选项卡与“Distributions”选项卡的功能类似,只是借助直方图。

image.png

最有趣的标签是“Projector”。 它可以可视化任何类型的向量表示,无论是词 embeddings 还是图像的 numpy 数组表示。

默认情况下,它使用主成分分析 (PCA) 将此可视化绘制到 3D 空间中,但也可以选择其他降维方法,如 UMAP 或 T-SNE。 实际上,您可以定义自己的自定义方法。

使用 PCA,它看起来像这样。

image.png

我们已经介绍了所有选项卡,但我们仍然可以使用 TensorBoard 做很多事情,比如可视化训练数据、绘制混淆矩阵或超参数调优,但它们超出了本文的范围。

让我们看看另一个工具。

2. Neptune

Neptune 是一个元数据存储平台,可免费用于个人项目,并可用作 API 服务。

虽然编码部分可以在任何地方完成,但只要代码连接到 Neptune,就会在 Neptune 的 UI 中继续进行持续跟踪和日志记录,从而简化项目管理。

让我们从安装所需的东西开始:

!pip install -q neptune-client
!pip install -q neptune-contrib

我们将使用与上述示例类似的模型和 MNIST 数据集,因此我们将不再讨论该部分。

要在每个 batch 和 epoch 之后记录指标,让我们创建一个 NeptuneLogger 回调。 这部分类似于我们在上一个示例中创建的 TensorBoard 回调。

from tensorflow.keras.callbacks import Callback
class NeptuneLogger(Callback):
    def on_batch_end(self, batch, logs={}):
        for log_name, log_value in logs. items(): 
            run["batch/{}".format(log_name)].log(log_value)

    def on_epoch_end(self, epoch, logs={}): 
        for log_name, log_value in logs.items(): 
            run["epoch/{}".format(log_name)].log(log_value)

要将我们的代码连接到 Neptune 应用程序,我们需要一个 API 令牌。 要获得该 API 令牌,您需要注册 Neptune 并创建一个项目。 该项目的名称将与参数项目和针对 api_token 的相应 API 令牌相对应。

现在让我们初始化 API。

run = neptune.init(project=YOUR_PROJECT_NAME,  api_token=YOUR_API_TOKEN)

现在让我们处理我们想要记录的任何内容。

EPOCHS = 5 
BATCH_SIZE = 32

# log params
run["parameters/epochs"] = EPOCHS 
run["parameters/batch_size"] = BATCH_SIZE

# log name and append tag 
run[ "sys/name"] = "metrics"
run[ "sys/tags"].add("demo")

现在剩下要做的就是将我们的 NeptuneLogger 作为 keras 回调传递。

history = model.fit(x=x_train, y=y_train, 
      epochs=EPOCHS, batch_size=BATCH_SIZE,   
      validation_data=(x_test, y_test),   
      callbacks=[NeptuneLogger()])

执行完最后一个代码单元后,我们可以前往 Neptune 应用程序的 UI 以可视化我们记录的任何内容。

针对 batches 绘制的训练 accuracy/loss。

image.png

针对 epochs 绘制的训练 accuracy/loss。

image.png

针对 epochs 绘制的验证 accuracy/loss。

image.png

除了损失和准确率等简单指标外,您还可以轻松绘制其他内容,例如混淆矩阵或 AUC-ROC 曲线(参见此处的示例)。

虽然这只是一个有限日志记录的演示,但您可以想象在处理涉及持续重新训练和更新的项目时,该工具使模型的不同方面可视化是多么容易。

工具比较

如果您自己进行一些实验并且正在寻找可视化工具,那么 TensorBoard 是一个不错的选择。 Neptune 更适合那些正在寻找一种复杂工具的研究人员,这些工具可以让他们更深入地研究实验过程。 它还提供团队协作功能。详情请查看:Neptune 和 TensorBoard 的详细比较

3. Weights & Biases

与 Neptune 一样,该工具还有助于跟踪、监控和可视化 ML 模型和项目。

首先,在他们的网站上注册,然后通过以下命令安装和登录:

pip install wandb
wandb login

输入 API 密钥后,您应该已准备就绪。 现在让我们为我们的 Keras 模型进行所需的导入。

import wandb
from wandb.keras import WandbCallback

让我们初始化 wandb 并开始我们的项目。

wandb.init(project=’blog-demo’)

现在我们需要做的就是训练我们目前使用的模型,并将 WandbCallback 传递给日志指标。

model.fit(X_train, y_train, validation_data=(X_test, y_test), 
    callbacks=[WandbCallback()], epochs=5)

现在我们可以前往 UI 并查看已记录的内容。

image.png

这只是看看它可能是什么样子。 但是,就像 Neptune 一样,它可以扩展到绘制许多不同的事物,以及根据这些记录的指标比较不同的模型。

4. TensorWatch

TensorWatch 是 Microsoft Research 提供的数据科学调试和可视化工具。 大多数当前可用的工具都遵循“所见即所得”(WYSIWYL)方法,该方法使用许多预定义的可视化来表示结果。

这可能会导致不断变化的模型出现问题。 TensorWatch 通过将所有内容视为流来解决这个问题。 对其工作原理的简单描述是:

  • 当在 TensorWatch 流中写入内容时,这些值会被序列化并发送到 TCP/IP 套接字,包括您指定的文件。
  • 在 Jupyter Notebook 中,之前记录的值将从文件中加载,然后 TCP-IP 套接字将监听任何其他未来值。
  • 然后可视化器监听流并在值到达时呈现它们。

使用 TensorWatch 的唯一缺点是目前它只支持 PyTorch 框架。

让我们开始安装它。

pip install tensorwatch

接下来,我们需要安装一个名为 regim 的 Python 包,它允许我们使用 PyTorch 模型文件并使用少量代码在指定的数据集上运行训练和测试 epoch。

git clone https://github.com/sytelus/regim.git
cd regim 
pip install -e .

然后,从安装 regim 的文件夹中运行您的训练脚本。

python mnist_main.py

使用 regim 包,我们可以使用 train 数据集在 epoch 上训练模型,维护少量指标,并对事件进行回调。 在每个 epoch 之后,它可以在测试数据集上运行到目前为止训练过的模型,并在其上维护指标。

它为训练和测试周期维护单独的观察者,因此我们可以分别查看每个观察者的指标。 port 参数指定其套接字的基线端口的偏移量。

train = tw.WatcherClient(port=0)
test = tw.WatcherClient(port=1)

现在让我们绘制几个指标,例如:训练损失、训练准确率、测试损失和测试准确率。

loss_stream = train.create_stream(expr='lambda d:
                                 (d.metrics.epochf, 
                                 d.metrics.batch_loss)', event_name='batch')
loss_plot = tw.Visualizer(loss_stream, vis_type='line', 
                                 xtitle='Epoch', ytitle='Train Loss')

acc_stream = train.create_stream(expr='lambda d: 
                                 (d.metrics.epochf, d.metrics.batch_accuracy)', event_name='batch')
acc_plot = tw.Visualizer(acc_stream, vis_type='line', 
                                 host=loss_plot, xtitle='Epoch', ytitle='Train Accuracy', yrange=(0,))

test loss_stream = test.create_stream(expr='lambda d: 
                                 (d.metrics.epochf, d.metrics.batch_loss)', event_name='batch')
test_loss_plot = tw.Visualizer(test_loss_stream, vis_type='line', 
                                 host=loss_plot, xtitle= 'Epoch', ytitle='Test Loss', yrange=(0,))

test_acc_stream = test.create_stream(expr='lambda d:
                                 (d.metrics.epochf,
                                 d.metrics.batch_accuracy)', event_name='batch')
test_acc_plot = tw.Visualizer(test_acc_stream, vis type='line', 
                                 host=loss_plot, xtitle='Epoch', ytitle='Test Accuracy',yrange=(0,))

test_acc_plot.show()

这是我们得到的:

image.png

同样,我们也可以通过以下方式绘制每一层的权重梯度平均值:

grads_stream = train.create_stream(expr='lambda 
                                 d:grads_abs_mean(d.model)',
                                 event_name='batch', throttle=1)

grads_plot = tw.Visualizer(grads_stream, vis_type='line', 
                                 title="Weight Gradients",
                                 clear_after_each=True, 
                                 xtitle="Layer",
                                 ytitle="Abs Mean Gradient', history_len=20)

grads_plot.show()

下面是渐变的样子。 当然这些只是我们可以用这个工具做的一小部分事情,还有更多需要探索。 由于该工具仍在开发中,一旦它开始支持更广泛的框架,我们肯定会看到更多。

image.png

5. Neural Network Playground

这个工具是一个荣誉奖,因为它更多地用于学习和教育非专家用户关于神经网络的内部机制。

它是 Google 提供的基于 Tensorflow 的开源工具。 您可以直接在浏览器中模拟小型神经网络,并在使用它们时观察结果。

它看起来像这样。

image.png

  • 您可以在分类和回归之间切换问题类型,并修改网络和问题的每个可能方面,从激活函数到许多隐藏层,从使用纯数据集到嘈杂的数据集。
  • 设置完所有内容后,只需点击播放按钮即可开始训练,之后您可以观察形成的决策边界(模型如何分离不同的类)。
  • 模型训练看起来很有趣,并在这个黑盒背后给你直观。

我们已经介绍了相当多的可视化训练工具,让我们继续进行可视化的最后一部分。

模型推理可视化

这主要涉及解释模型生成的预测,并首先收集关于如何以及为什么达到这些预测的想法。

我在此博客的另一篇文章中对此进行了广泛讨论。 它涵盖了相当多的工具,可以成为 MLOps 工具库的一个非常好的补充。

总结

我们在本文中涵盖了很多内容,从为什么我们需要可视化模型开始,到使用许多可以帮助我们创建可视化的工具获得实践经验。

我希望这篇文章能帮助您更好地理解可视化,下次当你陷入了一个问题(可视化是正确答案)时,您将利用这里讨论的工具和知识。

未来发展方向

这里讨论的工具和框架只是当前最流行的。 研究的发展速度如此之快,您应该时刻关注新工具。

除此之外,请始终积极寻找新的可视化用户场景,其中展示模型的图片或插图可能会解决手头的问题。

原文链接:Visualizing Machine Learning Models: Guide and Tools