Oh, benim için derin bir pekiştirici öğrenme kağıdı hazırlamak kolay mı?

Lei Feng net notu: Bu makale, Lei Feng'in altyazılı Dersler Derin Takviye Öğrenme Kağıdının Yazarı Amid Fish tarafından derlenen teknik bir blogdur.

Tercüme | Huang Da Moonsea Zhao Pengfei Redaksiyon | Chen Junya Bitirme | Wu Xuan

Geçen yıl, OpenAI ve DeepMind, o zamanki en havalı deneyi yapmak için bir araya geldi. Temsilciyi eğitmek için klasik ödül sinyallerini kullanmak yerine, insan geribildirimine dayalı yeni bir pekiştirmeli öğrenme yöntemiydi. İnsan Tercihlerinden Öğrenen bu deneye adanmış bir blog var Orijinal makale "İnsan Tercihlerinden Derin Güçlendirmeli Öğrenme" (insan tercihlerine dayalı derin pekiştirmeli öğrenme).

Biraz derin takviye öğrenimiyle, tahta çubukları ters takla atmaları için de eğitebilirsiniz.

Bazı öneriler gördüm: Kağıtları yeniden üretmek, makine öğrenimi yeteneğini geliştirmek için iyi bir yoldur, bu benim için ilginç bir girişim. İnsan Tercihlerinden öğrenmek gerçekten çok ilginç bir proje, onu yeniden üretmekten çok mutluyum ama geriye dönüp baktığımda bu deneyim beklediğimden farklı.

Ayrıca makaleyi yeniden üretmek istiyorsanız, derin pekiştirmeli öğrenmeye yönelik bazı hususlar şunlardır:

· · ·

Öncelikle, genel olarak konuşursak, Pekiştirmeli öğrenme, beklediğinizden çok daha karmaşıktır .

Nedenin büyük bir kısmı, pekiştirmeli öğrenmenin çok hassas olmasıdır. Doğru şekilde ele alınması gereken birçok ayrıntı var ve eğer doğru değilse neyin yanlış gittiğini söylemeniz zor olacaktır.

Durum 1: Temel gerçekleştirme tamamlandıktan sonra eğitim başarı olmadan gerçekleştirildi. Bu soru için çeşitli fikirlerim var, ancak bunun nedeni 1. ana aşamadaki uyarmanın ve piksel verilerinin düzenlenmesi. Sonrasında neyin yanlış gittiğini bilsem de, izlenecek net bir yol bulamadım: Piksel verilerine dayanan teşvik öngörücünün ağ doğruluğu gerçekten çok iyiydi. Dikkatini bulmadan önce teşvik tahmin aracını dikkatlice kontrol etmem uzun zaman aldı. Düzenleme hatalarını teşvik etmek. Sorunun nedenini bulmak tesadüftü, çünkü küçük bir hata fark ettim ve doğru yolu buldum.

Durum 2: Son kod temizliğini yaparken Dropout ile ilgili bir hata yaptığımı fark ettim. Teşvik tahmin ağı, giriş olarak bir çift video klibi alır ve her video klip, paylaşılan ağırlıklara sahip iki ağ tarafından aynı şekilde işlenir. Her ağa Dropout eklerseniz ve yanlışlıkla her ağa aynı rastgele çekirdeği sağlamayı unutursanız, her ağ için Dropout'tan gelen ağ farklı olacaktır, bu nedenle video klipler aynı olmayacaktır. İlgilenildi. Tahmin ağının doğruluğu tamamen aynı görünse de, aslında orijinal ağ eğitimini tamamen yok ediyor.

Hangisi kötü? Ben de anlayamıyorum

Bunun sık sık meydana gelen bir şey olduğunu düşünüyorum (örneğin: "Derin Pekiştirmeli Öğrenim Henüz Çalışmıyor"). Benim kazancım, Bir pekiştirmeli öğrenme projesine başladığınızda, teorik olarak bir matematik probleminin tuzağına düşmek gibi bir ikilemle karşılaşırsınız. . Bu benim her zamanki programlama deneyimime benzemiyor: Sıkıştığınız yerde, genellikle takip etmeniz gereken net bir ipucu vardır ve en fazla birkaç gün içinde bundan kurtulabilirsiniz. Bu daha çok zor bir sorunu çözmeye çalışırken, bariz bir ilerleme yok, tek yol, anahtar kanıtı bulana kadar veya önemli bir ilham bulana kadar her türlü girişimi denemektir, cevabı bulmanıza izin verin.

Yani sonuç şudur: Şüphe duyduğunuzda, mümkün olduğunca ayrıntılara dikkat edin.

Bu projede birçok nokta var ve tek ipucu önemsiz şeylere dikkat etmekten geliyor. Örneğin, bazen çerçeveler arasındaki farklılıkları özellik olarak kullanmak etkilidir. Yeni özellikleri doğrudan kullanmak cazip geliyor, ancak kullandığım basit ortam üzerinde neden bu kadar büyük bir etkisi olduğunu bilmediğimi fark ettim. Ancak bu tür bir kafa karışıklığı altında, arka plan sıfırlandıktan sonra çekilen kareler arasındaki farkın, düzenlileştirme problemini ortaya çıkaracağını bulabiliriz.

İnsanları bundan nasıl haberdar edeceğimi bilmiyorum ama şu an için en iyi tahminim:

  • Kafanızın karışmasının nasıl bir his olduğunu anlamayı öğrenin . Pek çok "doğru değil" duygusu vardır. Bazen kodun çirkin olduğunu bilirsiniz. Bazen yanlış şeylerle zaman kaybetme endişesi yaşayın. Ama bazen beklemediğiniz bir şey görürsünüz: kafa karışıklığı. Sorunu tespit edebilmeniz için rahatsızlığın derecesini tam olarak anlayabilmeniz önemlidir.

  • Karışıklıkta ısrar etme alışkanlığı geliştirin. Geçici olarak göz ardı edilebilecek bazı rahatsızlıklar vardır (örneğin: prototip geliştirme sürecinde kod kokusu), ancak kafa karışıklığı göz ardı edilemez. Kafanız karıştığında sebebini bulmaya çalışmak önemlidir .

Ayrıca, birkaç haftada bir sorun için hazırlıklı olmak en iyisidir. Sebat ederseniz, küçük detaylara dikkat ederseniz ve kendinize güvenirseniz karşı tarafa geçebilirsiniz.

· · ·

Geçmiş programlama deneyimindeki farklılıklardan bahsetmişken, ikinci büyük öğrenme deneyimi Uzun yineleme süreleri altında çalışmak için gereken düşünme biçimindeki farklılıklar .

Hata ayıklama dört temel adımı içeriyor gibi görünüyor:

  • Sorunun olasılığı hakkında ilgili kanıtları toplayın

  • Konuyla ilgili bir hipotez oluşturun (şimdiye kadar topladığınız kanıtlara dayanarak)

  • En olası hipotezi seçin, düzeltmeyi uygulayın ve ne olacağını görün

  • Sorun ortadan kalkana kadar yukarıdaki adımları tekrarlayın.

Daha önce yaptığım programlamaların çoğunda, hızlı geri bildirime alıştım. Bir şey işe yaramazsa, bir değişiklik yapabilir ve birkaç saniye veya dakika içinde nasıl bir fark yarattığını görebilirsiniz. Bu kanıtı toplamak kolaydır.

Aslında, hızlı geri bildirim durumunda, kanıt toplamak bir hipotez oluşturmaktan çok daha kolaydır. İlk fikri kısa sürede doğrulayabildiğiniz zaman, olgunun nedeni olsa bile, neden her şeyi dikkatle düşünerek 15 dakika harcayasınız? Başka bir deyişle: hızlı geri bildirim alabiliyorsanız, çok düşünmenize gerek yok, denemeye devam edin.

Bir deneme stratejisi kullanırsanız, her deneme için 10 saat sürer ve bu çok zaman alan bir uygulamadır. Ya son sefer başarılı olmazsa? Şey, bazen işlerin böyle olduğunu kabul ediyorum. Sonra tekrar kontrol edeceğiz. Ertesi sabah tekrar gelin: Hala işe yaramıyor musunuz? Tamam, belki başka bir tane, o zaman tekrar çalıştıralım. Bir hafta sonra sorunu çözmediniz.

Aynı anda birden fazla çalıştırma yapmak, her seferinde farklı şeyler denemek bir dereceye kadar yardımcı olacaktır. Ancak a) Kümeleri kullanamadığınız sürece, bulut bilişimde çok para ödeyebilirsiniz (aşağıya bakın); b) Yukarıda bahsedilen pekiştirmeli öğrenmenin zorlukları nedeniyle, çok hızlı yinelemeye çalışırsanız, her zaman Ne tür bir kanıta ihtiyacınız olduğunu anlamayın.

Bir çok deneyden ve birkaç düşünceden birkaç denemeye ve bir çok düşünceye, Verimlilikte önemli bir değişikliktir. Uzun bir yineleme süresinde hata ayıklarken, tüm olasılıkların ne olduğu, ne kadar olası göründükleri ve şimdiye kadar yapılanlara dayanarak hipotez oluşturan adımlar oluşturmaya gerçekten çok zaman ayırmanız gerekir. Her şeyi görmek, ne kadar olası göründüklerini. 30 dakika veya bir saat sürse bile mümkün olduğunca çok zaman harcayın. Hipotez alanını olabildiğince eksiksiz ve zenginleştirdikten sonra, deneye ancak hangi kanıtın farklı olasılıkları en iyi şekilde ayırt etmenize izin verdiğini bildikten sonra başlayabilirsiniz.

(Projeyi bir yan proje olarak görüyorsanız, bu konuyu dikkatlice düşünmek özellikle önemlidir. Bu proje üzerinde günde sadece bir saat çalışırsanız ve her yineleme bir gün sürerse, haftalık çalışma sayısı daha çok Nadir bulunan mallardan tam anlamıyla yararlanmalısınız. Operasyonun sonuçlarını nasıl iyileştireceğinizi düşünmek için her gün çalışma zamanınızı sıkmak çok streslidir. Bu yüzden fikrinizi değiştirin ve ben olana kadar herhangi bir operasyonu başlatmak yerine birkaç gün düşünerek geçirin "Sorun nedir" varsayımı şu ana kadar oldukça güvenlidir.)

Daha fazla düşünmek istiyorsanız, yapmaya devam edin Daha ayrıntılı çalışma günlüğü Çok önemli bir kısımdır. İlerleme süresi birkaç saatten az olduğunda, çalışma günlüğünün olmaması önemli değildir, ancak daha uzunsa, denediğinizi kolayca unutabilirsiniz ve sonuç yalnızca yerinde dönebilir. Özetlediğim günlük biçimi:

Günlük 1: Hangi spesifik çıktıya sahibim?

Günlük 2: Cesurca düşünün, örneğin mevcut sorunla ilgili varsayımlar, sonra ne yapmalıyım?

Günlük 3: Mevcut işlemin bir kaydını yapın ve her işlem için hangi soruların yanıtlanması gerektiğini kısaca hatırlatın.

Log 4: Çalıştırma sonuçları (TensorBoard grafiği, diğer önemli gözlemler), çalıştırma türüne göre sınıflandırılır (örneğin: aracı eğitimi sırasında ortama göre)

Başlangıçta nispeten az günlüğüm vardı, ancak projenin sonunda tavrım "düşündüğüm her şeyi kaydetme" eğilimindeydi. Zaman maliyeti yüksek olsa da, buna değer olduğunu düşünüyorum. Nedenin bir kısmı, bazı hata ayıklamaların sonuçlarının ve fikirlerinin çapraz referans verilmesi, genellikle günler veya haftalar ile ayrılması ve kısmen de (en azından bu benim izlenimim) Ölçek yükseltme, etkili düşünmenin genel bir iyileştirmesine dönüştürülür.

Tipik günlük

· · ·

amacıyla Deneysel sonuçları en üst düzeye çıkarın , Deney sırasında iki şey yaptım, bunlar gelecekte bir rol oynayabilir.

Her şeyden önce, Tüm göstergeleri kaydedin Böylece, her çalışmada toplanan kanıt miktarını en üst düzeye çıkarabilirsiniz. Eğitim / doğrulama doğruluğu gibi bazı belirgin göstergeler vardır. Elbette, beyin fırtınası yapmak ve olası sorunları teşhis etmek için diğer göstergeleri incelemek için çok zaman harcamak önemlidir.

Bu tavsiyede bulunmamın bir nedeni de geriye dönük önyargıdır, çünkü hangi göstergelerin daha önce kaydedilmesi gerektiğini biliyordum. İleri aşamada hangi göstergelerin yararlı olacağını tahmin etmek zordur. Bununla birlikte, faydalı olabilecek stratejik yaklaşımlar şunlardır:

Sistemdeki her önemli bileşen için neyin ölçülebileceğini düşünün. Bir veritabanınız varsa, ne kadar hızlı büyüdüğünü ölçün. Bir kuyruk varsa, öğelerin işlenme hızını ölçün.

Her karmaşık işlem için, farklı parçaların ne kadar sürdüğünü ölçün. Bir eğitim döngünüz varsa, her partinin çalışması için gereken süreyi ölçün. Karmaşık bir muhakeme süreciniz varsa, her bir alt sebep için harcanan zamanı ölçün. Bu zamanlar, gelecekteki performans hata ayıklaması için çok yararlı olacaktır ve bazen bulunması zor olan bazı diğer hatalar bulunabilir. (Örneğin, bazı sonuçları daha uzun ve daha uzun görüyorsanız, bunun nedeni bir bellek sızıntısı olabilir.)

Aynı şekilde, farklı bileşenlerin bellek kullanımını analiz etmeyi düşünün. Küçük bellek sızıntıları çeşitli şeylere işaret edebilir.

Başka bir strateji, diğer insanların neyi ölçtüğünü gözlemlemektir. Derin pekiştirmeli öğrenme bağlamında, John Schulman'ın Nuts and Bolts of Deep RL konuşmasında bazı iyi önerileri var. Politika gradyan yöntemi için, politika entropisinin, eğitimin tekrar yapılıp yapılmayacağını yansıtabilen ve her eğitimin ödülünden çok daha hassas olan iyi bir gösterge olduğunu buldum.

Sağlıksız ve sağlıklı stratejilerin entropi diyagramı. Arıza modu 1 (sol): Sabit entropiye yakınsama (rastgele bir davranış alt kümesi seçin); Arıza modu 2 (orta): Sıfır entropiye yakınsayın (her seferinde aynı eylemi seçin). Sağda: Başarılı bir masa tenisi antrenman çalışmasının strateji entropisi

Kaydedilen ölçümlerde şüpheli bir şey gördüğünüzde, bazı veri yapılarının verimsiz bir uygulaması olarak ele almak yerine, yanlışlıkla önemli olduğunu varsaymak yerine, kafa karışıklığına dikkat etmeyi unutmayın. (Saniyedeki kare sayısındaki küçük ama açıklanamayan azalmayı görmezden geldim, bu da aylarca çok iş parçacıklı hatalara neden oldu.)

Tüm ölçümleri tek bir yerde görebiliyorsanız, hata ayıklama çok daha kolaydır. Mümkün olduğunca Tensorboard kullanmayı seviyorum. Metrikleri kaydetmek için Tensorflow'u kullanmak zordur, bu nedenle, herhangi bir ek ayar arayüzü olmadan basit bir arayüz tflog (anahtar, değer) sağlayan easy-tf-log'u görüntülemeyi düşünün.

Anlamlı görünen ikinci şey ise Önceden başarısızlığı denemek ve tahmin etmek için zaman harcayın .

Geriye dönük önyargı sayesinde, deneyi gözden geçirirken başarısızlığın nedeni genellikle açıktır. Ancak asıl sinir bozucu olan şey, başarısızlık modunun siz ne olduğunu gözlemlemeden önce zaten görünür olmasıdır. Bir modeli eğitmeye başladığınızda ve başarısız olduğunu görmek için ertesi gün geri gelmenizi beklediğinizde, başarısızlığın nedenini incelemeden önce, "Ah, frobulatörü kurmayı unuttuğum için olmalı" mı?

Basit olan şey şu ki, bazen bu yarı geriye bakışı gerçekleştirmeyi önceden tetikleyebiliyorsunuz. Çalışmaya başlamadan önce durup beş dakika boyunca neyin yanlış gidebileceğini düşünmek için bilinçli bir çaba gerekir. Bence en kullanışlı komut dosyaları: 2

1. Kendinize şunu sorun: "Başarısız olursam ne kadar şaşırırdım?"

2. Cevap "çok şaşırmadıysa", o zaman gelecekteki bir senaryoda olduğunuzu hayal edin - bu çalışma başarısız oldu ve sonra kendinize "Başarısız olursa, sorun nedir?" Diye sorun.

3. Aklınıza gelen herhangi bir yeri düzeltin

4. 1. sorunun cevabı "çok şaşırana" (veya en azından "ne kadar şaşırdık ne kadar şaşırttı") kadar yukarıdaki adımları tekrarlayın.

Her zaman tahmin edemeyeceğiniz hatalar olacaktır ve bazen yine de bazı bariz önlenebilir hataları görmezden geleceksiniz, ancak bu yöntem en azından, önceden düşünmediğiniz için yapacağınız çok aptalca hataların bazılarını azaltıyor gibi görünüyor.

· · ·

Sonunda, Bu proje ile ilgili en şaşırtıcı şey, aldığı süredir Ve gerekli bilgi işlem kaynakları.

Başlangıçta yan proje olarak 3 ay süreceğini tahmin etmiştim. Ama aslında yaklaşık 8 ay sürdü. (İlk tahmin aslında çok kötümserdir!) Nedenin bir kısmı, her bir aşamanın alabileceği zamanı hafife almasıdır, ancak en büyük küçümseme proje dışındaki diğer şeyleri tahmin etmemesidir. Bu çıkarımın ne kadar katı olduğunu söylemek zor. Ancak yan projeler için, ilk tahmini sürenizi ikiye katlayın (zaten karamsar olarak tahmin edilmiştir) Belki de iyi bir deneyim şeklidir.

Daha da şaşırtıcı olan, her aşamada harcanan gerçek zamandır. İlk proje planımın ana aşamaları için zaman çizelgesi temelde aşağıdaki gibidir:

Bu, her aşamada harcanan gerçek zamandır

Kodu yazmak uzun zaman aldığından değil, kodda hata ayıklamaktır. Aslında, sözde basit bir ortamda çalıştırmak, ilk uygulama süresinin 4 katını aldı. (Bu, arka arkaya birkaç saat geçirdiğim ilk yarı zamanlı projedir, ancak kazanılan deneyim geçmiş makine öğrenimi projelerine benzer.)

(Not: Başlangıçtan itibaren, pekiştirme öğrenimi için hayal ettiğiniz "basit" ortamı dikkatlice tasarlayın. Özellikle, dikkatlice düşünün: a) Ödülünüzün, görevi çözmek için doğru bilgiyi gerçekten verip veremeyeceğini; b) ödülün yalnızca şunlara bağlı olup olmadığını Önceki gözlemler hala mevcut eylemlere bağlıdır. Aslında, keyfi ödül tahminleri yapıyorsanız, ikincisi de ilgili olabilir, örneğin, bir eleştirmen kullanarak)

Diğeri, gereken toplam bilgi işlem kaynağı miktarıdır . Okul kümesini kullanabildiğim için çok şanslıyım Makinede sadece CPU olmasına rağmen bazı işler için iyi. GPU gerektiren görevler için (bazı küçük parçalarda hızlı yineleme gibi) veya küme çok meşgul olduğunda, deney için iki bulut hizmeti kullanıyorum: Google bulut bilişim motoru sanal makinesi, FloydHub.

GPU makinesine yalnızca kabuk üzerinden erişmek istiyorsanız, Google Cloud Computing Engine hala iyi, ancak FloydHub'da daha fazlasını deniyorum. FloydHub, temelde makine öğrenimine adanmış bir bulut bilişim hizmetidir. Floyd run python awesomecode.py komutunu çalıştırın, FloydHub bir kapsayıcı başlatacak, kodunuzu yükleyecek ve kodunuzu çalıştıracaktır. FloydHub'ın bu kadar güçlü olması için iki temel faktör vardır:

Konteyner, GPU sürücüleri ve ortak kitaplıklar ile önceden yüklenmiştir. (2018'de bile, Google Cloud Computing Engine sanal makinesinde TensorFlow'u güncellerken CUDA sürüm sorunları ile ilgilenmek için saatler harcadım.)

Her çalıştırma otomatik olarak arşivlenir. Her çalıştırma için, kullanılan kod, kodu çalıştırmak için kullanılan komut, komut satırından herhangi bir çıktı ve herhangi bir çıktı verisi otomatik olarak kaydedilir ve bir web arayüzü aracılığıyla dizine eklenir.

Resim FloydHub'ın web arayüzünü göstermektedir. Yukarıda: Geçmiş çalıştırmalar dizini ve tekli çalıştırmalara genel bakış. Aşağıda: Her çalışmada kullanılan kod ve çalıştırmadan elde edilen tüm veri çıktıları otomatik olarak arşivlenir.

İkinci noktanın önemini ifade edemem. Herhangi bir proje için, bu uzun vadeli ve ayrıntılı operasyonları kaydetme ve önceki deneyleri yeniden oluşturma becerisi kesinlikle gereklidir. Versiyon kontrol yazılımı da yardımcı olabilse de, a) büyük miktarda çıktıyı yönetmek çok zordur; b) büyük özen gerektirir. (Örneğin, bazılarını çalıştırmaya başlarsanız, ardından küçük bir değişiklik yapıp bir başkasını çalıştırırsanız, ilk çalıştırmanın sonuçlarını gönderdiğinizde hangi kodun kullanıldığını biliyor musunuz?) Dikkatlice notlar alabilir veya kendinizi kontrol edebilirsiniz. Sistem, ancak FloydHub'da çok fazla enerji harcamanızı gerektirmez.

FloydHub ile ilgili beğendiğim diğer yönler:

  • Çalıştırma bittiğinde, konteyner otomatik olarak kapanacaktır. İşlemin tamamlanıp tamamlanmadığını ve sanal makinenin kapatılıp kapatılmadığını kontrol etme konusunda endişelenmeyin.

  • Ödeme, Google Cloud'dan daha doğrudandır. Örneğin 10 saat öderseniz sanal makineniz 10 saat hemen şarj edilecektir. Bu, haftalık bütçeyi kolaylaştırır.

FloydHub ile karşılaştığım sorunlardan biri, kabı özelleştirememesidir. Kodunuzun çok sayıda bağımlılığı varsa, her çalıştırmadan önce bu bağımlılıkları yüklemeniz gerekir. Bu, kısa vadeli çalışmalarda yineleme oranını sınırlar. Ancak, bu bağımlılıkları yükledikten sonra dosya sistemi değişikliklerini içeren bir "veri kümesi" oluşturarak ve ardından bu dosyaları her çalışmaya başladığınızda bu dosyaları "veri kümesinden" kopyalayarak (örneğin, create_floyd_base.sh) bu sorunu çözebilirsiniz. Bu garip olsa da, yine de GPU sürücüsü sorununu çözmekten daha iyidir.

FloydHub, Google Cloud'dan biraz daha pahalıdır: FloydHub'daki bir K80 GPU makinesi 1,2 ABD doları iken, Google Cloud'da benzer şekilde yapılandırılmış bir makinenin maliyeti yalnızca 0,85 ABD dolarıdır (61G belleğe sahip bir makineye ihtiyacınız yoksa daha düşüktür). Bütçeniz gerçekten sınırlı olmadıkça, FloydHub'ın sağladığı ekstra rahatlığın fiyata değer olduğunu düşünüyorum. Tek bir büyük sanal makinede birden çok hesap çalıştırabileceğiniz için Google Cloud, yalnızca çok sayıda hesaplamayı paralel olarak çalıştırırken daha düşük maliyetlidir.

(Üçüncü seçenek, Google'ın K80 GPU makinelerinde ücretsiz olarak erişilebilen bir Jupyter dizüstü bilgisayar sağlamaya eşdeğer olan yeni Colaboratory hizmetidir. Ancak bu Jupyter tarafından geciktirilmeyecektir: herhangi bir komutu uygulayabilir ve eğer Gerçekten isterseniz, kabuk erişimini ayarlayabilirsiniz. En büyük dezavantajı, tarayıcı penceresini kapatırsanız kodunuzun çalışmaya devam etmemesi ve ayrıca dizüstü bilgisayarı barındıran konteyner sıfırlanmadan önce ne kadar süre çalışabileceğine dair bir sınırlama olmasıdır. Uzun süreli kullanım için uygun değildir, ancak GPU üzerinde çalışan hızlı prototipleme için yararlıdır.)

Bu projenin toplam maliyeti:

  • Google Compute Engine 150 saat GPU çalışma süresi ve 7.700 saat CPU çalışma süresi (gerçek süre x çekirdek sayısı) ,

  • FloydHub 292 saat GPU çalışma süresi,

  • Ve benim üniversite kümem 1500 saat CPU çalışma süresi (gerçek süre, 4 ila 16 çekirdek).

Bu projeyi uyguladıktan sonraki 8 ay içinde bunun yaklaşık sürdüğünü görünce şaşırdım. 850 USD (FloydHub'da 200 dolar ve Google Cloud Computing Engine'de 650 dolar harcadım).

Sebeplerden bazıları beceriksiz olmamdır (yukarıdaki Yavaş Yinelemeli Düşünme bölümüne bakın). Bunun nedenlerinden bazıları, pekiştirmeli öğrenmenin hala çok verimsiz olması ve çalıştırılmasının uzun sürmesidir (her seferinde bir Pong ajanını eğitmek 10 saate kadar sürer).

Ancak nedeninin büyük bir kısmı, bu projenin son aşamasında bir kaza ile karşılaşmış olmam: Takviyeli öğrenme istikrarlı olmayabilir ve performansı belirlemek için farklı rastgele tohumlarla birçok kez çalışmamız gerekir.

Örneğin, temelde her şeyin yapıldığını düşündüğümde, bu ortamda uçtan uca testler yapacağım. Ama en basit ortamı kullanıyor olmama rağmen, bir noktayı meydanın merkezine taşımak için eğitirken yine de çok büyük bir sorunla karşılaştım. Bu yüzden ayarlama yapmak için FloydHub'a geri döndüm ve üç kopya çalıştırdım.Mükemmel hiperparametrelerin yalnızca üç testte bir kez başarılı olduğunu düşünüyorum.

Rastgele tohumların 2 / 3'ünün başarısız olması nadir değildir (kırmızı / mavi)

Gerekli hesaplama miktarı için size sezgisel bir rakam vereceğim:

  • A3C ve 16 personel kullanan Pong'un 10 saatlik eğitime ihtiyacı var;

  • 160 saat CPU zamanı alır;

  • 3 rastgele sayı tohumunu çalıştırmak, CPU için 480 saat (20 gün) gerektirir.

Maliyet yönü:

  • FloydHub saatte 0,50 ABD doları ücret alır ve 8 çekirdekli ekipman kullanır;

  • Yani her 10 saatlik çalışma 5 dolar olarak ücretlendirilir;

  • Aynı anda 3 farklı rastgele sayı tohumu çalıştırın ve her çalıştırmanın maliyeti 15 dolar.

Fikrinizi her doğruladığınızda 3 sandviç harcamaya eşdeğerdir. .

Yine, "Derin Takviyeli Öğrenme Henüz Çalışmıyor" makalesinden de anlaşılacağı gibi, bu istikrarsızlık normal ve kabul edilebilir görünüyor. Aslında, "beş rastgele tohum (genel bir standart) sonuçların anlamlı olduğunu göstermek için yeterli olmasa da, dikkatli bir seçim yaparak, örtüşmeyen güven aralıkları elde edersiniz."

(Birdenbire, OpenAI Scholar Programı tarafından sağlanan 25.000 $ 'lık AWS kredileri o kadar çılgın görünmüyor. Birisine verdiğiniz miktarla ilgili olabilir, bu yüzden hesaplamalar için endişelenmeyin.)

Demek istediğim, Derinlemesine bir pekiştirmeli öğrenme projesini çözmek istiyorsanız, ne yaptığınızı bildiğinizden emin olun. Ne kadar zamana ve ne kadara mal olacağına hazırlıklı olduğunuzdan emin olun.

· · ·

Genel olarak, bir yan proje olarak pekiştirmeli öğrenim üzerine bir kağıt hazırlamak ilginçtir. Tersine bakarak, hangi becerilerin öğrenildiğini de düşünebilirsiniz.Ayrıca, bir makaleyi birkaç ay içinde yeniden üretmenin faydalı olup olmadığını da bilmek istiyorum.

Öte yandan, makine öğrenimindeki araştırma yeteneğimin büyük ölçüde geliştirilmediğini hissediyorum (geçmişe bakıldığında, aslında amacım budur), ancak uygulama becerisi geliştirildi.Araştırmada oldukça fazla zorluk ortaya çıkarıyor gibi görünüyor Pek çok ilginç ve özel fikir; bu fikirler, üzerinde harcanan zamanın değerli olduğunu hissettirecek. İlginç bir fikir üretmek bir sorun gibi görünüyor a) çok sayıda kavrama ihtiyaç var, b) keskin bir iyi fikir veya fikir duygusu (örneğin, toplum için ne tür bir çalışma faydalı olacaktır). Yukarıdaki hedeflere ulaşmak için, etkili makaleleri okumak, özetlemek ve eleştirel bir şekilde analiz etmek iyi bir uygulama olduğunu düşünüyorum.

Bu yüzden bu projeden aldığım ana sonucun şu olduğunu düşünüyorum: İster mühendislik becerilerinizi ister araştırma becerilerinizi geliştirmek isteyin, dikkatlice düşünmeye değer . Her ikisine de sahip olduğunuz bir durum yoktur; ancak belirli bir yönü zayıflığınızsa, seviyenizi geliştirmek için bu öğeyi özel olarak hedefleyen bir proje bulabilirsiniz.

Bu becerilerin ikisini de geliştirmek istiyorsanız, daha iyi bir yol, çok sayıda makale okumak, ilgilendiğiniz ve açık kodlara sahip makaleler bulmak ve bunları uygulamaya veya genişletmeye çalışmak olabilir.

· · ·

Derin bir pekiştirme öğrenme projesi yapmak istiyorsanız, işte dikkat etmeniz gereken bazı ayrıntılar.

Yeniden üretmek için bazı araştırma makaleleri bulun

Nispeten tek bilgi puanına sahip bazı makaleler bulun ve birlikte çalışmak için birden fazla bilgi noktası gerektiren kağıtlardan kaçının;

Takviye öğrenme

  • Büyük bir sistemin parçası olarak pekiştirmeli öğrenme algoritmaları kullanan bir proje yapıyorsanız, pekiştirmeli öğrenme algoritmalarını kendiniz yazmaya çalışmayın. Bu ilginç bir zorluk olsa da çok şey öğrenebilirsiniz, ancak pekiştirmeli öğrenme yeterince istikrarlı değildir. Takviye öğrenme algoritmanızda bir hata olduğundan veya sisteminizde bir hata olduğundan sisteminizin çalışıp çalışmadığını belirlemek imkansız olabilir.

  • Herhangi bir şey yapmadan önce, ortamınızda aracı eğitimini basitleştirmek için temel algoritmaları nasıl kullanacağınızı kontrol edin.

  • Gözlemleri standartlaştırmayı unutmayın, bu gözlemler her yerde kullanılabilir.

  • Bir şey yaptığınızı hissettiğinizde, mümkün olan en kısa sürede uçtan uca bir test yazın. Başarılı eğitim, beklediğinizden daha kırılgan olabilir.

  • OpenAI Gym ortamını kullanıyorsanız, -v0 ortamını kullanmaya dikkat edin.Geçerli işlemin göz ardı edilmesi ve önceki işlemin tekrarlanması (ortamın kesinliğini azaltmak için)% 25 şansı vardır. Çok fazla rastgelelik istemiyorsanız, lütfen -v4 ortamını kullanın. Ayrıca, varsayılan ortamın size emülatörden bir seferde yalnızca 4 kare sağladığını unutmayın; bu, önceki DeepMInd kağıdı ile tutarlıdır. Bunu istemiyorsanız, lütfen NoFrameSkip ortamını kullanın. Bu tamamen kararlı bir ortam olduğu için, gerçekte sunduğu şey, emülatörde size verilenle tamamen aynıdır.Örneğin, PongNoFrameskip-v4'ü kullanabilirsiniz.

Genel makine öğrenimi

  • Uçtan-uca testlerin çalışması uzun zaman alıyor. Daha sonra büyük ölçekte yeniden düzenleme yapmak isterseniz, çok zaman kaybedersiniz. İlk çalıştırdığınızda yapmak, önce hesaplamak ve yeniden yapılandırmayı sonraya saklamaktansa yapmak daha iyidir.

  • Bir modülü başlatmak 20 saniye sürer. Örneğin, gramer hataları nedeniyle vakit kaybetmek gerçekten bir baş ağrısıdır. IDE geliştirme ortamından hoşlanmıyorsanız veya yalnızca kabuğun komut satırı penceresinde düzenleme yapabiliyorsanız, editörünüz için bir Linter oluşturmak için zaman ayırmaya değer. (Vim için, Pylint ve Flake8 ile ALE'yi seviyorum. Flake8 daha çok bir biçim denetleyicisi gibidir. Pylint'in bulamadığı sorunları bulabilir, örneğin bir işleve yanlış parametreler aktarabilir.) Neyse, linterde biraz zaman geçirin Araçta, çalıştırmadan önce aptal bir hata bulunabilir.

  • Sadece bırakma konusunda dikkatli olmak zorunda değilsiniz, aynı zamanda doğru paylaşım ağını uygularken ekstra dikkatli olmanız da gerekiyor - bu aynı zamanda toplu normalleştirmedir. Ağda eşleştirilmesi gereken çok sayıda normalleştirilmiş istatistik ve ek değişken olduğunu unutmayın.

  • İşlem sırasında sık sık bellek zirvesini görüyor musunuz? Doğrulama grubu boyutunuz çok büyük olabilir.

  • Adam'ı optimize edici olarak kullanırken garip şeyler olduğunu görürseniz, bunun nedeni Adam'ın momentum parametresi olabilir. RMSprop gibi momentum parametresi olmayan bir optimize edici kullanmayı deneyin veya momentum parametresini maskelemek için 1 = 0 ayarlayın.

TensorFlow

  • Hata ayıklamak ve hesaplama grafiğinin ortasındaki bazı düğümlere ne olduğunu görmek istiyorsanız, her çalışmanın giriş değerini yazdırmak için tf.Print öğesini kullanın.

  • Çıkarılan denetim noktalarını kaydediyorsanız, optimize edici parametrelerini göz ardı ederek çok fazla alan kazanabilirsiniz.

  • session.run çok pahalıdır. Gruplar halinde aramaya çalışın.

  • Aynı makinede birden fazla TensorFlow örneği çalıştırırsanız, bir GPU bellek yetersizliği hatası alırsınız. Bunun nedeni muhtemelen örneklerden birinin tüm bellek alanını kaplamaya çalışmasıdır, modelinizin çok büyük olması değil. Bu, TensorFlow'un varsayılan yaklaşımıdır. TensorFlow'a bellek alanını yalnızca gerektiği gibi kullanmasını söylemeniz gerekir. Allow_growth işlemine başvurabilirsiniz.

  • Aynı grafiğe birden çok işlemden eriştiğiniz gibi, birçok şey çalışırken bir grafiğe zamanında erişmek istiyorsanız, ancak aynı anda yalnızca bir işlemin ilgili işlemleri gerçekleştirmesine izin veren bir kilit vardır. Bu, Python'un ağır işler yapmadan önce TensorFlow'un kilidi serbest bıraktığı küresel yorum kilidinden önemli ölçüde farklı görünüyor. Bundan emin değilim ve ayrıntılı hata ayıklama için zamanım yok. Ancak aynı durumla da karşılaşırsanız, birden fazla işlem kullanabilir ve grafiği her bir işleme kopyalamak için dağıtılmış TensorFlow kullanabilirsiniz, bu daha kolay olacaktır.

  • Python kullanırken taşma konusunda endişelenmenize gerek yok, ancak TensorFlow'u uygularken çok dikkatli olmalısınız:

GPU kullanılamadığında, CPU'ya geçmek için lütfen allow_soft_placement'ı kullanın. Ara sıra yazdığınız kod GPU'da çalışamazsa, sorunsuz bir şekilde CPU'ya geçebilir. Örneğin:

Bunun gibi kaç işlemin GPU'da çalışamayacağını bilmiyorum, ancak güvenlik için CPU'ya manuel olarak geçin, örneğin:

Sağlıklı zihin

  • TensorBoard'a bağımlı olmayın. Ciddiydim. Bu, öngörülemeyen ödül bağımlılığının mükemmel bir örneğidir: Operasyonunuzun nasıl yürüdüğünü ve devam ettiğini kontrol ettiğinizde, bazen kontrol ederken aniden ikramiyeyi vurursunuz! Bu çok heyecan verici. TensorBoard'u belirli zamanlarda kontrol etme isteğiniz varsa, o zaman sizin için makul bir kontrol aralığı belirlemek için bir kural belirlemelisiniz.

· · ·

Bu makaleyi tereddüt etmeden okursanız, harika!

Ayrıca derin takviyeli öğrenme alanına da girmek istiyorsanız, başlarken başvurabileceğiniz bazı kaynaklar şunlardır:

  • Andrej Karpathy's Deep Reinforcement Learning: Pong from Pixels, motivasyon ve sezgi oluşturmaya iyi bir giriş niteliğindedir.

  • Pekiştirmeli öğrenme teorisi hakkında daha fazla bilgi edinmek için David Silver'ın konuşmasına bakabilirsiniz. Bu ders derin pekiştirmeli öğrenme (sinir ağlarına dayalı pekiştirmeli öğrenme) hakkında pek fazla içeriğe sahip değildir, ancak en azından size birçok kelime öğretecek ve ilgili makaleleri anlamanıza yardımcı olacaktır.

  • John Schulman'ın Nuts and Bolts of Deep RL konuşmasında birçok pratik uygulama önerisi vardır ve bu sorunlarla daha sonra karşılaşabilirsiniz.

Derin takviye öğrenme alanında neler olduğunu anlamak için şu içeriklere başvurabilirsiniz:

  • Alex Irpanın Derin Güçlendirmeli Öğrenimi İşe Yaramıyor Henüz mevcut duruma iyi bir genel bakış sunuyor.

  • Vlad Mnih's Recent Advances and Frontiers in Deep RL, Alex'in makalesinde bahsedilen problemleri çözmek için birçok pratik örneğe sahiptir.

  • Sergey Levine'nin Derin Robotik Öğrenme konuşması, robotların genellemesini ve örnek verimliliğini iyileştirmeye odaklandı.

  • Pieter Abbeel, 2017 NIPS Konferansı'nda Robotik için Derin Öğrenme üzerine bir açılış konuşması yaptı ve en son derin pekiştirmeli öğrenme teknolojilerinin çoğundan bahsetti.

Lei Feng Subtitle Group işe alıyor, aşağıdaki QR kodunu tarayın ve bize katılmak için "Lei Feng Subtitle Group + Name" not edin. Lei Feng Ağı Lei Feng Ağı

Yeni Yılda tabana gitmek
önceki
İPhone satın almak için yeni yerler: Apple Store Tianhui 1 Aralık'ta açıldı
Sonraki
Bu askeri eğitim! "Dünün Mavi Gökyüzü" filmi eğlenceli ve genç bir kalp çekiyor
Makine öğreniminin bilmesi gereken 5 derin öğrenme çerçevesi
Song Zhenin cümlesi sadece başlangıç ve Wang Baoqiangın "Mutlu Çiçek" e giden yolu devam edecek!
Mi 5C casus fotoğrafları tekrar ortaya çıktı: aşırı dar çerçeve güzel, fiyatı 999 yuan olabilir
Ideal ONE mevcut zorlukların üstesinden gelebilir ve seri üretime ulaşabilir mi?
Açık dünya ve özgünlük hakkında konuşurken, "Shenmue 3" devasa yeni zeka geliyor
Etki alanı adları ve ticari markalar sıklıkla kayıtlıdır! "Resmi duyuru" gibi bu ateşli çevrimiçi kelimelerin neden bu kadar sihirli gücü var?
Binlerce insansız hava aracı bir "telaş" içinde hareket ediyor; Volkswagen, Didi ile bir ortak girişim kuracak; LeEco Video Uygulaması şu anda yasadışı reklamlarla kumar oynuyor | Lei Feng Morning Po
Tianjin Ekonomik ve Teknolojik Kalkınma Bölgesi liderleri Huaqiang Akıllı Ev Uluslararası Ticaret Merkezini ziyaret etti
OnePlus 3T bir randevu açar: 30 Kasım'da başlayın!
"Wu Shuang" "İnsan Hazinesi Chow Yun Fa" nın sırrını tamamen ortaya koyuyor
Elektrikli araçlar ile yakıtlı araçların ısı dağılımı arasındaki fark nedir?
To Top