トピックの要件:
Matab を使用した勾配降下法
関数の場合:
min f ( x ) = 2 x 1 2 + 4 x 2 2 − 6 x 1 − 2 x 1 x 2 \min f(x)=2 x_{1}^{2}+4 x_{ 2 }^{2}-6 x_{1}-2 x_{1} x_{2}分f ( x )=2倍_12+4x _22−6x _1−2倍_1バツ2
MATLAB を使用してこの問題を解決する最急降下法を実現し、具体的な反復プロセス、最終的な最適化結果、関連するコード、および自分の経験を示してみてください。
まとめ
この記事では主に関数を実装して勾配計算を実行しますgrad()
。
実現される主な機能:
- Matlab言語で実現した勾配降下法アルゴリズム
- Matlab を使用して
plot3
、勾配降下サイクルの反復プロセスを描画し、反復回数による最小値のイメージも描画します。
勾配降下の原理
グラデーションの概念
Gradient : この点における特定の関数の方向導関数がこの方向に沿って最大値を取得することを示すベクトルです。
-
サイズがあります。変化率が最も大きくなります (勾配の係数)。
-
有向: 関数は、その点でその方向 (この勾配の方向) に沿って最も急速に変化します。
定義: z = f ( x , y ) z=f(x,y)
とします。z=f ( x ,y ) inP 0 ( x 0 , y 0 ) P_{0}\left(x_{0}, y_{0}\right)P0( ×0、y0)偏導関数fx ' ( x 0 , y 0 ) f_{x}^{\prime}\left(x_{0}, y_{0}\right) があります。fバツ「( ×0、y0)和fy ' ( x 0 , y 0 ) f_{y}^{\prime}\left(x_{0}, y_{0}\right)fy「( ×0、y0) ,则称向量{ fx ' ( x 0 , y 0 ) , fy ' ( x 0 , y 0 ) } \left\{f_{x}^{\prime}\left(x_{0}, y_{0 }\right)、f_{y}^{\prime}\left(x_{0}, y_{0}\right)\right\}{
fバツ「( ×0、y0)、fy「( ×0、y0) } forf ( x , y ) at P 0 ( x 0 , y 0 ) f(x, y) \text { at} P_{0}\left(x_{0}, y_{0}\right)f ( x ,y ) Pで 0( ×0、y0)勾配、次のように表されます。
∇ f ∣ P 0 , ∇ z ∣ P 0 , gradf ∣ P 0 または度 ∣ P 0 \left.\nabla f\right|_{P_{0}},\left.\nabla z\right|_ {P_{0}},\left.\operatorname{gradf}\right|_{P_{0}} while \left.\operatorname{gradz}\right|_{P_{0}}∇ f ∣P0、∇z∣ _ _P0、卒業生∣P0またグラーツ∣P0
∴ ∇ f ∣ P 0 = gradf ∣ P 0 = { fx ′ ( x 0 , y 0 ) , fy ′ ( x 0 , y 0 ) } \left.\therefore \nabla f\right|_{P_{0 }}=\left.\operatorname{gradf}\right|_{P_{0}}=\left\{f_{x}^{\prime}\left(x_{0}, y_{0}\right) 、f_{y}^{\prime}\left(x_{0}, y_{0}\right)\right\}∴∇ f ∣P0=卒業生∣P0={
fバツ「( ×0、y0)、fy「( ×0、y0) }
ここで:∇ \nbla∇ (Nabla)算子:
∇ = ∂ ∂ xi + ∂ ∂ yj \nabla=\frac{\partial}{\partial x} i+\frac{\partial}{\partial y} j∇=∂ ×∂私+∂y _∂j
勾配関数:
グラデーションのサイズ:
∣ ∇ f ∣ = [ fx ' ( x , y ) ] 2 + [ fy ' ( x , y ) ] 2 |\nabla f|=\sqrt{\left[f_{x}^{\prime}(x, y)\right]^{2}+\left[f_{y}^{\prime}(x, y)\right]^{2}}∣∇ f ∣=[ fバツ「( x ,y ) ]2+[ fy「( x ,y ) ]2
グラデーションの方向:
设:v = { v 1 , v 2 } ( ∣ v ∣ = 1 ) v=\left\{v_{1}, v_{2}\right\}(|v|=1)v={ v1、v2}( ∣ v ∣=1 ) が任意の方向である場合、∇ f \nbla f∇ fとvvvのθ \thetaθには次のような特徴があります。
∂ f ∂ v ∣ P 0 = fx ' ( x 0 , y 0 ) v 1 + fy ' ( x 0 , y 0 ) v 2 = { fx ' ( x 0 , y 0 ) , fy ' ( x 0 , y 0 ) } ∙ { v 1 , v 2 } = ∇ f ∣ P 0 ∙ v = ∣ ∇ f ∣ P 0 ∣ ⋅ ∣ v ∣ cos θ \begin{aligned} \left.\frac{\partial f}{ \partial v}\right|_{P_{0}} &=f_{x}^{\prime}\left(x_{0}, y_{0}\right) v_{1}+f_{y}^ {\prime}\left(x_{0}, y_{0}\right) v_{2} \\ &=\left\{f_{x}^{\prime}\left(x_{0}, y_{ 0}\right)、f_{y}^{\prime}\left(x_{0}, y_{0}\right)\right\} \bullet\left\{v_{1}, v_{2}\ right\} \\ &=\left.\nabla f\right|_{P_{0}} \bullet v=|\nabla f|_{P_{0}}|\cdot| v \mid \cos \theta \end{整列}∂v _∂f _ P0=fバツ「( ×0、y0)v1+fy「( ×0、y0)v2={ fバツ「( ×0、y0)、fy「( ×0、y0) }∙{ v1、v2}=∇ f ∣P0∙v=∣∇ f ∣P0∣⋅∣ v∣コス私
勾配降下法:
α ( k ) = argmin f ( xk − α ⋅ ∇ f ( x ( k ) ) ) \alpha_{(k)}=\operatorname{argmin} f\left(x^{k}-\alpha \cdot \ナブラ f\left(x^{(k)}\right)\right)ある( k )=アルグミンf( ×k−ある⋅∇f _( ×( k ) )_
勾配降下法の長所と短所の分析
アドバンテージ:
(1) プログラムが簡単で計算量が少ない
(2) 初期点に特別な要求がない
(3) 最急降下法は全体が収束し、線形収束する
欠点:
(1) 局所範囲で「最速」の属性しか持たず、解法全体としては下降速度が遅い、(2)最小値に近づくと速度が遅くなる、(3) の可能性があります
。 「ジグザグ」ドロップ
コアコードと結果
コードの反復結果:
反復プロセス:
最小値 - 反復回数 トレンド イメージ:
反復結果の円錐面上での視覚化:
求める関数:
min f ( x ) = 2 x 1 2 + 4 x 2 2 − 6 x 1 − 2 x 1 x 2 \min f(x)=2 x_{1}^{2}+4 x_{2}^{2}-6 x_{1}-2 x_{1} x_{2}分f ( x )=2倍_12+4x _22−6x _1−2倍_1バツ2
メイン機能:
clc,clear;
syms x1 x2 s; %声明符号变量
f1 =2*x1^2+4*x2^2-6*x1-2*x1*x2;%设定目标函数
[k,f1,f2,f3]=grad(f1,x1,x2,s,[0,1],10^(-5)); %设定起始点[x1 x2]=[-2.5,4.25]和精度10^(-2)
[result]=sprintf('在 %d 次迭代后求出极小值\n',k);%在迭代多少次之后求出极小值
disp(result);
figure(1);
plot(1:k,f3); % 作出函数图像
title('迭代过程');%输出结果
xlabel('迭代次数');
ylabel('极小值');
figure(2);
plot3(f1,f2,f3); % 画出方程图像
hold on;
syms x1 x2; % 声明符号变量
f=2*x1^2+4*x2^2-6*x1-2*x1*x2;
fmesh(f);
勾配降下コア関数の実装:
function [iterator,f1,f2,f3] = grad(f,x1,x2,s,start_point,thereshold)
iterator = 0;%迭代次数赋值初始化
grad_f = [diff(f,x1) diff(f,x2)]; %计算f的梯度
delta = subs(grad_f,[x1,x2],[start_point(1),start_point(2)]);
%计算起点的梯度
step=1; %设置初始步长为1
current_point = start_point;%起点值赋给当前点
%最速下降法的主循环,判断条件为:梯度的模与所给精度值进行比较
while norm(delta) > thereshold
iterator = iterator + 1;%迭代次数+1
%一维探索 求最优步长(此时方向已知,步长s为变量)
x_next = [current_point(1),current_point(2)] - s* delta/norm(delta);% 计算x(k+1)点,其中步长s为变量
f_val = subs(f,[x1,x2],[x_next(1),x_next(2)]);% 将x值带入目标函数中
step = abs(double(solve(diff(f_val,s)))); % 对s求一阶导,并加绝对值符号,得到最优步长的绝对值
step = step(1);%更新步长
%计算x(k+1)点
current_point = double([current_point(1),current_point(2)] - step * delta/norm(delta));
%计算x(k+1)点的梯度值
delta = subs(grad_f,[x1,x2],[current_point(1),current_point(2)]);
%计算函数值
f_value = double(subs(f,[x1,x2],[current_point(1),current_point(2)]));
%输出迭代计算过程
result_string=sprintf('k=%d, x1=%.6f, x2=%.6f, step=%.6f f(x1,x2)=%.6f',iterator,current_point(1),current_point(2),step,f_value);
f1(iterator)=current_point(1);
f2(iterator)=current_point(2);
f3(iterator)=f_value;
disp(result_string);
end
end
勾配アルゴリズムの限界とその最適化
ニューラル ネットワークでは、勾配探索が最も広く使用されているパラメータ最適化手法です。このタイプの手法では、戦略解から開始して、世代ごとに最適なパラメータ値を探索します。各世代では、最初にパラメータの勾配を計算します。集合関数の現在点を求め、勾配に応じて探索方向を決定します。
探索プロセス中に、極小値に閉じ込められるという問題に遭遇することがあります。誤差関数に複数の極小値がある場合、見つかった解が大域最小値であるとは保証されません。後者の場合、パラメータは最適化は極小値 Minimal に閉じ込められており、これは明らかに私たちが期待していたものではありません。
実際のタスクでは、ローカル ミニマムから「飛び出し」てグローバル ミニマムに近づけようとするために、次の戦略がよく使用されます。
- 異なるパラメータ値の複数のセットを使用して複数のニューラル ネットワークを初期化し、標準的な方法に従ってトレーニングした後、誤差が最も小さい解を最終パラメータとして取得します。これは、複数の異なる初期点から探索を開始するのと同じなので、次のような状態に陥る可能性があります。異なる極小値を選択すると、大域最小値に近い結果を得ることができますが、
大域最小値からの「飛び出し」も発生します。 - 「シミュレーテッド アニーリング」テクノロジを使用すると、シミュレーテッド アニーリングでは、各ステップで一定の確率で現在の解決策よりも悪い結果が受け入れられ、局所最小値から「飛び出す」のに役立ちます。各反復中に、「最適な解決策」を受け入れます。アルゴリズムの安定性を確保するため、時間の経過とともに徐々に減少します。
- 確率的勾配降下法を使用する: 勾配を正確に計算する標準の勾配降下法とは異なり、確率的勾配降下法では勾配の計算にランダム性が追加されます。したがって、たとえ極小値に陥ったとしても、計算される勾配は依然としてゼロでない可能性があるため、極小値から飛び出して探索を続ける可能性があります。