主要内容gydF4y2Ba

在gydF4y2Ba深度学习工具箱gydF4y2Ba

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

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

一般来说,定制深度学习培训最简单的方法就是创建一个gydF4y2BadlnetworkgydF4y2Ba。在网络中包含您想要的层。然后通过使用某种梯度下降(梯度是目标函数的梯度)在自定义循环中执行训练。目标函数可以是分类误差、交叉熵或网络权值的任何相关标量函数。看到gydF4y2Ba支持dlarray的函数列表万博1manbetxgydF4y2Ba。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支持的函数计算目标万博1manbetxgydF4y2Bay =前进(净,dlX);f = fcnvalue (y, T);gydF4y2Ba交叉熵或类似gydF4y2Bag = dlgradient (f, net.Learnables);gydF4y2Ba%自动梯度gydF4y2Ba结束gydF4y2Ba

例如使用gydF4y2BadlnetworkgydF4y2Ba用一个简单的gydF4y2BadlfevalgydF4y2Ba-gydF4y2BadlgradientgydF4y2Ba-gydF4y2BadlarraygydF4y2Ba语法,看gydF4y2Bagradcam揭示了深度学习决策背后的原因gydF4y2Ba。有关使用自定义训练循环的更复杂示例,请参见gydF4y2Ba列车生成对抗网络(GAN)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]。若要在Rosenbrock功能中启用自动区分功能,请通过gydF4y2Bax0gydF4y2Ba作为一个gydF4y2BadlarraygydF4y2Ba。gydF4y2Ba

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

有关使用自动区分的示例,请参见gydF4y2Bagradcam揭示了深度学习决策背后的原因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% Error: x2未被跟踪gydF4y2Bay₁= dlgradient (x1);gydF4y2Ba%没有错误,即使y有一个未跟踪的部分gydF4y2Ba结束gydF4y2Ba
  • 不要使用gydF4y2BaextractdatagydF4y2Ba用追溯论证。这样做会中断跟踪。例如:gydF4y2Ba

    fun = @(x)dlgradient(x + atan(extractdata(x)),x);gydF4y2Ba任何点的% Gradient都是1,这是由于趣味性中的“x”项。gydF4y2Badlfeval(有趣,dlarray (2.5))gydF4y2Ba
    ans = 1x1 dlarray 1gydF4y2Ba

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

  • 只使用受支持的函数万博1manbetx。看到gydF4y2Ba支持dlarray的函数列表万博1manbetxgydF4y2Ba。使用不支持的函数万博1manbetxgydF4y2BafgydF4y2Ba,试着去实现gydF4y2BafgydF4y2Ba使用支持的功万博1manbetx能。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 = 1x1 dlarray 1gydF4y2Ba
  • 目前,gydF4y2BadlarraygydF4y2Ba不允许高阶导数。换句话说,你不能通过调用来计算二阶导数gydF4y2BadlgradientgydF4y2Ba两次。gydF4y2Ba

另请参阅gydF4y2Ba

|gydF4y2Ba|gydF4y2Ba|gydF4y2Ba

相关的话题gydF4y2Ba