社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  机器学习算法

7个实用的深度学习技巧

机器学习研究会订阅号 • 5 年前 • 252 次点击  

深度学习已经成为解决许多具有挑战性的现实世界问题的方法。对目标检测,语音识别和语言翻译来说,这是迄今为止表现最好的方法。许多人将深度神经网络(DNNs)视为神奇的黑盒子,我们放进去一堆数据,出来的就是我们的解决方案!事实上,事情没那么简单。

在设计和应用DNN到一个特定的问题上可能会遇到很多挑战。为了达到现实世界应用所需的性能标准,对数据准备,网络设计,训练和推断等各个阶段的正确设计和执行至关重要。在这里,我将与大家分享7个实用技巧,让您的深度神经网络发挥最大作用。

1 - 数据,数据,数据

这不是一个大秘密。一直工作得很好的深度学习机器需要燃料 - 大量的燃料; 燃料是数据。我们拥有的标记数据越多,模型的表现就越好。更多的数据导致更好的性能,已经由谷歌大规模的探索3亿图像的数据集印证!

在实际应用中部署Deep Learning模型时,您应该不断地为其提供更多的数据和微调以继续提高其性能。喂饱怪兽:如果你想提高你的模型的性能,那就获得更多的数据!

不断增加的数据产生更好的性能

2 - 你应该使用哪个优化器?

多年来,已经开发了许多梯度下降优化算法,各有其优缺点。一些最流行的包括:

· 随机梯度下降(SGD)+动量方法

· Adam

· RMSprop

· Adadelta

RMSprop,Adadelta和Adam被认为是自适应优化算法,因为它们会自动更新学习速率。使用SGD时,您必须手动选择学习率和动量参数,通常会随着时间的推移而降低学习率。

在实践中,自适应优化器倾向于比SGD更快地收敛,然而,他们的最终表现通常稍差。SGD通常会达到更好的最小值,从而获得更好的最终准确性,但这可能需要比某些优化程序长得多的时间。它也更依赖于强大的初始化和学习速率衰减时间表,这在实践中可能非常困难。

因此,如果你需要一些快速的结果,或者只是想测试一个新的技术,选择自适应优化器。我发现Adam很容易使用,因为它对你选择完美的学习率并不是很敏感。如果您想获得绝对最佳的最终表现,请使用SGD + Momentum,并使用学习率,衰减和动量值来最大化表现。

两全其美的方法有木有!

它最近的研究显示,你可以做到两全其美:高速训练顶尖的性能通过切换从Adam到SGD!这个想法是,训练的早期阶段实际上是SGD对参数调整和初始化非常敏感的时候。因此,我们可以通过使用Adam来启动我们的训练,这将使您节省相当长的时间,而不必担心初始化和参数调整。那么,一旦Adam运转起来,我们可以切换到SGD +动量优化,以达到最佳性能!

Adam vs SGD表现。由于鲁棒性和自适应学习速度,Adam在一开始表现更好,而SGD最终达到更好的全局最小值。

3 - 如何处理不平衡的数据

在很多情况下,您将处理不平衡的 数据,特别是在现实世界的应用程序中。举一个简单而实际的例子:为了安全起见,您正在训练您的深度网络以预测视频流中是否有人持有致命武器。但是在你的训练数据中,你只有50个拿着武器的人的视频和1000个没有武器的人的视频!如果你只是用这些数据来训练你的网络,那么你的模型肯定会非常偏向于预测没有人有武器!

有几件事你可以做到这一点:

· 在损失函数中使用类权重:本质上,代表性不足的类在损失函数中获得更高的权重,因此对该特定类的任何错误分类将导致损失函数中的非常高的误差。

· 过度抽样:重复一些包含代表性不足的训练样例,有助于平衡分配。如果可用的数据很小,这最好。

· 欠采样:您可以简单地跳过一些包含过度表示类的训练示例。如果可用数据非常大,这最好。

· 数据增加为少数类:您可以综合创建更多的代表性不足的训练示例!例如,在前面检测致命武器的例子中,你可以改变属于具有致命武器的类别的视频的一些颜色和光照。

4 - 迁移学习

正如我们在第一个提示中所看到的,深层网络需要大量的数据。不幸的是,对于许多新的应用程序来说,这些数据可能很难并且花费很高。如果我们希望我们的模型表现良好,我们可能需要数十或数十万个新的训练样例进行训练。如果数据集不易获取,则必须全部收集并手动标记。

这就是迁移学习的起点。通过迁移学习,我们不需要太多的数据!这个想法是从一个以前在数百万图像上训练过的网络开始的,比如在ImageNet上预训练的ResNet。然后,我们将通过仅重新训练最后几个层并使其他层独立来微调ResNet模型。那样的话,我们正在将ResNet从数百万图像中学到的信息(图像特征)进行微调,以便我们可以将它应用于不同的任务。这是可能的,因为跨域的图像的特征信息通常非常相似,但是这些特征的分析可以根据应用而不同。

一个基本的迁移学习通道

5 - 快速简单的数据增强,以提高性能

我们现在说过几次:更多的数据=更好的表现。除了迁移学习之外,另一种快速而简单的方法来提高模型的性能,即数据增强。数据增强涉及通过在使用原始类别标签的同时通过改变数据集中的一些原始图像来生成合成训练示例。例如,图像数据增强的常见方式包括:

· 水平和垂直旋转或翻转图像

· 改变图像的亮度和颜色

· 随机模糊图像

· 随机从图像裁剪补丁

基本上,你可以进行任何改变,改变图像的外观,但不是整体的内容,即你可以制作一个蓝色的狗的照片,但你仍然应该能够清楚地看到,照片上是一个狗。

数据裂变!

6 - 训练模型的合奏!

在机器学习中,集合训练多个模型,然后将它们组合在一起以获得更高的性能。因此,这个想法是在相同的数据集上训练同一个任务上的多个深度网络模型。模型的结果然后可以通过投票方案来进行组合,即具有最高票数的胜出。

为了确保所有模型不同,可以使用随机权重初始化和随机数据增强。众所周知,由于使用了多个模型,因此集合通常比单个模型精确得多,因此从不同角度接近任务。在现实世界的应用中,尤其是挑战或竞争中,几乎所有顶级模型都使用合奏。

合奏模型

7 - 加快修剪

我们知道模型精度随深度而增加,但速度又如何呢?更多的图层意味着更多的参数,更多的参数意味着更多的计算,更多的内存消耗和更慢的速度。理想情况下,我们希望在提高速度的同时保持高精度。我们可以通过修剪来做到这一点。

深度神经网络修剪的步骤

这个想法是,在网络中的许多参数中,有些是多余的,对输出没有太大贡献。如果您可以根据对网络的贡献排列网络中的神经元,则可以从网络中移除低排名的神经元,从而形成更小,更快的网络。可以根据神经元权重的L1 / L2均值,平均激活,一些验证集上神经元不为零的次数以及其他创造性方法来进行排序。获得更快/更小的网络对于在移动设备上运行深度学习网络非常重要。

修剪网络的最基本的方法是简单地放弃某些卷积滤波器。在近期的一篇文章中,这样做是相当成功的。这项工作中的神经元排名相当简单:它是每个滤波器权重的L1范数。在每个修剪迭代中,他们对所有的过滤器进行排序,在全部层中修剪m个排名最低的过滤器,重新训练和重复!

在近期的另一篇分析剩余网络结构的文章中提出了修剪过滤器的一个关键洞察。作者指出,在删除层的时候,具有剩余快捷连接的网络(例如ResNets)与没有使用任何快捷连接的网络(如VGG或AlexNet)相比,保留更加良好的精度并且稳健得多。这个有趣的发现具有重要的实际意义,因为它告诉我们在修剪网络进行部署和应用时,网络设计是至关重要的(使用ResNets!)。所以使用最新最好的方法总是很好的!

想要了解更多资讯,请扫描下方二维码,关注机器学习研究会

                                          


转自:人工智能爱好者社区

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/30389
 
252 次点击