dlgradient of a subset of variables

6 views (last 30 days)
Matt J on 9 Feb 2024
Edited: Matt J on 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=[];
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;
else %take gradient only w.r.t x(i)
end
end

Matt J on 13 Feb 2024
Edited: Matt J on 14 Feb 2024
This seems to work:
X0 = dlarray( [1; 2; 3; 4]*10 );
subset=[2,3];
4×1 dlarray 10 20 30 40
2×1 dlarray 20 30
if nargin<2, subset=':'; end
end
Xall(subset)=xsub;
y=sum(Xall.^2)/2;
end

Ben on 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;
if ~isempty(i)
out = out(i);
end
end
Matt J on 13 Feb 2024
Edited: Matt J on 13 Feb 2024
Thanks, Ben. So the answer is no?

Categories

Find more on Image Data Workflows in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!