深度学习模型训练过程盯log头晕眼花?复杂模型结构全靠脑补?网络各层效果无法评估?模型评估指标难以综合权衡?近日,VisualDL 2.0 ——飞桨可视化分析工具全面改版升级,帮众位开发者们从”炼丹萌新”变身“太上老君”。

VisualDL是百度飞桨为广大深度学习开发者订制的功能完备的可视化分析工具。它可以帮助深度学习开发者了解训练过程中模型参数的变化趋势、 网络层对数据特征的提取情况、网络结构应该如何调整、精度与召回是否达到了理想的平衡等,从而实现有方向性的错误排查,实现高效的模型调优。
早在2017年VisualDL 1.0就已推出,随着飞桨开源深度学习平台3年深入产业实践的不断打磨,VisualDL本次也完成了2.0版本的全新蜕变!相较VisualDL 1.0,新版本的API设计更加简洁易用、与框架衔接更为顺畅、功能更丰富,界面设计也全面进行了升级,致力为老用户带来全新体验,为新用户带来使用上的惊喜。
VisualDL 2.0能做什么?
当前,VisualDL 2.0共有五大可视化功能。
1、标量(Scalar)
标量可以通过图表的形式展示Loss、Accuracy、Learning Rate等参数指标在训练过程中的变化趋势,帮助开发者了解其是否朝着理想的方向优化,便于发现异常情况,及时排查并修复问题;另外,通过对比多组实验的训练参数,开发者们能深入探究参数对模型效果的影响,加速模型的调优。
实现代码:

2、数据样本分析(Sample)
数据样本分析可以在多种深度学习任务中发挥重要作用。例如在计算机视觉任务中,该功能不仅可以查看每个训练批次中的指定的样本图片,也可以展示图像数据的在训练过程中间阶段的提取特征情况,便于开发者们观察图片数据在训练过程中的状态,进而深入了解训练过程及效果。
实现代码:

在语音识别或合成任务中,数据样本分析功能可以帮助开发者实时获取训练过程中的音频数据,评估语音识别或合成的效果,挑选最优的训练模型。
实现代码:

3、模型结构(Graph)
模型结构功能支持一键可视化模型网络结构。开发者们可查看模型属性、节点信息、节点输入输出等,并支持节点搜索功能,协助开发者们快速分析模型结构并了解数据流向。
当前支持如下两种操作方式:
模型文件拖拽上传

在命令行加入参数–model并指定模型文件路径(非文件夹路径),运行命令后即可启动:


4、直方图(Histogram)
直方图可以展示Tensor(weight、bias、gradient等)数据在训练过程中的变化趋势,深入了解模型各层效果,帮助开发者精准调整模型结构。
实现代码:

5、PR曲线(PRCurve)
PR曲线可以展示每一分类在不同阈值下的精度(Precision)-召回率(Recall)曲线,帮助开发者权衡模型精度和召回率之间的平衡,设定最佳阈值。精度是指正样本的数量除以所有被选中样本的数量,而召回率是指所有正样本中被推理正确的比例,由此可见精度越高,召回率越高,我们的模型就越好。但是很多情况下,鱼和熊掌不可兼得,无法同时保证精度和召回率都是最高,此时需要通过PR曲线,权衡精度与召回率,确定最佳阈值。
实现代码:

为了便于大家更好的了解VisualDL,我们结合一个简单的实际模型例子来更直观的看下这几个功能,那就是深度学习中的“Hello World”,手写数字识别。
VisualDL 2.0怎么用?
假设在一个风和日丽的早晨,作为深度学习爱好者的你,想要建立一个简单的LeNet模型进行手写数字识别,在辛苦完成模型搭建后,进入模型训练时,却看到了如下一幕:

你心里一沉,这精度怎么抖得那么厉害啊。训练中哪里出现问题了呢?到底谁是“凶手”?可是连问题出在哪都不知道,模型优化和修复更是无从下手。这时你想起几日前偶然发现的深度学习可视化分析工具——VisualDL,心中顿时升起希望,因为在训练之前,已经把下面的代码添加到训练脚本中了。

接下来就执行下面的命令来开始奇幻的破案(调优)之旅吧!

执行命令后,即可得到这样一个网址http://localhost:8080/,打开浏览器输入这个网址即可查看究竟发生了什么。首先来看看案发现场。。
点击“标量数据”页签查看模型的Loss和Accuracy整体变化趋势,也就是把刚才的日志信息通过图形直观的展示出来。这部分对应的代码如下所示:

一眼望去,这哪是Loss和Accuracy的变化曲线啊,这明显是心率不齐啊,让人有打120叫救护车的冲动了!
显而易见,Accuracy一直在10%左右徘徊,Loss一直无法下降,由此我们开始逐个查看问题出在哪个环节。首先看看模型结构的实际样子,是否是结构设计出了问题。

点击“网络结构”页签,将保存在“./model”目录下的模型文件拖进页面即可看到模型的结构。

通过观察模型结构、节点属性、模型属性、数据流向,咱们可以直观的发现整体结构是符合预期的,也就是说模型网络本身是清白的,那么是否是模型“吃进”的数据有问题呢?
点击“样本数据”查看训练中的样本数据。这部分对应的代码如下所示:

通过查看每批次数据的第一张图片,发现输入数据也是没有问题的。那么咱们再来“回放录像”,看看每一时间步的参数变化情况吧。

点击“直方图”页签,查看训练过程中每一时间步权重和偏差的变化情况,就如同回放整个训练过程的监控录像一样,让训练过程中参数变化不正常的问题无所遁形!这部分对应的代码如下所示:


通过查看后发现,每一层的权重和偏差的变化正常。由此证明不是特定层的初始参数配置出现问题,排除了模型结构、数据样本、每层网络参数配置后,还剩下超参数的配置,因此决定尝试不同的学习率(0.001,0.03,0.05,0.08,0.1),并通过VisualDL的多实验对比功能,来观察学习率对模型训练效果的影响情况。
启动多实验对比功能非常的简单,只需要在训练脚本中参考如下代码实现同一个目录下记录多份不同学习率的训练日志文件,并启动相应训练即可。接着启动VisualDL,就会得到多组实验记录对比图了。


你终于发现了问题所在了,原来是学习率设置的过大了,导致Loss无法下降收敛,根据“标量数据”展示的效果,当学习率为0.001时(深蓝色线条),Loss呈现优美的下降趋势且后续渐渐收敛,Accuracy呈现逐渐上升并趋于平稳,因此你将学习率设置为0.001,使得模型呈现最佳效果。
但是你还不满足于现状,想要选择一个最佳阈值,使得模型的精准度和召回率都达到最优,于是又开始使用“PR曲线”功能。
点击“PR曲线”页签,权衡精确度与召回间的关系,确定最佳阈值。这部分对应的代码如下所示:


以上图为例,该图是手写数字识别任务中类别7对应的PR曲线,从图中可以看出,当阈值为0.10、0.15或0.20时,准确率和召回率同时达到最高值,因此选择上述中的任意阈值,模型都可达到最佳效果。
最终,在VisualDL的帮助下,你确定了模型阈值为0.15,学习率为0.001,至此,一个效果理想的手写数字识别模型搭建完成。
写在最后
看到这里,相信大家已经对VisualDL 2.0有了一个比较全面的了解,也发现它是真的又有用,又好用吧?然而这还不够,飞桨团队还为它增加了诸多软实力:
1、高兼容性:全面支持飞桨、ONNX、Caffe等市面主流模型结构可视化,广泛支持各类用户实现可视化分析。
2、生态支持全面:与飞桨的多个套件、工具组件以及AI学习和实训社区AI Studio全面打通,为开发者们在飞桨生态系统中提供最佳使用体验。
在未来,VisualDL将会持续加入新的功能组件,致力于为开发者们提供简单易用、功能丰富、性能强大的可视化分析工具,助力模型的优化过程。