MATLAB BP ニューラル ネットワークの設計と最適化


序文

  • BP (バック プロパゲーション) ニューラル ネットワークは、エラー バックプロパゲーションを使用して重みのしきい値を更新するフィード フォワード ニューラル ネットワークであり、適合または分類の問題を解決するためによく使用されます。

多くの優れたブロガーが、ニューラル ネットワークと BP ニューラル ネットワークの計算原理の詳細な説明と導出に関する関連作業を行っています。

この記事の主な目的は、プロジェクトの学習と実行の過程で BP ニューラル ネットワークを適用した私の経験を要約することです。コンテンツには、主に MATLAB ベースの BP ニューラル ネットワークの設計手順と関連する最適化の紹介が含まれます。コンピューティングの原理を大まかに理解しており、大小さまざまな論文の内容を調べている場合は、おそらくこの記事を読むことでプロセスをスピードアップできます。
ここに画像の説明を挿入

1. データセットの分割

トレーニング プロセス中のモデルのオーバーフィッティングを回避するために、独自のデータのサイズに応じてさまざまな方法でデータ セットを分割できます。

  • データ セットが十分に大きい場合、トレーニング セット、テスト セット、および検証セットの分割方法を採用できます。分割比率は次のとおりです。0.7、0.15、0.15 ツールボックスのデフォルトの分割方法。

  • トレーニング セットとテスト セットの分割方法が採用され、一般的な比率は 0.8、0.2 です。

  • データセットが小さい場合、循環交差検証には leave-one-out メソッドが使用されます。

  • データセットが小さい場合、ホワイトノイズを追加した後のデータや回転、縮小、拡大後の画像など、データセットの増分を実現するためにいくつかの方法を使用することもできます。

2. ネットワークトポロジーの決定

2.1 入力層と出力層

t に対する x、y、z の影響を調べるなど、モデルの入力と出力を決定します。インプットは3つ、アウトプットは1つですが、ここで表現したいのは研究要素xyzの決定過程です。多くの要因は、シミュレーションまたは実験プロセスで記録可能なすべてのデータである可能性があります.多くの要因がある場合は、トレーニングの前にデータ次元で次元削減処理を実行することを検討できます.例:

  • 機械学習には、線形マッピングと非線形マッピングの 2 つの主要な方法があります。
  • 線形マッピング: PCA、LAD
  • 非線形マッピング: カーネル メソッド (カーネル + 線形)、2D およびテンソル化 (2D + 線形)、多様体学習 (ISOMap、LLE、LPP)

2.2 隠れ層数とユニット数

(1) 隠れ層数の決定

多くの場所で、次の文を目にすることができます。

  • 3 層 BP ニューラル ネットワークは、任意の与えられた連続関数を任意の精度で近似できます。

もちろん、試験指向の教育における長年の経験から、私はそれを信じるように言われました。そのため、通常は最初に 3 つのレイヤーを使用してシミュレーション実験を行い、それが機能しない場合は、最後にレイヤーの数を変更することを選択します。

(2) 隠れ層ユニット数の決定

次の 2 つの方法があります。

  1. おおよその範囲、再発単位数、トレーニング効果を判定条件とする
  2. ユニットの数を決定するには、既存の文献の実験式を参照してください。たとえば、
    n=log2 (入力ユニットの数);
    n=sqrt (入力ユニットの数 + 出力ニューロンの数)+a (a は [ 0,10] 定数)。
    ここで、2 番目の実験式は方法 1 と組み合わせて使用​​できます。

ここでは、2 つの場所についてお話したいと思います。一つは、理論的には、隠れ層の数とユニットの数は、ループを使用して単純かつ大まかに選択できるということです.もちろん、トレーニングセットの分割が一貫しており、十分な時間があることが前提です.もちろん、これには、ネットワークに対する初期しきい値と重みの影響が含まれますが、このプロセスは比較的複雑になります。これも2点目の言いたいことなのですが、初期閾値や重みが特定のネットワークトレーニングに与える影響を簡単に定量的に分析してみてはいかがでしょうか? このように、最適化アルゴリズムを用いてトポロジー全体を最適化することができるのではないでしょうか? . . もちろん、これは私の想像に過ぎず、その実現の可能性と複雑さについてはなんとも言えません。

2.3 伝達関数、学習関数、パフォーマンス関数

関数 関数名 使用
伝達関数 ログシグ シグモイド関数
伝達関数 dlogsig シグモイド関数の導関数
伝達関数 タンジー シグモイド関数
伝達関数 dtansic シグモイド関数の導関数
伝達関数 ピュアリン 純粋な線形関数
伝達関数 ドプレリン 純粋な線形関数の導関数
学習機能 学んだ 勾配降下法による学習機能
学習機能 学習した 勾配降下運動量学習機能
パフォーマンス機能 メス 平均二乗誤差関数
パフォーマンス機能 メスレグ 平均二乗誤差正規化関数

3. 初期重量と閾値の決定

3.1 ランダムに与えられる [-1 1]

matlab ツールボックスでは、既定の初期値は [-1 1] として指定され、初期の重みしきい値はランダムに指定されます。

3.2 初期の重みとしきい値を最適化する最適化アルゴリズム

現在一般的な論文では、ニューラル ネットワーク ペアのトポロジが決定された後、トレーニングの前に初期の重みとしきい値が最適化されます。ここで一般的に使用される、トレーニングの開始点を比較的良いものにします。

  • GA-BP
  • PSO-BP
  • GSO-BP
  • ACO-BP
  • BFO-BP
  • ABC-BP

同時に、論文がアルゴリズムを実行する一般的な場所でもあります.もちろん、ここでの最適化アルゴリズムは、さまざまな群知能アルゴリズムを使用でき、最適化アルゴリズムを改善してBPニューラルネットワークの初期値を最適化することもできます. この方法は非常に優れており、論文をすばやく作成するために使用できます。重要なのは、最適化アルゴリズムの正しい適合度関数を実現するために、しきい値と重みに従ってネットワークをどのように再現するかです。

4.トレーニングパラメータの設定

トレーニング モデルのパラメーター設定はトレーニング効果に影響を与えるため、関連する調整はモデルごとに行う必要があります。

計画 関数
最大反復回数 net.trainParam.epochs
訓練目標 net.trainParam.goal
トレーニングの時間 net.trainParam.time
最小勾配性能 net.trainParam.min_grad
最大確認失敗 net.trainParam.max_fail
使用される線形検索パス net.trainParam.searchFcn
学習率 net.trainParam.lr
運動量係数 net.trainParam.mc

5. トレーニングとトレーニング効果評価

関数 train を使用してネットワークを学習させた後、ツールボックスに付属のインターフェイスで学習プロセスと学習結果を表示できます。
ここに画像の説明を挿入
ここに画像の説明を挿入
ここの回帰グラフに関して、Zhihu と Baidu の人々が、水平座標と垂直座標が実際には正規化後の実際の値と予測値であり、回帰の効果を表していることを確認しました。

もちろん、モデル トレーニングの予測効果を判断しやすくするために、R2 (決定係数。一部の教科書では決定係数と訳され、適合度とも呼ばれます) を使用して評価できます。予測データと実際のデータとの関係 関連性。プログラムのループ終了条件として使用すると便利です。

ここでは、私が使用した R2 計算式と、csdn で見たブログを以前に記録しました。これは参照として使用できます。

%y1为预测值 y为实际值
R2=1 - (sum((y1- y).^2) / sum((y - mean(y)).^2))
function [r2 rmse] = rsquare(y,f,varargin)
% Compute coefficient of determination of data fit model and RMSE
%
% [r2 rmse] = rsquare(y,f)
% [r2 rmse] = rsquare(y,f,c)
%
% RSQUARE computes the coefficient of determination (R-square) value from
% actual data Y and model data F. The code uses a general version of 
% R-square, based on comparing the variability of the estimation errors 
% with the variability of the original values. RSQUARE also outputs the
% root mean squared error (RMSE) for the user's convenience.
%
% Note: RSQUARE ignores comparisons involving NaN values.
% 
% INPUTS
%   Y       : Actual data
%   F       : Model fit
%
% OPTION
%   C       : Constant term in model
%             R-square may be a questionable measure of fit when no
%             constant term is included in the model.
%   [DEFAULT] TRUE : Use traditional R-square computation
%            FALSE : Uses alternate R-square computation for model
%                    without constant term [R2 = 1 - NORM(Y-F)/NORM(Y)]
%
% OUTPUT 
%   R2      : Coefficient of determination
%   RMSE    : Root mean squared error
%
% EXAMPLE
%   x = 0:0.1:10;
%   y = 2.*x + 1 + randn(size(x));
%   p = polyfit(x,y,1);
%   f = polyval(p,x);
%   [r2 rmse] = rsquare(y,f);
%   figure; plot(x,y,'b-');
%   hold on; plot(x,f,'r-');
%   title(strcat(['R2 = ' num2str(r2) '; RMSE = ' num2str(rmse)]))
%   
% Jered R Wells
% 11/17/11
% jered [dot] wells [at] duke [dot] edu
%
% v1.2 (02/14/2012)
%
% Thanks to John D'Errico for useful comments and insight which has helped
% to improve this code. His code POLYFITN was consulted in the inclusion of
% the C-option (REF. File ID: #34765).

if isempty(varargin); c = true; 
elseif length(varargin)>1; error 'Too many input arguments';
elseif ~islogical(varargin{
    
    1}); error 'C must be logical (TRUE||FALSE)'
else c = varargin{
    
    1}; 
end

% Compare inputs
if ~all(size(y)==size(f)); error 'Y and F must be the same size'; end

% Check for NaN
tmp = ~or(isnan(y),isnan(f));
y = y(tmp);
f = f(tmp);

if c; r2 = max(0,1 - sum((y(:)-f(:)).^2)/sum((y(:)-mean(y(:))).^2));
else r2 = 1 - sum((y(:)-f(:)).^2)/sum((y(:)).^2);
    if r2<0
    % http://web.maths.unsw.edu.au/~adelle/Garvan/Assays/GoodnessOfFit.html
        warning('Consider adding a constant term to your model') %#ok<WNTAG>
        r2 = 0;
    end
end

rmse = sqrt(mean((y(:) - f(:)).^2));

6. トレーニング結果

トレーニング セット モデルのトレーニングとテスト セット モデルのテストを通じて、現在のモデルが利用可能になり、数値予測と分類予測タスクを完了することができると考えています。
もちろん、このプロセスを再現するモデルが必要な場合は、対応する重み、しきい値、正規化パラメーター、非正規化パラメーターを保存し、ネットワーク構造で使用する活性化関数を記録し、活性化関数を使用して行列操作を再現することを忘れないでください。通信網。経験上、正規化はネットワークを完全に再現できる [-1,1] の範囲に正規化する必要があることが示されています。

ps_input %归一化参数
ps_output%返归一化参数
W1=net.IW{
    
    1,1};
W2=net.LW{
    
    2,1};
B1=net.b{
    
    1} ;
B2=net.b{
    
    2} ;

具体的な操作については、以下を参照してください。


7. 従来のBPトレーニングと適応学習率+モメンタムラーニングトレーニングの比較

フィッティング関数 f(x)=cos(x) を例に取ります (ここではトレーニング方法の比較のみが考慮され、データセットは分割されていません)。

  • それぞれ従来の BP トレーニング:traind、適応学習率 + 運動量学習トレーニング:traindx、Levenberg-Marquadt:tranlm

従来の BP トレーニング: traind (長時間、収束が遅い)
コンピューター
$1600
適応学習率 + 運動量学習トレーニング: traindx (短時間、収束が速い)
ここに画像の説明を挿入

ここに画像の説明を挿入
Levenberg-Marquadt: tranlm (期間、高速収束)
ここに画像の説明を挿入
ここに画像の説明を挿入
ソース コード:

clc;
clear;
x=0:0.1:2*pi;
y=cos(x);

%% I.数据读取
p_train=x;
t_train=y;
%% II.数据归一化
[P_train, ps_input] = mapminmax(p_train,-1,1);
[T_train, ps_output] = mapminmax(t_train,-1,1);
p = P_train;
t = T_train;
%% III.BP神经网络建立
% 1.创建网络
net = newff(p,t,4,{
    
    'tansig','purelin'},'trainlm');
% net = newff(p,t,4,{
    
    'tansig','purelin'},'traingd');
% net = newff(p,t,4,{
    
    'tansig','purelin'},'traingdx');
% 2.设置训练参数
net.trainParam.epochs = 2000; %运行次数
net.trainParam.goal = 1e-3;   %目标误差
net.trainParam.lr = 0.035;    %学习率
net.trainParam.mc = 0.85;      %动量因子
net.divideFcn = ''; %清除样本数据分为训练集、验证集和测试集命令
%%
% 3. 训练网络
net = train(net,p,t);
%%
% 4. 仿真测试
t_sim =sim(net,p);
%%
% 5. 数据反归一化
T_sim = mapminmax('reverse',t_sim,ps_output);
%% IV.拟合评价
r2_bp = 1 - (sum((T_sim'-  t_train').^2) ./ sum(( t_train' - mean(t_train')).^2))

%% V.绘值训练对比图
figure;
subplot(1,2,1)
plot(x,y);
xlabel('X');
ylabel('Y');
title('y=cos(x)');
subplot(1,2,2)
plot(1:length(T_sim),T_sim,'r-o',1:length(T_sim),t_train,'k-');  
legend('BP神经网络预测值','实际值');
xlabel('X');
ylabel('Y');
string = {
    
    'BP神经网络R1训练集预测结果对比';['R^2=' num2str(r2_bp)]};
title(string);


要約する

この記事の主な目的は、プロジェクトの学習と実行の過程で BP ニューラル ネットワークを適用した私の経験を要約することです。コンテンツには、主に MATLAB ベースの BP ニューラル ネットワークの設計手順と関連する最適化の紹介、およびプロセスにおける独自のさまざまなアイデアが含まれています. アイデアや質問がある場合は、プライベート チャットまたはコメントを歓迎します! ! !


同時に、モデルの構築とモデルの最適化に関連するニーズがある場合は、Xianyu でユーザーを検索できます。Man Xiaojie、コミュニケーションを歓迎します。


おすすめ

転載: blog.csdn.net/ONERYJHHH/article/details/118607243