Makine Öğrenimi

Bu metotlar makine öğreniminde kullanılır.

Sinir ağı aktivasyon fonksiyonu, girdilerin ağırlıklı toplamına bağlı olarak nöronun çıktı değerini belirler. Aktivasyon fonksiyonunun seçimi, sinir ağının performansı üzerinde büyük bir etkiye sahiptir. Modelin farklı bölümleri (katmanlar) farklı aktivasyon fonksiyonlarını kullanabilir.

Bilinen tüm aktivasyon fonksiyonlarına ek olarak, MQL5 onların türevlerini de sunar. Fonksiyon türevleri, öğrenme sırasında alınan hataya dayalı olarak model parametrelerinin verimli bir şekilde güncellenmesine olanak sağlar.

Bir sinir ağı, öğrenmedeki hatayı en aza indiren bir algoritma bulmayı amaçlar; işte burada kayıp fonksiyonu kullanılır. Kayıp fonksiyonunun değeri, model tarafından öngörülen değerin gerçek değerden ne kadar saptığını gösterir. Probleme bağlı olarak farklı kayıp fonksiyonları kullanılır. Örneğin, regresyon problemleri için "hataların karelerinin ortalaması (Mean Squared Error, MSE)" ve ikili sınıflandırma için "ikili çapraz entropi (Binary Cross Entropy, BCE)" kullanılır.

Fonksiyon

Eylem

Activation

Aktivasyon fonksiyonu değerlerini hesaplar ve onları aktarılan vektöre/matrise yazar

Derivative

Aktivasyon fonksiyonu türevinin değerlerini hesaplar ve onları aktarılan vektöre/matrise yazar

Loss

Kayıp fonksiyonu değerlerini hesaplar ve onları aktarılan vektöre/matrise yazar

LossGradient

Kayıp fonksiyonu gradyanlarının vektörünü veya matrisini hesaplar

RegressionMetric

Öngörülen verilerin kalitesinin doğru verilere kıyasla değerlendirilmesine olanak sağlayan regresyon metriğini hesaplar

ConfusionMatrix

Karışıklık matrisini hesaplar. Metot, öngörülen değerler vektörüne uygulanır

ConfusionMatrixMultilabel

Her etiket için karışıklık matrisini hesaplar. Metot, öngörülen değerler vektörüne uygulanır

ClassificationMetric

Öngörülen verilerin kalitesinin doğru verilere kıyasla değerlendirilmesine olanak sağlayan sınıflandırma metriğini hesaplar. Metot, tahmin edilen değerler vektörüne uygulanır

ClassificationScore

Öngörülen verilerin kalitesinin doğru verilere kıyasla değerlendirilmesine olanak sağlayan sınıflandırma metriğini hesaplar

PrecisionRecall

Bir kesinlik-duyarlılık eğrisi oluşturmak için değerleri hesaplar. ClassificationScore'a benzer şekilde, bu metot da doğru değerler vektörüne uygulanır

ReceiverOperatingCharacteristic

Receiver Operating Characteristic (ROC) eğrisini oluşturmak için değerleri hesaplar. ClassificationScore'a benzer şekilde, bu metot da doğru değerler vektörüne uygulanır.

Örnek:

Bu örnek, matris işlemlerini kullanarak bir modelin eğitimini göstermektedir. Model, (a + b + c)^2 / (a^2 + b^2 + c^2) fonksiyonu için eğitilmektedir. a, b ve c'nin farklı sütunlarda yer aldığı başlangıç veri matrisini girdi olarak giriyoruz. Modelin çıktısı, fonksiyonun sonucunu geri döndürecektir.

matrix weights1weights2weights3;               // ağırlıkların matrisleri
matrix output1output2result;                   // sinir katmanı çıktılarının matrisleri
input int layer1 = 200;                            // ilk gizli katmanın büyüklüğü
input int layer2 = 200;                            // ikinci gizli katmanın büyüklüğü
input int Epochs = 20000;                          // eğitim dönemlerinin sayısı
input double lr = 3e-6;                            // öğrenme hızı
input ENUM_ACTIVATION_FUNCTION ac_func = AF_SWISH// aktivasyon fonksiyonu
//+------------------------------------------------------------------+
//| Komut dosyası başlatma fonksiyonu                                |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   int train = 1000;    // eğitim örneklemi büyüklüğü
   int test = 10;       // test örneklemi büyüklüğü
   matrix m_datam_target;
//--- eğitim örneklemi oluştur
   if(!CreateData(m_datam_targettrain))  
      return;
//--- modeli eğit
   if(!Train(m_datam_targetEpochs))      
      return;
//--- test örneklemi oluştur
   if(!CreateData(m_datam_targettest))   
      return;
//--- modeli test et
   Test(m_datam_target);                   
  }
//+------------------------------------------------------------------+
//| Örneklem oluşturma metodu                                        |
//+------------------------------------------------------------------+
bool CreateData(matrix &datamatrix &targetconst int count)
  {
//--- başlangıç veri ve sonuç matrislerini başlat
   if(!data.Init(count3) || !target.Init(count1))
      return false;
//--- başlangıç veri matrisini rastgele değerlerle doldur
   data.Random(-1010);                     
//--- eğitim örneklemi için hedef değerleri hesapla
   vector X1 = MathPow(data.Col(0) + data.Col(1) + data.Col(1), 2);
   vector X2 = MathPow(data.Col(0), 2) + MathPow(data.Col(1), 2) + MathPow(data.Col(2), 2);
   if(!target.Col(X1 / X20))
      return false;
//--- sonucu geri döndür
   return true;
  }
//+------------------------------------------------------------------+
//| Model eğitimi metodu                                             |
//+------------------------------------------------------------------+
bool Train(matrix &datamatrix &targetconst int epochs = 10000)
  {
//--- modeli oluştur
   if(!CreateNet())
      return false;
//--- modeli eğit
   for(int ep = 0ep < epochsep++)
     {
      //--- ileri besleme geçişi
      if(!FeedForward(data))
         return false;
      PrintFormat("Epoch %d, loss %.5f"epresult.Loss(targetLOSS_MSE));
      //--- geri yayılım ve ağırlık matrisinin güncellenmesi
      if(!Backprop(datatarget))
         return false;
     }
//--- sonucu geri döndür
   return true;
  }
//+------------------------------------------------------------------+
//| Model oluşturma metodu                                           |
//+------------------------------------------------------------------+
bool CreateNet()
  {
//--- ağırlık matrislerini başlat
   if(!weights1.Init(4layer1) || !weights2.Init(layer1 + 1layer2) || !weights3.Init(layer2 + 11))
      return false;
//--- ağırlık matrislerini rastgele değerlerle doldur
   weights1.Random(-0.10.1);
   weights2.Random(-0.10.1);
   weights3.Random(-0.10.1);
//--- sonucu geri döndür
   return true;
  }
//+------------------------------------------------------------------+
//| İleri besleme metodu                                             |
//+------------------------------------------------------------------+
bool FeedForward(matrix &data)
  {
//--- başlangıç veri büyüklüğünü kontrol et
   if(data.Cols() != weights1.Rows() - 1)
      return false;
//--- ilk sinir katmanını hesapla
   matrix temp = data;
   if(!temp.Resize(temp.Rows(), weights1.Rows()) ||
      !temp.Col(vector::Ones(temp.Rows()), weights1.Rows() - 1))
      return false;
   output1 = temp.MatMul(weights1);
//--- aktivasyon fonksiyonunu hesapla
   if(!output1.Activation(tempac_func))
      return false;
//--- ikinci sinir katmanını hesapla
   if(!temp.Resize(temp.Rows(), weights2.Rows()) ||
      !temp.Col(vector::Ones(temp.Rows()), weights2.Rows() - 1))
      return false;
   output2 = temp.MatMul(weights2);
//--- aktivasyon fonksiyonunu hesapla
   if(!output2.Activation(tempac_func))
      return false;
//--- üçüncü sinir katmanını hesapla
   if(!temp.Resize(temp.Rows(), weights3.Rows()) ||
      !temp.Col(vector::Ones(temp.Rows()), weights3.Rows() - 1))
      return false;
   result = temp.MatMul(weights3);
//--- sonucu geri döndür
   return true;
  }
//+------------------------------------------------------------------+
//| Geri yayılım metodu                                              |
//+------------------------------------------------------------------+
bool Backprop(matrix &datamatrix &target)
  {
//--- hedef değerler matrisinin büyüklüğünü kontrol et
   if(target.Rows() != result.Rows() ||
      target.Cols() != result.Cols())
      return false;
//--- hesaplanan değerlerin hedeften sapmasını belirle
   matrix loss = (target - result) * 2;
//--- gradyanı önceki katmana yay
   matrix gradient = loss.MatMul(weights3.Transpose());
//--- son katmanın ağırlık matrisini güncelle
   matrix temp;
   if(!output2.Activation(tempac_func))
      return false;
   if(!temp.Resize(temp.Rows(), weights3.Rows()) ||
      !temp.Col(vector::Ones(temp.Rows()), weights3.Rows() - 1))
      return false;
   weights3 = weights3 + temp.Transpose().MatMul(loss) * lr;
//--- aktivasyon fonksiyonunun türeviyle hata gradyanını ayarla
   if(!output2.Derivative(tempac_func))
      return false;
   if(!gradient.Resize(gradient.Rows(), gradient.Cols() - 1))
      return false;
   loss = gradient * temp;
//--- gradyanı bir alt katmana yay
   gradient = loss.MatMul(weights2.Transpose());
//--- ikinci gizli katmanın ağırlık matrisini güncelle
   if(!output1.Activation(tempac_func))
      return false;
   if(!temp.Resize(temp.Rows(), weights2.Rows()) ||
      !temp.Col(vector::Ones(temp.Rows()), weights2.Rows() - 1))
      return false;
   weights2 = weights2 + temp.Transpose().MatMul(loss) * lr;
//--- aktivasyon fonksiyonunun türeviyle hata gradyanını ayarla
   if(!output1.Derivative(tempac_func))
      return false;
   if(!gradient.Resize(gradient.Rows(), gradient.Cols() - 1))
      return false;
   loss = gradient * temp;
//--- ilk gizli katmanın ağırlık matrisini güncelle
   temp = data;
   if(!temp.Resize(temp.Rows(), weights1.Rows()) ||
      !temp.Col(vector::Ones(temp.Rows()), weights1.Rows() - 1))
      return false;
   weights1 = weights1 + temp.Transpose().MatMul(loss) * lr;
//--- sonucu geri döndür
   return true;
  }
//+------------------------------------------------------------------+
//| Model test etme metodu                                           |
//+------------------------------------------------------------------+
bool Test(matrix &datamatrix &target)
  {
//--- test verileri üzerinde ileri besleme
   if(!FeedForward(data))
      return false;
//--- model hesaplama sonuçlarını ve doğru değerleri yazdır
   PrintFormat("Test loss %.5f"result.Loss(targetLOSS_MSE));
   ulong total = data.Rows();
   for(ulong i = 0i < totali++)
      PrintFormat("(%.2f + %.2f + %.2f)^2 / (%.2f^2 + %.2f^2 + %.2f^2) =  Net %.2f, Target %.2f"data[i0], data[i1], data[i2],
                  data[i0], data[i1], data[i2], result[i0], target[i0]);
//--- sonucu geri döndür
   return true;
  }
//+------------------------------------------------------------------+