深度学习

了解并使用深层学习网络

先进的深度学习:关键术语

定制培训循环的关键术语

在这篇文章中,我想详细谈谈失利模型梯度自动微分
这是一系列先进的深度学习文章的第2部分。要阅读系列,请访问以下链接:
  • 帖子1:介绍
  • 后2:定制培训:主要条款(这个职位!)
在第一部分,我们离开谈论的定制培训圈,你需要写为了进军扩展框架的力量。如果你有一个简单的网络,很可能TrainNetwork会做的伎俩。对于一切,我们可以写出训练循环自己。
在较高的水平,训练循环看起来是这样的:
在循环的关键步骤
我想采取一个非常简单的问题,突出这个循环的重要组成部分,重点对非可选部分我们上面的图所示。我们的模型有2个可以学习的参数,X1和X2,我们的目标是优化这些参数,我们的函数的输出为0:
Y =(。X2  -  X1 ^ 2)^ 2 +(1  -  X1)^ 2。。。;
我们会优化我们的模型,直到Y = 0;这是统计的问题用一个相当经典的方程(Rosenbrock法)。(提示,存在于X1 = 1和x 2 = 1的溶液)。
我们将通过在最优解X1 = 2×2 = 2,这只是一个起点猜测开始,这段代码将展示我们如何改变这些参数,以提高我们的模型,并最终达成解决办法。
%定义可学习的参数,与初始猜测2,2-my_x1 = 2;my_x2 = 2;learn_rate = 0.1;%设置(转换至dlarray)X1 = dlarray(my_x1);X2 = dlarray(my_x2);%调用dlfeval,它使用函数my_loss来计算模型梯度和损失[损失,dydx1,dydx2] = dlfeval(@ my_loss,X1,X2);%更新模型[new_x1,new_x2] =的UpdateModel(X1,X2,dydx1,dydx2,learn_rate);%绘制我们的当前值情节(ExtractData由(new_x1),ExtractData由(new_x2), 'RX');
*你看到这个循环和深度学习之间的关联了吗?我们的方程或“模型”要简单得多,但概念是相同的。在深度学习中,我们有一些“可学习的东西”,比如权重和偏差。这里我们有两个可学习的参数(x1和x2)随着时间的推移,改变训练中的可学习性可以提高模型的准确性。下面的训练循环执行与深度学习训练相同的操作,只是更容易理解。
让我们来看看通过此次培训循环的所有步骤,并指出了前进的道路上的关键术语。

1.设置:读取数据,并转换为dlarray

dlarray被设计为包含深学习问题的结构。这意味着对于任何“DL”的功能(dlfeval,dlgradient)工作,我们需要将我们的数据转换为dlarray然后转换回用ExtractData由

2.计算模型梯度和损失

这发生在调用的函数my_loss
函数[Y,dydx1,dydx2] = my_loss(X1,X2)Y =(X2  -  X1 ^ 2)^ 2 +(1  -  X1)^ 2。。%计算损失(或如何接近零)[dydx1,dydx2] = dlgradient(Y,X1,X2);%这个计算衍生物结束
在我们的X1和X2值堵漏,我们得到:
这是不为0,这意味着我们必须寻找新的猜测。该失利是误差,我们可以跟踪了解如何远离我们是一个很好的答案。运用梯度下降,一个流行的方法有策略地更新参数,我们计算梯度/衍生物,然后在斜率相反的方向移动。
为了更好地观察这一点,让我们来看看颤动的情节:
通过可视化的不同点的梯度,我们可以看到,通过遵循梯度,我们可以最终找到我们的方式来对剧情的正确位置。 的文档dlfeval做了伟大的工作,解释dlgradient是如何工作的,这是我偷的颤动情节的想法。
通过计算梯度dlgradient运用自动分化。在这个时刻,我意识到自动微分只是意味着该功能会自动区分模式,并告诉我们的模型梯度。这不是吓人,就像我想。
所以从我们的功能my_loss,我们得到的模型梯度失利,用来计算新的可学习参数来改进模型。

3.更新模型

在我们的循环中,下一步是更新模型使用梯度找到新的模型参数。
%更新模型[new_x1,new_x2] =的UpdateModel(X1,X2,dydx1,dydx2,learn_rate);
使用梯度下降,我们将更新这些参数,在斜面的相反方向移动:
函数[new_x1,new_x2] =的UpdateModel(X1,X2,dydx1,dydx2,learn_rate);newx1 = X1 + -dydx1 * learn_rate;newx2 = X2 + -dydx2 * learn_rate;结束
请注意,这是在这个例子和深度学习不同:你是不是负责确定新learnables。这是在经过优化,ADAM或SGDM或任何优化器选择真正的训练循环完成。在深度学习,更换SGDMUpdate或ADAMUpdate此功能的UpdateModel
学习率是你想如何迅速在某个方向移动。更高更快的手段或更大的飞跃,但我们会在第二个这对你的训练是怎么回事走坚的影响看。
训练循环
%定义可学习的参数,与初始猜测2,2-my_x1 = 2;my_x2 = 2;learn_rate = 0.1;%设置(转换至dlarray)X1 = dlarray(my_x1);X2 = dlarray(my_x2);%循环从这里开始:对于II = 1:100它使用功能my_loss来计算模型梯度和损耗%呼叫dlfeval[损失,dydx1,dydx2] = dlfeval(@ my_loss,X1,X2);%更新模型[X1,X2] =的UpdateModel(X1,X2,dydx1,dydx2,learn_rate);%绘制我们的当前值情节(extractdata (x1)、extractdata (x2)、“软”);结束
这是训练的一个情节
100次迭代后,我们可以形象地训练越来越接近为最佳值。
学习率的重要性
和以前一样,注意到学习率就是我们能有多快或多大的跳跃来实现最优解决方案。一个更大的步骤可能意味着你更快地得到你的解决方案,但是你可以跳过它,永远不会收敛。
这里是相同的训练回路上面有learn_rate = 0.2,而不是0.1:具有太高的学习率的手段,我们可以分歧,卡住一个次优解,直到永远。
请注意本次培训不向最优解,造成较高的学习率收敛。
因此,一个大的学习速率可能会有问题,但更小的一步可能意味着你是移动的方式太慢(打哈欠),或者我们可以在当地的最低结束,或者它可能要花一生的时间来完成。
所以你会怎么做?一个建议是在一开始就高等院校的速度启动,然后移动到一个较低的学习速度,你接近的解决方案,我们可以看中,并称之为“基于时间的衰退。” 输入定制的学习速率,在我们的自定义训练plot中很容易实现*。
%自定义设置学习率initialLearnRate = 0.2;衰变= 0.01;learn_rate = initialLearnRate;对于II = 1:100%。。。%更新自定义学习率learn_rate = initialLearnRate /(1 +衰变*迭代);结束
*当然,学习率函数可以是复杂的,但添加到我们的训练循环很简单。
学习率在100个迭代看起来是这样的: 这使得我们的模型更清晰地收敛:
而已!现在,您有充分准备,讨论深度学习对话以下条款。
MATLAB功能:
  • dlfeval
  • dlgradient
  • dlarray&ExtractData由
条款:
  • 自动微分:
  • 失利
  • 模型梯度
  • 学习率
资源:要为这个职位做准备,我通过我们的文档中有好几篇文章去了。请过目为原料以下链接:
|

评论

要发表评论,请点击在这里在您的帐户MathWorks公司签署或创建一个新的。