English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Italiano
Üçüncü Nesil Nöral Ağlar: Derin Ağlar

Üçüncü Nesil Nöral Ağlar: Derin Ağlar

MetaTrader 5Göstergeler | 14 Ocak 2022, 13:04
164 0
Vladimir Perervenko
Vladimir Perervenko

İçindekiler

  1. İkinci Nesil Nöral Ağlar
  2. Derin Öğrenme
  3. Pratik Deneyler
  4. Uygulama (Gösterge ve Expert Advisor)

Giriş

Bu makale, Derin Öğrenme ve Derin Ağ gibi konunun ana fikirlerini mesleki olmayan terimlerle karmaşık hesaplamalar olmadan ele alacaktır.

Gerçek verilerle yapılan deneyler, metrik tanımlama ve karşılaştırma yoluyla derin nöral ağların sığ olanlara göre teorik avantajlarını doğrular (veya doğrulamaz). Görev hazırlanmakta olan sınıflandırmadır. Derin nöral ağ modeline dayalı ve istemci/sunucu şemasına göre birlikte çalışan bir gösterge ve Expert Advisor oluşturacağız, ardından bunları test edeceğiz.

Okuyucunun, nöral ağlarda kullanılan temel kavramlar hakkında doğru bir fikre sahip olduğu varsayılmaktadır.


1. İkinci Nesil Nöral Ağlar

Nöral ağlar, görüntü işleme ile bağlantılı geniş yelpazede soruna hitaben tasarlanmıştır.

Tipik olarak nöral ağlar tarafından çözülen sorunların listesi aşağıda bulunmaktadır:

  • İşlevlerin bir küme nokta ile yaklaştırılması (regresyon);
  • Belirtilen sınıf kümesine göre veri sınıflandırması;
  • Önceden bilinmeyen prototip sınıflarının tanımlanmasıyla veri kümeleme;
  • Sıkıştırma bilgilendirmesi;
  • Kayıp verileri geri yükleme;
  • İlişkili bellek;
  • Optimizasyon, optimum kontrol vb.

Yukarıdaki listenin dışında, bu makalede sadece "Sınıflandırma" tartışılacaktır.


1.1. Bağlantıların Mimarisi

Bilgi işleme yöntemi, ağdaki geri bildirim döngülerinin yokluğundan veya varlığından büyük ölçüde etkilenir. Nöronlar arasında geri bildirim döngüleri yoksa (yani ağ, her nöronun yalnızca bir önceki katmandan bilgi aldığı sıralı katmanlardan oluşan bir yapıya sahipse), ağdaki bilgi işleme tek yönlüdür. Girdi sinyali, bir dizi katman tarafından işlenir ve katman sayısına eşit sayıda yanıt alınır.

Geri bildirim döngülerinin varlığı, nöral ağın dinamiğini (bu durumda yinelenen olarak adlandırılır) öngörülemez hale getirebilir. Aslında, bir ağ "sonsuza kadar döngü yapabilir" ve asla bir yanıt üretemez. Aynı zamanda Turing'e göre, rastgele yinelenen bir ağ için, öğelerinin denge durumuna gelip gelmeyeceğini belirleyen bir algoritma yoktur (sonlanma problemi).

Genel olarak konuşursak, tekrarlayan ağlardaki nöronların bilgi işlemeye birçok kez katılması, bu tür ağların bilgiyi farklı şekillerde daha derin bir seviyede işlemesine olanak tanır. Bu durumda, ağın sonsuza kadar döngüye girmemesi için özel önlemler alınmalıdır. Örneğin, Hopfield ağında olduğu gibi simetrik bağlantılar kullanın veya zorla yineleme sayısını sınırlayın.


Eğitim türü

Bağlantı türü
Bir "denetimci" ile"Denetimci" olmadan
Geri bildirim döngüleri olmadanÇok katmanlı algılayıcılar (işlev yaklaşımı, sınıflandırma)

Rekabetçi ağ, kendi kendini organize eden haritalar (veri sıkıştırma, özellik ayrıştırma)
Geri bildirim döngüleri ileTekrarlayan algılayıcı (zaman serisi öngörüsü, çevrimiçi eğitim)

Hopfield ağı (İlişkili bellek, veri kümeleme, optimizasyon)

Tablo 1. Bağlantı türüne ve eğitim türüne göre nöral ağ sınıflandırması


1.2. Nöral Ağların Ana Türleri

Algılayıcı ile başlayan nöral ağlar, gelişimlerinde uzun bir yol kat etti. Günümüzde yapı ve eğitim yöntemleri bakımından farklılık gösteren çok sayıda nöral ağ kullanılmaktadır.

En yaygın olanları:

1.2.1. Çok Katmanlı Tam Bağlantılı İleri Bildirimli Ağlar MLP (Çok Katmanlı Algılayıcı)

Şek. 1 Çok katmanlı bir nöral ağın yapısı

Şek. 1. Çok katmanlı bir nöral ağın yapısı

1.2.2. Jordan Ağları kısmen tekrarlayan ağlardır ve Elman ağlarına benzer.

Girdi katmanında ek bağlam nöronları ile ileri bildirimli bir ağ olarak ele alınabilir.

Bu bağlam nöronları kendileri tarafından (doğrudan geri bildirim) ve girdi nöronlarından beslenir. Bağlam nöronları ağın mevcut durumunu korur. Bir Jordan ağında bağlam ve girdi nöronlarının sayısı aynı olmalıdır.

Şek. 2 Jordan ağının yapısı

Şek. 2. Jordan ağının yapısı

1.2.3. Elman Ağları kısmen tekrarlayan ağlardır ve Jordan ağlarına benzer. Elman ve Jordan ağları arasındaki fark, Elman ağı bağlamı nöronlarının çıktı nöronları tarafından değil, gizli olanlarla beslenmesidir. Öte yandan, bağlam nöronlarında doğrudan geri bildirim yoktur.

Elman ağında, bağlam ve gizli nöronların sayısı aynı olmalıdır. Elman ağlarının temel avantajı, bağlam nöronlarının sayısının Jordan ağındaki gibi çıktı sayısıyla değil, ağı daha esnek hale getiren gizli nöron sayısıyla tanımlanmasıdır. Gizli nöronlar, çıktı sayısının aksine kolayca eklenebilir veya çıkarılabilir.


Şek. 3 Elman ağının yapısı

Şek. 3. Elman ağının yapısı

1.2.4. Radyal Temel İşlev Ağı (RBF) - radyal olarak simetrik nöronlardan oluşan bir ara (gizli) katman içeren ileri bildirimli bir nöral ağdır. Böyle bir nöron, genellikle Gauss olarak kabul edilen bazı doğrusal olmayan yasalarla belirli bir girdi vektöründen karşılık gelen merkezine olan mesafeyi dönüştürür.

RBF ağlarının çok katmanlı ileri bildirimli ağlara göre birçok avantajı vardır. Her şeyden önce, yalnızca bir ara katmanla rastgele doğrusal olmayan bir işlevi öykünürler (kelimeden emin değiller), bu da geliştiriciyi katman sayısına karar verme gereğinden kurtarır. Daha sonra, çıktı katmanındaki doğrusal kombinasyon içindeki parametreler, yaygın olarak bilinen doğrusal optimizasyon yöntemlerinin yardımıyla optimize edilebilir. İkincisi hızlı çalışır ve geri yayılıma büyük ölçüde müdahale eden yerel minimumlar konusunda zorluk çekmez. RBF ağının geri yayılımı kullanırken olduğundan çok daha hızlı öğrenmesinin nedeni budur.

RBF'nin Dezavantajları: Bu ağlar zayıf ekstrapolasyon özelliklerine sahiptir ve girdi vektörü büyük olduğunda külfetli hale gelir.

Şek. 4 RBF'nin yapısı

Şek. 4. RBF'nin Yapısı

1.2.5. Dinamik Öğrenme Vektörü Niceleme, DLVQ Ağları kendi kendini organize eden haritalara (SOM) çok benzer. SOM'dan farklı olarak, DLVO denetimli öğrenme kapasitesine sahiptir ve prototipler arasında komşuluk ilişkisi yoktur. Vektör niceleme, kümelemeden daha geniş bir kullanıma sahiptir.

1.2.6. Hopfield Ağı, simetrik bir bağlantı matrisine sahip tam bağlantılı bir ağdır. Operasyon sırasında, bu tür ağların dinamikleri denge durumlarından birine yakınsar. Bu denge durumları, ağın enerjisi olarak bilinen işlevselliğin yerel minimumlarıdır. Bu şekilde bir ağ, bir filtre olarak ve bazı optimizasyon zorluklarını ele almak için içerik adresli bir ilişkili bellek sistemi olarak kullanılabilir.

Belirli sayıda taktikle yanıt alana kadar çalışan birçok nöral ağın aksine Hopfield ağları, bir ağın sonraki durumunun bir öncekiyle tamamen aynı olduğu denge durumuna ulaşana kadar çalışır. Bu durumda, başlangıç durumu bir girdi formasyonudur ve denge durumunda çıktı resmi alınır. Bir Hopfield ağının eğitimi, girdi ve çıktı katmanlarında aynı anda sunulacak bir eğitim formasyonu gerektirir.

Şek. 5. Üç nöronlu bir Hopfield ağının yapısı

Şek. 5. Üç nöronlu bir Hopfield ağının yapısı

Çekici özelliklerine rağmen, klasik bir Hopfield ağı ideal olmaktan çok uzaktır. N ağındaki nöron sayısının yaklaşık %15'i kadar sınırlı bir belleğe sahiptir, oysa adresli bellek sistemleri N bit kullanarak 2N'ye kadar farklı resmi depolayabilir.

Öte yandan, Hopfield ağları resmin ilk saklama pozisyonuna göre kaydırıldığını veya döndürüldüğünü tanıma kapasitesine sahip değildir. Bu ve diğer dezavantajlar, bir Hopfield ağının günlük kullanım için pratik bir araçtan ziyade çalışmaya uygun teorik bir model olarak algılanmasını tanımlar.

Diğerlerinin çoğu (Hemming tekrarlayan ağı, Grossberg ağı, uyarlamalı rezonans teorisi ağları (ART-1, ART-2) vb.) ilgi alanımızın dışında olduğu için bu makalede bahsedilmemiştir.


1.3. Eğitim Yöntemleri

Yeni şeyler öğrenme kabiliyeti, insan beyninin temel özelliğidir. Yapay nöral ağların durumunda öğrenim, hazırlanmakta olan görevde etkili bir çözüm elde etmek için ağ mimarisini (nöronlar arasındaki bağlantıların yapısı) ve sinaptik bağlantıların ağırlıklarını (katsayı sinyallerini etkileyen) yapılandırma sürecidir. Genellikle bir nöral ağın eğitimi veri örneğinde gerçekleştirilir. Eğitim süreci belirli bir algoritmayı takip eder ve bu süreç devam ettikçe ağın tepkisi girdi sinyallerine doğru iyileşmelidir.

Üç ana öğrenme paradigması vardır: denetimli, denetimsiz ve birleşik. İlk durumda, her girdi örneği için doğru cevaplar bilinir ve ağırlıklar hatayı en aza indirmeye çalışır. Denetimsiz öğrenme, verilerin iç yapısını ve doğasını açıklayarak örnekleri kategorilere ayırmaya olanak tanır. Birleşik eğitimde yukarıdaki yaklaşımların her ikisi de kullanılır.

1.3.1. Nöral Ağ Öğrenmenin Temel Kuralları

Bunlarla bağlantılı ağ mimarisine dayalı dört ana öğrenme kuralı vardır: hata düzeltme, Boltzmann yasası, Hebb kuralı ve rekabetçi öğrenme.

1.3.1.1. Hata Düzeltme

Her girdi örneğinin istenen ve gerçek (tahmini) değerle uyuşmayabilen belirli bir çıktı değeri (hedef değer) vardır. Hata düzeltim öğrenme kuralı, hata azaltırken ağırlıkların doğrudan ayarlanması için hedef ve tahmin değerleri arasındaki farkı kullanmaktır. Eğitim sadece hatalı bir sonuç durumunda gerçekleştirilir. Bu öğrenme kuralının çok sayıda modifikasyonu vardır.

1.3.1.2. Boltzmann Kuralı

Boltzmann kuralı, termodinamik ilkelerine benzer şekilde stokastik bir öğrenme kuralıdır. Bu, nöronların ağırlık katsayılarının istenen olasılık dağılımına göre ayarlanmasıyla sonuçlanır. Boltzmann kuralını öğrenme, bir hatanın iki mod durumlarındaki korelasyon tutarsızlığını üreten bir hata ile izole edilmiş bir düzeltme durumu olarak düşünülebilir.

1.3.1.3. Hebb Kuralı

Hebb kuralı, nöral ağ öğreniminin en ünlü algoritmasıdır. Bu yöntemin amacı, bir sinapsın her iki tarafındaki nöronların aynı anda ve düzenli olarak aktive olması durumunda sinaptik bağlantının gücünün artmasıdır. Buradaki önemli bir özellik, sinaptik ağırlık değişiminin sadece bu sinaps ile bağlantılı nöronların aktivitesine bağlı olmasıdır. Bu kuralın, sinaptik ağırlık modifikasyonundaki özellikleri içinde farklılık gösteren birçok varyasyonu vardır.

1.3.1.4. Rekabetçi Öğrenme

Burada, bir dizi çıktı nöronunun aynı anda etkinleşebildiği Hebb öğrenme kuralından farklı olarak çıktı nöronları birbirleriyle rekabet eder. Ağırlıklı toplamın maksimum değerine sahip bir çıktı nöronu "kazanan" ve "kazanan hepsini alır" olmaktadır. Diğer çıktı nöronlarının çıktıları inaktif olarak ayarlanır. Öğrenmede, yalnızca "kazanan" ağırlıklar geçerli girdi örneğine yakınlığı artıracak şekilde hedeflenir.

Farklı problemleri ele alan birçok öğrenme algoritması vardır. En verimli modern algoritmalardan biri olan geri yayılım bunlardan biridir. Arkasındaki ilke, sinaptik ağırlık değişiminin hata işlevinin yerel gradyanı dikkate alınarak gerçekleşmesidir.

Çıktı katmanında değerlendirilen bir nöral ağın gerçek ve doğru yanıtları arasındaki fark, sinyal akışına doğru geri yayılır (Şek. 5). Bu şekilde her nöron, ağırlığının ağın kümülatif hatasına olan katkısını tanımlayabilir. En basit öğrenme kuralı, kümülatif hataya katkılarıyla orantılı olarak sinaptik ağırlık değişimi olan en dik iniş yöntemidir.

Şek. 6. Ağ geri yayılım yoluyla öğrenirken veri ve hata yayılım formasyonu

Şek. 6. Ağ geri yayılım yoluyla öğrenirken veri ve hata yayılım formasyonu

Elbette bu tür bir nöral ağ öğrenimi, daima algoritmanın yerel minimuma girme olasılığı bulunduğu için en iyi öğrenme sonucunu sağlamaz. Bulunan çözümü yerel bir uç noktadan çıkarmaya olanak tanıyan özel teknikler vardır. Nöral ağ bu tekniğin birkaç uygulamasından sonra aynı kararı verirse, büyük olasılıkla bulunan çözümün optimal olduğu sonucuna varılabilir.

1.4. Dezavantajlar

  • Nöral ağları kullanmanın ana zorluğu "boyutsallık laneti" olarak adlandırılır. Girdi boyutları ve katman sayısı artırıldığında, ağın karmaşıklığı ve öğrenme süresi de katlanarak artar ve alınan sonuç her zaman optimal değildir.
  • Nöral ağları kullanmanın bir başka zorluğu da, geleneksel nöral ağların görevleri nasıl çözdükleri açıklayamamasıdır. Tıp gibi bazı uygulama alanlarında bu açıklama sonucun kendisinden daha önemlidir. Dahili sonuç temsili çoğu zaman o kadar karmaşıktır ki, genellikle ilgili olmayan en basit durumlar dışında analiz edilmesi imkansızdır.

2. Derin Öğrenme

Bugün makine öğrenimi teorisi ve pratiği, üçüncü nesil nöral ağları temsil eden derin öğrenme yöntemlerinin başarılı bir şekilde uygulanmasının neden olduğu "derin bir devrimden" geçmektedir. Yeni öğrenme paradigmaları, geçen yüzyılın 80'li ve 90'lı yıllarında kullanılan klasik ikinci nesil ağların aksine geleneksel nöral ağların genişlemesini ve başarılı bir şekilde uygulanmasını kısıtlayan bir dizi sorunu çözmektedir.

Derin öğrenme algoritmalarıyla eğitilen ağlar, doğruluk açısından en iyi alternatif yöntemleri basitçe mükemmelleştirmekle kalmamıştır, aynı zamanda bazı durumlardaki girdi bilgisinin mantığını anlamanın en temel kurallarını ortaya çıkarmıştır. Resim tanıma ve metin bilgisi analizi en parlak örnekleridir.

Günümüzde en gelişmiş endüstriyel bilgisayar görme ve konuşma tanıma yöntemleri derin ağlara dayanmaktadır. Apple, Google, Facebook gibi bilişim sektörünün devleri, derin nöral ağlar geliştiren araştırmacıları istihdam etmektedir.


2.1. Arkaplan

Toronto Üniversitesi'nde okuyan Profesör Geoffrey E. Hinton liderliğindeki lisansüstü öğrencilerden oluşan bir ekip, Merck'in sponsor olduğu bir yarışmada birincilik ödülünü kazandı. G. Hinton'un grubu, 15 molekülün kimyasal yapısını tanımlayan sınırlı bir veri seti kullanarak bu moleküllerden hangisinin en etkili ilaç olacağını tanımlayan özel bir program sistemi oluşturmayı ve uygulamayı başardı.

Bu çalışmanın özelliği, geliştiricilerin derin öğrenmeye dayalı yapay bir nöral ağ kullanmasıydı. Sonuç olarak, normalde sistem çok sınırlı bir dizi kaynak veriye dayalı olarak hesaplamaları ve araştırmayı yerine getirirken bir nöral ağı eğitmek sisteme önemli miktarda bilgi girmesini gerektirir.

Hinton'ın ekibinin başarısı özellikle etkileyiciydi, çünkü ekip yarışmaya son dakikada girmeye karar verdi. Buna ek olarak derin öğrenme sistemi, moleküllerin hedeflerine nasıl bağlandığına dair özel bir bilgi olmadan geliştirildi. Derin öğrenmenin başarılı bir şekilde uygulanması, yapay zeka geliştirmesinde hareketli bir 2012 yılında gerçekleşen diğer bir başarıydı.

2012 yazında Google'dan Jeff Dean ve Andrew Y. Ng, %15,8 doğruluk oranına sahip yeni bir resim tanıma sistemi sundu; burada 16.000 düğümden oluşan bir küme sistemini eğitmek için 20.000 farklı nesnenin 14 milyon resminden oluşan bir kitaplık içeren ImageNet ağını kullandılar. Geçen yıl İsviçreli bilim adamları tarafından oluşturulan bir program, trafik işaretlerinin resimlerini tanıma konusunda bir insanı geride bıraktı. Kazanan program 50.000'lik bir kümedeki resimlerin yüzde 99.46'sını doğru bir şekilde tanımladı; 32 kişiden oluşan gruptaki en yüksek oran yüzde 99.22 ve insanlar için ortalama yüzde 98.84 idi. Ekim 2012'de, Microsoft bilimsel programlarının koordinatörü Richard F. Rashid, Çin'in Tianjin kentindeki bir konferansta, kendi sesinin bir simülasyonu eşliğinde Mandarin'e İngilizceden eşzamanlı çeviri teknolojisini sundu.

Yapay zeka alanında çığır açan tüm bu teknolojiler, belirli bir ölçüde derin öğrenme yöntemine dayanmaktadır. Derin öğrenme teorisine ana katkı, çağdaş bilgisayarların altında yatan Boole cebirinin kurucusu İngiliz bilim adamı George Boole'un büyük-büyük torunu olan profesör Hinton tarafından yapılmıştır.

Derin öğrenme teorisi, çeşitli sunum seviyelerindeki girdi bilgisi analizi için özel algoritmalarla sıradan makine öğrenimi yöntemlerini tamamlar. Bu yeni yaklaşımın özelliği, derin öğrenmenin söz konusu nesnenin parametrelerini etkileyebilecek tüm faktörleri hesaba katacak yeterli bilgilendirici sunum seviyeleri hakkındaki unsuru bulana kadar incelemesidir.

Bu şekilde, böyle bir yaklaşıma dayalı bir nöral ağ, öğrenim için daha az girdi bilgisi gerektirir ve eğitilmiş bir ağ, bilgiyi normal nöral ağlardan daha yüksek bir doğruluk seviyesinde analiz edebilir. Profesör Hinton ve meslektaşları, teknolojilerinin özellikle çoklu boyutlu, iyi yapılandırılmış bilgi dizileri içindeki özellikleri aramak için iyi olduğunu belirtmektedirler.

Yapay zeka teknolojileri (AI), özellikle derin öğrenme, Nuance Communications teknolojilerine dayanan akıllı kişisel asistan Apple Siri ve Google Street View'daki adresleri tanıma dahil olmak üzere farklı sistemlerde yaygın olarak kullanılmaktadır. Yine de, yapay zeka yaratmanın tarihi iyimser vaatler ve hayal kırıklıklarıyla dolu olduğundan, bilim adamları bu alandaki başarıyı çok dikkatli şekilde tahmin hesaplamaktadırlar.

1960'larda bilim adamları, tam özellikli bir yapay zeka yaratmanın sadece 10 yıl alacağına inanıyorlardı. Daha sonra 1980'lerde, genç şirketlerden "hazır yapay zeka" öneri dalgaları, ardından da bu sahada yakın zamana kadar devam eden "buz devri" geldi. Günümüzde bulut hizmetlerinde bulunan geniş hesaplama imkanları, yeni teorik ve algoritmik temelleri kullanarak yeni ve güçlü bir nöral ağ uygulama seviyesi sağlar.

Unutulmamalıdır ki nöral ağların, hatta evrişimli nöral ağlar gibi üçüncü nesillerin, otomatik ilişkilendirme ağlarının, Boltzmann makinelerinin bile biyolojik nöronlarla isim dışında hiçbir ortak yanı yoktur.

Yeni öğrenme paradigması, öğrenme fikrini iki aşamada uygular. İlk aşamada, girdi verilerinin iç yapısı hakkında bilgi, katman katman denetimsiz eğitim yolu üzerinden otomatik ilişkilendirici ile biçimlendirilmemiş büyük bir veri dizisinden ayıklanır. Daha sonra çoklu katmanlı nöral ağ içindeki bilginin kullanımı, biçimlendirilmiş veriler kullanılarak bilinen yöntemlerle denetimli eğitimden geçer. Aynı zamanda, biçimlendirilmemiş veri miktarı mümkün olduğunca büyük olmalıdır. Biçimlendirilmiş veriler boyut olarak çok daha küçük olabilir. Bizim durumumuzda bu birincil bir öneme sahip değildir.


2.2. Otomatik kodlayıcılar. Otomatik Kodlayıcı ve Kısıtlı Boltzmann Makinesi. Farklılıklar ve Özellikler

2.2.1. Otomatik kodlayıcı

İlk oto ilişkilendirici (АА) bir Fukushima nöral ağıydı.

Yapısı Şekil 7'de sunulmuştur.

Şek. 7. Fukushima nöral ağı

Şek. 7. Fukushima nöral ağı

Bir otomotik ilişkilendiricinin (АА) amacı, çıktıdaki girdinin mümkün olduğu kadar kesin görüntüsünü almaktır.

İki tür АА vardır - üreten ve sentezleyen. Kısıtlı Boltzmann makinesi birinci türe aittir ve otomatik kodlayıcı ikinci türü temsil eder.

Bir otomatik kodlayıcı açık katmana sahip bir nöral ağdır. Denetimsiz öğrenme algoritması ve geri yayılım kullanarak girdi vektörüne eşit bir hedef değer belirler, yani y = x.

Otomatik kodlayıcıya bir örneğ Şekil 8'de sunulmuştur.

Şek. 8. Otomatik kodlayıcı yapısı

Şek. 8. Otomatik kodlayıcı yapısı

Otomatik kodlayıcı h(x)=x işlevini oluşturmaya çalışıyor. Başka bir deyişle, nöral ağ geri bildiriminin yaklaşık olarak girdi parametrelerinin değerlerine eşit olmasını sağlayan bir işlev yaklaşıklığı bulmaya çalışmaktadır. Problem çözümünün için açık katmandaki nöron sayısının girdi verisinin boyutundan (resimdeki gibi) az olması gerekir.

Girdi sinyali ağ çıkışına iletildiğinde verilerin sıkıştırılmasına izin verir. Örneğin, girdi vektörü 10x10 piksel boyutunda (100 karakteristik) bir resmin parlaklık seviyeleri kümesiyse, gizli katmanın nöron sayısı 50 ise, ağ görüntüyü sıkıştırmayı öğrenmek zorunda kalır. h(x)=x gerekliliği gizli katmanın elli nöronunun aktivasyon seviyelerine dayalı olarak, çıktı katmanının ilk resmin 100 pikselini geri yükleyeceği anlamına gelir. Böyle bir sıkıştırma, gizli ara bağlantılar, karakteristik korelasyon veya herhangi bir yapı varsa mümkündür. Bu şekilde bir otomatik kodlayıcı işlemi, girdi verilerinin azalması anlamında temel bileşen analiz yöntemini (PCA) hatırlatır.

Şaşırtıcı bir şekilde, Bengio ve diğerleri (2007), stokastik gradyan inişi ile eğitim yaparken, gizli nöronların sayısı girdi sayısından daha fazla ("süper bol" olarak da adlandırılır) olan doğrusal olmayan otomatik kodlama ağlarının, ağın girişten sunum alan uyum hatası ışığında yararlı bir sunuma sahip olduğunu göstermiştir.

Daha sonra seyreklik fikri ortaya çıktığında, seyrek otomatik kodlayıcı yaygın olarak kullanıldı.

Bir seyrek otomatik kodlayıcı, girdi boyutundan önemli ölçüde daha fazla sayıda gizli nörona sahip olan bir otomatik kodlayıcıdır, ancak bunların aktivasyonu seyrektir. Seyrek aktivasyon, gizli katmandaki aktif olmayan nöronların sayısının aktif olanların sayısından önemli ölçüde fazla olmasıdır. Seyrekliği gayri resmi olarak tanımlarsak, işlevin değeri 1'e yakınsa nöron aktif olarak kabul edilebilir. Sigmoid işlevi kullanılıyorsa, aktif olmayan nöron için değer 0'a yakın olmalıdır (hiperbolik tanjant işlevi için değer -1'e yakın olmalıdır).

Gürültü giderici otomatik kodlayıcı adı verilen otomatik kodlayıcının bir varyasyonu vardır (Vincent ve diğerleri, 2008). Bu aynı otomatik kodlayıcıdır ancak bu eğitiminin bazı özellikleri vardır. Bu ağı eğitirken, "bozuk" veriler girilir (bazı değerler 0 ile değiştirilir). Aynı zamanda, çıktı verileriyle karşılaştırılacak "doğru" veriler vardır. Bu şekilde otomatik kodlayıcı hasarlı verileri geri yükleyebilir.


2.2.2. Kısıtlı Boltzmann Makinesi, RBM.

Kısıtlı bir Boltzmann makinesinin (RBM) tarihine odaklanmayacağız. Tüm bilmemiz gereken bunun, eğitilmesi çok zor tekrarlayan geri bildirimli nöral ağlarla başladığıdır. Bu öğrenme zorluğu nedeniyle daha fazla kısıtlı tekrarlayan model ortaya çıktı, böylece daha basit öğrenme algoritmaları uygulanabildi. Bir Hopfield nöral ağı bu tür modellerden biriydi. John Hopfield nöral ağ dinamiklerini termodinamik ile karşılaştırarak ağ enerjisi kavramını tanıtan kişiydi.

RBM yolunda bir sonraki adım, normal Boltzmann makineleriydi. Bunlar stokastik bir yapıya sahip olmaları bakımından Hopfield ağından farklıdırlar ve nöronları, görünür ve gizli durumlarını tanımlayan iki gruba ayrılır (gizli bir Markov modeline benzer). Sınırlı bir Boltzmann makinesi, bir katmanın nöronları arasında bağlantı olmadığı zaman standart olandan farklıdır.

Şek. 9 RBM yapısını temsil etmektedir.

Şek. 9. Bir RBM yapısı

Şek. 9. Bir RBM yapısı

Bu modelin özelliği, bir grubun nöronlarının mevcut durumlarında, diğer grubun nöron durumları ile birbirinden bağımsız olmasıdır. Şimdi bu özelliğin kilit role sahip olduğu teoriye geçebiliriz.

Yorumlama ve amaç

Bir RBM gizli bir Markov modeline benzer şekilde yorumlanır. Gözlemleyebildiğimiz bir dizi durumumuz (görünür nöronlar) ve doğrudan göremediğimiz bir dizi gizli durumumuz (gizli nöronlar) vardır. Gözlemleyebildiğimiz durumlara dayanarak, gizli durumlar hakkındaki olasılığa dayalı bir sonuca varabiliriz. Böyle bir model eğitildikten sonra, gizli olanların Bayes teoremini izlediğini bilerek görünür durumlarla ilgili sonuçlar çıkarma fırsatı elde ederiz. Bu, modeli eğitmek için kullanılan olasılık dağılımından veri üretilmesine olanak tanır.

Bu şekilde model eğitiminin amacını formüle edebiliriz: model parametreleri, başlangıç durumundan geri yüklenen bir vektör orijinale en yakın olacak şekilde ayarlanmalıdır. Geri yüklenen vektör, olasılıksal çıkarımla gizli durumlardan alınan vektördür, bu da sırasıyla görünür durumlardan, yani orijinal vektörden olasılıksal bir çıkarımla alınır.

Eğitim algoritması Karşıtsal Farklılık CD-k'dir

Bu algoritma 2002 yılında Profesör Hinton tarafından icat edilmiştir ve oldukça basittir. Ana fikir, matematiksel beklenti değerlerinin tanımlanmış değerlerle değiştirilmesidir. Gibbs örneklemesi fikri tanıtıldı.

CD-k şu şekilde görünmektedir:

  1. Görünür nöronların durumu, girdi formasyonuna eşit olarak ayarlanır;
  2. Çizili gizli katman durumlarının olasılıkları;
  3. Gizli katmanın her bir nöronuna, mevcut durumuna eşit olasılıkla "1" durumu atanır;
  4. Görünür katman durumlarının olasılıkları, gizli katmana dayalı olarak çizilir;
  5. Geçerli yineleme k'den küçükse, 2. adıma dönün;
  6. Çizili gizli katman durumlarının olasılıkları;

Hinton'un derslerinde şu şekilde görünmektedir:

Şek.10. CD-k öğrenme algoritması

Şek.10. CD-k öğrenim algoritması

Başka bir deyişle, örneklemeyi ne kadar uzun süre yaparsak, gradyan o kadar kesin olur. Profesör CD-1 için alınan sonucun, yani sadece bir örnekleme yinelemesinin zaten iyi olduğunu belirtiyor.


2.3. Yığılmış Otomatik İlişkilendirme Ağları. Yığılmış Otomatik Kodlayıcı SAE, Yığılmış Kısıtlı Boltzmann Makinesi (Yığılmış RBM)

Otomatik ilişkilendiriciler girdi veri setinden yüksek seviyeli soyutlamaları ayıklamak için tek bir ağda birleştirilir.

Şekil 11, yığınlanmış otomatik kodlayıcı tarafından başlatılan ağırlıklarla derin nöral ağı temsil eden yığınlanmış otomatik kodlayıcı yapısını ve nöral ağı temsil eder

Şek. 11. Bir DN SAE Yapısı

Şek. 11. Bir DN SAE Yapısı

Şekil 12'de, ağırlıkları SRBM tarafından başlatılan birlikte derin nöral ağı temsil eden yığılmış bir RBM (SRBM) ve bir nöral ağ modeli vardır.

Derin ağ yapılarının bu çizimleri, bilginin aşağıdan yukarıya ayıklanma olgusunu vurgulamaktadır.

Şek. 12. Bir DN SRBM Yapısı

Şek. 12. DN SRBM Yapısı

2.4. Derin Ağların Eğitimi (DN). Aşamalar. Özellikler

Derin ağların eğitimi iki aşamadan oluşur. İlk aşamada, bir otomatik ilişkilendirme ağı (DN türüne bağlı olarak SAE veya SRBM), biçimlendirilmemiş bir veri dizisi üzerinde denetimsiz eğitim alır. Ondan sonra, sıradan MLP gizli katman nöronları, eğitimden sonra alınan gizli katman ağırlıkları tarafından başlatılır. Şekil 11 ve Şekil 12, öğrenme ve transfer süreçlerinin bir formasyonunu temsil etmektedir. İlk АЕ/RBM'nin eğitiminden sonra, gizli katmanın nöron ağırlıkları ikincisinin vb. girdileri olur. Bu şekilde yapı hakkında genelleştirilmiş bilgiler (çizgi, kontur, formasyon vb.) veriden ayıklanmış olur.

İkinci aşama, MLP'nin iyi bilinen yöntemler kullanılarak biçimlendirilmiş veri kümesi üzerinde (denetimli eğitim) ince ayarının yapılma zamanıdır. Uygulama, bu şekilde yapılan başlatmanın MLP'nin gizli katmanlarının nöron ağırlıklarını global minimuma ayarladığını ve sonraki ince ayarın çok kısa bir zaman aldığını kanıtladı.

Daha da fazlası D. Hinton, katman sayısı üçten fazla olan derin ağlar için ince ayarın iki aşamada yapılması gerektiğini önerdi. İlk aşamada sadece iki üst katman ve ikinci aşamada ağın geri kalanı eğitilmelidir.

SRBM'nin SAE'den daha az kararlı denetimsiz eğitim sonuçlarına sahip olduğu belirtilmelidir.

Not. Çoğu zaman bu terimler karıştırılır. SRBM derin inanç ağı DBN ile tanımlanır. RBM DBN'den türetilmesine rağmen, bunlar tamamen farklı yapılardır. DBN, gizli katmanların nöron ağırlıkları ikili formasyonlar tarafından rastgele başlatıldığı çok katmanlı bir nöral ağdır.


3. Pratik Deneyler

Derin ağlar R'de gerçekleştirilecektir.

3.1. R Dili

Geçmiş. R, 1996 yılında Aokland Üniversitesi'nden Yeni Zelandalı bilim adamları Ross Ihaka ve Robert Gentleman tarafından geliştirilen bir programlama dili ve istatistik hesaplamaları ve grafikleme ortamıdır.

R, ücretsiz bir yazılım olan bir GNU projesidir ve felsefesi aşağıdaki prensiplere dayanmaktadır:

  • herhangi bir amaç için program başlatma özgürlüğü (özgürlük 0);
  • bir programın nasıl çalıştığını öğrenme ve onu kendi ihtiyaçlarına göre uyarlama özgürlüğü (özgürlük 1);
  • başkalarına yardım etmek için kopyaları dağıtma özgürlüğü (özgürlük 2);
  • programı iyileştirme ve toplumun iyileştirmelerden faydalanmasına izin verme özgürlüğü.

Tarihsel perspektifte R, S'nin uygulanması için bir alternatiftir. İkincisi, 1976'da Bell Labs şirketinde John Chambers ve meslektaşları tarafından geliştirilmiştir. Bugün R, John Chambers dahil olmak üzere R Geliştirme Çekirdek Ekibi tarafından hala geliştirilmektedir.

Deneyleri tekrarlamak için R ve Rstudio'yu kurmanız gerekli olacaktır. İnternette nereden indirileceği ve nasıl indirileceği ile ilgili bilgiler. Herhangi bir sorunuz varsa, bunları makalenin yorumlarında tartışabiliriz.

R'nin Avantajları:

  • Bugün R istatistik hesaplamalarında bir standarttır.
  • Üniversitelerin global bilim topluluğu tarafından geliştirilmekte ve desteklenmektedir.
  • Tüm gelişmiş veri madenciliği alanları için geniş paketler. Fikrin yayınlanması ve R paketinde uygulanması arasındaki süre genellikle 2 haftayı geçmez.
  • Ve son olarak az bir kısmı değil tamamı ücretsizdir. Ücretsiz bir işletim sisteminin ünlü geliştiricisi bir keresinde şunları söylemiştir: "Programlar seks gibidir - ücretsiz olduğunda daha iyidir".


3.2. Uygulama Varyasyonları ve Ele Alınan Sorunlar

İki olası uygulama yolu vardır.

Birincisi John Hinton'un benzersiz programlarını Matlab için kullanmaktır. Bunun için "R.matlab" gereklidir. Bu paket, MAT dosyalarını okumak ve yazmak için writeMat() ve readMat() yöntemlerine sahiptir. Yerel olarak veya istemci-sunucu bağlantısındaki uzak ana bilgisayarda başlatılan Matlab v6 ve daha yüksek sürümlerden iletişimi (kod uygulaması, nesne gönderme ve alma vb.) sağlar. Ayrıntılar paketin açıklamasında bulunabilir. Bu Matlab'ı rahat kullananlar için bir yoldur. Bu yöntemi kullanmayı denemedim ama Matlab ve MQL'yi bu şekilde bağlama olasılığı vardır.

İkinci uygulama yöntemi bu konuda R paketlerini kullanmaktır. Şimdi keşfedeceğiz.

Bu makalenin konusuyla bağlantılı olduğunu bildiğim üç paket var:

  1. "deepnet", DN SAE ve DN SRBM modellerini uygulayan basit bir pakettir. Denetimli ve denetimsiz öğrenimde girdi veri kümesinin uzunluğu aynıdır. Sistemin ince ayarını iki aşamada gerçekleştirme imkanı vermemektedir. Başlangıçta modellerin araştırılması ve test edilmesi için kullanılır.

  2. "darh" DN SRBM modellemesi için gelişmiş ve geniş kapsamlı bir pakettir. DN SAE için bir model var ama başlatamadım. Bu paket deneyimli kullanıcılar içindir, herhangi karmaşıklık seviyesindeki bir modeli oluşturmaya ve ayarlamaya olanak tanır. Hinton'un MatLab için m dilindeki benzersiz programlarına dayanmaktadır.

  3. "H2O", csv dosyaları içinde yazılmış büyük (>1 Гб) veri kümeleri üzerindeki derin ağları (sadece onları değil) eğitme amaçlı olan kapsamlı bir pakettir.

Aşağıdaki deneylerde "deepnet" paketini kullanacağız.


3.3. Deney için Girdi ve Hedef Verilerinin Hazırlanması

Günümüzde veri madenciliği belirli bir iş düzenine sahiptir:

  1. Girdi verilerinin seçilmesi (çalışma, analiz, ön hazırlık, değerlendirme). Verileri eğitim, doğrulama ve test kümeleriene (örneklerine) bölme;
  2. Eğitim veri kümesindeki bir modelin eğitilmesi ve validasyonda bir modelin/modellerin seçilmesi;
  3. Model/model kalitesinin test örneği üzerinde değerlendirilmesi ve optimal model parametrelerinin veya küme dışındaki en iyi modelin belirli ölçülerle tanımlanması;
  4. Modelin/modellerin çalışmaya başlamasına izin verilmesi.

İlk aşama en çok zaman alan ve sonuç için çok önemli olan aşamadır. Dürüst olmak gerekirse bu aşama resmileştirilmemiştir ve genel olarak konuşmak gerekirse neredeyse bir görsel formudur. Çokça şey araştırmacının deneyimine bağlıdır. Ama yine de! Girdi veri kümesinin nicel değerlendirmelerinin elde edilmesi, en önemlilerini seçmek için çok önemlidir. Bu durumda belirli bir model için en iyi değişkenlerin otomatik seçimi daha da iyidir. R, her aşamada zorlukların üstesinden gelmek için kapsamlı işlevsellik sağlar.

Kaynak veriler sadece çok önemli olmakla kalmaz, aynı zamanda dikkate alınması gereken birçok yönü vardır. Bu konu ayrı bir makaleyi hak ediyor. Bu makalenin amacı, karmaşık bir şeyi çok basit kelimelerle anlatmak olduğu için önemli noktaları tartışacağız ancak fazla ayrıntıya girmeyeceğiz.


3.3.1. Kaynak Veri

Sınıflandırmamız için bir küme bağımsız (girdi) değişkene ve bir hedef değişkene ihtiyacımız vardır. Derin ağların en belirgin avantajı, büyük girdi örnekleri üzerinde hızlı bir şekilde öğrenme kabiliyetleri olduğu için, 17 öngörücüden (11 gösterge) oluşan bir küme girdi verisi oluşturalım. ZigZag, hedef değişkenin bir rolüne sahiptir. Açık, Yüksek, Düşük, Kapat tekliflerinin 4000 çubuk derinliğinde olan R ortamında vektörlerini indirin. Bunu yapmanın yolu, aşağıdaki gösterge yazma yöntemi açıklamasında tartışılmaktadır. Bu aşamada önemli değildir. Diğer tüm hesaplamalar R'de yapılacaktır.

Çubuk gövdesinin ortalama fiyatını ve boyutunu içeren 4 vektörden oluşan bir matris oluşturun. Bunu bir işleve dönüştürün:

pr.OHLC <- function (o, h, l, c) 
{
  #Unite quote vectors into a matrix having previously expanded them
  #Indexing of time series of vectors in R starts with 1. 
  #Direction of indexing is from old to new ones.   
  price <- cbind(Open = rev(o), High = rev(h), Low = rev(l), Close = rev(c))
  Med <- (price[, 2] + price[, 3])/2
  CO <- price[, 4] - price[, 1]
  #add Med and CO to the matrix
  price <- cbind(price, Med, CO)
}

Sonuca bakın (08.10. 14 12:00'de belirtin)

> head(price)
        Open    High     Low   Close      Med     CO
[1,] 1.33848 1.33851 1.33824 1.33844 1.338375 -4e-05
[2,] 1.33843 1.33868 1.33842 1.33851 1.338550  8e-05
[3,] 1.33849 1.33862 1.33846 1.33859 1.338540  1e-04
[4,] 1.33858 1.33861 1.33856 1.33859 1.338585  1e-05
[5,] 1.33862 1.33868 1.33855 1.33855 1.338615 -7e-05
[6,] 1.33853 1.33856 1.33846 1.33855 1.338510  2e-05


3.3.2. Girdi Verileri (Öngörücüler)

Göstergeleri listeleyin. Göstergeler, girdi boyutlarının maksimum farkını elde etmek için herhangi bir tercih olmadan rastgele seçilmiştir.

Tüm göstergelerin hesaplanması, çok sayıda gösterge içeren "TTR" paketi kullanılarak gerçekleştirilir.


3.3.2.1. Welles Wilder'ın Yönlü Hareket Endeksi - ADX(HLC, n) - 4 çıkış (Dip, Din,DX, ADX)

Hesaplayın ve ilk 200 çubukta nasıl göründüğüne bakın:

> library(TTR)
> adx<-ADX(price, n = 16)
> plot.ts(head(adx, 200))

Şek. 13. Gösterge Welles Wilder'ın Yönlü Hareket Endeksi - ADX(HLC, n)

Şek. 13. Gösterge Welles Wilder'ın Yönlü Hareket Endeksi - ADX(HLC, n)

> summary(adx)
      DIp             DIn                DX                 ADX    
 Min.   :15.90   Min.   :  5.468   Min.   : 0.00831      Min.   : 5.482   
 1st Qu.:41.21   1st Qu.: 33.599   1st Qu.: 8.05849      1st Qu.:14.046 
 Median :47.36   Median : 43.216   Median :16.95423      Median :18.099
 Mean   :47.14   Mean   : 46.170   Mean   :19.73032      Mean   :19.609 
 3rd Qu.:53.31   3rd Qu.: 55.315   3rd Qu.:27.97471      3rd Qu.:23.961     
 Max.   :80.12   Max.   :199.251   Max.   :81.08751      Max.   :52.413
 NA's   :16      NA's   :16        NA's   :16            NA's   :31 

Matrisin başında 31 tanımsız değer (NA) vardır. Daha sonra tüm göstergeler için ayrıntılı açıklamalar olmadan aynı hesaplamaları yapın.


3.3.2.2. aroon(HL, n) - 1 çıkış (osilatör)

Yalnızca bir değişken "osilatör"ün ilk 200 çubuğunu hesaplayın ve BAKIN

> ar<-aroon(price[ , c('High', 'Low')], n = 16)[ ,'oscillator']
> plot(head(ar, 200), t = "l")
> abline(h = 0)

Şek. 14. Gösterge aroon(HL, n)

Şek. 14. Gösterge aron(HL, n)

> summary(ar)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
-100.00  -56.25  -18.75   -7.67   43.75  100.00      16 


3.3.2.3. Emtia Kanal Endeksi - CCI(HLC, n) - 1 çıkış

> cci<-CCI(price[ ,2:4], n = 16)
> plot.ts(head(cci, 200))
> abline(h = 0)

Şek. 15. Gösterge Emtia Kanalı Endeksi - CCI(HLC, n)

Şek. 15. Gösterge Emtia Kanal Endeksi - CCI(HLC, n)

> summary(cci)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
-469.10  -90.95  -18.74  -14.03   66.91  388.20      15 


3.3.2.4. Chaikin Volatilite - chaikinVolatility (HLC, n) - 1 çıkış

> chv<-chaikinVolatility(price[ , 2:4], n = 16)
> summary(chv)
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max.     NA's 
-0.67570 -0.29940  0.02085  0.12890  0.41580  5.15700       31 
> plot(head(chv, 200), t = "l")
> abline(h = 0)

Şek. 16. Gösterge chaikinVolatility (HLC, n)

Şek. 16. Gösterge chaikinVolatility (HLC, n)

3.3.2.5. Chande Momentum Osilatörü - CMO(Med, n) - 1 çıkış

> cmo<-CMO(price[ ,'Med'], n = 16)
> plot(head(cmo, 200), t = "l")
> abline(h = 0)

Şek. 17. Gösterge Chande Momentum Osilatörü - CMO(Med, n)

Şek. 17. Gösterge Chande Momentum Osilatörü - CMO(Med, n)

> summary(cmo)
   Min.    1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
-97.670 -32.650  -5.400  -6.075  19.530  93.080      16 


3.3.2.6. MACD osilatörü - MACD(Med, nFast, nSlow, nSig) 1 çıkış kullanılır (macd)

> macd<-MACD(price[ ,'Med'], 12, 26, 9)[ ,'macd']
> plot(head(macd, 200), t = "l")
> abline(h = 0)

Şek. 18. Gösterge MACD osilatörü

Şek. 18. Gösterge MACD osilatörü

> summary(macd)
     Min.   1st Qu.    Median      Mean   3rd Qu.      Max.      NA's
-0.346900 -0.025150 -0.005716 -0.011370  0.013790  0.088880      25       


3.3.2.7. OsMA(Med,nFast, nSlow, nSig) – 1 çıkış

> osma<-macd - MACD(price[ ,'Med'],12, 26, 9)[ ,'signal']
> plot(head(osma, 200), t = "l")
> abline(h = 0)

Şek. 19. Gösterge OsMA(Med,nFast, nSlow, nSig)

Şek. 19. Gösterge OsMA(Med,nFast, nSlow, nSig)

> summary(osma)
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max.     NA's 
-0.10560 -0.00526  0.00034  0.00007  0.00646  0.05922       33 


3.3.2.8. Göreceli Güç Endeksi - RSI(Med,n) – 1 çıkış

> rsi<-RSI(price[ ,'Med'], n = 16)
> plot(head(rsi, 200), t = "l")
> abline(h = 50)

Şek. 20. Gösterge Göreceli Güç Endeksi - RSI(Med,n)

Şek. 20. Gösterge Göreceli Güç Endeksi - RSI(Med,n)

> summary(rsi)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
   5.32   37.33   47.15   46.53   55.71   84.82      16 


3.3.2.9. Stokastik Osilatör - stoch(HLC, nFastK=14, nFastD=3, nSlowD=3) - 3 çıkış

> stoh<-stoch(price[ ,2:4], 14, 3, 3)
> plot.ts(head(stoh, 200))

Şek. 21. Gösterge Stokastik Osilatör - stoch(HLC, nFastK=14, nFastD=3, nSlowD=3)

Şek. 21. Gösterge Stokastik Osilatör - stoch(HLC, nFastK=14, nFastD=3, nSlowD=3)

> summary(stoh)
     fastK            fastD             slowD        
 Min.   :0.0000   Min.   :0.01782   Min.   :0.02388  
 1st Qu.:0.2250   1st Qu.:0.23948   1st Qu.:0.24873  
 Median :0.4450   Median :0.44205   Median :0.44113  
 Mean   :0.4622   Mean   :0.46212   Mean   :0.46207  
 3rd Qu.:0.6842   3rd Qu.:0.67088   3rd Qu.:0.66709  
 Max.   :1.0000   Max.   :0.99074   Max.   :0.97626  
 NA's   :13       NA's   :15        NA's   :17     


3.3.2.10. Stokastik Momentum Endeksi - SMI(HLC, n = 13, nFast = 2, nSlow = 25, nSig = 9) — 2 çıkış

> smi<-SMI(price[ ,2:4],n = 13, nFast = 2, nSlow = 25, nSig = 9)
> plot.ts(head(smi, 200))

Şek. 22. Gösterge Stokastik Momentum Endeksi - SMI(HLC, n = 13, nFast = 2, nSlow = 25, nSig = 9)

Şek. 22. Gösterge Stokastik Momentum Endeksi - SMI(HLC, n = 13, nFast = 2, nSlow = 25, nSig = 9)

> summary(smi)
      SMI              signal       
 Min.   :-82.185   Min.   :-78.470  
 1st Qu.:-33.392   1st Qu.:-31.307  
 Median : -9.320   Median : -8.839  
 Mean   : -8.942   Mean   : -8.985  
 3rd Qu.: 15.664   3rd Qu.: 14.069  
 Max.   : 71.878   Max.   : 63.865  
 NA's   :25        NA's   :33  


3.3.2.11. Volatilite (Yang ve Zhang) - volatility(OHLC, n, calc="yang.zhang", N=96)- 1 çıkış

> vol<-volatility(price[ ,1:4],n = 16,calc = "yang.zhang", N =96)
> plot.ts(head(vol, 200))

Şek. 23. Gösterge Volatilite (Yang ve Zhang) - volatility(OHLC, n, calc="yang.zhang", N=96)

Şek. 23. Gösterge Volatilite (Yang ve Zhang) - volatility(OHLC, n, calc="yang.zhang", N=96)

> summary(vol)
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max.      NA's
0.000599 0.001858 0.002638 0.003127 0.004015 0.012840      16      

4000 bar derinliğindeki OHLC örneği için М15 zaman diliminde EURUSD için 11 göstergeden 17 değişkenimiz var.

Bunları bir matris biçimi oluşturmak için kullanın ve yukarıdaki parametreleri, optimizasyon için gerekli olacak bir biçimsel parametre р ile tek bir işlevde yazın.

Aşağıdaki formülü kullanarak girdi parametrelerinin matrisini hesaplayın:

In<-function(p = 16){
  adx<-ADX(price, n = p);
  ar<-aroon(price[ ,c('High', 'Low')], n=p)[ ,'oscillator'];
  cci<-CCI(price[ ,2:4], n = p);
  chv<-chaikinVolatility(price[ ,2:4], n = p);
  cmo<-CMO(price[ ,'Med'], n = p);
  macd<-MACD(price[ ,'Med'], 12, 26, 9)[ ,'macd'];
  osma<-macd - MACD(price[ ,'Med'],12, 26, 9)[ ,'signal'];
  rsi<-RSI(price[ ,'Med'], n = p);
  stoh<-stoch(price[ ,2:4],14, 3, 3);
  smi<-SMI(price[ ,2:4],n = p, nFast = 2, nSlow = 25, nSig = 9);
  vol<-volatility(price[ ,1:4],n = p,calc="yang.zhang", N=96);
  In<-cbind(adx, ar, cci, chv, cmo, macd, osma, rsi, stoh, smi, vol);
  return(In)
}
> X<-In()
> tail(X)
             DIp      DIn       DX      ADX   ar      cci       chv
[3995,] 46.49620 36.32411 12.28212 18.17544 25.0 168.0407 0.1835102
[3996,] 52.99009 31.61164 25.26952 18.61882 37.5 227.7030 0.3189822
[3997,] 58.11948 28.16241 34.72000 19.62515 37.5 145.2337 0.3448520
[3998,] 56.00323 30.48687 29.50206 20.24245 37.5 118.5831 0.3068059
[3999,] 55.96197 28.78737 32.06467 20.98134 37.5 116.5376 0.3517668
[4000,] 54.97777 26.85440 34.36713 21.81795 62.5 160.0767 0.6169701
             cmo         macd       osma      rsi     fastK
[3995,] 29.71342 -0.020870825 0.01666593 52.91932 0.8832685
[3996,] 41.89526 -0.009654368 0.02230591 61.49793 0.8833819
[3997,] 30.98237 -0.002051532 0.02392699 58.94513 0.7259475
[3998,] 33.84813  0.003454534 0.02354645 58.00549 0.7930029
[3999,] 38.84892  0.009590136 0.02374564 60.63806 0.8367347
[4000,] 54.71698  0.019303110 0.02676689 66.64815 0.9354120
            fastD     slowD        SMI    signal         vol
[3995,] 0.7773581 0.7735064 -35.095406 -47.27712 0.003643196
[3996,] 0.7691688 0.7761507 -26.482951 -43.11828 0.003858942
[3997,] 0.8308660 0.7924643 -19.699762 -38.43458 0.003920541
[3998,] 0.8007775 0.8002707 -13.141932 -33.37605 0.003916109
[3999,] 0.7852284 0.8056239  -6.569699 -28.01478 0.003999789
[4000,] 0.8550499 0.8136852   2.197810 -21.97226 0.004293766

İşlenmemiş girdi verileri hazırlanmakta.


3.3.3. Çıktı Verileri (Hedef)

Şimdi çıktı (hedef veri) oluşturacağız. Daha önce de belirttiğimiz gibi ZigZag kullanacağız.

37 büyük nokta kanal genişliğinde ZigZag kullanacağız. ZigZag ortalama fiyat üzerinden hesaplanacaktır. Gösterge HL fiyatları ile hesaplanabilir ancak bu durumda gösterge daha kararlı olduğu için ortalama fiyat tercih edilir. Sinyali (0 - Al, 1-Sat) ayıkladıktan sonra, onu ağ modelini varsayan bir girdi matrisine dönüştürün.

Bir işlev yazın:

Out<-function(ch=0.0037){
  # ZigZag has values on each bar and not only in the points 
  zz<-ZigZag(price[ ,'Med'], change = ch, percent = F, retrace = F, lastExtreme = T);
  n<-1:length(zz);
  # On the last bars substitute the undefined values for the last known ones
  for(i in n) { if(is.na(zz[i])) zz[i] = zz[i-1];}
  #Define the speed of ZigZag changes and move one bar forward
  dz<-c(diff(zz), NA);
  #If the speed >0 - signal = 0(Buy), if <0, signal = 1 (Sell) otherwise NA
  sig<-ifelse(dz>0, 0, if else(dz<0, 1, NA));
  return(sig);
}

Sinyalleri hesaplayın.

> Y<-Out()
> table(Y)
Y
   0    1 
1567 2423 

Sınıf orantısı dengesizdir. Bir sınıfın örnek sayısı diğerinden fazladır. Bu tür kümelere karşı tüm sınıflandırma modelleri, düşmanca bir tutum sergiler.

Verileri eğitim ve test örneklerine ayırırken bu durumu düzelteceğiz.


3.3.4. Takas Verileri

Veri kümelerimizi tanımsız verilerden temizleyin. Bu durumda takas, daha geniş bir görev döngüsü anlamına gelir. Bu "Neredeyse sıfır değişkenleri", yüksek ilintili olanları ve ayrıca burada tartışmayacağımız diğer bazı görevleri temizlemeyi içerir.

Bir işlev yazın ve verileri temizleyin

Clearing<-function(x, y){
  dt<-cbind(x,y);
  n<-ncol(dt)
  dt<-na.omit(dt)
  return(dt);  
}
> dt<-Clearing(X,Y); nrow(dt)
[1] 3957

Matris 43 çubuk kısaldı.


3.3.5. Eğitmek ve Test Etmek İçin Örnek Oluşturma

Kaynak verileri eğitim ve test örneklerine göre ayırmanın birkaç yolu vardır. Kaynak verinin eğitime düzenli rastgele bölünmesini uygulayacağız ve birini 8/10 oranında test edeceğiz. Örneklerin katmanlara ayrılması önemlidir; bu, eğitim ve test örneklerindeki sınıf örneklerinin orantısının, kaynak veri kümesindeki sınıf orantısına karşılık gelmesi gerektiği anlamına gelir. Kaynak veri kümesindeki sınıf eşitsizliğinin düzeltilmesi de faydalı olacaktır. Bunu yapmanın iki yolu vardır - ya daha büyük ya da daha küçük sınıf ile dengeleme. Daha fazla örneğe gerek duyduğumuz için, daha büyük olan "1" sınıfı ile seviye atlayacağız. Bu durumda "caret" paketini kullanacağız.

Her iki sınıfın örnek sayısının aynı ve büyük olana eşit olduğu yeni dengeli bir küme oluşturalım.


3.3.6. Sınıf Dengeleme

Aşağıda, sınıf sayısını büyük tarafa göre dengeleyen (eğer farklılık %15'ten büyükse) ve dengeli bir matris döndüren işlev verilmiştir

Balancing<-function(DT){
  #Calculate a table with a number of classes
  cl<-table(DT[ ,ncol(DT)]);
  #If the divergence is less than 15%, return the initial matrix
  if(max(cl)/min(cl)<= 1.15) return(DT)
  #Otherwise level by the greater side
  DT<-if(max(cl)/min(cl)> 1.15){ 
         upSample(x = DT[ ,-ncol(DT)],y = as.factor(DT[ , ncol(DT)]), yname = "Y")
        }
  #Convert у (factor) into a number
  DT$Y<-as.numeric(DT$Y)
  #Recode у from 1,2 into 0,1
  DT$Y<-ifelse(DT$Y == 1, 0, 1)
  #Convert dataframe to matrix
  DT<-as.matrix(DT)
  return(DT);
}

Açıklama. İlk dizede her sınıfın örnek sayısını hesaplayın (boyut sınıfların sayısına eşit olan vektördür).

Büyük vektörün küçük olana orantısını bulun ve belirlenen eşik değerinden küçükse çıkın. Orantı daha büyükse, х ve y'yi ayrı ayrı yerleştirerek işlevi hesaplayın. Y önce bir faktöre dönüştürülmelidir.

Bu upSample() işlevinin biçimsel parametrelerinin gerekliliğidir. Bir faktör olarak hedef değişkene ihtiyacımız olmadığından, onu 0 ve 1 değerleriyle sayısal bir değişkene dönüştürüyoruz. Sayısal değişkeni (0,1) bir faktöre dönüştürdüğümüzde, "0" ve "1" metin değişkenlerini aldığımızı lütfen unutmayın. Sayısal değişkenlere ters çevrilmiş dönüşümde 1 ve 2 (!) elde ederiz. Onları 0 ve 1 ile değiştiriyoruz. Veri kümemiz "veri çerçevesi''nden "matris" sınıfına dönüştürülür. Hesaplayın:

dt.b<-Balancing(dt)
x<-dt.b[ ,-ncol(dt.b)]
y<-dt.b[ , ncol(dt.b)]

Bu şekilde, kaynak dt veri kümesine (girdi ve çıktı) ve dengeli dt.b kümesine sahip oluruz.

Eğitime bölün ve örnekleri test edin

"rminer" paketinden holdout() işlevini kullanarak eğitim endekslerini alın ve örnekleri test edin.

> library('rminer')
> t<-holdout(y, ratio = 8/10, mode = "random")

t nesnesi, eğitim (t$tr) ve test (t$ts) veri kümesinin endekslerini içeren bir listedir. Alınan kümeler katmanlara ayrılmıştır.


3.3.7. Ön İşleme

Girdi veri kaynağımız farklı değer aralıklarına sahip değişkenler içerir. Esasen derin ağlar, ağırlıkları başlatmanın kendine özgü yolu olan düzenli ağlardır.

Nöral ağlar (-1; 1) veya (0, 1) aralığındaki girdi değişkenlerini alabilir. Girdi değişkenlerini [-1, 1] aralığında normalleştirin.

Bunun için "caret" paketindeki preProcess() işlevini kullanın. Lütfen ön işleme parametrelerinin eğitim veri kümesinde hesaplanacağını ve test veri kümesinin ve yeni girilen verilerin daha fazla ön işleme için kaydedileceğini unutmayın.

> spSign<-preProcess(x[t$tr, ], method = "spatialSign")
> x.tr<-predict(spSign, x[t$tr, ])
> x.ts<-predict(spSign, x[t$ts, ])

Artık derin bir nöral ağ oluşturmak, eğitmek ve test etmek için her şeye sahibiz.


3.4. Modelleri Oluşturma, Eğitme ve Test Etme

Şimdi DN SAE modelini oluşturup eğiteceğiz. Modelin formülü ve değişkenlerin açıklaması:

sae.dnn.train(x, y, hidden = c(10), activationfun = "sigm", learningrate = 0.8, momentum = 0.5, learningrate_scale = 1, output = "sigm", sae_output = "linear",
  numepochs = 3, batchsize = 100, hidden_dropout = 0, visible_dropout = 0)

burada:

  • х girdi verilerinin matrisidir;
  • y hedef değişkenlerin vektörü veya matrisidir;
  • gizli her gizli katmanda bir dizi nöron içeren bir vektördür. Varsayılan olarak с(10);
  • activationfun, gizli nöronları etkinleştirme işlevidir. "Sigm", "lineer", "tanh" olabilir. Varsayılan olarak "sigm";
  • learningrate gradyan inişi için bir eğitim seviyesidir. Varsayılan olarak = 0.8;
  • momentum gradyan inişi için bir momentumdur. Varsayılan olarak = 0,5;
  • learningrate_scale eğitim seviyesi, her yinelemeden sonra bu değerle çarpılabilir. Varsayılan olarak =1.0;
  • numepochs eğitim için bir dizi yinelemedir. Varsayılan olarak =3;
  • batchsize eğitilmekte olan küçük miktardaki verinin boyutudur. Varsayılan olarak =100;
  • çıktı "sigm", "doğrusal", "softmax" olabilen çıktı nöronları için aktivasyon işlevidir. Varsayılan olarak "sigm";
  • sae_output, "sigm", "doğrusal", "softmax" olabilen SAE'nin çıkış nöronlarının aktivasyon işlevidir. Varsayılan olarak "doğrusal";
  • hidden_dropout gizli katmanlar için silinebilir bir parçasıdır. Varsayılan olarak =0;
  • visible_dropout görünür (girdi) katmanının silinebilir bir parçasıdır. Varsayılan olarak =0.

Aşağıdaki boyutlarda (17, 100, 100, 100, 1) bir model oluşturacağız, onu eğiteceğiz, öğrenme zamanını not edeceğiz ve tahmini gözlemleyeceğiz.

> system.time(SAE<-sae.dnn.train(x= x.tr, y= y[t$tr], hidden=c(100,100,100), activationfun = "tanh", learningrate = 0.6, momentum = 0.5, learningrate_scale = 1.0, output = "sigm", sae_output = "linear", numepochs = 10, batchsize = 100, hidden_dropout = 0, visible_dropout = 0))
begin to train sae ......
training layer 1 autoencoder ...
training layer 2 autoencoder ...
training layer 3 autoencoder ...
sae has been trained.
begin to train deep nn ......
deep nn has been trained.
   user  system elapsed 
  12.92    0.00   13.09 

Gördüğümüz gibi bu iki aşamada gerçekleşir. İlk önce otomatik kodlayıcı, katman katman eğitilir ve ardından nöral ağı alır.

Üç katman içindeki az sayıda eğitim süresi ve çok sayıda gizli nöron bilerek ayarlanmıştır. Tüm süreç 13 saniye sürdü!

Tahminleri, öngörücülerin test kümesinde değerlendirelim.

> pr.sae<-nn.predict(SAE, x.ts);
> summary(pr.sae)
       V1        
 Min.   :0.2649  
 1st Qu.:0.2649  
 Median :0.5881  
 Mean   :0.5116  
 3rd Qu.:0.7410  
 Max.   :0.7410 

0,1 seviyelerine dönüştürün ve ölçümleri hesaplayın

> pr<-ifelse(pr.sae>mean(pr.sae), 1, 0)
> confusionMatrix(y[t$ts], pr)
Confusion Matrix and Statistics

          Reference
Prediction   0   1
         0 316 128
         1 134 378
                                         
               Accuracy : 0.7259         
                 95% CI : (0.6965, 0.754)
    No Information Rate : 0.5293         
    P-Value [Acc > NIR] : <2e-16         
                                         
                  Kappa : 0.4496         
 Mcnemar's Test P-Value : 0.7574         
                                         
            Sensitivity : 0.7022         
            Specificity : 0.7470         
         Pos Pred Value : 0.7117         
         Neg Pred Value : 0.7383         
             Prevalence : 0.4707         
         Detection Rate : 0.3305         
   Detection Prevalence : 0.4644         
      Balanced Accuracy : 0.7246         
                                         
       'Positive' Class : 0 

Bu üstün bir katsayı değildir. Katsayı ile değil, bu sinyalleri kullanarak elde edeceğimiz kârla daha çok ilgileniyoruz. Son 500 çubuk üzerinden kontrol edin (yaklaşık bir hafta). Eğitimli ağımızdan son 500 sıralı çubuk üzerinden sinyaller alacağız.

Giriş verilerinin son 500 çubuğunu normalleştirin, eğitimli nöral ağdan tahminleri alın ve bunları sinyallere dönüştürün -1= (Sat) ve 1 = (Satın Al)

> new.x<-predict(spSign,tail(dt[ ,-ncol(dt)], 500))
> pr.sae1<-nn.predict(SAE, new.x)
> pr.sig<-ifelse(pr.sae1>mean(pr.sae1), -1, 1)
> table(pr.sig)
pr.sig
 -1   1 
235 265 
> new.y<-ifelse(tail(dt[  , ncol(dt)], 500) == 0, 1, -1)
> table(new.y)
new.y
 -1   1 
201 299 
> cm1<-confusionMatrix(new.y, pr.sig)
> cm1
Confusion Matrix and Statistics

          Reference
Prediction  -1   1
        -1 160  41
        1   75 224
                                          
               Accuracy : 0.768           
                 95% CI : (0.7285, 0.8043)
    No Information Rate : 0.53            
    P-Value [Acc > NIR] : < 2.2e-16       
                                          
                  Kappa : 0.5305          
 Mcnemar's Test P-Value : 0.002184        
                                          
            Sensitivity : 0.6809          
            Specificity : 0.8453          
         Pos Pred Value : 0.7960          
         Neg Pred Value : 0.7492          
             Prevalence : 0.4700          
         Detection Rate : 0.3200          
   Detection Prevalence : 0.4020          
      Balanced Accuracy : 0.7631          
                                          
       'Positive' Class : -1   

Doğruluk katsayısı fena değil ancak katsayı ile değil, daha çok kârla ilgileniyoruz.

Karı öngörülen sinyallerimizi kullanarak son 500 çubuk için test edin ve denge eğrisini alın:

> bal<-cumsum(tail(price[ , 'CO'], 500) * pr.sig)
> plot(bal, t = "l")
> abline(h = 0)

Şek. 24. Son 500 çubuktaki nöral ağ sinyallerine göre denge

Şek. 24. Son 500 çubuktaki nöral ağ sinyallerine göre denge

Denge, canlı piyasanın spread, slipaj ve diğer gerçekleri dikkate alınmadan hesaplanmıştır.

Şimdi ZZ'nin ideal sinyallerinden elde edilecek olan denge ile karşılaştırın. Kırmızı çizgi, nöral ağ sinyallerinin dengesidir:

> bal.zz<-cumsum(tail(price[ , 'CO'], 500) * new.y)
> plot(bal.zz,  t = "l")
> lines(bal,  col = 2)

Şek. 25. Son 500 çubuktaki nöral ağ sinyallerine ve ZigZag sinyallerine göre denge

Şek. 25. Son 500 çubuktaki nöral ağ sinyallerine ve ZigZag sinyallerine göre denge

İyileştirme potansiyeli vardır.

Tahmin() ve Test() olmak üzere iki yardımcı işlevi kolaylaştırmak için iki işlev yazın. İlki Doğruluk/Err katsayılarını ve ikincisi Bal/BalZZ dengesini oluşturacaktır.

Bu, bazı ağ parametrelerini değiştirerek hemen bir sonuç elde etmeyi ve hangi parametrelerin ağın kalitesini etkilediğini görmeyi sağlar.

Bir uygunluk işlevi yazıldıktan sonra, işlem sürecinde herhangi bir kesinti olmaksızın evrimsel (genetik) algoritma kullanılarak optimal ağ parametreleri bulunabilir. Şu an bu makalede buna zaman ayırmayacağız ancak başka bir zaman ayrıntılı olarak ele alacağız.

Aşağıda Tahmin() katsayılarını hesaplayan Hata/Doğruluk işlevi verilmiştir:

Estimation<-function(X, Y, r = 8/10, m = "random", norm = "spatialSign",
                     h = c(10), act = "tanh", LR = 0.8, Mom = 0.5, 
                     out = "sigm", sae = "linear", Ep = 10, Bs = 50, 
                     CM=F){
  #Indices of the training and test data set
  t<-holdout(Y, ratio = r, mode = m)
  #Parameters of preprocessing
  prepr<-preProcess(X[t$tr,  ], method = norm)
  #Divide into train and test data sets with preprocessing 
  x.tr<-predict(prepr, X[t$tr,  ])
  x.ts<-predict(prepr, X[t$ts,  ])
  y.tr<- Y[t$tr]; y.ts<- Y[t$ts]
  #Train the model
  SAE<-sae.dnn.train(x = x.tr , y = y.tr , hidden = h, 
                     activationfun = act,
                     learningrate = LR, momentum = Mom, 
                      output = out, sae_output = sae, 
                     numepochs = Ep, batchsize = Bs)
  #Obtain a forecast on the test data set
  pr.sae<-nn.predict(SAE, x.ts)
  #Recode it into signals 1,0
  pr<-ifelse(pr.sae>mean(pr.sae), 1, 0)
  #Calculate the Accuracy coefficient or classification error
  if(CM) err<-unname(confusionMatrix(y.ts, pr)$overall[1])
  if(!CM) err<-nn.test(SAE, x.ts, y.ts, mean(pr.sae))
  return(err)
}

Biçimsel parametreler:

  • X – işlenmemiş girdi ön görücü matrisi;
  • Y – hedef değişken vektörü;
  • r – orantı dizisi/testi;
  • m – örnek oluşturma modu (rastgele veya sıralı);
  • norm – girdi parametrelerini normalleştirme modu ([ -1, 1]= "spatialSign";[0, 1]="range");
  • h – gizli katmanlarda çok sayıda nöron içeren vektör;
  • hareket – gizli nöronların aktivasyon işlevi;
  • LR – eğitim seviyesi;
  • Мом — momentum;
  • out – çıktı katmanının aktivasyon işlevi;
  • sae – otomatik kodlayıcının aktivasyon işlevi;
  • Ep – eğitim dönemlerinin sayısı;
  • Bs – küçük örneğin boyutu;
  • СM– Boolean değişkeni, DOĞRU ise baskı Doğruluğu. Aksi halde Hatalı.

Örnek olarak, her biri 30 nöron içeren üç gizli katmana sahip ağ tarafından dengesiz veri kümesi dt üzerindeki sınıflandırma hatasını hesaplayacağız:

> Err<-Estimation(X = dt[ ,-ncol(dt)], Y = dt[ ,ncol(dt)], h=c(30, 30, 30), LR= 0.7)
begin to train sae ......
training layer 1 autoencoder ...
training layer 2 autoencoder ...
training layer 3 autoencoder ...
sae has been trained.
begin to train deep nn ......
deep nn has been trained.
> Err
[1] 0.1376263

Test() işlevi, tahmin sinyallerine veya ideal sinyallere (ZigZag) göre dengeyi hesaplar:

Testing<-function(dt1, dt2, r=8/10, m = "random", norm = "spatialSign",
                     h = c(10), act = "tanh", LR = 0.8, Mom = 0.5, 
                     out = "sigm", sae = "linear", Ep = 10, Bs=50, 
                     pr = T, bar = 500){
  X<-dt1[  ,-ncol(dt1)]
  Y<-dt1[  ,ncol(dt1)]
  t<-holdout(Y,  ratio = r,  mode = m)
  prepr<-preProcess(X[t$tr,  ], method = norm)
  x.tr<-predict(prepr, X[t$tr,  ])
  y.tr<- Y[t$tr]; 
  SAE<-sae.dnn.train(x = x.tr , y = y.tr , hidden = h, 
                     activationfun = act,
                     learningrate = LR, momentum = Mom, 
                     output = out, sae_output = sae, 
                     numepochs = Ep, batchsize = Bs)
  X<-dt2[ ,-ncol(dt2)]
  Y<-dt2[ ,ncol(dt2)]
  x.ts<-predict(prepr, tail(X, bar))
  y.ts<-tail(Y, bar)
  pr.sae<-nn.predict(SAE, x.ts)
  sig<-ifelse(pr.sae>mean(pr.sae), -1, 1)
  sig.zz<-ifelse(y.ts == 0, 1,-1 )
  bal<-cumsum(tail(price[  ,'CO'], bar) * sig)
  bal.zz<-cumsum(tail(price[  ,'CO'], bar) * sig.zz)
  if(pr) return(bal)
  if(!pr) return(bal.zz)
}

Biçimsel parametreler:

  • dt1 – ağın eğitimi için kullanılan girdi ve hedef değişkenin matrisi;
  • dt2 - ağı test etmek için kullanılan girdi ve hedef değişkenlerin matrisi;
  • pr – Boolean değişkeni, DOĞRU ise denge tahmin sinyalleri ile, aksi takdirde ZigZag ile yazdırır;
  • bar - dengeyi hesaplamak için kullanılacak son çubuk sayısı.

Nöral ağ tarafından yukarıdaki ile aynı parametrelerle dengeli dt.b veri kümesi üzerinde eğitim yaparken dt veri kümemizin son 500 çubuğundaki dengeyi hesaplayın:

> Bal<-Testing(dt.b, dt, h=c(30, 30, 30), LR= 0.7)
begin to train sae ......
training layer 1 autoencoder ...
training layer 2 autoencoder ...
training layer 3 autoencoder ...
sae has been trained.
begin to train deep nn ......
deep nn has been trained.
> plot(Bal, t = "l")
> abline(h = 0)

Şek. 26. Nöral ağ sinyallerindeki son 500 çubuktaki denge h(30,30,30)

Şek. 26. Nöral ağ sinyallerindeki son 500 çubuktaki denge h(30,30,30)

Sonucu daha önce elde edilen denge ile karşılaştırırsak, önemli bir gelişme görebiliriz. Yine de buradaki en ilginç nokta bu değildir.

Son 500 çubuktaki fiyat grafiğine bakarsak, hangi kısımlarının ağımız (150-350 çubuk) tarafından en iyi kabul edilen olduğunu görebiliriz.

> plot(tail(price[  ,'Close'], 500), t = "l")
> abline(v = c(150,350), col=2)

Şek. 27. Son 500 çubuktaki Kapanış fiyatı çizimi

Şek. 27. Son 500 çubuktaki Kapanış fiyatı çizimi

Not: Tahmin çıktılarının kodunu çözerken ortalamadan daha az/fazla basitleştirilmiş bir sürüm kullandık ancak diğer sürümler de kullanılabilir.

Değerler 0,6'dan büyük veya 0,4'ten küçükse, kararsız 0,4-0,6 segmenti kesilir. Kalibrasyonda daha kesin sınıf sınırları elde edilebilir. Bu daha sonra tartışılacaktır.

Test() işlevimiz, ek bir dec parametresi tanıtılacaksa biraz değişecektir. Bu, bir şifre çözme yöntemi ("ortalama" veya "60/40") seçmemize ve bunun denge üzerinde ne gibi etkisi olacağını ön gören değerleri kontrol etmemizi sağlayacaktır.

Testing.1<-function(dt1, dt2, r = 8/10, m = "random", norm = "spatialSign",
                     h = c(10), act = "tanh", LR = 0.8, Mom = 0.5, 
                     out = "sigm", sae = "linear", Ep = 10, Bs = 50, 
                     pr = T, bar = 500, dec=1){
  X<-dt1[ ,-ncol(dt1)]
  Y<-dt1[ ,ncol(dt1)]
  t<-holdout(Y, ratio = r, mode = m)
  prepr<-preProcess(X[t$tr, ], method = norm)
  x.tr<-predict(prepr, X[t$tr, ])
  y.tr<- Y[t$tr]; 
  SAE<-sae.dnn.train(x = x.tr , y = y.tr , hidden = h, 
                     activationfun = act,
                     learningrate = LR, momentum = Mom, 
                     output = out, sae_output = sae, 
                     numepochs = Ep, batchsize = Bs)
  X<-dt2[ ,-ncol(dt2)]
  Y<-dt2[ ,ncol(dt2)]
  x.ts<-predict(prepr, tail(X, bar))
  y.ts<-tail(Y, bar)
  pr.sae<-nn.predict(SAE, x.ts)
  #Variant +/- mean
  if(dec == 1) sig<-ifelse(pr.sae>mean(pr.sae), -1, 1)
  #Variant 60/40
  if(dec == 2) sig<-ifelse(pr.sae>0.6, -1, ifelse(pr.sae<0.4, 1, 0))
  sig.zz<-ifelse(y.ts == 0, 1,-1 )
  bal<-cumsum(tail(price[  ,'CO'], bar) * sig)
  bal.zz<-cumsum(tail(price[  ,'CO'], bar) * sig.zz)
  if(pr) return(bal)
  if(!pr) return(bal.zz)
}

Birinci ve ikinci kod çözüm yöntemleriyle dengeyi hesaplayın ve değerlendirin.

Sonuçların tekrarlanması için yalancı rastgele sayı oluşturucusunu aynı pozisyona ayarlayın.

> set.seed<-1245
> Bal1<-Testing.1(dt.b, dt, h = c(30, 30, 30), LR = 0.7, dec = 1)
begin to train sae ......
training layer 1 autoencoder ...
training layer 2 autoencoder ...
training layer 3 autoencoder ...
sae has been trained.
begin to train deep nn ......
deep nn has been trained.
> set.seed<-1245
> Bal2<-Testing.1(dt.b, dt, h = c(30, 30, 30), LR = 0.7, dec = 2)
begin to train sae ......
training layer 1 autoencoder ...
training layer 2 autoencoder ...
training layer 3 autoencoder ...
sae has been trained.
begin to train deep nn ......
deep nn has been trained.
> plot(Bal2, t = "l")
> lines(Bal1, col = 2)

Şek. 28. Tahmini şifreleri çözmenin farklı yolları ile son 500 çubuktaki nöral ağ sinyallerine göre denge

Şek. 28. Tahmini şifreleri çözmenin farklı yolları ile son 500 çubuktaki nöral ağ sinyallerine göre denge

Açıkça, ikinci yolla denge 60/40 daha iyi görünüyor. Geliştirme için bu bakımdan da alan vardır.

İşte kontrol edilecek son şey. Teorik olarak, birkaç nöral ağdan oluşan bir topluluk daha iyi ve daha kararlı bir sonuç verir. Bağımsız örnekler üzerinde eğitilebilseler de aynı örnekler üzerinde eğitilmiş birkaç ağdan oluşan bir topluluğu test edeceğiz. Topluluğun tahmin sonucu, tüm ağ tahminlerinin basit bir ortalamasıdır. Ortalama almanın daha karmaşık başka yolları da vardır.

Test() işlevimizi bir parametre daha ekleyerek iyileştireceğiz — ans=1 topluluktaki ağların sayısını belirtir.


3.4.1. Paralel Hesaplamalar

Çeşitli bağımsız model ile yapılan hesaplamalar kolaylıkla paralel hale getirilebildiğinden, R dilinin sağladığı fırsatı kullanacağız ve bu bilgisayarların hangi işletim sistemlerine sahip olduğuna bakmadan çeşitli işlemci çekirdeğinden veya yerel ağdaki bilgisayarlardan oluşan bir küme oluşturacağız.

Bunun için "foreach" ve "doParallel" paketlerine ihtiyacımız vardır. Aşağıda, işlemcimizin bütün çekirdekleri için küme başlatacak çok basit bir işlev bulunmaktadır.

library(doParallel)
library(foreach)
puskCluster<-function(){
  cores<-detectCores()
  cl<-makePSOCKcluster(cores)
  registerDoParallel(cl)
  clusterSetRNGStream(cl)
 return(cl)
}

Aşağıda birkaç nokta açıklığa kavuşturulmuştur. İlk iki dizede gerekli kitaplıkları yükleriz. Önceden bilgisayarınıza yüklenmiş olmaları gereklidir. Daha sonra işlemcide kaç tane çekirdek olduğunu tanımlarız, bir küme oluştururuz, paralel hesaplamalar için bir paket kaydederiz, her hesaplama akışına bağımsız bir yalancı rasgele sayı oluşturucusu kurar ve küme tanıtıcısını döndürürüz. Bu ayrı bir konu olsa da, yalancı rasgele sayı oluşturucunun kalitesi her model hesaplaması için son derece önemlidir.

Bunu, küme başlatıldıktan ve gerekli tüm hesaplamalar yapıldıktan sonra durdurmayı unutmamalıyız:

cl<-puskCluster()
stopCluster(cl) 

Paralel hesaplamalar "foreach" paketi üzerinden aşağıdaki formülle yapılacaktır:

SAE<-foreach(times(ans), .packages = "deepnet") %dopar%  
                sae.dnn.train(x = x.tr , y = y.tr , hidden = h, 
                        activationfun = act,
                        learningrate = LR, momentum = Mom, 
                        output = out, sae_output = sae, 
                        numepochs = Ep, batchsize = Bs)

burada time(ans) elde etmek istediğimiz ağ sayısıdır ve .packages hesaplanan işlevi almak için paketi işaret eder.

Sonuç liste biçimine sahiptir ve ihtiyacımız olan eğitimli ağ sayısını içerir.

Daha sonra her ağ üzerinden tahmine ve ortalama hesaplamaya gerek duyarız.

pr.sae<-(foreach(i = 1:ans, .combine = "+") %do%  nn.predict(SAE[[i]], x.ts))/ans

Burada i, eğitimli ağ endekslerinin bir vektörüdür.combine="+" nöral ağlarda döndürülen bütün öngörülerin hangi biçimde döndürülmesi gerektiğini belirtir. Bu durumda bir toplamı döndürmemiz ve bu hesaplamaları paralel bir (operatör %do%) şekilde değil, sırayla gerçekleştirmemiz gerekliydi. Elde edilen toplam, nöral ağların sayısına bölünecek ve bu da sonuç olacaktır. Bu güzel ve basit bir yöntemdir.

3 ve 4 nöral ağdan oluşan topluluklardan elde edilen dengeyi yukarıdakilerle aynı parametrelerle ve 60/40 kod çözme yöntemini kullanarak hesaplayın. Nöral ağdaki sonuçlarla karşılaştırın. Paralel hesaplamaların etkinliğini değerlendirmek için, dönem sayısını 300'e yükseltin ve tahmini elde etme sürecini zamanlayın.

1. Bir nöral ağ:

> system.time(Bal21<-Testing.1(dt.b, dt, h = c(30, 30, 30), LR = 0.7, dec = 2, Ep=300))
begin to train sae ......
training layer 1 autoencoder ...
####loss on step 10000 is : 0.000057
####loss on step 20000 is : 0.000043
training layer 2 autoencoder ...
####loss on step 10000 is : 0.000081
####loss on step 20000 is : 0.000086
training layer 3 autoencoder ...
####loss on step 10000 is : 0.000072
####loss on step 20000 is : 0.000066
sae has been trained.
begin to train deep nn ......
####loss on step 10000 is : 0.069451
####loss on step 20000 is : 0.079629
deep nn has been trained.
   user  system elapsed 
 115.78    0.00  116.96 
> plot(Bal21, t = "l")
> abline(h = 0)

2. 3 nöral ağ topluluğu:

> system.time(Bal41<-Testing.2(dt.b, dt, h = c(30, 30, 30), LR = 0.7, Ep=300, dec = 2, ans=3))
   user  system elapsed 
   0.22    0.06  233.64 
> lines(Bal41, col=4)

3. 4 nöral ağ topluluğu:

> system.time(Bal44<-Testing.2(dt.b, dt, h = c(30, 30, 30), LR = 0.7, Ep=300, dec = 2, ans=4))
   user  system elapsed 
   0.13    0.03  247.86 
> lines(Bal44, col=2)

Akış sayısı çekirdek sayısından fazlaysa paralel hesaplamadaki yürütme süresi optimaldir. 2 çekirdek kullandım.

Demem o ki, dengede önemli bir avantaj sağlamaz. Aşağıdaki grafikte, mavi çizim 3 ağı, kırmızı olan - 4 ağı ve siyah olan - bir ağı göstermektedir.

Şek. 29. Son 500 çubuktaki 3 ve 4 nöral ağdan ve bir ağdan oluşan toplulukların sinyallerine göre denge

Şek. 29. Son 500 çubuktaki 3 ve 4 nöral ağdan ve bir ağdan oluşan toplulukların sinyallerine göre denge

Genel olarak sonuç, girdi ve çıktı verilerinden başlayarak, bunların normalleştirilme şekli, gizli katmanların sayısı ve bu katmanlardaki nöronların sayısı, eğitim seviyesi, eğitim dönemlerinin sayısı ve diğerleri gibi birçok parametreye bağlıdır.

Son üç örnek. Son 1000 çubuktaki üç gizli katmanda farklı sayıda gizli nöron içeren üç nöral ağın dengesini hesaplayın.

> system.time(Bal0<-Testing.1(dt.b, dt, h = c(30, 30, 30), LR = 0.7, dec = 2, Ep=300, bar=1000))
begin to train sae ......
training layer 1 autoencoder ...
####loss on step 10000 is : 0.000054
####loss on step 20000 is : 0.000044
training layer 2 autoencoder ...
####loss on step 10000 is : 0.000078
####loss on step 20000 is : 0.000079
training layer 3 autoencoder ...
####loss on step 10000 is : 0.000090
####loss on step 20000 is : 0.000072
sae has been trained.
begin to train deep nn ......
####loss on step 10000 is : 0.072633
####loss on step 20000 is : 0.057917
deep nn has been trained.
   user  system elapsed 
 116.09    0.02  116.26 
> max(Bal0)
[1] 0.04725
> plot(Bal0, t="l")
> tail(Bal0,1)
[1] 0.03514

Maksimum kar 472 puan, son çubukta 351 puan. Grafikte siyah olarak çizilmiştir.

> system.time(Bal0<-Testing.1(dt.b, dt, h = c(13, 8, 5), LR = 0.7, dec = 2, Ep=300, bar=1000))
begin to train sae ......
training layer 1 autoencoder ...
####loss on step 10000 is : 0.005217
####loss on step 20000 is : 0.004846
training layer 2 autoencoder ...
####loss on step 10000 is : 0.051324
####loss on step 20000 is : 0.046230
training layer 3 autoencoder ...
####loss on step 10000 is : 0.023292
####loss on step 20000 is : 0.026113
sae has been trained.
begin to train deep nn ......
####loss on step 10000 is : 0.057788
####loss on step 20000 is : 0.056932
deep nn has been trained.
   user  system elapsed 
  64.04    0.01   64.24 
Warning message:
In sae$encoder[[i - 1]]$W[[1]] %*% t(train_x) + sae$encoder[[i -  :
  longer object length is not a multiple of shorter object length
> lines(Bal0, col="blue")

Bu açıkça etkisiz bir varyasyondur.

Üçüncü varyasyon:

> system.time(Bal0<-Testing.1(dt.b, dt, h = c(50, 50, 50), LR = 0.7, dec = 2, Ep=300, bar=1000))
begin to train sae ......
training layer 1 autoencoder ...
####loss on step 10000 is : 0.000018
####loss on step 20000 is : 0.000013
training layer 2 autoencoder ...
####loss on step 10000 is : 0.000062
####loss on step 20000 is : 0.000048
training layer 3 autoencoder ...
####loss on step 10000 is : 0.000053
####loss on step 20000 is : 0.000055
sae has been trained.
begin to train deep nn ......
####loss on step 10000 is : 0.096490
####loss on step 20000 is : 0.084860
deep nn has been trained.
   user  system elapsed 
 186.18    0.00  186.39 
> lines(Bal0, col="red")
> max(Bal0)
[1] 0.0543

Şek. 30. Son 1000 çubuktaki farklı sayıda gizli nöron içeren üç nöral ağ sinyallerine göre denge

Şek. 30. Son 1000 çubuktaki farklı sayıda gizli nöron içeren üç nöral ağ sinyallerine göre denge

Sonuçlar üçüncü varyantın, 543 puanlık maksimum kârla üçünün içinden en iyisi olduğunu göstermektedir. Sadece gizli nöronların sayısını değiştirdik ve bu önemli bir gelişme sağladı. Optimal parametrelerin araması evrimsel algoritmalar aracılığıyla yapılmalıdır. Bunu keşfetmek okuyucuya kalmıştır. 

Yazarın algoritmasının bu pakette tam olarak uygulanmadığı unutulmamalıdır.


4. Uygulama (Gösterge ve Expert Advisor)

Şimdi, derin ağ kullanarak alım satım sinyallerini almak için gösterge ve Expert Advisor için bir program yazacağız.

Bu şekilde bir uygulamanın iki yolu vardır:

  • Birincisi. Nöral ağın eğitimi Rstudio içinde manuel olarak gerçekleştirilir. Kabul edilebilir sonuçlar elde ettikten sonra ağı uygun kataloğa kaydedin. Ardından EA'yı ve grafikteki göstergeyi başlatın. EA eğitilmiş ağı yükleyecektir. Gösterge, her yeni çubukta yeni bir girdi veri vektörü hazırlar ve bunu EA'ya iletir. EA ağ verilerini sunar, sinyal alır ve ardından buna göre hareket eder. EA bu gibi açılış ve kapanış talimatları, takip gibi olağan faaliyelerini yerine getirmektedir. Göstergenin amacı, her yeni çubukta yeni giriş verilerini hazırlamak ve EA'ya iletmek ve en önemlisi, ağ tarafından tahmin edilen sinyalleri bir grafik üzerinde sunmaktır. Pratik, bir nöral ağı değerlendirmenin en etkili yolunun görsel kontrol olduğunu göstermektedir.
  • İkinci yol. EA'yı ve grafikteki göstergeyi başlatın. İlk başlatmada, gösterge EA'ya hazırlanmış geniş bir girdi ve çıktı veri kümesi iletir. EA eğitim, test etme ve en iyi nöral ağı seçim işlemini başlatır. Bundan sonra çalışma ilk şekilde olduğu gibi devam eder.

Şimdi ilk algoritmayı takip ederek bağlantı göstergesi-EA yazacağız. Minimum yay ve kıvrımlara sahip EA.

Neden bu kadar zordur? Bu uygulama yolu, farklı sembollere/zaman dilimlerine yerleştirilmiş birkaç göstergenin tek bir EA'ya bağlanmasına ve sonuç olarak onlarla birlikte çalışmasına olanak tanır. Bunun için EA'nın küçük bir modernizasyondan geçmesi gereklidir. Bunun hakkında daha sonra konuşacağız.

Aşağıda, gösterge ile EA arasındaki etkileşim yapısı yer almaktadır:

Şek. 31. Gösterge ile EA arasındaki etkileşim yapısı

Şek. 31. Gösterge ve EA arasındaki etkileşim yapısı

4.1. Modeli Eğitme ve Kaydetme

İlgilendiğimiz grafikte yer alan göstergeyi kullanarak gerekli kaynak verileri elde edin. Bunun için, girdi değişkenini send=false ayarlayarak göstergeyi çizelgeye yerleştirin, yani görsel temsilin sunucuya gönderilmemesi gereklidir. Bu sembol veya zaman dilimindeki ilk başlatmada, gösterge terminalin (/MQL4/Files) adlı veri dosyasında aşağıdaki /Symbol/TF/Test_Data/ dizinlerini oluşturmaktır.

Böyle bir dizin organizasyonu, modellerin ön eğitiminde deney sonuçlarını bir araya getirmeme ve eski verilerin üzerine yenilerini yazmama fırsatı verir. Aracı sonuçlar /Symbol/TF/Test_Data/ dizininde saklanacak ve EA'nın iş için kullanacağı model /Symbol/TF/ dizininde bulunacaktır (oraya manuel olarak yerleştirilmesi gerekecektir). Aynı sonuç, yeni bir sembol veya EA'nın zaman dilimindeki ilk başlatmada da olacaktır.

Yani, EURUSD, М30 için 14.10.2014 tarihinde 4000 çubuk bulunmaktadır. dt[] veri çerçevesine ihtiyacımız vardır.

Denge sınıfları:

> dt.b<-Balancing(dt)
> table(dt.b[ ,ncol(dt.b)])
   0    1 
2288 2288

Şimdi, daha önce yazılmış olan Testing.1() işleviyle, 500 ve 300 dönem derin nöral ağı eğitin ve son 500 çubukta elde edilen dengeyi nöral ağ tarafından tahmin edilen sinyallerle değerlendirin.

> system.time(bal<-Testing.1(dt.b, dt, h = c(50, 50, 50), LR = 0.7, dec = 2, Ep=500, bar=500))
begin to train sae ......
training layer 1 autoencoder ...
####loss on step 10000 is : 0.000017
####loss on step 20000 is : 0.000015
####loss on step 30000 is : 0.000015
training layer 2 autoencoder ...
####loss on step 10000 is : 0.000044
####loss on step 20000 is : 0.000041
####loss on step 30000 is : 0.000039
training layer 3 autoencoder ...
####loss on step 10000 is : 0.000042
####loss on step 20000 is : 0.000042
####loss on step 30000 is : 0.000036
sae has been trained.
begin to train deep nn ......
####loss on step 10000 is : 0.089417
####loss on step 20000 is : 0.043276
####loss on step 30000 is : 0.069399
deep nn has been trained.
   user  system elapsed 
 267.59    0.08  269.37 
> plot(bal, t="l")

Nöral ağı farklı bir ad altında kaydedin ve başka bir tane eğitin

> SAE1<-SAE
> system.time(bal<-Testing.1(dt.b, dt, h = c(50, 50, 50), LR = 0.7, dec = 2, Ep=300, bar=500))
begin to train sae ......
training layer 1 autoencoder ...
####loss on step 10000 is : 0.000020
####loss on step 20000 is : 0.000016
training layer 2 autoencoder ...
####loss on step 10000 is : 0.000050
####loss on step 20000 is : 0.000050
training layer 3 autoencoder ...
####loss on step 10000 is : 0.000051
####loss on step 20000 is : 0.000043
sae has been trained.
begin to train deep nn ......
####loss on step 10000 is : 0.083888
####loss on step 20000 is : 0.083941
deep nn has been trained.
   user  system elapsed 
 155.32    0.02  156.25 
> lines(bal, col=2)

Denge grafiklerine bir göz atın (son sonuç kırmızı ile vurgulanmıştır).

Şek. 32. Son 500 çubuktaki 500 ve 300 dönemde eğitilmiş nöral ağ sinyallerine denge

Şek. 32. Son 500 çubuktaki 500 ve 300 dönemde eğitilmiş nöral ağ sinyallerine denge

Görüldüğü gibi, 300 dönemde eğitilen nöral ağ, 500 çağda eğitilen ağa göre daha iyi sonuç vermiştir.

İkincinin eğitim süresi, bu zaman dilimindeki bir alım satım oturumu sırasında hızlı şekilde yeniden eğitme için uygundur.

Gerçek bir grafik üzerinde daha fazla çalışmak için iki nesneye ihtiyacımız var: eğitimli model "SAE" ve girdi verileri için normalleştirme parametreleri "prepr". Bunları ilgili dizine kaydedin, benim durumumda bu "D:/Alpari Limited MT4/MQL4/Files/EURUSD/M30/Test_2014-10-14" olur. Bu gösterge tarafından kaydedilen "i_SAE_EURUSD_30.Rdata" çalışma alanını Rstudio'da açtıysanız, çalışan olarak tanımlanır ve çalışır.

save(SAE, prepr, file="SAE.model")

"SAE.model" dosyasına modelin kendisini ve normalizasyon parametrelerini kaydettik. Modeli bunlar olmadan kullanmak mantıklı değildir. Beğendiğiniz modelleri her gün deneyebilir ve kaydedebilirsiniz. "/File/Symbol/TF/Test_Data" klasörlerine kaydedileceklerdir. EA'nın modeli kullanması için, "SAE.model" dosyasını manuel olarak "File/Symbol/TF/" klasörüne koyun. Bu klasör yalnızca bir model içerebilir ve EA bunu çalışma için kullanacaktır.

"SAE.model" dosyasını yükledikten sonra, EA bu nesneleri çalışmada kullanmak üzere çalışma alanına yükler. Bu noktada işin manuel kısmı bitmiştir, göstergeyi-EA'yı grafiğe yerleştirebilir ve gerçek zamanlı olarak test edebilirsiniz.

EA'nın çalışma etkinliğini değerlendirmek için nicel kriterler gereklidir. Doğruluk katsayısı bu amaç için pek uygun değildir.

ZigZag tarafından alınan tahmini denge oranının ve son çubuktaki denge oranının çubuk sayısına ortalaması. Bizim durumumuzda bu, ZigZag'a göre dengedir:

sig.zz<-ifelse(tail(dt[  , ncol(dt)], 500) == 0, 1, -1)
bal.zz<-cumsum(tail(price[  , 'CO'], 500) * sig.zz)
Kzz<-mean(bal.zz / bal)
> Kzz
[1] 0.9173312

Bu çok yüksek bir puan ama göreceli.

Zamanla neye benzediğini görürsek, ilk 50-100 çubuk için bunun kararsız bir endeks olduğunu görebiliriz, ancak daha sonra neredeyse sabit hale gelmektedir. İstatistikler aşağıdadır:

> plot(bal/bal.zz, t="l")
> summary(bal/bal.zz)
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
-15.2500   0.7341   0.7844   0.9173   0.8833  55.0000

Şek. 33. Tahmini dengenin ZigZag tarafından elde edilen dengeye oranı

Şek. 33. Tahmini dengenin ZigZag tarafından elde edilen dengeye oranı

İkincisi, N çubuk uzunluğundaki bir streç üzerinde bir çubuk için kaç kar noktası olduğunu gösterdiği için daha kesindir.

Örneğin, 500 barlık bir sinir ağı tahminine göre denge için:

> Kb<-tail(bal,1)/length(bal)*10^Dig
> Kb
[1] 11.508

ZigZag sinyallerine göre:

> Kbz<-tail(bal.zz,1)/length(bal)*10^Dig
> Kbz
[1] 13.784

Parametrelerden birinin etkinliğinin alt sınırı tanımlandığında, nöral ağı yeniden eğitebileceğimiz veya parametrelerini optimize edebileceğimiz zamanı biliriz.

EA, grafikte aşağıdaki parametreleri gösterecektir: OP – yürütülen operasyon, Acc – Doğruluk, K – Kb daha önce tanımlanır, Kmax – Kb ile aynı parametredir ancak yüksek dengede tanımlanır ve bu parametrenin son çubuktaki maksimum olandan ne kadar farklı olduğu hakkında bir fikir verir.


4.2. Kurulum ve Başlatma Sırası

Ekli SAE.zip arşivinde şunları bulabilirsiniz:

  1. i_SAE.mq4 göstergesi, ~/MQL4/Indicators/ klasörüne yerleştirilir
  2. e_SAE.mq4 EA ~/MQL4/Experts/ klasörüne yerleştirilir
  3. mt4Rb7.dll kütüphanesi, ~/MQL4/Libraries/ klasörüne yerleştirilir.
  4. mt4Rb7.mqh başlık dosyası, ~/MQL4/Include/ klasörüne yerleştirilir. Kütüphane ve başlık dosyası Bernd Kreuss tarafından geliştirilmiş ve güzel bir şekilde sunulmuştur. Ad, son değişikliğin (b7) endeksini içerir. Aynı ada sahip çok sayıda sürüm olduğunda, düzeltilmesi çok zaman alan karışıklıklar olabilir.
  5. R üzerindeki script dosyaları: i_SAE.r (ana gösterge script'i), i_SAE_fun.r (gösterge script'i işlevleri), e_SAE.r (EA script'i), e_SAE_init.r (EA başlatma script'i), SAE_SetDir.r (gerekli dizinleri doğrulama ve oluşturma script'i). Script dosyaları ne sembole ne de bir zaman dilimine bağlı oldukları için ayrı bir dizinde bulunabilirler. Benim durumumda bu "C:Rdata/SAE/"dir. "C:Rdata/" dizini, belirli bir projeye eklenmemiş farklı script dosyaları içerir. Script dosyalarını benimkinden farklı bir klasöre koyarsanız, gösterge ve EA'da script dosyalarına giden yol için doğru olan uygun düzeltmeleri yapın.
  6. SAE.model, "SAE" modeline ve "prepr" normalleştirme parametrelerine sahip bir dosyadır. Model son tarih 14.10.14'te EURUSD (M30) üzerinde eğitilmiştir. Eğitim süreci yukarıda açıklanmıştır.

Ayrıca R dilinin bilgisayarınızda saklandığı dizine giden yolu da unutmayın.

Çalışmaya başlamak için aşağıdaki sırayı takip etmek tercih edilebilir. EA'yı grafiğe yerleştirin. EA'yı başka bir sembole yerleştirmeye karar verirseniz, daha önce başlatılan sunuculardan farklı bir bağlantı noktası belirtilir. Mesela, bağlantı noktası 8886'dır (varsayılan olarak bağlantı noktası 8888).

Not. Bu kesinlikle verimsiz bir yoldur. Her sunucunun boyutu 120-130 Mb'dir. Bugün olanlar bunlardır.

Normal EA başlatma işleminden sonra, "Hesaplama sonucu yoktur! Sembolü" uyarısı görünecektir. Ardından göstergeyi harici parametre send = true ve göstergenin bağlanacağı belirtilen sunucu bağlantı noktası ile kurun (yukarıya bakın). Her şey doğru çalışırsa, çıktı dizesinde gerçek veri olarak "operasyon", Doğruluk, K ve Kmax görünecek ve alım satım işlemi başlayacaktır.

Sürecin verimli kontrolü en iyi Windows Görev Yöneticisinden kolaylaştırılabilir. EA veya gösterge başlatıldıktan sonra Rterm listede görünmüyorsa, R süreci kesintiye uğramıştır. Bu tür kesintilerin ana nedeni, script dosyalarındaki sözdizimi hatası, alıcı MQL vektörünün uzunluğunun ve Rterm'den çıkarılan vektörün uyumsuzluğudur.

Script dosyaları, Rstudio'da baştan sona satır satır başlatılarak hataları ayıklanabilir.

Maalesef EA'yı test cihazında başlatamadım, bu nedenle bir deneme hesabında test edilmesi gereklidir.


4.3. Niteliksel Özellikleri Geliştirme Yolları ve Yöntemleri

  1. Girdide kullanılan gösterge kümesini değiştirin.
  2. Girdi verilerinin normalleştirilme yolunu değiştirin.
  3. "Denetimcinin" parametrelerini ve girdideki göstergeleri optimize edin.
  4. İki sütunlu matris için giriş değişkeni kodlamasını değiştirin. Tahmin sinyalini kalibre edin.
  5. Ağ parametrelerini optimize edin (gizli katmanlardaki nöron sayısı, katman sayısı, öğrenme düzeyi, dönem sayısı).

Sonuç

SAE üzerinden gizli katmanlardaki nöron ağırlıklarını başlatma ile derin ağ modelleri oluşturduk, eğittik ve test ettik. Ağlar çok hızlı bir şekilde yeniden eğitilir ve alım satım sürecini kesintiye uğratmadan ağların yeniden eğitilmesine olanak tanır.

Nöral ağlar tarafından gösterilen sonuçlar, metriklere göre ortalamadır. İdeal sonuç ilk hedef değildi.

Model ve verimlilik katsayısı için böyle kalıcı bir değerlendirme kullanılırsa, model alım satım sürecini kesintiye uğratmadan yeniden eğitilebilir ve optimize edilebilir.

Ek:

  1. SAE.zip - gösterge, EA ve beraberindeki dosyalar.
  2. R_intro.zip - Rusçada R ve Rstudio ile ilgili literatür.
  3. DeepLearning.zip - Derin Öğrenme literatürü.

MetaQuotes Ltd tarafından Rusçadan çevrilmiştir.
Orijinal makale: https://www.mql5.com/ru/articles/1103

Ekli dosyalar |
DeepLearning.zip (6542.81 KB)
R-intro.zip (15278.8 KB)
sae.zip (394.31 KB)
MQL5 Cookbook: TradeTransaction Olayının İşlenmesi MQL5 Cookbook: TradeTransaction Olayının İşlenmesi
Bu makale MQL5 dilinin imkanlarını, olay güdümlü programlama açısından ele almaktadır. Bu yaklaşımın en büyük avantajı, alım satım operasyonunun aşamalı uygulaması hakkında programın bilgi alabilmesidir. Makale ayrıca, TradeTransaction olay işleyicisini kullanarak devam eden alım satım işlemi hakkında, bilgiyi alma ve işleme örneği içerir. Benim görüşüme göre, böyle bir yaklaşım yatırımları bir terminalden diğerine kopyalamak için kullanılabilir.
MetaTrader Sinyalleri hizmetini ve Sosyal Alım Satımı nasıl geliştirdik? MetaTrader Sinyalleri hizmetini ve Sosyal Alım Satımı nasıl geliştirdik?
Sinyal hizmetini geliştirmeye, mekanizmaları iyileştirmeye, yeni işlevler eklemeye ve kusurları düzeltmeye devam ediyoruz. 2012'nin MetaTrader Sinyal Hizmeti ve mevcut MetaTrader Sinyal Hizmeti tamamen farklı iki hizmet gibidir. Şu anda, MetaTrader istemci terminalinin belirli sürümlerini desteklemesi için sunucu ağından oluşan Sanal Barındırma Bulut hizmetini uyguluyoruz.
MQL5 Cookbook: Özel Grafik Olaylarını İşleme MQL5 Cookbook: Özel Grafik Olaylarını İşleme
Bu makale, MQL5 ortamındaki özel grafik olayları sisteminin tasarım ve geliştirme yönlerini ele almaktadır. Olay sınıflandırmasına yaklaşım örneği, özel olay işleyici sınıfı ve olay sınıfı program kodunun yanı sıra burada da bulunabilir.
Makroekonomik Verilerin Döviz Fiyatı Dalgalanması Üzerindeki Etkisinin Regresyon Analizi Makroekonomik Verilerin Döviz Fiyatı Dalgalanması Üzerindeki Etkisinin Regresyon Analizi
Bu makale çoklu regresyon analizinin makroekonomik istatistiklere uygulanmasını ele almaktadır. Ayrıca bu, EURUSD döviz çifti örneğine dayalı olarak döviz kuru dalgalanması üzerindeki istatistik etkisinin değerlendirilmesine ilişkin bir fikir verir. Bu şekilde bir değerlendirme, mevcut olan temel analizin acemi yatırımcılar için bile otomatikleştirilmesine izin verir.