主要内容gydF4y2Ba

使用自动区分gydF4y2Ba深度学习工具箱gydF4y2Ba

使用自动微分的自定义训练和计算gydF4y2Ba

自动区分使创建自定义训练循环、自定义层和其他深度学习自定义变得更容易。gydF4y2Ba

一般来说,定制深度学习训练最简单的方法是创建一个gydF4y2BadlnetworkgydF4y2Ba.在网络中包含你想要的层。然后通过使用某种梯度下降,在自定义循环中执行训练,其中梯度是目标函数的梯度。目标函数可以是分类误差、交叉熵或网络权值的任何其他相关标量函数。看到gydF4y2Ba支持dlarray的函数列表金宝appgydF4y2Ba.gydF4y2Ba

这个例子是自定义训练循环的高级版本。在这里,gydF4y2BafgydF4y2Ba目标函数是否如损失和gydF4y2BaggydF4y2Ba目标函数相对于网络中权值的梯度是多少gydF4y2Ba净gydF4y2Ba.的gydF4y2Ba更新gydF4y2Ba函数表示某种类型的梯度下降。gydF4y2Ba

%高级训练循环gydF4y2Ban = 1;gydF4y2Ba而gydF4y2Ba(n < nmax) [f,g] = dlfeval(@model,net,dlX,t);网=更新(净,g);N = N + 1;gydF4y2Ba结束gydF4y2Ba

你叫gydF4y2BadlfevalgydF4y2Ba计算目标和梯度的数值。以使自动计算梯度,数据gydF4y2BadlXgydF4y2Ba必须是一个gydF4y2BadlarraygydF4y2Ba.gydF4y2Ba

dlX = dlarray (X);gydF4y2Ba

目标函数有gydF4y2BadlgradientgydF4y2Ba调用以计算梯度。的gydF4y2BadlgradientgydF4y2Ba调用必须在该函数的内部gydF4y2BadlfevalgydF4y2Ba评估。gydF4y2Ba

函数gydF4y2Ba模型(f, g) =(净dlX T)gydF4y2Ba使用dlarray支持的函数计算目标金宝appgydF4y2Bay =前进(净,dlX);f = fcnvalue (y, T);gydF4y2Ba%交叉或类似gydF4y2Bag = dlgradient (f, net.Learnables);gydF4y2Ba%自动梯度gydF4y2Ba结束gydF4y2Ba

举个例子gydF4y2BadlnetworkgydF4y2Ba与一个gydF4y2BadlfevalgydF4y2Ba-gydF4y2BadlgradientgydF4y2Ba-gydF4y2BadlarraygydF4y2Ba语法和自定义训练循环,参见gydF4y2Ba使用自定义训练循环训练网络gydF4y2Ba.有关使用自动区分的自定义训练的更多细节,请参见gydF4y2Ba定义自定义训练循环,损失函数和网络gydF4y2Ba.gydF4y2Ba

使用gydF4y2BadlgradientgydF4y2Ba和gydF4y2BadlfevalgydF4y2Ba一起进行自动区分gydF4y2Ba

要使用自动区分,您必须调用gydF4y2BadlgradientgydF4y2Ba在函数中使用gydF4y2BadlfevalgydF4y2Ba.表示对a求导的点gydF4y2BadlarraygydF4y2Ba对象,该对象管理数据结构并支持对计算的跟踪。例如,Rosenbrock函数是一种常见的优化测试函数。gydF4y2Ba

函数gydF4y2Ba[f,毕业生]=。f (x) = 100 * (x - x(1)(2)。^ 2)。²+ (1 - x(1))²;研究生= dlgradient (f (x);gydF4y2Ba结束gydF4y2Ba

计算Rosenbrock函数在该点的值和梯度gydF4y2Bax0gydF4y2Ba=[1, 2]。若要实现罗森布罗克功能的自动差异化,请通过gydF4y2Bax0gydF4y2Ba作为一个gydF4y2BadlarraygydF4y2Ba.gydF4y2Ba

x0 = dlarray ([1, 2]);[fval, gradval] = dlfeval (x0 @rosenbrock)gydF4y2Ba
Fval = 1x1 dlarray 104梯度= 1x2 dlarray 396 200gydF4y2Ba

有关自动区分的示例,请参见gydF4y2Ba使用自定义训练循环训练网络gydF4y2Ba.gydF4y2Ba

导数的跟踪gydF4y2Ba

要用数值方法计算梯度,agydF4y2BadlarraygydF4y2Ba构造用于反向模式区分的数据结构,如gydF4y2Ba自动分化背景gydF4y2Ba.这个数据结构是gydF4y2Ba跟踪gydF4y2Ba导数的计算。在使用自动微分和派生跟踪时,请记住以下指导原则:gydF4y2Ba

  • 不介绍新gydF4y2BadlarraygydF4y2Ba在目标函数的内部计算,并尝试对该对象进行微分。例如:gydF4y2Ba

    函数gydF4y2Ba[dy,dy1] = fun(x1) x2 = dlarray(0);Y = x1 + x2;dy = dlgradient (y, x2);gydF4y2Ba%错误:x2未被跟踪gydF4y2Bay₁= dlgradient (x1);gydF4y2Ba%没有错误,即使y有一个未跟踪的部分gydF4y2Ba结束gydF4y2Ba
  • 不要使用gydF4y2BaextractdatagydF4y2Ba用追踪论证。这样做会破坏跟踪。例如:gydF4y2Ba

    @(x)dlgradient(x + atan(extractdata(x)),x);gydF4y2Ba由于fun中前面的“x”项,任意点的%梯度为1。gydF4y2Badlfeval(有趣,dlarray (2.5))gydF4y2Ba
    Ans = 1x1 dlarray 1gydF4y2Ba

    但是,你可以使用gydF4y2BaextractdatagydF4y2Ba从因变量引入新的自变量。gydF4y2Ba

  • 当并行工作时,在客户端和工作者之间移动跟踪的dlarray对象会中断跟踪。跟踪的dlarray对象保存在worker上,并作为一个未跟踪的dlarray对象加载到客户端。为了避免在并行工作时破坏跟踪,在worker上计算所有需要的梯度,然后在客户机上组合这些梯度。例如,请参见gydF4y2Ba与自定义训练循环并行的训练网络gydF4y2Ba.gydF4y2Ba

  • 只使用支持的功能。金宝app有关支持的函数列表,请参见金宝appgydF4y2Ba支持dlarray的函数列表金宝appgydF4y2Ba.使用不支持的函数金宝appgydF4y2BafgydF4y2Ba试着执行gydF4y2BafgydF4y2Ba使用支持的功金宝app能。gydF4y2Ba

自动衍生工具的特点gydF4y2Ba

  • 您可以仅对标量函数使用自动微分来计算梯度。中间计算可以有任意数量的变量,但最终函数值必须是标量。如果你需要对一个向量值函数求导,一次只对一个分量求导。在本例中,考虑设置gydF4y2BadlgradientgydF4y2Ba“RetainData”gydF4y2Ba的名称-值对参数gydF4y2Ba真正的gydF4y2Ba.gydF4y2Ba

  • 调用gydF4y2BadlgradientgydF4y2Ba求某一点上的导数。当没有理论值时,软件通常会对导数的值做出任意选择。例如,gydF4y2Ba线性整流函数(Rectified Linear Unit)gydF4y2Ba函数,gydF4y2Barelu (x) = max (x, 0)gydF4y2Ba,是不可微的gydF4y2Bax = 0gydF4y2Ba.然而,gydF4y2BadlgradientgydF4y2Ba返回导数的值。gydF4y2Ba

    x = dlarray (0);y = dlfeval (@ (t) dlgradient (relu (t), t), x)gydF4y2Ba
    Y = 1x1 dlarray 0gydF4y2Ba

    附近点的值gydF4y2Ba每股收益gydF4y2Ba是不同的。gydF4y2Ba

    x = dlarray (eps);y = dlfeval (@ (t) dlgradient (relu (t), t), x)gydF4y2Ba
    Y = 1gydF4y2Ba

另请参阅gydF4y2Ba

|gydF4y2Ba|gydF4y2Ba|gydF4y2Ba

相关的话题gydF4y2Ba