ディープラーニング(2)、ディープラーニングの原理をついに理解 ~SPGD(SGD)最適化アルゴリズムの実現原理~

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('理想曲線','最適化曲線');

おすすめ

転載: blog.csdn.net/ruredfive/article/details/118118094