自动区分使创建自定义训练循环、自定义层和其他深度学习自定义变得更容易。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=dlX阵列(X);gydF4y2Ba
目标函数有一个gydF4y2Ba梯度gydF4y2Ba
调用以计算梯度。的gydF4y2Ba梯度gydF4y2Ba
调用必须在该函数的内部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
-gydF4y2Ba梯度gydF4y2Ba
-gydF4y2BadlarraygydF4y2Ba
语法,看gydF4y2Bagradcam揭示了Deep Learning决策背后的原因gydF4y2Ba. 有关使用自定义训练循环的更复杂示例,请参见gydF4y2Ba训练生成对抗网络(GAN)gydF4y2Ba.有关使用自动区分的自定义训练的更多细节,请参见gydF4y2Ba定义自定义训练回路、损耗函数和网络gydF4y2Ba.gydF4y2Ba
梯度gydF4y2Ba
和gydF4y2BadlfevalgydF4y2Ba
一起进行自动区分gydF4y2Ba要使用自动区分,您必须调用gydF4y2Ba梯度gydF4y2Ba
在函数内部,并使用gydF4y2BadlfevalgydF4y2Ba
.表示将导数作为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(@rosenbrock,x0)gydF4y2Ba
Fval = 1x1 dlarray 104梯度= 1x2 dlarray 396 200gydF4y2Ba
有关自动区分的示例,请参见gydF4y2Bagradcam揭示了Deep Learning决策背后的原因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=梯度(y,x1);gydF4y2Ba%即使y有未跟踪的部分,也没有错误gydF4y2Ba结束gydF4y2Ba
不要使用gydF4y2BaextractdatagydF4y2Ba
用追踪论证。这样做会破坏跟踪。例如:gydF4y2Ba
fun=@(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梯度gydF4y2Ba
“RetainData”gydF4y2Ba
要使用的名称-值对参数gydF4y2Ba真的gydF4y2Ba
.gydF4y2Ba
调用gydF4y2Ba梯度gydF4y2Ba
求某一点上的导数。当没有理论值时,软件通常会对导数的值做出任意选择。例如,gydF4y2Ba线性整流函数(Rectified Linear Unit)gydF4y2Ba
函数,gydF4y2Barelu(x)=最大值(x,0)gydF4y2Ba
,是不可微的gydF4y2Bax=0gydF4y2Ba
.但是,gydF4y2Ba梯度gydF4y2Ba
返回导数的值。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
dlarraygydF4y2Ba
|gydF4y2BadlfevalgydF4y2Ba
|gydF4y2Ba梯度gydF4y2Ba
|gydF4y2BadlnetworkgydF4y2Ba