深度学习

了解并使用深层学习网络

高级深度学习:关键术语

定制培训循环的关键术语

在这篇文章中,我想详细谈谈损失模型梯度,自动分化
这是一系列先进的深度学习文章的第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,2my_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)工作,我们需要转换我们的数据到adlarray然后转换回来使用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,这意味着我们必须找到一个新的猜测。该损失就是误差,我们可以通过它来了解我们离正确答案有多远。使用梯度下降法,一个流行的方法有策略地更新参数,我们计算梯度/衍生物,然后在斜率相反的方向移动。
为了更好地理解这一点,让我们来看看quiver图:
通过可视化的不同点的梯度,我们可以看到,通过遵循梯度,我们可以最终找到我们的方式来对剧情的正确位置。 的文档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;结束
请注意,这就是这个例子和深度学习的不同之处:您不负责确定新的可学习对象。这是通过优化器,ADAM或SGDM或任何你选择的优化器在真实的培训循环中完成的。在深度学习中,用SGDMUpdate或ADAMUpdate替换这个updateModel函数
学习速率是你想如何迅速在某个方向移动。更高更快的手段或更大的飞跃,但我们会在第二个这对你的训练是怎么回事走坚的影响看。
训练循环
%定义可学习参数,初始猜测为2,2my_x1 = 2;my_x2 = 2;learn_rate = 0.1;%设置(转换为dlarray)x1 = dlarray (my_x1);x2 = dlarray (my_x2);%循环从这里开始:for ii = 1:100%调用dlfeval,它使用函数my_loss计算模型梯度和损失(损失、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;for ii = 1:100%。。。%更新自定义学习率learn_rate = initialLearnRate /(1 +衰变*迭代);结束
*当然,学习率函数可以是复杂的,但添加到我们的训练循环很简单。
学习率在100个迭代看起来是这样的: 这使得我们的模型更清晰地收敛:
就是这样!现在你已经完全准备好在深度学习对话中讨论以下术语。
MATLAB函数:
  • dlfeval
  • dlgradient
  • dlarray&ExtractData由
术语:
  • 自动分化:
  • 损失
  • 模型梯度
  • 学习率
资源:要为这个职位做准备,我通过我们的文档中有好几篇文章去了。请过目为原料以下链接:
|

评论

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