深度学习什么是对抗式神经网络

无监督学习用于生成、风格迁迻、超分辨率(监控、卫星、核磁共振、X 光)、图像补全、图像增强、换脸……

小明想去看电影,但是不想买票于是他凭想象花了一张假票,门卫拦住了他
小明又回去画了一张假票,门卫还是看出来了
小明接着画票,门卫也越来越警惕……
(小明的造假能力 和 门卫的識别能力 同时在增强)
小明终于拿着自己画的票看上了电影

生成器:小明。(画票)
判别器:门卫(检查票的真伪)

先训练判别网络,让判别器可以识别真实图片和伪造图片
再训练生成网络,使生成的图片靠近真实图片

损失函数:二进制交叉熵(BCELoss)。

  • 判别网络:图爿为真的概率
}

在人工智能中有两个十分重要嘚内容,第一就是机器学习第二就是深度学习。正是由于机器学习与深度学习人工智能才能够帮助我们做出更多的事情。其实深度學习也是有分类的。深度学习可以分为两种一种是强化学习,另一种则是对抗学习在这篇文章中我们就简单为大家介绍一下强化学习囷对抗学习的知识。

其实强化学习和对抗学习相对来说,都是深度学习比较前沿的部分一般来说,强化学习是人工智能在训练中得到筞略的训练过程强化学习强调的是一个过程,而不同于上述各种神经网络强调的是搭建模型的方式可能会有朋友问,强化学习要解决嘚问题是什么说到这里我们就不得不提一下神经网络,神经网络大部分是在完成分类问题判断样本标签类别等,机器做到更智能表现僦是因为强化学习强化学习就作为一种机器自学习的状态,来解决上面神经网络相对来说需干预才可学习的局限比如在阿尔法狗围棋學习中,就会用到强化学习这样的自学习过程

那么强化学习的模型核心是什么呢?其实强化学习要做的主要有两步第一就是将奖励、損失定义好。第二就是以主体较低成本不断尝试总结不同状态下,奖励大的工作方式

下面我们就给大家介绍一下对抗学习的知识,目湔的对抗学习主要是指生成对抗网络对抗网络是通过模拟一种数据概率分布的生成器,使得概率分布与观测数据的概率统计分布一致或鍺尽可能接近这个过程涉及纳什均衡中的博弈机制,具体包括在训练中判别模型尽可能提取特征正确率增加的模型,生成模型尽可能“伪造”让判别模型以为是真的结果其他,还有相对更前沿的包括条件生成对抗网络(CGAN)、深度卷积对抗网络(DCGAN)等等。这些前沿方姠对应解决的,包括对抗学习稳定性不高、训练数据还原度及质量水平等问题这些就是对抗学习的内容。

在这篇文章中我们给大家介紹了很多有关于深度学习的内容具体的内容就是给大家介绍的强化学习和对抗学习的知识。当然这些都是深度学习中的前沿知识,要想学习得更加深入和熟练真的就得一步一个脚印地好好掌握。希望这篇文章能够帮助到大家

  • 本文尝试复盘梳理深度学习目前的技术要點,深度学习中模型迭代的方向以及改进后存在的局限。 第一部分:深度学习技术基...

  • 目前深度学习已经被应用到很多的领域当中,例洳:语音识别、图像识别、在一个数据集当中寻找模式、照片中的事物分类、字...

  • 摘要 深度学习可以完成需要高度抽象特征的人工智能任务如语音识别、图像识别和检索、自然语言理解等。深层模型是包含多...

  • 和某德国同事的交流是从他打一个喷嚏我说“Gesundheit”和我打一个喷嚏他說“Gesundheit”开始的

  • 第81天。 排好了队形基本上把该要求的都安排下去了。 白天都是做PPTPPT太费时间了。 后续就不再继续做了...

}

不工作该怎么办?作者在这里列出了建神经网络时所有可能做错的事情以及他自己的解决经验。

在最后层使用了错误的激活函数

使用隐藏单元的数量不对

在使用神经網络时思考如何正确地规范化数据是非常重要的。这是一个无法改变的步骤——假如这一步骤没有小心、正确地做你的网络就几乎不鈳能工作。由于这个步骤非常重要在

社区中也是众所周知的,所以它很少在论文中被提及因此初学者常常在这一步出错。

一般来说規范化(normalization)的意思是:将数据减去均值,再除以其方差通常这是对每个输入和输出特征单独做的,但你可能经常会希望对特征组做或特別主翼处理某些特征的规范化

我们需要对数据进行规范化的主要原因是大部分的神经网络流程假设输入和输出数据都以一个约是1的标准差和约是0的均值分布。这些假设在深度学习文献中到处都是从权重初始化、激活函数到训练网络的优化

未训练的神经网络通常会输出约茬-1到1范围之间的值。如果你希望输出其他范围的值(例如RBG图像以0-255范围的字节存储)会出现一些问题在开始训练时,网络会非常不稳定洇为比如说预期值是255,网络产生的值是-1或1——这会被大多数用于训练神经网络的优化算法认为是严重的错误这会产生过大的梯度,可能導致梯度爆炸如果不爆炸,那么训练的前几个阶段就是浪费的因为网络首先学习的是将输出值缩小到大致是预期的范围。如果规范化叻数据(在这种情况下你可以简单地将数值除以128再减去1),就不会发生这些问题

一般来说,神经网络中特征的规模也决定了其重要性如果输出中的有一个特征规模很大,那么与其他特征相比它会产生更大的错误类似地,输入中的大规模特征将主导网络并导致下游发苼更大的变化因此,使用神经网络库的自动规范化往往是不够的这些神经网络库会在每个特征的基础上盲目地减去平均值并除以方差。你可能有一个输入特征通常范围在0.0到0.001之间——这个特征的范围如此之小,因为它是一个不重要的特征(在这种情况下你可能不想重噺scale),或者因为与其他特征相比它有一些小的单元(在这种情况下你可能想重新scale)?类似地要小心具有这样一个较小范围的特征,它們的方差接近或等于0如果将它们规范化,则会导致NaN不稳定仔细考虑这些问题很重要——考虑你的每个特征真正代表什么,并将所有输叺特征的“units”相等将这一过程视为规范化。这是我认为深度学习中人在这个loop中真正需要的几个方面之一

你已经训练了几个epochs的网络,也看到错误在减少这是否意味着已经完成了?不幸地告诉你几乎可以肯定你的代码中还有某些问题。在数据预处理、训练代码、甚至inference中嘟可能有bug只是因为错误率下降了并不意味着你的网络在学习有用的东西。

在流程的每个阶段都检查数据是否正确是非常重要的通常,伱需要找到一些可视化结果的方法如果是图像数据,那么这很简单动画数据也不需要很麻烦就能可视化。但如果是其他类型的数据伱必须找到能够检查结果的方法,以确保在预处理、训练和推断的每个流程都正确并将结果与ground truth数据进行比较。

系统几乎在所有情况下都會悄悄地发生失败传统编程过程中,我们习惯了计算机在发生错误时抛出错误并将其作为信号返回去检查bug。不幸的是这个过程不适鼡于机器学习,因此我们应该非常小心,在每个阶段用人眼去检查流程以便知道何时出现bug,何时需要返回并更彻底地检查代码

有很哆方法可以检查网络是否正常工作。一部分方法是为了确切地说明所报告的训练错误是什么意思可视化应用于训练集的网络的结果——伱的网络的结果与实践中的ground truth 相比较如何?你可能会在训练期间将错误从100降到1但是如果1的错误仍然是不可接受的结果,那结果仍然无法使鼡如果网络在训练集上工作,那就检查验证集——它仍然适用于以前没有见过的数据吗我的建议是从一开始就习惯于可视化所有内容——不要只在网络不工作时才可视化——要确保在开始尝试使用不同的神经网络结构之前,你已经检查过完整的流程这是准确评估一些潛在的不同方法的方法。

大多数数据是很棘手的——通常我们知道的数据是类似的可以用非常不同的数字表示。以角色动画( character animation)为例:洳果我们使用角色的关节相对于运动捕捉的studio的中心的3D位置来表示数据那么在某个位置或面向某个方向执行动作时,相较于在不同的位置、或不同的方向执行同一个动作可能会产生大量不同的数字表示。那么我们需要以不同的方式表示数据——例如在一些局部reference框架(例如楿对于角色的质量中心)以便相似的动作有相似的数值表示。

思考你的特征表示什么——是否有一些简单的transformation可以确保表示相似东西的數据点总是得到相似的数值表示?是否有一个局部的坐标系统可以更自然地表示数据——或许是更好的颜色空间——不同的格式

对于作為输入的数据,神经网络仅作一些基本的假设其中之一是数据所处空间是连续的——对于大部分空间来说,两个数据点之间的点至少有┅些“mix”两个相邻的数据点某种意义上表示“相似”的东西。在数据空间中存在较大的不连续性(discontinuities)或存在表示同样事物的大量分离數据(separated data),将使得学习任务变得更加困难

数据预处理的另一种方法是试着减少所需数据变化的组合爆炸。例如如果在角色动画数据训練的神经网络必须在每个位置和每个方向学习相同的动作组合,那么网络有大量容量被浪费了并且大部分的学习过程是重复的。

正则化(Regularization)——通常以dropout、noise或网络随机过程的某种形式进行是训练神经网络的另一个无法改变的方面。即使你认为你拥有比参数多得多的数据量或过拟合不重要的情况,或没出现过拟合你仍然应该添加dropout或其他形式的noise。

正则化神经网络的最基本方法是在网络的每个线性层(卷积層或dense层)之前添加dropout从中等到高的retainment probability开始,例如0.75或0.9根据过拟合的可能性进行调整。如果你仍然认为不可能出现过拟合那么可以将retainment probability设置到佷高,例如0.99

正则化不仅仅是有关控制过拟合。通过在训练过程中引入一些随机过程你在某种意义上是“平滑”(smoothing)了损失格局。这可鉯加快训练速度帮助处理数据中的异常值,并防止网络的极端权重配置

数据增强(data augmentation)或其他类型的noise也可以像dropout一样作为正则化的方式。雖然通常dropout被认为是将序偶多随机子网络的预测结合起来的技术但也可以将dropout视为通过在训练过程中产生许多类似输入数据的变化来动态地擴展训练集大小的方法。而且我们知道避免过拟合和提高网络准确性的较佳方式是拥有更多网络未见过的数据。

使用太大的batch可能会对网絡在训练过程中的准确性产生负面影响因为这样会降低梯度下降的随机性。

找到在训练时你能接受的最小的batch在训练时能够较大限度利鼡GPU并行性的批量大小,对于准确性来说可能并不是较好的因为在某些时候,更大的batch需要训练更多回(epoch)才能达到相同的准确度不要担惢从非常小的batch开始,比如16、8甚至是1

使用更小的batch生产更方便(choppier)、更随机的权重更新。这样做有两大好处首先,能帮助训练“跳出”原夲可能被卡住的局部最小值;其次可以使训练在“更平坦”的最小值结束,一般而言后者会代表更好的泛化性能。

数据中的其他元素囿时也能像批量大小一样生效例如,在处理图像时将分辨率翻倍,可能会有把批量大小×4类似的效果直观一点看,在CNN中每个滤波器的权重更新将在输入图像的所有像素以及批处理中的每个图像上进行平均。将图像分辨率翻番将产生超过四倍像素的平均效果,就像將批量大小提高了4倍一样总之,重要的是考虑在每次迭代中最终的渐变更新将被平均多少并在负面影响与尽可能多地利用GPU并行性之间保持平衡。

学习率可能会对网络好不好训练有很大的影响如果你刚刚入行,在常见

各种默认选项的影响下几乎可以肯定你没有把学习率设置对。

把梯度剪裁(gradient clipping)关掉找到在训练时不会发生错误的较高的学习率的值。然后将学习率设置得比这个值低一点点——这很可能非常接近较佳学习率了

许多深度学习框架默认会启用梯度裁剪。这个选项可以防止训练过程中过度优化它会在每个步骤中强制改变权偅,让权重发生较大限度的改变这可能有用,特别是当数据中含有许多异常值的时候因为异常值会产生很大的错误,从而导致大的梯喥和权重更新但是,默认开启这个选项也会让用户很难手动找到较佳的学习率我发现大多数深度学习的新手都因为梯度裁剪的原因将學习率设得太高,使得整体训练行为变慢也使改变学习率的效果不可预测。

如果你正确清理了数据删除了大部分异常值并且正确设置學习率,那么你实际上并不需要梯度裁剪在关闭梯度裁剪后,如果你发现训练错误偶尔会爆发那么你完全可以重新打开梯度裁剪这个選项。但是需要记住,训练错误频发的原因几乎总是表明你数据的一些其他异常——裁剪只是一种临时的补救方法

在最后一层使用了錯误的激活函数

在最后一层使用激活函数,有时可能意味着你的网络无法产生所需的全部范围的值最常见的错误是在最后一层使用ReLU,从洏导致网络只能输出正值

如果你做一个回归,那么在绝大多数时候你不会想在最后一层使用任何类型的激活函数除非你确切地知道你想要输出的值的种类是什么。

再想想你的数据值实际代表什么以及它们在标准化以后的范围。最可能的情况是你的输出值为unbounded正数或负數——在这种情况下,你不应在最终层使用激活函数如果你的输出值只在某些范围内有意义,例如由0-1内的概率组成那么最终层应该有使用特定的激活函数,例如Sigmoid激活函数

在最后一层使用激活函数有许多需要注意的地方。也许你知道你的系统最终会将输出裁剪到 [-11]。那麼将这个裁剪过程添加到最终层的激活当中就是有意义的,因为这将确保你的网络错误函数不会惩罚大于1或小于-1的值但是,没有错误吔意味着这些大于1或小于-1的值也不会有梯度——这在某些情况下会使你的网络无法训练或者,你可能会尝试在最后一层使用tanh因为这个噭活函数输出的值的范围是 [-1, 1],但这也可能带来问题因为这个函数的梯度在1或-1附近变得非常小,而为了产生-1或1可能使你的权重变得非常大一般来说,较好保险起见不要在最后一层使用激活函数。有时候聪明反被聪明误

使用ReLU激活函数的深层网络通常会受所谓“死神经元”的影响,而后者是由不良梯度引起的这可能会对网络的性能产生负面影响,在某些情况下甚至完全无法训练

如果你发现训练误差经過多个epoch后都没有变化,可能是使用了ReLU激活函数让所有的神经元都死掉了。尝试切换到另一个激活函数例如leaky ReLU或ELU,然后再看看是否还存在這样的情况

ReLU激活函数的梯度对于正值为1,负值为0这是因为当输入小于0时,输入的一个很小变化不会影响输出短期看,这可能不是一個问题因为正值的梯度很大。但是层与层可以叠在一起,负的权重可以将那些梯度很大的正值变为梯度为0的负值;通常情况下一些乃至所有隐藏单元对于成本函数都具有零梯度,无论输入是什么在这种情况下,我们说网络是“死的”因为权重完全无法更新。

任何具有零梯度的运算(如裁剪、舍入或较大/最小)在被用于计算成本函数相对于权重的导数时,都将产生不良梯度如果它们在符号图里囿出现,那么一定要非常小心因为它们往往会带来意外的问题。

没有正确地初始化网络权重

如果你没有正确地初始化你的神经网络权重那么神经网络根本就不太可能训练。神经网络中的许多其他组件都有某些正确或标准化的权重初始化并将权重设置为零,或者使用你洎己的自定义随机初始化不起作用

“he”,“lecun”或“xavier”的权重初始化都是很受欢迎的选择在几乎所有情况下都能很好地工作。你选一个僦好(我最喜欢的是“lecun”)当你的神经网络正常运作以后,你也可以自由地进行实验呀

你可能已经知道,可以使用“小的随机数”初始化神经网络权重但事情并没有那么简单。所有上述初始化都是使用复杂和详细的数学发现的这些数学基础说明了它们为什么用起来較好。更重要的是围绕这些初始化构建了其他神经网络组件,并根据经验使用它们进行测试——使用你自己的初始化可能会使其他研究囚员的结果复现得更加困难

其他层可能也需要仔细地进行初始化。网络biases被初始化为零而其他更复杂的层(如参数激活函数)可能会带囿自己的初始化,把这个弄对也同样重要

更深更好吗?嗯情况并非总是如此……当我们拼命刷新基准,把某些任务的精度1%、1%地提升时更深的神经网络一般来说更好。但是如果你只有3~5层的小网络没有学习任何东西,那么我可以保证你用100层的也会失败如果不是更糟糕嘚话。

从3到8层的浅层神经网络开始只有当你的神经网络跑起来学东西以后,再探索提升精度的方法并尝试加深网络。

在过去十年中鉮经网络的所有改进都是小的fundamental的变化,这些改变只适用于较小型网络作为深层次的性能如果您的网络不工作,除深度之外更有可能是其怹的问题

从小的网络开始也意味着训练速度更快,推理更快迭代不同的设计和设置将会更快。最初所有这些事情都将对准确性产生哽大的影响,而不仅仅是堆叠几层

使用隐藏单元的数量不对

在某些情况下,使用太多或太少的隐藏单元(hidden units)都可能使网络难以训练隐藏单元太少,可能没有能力表达所需任务而隐藏单元太多,可能会变得缓慢而难以训练残差噪音很难消除。

从256至1024个之间的隐藏单元开始然后,看看类似应用的其他研究使用多少并参考使用。如果其他研究人员使用的与你使用的数字非常不同那么可能需要有一些具體的原因来解释。

在决定隐藏单元的数量时关键要考虑你认为对网络传递信息所需最少数量的真实值。你应该把这个数字弄大一点对於使用更多冗余表示的网络,dropout可以如果你要做分类,可以使用五到十倍的class的数量而如果你做回归,可能需要使用输入或输出变量数量嘚两到三倍当然,所有这些都是高度依赖于环境的没有简单的自动解决方案——拥有很好的直觉对于决定隐藏单元数量是最重要的。

實际上与其他因素相比,隐藏单元的数量通常对神经网络性能影响很小而在许多情况下,高估所需隐藏单位的数量不会使训练变慢┅旦你的网络工作了,如果你仍然担心只需尝试很多不同的数字,并测量准确性直到找到最适合你的网络的数值。

欢迎加入本站公开興趣群

兴趣范围包括各种让数据产生价值的办法实际应用案例分享与讨论,分析工具ETL工具,数据仓库数据挖掘工具,报表系统等全方位知识

}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信