如何更好地调试神经网络?
声明:本文适合神经网络初学者。
神经网络的调试比大多数程序更难,因为大多数bug不会导致运行错误,只会导致不好的收敛。可能有许多看似模糊的错误消息:
性能错误:您的神经网络没有训练好(性能:您的神经网络没有训练好)。
如果你有经验,你应该知道这意味着代码需要大的改变。
第一,对付南?在大多数情况下,NaN错误发生在前100次迭代中,原因很简单:你的学习率太高了。当学习率很高时,在前100次迭代中会出现NaN错误。使用系数3来降低学习率,直到前100次迭代不再出现NaN错误。一旦这样做了,你将会有一个非常好的学习速度。根据我的经验,最好的学习率是你得到NaN错误的范围的十分之一。
如果在100次迭代后遇到NaN错误,有两个常见原因。
如果您使用RNN,确保您使用梯度下降和L2正则化的梯度。RNN在训练初期似乎有一个梯度,10%以下批次有学习高峰,此时梯度幅度相当高。如果不切割梯度,这些峰将产生NaN。
如果写自定义网络层,很有可能NaN是除以0造成的。另一个已知会产生Nan误差的层是Softmax层。Softmax计算包括分子和分母的exp(x)运算,可以将无穷大除以无穷大,得到NaN。确保使用稳定的Softmax实现。
第二,神经网络可以不学?一旦你没有NaN误差,你的神经网络可以平滑运行上千次迭代,也不会减少前几百次迭代后的训练损失。当你第一次构建代码库时,你最好不要使用2000次迭代。这并不是因为所有的网络都可以从少于2000次的迭代中学习。相反,从一开始就对网络进行编码很可能会有bug,在达到高迭代次数之前,您会希望过早地对其进行调试。现在的目标是一次又一次地缩小问题的范围,直到你得到一个在2000次迭代下训练出来的网络。幸运的是,有两种方法可以降低复杂性。
将训练集的大小减少到10个实例。在数百次迭代中,在这10个实例中,神经网络通常出现过度拟合。许多编码错误不会导致过拟合。如果你的网络没有。;不要过度适应10个示例的训练集,请确保您使用的数据标记正确。将批次大小减少到1,以检查批次计算错误。将print语句添加到代码中可以确保输出符合您的预期。通常可以通过上面介绍的纯蛮力找出错误。一旦可以在10个实例上训练网络,就可以尝试在100个实例上训练它。如果这种方常工作,但效果不是很好,可以尝试以下方法。
解决你感兴趣的最简单的问题。如果要翻译句子,可以先建立一个特定语言的语言模型。如果你已经完成了,试着用三个单词预测第一个翻译的单词。如果要检测图像中的物体,可以在训练回归网络之前对图像中的物体数量进行分类。在网络可以解决的棘手问题和使用最少的时间为代码获取适当的数据之间有一个权衡。这是发挥你创造力的时候了。
将神经网络应用到其他新场景的技巧就是合理使用上面介绍的两个步骤。这是一种协调机制,效果不错。首先,你表明这个神经网络至少能记住几个例子。然后这个神经网络可以推广到更简单问题的验证集。你在稳步前进的同时也在慢慢增加难度。It没有卡帕西专家第一次使用的风格,但至少它是有效的。有时候你会遇到一个棘手的问题,你会发现它不会在2000次迭代中继续学习。那个太棒了!但是迭代次数很少是这个问题之前复杂度的10倍。如果您发现是这种情况,请尝试搜索中等复杂程度。
第三,调整参数。现在你的网络可以学习东西,你可能会忘乎所以。你可能还会发现你训练的网络可以不能解决大多数复杂的问题。超参数调整是解决问题的关键。有些人直接下载CNN软件包并在他们的数据集上运行,然后告诉你使用超参数调整并不没什么区别。这是因为他们使用现有的架构来解决现有的问题。如果你想解决的问题需要一个新的架构,就需要通过超参数调整来得到一个好的设置。你d最好确定你已经看了你要解决的问题的超参数教程,不过我下面会列出一些基本思路。
可视化:唐不要害怕在培训期间花时间编写定制的可视化工具。如果你的可视化方法不。;如果行不通,考虑另一种方法。
权重初始化:一般来说,较大的初始化权重是一个不错的选择,但是过大会导致NaN。
确保重量看起来"健康"。为了理解这意味着什么,我建议在IPython的笔记本。花点时间观察在标准数据集(如Imag
怎样在Linux下编程?需要什么技术?
Linux下编程其实很方便。Linux下有完整的编辑、调试、编译、打包的栈工具。
当然需要熟悉常见的linux命令,熟悉shell环境,能够适应纯命令行终端的使用(Xwindows环境不是很成熟,不推荐)。然后BugBug就给大家讲讲Linux编程的一些技术:
终端编辑器和插件vim:Vim是最常用的Linux编辑工具,是linuxIDE环境的矩阵。使用Vim配合一些插件,完全可以实现现代IDE环境下的大部分功能。
推荐组合:
主题:莫洛凯岛(github:/tomasr/莫洛凯岛),vim-colors-日晒。
插件:YouCompleteM自动完成(github:/valloric/YouCompleteM)
浏览目录结构插件nerdtree(GitHub:/croolose/nerdtree)
推荐的其他有用的vim工具:
Vim-surround:删除、修改和添加括号、引号和XML操作。
Matchit:使用%在字符之间跳转。
TComment:快速注释和取消注释代码。
表格:对齐。
:代码段。
Vim-easymotion:定位。
即时降价:降价时预览文件。
Emacs:emacs是*unix系统中最大最强大的编辑器和操作系统(它几乎可以做任何事情)。
emacs中常用的推荐插件
spacemacsvim和emacs功能的优势集:
德古拉主题是一个美丽的主题;
更多信息可以在github中看到仓库Awesome-Emacs(Github:/Emacs-TW/Awesome-Emacs)。
调试debuglinux有强大的调试功能。工具gdb。GDB允许你调试程序,包括在你想的地方停止程序,这时你可以查看变量,寄存器,内存和堆栈。此外,您可以修改变量和内存值。对C、C、Fortran、rust、golang等语言的原生支持可以通过插件来实现。比如基于浏览器的扩展GDBGUI(GitHub:/CS01/GDBGUI)。
链接编译工具Makemake是*nix下最强大的链接编译工具。基于Makefiles的配置可以实现大型项目的自动编译和编译,减少开发人员的编译劳动。
screen、Tmux、byobu等窗口和分屏工具也是码农不可或缺的工具。这些昆虫的文章有专门介绍,所以我赢了这里不再赘述。
基于需求和编码农民的语言环境,Linux下也有大量的工具来满足需求,这也是昆虫篇所涵盖的领域之一。关注昆虫可以学习和接受昆虫的最新文章介绍。