Parçaçık Sürü Optimizasyon Algoritması ile Yapay Sinir Ağı Eğitimi

Bu yazımızda Parçacık Sürü Optimizasyon (PSO) algoritması ile Yapay Sinir Ağı eğitimi hakkında bilgi vereceğiz. PSO ile ilgili detaylı bilgileri linke tıklayarak ulaşabilirsiniz.

PSO algoritmasında en önemli aşamaların ilki Yapay Sinir Ağı ağırlık ve eşik parametrelerin parçacıklarda tanımlanmasıdır. Bu yazıda literatürde sıklıkla tercih edilen Çok Katmanlı Algılayıcı tipi YSA referans alınmıştır. Aşağıdaki denklemde i. parçacık için R adet girişe sahip, gizli katmanda ise T hücreye sahip ve 1 çıkışa sahip ÇKA’nın ağıtlıkların ve eşiklerin yerleşimine ait örnek gösterilmiştir.

Bu bilgiler doğrultusunda kodlama işlemi için öncelikle her bir parçacık için başlangıç pozisyon ve hız değerlerinin atanması gerekmektedir. Başlangıcta parçacıkların yerel en iyi konumu , başlangıç pozisyonu olarak atanır (4.-6. satırlar).

Daha sonra başlangıç değerleri için uygunluk değeri hesaplamaları yapılır (10. satır). bu işlemi takiben belirlen iterasyon değerleri arasında öncelikle parçacıkların pozisyonları güncellenir (14. satır) . Güncelleme işlemi sonucunda oluşan yeni pozisyonlara ait yeni uygunluk değerleri hesaplanır (17. satır). Daha sonra yeni uygunluk değerleri referans alınarak yerel en iyi pozisyonlar güncellenir ve daha sonra yerel en iyi pozisyonlar içerisinde küresel en iyi belirlenir (21- 25. satırlar).

function [GLOBAL_BEST min_data] = PSO_TRAIN(Train_Input, Train_Output, NoParam, NoParticle, Iteration, Max_Limit, ...
                                 NoInput, NoHidden, NoOutput)
                            
PARTICLE = rand(NoParticle, NoParam);
BEST_PARTICLE = PARTICLE;
VELOCITY = rand(NoParticle, NoParam);
GLOBAL_BEST = zeros(1, NoParam);      


FITNESS_VALUE_old = Fitness_Valeu(Train_Input, Train_Output, NoParticle, PARTICLE,...
             NoInput, NoHidden, NoOutput);
         
for n_i = 1 : Iteration
    [PARTICLE VELOCITY] = UPDATE_BLOCK(PARTICLE, BEST_PARTICLE,  VELOCITY, ...
                          GLOBAL_BEST, NoParticle);
    
    FITNESS_VALUE = Fitness_Valeu(Train_Input, Train_Output, NoParticle, PARTICLE,...
             NoInput, NoHidden, NoOutput);
    
    
    ind = find(FITNESS_VALUE < FITNESS_VALUE_old);
    FITNESS_VALUE_old(ind) = FITNESS_VALUE(ind);
    BEST_PARTICLE(ind, : ) = PARTICLE(ind, : );
    [min_data(n_i) min_ind] = min(FITNESS_VALUE_old);
    GLOBAL_BEST = BEST_PARTICLE(min_ind, : );
     
end

Fitness_Valeu fonksiyonunda öncelikli olarak parçacıkların pozisyonları ÇKA’ya ait ağırlık ve eşik değerlerine dönüştürülür. Daha sonra ise giriş veri seti kullanılarak ağ çıkışında elde edilen çıkış ile çıkış veri seti kullanılarak uygunluk değeri hesaplanır.

function E_n = Fitness_Valeu(Input_Data, Output_Data, NoFood, Foods_Pos,...
               NoInput, NoHidden, NoOutput)
           
Point_1 = 1;
Point_2 = NoInput * NoHidden;
Point_3 = NoInput * NoHidden + NoHidden;
Point_4 = NoInput * NoHidden + NoHidden + ...
          NoHidden * NoOutput;
Point_5 = NoInput * NoHidden + NoHidden + ...
          NoHidden * NoOutput + NoOutput;           

for n_i = 1 : NoFood
    w_1 = reshape(Foods_Pos(n_i, Point_1 : Point_2), NoHidden, NoInput);
    b_1 = reshape(Foods_Pos(n_i, Point_2 + 1 : Point_3), NoHidden, 1);
    w_2 = reshape(Foods_Pos(n_i, Point_3 + 1 : Point_4), NoHidden, NoOutput);
    b_2 = reshape(Foods_Pos(n_i, Point_4 + 1 : Point_5), NoOutput, 1);    
    E_n(n_i) = 0;
    for n_j = 1 : length(Input_Data)
        in_data = Input_Data(n_j, : );
        NN_output = MLP(in_data', w_1, b_1, w_2, b_2);
        E_n(n_i) = E_n(n_i) + 0.5 * (Output_Data(n_j) - NN_output)^2;
    end
end

Aşağıda ÇKA için oluşturulan fonksiyon kodu verilmiştir.

function NN_output = MLP(in_data, w_1, b_1, w_2, b_2)

    Hidden_Add = w_1 * in_data  + b_1;
    Hidden_output = 0.5 * (1 +  Hidden_Add ./ (1 + abs(Hidden_Add)));
    NN_output = w_2' * Hidden_output  + b_2;
 

Bu fonksiyon ile parçacıkların pozisyonları ve hızlarının güncellenmesi işlemi yapılmaktadır.

function [PARTICLE VELOCITY] = UPDATE_BLOCK(PARTICLE, BEST_PARTICLE,  ...
              VELOCITY, GLOBAL_BEST, g_PARTICLE)
    
    for n_i = 1 : g_PARTICLE
        VELOCITY(n_i, : )= 0.76 * (VELOCITY(n_i, : ) ... 
            + 2.1 * rand * (BEST_PARTICLE(n_i, : ) - PARTICLE(n_i, : )) ...
            + 2.1 * rand * (GLOBAL_BEST - PARTICLE(n_i, : )));
   
    end
    
    VELOCITY = min(VELOCITY, 1.0 * ones(size(VELOCITY)));
    VELOCITY = max(VELOCITY,-1.0 * ones(size(VELOCITY)));
    
    PARTICLE = PARTICLE + VELOCITY;

Örnek uygulama olarak EXOR problemi kullanılarak PSO ile YSA eğitimine ait kod aşağıda verilmiştir. Eğitim sonucunda elde edilen uygunluk değeri değişimi aşağıdaki grafikte gösterilmitşir.

clc, clear all, close all;


% MLP structure
%% Number of Parameter
NoInput = 2;
NoHidden = 3;
NoOutput = 1;

NoParam = NoInput * NoHidden + NoHidden + ...
          NoHidden * NoOutput + NoOutput;

% PSO parameter
%% Iteration
Iteration = 200;
Max_Limit = 100;

%% Colony Size
NoParticle =  100;

%% EXOR Problem
Train_Input = [0 0;
               0 1;
               1 0;
               1 1];
           
Train_Output = [0; 1; 1; 0];           


%Iteration = 200;
[glbl_best FITNESS_VALUE] = PSO_TRAIN(Train_Input, Train_Output, NoParam, NoParticle, Iteration, Max_Limit, ...
                                 NoInput, NoHidden, NoOutput);
figure, plot(FITNESS_VALUE)
xlabel('Iteration')


Point_1 = 1;
Point_2 = NoInput * NoHidden;
Point_3 = NoInput * NoHidden + NoHidden;
Point_4 = NoInput * NoHidden + NoHidden + ...
          NoHidden * NoOutput;
Point_5 = NoInput * NoHidden + NoHidden + ...
          NoHidden * NoOutput + NoOutput;
      
w_1 = reshape(glbl_best(Point_1 : Point_2), NoHidden, NoInput);
b_1 = reshape(glbl_best(Point_2 + 1 : Point_3), NoHidden, 1);
w_2 = reshape(glbl_best(Point_3 + 1 : Point_4), NoHidden, NoOutput);
b_2 = reshape(glbl_best( Point_4 + 1 : Point_5), NoOutput, 1);  
%     
Test_Output = MLP(Train_Input', w_1, b_1, w_2, b_2)   

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.