SPGD 最適化アルゴリズムの実現原理:
このエディタは実際にはあまり使いやすいものではありません。。。
SGD アルゴリズムはさまざまな深層学習最適化モデル アルゴリズムで広く使用されています. ここ数日で, アルゴリズムの最適化原理がついに理解されました. まず, x = 1, 2に対応する関数 y = 2x-1 を仮定し
ます
, 3, 4,5,6,7,8,9
y = 1,3,5,7,9,11,13,15,17
しかし、関数に対応する数学的関係が分からなくても、 x、y の値。コンピュータにこのモデルの数学関数を計算させ、x = 20 のときの値を予測させるにはどうすればよいでしょうか?
コードは最後にあります。。
SPGD アルゴリズムの原理:
まず、この関数が 1 つの変数の 2 次方程式であると仮定してモデルを構築します: y = a x x + b x + c; および a = 1、b = 1、c = 1; 次に、次の 2 つの曲線が得られます。この
うち、赤い曲線は y = 2x-1 に対応し、
黒い曲線は y = x x+x+1 に対応し、
我々がしなければならないことは、モデルを既存のデータの実モデル y = 2x に近づけることです。 -1;
最初に、[0.1,0.2,0.3] などの小数をいくつかランダムに生成します (乱数は毎回異なります)。
次に [1,1,1]、最初に乱数を加算してから、乱数を使用して
y = 1.1 x x +1.2 x+1.3;
および y = 0.9x x+0.8x+0.7; の
2 つの関数曲線を取得し、単位から y = 2x-1 を減算します ([x = 1, 2,3,4,5, 6, 7, 8, 9; y = 1, 3, 5, 7, 9, 11, 13, 15, 17] 値が順番に計算に組み込まれます。ここでは理解を容易にするために、代わりに y = 2x-1 関数を使用します); Get:
y = 1.1 x x-0.8 x+0.3;
および y = 0.9x x-1.2x-0.3;
最後に、次の標準偏差を見つけます。これら 2 つの関数 (実際には、標準偏差が評価基準として使用され、標準偏差が小さいほど真の値に近いことが証明されます) は、2 つの標準偏差の差を使用して [0.1,0.2,0.3] を乗算します
。 add [1,1,1]; 新しい多項式係数を取得します。
たとえば、[0.8, 1.3, 0.9] と多項式を入力して関数を取得します:
y = 0.8x*x+1.3x+0.9;
再度サイクルし、複数の計算の後、計算された曲線はますます近づきます。実際のデータ; たとえば、5 つの最適化を行った後、次の図に示すように各最適化の結果を記録しました: 上の図に示すように
、モデルの計算結果は上から下に向かってどんどん実際のデータに近づいています。 。最適化プロセスが収束しており、係数の変化プロセスは下図のようになっていることがわかります。
約 15 回の最適化を経て、実際の値に非常に近い計算結果が得られることがわかります。計算結果は以下の図を参照してください:
明らかな最適化エラーがまだあります はい、これは、設定した乱数の値が大きすぎて、最適化の数が非常に少ないためです。設定が小さい場合、または最適化の数が多いほど、より高い精度を達成できます。
さらに、設定した最適化モデルが 2 次関数であることを考慮すると、最適化効果はさらに悪くなり、1 回限りの関数であれば非常に高くなります。以下の図に示すように:
ここでの最適化された関数は y = 2x-0.9524 です。
この関数を使用して x = 20、y = 39.0476 を予測すると、理論的な計算結果 39 に非常に近づきます。
まとめ:
この時点ではほとんど学習せず、知らず知らずのうちにディープラーニングアルゴリズムモデルの最適化プロセスを完了し、簡単なデータ予測も行っていました。
次に、畳み込みニューラル ネットワークを学習して記録します。後でコードを添付しましょう。これは MATLAB で書きました。後で Python でもう一度試すことができます。
1 つ目は 2 次最適化モデルです。
%
clc;clear; % 初始化
close all;
x = 1:1:15; % 横坐标
y = 2*x+1; % 纵坐标
len = length(x); % 数据长度
coe_last = [1,1,1]; % 初始多项式系数
step = 0.1; % 优化步长
amp = 0.1; % 扰动系数
cal_last = coe_last(1)*x.^2+coe_last(2)*x+coe_last(3); % 初始系数的函数曲线
figure,subplot(2,1,1),plot(x,y,'r'); % 绘图函数
hold on,plot(x,cal_last,'k');
title('Before Optimize');
legend('Ideal curve','hypothesis curve');
% 循环优化
for i = 1:100
wg = amp*wgn(1,3,1); % 扰动量
coe_add = coe_last+wg; % 原始系数+扰动量
cal_add = coe_add(1)*x.^2+coe_add(2)*x+coe_add(3); % 原始系数+扰动量的函数曲线
error_add = std(y-cal_add); % 计算加系数后的标准差
coe_sub = coe_last-wg; % 原始系数-扰动量
cal_sub = coe_sub(1)*x.^2+coe_sub(2)*x+coe_sub(3); % 原始系数-扰动量的函数曲线
error_sub = std(y-cal_sub); % 计算减系数后的标准差
error_e = (error_add-error_sub)*step*wg; % 计算每各系数优化量
coe_last = coe_last-error_e; % 更新多项式系数
end
cal = coe_last(1)*x.^2+coe_last(2)*x+coe_last(3); % 计算优化后函数曲线
subplot(2,1,2),plot(x,y,'r'); % 绘图函数
hold on,plot(x,cal,'k');
title('After Optimize');
legend('Ideal curve','Optimize curve');
次に最適化されたモデル
clc;clear; % 初期化して
すべてを閉じます。
x = 1:1:15; % 横座標
y = 2*x+1; % 縦座標
len = length(x); % データ長
coe_last = [1,1]; % 初期多項式係数
step = 0.1; % 最適化ステップ サイズ
amp = 0.1; % 外乱係数
cal_last = coe_last(1)*x+coe_last(2); % 初期係数の関数曲線
図,サブプロット(2,1,1),プロット(x,y,'r'); % 绘图関数数
hold on,plot(x,cal_last,'k');
title('最適化前');
legend('理想曲線','仮説曲線');
% i のループ最適化= 1:100
wg = amp*wgn(1,2,1); % 外乱
coe_add = coe_last+wg; % 元の係数 + 外乱
cal_add = coe_add(1)*x+coe_add(2) ; %元の係数 + 外乱曲線
error_add = std(y-cal_add); % 係数加算後の標準偏差を計算 coe_sub
= coe_last-wg; % 元の係数 - 外乱
cal_sub = coe_sub(1)*x+coe_sub( 2); % 元の係数-外乱関数曲線
error_sub = std(y-cal_sub); % 標準偏差を計算します
error_e = (error_add-error_sub) step wg; % 各係数の最適量を計算します
coe_last = coe_last-error_e; % 多項式係数を更新します
end
cal = coe_last(1)*x+coe_last(2); % 最適化された関数曲線を計算します subplot
(2,1,2),plot(x,y,'r'); % 描画関数
hold on,plot(x, cal,'k');
title('最適化後');
legend('理想曲線','最適化曲線');