先进的深度学习:关键术语
定制培训循环的关键术语
在这篇文章中,我想详细谈谈失利,模型梯度和自动微分这是一系列先进的深度学习文章的第2部分。要阅读系列,请访问以下链接:
|
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个迭代看起来是这样的: | 这使得我们的模型更清晰地收敛: |
- dlfeval
- dlgradient
- dlarray&ExtractData由
- 自动微分:
- 失利
- 模型梯度
- 学习率
- dlfeval:走过太设置的ROSENBROCK方程。
- 更多关于自动微分
- 更多关于解决方案的ROSENBROCK,有时也被称为函数香蕉,这是在本例中使用的优化功能
- 充满了浓浓的学习的榜样
- 创建自定义的深度学习层
|
评论
要发表评论,请点击在这里在您的帐户MathWorks公司签署或创建一个新的。