主要内容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,X,T);Net = update(Net,g);N = N + 1;gydF4y2Ba结束gydF4y2Ba

你叫gydF4y2BadlfevalgydF4y2Ba计算物镜和梯度的数值。使自动计算的梯度,数据gydF4y2BaXgydF4y2Ba一定是gydF4y2BadlarraygydF4y2Ba.gydF4y2Ba

X = dlarray(X);gydF4y2Ba

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

函数gydF4y2Ba[f,g] =模型(net,X,T)gydF4y2Ba使用dlarray支持的函数计算目标万博1manbetxgydF4y2BaY = forward(net,X);f = fcnvalue(Y,T);gydF4y2Ba%横向或类似gydF4y2Bag = dlgradient(f,net.Learnables);gydF4y2Ba%自动梯度gydF4y2Ba结束gydF4y2Ba

对于一个使用a的例子gydF4y2BadlnetworkgydF4y2Ba与一个gydF4y2BadlfevalgydF4y2Ba-gydF4y2BadlgradientgydF4y2Ba-gydF4y2BadlarraygydF4y2Ba语法和自定义训练循环,请参见gydF4y2Ba使用自定义训练循环训练网络gydF4y2Ba.有关使用自动区分的自定义训练的详细信息,请参见gydF4y2Ba定义自定义训练循环、损失函数和网络gydF4y2Ba.gydF4y2Ba

使用gydF4y2BadlgradientgydF4y2Ba而且gydF4y2BadlfevalgydF4y2Ba一起进行自动微分gydF4y2Ba

要使用自动微分,必须调用gydF4y2BadlgradientgydF4y2Ba函数内部,并计算函数使用gydF4y2BadlfevalgydF4y2Ba.将求导的点表示为agydF4y2BadlarraygydF4y2Ba对象,该对象管理数据结构并支持跟踪求值。例如,Rosenbrock函数是用于优化的常见测试函数。gydF4y2Ba

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

计算Rosenbrock函数在该点的值和梯度gydF4y2Bax0gydF4y2Ba=[1, 2]。若要在Rosenbrock函数中启用自动区分,请通过gydF4y2Bax0gydF4y2Ba作为一个gydF4y2BadlarraygydF4y2Ba.gydF4y2Ba

X0 = dlarray([-1,2]);[fval,gradval] = dlfeval(@rosenbrock,x0)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未被跟踪gydF4y2BaDy1 = dlgradient(y,x1);gydF4y2Ba没有错误,即使y有一个未跟踪的部分。gydF4y2Ba结束gydF4y2Ba
  • 不要使用gydF4y2BaextractdatagydF4y2Ba使用跟踪参数。这样做会中断跟踪。例如:gydF4y2Ba

    Fun = @(x)dlgradient(x + atan(extractdata(x)),x);gydF4y2Ba%任何点的梯度都是1,这是因为fun中最前面的“x”项。gydF4y2Badlfeval(有趣,dlarray (2.5))gydF4y2Ba
    Ans = 1x1 dlarraygydF4y2Ba

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

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

  • 只使用支持的函数。万博1manbetx有关支持的函数列表,请参见万博1manbetxgydF4y2Ba支持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 darray 0gydF4y2Ba

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

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

另请参阅gydF4y2Ba

|gydF4y2Ba|gydF4y2Ba|gydF4y2Ba

相关的话题gydF4y2Ba