English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Italiano
preview
Veri Bilimi ve Makine Öğrenimi - Sinir Ağları (Bölüm 01): İleri Beslemeli Sinir Ağları

Veri Bilimi ve Makine Öğrenimi - Sinir Ağları (Bölüm 01): İleri Beslemeli Sinir Ağları

MetaTrader 5Alım-satım sistemleri | 28 Şubat 2025, 11:46
104 0
Omega J Msigwa
Omega J Msigwa

“...çok fazla şey bilmekten ve çok az şey anlamaktan yoruldum.”

- Jan Karon, Home to Holly Springs

Giriş

Sinir ağları, alım-satımın kutsal kasesine yaklaşmanın bir yolunu sunan yeni popüler şey gibi görünüyor. Birçok yatırımcı, piyasa hareketlerini tahmin etmede ve genel olarak eldeki herhangi bir görev için iyi bir iş çıkardıkları için sinir ağı tabanlı programlar karşısında şaşkınlığa uğruyor. Ben de eğitimsiz/görülmemiş yeni verilere dayalı tahmin veya sınıflandırma söz konusu olduğunda muazzam bir potansiyele sahip olduklarını düşünüyorum.

Ne kadar iyi olurlarsa olsunlar, bilgili insanlar tarafından tasarlanmalı ve optimize edilmelidirler. Sadece çok katmanlı algılayıcının doğru mimariye sahip olması değil, aynı zamanda çözülecek problemin türünün de sadece lineer veya lojistik regresyon modeli ya da başka bir makine öğrenimi tekniği değil, sinir ağlarının kullanımını içermesi gerektiğinin farkına varılmalıdır.

Sinir ağları, genel olarak makine öğrenimi gibi çok geniş bir konudur, bu nedenle ayrı bir alt seri başlatmaya karar verdim. Makine öğreniminin diğer yönlerini serinin diğer dalında ele almaya devam edeceğiz.

Bu makalede, sinir ağlarının temellerine göz atacağız ve makine öğrenimi meraklılarının bu alanda uzmanlaşmak için anlamalarının önemli olduğunu düşündüğüm bazı ana konuları inceleyeceğiz.

Sinir Ağları: 101 makalesi


Yapay sinir ağı nedir?

Genellikle “sinir ağları” olarak adlandırılan yapay sinir ağları (Artificial Neural Networks, ANN), canlıların beyinlerini oluşturan biyolojik sinir ağlarından esinlenen hesaplama sistemleridir.


Çok katmanlı algılayıcı ve derin sinir ağı

Sinir ağlarını tartışırken, insanların çok katmanlı algılayıcı (Multi-Layer Perceptron, MLP) terimini sık sık kullandığını duyarsınız. Bu, en yaygın sinir ağı türüdür. MLP, bir girdi katmanı, bir gizli katman ve bir çıktı katmanından oluşan bir ağdır. Basitlikleri nedeniyle, verilerdeki sunumları öğrenmek ve bir çıktı üretmek için kısa eğitim sürelerine ihtiyaç duyarlar.

Uygulama alanları:

MLP’ler genellikle regresyon analizi gibi doğrusal olarak ayrılamayan veriler için kullanılır. Basitlikleri, onları karmaşık sınıflandırma ve tahmine dayalı modelleme görevleri için en uygun hale getirir. Makine çevirisi, hava durumu tahmini, dolandırıcılık tespiti, borsa tahmini, kredi notu tahmini ve aklınıza gelebilecek diğer birçok konuda kullanılırlar.

Derin sinir ağları (Deep Neural Networks, DNN) da ortak bir yapıya sahiptir ancak burada çok fazla gizli katman bulunmaktadır. Ağınızda 3’ten fazla gizli katman varsa, bunu bir derin sinir ağı olarak kabul edin. Karmaşık yapıları nedeniyle, ağın girdi verileri üzerinde uzun süre eğitilmesini gerektirirler ve ayrıca tensör işlem birimleri (Tensor Processing Units, TPU) ve nöral işlem birimleri (Neural Processing Units, NPU) gibi özel işlem birimlerine sahip güçlü bilgisayarlar gerektirirler.

Uygulama alanları:

DNN’ler, derin katmanları nedeniyle güçlü algoritmalardır, bu nedenle genellikle karmaşık hesaplama problemlerini çözmek için kullanılırlar. Bilgisayarlı görme bu görevlerden biridir.

Farklılıklar tablosu:

MLP DNN
  Az sayıda gizli katman Çok sayıda gizli katman
  Kısa eğitim süresi Uzun eğitim süresi 
  GPU donanımı gerektirir TPU donanımı gerektirir

Şimdi, sinir ağlarının türlerine bakalım.

Birçok sinir ağı türü vardır, ancak kabaca üç ana sınıfa ayrılırlar:

  1. İleri beslemeli sinir ağları
  2. Tekrarlayan sinir ağları
  3. Konvolüsyonel sinir ağları

01: İleri beslemeli sinir ağları

Bu, en basit sinir ağı türlerinden biridir. Burada veriler çıktı düğümüne ulaşana kadar çeşitli girdi düğümlerinden geçer. Geri yayılımın aksine, burada veriler yalnızca tek bir yönde hareket eder.

Basitçe söylemek gerekirse, geri yayılım, bir sinir ağında veriler girdi katmanından çıktı katmanına iletildiği şekilde ileri beslemeyle aynı işlemleri gerçekleştirir, ancak geri yayılımda, ağın çıktısı çıktı katmanına ulaştığında, gerçek sınıf değerini alır. Model, bunu tahmin edilen değerle karşılaştırarak yaptığı tahminin ne kadar yanlış ya da doğru olduğunu görür. Tahmin yanlışsa, veriler ağa geri gönderilir ve parametreler tahmini düzeltmek için güncellenir. Bu bir kendi kendine öğrenme algoritmasıdır.

02: Tekrarlayan sinir ağları

Tekrarlayan sinir ağı, belirli bir katmanın çıktısının depolandığı ve girdi katmanına geri gönderildiği bir yapay sinir ağı türüdür. Bu, katmanın sonucunun tahmin edilmesine yardımcı olur.

Tekrarlayan sinir ağları aşağıdakilerle ilgili problemleri çözmek için kullanılır: 

  • Zaman serisi verileri
  • Metin verileri
  • Ses verileri

Metin verilerinin en yaygın kullanımı, yapay zekanın konuşması için kelimeler sunmaktır, örn: How + are + you + ?

Tekrarlayan ve ileri beslemeli sinir ağları


03: Konvolüsyonel sinir ağları (CNN)

CNN’ler çok sık kullanılmaktadır. Görüntü ve video işleme projelerinde baskındırlar. 

Örneğin, görüntü algılama ve sınıflandırma yapay zekası konvolüsyonel sinir ağlarından oluşur.

Konvolüsyonel sinir ağı

Görüntü kaynağı: analyticsvidhya.com

Sinir ağı türlerine baktık, şimdi bu makalenin ana konusu olan ileri beslemeli sinir ağlarına odaklanalım.


İleri beslemeli sinir ağları

Diğer daha karmaşık sinir ağı türlerinden farklı olarak, geri yayılım yoktur, yani bu tür sinir ağlarında veriler yalnızca tek yönde iletilir. İleri beslemeli bir sinir ağı bir veya birkaç gizli katmana sahip olabilir.

Aşağıdaki diyagram bu sinir ağının nasıl çalıştığını göstermektedir.

İleri beslemeli sinir ağı

Girdi katmanı

Sinir ağı diyagramından bir girdi katmanına sahip olduğunu görebilirsiniz. Özünde, girdi katmanı sadece verilerin bir temsilidir. Girdi katmanında herhangi bir hesaplama yapılmaz.

Gizli katman

Gizli katman, sinir ağının çalışmalarının çoğunun yapıldığı yerdir.

Çalışma prensibini daha iyi anlamak için ikinci gizli katman düğümünü analiz edelim.

İkinci düğüm

İlgili süreçler:

  1. Girdilerin ve ilgili ağırlıklarının nokta çarpımını bulma
  2. Elde edilen nokta çarpımının yanlılığa eklenmesi
  3. İkinci prosedürün sonucunun aktivasyon fonksiyonuna aktarılması


Yanlılık nedir?

Yanlılık, tahmin çizgisini verilere daha iyi uydurmak için lineer regresyonu yukarı ve aşağı kaydırmanıza olanak tanır. Bu, lineer regresyondaki Kesişim ile aynıdır.

Bu parametre, gizli katmanda tek düğümlü MLP - lineer regresyon modeli bölümünde daha iyi açıklanacaktır.

Ayrıca yanlılığın önemi de bu Stack başlığında iyi bir şekilde açıklanmıştır.


Ağırlıklar nedir?

Ağırlıklar, girdi verilerinin ne kadar önemli olduğunu yansıtır. Çözmeye çalıştığınız denklemin katsayıları gibi davranırlar. Negatif ağırlıklar çıktı verilerinin önemini azaltır ve bunun tersi de geçerlidir. Bir sinir ağı bir eğitim veri kümesi üzerinde eğitildiğinde, bir dizi ağırlık ile başlatılır. Bu ağırlıklar daha sonra eğitim süresi boyunca optimize edilir ve ağırlıkların optimum değeri elde edilir.


Aktivasyon fonksiyonu nedir?

Bir aktivasyon fonksiyonu, girdi verilerini alan ve bir çıktı sinyali üreten matematiksel bir fonksiyondan başka bir şey değildir.

Aktivasyon fonksiyonu çeşitleri

Varyantlarıyla birlikte birçok aktivasyon fonksiyonu vardır, ancak burada en yaygın kullanılanlar verilmiştir:

  1. ReLU
  2. Sigmoid
  3. TanH
  4. Softmax

Hangi aktivasyon fonksiyonunun nerede kullanılacağını bilmek çok önemlidir. Ancak, internette aktivasyon fonksiyonunun uygun olmadığı yerlerde kullanılmasını öneren makalelere pek çok kez rastladım. Şimdi bu türlere daha detaylı bakalım.


01: ReLU

Düzeltilmiş lineer birim (Rectified Linear Unit, ReLU) anlamına gelir.

Sinir ağlarında en yaygın kullanılan aktivasyon fonksiyonudur. Diğerlerinden daha basittir, kodlaması kolaydır ve çıktıyı yorumlaması kolaydır, bu yüzden bu kadar popülerdir. Bu fonksiyon, girdi pozitif bir sayı ise doğrudan çıktıyı verir; aksi takdirde sıfır çıktısı verir.

Mantık şu şekildedir:

if x < 0 : return 0

else return x

Bu fonksiyon regresyon problemlerinin çözümünde daha iyi kullanılır.

ReLU grafiği

Çıktı değerleri sıfır ile pozitif sonsuz arasında değişir.

MQL5'te kodu aşağıdaki gibi olacaktır:

double CNeuralNets::Relu(double z)
 {
   if (z < 0) return(0);
   else return(z);
 }

ReLU, sigmoid ve TanH’nin muzdarip olduğu kaybolan gradyan sorununu çözer (geri yayılma ile ilgili makalede bunun hakkında daha fazla bilgi edineceğiz).


02: Sigmoid

Tanıdık geliyor değil mi? Lojistik regresyondan hatırlayın.

Formülü aşağıdaki gibidir:

Sigmoid aktivasyon fonksiyonu

Bu fonksiyon, özellikle yalnızca bir veya iki sınıfı sınıflandırırken sınıflandırma problemlerinde kullanım için daha uygundur.

Çıktı değerleri sıfır ile bir (olasılık terimleri) arasında değişir.

Sigmoid grafiği

Örneğin, ağınızda iki çıktı düğümü var. İlk düğüm bir kedi için, ikinci düğüm ise bir köpek için. İlk düğümün çıktısı 0.5'ten büyükse, bu kedi anlamına gelecektir. Ve köpek için tam tersidir.

MQL5'te kodu aşağıdaki gibi olacaktır:

double CNeuralNets::Sigmoid(double z)
 { 
   return(1.0/(1.0+MathPow(e,-z)));
 }

03: TanH

Hiperbolik tanjant fonksiyonu.

Formülü şu şekildedir:

TanH formülü

Grafiği aşağıdaki gibidir:

TanH aktivasyon fonksiyonu

Bu aktivasyon fonksiyonu sigmoid fonksiyonuna benzer ancak daha iyidir.

Çıkış değerleri -1 ile 1 arasında değişir.

Bu fonksiyon, çok sınıflı sınıflandırma sinir ağlarında kullanım için uygundur.

MQL5 kodu aşağıda verilmiştir:

double CNeuralNets::tanh(double z)
 {
   return((MathPow(e,z) - MathPow(e,-z))/(MathPow(e,z) + MathPow(e,-z)));
 }

04: SoftMax

Birisi bir keresinde SoftMax fonksiyonunun grafiğinin neden olmadığını sormuştu. Diğer aktivasyon fonksiyonlarının aksine SoftMax gizli katmanlarda kullanılmaz, sadece çıktı katmanında kullanılır ve sadece çok sınıflı bir sinir ağının çıktısını olasılık terimlerine dönüştürmek istediğinizde kullanılmalıdır.

SoftMax çok terimli olasılık dağılımını tahmin eder.

Softmax aktivasyon fonksiyonu formülü

Örneğin, bir regresyon sinir ağının çıktısı [1,3,2] olsun. Eğer bu çıktıya SoftMax fonksiyonunu uygularsak, çıktı artık [0.09003, 0.665240, 0.244728] olur.

Bu fonksiyonun çıktı değerleri 0 ila 1 aralığındadır.

MQL5'te kodu aşağıdaki gibidir:

void CNeuralNets::SoftMax(double &Nodes[])
 {
   double TempArr[];
   ArrayCopy(TempArr,Nodes);  ArrayFree(Nodes);
   
   double proba = 0, sum=0;
    
   for (int j=0; j<ArraySize(TempArr); j++)    sum += MathPow(e,TempArr[j]);
    
    for (int i=0; i<ArraySize(TempArr); i++)
      {
         proba = MathPow(e,TempArr[i])/sum;
         Nodes[i] = proba;
     } 
     
    ArrayFree(TempArr);
 }

Artık tek bir gizli katman nöronunun nelerden oluştuğunu anladığımıza göre, kodunu yazalım.

void CNeuralNets::Neuron(int HLnodes,
                        double bias,
                        double &Weights[],
                        double &Inputs[],
                        double &Outputs[]
                       )
 {
   ArrayResize(Outputs,HLnodes);
   
   for (int i=0, w=0; i<HLnodes; i++)
    {
      double dot_prod = 0;
      for(int j=0; j<ArraySize(Inputs); j++, w++)
        {
            if (m_debug) printf("i %d  w %d = input %.2f x weight %.2f",i,w,Inputs[j],Weights[w]);
            dot_prod += Inputs[j]*Weights[w];
        }
        
      Outputs[i] = ActivationFx(dot_prod+bias);
    }     
 }

ActivationFx() içinde, NeuralNets yapıcısı çağrıldığında hangi aktivasyon fonksiyonunun seçileceğini belirleyebilirsiniz.

double CNeuralNets::ActivationFx(double Q)
 {
   switch(A_fx)
     {
      case  SIGMOID:
        return(Sigmoid(Q));
        break;
      case TANH:
         return(tanh(Q));
         break;
      case RELU:
         return(Relu(Q));
         break;
      default:
         Print("Unknown Activation Function");
        break;
     }
   return(0);
 }

Kod hakkında daha fazla açıklama:

Neuron() fonksiyonu sadece gizli katman içindeki tek bir düğüm değildir, gizli katmanın tüm işlemleri bu fonksiyon içinde gerçekleştirilir. Tüm gizli katmanlardaki düğümler, son çıktı düğümüne kadar girdi düğümü ile aynı büyüklükte olacaktır. Bu yapıyı seçtim çünkü bu sinir ağını kullanarak rastgele oluşturulmuş bir veri kümesi üzerinde sınıflandırma yapacağım.

Aşağıdaki FeedForwardMLP() fonksiyonu bir NxN yapısıdır, yani üç girdi düğümünüz varsa ve üç gizli katman seçerseniz, her gizli katmanda üç gizli düğüm olacaktır. Şekle bakın:

NxN sinir ağı

FeedForwardMLP() fonksiyonu:

void   CNeuralNets::FeedForwardMLP(int HiddenLayers,
           double &MLPInputs[],
           double &MLPWeights[],
           double &bias[],
           double &MLPOutput[])
 {
    
    double L_weights[], L_inputs[], L_Out[];
    
    ArrayCopy(L_inputs,MLPInputs);
    
    int HLnodes = ArraySize(MLPInputs);
    int no_weights = HLnodes*ArraySize(L_inputs);
    int weight_start = 0;
    
    for (int i=0; i<HiddenLayers; i++)
      {
        
        if (m_debug) printf("<< Hidden Layer %d >>",i+1);
        ArrayCopy(L_weights,MLPWeights,0,weight_start,no_weights);

        Neuron(HLnodes,bias[i],L_weights,L_inputs,L_Out);
        
        ArrayCopy(L_inputs,L_Out);
        ArrayFree(L_Out);
        
        ArrayFree(L_weights);
        
        weight_start += no_weights;
      }
     
    if (use_softmax)  SoftMax(L_inputs);
    ArrayCopy(MLPOutput,L_inputs);
    if (m_debug)
      {
       Print("\nFinal MLP output(s)");
       ArrayPrint(MLPOutput,5);
      }
 } 

Bir sinir ağında nokta çarpımı bulma işlemleri matris işlemleri kullanılarak gerçekleştirilebilirdi. Ancak bu ilk makalede her şeyi herkese açık hale getirmek için döngü yöntemini seçtim. Bir dahaki sefere matris çarpımını kullanacağız.


Kütüphaneyi oluşturmak için seçtiğim varsayılan mimari hakkında bilgi edindik. Şimdi sinir ağı mimarileri konusu ortaya çıkıyor.

Google'ı açıp sinir ağı görsellerini aratırsanız, şunlar gibi farklı sinir ağı yapılarına sahip binlerce, hatta on binlerce görsel önerilecektir:

Sinir ağı mimarileri


Milyon dolarlık soru: En iyi sinir ağı mimarisi nedir?

“Hiç kimse tüm cevapları bilen bir kişi kadar yanılgı içinde değildir” - Thomas Merton.

Şimdi bu konuyu parçalara ayıralım ve neyin gerekli olup neyin olmadığını anlayalım.

Girdi katmanı

Bu katmanı oluşturan girdilerin sayısı, özelliklerin (veri kümesindeki sütunlar) sayısına eşit olmalıdır.


Çıktı katmanı

Büyüklük (nöron sayısı), sınıflandırma sinir ağı için veri kümesindeki sınıflar tarafından belirlenir. Regresyon tipi görevler için nöron sayısı seçilen model konfigürasyonuna göre belirlenir. Bir regresör için bir çıktı katmanı genellikle fazlasıyla yeterli olur.

Gizli katmanlar

Eğer problem çok karmaşık değilse, bir veya iki gizli katman fazlasıyla yeterlidir. Aslında, problemlerin büyük çoğunluğu için iki gizli katman yeterlidir. Ancak her gizli katmanda kaç düğüm olmalıdır? Bu konuda emin değilim, ancak bunun performansa bağlı olduğunu düşünüyorum. Belirli bir problem türü için neyin en iyi sonucu verdiğini görmek için farklı düğümleri keşfetmek ve denemek geliştiriciye kalmıştır. Düğümlerle denemeler yapmadan önce, daha önce tartıştığımız diğer sinir ağı türlerini anlamanız gerekir.

Bu konuyla ilgili stats.stackexchange.com'da harika bir başlık var (buraya bir link ekliyorum).

Bence tüm gizli katmanlar için girdi katmanıyla aynı sayıda düğüm, ileri beslemeli bir sinir ağı için idealdir. Ben çoğu zaman bu yapılandırmayı kullanıyorum.

Gizli katmanda tek düğümlü MLP - lineer regresyon modeli

Sinir ağının gizli katmanının bir düğümünde gerçekleştirilen işlemlere dikkat ederseniz, aşağıdakileri fark edeceksiniz:

Q = wi*Ii + b

Bu arada, lineer regresyon denklemi şöyledir:

Y = mi*xi + c

Benzerliği fark ettiniz mi? Teorik olarak aynı şeylerdir, bu işlem lineer regresyondur, bu da bizi gizli katman yanlılığının önemine geri getirir. Yanlılık, lineer bir model için bir sabittir ve belirli bir veri kümesine uyması için modelimize esneklik katar. Bu olmadan, tüm modeller x ve y eksenleri arasından sıfırdan geçecektir.

Kesişim olmadan lineer regresyon

Sinir ağı eğitildikçe ağırlıklar ve yanlılıklar güncellenecektir. Modelimiz için daha az hata veren parametreler saklanacak ve test için veri kümesinde hatırlanacaktır.

Şimdi iki sınıfı sınıflandırmak için bir MLP oluşturalım. Bu, kullanımın daha iyi anlaşılmasına yardımcı olacaktır. Ancak bundan önce, sinir ağımızın birlikte çalışacağı etiketli rastgele bir veri kümesi oluşturalım. Aşağıdaki fonksiyon rastgele bir veri kümesi oluşturur: farklı ölçeklerde veri elde etmek için ilk örneklem 2 ile ve ikinci örneklem 5 ile çarpılır.

void MakeBlobs(int size=10) 
 { 
     ArrayResize(data_blobs,size);
     for (int i=0; i<size; i++) 
       {   
         data_blobs[i].sample_1 = (i+1)*(2); 
         
         data_blobs[i].sample_2 = (i+1)*(5); 
         
         data_blobs[i].class_ = (int)round(nn.MathRandom(0,1));
       }  
 }

Veri kümesini yazdırdığımda çıkan sonuç:

QK      0       18:27:57.298    TestScript (EURUSD,M1)  CNeural Nets Initialized activation = SIGMOID UseSoftMax = No
IR      0       18:27:57.298    TestScript (EURUSD,M1)      [sample_1] [sample_2] [class_]
LH      0       18:27:57.298    TestScript (EURUSD,M1)  [0]     2.0000     5.0000        0
GG      0       18:27:57.298    TestScript (EURUSD,M1)  [1]     4.0000    10.0000        0
NL      0       18:27:57.298    TestScript (EURUSD,M1)  [2]     6.0000    15.0000        1
HJ      0       18:27:57.298    TestScript (EURUSD,M1)  [3]     8.0000    20.0000        0
HQ      0       18:27:57.298    TestScript (EURUSD,M1)  [4]    10.0000    25.0000        1
OH      0       18:27:57.298    TestScript (EURUSD,M1)  [5]    12.0000    30.0000        1
JF      0       18:27:57.298    TestScript (EURUSD,M1)  [6]    14.0000    35.0000        0
DL      0       18:27:57.298    TestScript (EURUSD,M1)  [7]    16.0000    40.0000        1
QK      0       18:27:57.298    TestScript (EURUSD,M1)  [8]    18.0000    45.0000        0
QQ      0       18:27:57.298    TestScript (EURUSD,M1)  [9]    20.0000    50.0000        0

Bir sonraki kısım rastgele ağırlık ve yanlılık değerleri üretmektir.

     generate_weights(weights,ArraySize(Inputs));
     generate_bias(biases);

Sonuç:

RG      0       18:27:57.298    TestScript (EURUSD,M1)  weights
QS      0       18:27:57.298    TestScript (EURUSD,M1)   0.7084 -0.3984  0.6182  0.6655 -0.3276  0.8846  0.5137  0.9371
NL      0       18:27:57.298    TestScript (EURUSD,M1)  biases
DD      0       18:27:57.298    TestScript (EURUSD,M1)  -0.5902  0.7384

Şimdi kodumuzun ana fonksiyonundaki tüm işlemlere bakalım:

#include "NeuralNets.mqh";
CNeuralNets *nn;

input int batch_size =10;
input int hidden_layers =2;

data data_blobs[];
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---     
     nn = new CNeuralNets(SIGMOID);
           
     MakeBlobs(batch_size);
     
     ArrayPrint(data_blobs);
       
     double Inputs[],OutPuts[];
     
     ArrayResize(Inputs,2);     ArrayResize(OutPuts,2);
     
     double weights[], biases[];
     generate_weights(weights,ArraySize(Inputs));
     generate_bias(biases);
     
     Print("weights"); ArrayPrint(weights);
     Print("biases"); ArrayPrint(biases);
     
     for (int i=0; i<batch_size; i++)
       {
         Print("Dataset Iteration ",i);
         Inputs[0] = data_blobs[i].sample_1; Inputs[1]= data_blobs[i].sample_2;    
         nn.FeedForwardMLP(hidden_layers,Inputs,weights,biases,OutPuts);
       }
       
     delete(nn);    
  }

Dikkat edilmesi gereken şeyler:

  • Yanlılık sayısı gizli katman sayısı ile aynıdır.
  • Toplam ağırlık sayısı = girdi sayısının karesi ile gizli katman sayısının çarpımı. Bu mümkündür çünkü ağımız, ağın girdi katmanı/önceki katmanı ile aynı sayıda düğüme sahiptir (tüm katmanlar girdiden çıktıya kadar aynı sayıda düğüme sahiptir).
  • Aynı prensibi izleyerek, diyelim ki 3 girdi düğümünüz varsa, son katman hariç tüm gizli katmanlar 3 düğüme sahip olacaktır. Bu son katmana ne olacağını görelim.

Rastgele oluşturulmuş veri kümesine baktığınızda, veri kümesinde iki girdi özelliği/sütunu göreceksiniz. Bu yüzden iki gizli katman eklemeye karar verdim. İşte modelimizin hesaplamaları nasıl yapacağına dair günlüğe kısa bir genel bakış (bu tür günlük kayıtlarını almak istemiyorsanız, kodda hata ayıklama modunu false olarak ayarlayın).

NL      0       18:27:57.298    TestScript (EURUSD,M1)  Dataset Iteration 0
EJ      0       18:27:57.298    TestScript (EURUSD,M1)  << Hidden Layer 1 >>
GO      0       18:27:57.298    TestScript (EURUSD,M1)  
NS      0       18:27:57.298    TestScript (EURUSD,M1)   HLNode 1
EI      0       18:27:57.298    TestScript (EURUSD,M1)  i 0  w 0 = input 2.00000 x weight 0.70837
FQ      0       18:27:57.298    TestScript (EURUSD,M1)  i 0  w 1 = input 5.00000 x weight -0.39838
QP      0       18:27:57.298    TestScript (EURUSD,M1)  dot_Product -0.57513 + bias -0.590 = -1.16534
RH      0       18:27:57.298    TestScript (EURUSD,M1)  Activation function Output =0.23770
CQ      0       18:27:57.298    TestScript (EURUSD,M1)  
OE      0       18:27:57.298    TestScript (EURUSD,M1)   HLNode 2
CO      0       18:27:57.298    TestScript (EURUSD,M1)  i 1  w 2 = input 2.00000 x weight 0.61823
FI      0       18:27:57.298    TestScript (EURUSD,M1)  i 1  w 3 = input 5.00000 x weight 0.66553
PN      0       18:27:57.298    TestScript (EURUSD,M1)  dot_Product 4.56409 + bias -0.590 = 3.97388
GM      0       18:27:57.298    TestScript (EURUSD,M1)  Activation function Output =0.98155
DI      0       18:27:57.298    TestScript (EURUSD,M1)  << Hidden Layer 2 >>
GL      0       18:27:57.298    TestScript (EURUSD,M1)  
NF      0       18:27:57.298    TestScript (EURUSD,M1)   HLNode 1
FH      0       18:27:57.298    TestScript (EURUSD,M1)  i 0  w 0 = input 0.23770 x weight -0.32764
ID      0       18:27:57.298    TestScript (EURUSD,M1)  i 0  w 1 = input 0.98155 x weight 0.88464
QO      0       18:27:57.298    TestScript (EURUSD,M1)  dot_Product 0.79044 + bias 0.738 = 1.52884
RK      0       18:27:57.298    TestScript (EURUSD,M1)  Activation function Output =0.82184
QG      0       18:27:57.298    TestScript (EURUSD,M1)  
IH      0       18:27:57.298    TestScript (EURUSD,M1)   HLNode 2
DQ      0       18:27:57.298    TestScript (EURUSD,M1)  i 1  w 2 = input 0.23770 x weight 0.51367
CJ      0       18:27:57.298    TestScript (EURUSD,M1)  i 1  w 3 = input 0.98155 x weight 0.93713
QJ      0       18:27:57.298    TestScript (EURUSD,M1)  dot_Product 1.04194 + bias 0.738 = 1.78034
JP      0       18:27:57.298    TestScript (EURUSD,M1)  Activation function Output =0.85574
EI      0       18:27:57.298    TestScript (EURUSD,M1)  
GS      0       18:27:57.298    TestScript (EURUSD,M1)  Final MLP output(s)
OF      0       18:27:57.298    TestScript (EURUSD,M1)  0.82184 0.85574
CN      0       18:27:57.298    TestScript (EURUSD,M1)  Dataset Iteration 1
KH      0       18:27:57.298    TestScript (EURUSD,M1)  << Hidden Layer 1 >>
EM      0       18:27:57.298    TestScript (EURUSD,M1)  
DQ      0       18:27:57.298    TestScript (EURUSD,M1)   HLNode 1
QH      0       18:27:57.298    TestScript (EURUSD,M1)  i 0  w 0 = input 4.00000 x weight 0.70837
PD      0       18:27:57.298    TestScript (EURUSD,M1)  i 0  w 1 = input 10.00000 x weight -0.39838
HR      0       18:27:57.298    TestScript (EURUSD,M1)  dot_Product -1.15027 + bias -0.590 = -1.74048
DJ      0       18:27:57.298    TestScript (EURUSD,M1)  Activation function Output =0.14925
OP      0       18:27:57.298    TestScript (EURUSD,M1)  
CK      0       18:27:57.298    TestScript (EURUSD,M1)   HLNode 2
MN      0       18:27:57.298    TestScript (EURUSD,M1)  i 1  w 2 = input 4.00000 x weight 0.61823
NH      0       18:27:57.298    TestScript (EURUSD,M1)  i 1  w 3 = input 10.00000 x weight 0.66553
HI      0       18:27:57.298    TestScript (EURUSD,M1)  dot_Product 9.12817 + bias -0.590 = 8.53796
FO      0       18:27:57.298    TestScript (EURUSD,M1)  Activation function Output =0.99980
RG      0       18:27:57.298    TestScript (EURUSD,M1)  << Hidden Layer 2 >>
IR      0       18:27:57.298    TestScript (EURUSD,M1)  
PD      0       18:27:57.298    TestScript (EURUSD,M1)   HLNode 1
RN      0       18:27:57.298    TestScript (EURUSD,M1)  i 0  w 0 = input 0.14925 x weight -0.32764
HF      0       18:27:57.298    TestScript (EURUSD,M1)  i 0  w 1 = input 0.99980 x weight 0.88464
EM      0       18:27:57.298    TestScript (EURUSD,M1)  dot_Product 0.83557 + bias 0.738 = 1.57397
EL      0       18:27:57.298    TestScript (EURUSD,M1)  Activation function Output =0.82835
KE      0       18:27:57.298    TestScript (EURUSD,M1)  
GN      0       18:27:57.298    TestScript (EURUSD,M1)   HLNode 2
LS      0       18:27:57.298    TestScript (EURUSD,M1)  i 1  w 2 = input 0.14925 x weight 0.51367
FL      0       18:27:57.298    TestScript (EURUSD,M1)  i 1  w 3 = input 0.99980 x weight 0.93713
KH      0       18:27:57.298    TestScript (EURUSD,M1)  dot_Product 1.01362 + bias 0.738 = 1.75202
IR      0       18:27:57.298    TestScript (EURUSD,M1)  Activation function Output =0.85221
OH      0       18:27:57.298    TestScript (EURUSD,M1)  
IM      0       18:27:57.298    TestScript (EURUSD,M1)  Final MLP output(s)
MH      0       18:27:57.298    TestScript (EURUSD,M1)  0.82835 0.85221

Şimdi tüm yinelemeler için nihai MLP çıktılarına dikkat edin. Çıktıların düzgün bir şekilde aynı değerlere sahip olma eğiliminde olduğu garip bir davranış fark edeceksiniz. Bu sorunun birkaç nedeni vardır. Bu Stack başlığına bakılırsa, bunlardan biri çıktı katmanında yanlış aktivasyon fonksiyonunun kullanılmasıdır. İşte bu noktada SoftMax aktivasyon fonksiyonu imdada yetişiyor.

Anladığım kadarıyla, sigmoid fonksiyonu yalnızca çıktı katmanında tek bir sınıfı sınıflandırması gereken tek bir düğüm olduğunda olasılıkları geri döndürüyor. Bu durumda, bir şeyin belirli bir sınıfa ait olup olmadığını söylemek için sigmoid fonksiyonunun çıktısına ihtiyacımız olacaktır. Ama bu başka bir hikaye. Son düğümlerin çıktılarını toplarsak, değer çoğu zaman 1 değerini aşar. Yani, bunların olasılık olmadığı açıktır, çünkü olasılık 1 değerini aşamaz.

SoftMax fonksiyonunu son katmana uygularsak çıktılar aşağıdaki gibi olur:

Birinci yineleme çıktıları: [0.4915 0.5085]. İkinci yineleme çıktıları: [0.4940 0.5060].

Bu durumda çıktılar [Sınıf 0'a ait olma olasılığı Sınıf 1'e ait olma olasılığı] olarak yorumlanabilir.

En azından şimdi ağımızdan anlamlı bir şey yorumlarken güvenebileceğimiz olasılıklarımız var.

Son düşünceler

İleri beslemeli sinir ağı ile çalışmayı henüz bitirmedik, ancak en azından şimdilik teoriyi ve MQL5'te sinir ağlarında ustalaşmanıza yardımcı olacak en önemli şeyleri anladınız. Tasarlanan ileri beslemeli sinir ağı sınıflandırma amaçlıdır, bu nedenle uygun aktivasyon fonksiyonları veri kümenizde sınıflandırmak istediğiniz örneklemlere ve sınıflara bağlı olarak sigmoid ve TanH'dir. Tıpkı gizli katmanlardaki düğümler gibi, üzerinde oynanacak bir şey geri döndürmek için çıktı katmanını değiştiremeyiz. Matris kullanımı, tüm bu işlemleri dinamik hale getirmeye yardımcı olacaktır, böylece herhangi bir görev için standart bir sinir ağı oluşturabileceğiz. Bu makale serisinin amacı budur, bu nedenle daha fazlası için takip etmeye devam edin.

Bir sinir ağını ne zaman kullanacağınızı bilmek de önemlidir çünkü tüm görevlerin sinir ağları ile çözülmesi gerekmez. Eğer bir görev lineer regresyon ile çözülebiliyorsa, lineer bir model sinir ağından daha iyi performans gösterebilir. Bu da akılda tutulması gereken noktalardan biridir.


GitHub deposu: https://github.com/MegaJoctan/NeuralNetworks-MQL5

Daha Fazla Kaynak | Kitaplar | Referanslar

Makale referansları:


MetaQuotes Ltd tarafından İngilizceden çevrilmiştir.
Orijinal makale: https://www.mql5.com/en/articles/11275

Ekli dosyalar |
NeuralNets.zip (13.56 KB)
MQL5 - Siz de bu dilin ustası olabilirsiniz MQL5 - Siz de bu dilin ustası olabilirsiniz
Bu makale, MQL5 dilinde ilk adımlarımı nasıl attığımı anlatacağım bir tür kendimle röportaj niteliğinde olacaktır. Size nasıl harika bir MQL5 programcısı olabileceğinizi göstereceğim. Bu başarıya ulaşmanız için gerekli temelleri açıklayacağım. Tek ön koşul öğrenmeye istekli olmaktır.
Alan Andrews ve zaman serisi analizi yöntemleri Alan Andrews ve zaman serisi analizi yöntemleri
Alan Andrews, alım-satım alanında modern dünyanın en ünlü "eğitimcilerinden" biridir. Onun "yabası" neredeyse tüm modern fiyat analiz programlarında yer almaktadır. Ancak çoğu yatırımcı bu aracın sağladığı fırsatların bir kısmını bile kullanmaz. Ayrıca, Andrews'un orijinal eğitim kursu sadece yabanın değil (ana araç olarak kalmasına rağmen), diğer bazı faydalı yapıların da tanımını içermektedir. Bu makale, Andrews'un orijinal kursunda öğrettiği muhteşem grafik analiz yöntemlerine dair bir fikir sunmaktadır. Bu yöntemler çok sayıda görsel kullanılarak incelenecektir.
Model aramada brute force yaklaşımı (Bölüm V): Farklı bir bakış açısı Model aramada brute force yaklaşımı (Bölüm V): Farklı bir bakış açısı
Bu makalede, algoritmik alım-satıma oldukça uzun bir süre sonra ulaştığım tamamen farklı bir yaklaşım göstereceğim. Elbette tüm bunlar, aynı anda birkaç problemi çözmesine olanak tanıyan bir dizi değişikliğe uğrayan brute force programımla ilgili. Bununla birlikte, makaleyi daha genel ve olabildiğince basit bir şekilde yazdım, böylece brute force hakkında hiçbir şey bilmeyenler için de uygun hale geldi.
Popülasyon optimizasyon algoritmaları: Maymun algoritması (Monkey Algorithm, MA) Popülasyon optimizasyon algoritmaları: Maymun algoritması (Monkey Algorithm, MA)
Bu makalede, maymun algoritması (MA) optimizasyon algoritmasını ele alacağız. Bu hayvanların zorlu engelleri aşma ve en ulaşılmaz ağaç tepelerine ulaşma yeteneği, MA algoritması fikrinin temelini oluşturmuştur.