3

凸最適化にfminunc関数を使用しようとしています。ただし、私の場合、logxに関して勾配を取っています。私の目的関数をFとします。そうすると、勾配は次のようになります。

dF/dx = (dF/dlogx) * (1/x)
= > dF/dlogx = (dF/dx) * x

それで

logx_new = logx_old + learning_rate * x * (dF/logx)
x_new = exp(logx_new)

これをfminuncで実装するにはどうすればよいですか?

4

1 に答える 1

7

それは可能であり、ドキュメントで説明されています:

fun の勾配も計算でき、GradObj オプションが options = optimset('GradObj','on') で設定されているように 'on' である場合、関数 fun は 2 番目の出力引数で勾配値 g を返さなければなりません。 、ベクトル、x。

カスタムグラデーションを使用した fminunc

たとえば、次の場合f = @(x) x.^2;df/dx = 2*x、次のように使用できます。

function [f df] = f_and_df(x)
    f = x.^2;
    if nargout>1
        df = 2*x;
    end
end

fminunc次に、その関数を次のように渡すことができます。

options = optimset('GradObj','on');
x0 = 5;
[x,fval] = fminunc(@f_and_df,x0,options);

logx 勾配を使用した fminunc

logx 勾配の場合、これは次のようになります。

function [f df] = f_and_df(x)
    f = ...;
    if nargout>1
        df =  x * (dF/logx);
    end
end

そしてそのままfminuncです。

無名関数を使用した fminunc

必要に応じて、無名関数も使用できます。

f_and_df2 = @(x) deal(x(1).^2+x(2).^2,[2*x(1)  2*x(2)]);
[x,fval] = fminunc(f_and_df2,[5, 4],optimset('GradObj','on'))

logx 勾配を使用した fminunc の例

追加の例f = (log(x))^2

function [f df_dlogx] = f_and_df(x)
    f = log(x).^2;

    df_dx = 2*log(x)./x;
    df_dlogx = df_dx.* x;
end

その後:

>>x0=3;
>>[x,fval] = fminunc(@f_and_df,x0,optimset('GradObj','on'))
x =
   0.999999990550151

fval =
   8.92996430424197e-17

カスタム勾配と複数の変数を使用した fminunc の例

f(x,y) などの複数の変数の場合、変数をベクトルに入れる必要があります。例:

function [f df_dx] = f_and_df(x)
    f = x(1).2 + x(2).^2;

    df_dx(1) = 2*x(1);
    df_dx(2) = 2*x(2);
end

この関数は放物面に対応します。もちろん、初期開始パラメーターにもベクトルを使用する必要があります。この場合、例: x0=[-5 3]

于 2012-05-14T12:15:26.327 に答える