主要内容

dlgradient

计算梯度为自定义训练循环使用自动分化

自从R2019b

描述

使用dlgradient计算衍生品使用自动分化为自定义训练循环。

提示

对于大多数深度学习的任务,您可以使用一个pretrained神经网络和适应您自己的数据。为例展示如何使用转移学习再教育卷积神经网络分类一套新的图片,明白了火车深入学习网络对新图像进行分类。或者,您可以创建和使用从头训练神经网络layerGraph的对象trainNetworktrainingOptions功能。

如果trainingOptions功能不提供训练选项,你需要你的任务,你可以创建一个自定义训练循环使用自动分化。欲了解更多,请看为自定义训练循环定义深度学习网络

例子

(dydx1,…, dydxk)= dlgradient (y,x1,…, xk)返回的梯度y关于变量x1通过xk

调用dlgradient从传递给函数dlfeval。看到计算梯度使用自动分化在深度学习工具箱使用自动分化

(dydx1,…, dydxk)= dlgradient (y,x1,…, xk,名称,值)返回梯度和指定附加选项使用一个或多个名称-值对。例如,就要= dlgradient (y, x, RetainData,真的)导致梯度保留中间值在随后的重用dlgradient调用。这个语法可以节省时间,但使用更多的内存。有关更多信息,请参见提示

例子

全部折叠

。函数是一个标准测试函数的优化。的rosenbrock.mhelper函数计算函数值,使用自动微分法计算其梯度。

类型rosenbrock.m
函数[y,就要]=。(x) y = 100 * (x - x (1) (2)。^ 2)。^ 2 + (1 - x (1)) ^ 2;就要= dlgradient (y、x);结束

评估。函数及其梯度的点[1,2],创建一个dlarray的点,然后调用dlfeval在功能上处理@rosenbrock

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

定义。海涅的函数是一个函数的两个输入,x1和x2

类型rosenbrock2.m
函数[y, dydx1, dydx2] = rosenbrock2 (x1, x2) y = 100 * (x2 - x1。^ 2)。^ 2 + (1 - x1)。^ 2;[dydx1, dydx2] = dlgradient (y, x1, x2);结束

调用dlfeval评估rosenbrock2在两个dlarray表示输入的参数12

x1 = dlarray (1);x2 = dlarray (2);[fval, dydx1 dydx2] = dlfeval (@rosenbrock2 (x1, x2)
fval = 1 x1 dlarray 104
dydx1 = 1 x1 dlarray 396
dydx2 = 1 x1 dlarray 200

情节。海涅的函数的梯度几个点在单位正方形。首先,初始化数组代表函数的评估点和输出。

(X1, X2)) = meshgrid (linspace (0, 1, 10));X1 = dlarray (X1 (:));X2 = dlarray (X2 (:));Y = dlarray(0(大小(X1)));DYDX1 = Y;DYDX2 = Y;

评价函数在一个循环中。阴谋的结果使用箭袋

i = 1:长度(X1) [Y (i), DYDX1(我),DYDX2 (i)) = dlfeval (@rosenbrock2, X1 (i), X2(我));结束箭袋(extractdata (X1)、extractdata (X2)、extractdata (DYDX1) extractdata (DYDX2))包含(x1的)ylabel (“x2”)

图包含一个坐标轴对象。坐标轴对象包含x1, x2 ylabel包含一个类型的对象颤。

使用dlgradientdlfeval计算值和梯度的函数,包括复数。你可以计算复杂的梯度,或限制梯度实数。

定义的函数complexFun年底上市,这个例子。这个函数实现了复杂的公式如下:

f ( x ) = ( 2 + 3 ) x

定义的函数gradFun年底上市,这个例子。这个函数调用complexFun并使用dlgradient计算结果的梯度对输入。自动分化,分化——即价值。,the value of the function calculated from the input — must be a real scalar, so the function takes the sum of the real part of the result before calculating the gradient. The function returns the real part of the function value and the gradient, which can be complex.

定义的采样点之间的复平面2和2和2 和2 和转换dlarray

functionRes = linspace (2100);x = functionRes + 1 * functionRes。”;x = dlarray (x);

在每个采样点计算函数值和梯度。

[y,毕业生]= dlfeval (@gradFun x);y = extractdata (y);

定义要显示的采样点的梯度。

gradientRes = linspace (2, 2, 11);xGrad = gradientRes + 1我* gradientRes。”;

提取这些采样点的梯度值。

[~,gradPlot] = dlfeval (@gradFun dlarray (xGrad));gradPlot = extractdata (gradPlot);

策划的结果。使用显示亮度图像显示的值函数在复平面。使用箭袋梯度的方向和大小。

显示亮度图像((2,2),(2,2),y);轴xycolorbar举行箭袋(真实(xGrad),图像放大(xGrad),真正的(gradPlot),图像放大(gradPlot),“k”);包含(“真正的”)ylabel (“虚”)标题(“真正的价值和梯度”,“Re (f (x)) =美元是美元((2 + 3)x) $”,“翻译”,“乳胶”)

函数的梯度是相同的在整个复杂的飞机。提取的值梯度计算自动分化。

研究生(1,1)
ans = 1×1 dlarray 2.0000 - 3.0000

通过检查,复杂的函数的导数值

df ( x ) dx = 2 + 3

然而,函数是( f ( x ) )不是分析,因此没有复杂的导数的定义。自动分化在MATLAB中,区分价值必须是真实的,因此不能复解析函数。相反,计算导数,这样返回的梯度点速上升的方向,见图。这是通过重新解释功能 ( f ( x ) ) :C R作为再保险函数 ( f ( x R + x ) ) :R × R R

函数y = complexFun (x) y = x (2 + 3) *;结束函数[y,毕业生]= gradFun (x) y = complexFun (x);y =真正的(y);研究生= dlgradient(总和(y,“所有”),x);结束

输入参数

全部折叠

变量来区分,指定为一个标量dlarray对象。分化,y一定的跟踪功能dlarray输入(见追踪dlarray),必须由支持的功能金宝appdlarray(见与dlarray支持函数的列表金宝app)。

变量来区分必须真实,即使名称选项“AllowComplex”被设置为真正的

例子:100 * (x - x (1) (2)。^ 2)。^ 2 + (1 - x (1)) ^ 2

例子:relu (X)

数据类型:||逻辑

变量的函数,指定为一个dlarray对象,一个细胞数组,结构,或表包含dlarray对象,或任何组合的参数递归。举个例子,一个参数可以包含一个单元阵列,其中包含的单元阵列结构包含dlarray对象。

如果您指定x1,…, xk作为一个表,表必须包含以下变量:

  • ——层名称指定为一个字符串标量。

  • 参数参数名称,指定为一个字符串标量。

  • 价值值的参数,指定为一个细胞包含一个数组dlarray

例子:dlarray ([1 2; 3 4])

数据类型:||逻辑|结构体|细胞
复数的支持:金宝app是的

名称-值参数

指定可选的双参数作为Name1 = Value1,…,以=家,在那里的名字参数名称和吗价值相应的价值。名称-值参数必须出现在其他参数,但对的顺序无关紧要。

R2021a之前,用逗号来分隔每一个名称和值,并附上的名字在报价。

例子:就要= dlgradient (y, x, RetainData,真的)导致梯度保留中间值在随后的重用dlgradient调用

国旗在函数调用期间保持跟踪数据,指定为真正的。当这个参数是,一个dlarray后立即丢弃导数跟踪计算导数。当这个参数是真正的,一个dlarray保留了导数跟踪直到结束dlfeval评估函数调用dlgradient。的真正的只有当设置是有用的dlfeval调用包含不止一个dlgradient调用。的真正的设置导致软件使用更多的内存,但当多个可以节省时间dlgradient电话使用至少部分相同的痕迹。

“EnableHigherDerivatives”真正的,然后中间值被保留“RetainData”选项没有影响。

例子:就要= dlgradient (y, x, RetainData,真的)

数据类型:逻辑

国旗使高阶导数,指定为以下之一:

  • 真正的——允许高阶导数。跟踪向后传递,以便返回的梯度可以用于进一步计算后续的调用dlgradient函数。如果“EnableHigherDerivatives”真正的,然后中间值被保留“RetainData”选项没有影响。

  • ——禁用高阶导数。不跟踪向后传递。使用这个选项,当你只需要计算一阶导数,这通常是更快,需要更少的内存。

当使用dlgradient函数在一个AcceleratedFunction对象,默认值是真正的。否则,默认值是

示例显示了如何的火车模型,需要计算高阶导数,见:

数据类型:逻辑

标记允许复杂的变量在功能和复杂的渐变,指定为以下之一:

  • 真正的——允许复杂的变量在函数和复杂的渐变。变量的函数可以指定为复数。梯度可以复杂,即使所有的变量都是真实的。变量来区分必须是真实的。

  • ——不允许复杂的变量和梯度。变量来区分和任何变量在函数必须是实数。梯度总是真实的。中间值仍然可以很复杂。

变量来区分必须真实,即使名称选项“AllowComplex”被设置为真正的

数据类型:逻辑

输出参数

全部折叠

梯度,作为一个返回dlarray对象,或一个细胞数组,结构,或表包含dlarray对象,或任何组合的参数递归。的大小和数据类型dydx1,…, dydxk是相关的输入变量的相同吗x1,…, xk

限制

  • dlgradient功能不支持计算高阶衍生品在使用金宝appdlnetwork对象包含自定义层与向后一个自定义函数。

  • dlgradient功能不支持计算高阶衍生品在使用金宝appdlnetwork对象包含以下层:

    • gruLayer

    • lstmLayer

    • bilstmLayer

  • dlgradient功能不支持计算高阶导数,取决于以下功金宝app能:

    • 格勒乌

    • lstm

    • 嵌入

    • 刺激

    • interp1

更多关于

全部折叠

追踪dlarray

在函数的计算,一个dlarray内部记录采取的步骤跟踪,使反向模式自动分化。跟踪中发生dlfeval调用。看到自动分化背景

提示

  • 一个dlgradient调用必须在一个函数。获得一个数字值的梯度,你必须评估函数使用dlfeval,参数必须是一个函数dlarray。看到在深度学习工具箱使用自动分化

  • 梯度,使正确的评价,y参数必须使用仅支持功能金宝appdlarray。看到与dlarray支持函数的列表金宝app

  • 如果你设置“RetainData”名称-值对参数真正的期间,软件保持跟踪dlfeval函数调用,而不是消除后立即跟踪导数计算。这种保护可以导致后续dlgradient电话在同一dlfeval调用被执行得更快,但使用更多的内存。例如,在训练一个敌对的网络“RetainData”设置是有用的,因为两个网络共享数据和函数在训练。看到火车生成对抗网络(甘)

  • 当您只需要计算一阶导数,确保“EnableHigherDerivatives”选择是因为这是通常更快,需要更少的内存。

  • 使用线路复杂的梯度计算导数。增加的方向的梯度定义函数的实部来区分。这是因为变量来区分——例如,损失,必须真实,即使是复杂的函数。

扩展功能

版本历史

介绍了R2019b