Python və Keras ilə hallucinogenic dərin möhkəmləndirmənin öyrənilməsi

Dünya Modelləri ilə avtomobil yarışları və atəş oyunundan qaçınmağı mənimsəyən bir maşını öyrət

Süni intellekt sizin işinizdirsə, aşağıdakıları yoxlamaq lazımdır:

https://arxiv.org/abs/1803.10122

Bir sözlə, üç səbəbə görə şah əsərdir:

  1. Təəccüblü bir nəticə əldə etmək üçün dərinləşdirmə / möhkəmləndirmələri öyrənmək üçün müxtəlif üsulları birləşdirir - möhkəmləndirmələri öyrənmək üçün 'avtomobil yarışları' üçün populyar təlim mühitini həll edən ilk məlum agent.
  2. Asanlıqla əldə edilə bilən bir üslubda yazılmış, qabaqcıl AI ilə maraqlanan hər kəs üçün əla bir öyrənmə mənbəyi halına gətirmişdir
  3. Çözümü özünüz kodlaşdıra bilərsiniz

Bu yazı kağız vasitəsilə addım-addım təlimatdır.

Texniki məlumatları nəzərdən keçirəcəyik və bir kompüterinizdə necə bir versiya hazırladığınızı və işləməyinizi göstərəcəyik.

AlphaZero-dakı yazıma bənzər, mən məqalə müəllifləri ilə əlaqəli deyiləm, sadəcə onların böyük əsərlərinin şərhlərini bölüşmək istədim.

Addım 1: problem

2D yarış yerində bir avtomobil idarə etməyi bacaran bir möhkəmləndirmə öyrənmə alqoritmini ("agent") inkişaf etdirəcəyik. Bu mühit (avtomobil yarışı) OpenAI idman salonu vasitəsilə mümkündür

Hər addımda, alqoritm bir müşahidə aparır (nəqliyyat vasitəsinin və yaxın ərazinin 64 x 64 piksellik rəngli görünüşü) və görüləcək növbəti tədbirlər dəstini - xüsusən sükan istiqamətini (-1 ilə 1) qaytarmalı olur. , Sürətlənmə (0 ilə 1) və əyləc (0 ilə 1).

Bu hərəkət daha sonra növbəti müşahidəni qaytaran və dövrü yenidən başlayan mühitə ötürülür.

Bir agent ziyarət edilən N track plitələrinin hər biri üçün 1000 / N alır və yerinə yetirilən hər addım üçün -0.1. Məsələn, agent yolu 732 kadrda tamamlayırsa, mükafat 1000-0.1 * 732 = 926.8 bal təşkil edir.

Budur, agentin ilk 200 dəfə addımlar üçün [0.1 0], sonra təsadüfi bir şey seçməsi ... əla sürücülük strategiyası deyil.

Məqsəd, agenti yetişdirməkdir ki, ətrafındakı məlumatlardan növbəti ən yaxşı hərəkəti müəyyənləşdirə bilsin.

Addım 2: həll

Müəlliflər tərəfindən yazılmış metodologiyanın əla bir interaktiv onlayn izahı var, buna görə burada eyni səviyyəli detala girməyəcəyəm, əksinə konteksti izah etmək üçün real sürücülük bənzətməsi ilə ümumiləşdirməyə diqqət edirəm. niyə həll intuitiv mənada olur.

Həll ayrı-ayrılıqda öyrədilən üç fərqli hissədən ibarətdir:

Fərqli bir avtomobil kodlayıcısı (BƏƏ)

Sürücülük zamanı qərar qəbul edərkən, hər "piksel" inizi fəal şəkildə analiz etməyin. Bunun əvəzinə, beyniniz vizual məlumatları yolun düzlüyü, yaxınlaşan əyilmələr və növbəti hərəkətinizi məlumatlandırmaq üçün yola münasibətiniz kimi daha az sayda "gizli" elementlərə toplayır.

BƏƏ-nin hazırladığı şey budur - 64x64x3 (RGB) giriş görüntüsünü Gauss bölgüsünü izləyən 32 ölçülü gizli vektora (z) sıxışdırmaq.

Bu faydalıdır, çünki agent indi ətrafının daha kiçik bir nümayəndəliyi ilə işləyə bilər və buna görə daha səmərəli şəkildə öyrənə bilər.

Qarışıq sıxlığı şəbəkə çıxışı qatı olan təkrarlanan neyron şəbəkə (MDN-RNN)

Qərar verməyinizdə bir MDN-RNN komponentiniz yox idisə, sürücünüz bu kimi görünə bilər.

Avtomobil sürərkən, hər hansı bir sonrakı müşahidə sizin üçün tam təəccüblü deyil. Bilirsiniz ki, hazırkı müşahidə sola dönməyi təklif edirsə və sükanı sola çevirsəniz, növbəti müşahidə hələ də yolunuzla davam etdiyinizi göstərir.

Bu irəli düşünmə RNN-nin vəzifəsidir - xüsusi olaraq bu uzun müddətli qısamüddətli yaddaş şəbəkəsi (LSTM), 256 gizli vahid. Gizli vəziyyətlərin vektoru h ilə təmsil olunur.

BƏƏ kimi, RNN öz mühitindəki nəqliyyat vasitəsinin hazırkı vəziyyəti barədə gizli bir anlayış əldə etməyə çalışır, lakin bu dəfə növbəti "z" -ün əvvəlki "z" və "z" -ə əsaslanaraq nə kimi görünə biləcəyini proqnozlaşdırmaq məqsədi ilə. əvvəlki hərəkət.

MDN çıxış səviyyəsi sadəcə növbəti "z" -ün əslində bir neçə Gauss bölgüsündən birindən çəkilə biləcəyini nəzərə alır.

Əl yazısı üçün MDN

Eyni yazı bu yazıda eyni yazıçı tərəfindən qələmin növbəti ucunun fərqli qırmızı sahələrdən birinə enə biləcəyini təsvir etmək üçün əl yazısı üçün istifadə edilmişdir.

Eynilə, Dünya Models nəşrində, növbəti müşahidə olunan gizli vəziyyət beş Qauss bölgüsünün birindən çəkilə bilər.

Nəzarətçi

Hələlik bir fəaliyyət seçimi haqqında heç bir şey demədik. Bu məsuliyyət nəzarətçinin üzərinə düşür.

Nəzarətçi, girişin z (BƏƏ uzunluğu 32-dən indiki gizli vəziyyət) və h (RNN uzunluğunun gizli vəziyyəti 256) olduğu bir sıx bağlı bir sinir şəbəkəsidir. 3 çıxış neyronu üç hərəkətə uyğundur və müvafiq sahələrə düşmələri üçün ölçülür.

Bir dialoq

Üç komponentin fərqli rollarını və necə birlikdə işlədiyini başa düşmək üçün onlar arasında bir dialoq təsəvvür edə bilərik:

Dünya model memarlığının diaqramı (mənbə: https://arxiv.org/pdf/1803.10122.pdf)
BƏƏ: (ən geci 64 * 64 * 3 kimi görünür) Bu, azacıq sola dönən, avtomobil yola (z) yönəldilmiş düz yola bənzəyir.
RNN: Bu təsvirə (z) və nəzarətçinin son dəfə addımda (hərəkətdə) güclü bir sürət seçdiyini nəzərə alaraq gizli vəziyyətimi (h) yeniləyirəm ki, növbəti müşahidənin hələ də düz xətt olduğu proqnozlaşdırılır. Küçə, ancaq bir az daha göz qabağında.
Nəzarətçi: VAE (z) və RNN (h) indiki gizli vəziyyətinin təsvirinə əsaslanaraq, neyron şəbəkəm növbəti hərəkət olaraq [0.34, 0.8, 0] çıxdı.

Bu hərəkət daha sonra yenilənmiş bir müşahidəni qaytaran və dövrü yenidən başlayan mühitə ötürülür.

İndi avtomatik yarış agentinin öz versiyasını hazırlamaq üçün bir mühitin necə qurulacağını araşdıracağıq.

Kod üçün vaxt!

Addım 3: mühitinizi qurun

Yüksək keyfiyyətli bir noutbuk varsa, həllini yerli olaraq işlədə bilərsiniz. Ancaq qısa fasilələrlə istifadə edə biləcəyiniz güclü kompüterlərə daxil olmaq üçün Google Cloud Compute-dan istifadə etməyi məsləhət görürəm.

Aşağıdakı Linux-da sınaqdan keçirilmişdir (Ubuntu 16.04) - bir Mac və ya Windows-da işlədiyiniz təqdirdə paketin quraşdırılması üçün müvafiq əmrləri dəyişdirin.

  1. Anbarı klonlaşdırın

Komut satırında, depo saxlamaq istədiyiniz yerə gedin və aşağıdakıları daxil edin:

git klonu https://github.com/AppliedDataSciencePartners/WorldModels.git

Repozitoriya, Dünya Modelləri kağızının ilk müəllifi David Ha tərəfindən hazırlanmış olduqca faydalı estool kitabxanasına əsaslanır.

Sinir şəbəkəsi təhsili üçün, bu tətbiq, müəlliflər orijinal sənəddə xam tensor axını istifadə etsələr də, bir tensor axını geriyə malik Keras istifadə edir.

2. Virtual mühit qurun

Python 3 virtual mühiti yaradın (mən virutalenv və virtualenvwrapper istifadə edirəm)

sudo apt-get quraşdırma python-pip sudo pip quraşdırmaq virtualenv sudo pip quraşdırmaq virtualenvwrapper ixrac WORKON_HOME = ~ / .virtualenvs mənbə /usr/local/bin/virtualenvwrapper.sh mkvirtualenv --python = / usr / bin / python3 dünya

2. Paketləri quraşdırın

sudo apt-get santimetr qurğusu python3-dev zlib1g-dev python-opengl mpich xvfb xserver-xephyr vnc4server

3. Tələblər.txt faylını quraşdırın

cd WorldModels boru kəmərinin quraşdırılması - -r tələbləri.txt

Avtomobil yarış nümunəsinin tələb etdiyindən daha çox şey var, ancaq əlavə paket tələb edən digər Açıq AI idman salonlarını sınamaq istəsəniz hər şeyi quraşdırmısınız.

Addım 4: təsadüfi silsilələr yaradın

Avtomobil yarışları mühitində həm BƏƏ, həm də RNN-də təsadüfi yayma məlumatları ola bilər, yəni. H. Hər addımda təsadüfi hərəkətlər nəticəsində yaranan müşahidə məlumatları. Əslində, avtomobili başlanğıc xəttindən çıxmaq üçün sürətləndirməyə məcbur edən yalançı təsadüfi hərəkətlərdən istifadə edirik.

BƏƏ və RNN qərar qəbul edən qurumdan müstəqil olduqları üçün, etməli olduğumuz hər şeyin müxtəlif müşahidələrə rast gəldiyimizə və təlim məlumatları olaraq yadda saxlamaları üçün müxtəlif tədbirlər seçdiyimizə əmin olmaq.

Təsadüfi silsilələri yaratmaq üçün əmr satırından aşağıdakıları edin

python 01_generate_data.py car_racing - ümumi_episode 2000 - start_batch 0 - vaxt_step 300

və ya ekran olmadan bir serverdəsinizsə,

xvfb çalışan -a -s "ekran 0 1400x900x24" piton 01_generate_data.py car_racing - ümumi_episodlar 2000 - start_batch 0 - vaxt_step 300

Bu, yığma nömrəsi 0-dan başlayaraq 2000 çəkilişə (hər biri 200 qramdan 10 dəstə) gətirib çıxarır. Hər yayınma maksimum 300 dəfə addım atır

Faylların iki dəsti ./data-da saxlanılır (* dəstə nömrəsidir).

obs_data _ *. npy (64 * 64 * 3 şəkilləri Numpy serial kimi saxlayır)

fəaliyyət_data _ *. npy (üçölçülü hərəkətləri saxlayır)

Addım 5: BƏƏ-yə məşq edin

BƏƏ-nin təhsili üçün yalnız obs_data _ * sənədləri. Npy tələb olunur. Bu sənədlərin "./data" qovluğunda olması üçün 4-cü addımı bitirdiyinizdən əmin olun.

Komanda xəttində aşağıdakıları edin:

python 02_train_vae.py - start_batch 0 --max_batch 9 - Yeni_model

Bu 0-dan 9-a qədər hər məlumat yığını üçün yeni bir BƏƏ hazırlayır.

Model çəkiləri ./vae/weights.h5 altında saxlanılır. - - Yeni_model bayrağı skriptə modeli sıfırdan öyrətməyi tapşırır.

Bu qovluqda bir çəki.h5 varsa və - yeni_model bayrağı göstərilməyibsə, skript bu fayldakı çəki yükləyir və mövcud modeli hazırlamağa davam edir. Bu yolla BƏƏ-ni tədricən və hamısını bir dəfə məşq edə bilərsiniz.

./Vae/arch.py ​​faylında BƏƏ memarlıq spesifikasiyası.

Addım 6: RNN məlumatları yaradın

Təcrübəli BƏƏ-yə sahib olduqdan sonra RNN üçün təlim dəsti yaratmaq üçün istifadə edə bilərik.

RNN, BƏƏ-dən kodlu görüntü məlumatlarını (z) və BƏƏ-nin giriş və kodlu görüntü məlumatlarını çıxış olaraq bir addım qabaqlayaraq tələb edir.

Aşağıdakıları etməklə bu məlumatları yarada bilərsiniz:

python 03_generate_rnn_data.py - start_batch 0 --max_batch 9

Bu obs_data _ * sənədlərini düzəldəcəkdir. Npy və fəaliyyət_data _ *. Npy-ni 0-dan 9-a qədər olan dayaqlardan təlim üçün RNN tərəfindən tələb olunan düzgün formata çevirdi.

Faylların iki dəsti ./data-da saxlanılır (* dəstə nömrəsidir).

rnn_input _ *. npy (birləşdirilmiş vektorları saxlayır)

rnn_output _ *. npy (z vektorunu bir addım qabaqlayır)

Addım 7: RNN yetişdirin

RNN-nin təhsili üçün yalnız rnn_input _ * sənədləri. Npy və rnn_output _ *. Npy tələb olunur. Bu sənədlərin "./data" qovluğunda olması üçün 6-cı addımı bitirdiyinizdən əmin olun.

Komanda xəttində aşağıdakıları edin:

python 04_train_rnn.py - start_batch 0 --max_batch 9 - Yeni_model

0-dan 9-a qədər hər məlumat yığını üçün yeni bir RNN hazırlayır.

Model çəkiləri ./rnn/gewichte.h5 altında saxlanılır. - - Yeni_model bayrağı skriptə modeli sıfırdan öyrətməyi tapşırır.

BƏƏ-yə bənzər olaraq, skript bu fayldakı ağırlıqları yükləyir və bu qovluqda mövcud çəki.h5 varsa - - yeni_model bayrağı göstərilməyibsə mövcud modeli hazırlamağa davam edir. Bu yolla, bir keçiddə deyil, yığınlarda RNN-ni iterativ şəkildə məşq edə bilərsiniz.

RNN memarlıq spesifikasiyası ./rnn/arch.py ​​sənədindədir.

8-ci addım: nəzarətçini yetişdirin

İndi əyləncə hissəsi üçün!

Bu günə qədər, yalnız ölçülü şəkilləri aşağı ölçülü gizli məkana və gizli məkanın zamanla necə inkişaf edəcəyini təxmin edə bilən RNN-i birləşdirən BƏƏ yaratmaq üçün yalnız dərin öyrənmədən istifadə etdik. Bu, təsadüfi yayma məlumatları əsasında hər bir məşq üçün bir dəst yarada bildiyimiz üçün mümkün oldu.

Nəzarətçini yetişdirmək üçün CMA-ES (Covariance Matrix Adaptation - Təkamül Strategiyası) adlı bir təkamül alqoritmindən istifadə edən möhkəmləndirmə öyrənmə formasından istifadə edirik.

Giriş 288 (= 32 + 256) bir vektor olduğundan və çıxış 3 ölçülü bir vektor olduğundan, 288 * 3 + 1 (qərəzli) = 867 parametr öyrədilməlidir.

CMA-ES əvvəlcə 867 parametrin ("əhali") təsadüfi başlatılmış bir neçə nüsxəsini yaradır. Sonra yerli əhalinin hər bir üzvünü sınayır və orta ballarını qeyd edir. Təbii seçmə ilə eyni prinsipə uyaraq, ən yüksək bal toplayan çəkilər "çoxalır" və sonrakı nəsilləri istehsal edə bilər.

Bu əməliyyatı kompüterinizdə başlatmaq üçün arqumentlər üçün uyğun dəyərlərlə aşağıdakı əmri işə salın

python 05_train_controller.py car_racing --num_worker 16 --num_worker_trial 2 --num_episode 4 --max_length 1000 --eval_steps 25

və ya ekranı olmayan bir serverdə:

xvfb-run -s "-screen 0 1400x900x24" piton 05_train_controller.py car_racing --num_worker 16 --num_worker_trial 2 --num_episode 4 --max_length 1000 --eval_steps 25

- işçi 16: Buradakı mövcud nüvələrin sayından çoxunu təyin etməyin

- 2 nömrəli iş_trial 2: Hər bir işçinin sınaqdan keçirəcəyi əhali üzvlərinin sayı (num_worker * num_work_trial hər nəsil üçün ümumi say ölçüsünü verir)

-num_episode 4: Əhalinin hər bir üzvünün vurulduğu epizodların sayı (yəni hesab bu epizodların sayına görə orta mükafatdır).

--max_length 1000: Bir epizodda maksimum addım addımlarının sayı

--eval_steps 25: 100 epizodda ən yaxşı çəki dəstini qiymətləndirmək arasındakı nəsillərin sayı

--init_opt ./controller/car_racing.cma.4.32.es.pk Varsayılan olaraq nəzarətçi hər dəfə əvvəldən başlayır və prosesin cari vəziyyətini nəzarətçi qovluğunda bir turşu faylında saxlayır. Bu mübahisə ilə müvafiq faylı istinad edərək son qənaət nöqtəsindən başlayaraq təlimə davam edə bilərsiniz.

Hər nəsildən sonra alqoritmin hazırkı vəziyyəti və ən yaxşı çəkilər dəsti ./controller qovluğunda çıxır.

9-cu addım: vizual agent

Yazı zamanı, 200 təlim nəslindən sonra orta hesabla ~ 833.13 səviyyəsinə çatmaq üçün agent hazırlamağı bacardım. Bu təlimdə verilmiş addımlar və parametrlər ilə bir Ubuntu 16.04, 18 vCPU, 67.5 GB RAM maşın istifadə edərək Google Cloud'da öyrədilmişdir.

Yazı müəllifləri 2000 nəsil təhsildən sonra ortalama ~ 906 səviyyəsinə çatdılar ki, bu da bu mühitdə ən yüksək dəyər hesab olunur. Biraz daha yüksək bir spesifikasiya istifadə edildi (məs: 10.000 təlim məlumatı, 64 sakin, 64 nüvəli kompüter, hər test üçün 16 epizod və s.).

Nəzarətçinizin cari vəziyyətini görmək üçün sadəcə aşağıdakıları edin:

python model.py car_racing - fayl adı ./controller/car_racing.cma.4.32.best.json --render_mode --record_video

- Filename: nəzarətçiyə əlavə etmək istədiyiniz çəkilərin jsonuna gedən yol

--render_mode: ekranınızdakı mühiti göstərir

- Record_video: mp4 fayllarını ./video qovluğuna çıxarır və hər bir epizodu göstərir

--final_mode: Nəzarətçinizdən 100 epizod test edin və orta hesabı çap edin.

Budur demo!

10-cu addım: halüsinogen öyrənmə

Olduqca əladır - amma kağızın növbəti hissəsi təəccüblü dərəcədə təsir edici və fikrimcə, Aİ-yə çox təsir edir.

Kağız fərqli bir mühitdə inanılmaz bir nəticə göstərir, DoomTakeCover. Məqsəd atəş agentlərini yayındırmaq üçün bir agenti daşımaq və mümkün qədər uzun müddət diri qalmaqdır.

Müəlliflər, agentin ətraf mühitin özündə deyil, BƏƏ / RNN-dən ilhamlanmış halüsinogen xəyallarında oyunu necə öyrənməsinin necə olduğunu göstərirlər.

Tələb olunan yeganə əlavə, növbəti dəfə addımda ölüm ehtimalını təxmin etmək üçün RNN yetişdirməkdir. Bu şəkildə, VAE / RNN birləşməsi müstəqil bir mühit kimi qablaşdırıla bilər və nəzarətçini öyrətmək üçün istifadə olunur. Bu "dünya modeli" nin həqiqi anlayışıdır.

Hallucinogenic öyrənməni aşağıdakı kimi ümumiləşdirə bilərik:

Agentin ilkin təlim məlumatları real mühitlə təsadüfi qarşılıqlı əlaqələrdən başqa bir şey deyil. Bu, dünyanın "necə işlədiyini", təbii qruplaşmalarını, fizikasını və öz hərəkətlərinin dünyanın vəziyyətinə necə təsir etdiyini gizli bir anlayış yaradır.
Bu anlayışdan sonra real dünyada sınaqdan keçmədən müəyyən bir tapşırıq üçün optimal strategiya hazırlamaq üçün istifadə edilə bilər, çünki mühitin öz zehni modelini sınamaq üçün "oyun meydançası" kimi istifadə edə bilər.

Bu asanlıqla gəzməyi öyrənən bir körpənin təsviri ola bilər. Sadəcə bənzətmələrdən daha dərinə gedə biləcək diqqətəlayiq oxşarlıqlar var ki, bu da tədqiqat sahəsini həqiqətən maraqlı sahəyə çevirir.

Xülasə

İnşallah bu məqaləni faydalı hesab edirsiniz - hər hansı bir yazma səhvlərini tapmısınızsa və ya kod bazasında və ya məqalədə hər hansı bir sualınız varsa, aşağıdakı şərhlərdə mənə bildirin və ən qısa zamanda sizə müraciət edəcəm.

Şirkətimizin şirkətlər üçün yenilikçi məlumat elmi həllərinin necə inkişaf etdirməsi haqqında daha çox məlumat əldə etmək istəyirsinizsə, veb saytımızdan və ya birbaşa LinkedIn-dən bizə müraciət etməkdən çekinmeyin.

... Və əgər istəsəniz, bir neçə ürəkaçan təpikləri buraxmaqdan çəkin.

Tətbiqi Məlumat Elmi, Londonda fəaliyyət göstərən bir konsaltinq şirkətidir ki, müəssisələr üçün hərtərəfli məlumat elmi həllərini tətbiq edir və ölçülə bilən dəyəri verir. Məlumatlarınızla daha çox iş görmək istəyirsinizsə, bu barədə danışaq.