dlgradient of a subset of variables

11 visualizzazioni (ultimi 30 giorni)
Matt J
Matt J il 9 Feb 2024
Modificato: Matt J il 14 Feb 2024
I would like to apply dlgradient to a parametrized function, which would allow me in some cases to get the complete gradient of the function, but in others would take only the derivative with respect to the i-th variable. My attempt below fails. Is there a way that both succeeds and which would be efficient in the more general case when numel(x0) is large?
x0 = dlarray( [1; 2] );
i=[];
y_grad=dlfeval(@(x)oneDeriv(x,i), x0) %works
y_grad =
2×1 dlarray 1 2
i=2;
dy_dxi=dlfeval(@(x)oneDeriv(x,i), x0) %fails
dy_dxi =
1×1 dlarray 0
function out = oneDeriv(x,i)
y=sum(x.^2)/2;
if isempty(i) %take complete gradient
out=dlgradient(y,x);
else %take gradient only w.r.t x(i)
out=dlgradient(y,x(i));
end
end

Risposta accettata

Matt J
Matt J il 13 Feb 2024
Modificato: Matt J il 14 Feb 2024
This seems to work:
X0 = dlarray( [1; 2; 3; 4]*10 );
subset=[2,3];
gradTotal = getGradient(X0) %total gradient
gradTotal =
4×1 dlarray 10 20 30 40
gradSubset = getGradient(X0,2:3) %gradient on subset of x
gradSubset =
2×1 dlarray 20 30
function grad = getGradient(Xall,subset)
if nargin<2, subset=':'; end
grad = dlfeval( @(xsub)theFunction(X,xsub,subset), Xall(subset));
end
function grad = theFunction(Xall,xsub,subset)
Xall(subset)=xsub;
y=sum(Xall.^2)/2;
grad=dlgradient(y,xsub);
end

Più risposte (1)

Ben
Ben il 13 Feb 2024
This is a subtle part of the dlarray autodiff system, the line dlgradient(y,x(i)) returns 0 because it sees the operation x -> x(i), and only knows that y depends on x, not x(i).
You can work around this by computing all the derivatives and do indexing afterwards:
function out = oneDeriv(x,i)
y = sum(x.^2)/2;
out = dlgradient(y,x);
if ~isempty(i)
out = out(i);
end
end
  1 Commento
Matt J
Matt J il 13 Feb 2024
Modificato: Matt J il 13 Feb 2024
Thanks, Ben. So the answer is no?

Accedi per commentare.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by