本篇文章4306字,读完约11分钟

雷锋。com ai科技评论:当你看报纸,看别人的模型时,似乎一切都很顺利,但是当你训练自己的模型时,你会遇到一个又一个的麻烦...雷锋。(公开号码:雷锋。《人工智能科技评论》发现了一篇由国外的一位伟大的神斯拉夫·伊万诺夫写的独特的文章,它被编辑如下,并向你介绍了37种好方法!

干货 | 模型表现不好怎么办?37条妙计助你扭转局势

你的神经网络已经训练了12个小时,一切似乎都很完美:梯度运作良好,损失正在减少。但是预测是混乱的:所有的都是零,没有什么可以被监控。“我哪一步做错了?”你疑惑地问你的电脑,但是电脑却一句话也没说,只是微笑着。

干货 | 模型表现不好怎么办?37条妙计助你扭转局势

如果你的模型的所有输出都是辣子鸡——例如,如果你想预测所有输出的平均值,或者模型的精度很低——我应该从哪里开始检查呢?

有许多地方会出错。经过多次调试,我经常做这种检查。基于我自己的经验和许多好的想法,我写了以下指南。我希望它对你也有用。

目录

0.如何使用该指南

首先是数据库问题

第二,数据标准化/增强

三.执行问题

四.培训问题

0.关于如何使用本指南的许多问题可能会出错。然而,有些问题相对容易解决。通常我从这个急救清单开始:

1.从一个简单的模型开始,找到一个对这类数据来说可行的模型,例如,使用vgg来处理图像。如果可能,选择一个标准损失函数。

2.删除所有花哨的小工具,如标准化和数据增强。

3.微调模型时,请仔细检查数据预处理,因为它必须与原始模型的训练数据一致。

4.确认输入数据正确。

5.从一个小数据库开始(2-20个样本)。用这个调试,然后慢慢添加更多的数据。

6.慢慢地添加回每个省略的组件:增强、规范化、定制损失函数和更复杂的模型。

如果以上步骤不起作用,请根据下面较长的列表确认每个项目。

老板:你给我的数据正确吗?

——程:这些年我给你的数据都是错的。你今天为什么想找茬?

-老板:你说什么?

程:我说数据是完全准确的。

1.检查输入数据

检查您输入网络的数据是否正确。例如,我已经多次混淆了图像的长度和宽度。有时候,我不小心输入了全零。有时,我会反复使用同一批数据。因此,打印并显示您想要的输入和输出,以确保数据是正确的。

干货 | 模型表现不好怎么办?37条妙计助你扭转局势

2.尝试随机输入

尝试输入随机数据,而不是真实数据,看看你是否得到同样的错误。如果是的话,你的网络肯定有问题。尝试逐层调试,一次一条指令,看看哪一点出错了。

干货 | 模型表现不好怎么办?37条妙计助你扭转局势

3.检查数据导入

也许您的数据是正确的,但是用于将数据导入网络的代码可能有问题。在任何操作之前,打印出第一层的数据。

4.确保输入和输出已连接

检查所有输入样本是否有正确的标签。然后对输入数据进行加扰,看看输出标签是否也会被加扰。

5.投入和产出之间的关系是否过于随意

与随机部分(如股票)相比,输入和输出之间的非随机部分可能太少。换句话说,投入和产出之间的相关性是不够的。对此没有完美的解决方案,因为这取决于数据。

干货 | 模型表现不好怎么办?37条妙计助你扭转局势

6.数据库中有太多噪音吗

我犯了这样一个错误,我破坏了一个食品网站的形象。有太多的错误标签,所以网络不能学习。手动检查一些输入样本,看看标签是否有问题。

行业内没有统一的分水岭,在标签误差为50%的情况下,一篇论文的准确率达到了50%以上。

7.破坏数据库

如果数据库是按标签排序的而不是被干扰的,它可能会影响网络的学习。打乱数据库的顺序来防止这个问题。确保输入和标签被混在一起。

8.减少班级倾斜问题

甲班的图像比乙班多一千倍吗?然后你必须平衡你的损失函数,或者尝试其他的方法来扭曲问题。

9.你有足够的训练例子吗?

如果你从头开始训练神经网络,也就是说,不调试,你可能需要大量的数据。至于数据分类,很多人说每个类别需要1000甚至更多的图像。

10.确保一批数据不包含单个标签

这个问题可能发生在排序的数据库中,例如,10,000个样本包含相同的类别。只要秩序混乱,这很容易解决。

11.缩小小批量生产的规模

一篇论文指出,非常大的小批量将降低模型的泛化能力。

附录1:使用标准数据库(如mnist和cifar10)

感谢@hengcherkeng网友的提示:

当测试新的神经网络架构或编写新代码时,首先使用标准数据库而不是您自己的数据。这是因为这些数据库有很多可以解决的参考结果。这样就避免了以下问题:标签噪声、训练/测试分布差异、数据库困难等。

干货 | 模型表现不好怎么办?37条妙计助你扭转局势

第二,数据标准化/增强12。标准化特征

你把输入标准化为均值0和方差1了吗?

13.数据增强过度了吗

用规范化增强效果。过度增强将导致其他形式的正常化(重量l2、脱落等)。),这可能会导致网络调试不足。

14.检查预培训模型的预调试

如果您使用的是预训练模型,您必须在训练期间使用与模型相同的规范化和预处理。例如,图像像素应该在哪个范围内,[0,1],[-1,1]或[0,255]?

15.检查培训/验证/测试数据库

Cs231n指出了一个常见的漏洞:

"...任何预处理数据,如数据平均值,必须只在训练数据中计算,然后应用于验证/测试数据。例如,计算平均值,然后从数据库的每个图像中减去平均值,然后将数据库分成训练/验证/测试数据,这是错误的。”

干货 | 模型表现不好怎么办?37条妙计助你扭转局势

此外,有必要检查每个样品或批次中的不同预处理。

三.执行问题

-这是你的机器学习系统。

-将数据输入这个巨大的线性代数,然后等待答案吐出来。

-如果答案是错的呢?

-然后挑起这个大混乱,直到答案是正确的。

16.把大问题变成小问题

这有助于定位问题。例如,如果目标输出是目标类别或坐标,则预测可以限于目标类别。

17.“随机”寻找合适的损失

或者从出色的cs231n开始:从没有标准化的小参数开始。例如,如果我们有10个类别,随机性意味着我们只能在十分之一的时间内得到正确的类别,软最大损失是正确类别的负对数概率:-ln(0.1) = 2.302。

干货 | 模型表现不好怎么办?37条妙计助你扭转局势

然后,尝试增加归一化的强度,这将增加损失函数。

18.检查你的损失函数

如果您执行自己的损失函数,检查是否有任何问题,并添加单元测试。我的损失函数经常有一些微小的误差,这导致神经网络的操作中的微小偏差。

19.确认损失输入

如果您在自己的框架下使用损失函数,您必须注意输入到它的数据必须满足它的期望。例如,在pytorch中,我会将nllloss与crossentropyloss混淆,这是一个错误,因为前者需要softmax输入,而后者不需要。

干货 | 模型表现不好怎么办?37条妙计助你扭转局势

20.调整损失的重量

如果损失函数由几个较小的损失函数组成,它们之间的相对大小必须正确。这可能需要测试不同失重的组合。

21.监控其他指标

有时,损失函数不能很好地预测神经网络训练的好坏。如果可能,使用其他测量方法,如精确度。

22.测试任何自定义图层

在神经网络中,你自己执行任何层吗?重复检查以确保它们正常工作。

23.检查“冻结”层或变量

检查一下你是否无意中发布了一些图层或变量的渐变更新,并且没有及时得到信息。

24.增加网络规模

也许你的神经网络的表达能力太小,无法描述目标函数。尝试添加更多层或在完全连接的层中隐藏单元格。

25.检查隐藏的尺寸误差

如果您的输入类似于(k,h,w) = (64,64,64),很容易忽略与错误维度相关的漏洞。在输入维度中使用特殊数字(例如,在每个维度中使用质数),并检查它们在网络中的传播方式。

干货 | 模型表现不好怎么办?37条妙计助你扭转局势

26.尝试梯度检查

如果您手动执行梯度下降,梯度检查可以确保反向传播正常工作。

四.培训问题

在图像中可以识别出一辆汽车。

27.使用非常小的数据库

使用一小部分数据库进行调试,以确保正常运行。例如,只用一两个例子来训练,看看你的神经网络是否能学会区分这些例子。然后给每种类型添加例子。

干货 | 模型表现不好怎么办?37条妙计助你扭转局势

28.检查重量初始化

如果不确定,使用xavier或he进行初始化。此外,初始化可能会导致不正确的最小面积,所以尝试几种不同的初始化方法,看看它们是否有用。

29.更改超级参数

也许您使用的超参数组有问题。如果可能,尝试网格搜索。

30.减少规范化

过度规范化可能会妨碍网络调试。减少一些标准化,如点滴、批量程序、重量/偏差l2标准化等。杰里米·霍华德在他的优秀课程《程序员的深度学习实践》中建议,首先应该消除不适应。这意味着在处理过度优化的问题之前,您必须充分优化训练数据。

干货 | 模型表现不好怎么办?37条妙计助你扭转局势

31.给时间

也许你的神经网络需要更多的时间来训练以做出有意义的预测。如果你的损失在稳步减少,让它训练一段时间。

32.从训练模式到测试模式

一些具有其他层的框架,例如批处理规范和退出,在训练和测试期间表现不同。切换到合适的模型有助于神经网络进行有效预测。

33.可视化培训

-监控每层的初始化、重量和更新。确保他们的优势相互匹配。例如,参数更新的强度应该是1-e3。

-考虑视觉库,如张量板和蜡笔。简单地说,你也可以打印出重量,偏差或初始化。

-注意层初始化的平均值是否大大超过0。你可以试试批量norm或elu。

——对于体重和偏见的直方图,网友深究4j这样说:

“关于权重,直方图应该在一段时间后大致呈高斯(正态)分布。至于偏置电压,直方图基本上从0开始,通常以接近高斯分布结束(长期和短期记忆网络除外)。注意参数接近正/负无穷大。注意变得非常大的偏置电压。如果类别分布非常不平衡,这种情况有时会发生在分类的输出级别。”

干货 | 模型表现不好怎么办?37条妙计助你扭转局势

-检查图层更新,它们应该是高斯分布。

34.尝试不同的优化器

你选择的优化器不应该妨碍神经网络的训练,除非你选择的超级参数特别有问题。然而,适合某项任务的优化器有助于在最短的时间内完成最多的训练。看看介绍算法的论文,其中应该说明使用什么优化器。如果不是,我更喜欢使用亚当或有动量的sgd。

干货 | 模型表现不好怎么办?37条妙计助你扭转局势

35.梯度消失和梯度爆炸

-检查图层更新,因为较大的值意味着渐变爆炸。梯度剪辑可能是有用的。

-检查图层初始化。用户深度学习4j提供了一个很好的指南:“对于初始化,良好的标准偏差在0.5到2.0的范围内。如果它远远超出这个范围,它可能会消失或爆炸。”

干货 | 模型表现不好怎么办?37条妙计助你扭转局势

36.提高或降低学习率

如果学习率低,模型的收敛速度会很慢。

如果学习率高,最初的损失会很快减少,但可能很难找到令人满意的答案。

你可以对你当前的学习率做一些小的改变,乘以0.1或者乘以10。

37.消除nan

当训练循环神经网络时,如果你看到nan,你会有一个大问题。解决方案包括:

-降低学习率,尤其是如果nan出现在前一百次迭代中。

-如果计算包括除以0的自然对数、寻找0或负数,则出现nan。

-逐层检查神经网络,看看nan来自哪里。

如果读者有什么好的想法,请在信息区分享,并以开源共享的精神帮助更多的人解决更多的问题。

雷锋。技术评论汇编

雷锋文章版权所有。严禁擅自转载。详情请参考转载说明。

标题:干货 | 模型表现不好怎么办?37条妙计助你扭转局势

地址:http://www.hcsbodzyz.com/hcxw/10937.html