SpaceX Falcon 9 Roketini RL kullanarak indirmek !

Ugurkan Ates
Jun 28, 2020 · 8 min read

Tekrar Kullanılabilir Roketler

cosmosmagazine.com Roketlerle ilgili daha detaylı bilgi almanız için

Falcon 9, havacılık ve uzay şirketi SpaceX tarafından geliştirilip üretilen bir roket modeli. Bu roketi özel kılan şey ise kalkışta bundan önce her kalkışta kalkış sonrası çöpe atılan ve milyonlar kaybedilen ilk aşama kapsülünü hasarsız biçimde yere indirebilmesi.

Bir zamanlar inanılmaz derece uçuk gelen bu başarı “düz dünya toplulukları” gibi inanmayanları bir araya toplamıştı fakat 30'dan fazla atıştan sonra bu arkadaşlar ortalıktan kaybolup gittiler.

Bugün size roket mühendisliği verecek kapasite de değilim fakat bunun inanılmaz bir mühendislik başarısı olduğunu görmek içinde buna gerek yok. Aşağıda ki diagramda roketin aşamalarını inceleyebilirsiniz. Daha detaylı anlatım içinde bir video bıraktım.

Detaylı video anlatım https://www.youtube.com/watch?v=Wn5HxXKQOjw
Detaylı video anlatım https://www.youtube.com/watch?v=Wn5HxXKQOjw

Bilinen hiçbir SpaceX roketinde AI teknolojileri henüz kullanılmıyor. Bunun sebebi AI teknolojilerinin henüz doğrulanmasının düzenli ve sistematik şekilde yapılamaması ve kanıtlanma konusunda eksiklerinin olması. Bu tarz milyar dolarlık projelerde ne yapacağı belli olmayan teknolojiler yerine inanılmaz derece net ve kanıtlabilir & tekrarlanabilir teknolojiler (klasik robotik ve kontrol teorisi yöntemleri) tercih ediliyor. Bu sebepten dolayı eğer bu alanlara ilgiliniz varsa klasik yöntemleri AI ile birlikte öğrenmenizi tavsiye ederim.

Genede biraz eğlence biraz da RL algoritmalarıyla elimizi ısındırmak amaçlı üretilen bu simülasyonda roket indirmeye kalkarsak ne olur ?

Simülasyon Ortamı

Pekiştirmeli Öğrenmeye yeniyseniz internette ve sayfamızda bulunan kaynaklara göz atmanızı öneririm. Bu yazıda belli başlı derin öğrenme , RL ve matematik kavramlarına hakim olduğunuz varsayılacaktır.

Sevgili Sven Niederberger(@EmbersArc GitHub) isimli arkadaşımız kısa bir süre önce bugün işleyeceğimiz zorlu Reinforcement Learning simülasyon ortamını hazırladı , kendisine teşekkür ediyorum buradan . Bunu yaratmasında ki amaç eğlenceli/gaza getirici bir ortam oluşturmakken zamanla ortamın zorluğundan dolayı benchmark/algoritmalarınızı denemetaşı haline geldi. LunarLander ortamından esinlenerek yapılmasına rağmen rastgele başlama noktaları sebebiyle çok daha zor olduğu fark edildi

Lunar Lander ortamını açıklayan bir görsel

LunarLander simülasyon ortamının 2 versiyonu bulunmakta.

Bunlardan biri diskrit aksiyon ortamı için diğeri ise sürekli devam eden

aksiyon ortamları için özelleştirilmiş.

Aksiyon değeri 2 reel sayı tutan vektör ve değer aralıkları -1 ile +1 arasında değişmekte.

  • Ana kontrol motoru , -1..0 kalkış, 0..+1 güç alma 50% ‘den 100% güce kadar.Motor 50% altında güçlerde çalışmamakta.
  • İkinci değer -(1.0..-0.5) sol motoru ateşlemek için gerekli değer , (+0.5..+1.0 )sağ motoru ateşlemek için alınması gereken değer (-0.5..0.5)

Ortamın diskrit aksiyon versiyonu sürekli kontrol versiyonuna göre daha kolay çözülebilmekte. Değer tabanlı methodlar ( DQN,Rainbow DQN, Duel DQN, Gorilla DQN, C51 gibi) bir yapay sinir ağıyla birleşip linear olmayan fonksiyon tahmini yapabiliyor. ( Diskrit aksiyon listesi aşağıda bulunuyor)

  • 0– Hiçbir şey yapma
  • 1– Sol Motoru Ateşle
  • 2– Aşağı Motoru Ateşle
  • 3– Sağ Motoru Ateşle

Fakat sürekli aksiyon değerleri kullanarak çözmek içinse çok daha komplex methodlara ihtiyacımız var. Bunun sebebi çok az seviyede yararlı ödül sinyali almak , ajanların etrafı gezmesinin zorlaşması ve DQN tarzı methodların stabil olmamasından kaynaklanıyor.

PPO+LSTM + Paralel Train(on policy method,cluster tarzında eğitim), Soft Actor Critic(SAC,off policy), DDPG ve D4PG(off policy- hibrit actor critic methodlar) bu algoritmalar problemin çözümünde kullanabilir. Politika tabanlı methodlara girecekseniz LSTM ve Attention mekanizmaları gibi yeni yeni pekiştirmeli öğrenmeyle birleştirilen konulara bakmanızı tavsiye ederim.Bu tarz çalışmalarınızı makale haline getirip SOTA ( state of the art, son teknoloji gibi düşünebilirsiniz) bile olabilirsiniz.

Bizim kullanacağımız Roket simülasyonu Box2D fizik motorunu kullanıyor ve genel olarak yapısı LunarLander ortamına benzemekte . Ortamı görüntülendirmek için openGL render motoru kullanılıyor fakat resimlerle eğitim yapılmıyor sadece görsel olarak size yardımcı olmak için eklenmiş

ORTAM DEĞİŞKENLERİ

Ortamda ajanımıza bilgi verecek bilgiler aşağıda ki gibi:

  • X pozisyonu
  • Y pozisyonu
  • Açı
  • Birinci ayak yere değme noktası belirteci
  • İkinci ayak yere değme noktası belirteci
  • Ateşleme değeri
  • Motor Gimbal Değeri

Eğer VEL_STATE(kod içerisinde) doğruya çekilmişse bunlara ek olarak aşağıda bulunan hız değerleri de ekleniyor:

  • X yönünde ki hız
  • Y yönünde ki hız
  • Açısal hız

Gözlemler bizim direk ajanı eğitmemiz için kullanışlı şekilde tasarlanmış.Fizik simülasyonundan alınan yukarda ki bilgiler ile ajanı rahatlıkla eğitip CNN gibi görsel veri üzerinden bilgi çıkarmamıza gerek kalmayacak. Ortam zaten yeterince zorlu , görsel veriyle uğraşsak bilgisayar gücü anlamında bayğaı zorlanacaktık. Amacımız kontrol mühendisliği / robotik açısından bunun gerçekliğini göstermek ve roketi indirmek olduğu için full bir sistem yapmak yerine görsel veri olmaması bizim işimize yarıyor.

Hız değerleri ile ilgili iki opsiyonuda denedim ve büyük bir fark olmamasına rağmen hız değerlerini aktif etmenizi öneririm. Ajanın öğrenmesi için gerekli ne kadar fazla bilgi olursa o kadar iyi.

Tüm değerler sistemin eğitiminde hızlı olması için normalize (sayılar) edildi.

Ödül hesaplaması aşağıda anlatıldığı üzere yapılıyor.Kod üzerinden de inceleyebilirsiniz. Roketin benzin bilgisi, göreceli pozisyon , ağırlık gibi bilgiler roket mühendisliği ve fizik kanunlarınca düşünülüp hangi durumlarda başladığına göre size göreceli bir ödül sinyali veriliyor. Simülasyon her başladığında sizi rastgele yerlerde başlatacağı için bu sistem zorunlu hale geliyor. Çünkü rastgele zorlu pozisyonlardan havadan atılldığınızda bile kurtulmanız için ödül sinyallerini alabilmeniz gerekiyor

# state variables for rewardif outside or brokenleg:if self.game_over:if landed:if done:
distance = np.linalg.norm((3 * x_distance, y_distance)) # weight x position more
speed = np.linalg.norm(vel_l)
self.game_over = True
done = True
self.landed_ticks += 1
reward += max(-1, 0-2 * (speed + distance + abs(angle) + abs(vel_a)))
elif not groundcontact:
reward -= 0.25 / FPS
else:
self.landed_ticks = 0
if self.landed_ticks == FPS:
reward = 1.0
done = True
else:
# reward shaping
shaping = -0.5 * (distance + speed + abs(angle) ** 2)
shaping += 0.1 * (self.legs[0].ground_contact + self.legs[1].ground_contact)
if self.prev_shaping is not None:
reward += shaping - self.prev_shaping
self.prev_shaping = shaping
groundcontact = self.legs[0].ground_contact or self.legs[1].ground_contact
brokenleg = (self.legs[0].joint.angle < 0 or self.legs[1].joint.angle > -0) and groundcontact
outside = abs(pos.x - W / 2) > W / 2 or pos.y > H
fuelcost = 0.1 * (0 * self.power + abs(self.force_dir)) / FPS
landed = self.legs[0].ground_contact and self.legs[1].ground_contact and speed < 0.1
done = False reward = -fuelcost reward = np.clip(reward, -1, 1)

Kontrol Girdileri

Diskrit kontrol girdileri :

  • Gimbal’i sola yatırma değeri
  • Gimbal’i sağa yatırma değeri
  • Yukarı Ateşleme Değeri
  • Aşağı Ateşleme Değeri
  • İlk ateşleyicilerin kullanılma değeri
  • İkinci ateşleyicilerin kullanılma değeri
  • Hiçbir şey yapma

Sürekli hareket için kontrol girdileri :

  • Gimbal’i açısal olarak SOL/SAĞ yatırma değeri
  • Ateşleyicileri YUKARI/AŞAĞI kaldırma değeri
  • Kontrol ateşleyicilerinin SOL/SAĞ değeri

Problem için 3 algoritma denedim. D4PG,SAC ve PPO . Her birinde yaşadığım deneyimlerini anlatacağım , tüm kodları repository üzerinden erişebilirsiniz , kod anlatımı yapmayacağım tek tek , daha çok ne tarz şeylere dikkat etmeniz gerekiyor bu kodları kullanırken buna değinmeye çalışacağım. Sürekli kontrol üzerinde çalıştım , diskrit aksiyon üzerine modifiye ederek kullanabilirsiniz

Tüm ajan kodları için PTan isimli PyTorch kütüphanesini kullanıyorum , sizede önerebilirim. Çoğu loglama,ajanların networklerini ayağa kaldırma , trajectory düzenlemesi ve birçok konuda yazılan sıkıcı kodlarla uğraşmamanızı sağlıyor. Bunun yerine önceden test edilmiş kodları kullanmanız zaten zor olan işi kolaylaştırmaya bir nebze yarıyor.

PyTorch AgentNet = https://github.com/Shmuma/ptan

D4PG ( Distributed Distributional Deep Deterministic Policy Gradient)

DDPG ve D4PG algoritmaları arasında ki küçük bir fark ortamı nasıl keşfettiklerine dayanıyor. DDPG algoritması Ornstein-Uhlenbeck Process adını verdiğimiz sistemi kullanıyor bu hesaplaması kompütasyon olarak daha zorlayıcı ve kodu karışıklaştıran bir yapı D4PG daha basit olan simple random normal(Gaussian) distribüsyonunu kullanıyor.

GAMMA = 0.99
BATCH_SIZE = 64
LEARNING_RATE = 1e-4
REPLAY_SIZE = 100000
REPLAY_INITIAL = 10000
REWARD_STEPS = 5
TEST_ITERS = 1000
Vmax = 10
Vmin = -10
N_ATOMS = 51
Hyper Parameters for D4PG

D4PG algoritmasıyla çalışan ajanı 1 milyon adım eğittimde sonuçların yeterince iyi olmadığını ve lokal optimaya takıldığını gördüm. Burda bir ilerleme olmayınca ajanı kaydedip diğer algoritmalara geçtim, aşağıda son hallerinden bir video bulunmakta. Bu algoritmanın (veya herhangi bir RL algoritmasının) eğitiminde hyper parametrelerle iyi oynamanız gerekebiliyor . Kodu ekledim ilgilenen ve benden iyi sonuç alacak arkadaşlar çıkabilir aramızdan .

Captain It’s a TRAP ! — Admiral Ackbar

Soft Actor Critic (SAC)

SAC şuan çıkmış model bağımsız algoritmalar arasında en iyilerinden biri. Özellikle sürekli hareket problemlerinde üstünden zaman geçmesine rağmen en iyilere kafa tutabilmekte. Özellikle getirdiği yenilikler şöyle:

Entropy Regülasyonu = Ajanın bir yere takılıp kalmaması için ne kadar kararsız olursa belirli bir bonus ödül alıyor. Buda lokal optimalara takılmamayı sağlıyor

Double Q Hilesi= Normalde eğitilen tek Q network(target gene aynı network amaçlı kullanılıyor) yerine tamamen ayrı 2 network ve bunların target networkları olan 2 network daha kullanılıyor. Bu değerlerden en küçük 2 tanesini seçip Bellman tahmin hesaplamasında bu değeri kullanıyorsunuz. Buda daha stabil bir eğitim süreci sağlıyor.

Bu algoritma daha muhafazakar politika değişimi(daha az değişiyor yani ani şeyler yapmıyor , kısıtlı) üzerine kurulmuş olan ( TRPO,PPO gibi) algoritmalar ile aynı yapıyı kullanıyor. Sadece fark olarak “toplam maksimum ödül” optimize etmekle kalmayıp kararsızlığıda maksimum hale optimize etmeye çalışıyor

Bu sadece hem politika tabanlı methodlar gibi stabil eğitiliyor , hemde değer tabanlı algoritmalar gibi eski deneyimleri kullanabiliyor ve daha kısa sürede eğitilebiliyor.İki tarafın en iyi yönleri yani

Rastgele noktalardan kurtulmak zor olduğu için bazen düşük ödül alınıyor

Roket Ortamı- Simülasyonu oldukça kompleks bir yapı, gerçek dünyaya göre özellikle daha karışık çünkü bir roketin rastgele hızlar ve konumlardan bırakılması felaket olabilirdi.

Ajanınızı eğitirken bunu göz önünde bulundurmanız gerekir yani bazı noktalardan kendini toparlayamaması normal. İsterseniz parametrelerle oynayıp daha gerçekçi , sadece belirli noktalardan bırakılan roket tasarlayabilirsiniz, kod üzerine oynama yapmanız gerekir.

Benim eğittiğim ajan 1 milyon adım aldı ve başarılı iniş yapabiliyordu.TESLA P100 (16GB VRAM and 21 TFlops of 16bit sistemi ile eğittim).

GAMMA = 0.99
BATCH_SIZE = 64
LR_ACTS = 1e-4
LR_VALS = 1e-4
REPLAY_SIZE = 100000
REPLAY_INITIAL = 10000
SAC_ENTROPY_ALPHA = 0.1
TEST_ITERS = 10000
Hyper parameters for Soft Actor Critic

PPO — Policy Proximal Optimization

PPO artık 3 yaşını almış eski bir algoritma ama hala bu tarz problemlerde ilk denenen algoritmalardan. Oldukça az değişkeni olduğu için optimal noktayı bulması kolay olabiliyor eğer yeterince eğitirseniz. Her zaman aklınızda olması gereken bir algoritma bu tarz problemlerde.

GAMMA = 0.99
GAE_LAMBDA = 0.95
TRAJECTORY_SIZE = 4097
LEARNING_RATE_ACTOR = 1e-5
LEARNING_RATE_CRITIC = 1e-4
PPO_EPS = 0.2
PPO_EPOCHES = 10
PPO_BATCH_SIZE = 256
TEST_ITERS = 100000
Hyper Parameters for PPO

Bu sefer diğer problemlere göre sınırları zorlamak istedim ve daha büyük bir trajeksiyon sayısı seçtim yani herhangi bir hesaplama yapmadan önce daha çok adım alacaktı. Bu bilgisayar gücü olarak yorucu bir iş ama ne tarz sonuç alacağımı görmek istedim ve sistemi 6 milyon adım eğittim

Fena olmayan inişler yapabiliyor eğitim sonu

Sonuç ve Düşünceler

Öncellikle herkese PTAN kütüphanesi ile haşır neşir olmasını öneriyorum. Çoğu sıkıcı ama gerekli olan sistemi (terminal durumlarda kontrol edilmesi,çoklu paralel eğitme, loglama vs) her şeyi içinde bulunduruyor. Sizin yapmanız gereken ajanınızı implement etmeniz.

Kendi ajanlarınızı oluşturabilirsiniz veya benimkilerin parametrelerini değiştirebilirsiniz.

Eğlenceli bir deneyim oldu benim için ,gerçekten zorlayıcı ve dinamik bir problem.Roketlerin rastgele noktalardan başlaması zorlayıcı ve eğitimde lokal optimalara sebep olabilyior. En stabil PPO ‘yu buldum sonra SAC ve en kötü olarak D4PG büyük olasılıkla benim beceriksizliğimden dolayı bu sonuçlar oldu :) , bu blog postunun ingilizce versiyonuda profilimde bulunmaktadır

GitHub repomdan kodlara erişebilirsiniz , ayrıca Google Colab üzerinde notebooklar oluşturdum bunlarla başlayabilirsiniz. Video kayıt ve loglama opsiyonları açık rahatça eğitimi izleyebilirsiniz.Anlamadığınız bir konu olursa bana ulaşabilirsiniz , README üzerinde kod kullanımı detaylı anlatılmaktadır. (repoya star atmayı unutmayın :)

Reinforcement Learning Turkiye

All things Reinforcement Learning

Reinforcement Learning Turkiye

All things Reinforcement Learning including model based , model free, robotics, genetic algorithms, custom environments, agents, RLtoSimulation and more !

Ugurkan Ates

Written by

Reinforcement Learning , GAN & CNN. Occasionally embedded software development stuff

Reinforcement Learning Turkiye

All things Reinforcement Learning including model based , model free, robotics, genetic algorithms, custom environments, agents, RLtoSimulation and more !