Peningkatan dalam Pembelajaran Q yang mendalam: Dueling Double DQN, Replay Experience Priority, dan tetap…

Artikel ini adalah sebahagian daripada Kursus Pembelajaran Pengukuhan Dalam dengan Tensorflow? ️. Lihat sukatan pelajaran di sini.

Dalam artikel terakhir kami mengenai Pembelajaran Deep Q dengan Tensorflow, kami menerapkan ejen yang belajar memainkan versi Doom yang mudah. Dalam versi video, kami melatih ejen DQN yang memainkan penceroboh Angkasa.

Namun, semasa latihan, kami melihat terdapat banyak perbezaan.

Deep Q-Learning diperkenalkan pada tahun 2014. Sejak itu, banyak penambahbaikan telah dilakukan. Jadi, hari ini kita akan melihat empat strategi yang bertambah baik - secara dramatik - latihan dan hasil ejen DQN kami:

  • sasaran Q tetap
  • DQN berganda
  • berduel DQN (aka DDQN)
  • Ulangan Pengalaman Diutamakan (aka PER)

Kami akan melaksanakan ejen yang belajar bermain koridor Doom Deadly. AI kita mesti menuju ke arah tujuan asas (rompi), dan memastikan mereka bertahan pada masa yang sama dengan membunuh musuh.

Memperbaiki sasaran Q

Teori

Kami melihat dalam artikel Pembelajaran Deep Q bahawa, ketika kita ingin mengira ralat TD (alias kerugian), kita mengira perbezaan antara sasaran TD (Q_target) dan nilai Q semasa (anggaran Q).

Tetapi kita tidak tahu mengenai sasaran TD yang sebenarnya. Kita perlu menganggarkannya. Dengan menggunakan persamaan Bellman, kami melihat bahawa sasaran TD hanyalah ganjaran untuk mengambil tindakan tersebut pada keadaan tersebut ditambah dengan nilai Q tertinggi yang didiskaunkan untuk keadaan seterusnya.

Namun, masalahnya ialah kita menggunakan parameter (bobot) yang sama untuk menganggar sasaran dan nilai Q. Akibatnya, ada korelasi besar antara target TD dan parameter (w) yang kita ubah.

Oleh itu, ini bermaksud bahawa pada setiap langkah latihan, nilai Q kita berubah tetapi juga perubahan nilai sasaran. Oleh itu, kita semakin hampir dengan sasaran kita tetapi sasarannya juga bergerak. Ia seperti mengejar sasaran yang bergerak! Ini membawa kepada ayunan besar dalam latihan.

Ia seperti jika anda seorang koboi (perkiraan Q) dan anda ingin menangkap lembu (sasaran Q) anda mesti semakin dekat (mengurangkan ralat).

Pada setiap langkah waktu, anda cuba mendekati lembu, yang juga bergerak pada setiap langkah waktu (kerana anda menggunakan parameter yang sama).

Ini membawa kepada jalan mengejar yang sangat pelik (ayunan besar semasa latihan).

Sebagai gantinya, kita dapat menggunakan idea sasaran Q tetap yang diperkenalkan oleh DeepMind:

  • Menggunakan rangkaian terpisah dengan parameter tetap (mari kita sebut w-) untuk menganggar sasaran TD.
  • Pada setiap langkah Tau, kami menyalin parameter dari rangkaian DQN kami untuk mengemas kini rangkaian sasaran.

Berkat prosedur ini, kita akan mempunyai pembelajaran yang lebih stabil kerana fungsi sasaran tetap tetap untuk sementara waktu.

Pelaksanaan

Melaksanakan sasaran q yang tetap cukup mudah:

  • Pertama, kami membuat dua rangkaian ( DQNetwork, TargetNetwork)
  • Kemudian, kami membuat fungsi yang akan mengambil DQNetworkparameter kami dan menyalinnya ke kamiTargetNetwork
  • Akhirnya, semasa latihan, kami mengira sasaran TD menggunakan rangkaian sasaran kami. Kami mengemas kini rangkaian sasaran dengan DQNetworksetiap taulangkah ( tauadalah parameter hiper yang kami tentukan).

DQN berganda

Teori

Double DQN, atau Double Learning, diperkenalkan oleh Hado van Hasselt. Kaedah ini mengatasi masalah penilaian nilai Q yang terlalu tinggi.

Untuk memahami masalah ini, ingat bagaimana kita mengira Sasaran TD:

Dengan mengira sasaran TD, kita menghadapi masalah sederhana: bagaimana kita yakin bahawa tindakan terbaik untuk keadaan seterusnya adalah tindakan dengan nilai Q tertinggi?

Kami tahu bahawa ketepatan nilai q bergantung pada tindakan apa yang kami cuba dan negara jiran yang kami terokai.

Akibatnya, pada awal latihan kami tidak mempunyai cukup maklumat mengenai tindakan terbaik yang harus diambil. Oleh itu, mengambil nilai q maksimum (yang berisik) sebagai tindakan terbaik untuk mengambil positif positif. Sekiranya tindakan tidak optimum secara berkala diberi nilai Q yang lebih tinggi daripada tindakan terbaik yang optimum, pembelajaran akan menjadi rumit.

Penyelesaiannya adalah: ketika kita menghitung target Q, kita menggunakan dua jaringan untuk memisahkan pemilihan tindakan dari penjanaan nilai Q sasaran. Kami:

  • gunakan rangkaian DQN kami untuk memilih tindakan terbaik apa yang akan diambil untuk keadaan seterusnya (tindakan dengan nilai Q tertinggi).
  • gunakan rangkaian sasaran kami untuk mengira nilai sasaran Q untuk melakukan tindakan tersebut pada keadaan seterusnya.

Oleh itu, Double DQN membantu kami mengurangkan penilaian nilai q yang berlebihan dan, sebagai akibatnya, membantu kami melatih lebih cepat dan mempunyai pembelajaran yang lebih stabil.

Pelaksanaan

Duel DQN (aka DDQN)

Teori

Ingat bahawa nilai-Q sesuai dengan seberapa baik berada di keadaan itu dan mengambil tindakan pada keadaan Q (s, a) itu.

Oleh itu, kita dapat menguraikan Q (s, a) sebagai jumlah:

  • V (s) : nilai berada pada keadaan itu
  • A (s, a) : kelebihan mengambil tindakan tersebut pada keadaan tersebut (betapa lebih baiknya tindakan ini berbanding semua tindakan lain yang mungkin berlaku di negara itu).

Dengan DDQN, kami ingin memisahkan penganggar kedua-dua elemen ini, menggunakan dua aliran baru:

  • yang mengira nilai keadaan V
  • satu yang mengira kelebihan untuk setiap tindakan A (s, a)

Dan kemudian kami menggabungkan dua aliran ini melalui lapisan agregasi khas untuk mendapatkan anggaran Q (s, a).

Tunggu? Tetapi mengapa kita perlu mengira kedua-dua elemen ini secara berasingan jika kita menggabungkannya?

Dengan mencabut anggaran, secara intuitif DDQN kami dapat mengetahui keadaan mana yang (atau tidak) bernilai tanpa harus mengetahui kesan setiap tindakan di setiap keadaan (kerana ia juga mengira V)

Dengan DQN biasa kita, kita perlu mengira nilai setiap tindakan pada keadaan tersebut. Tetapi apa gunanya jika nilai negeri itu buruk? Apa gunanya mengira semua tindakan pada satu keadaan apabila semua tindakan ini membawa kepada kematian?

Akibatnya, dengan mencabut kita dapat mengira V (s). Ini sangat berguna untuk negeri di mana tindakan mereka tidak mempengaruhi persekitaran dengan cara yang relevan. Dalam kes ini, tidak perlu mengira nilai setiap tindakan. Contohnya, bergerak ke kanan atau kiri hanya penting sekiranya terdapat risiko perlanggaran. Dan, di kebanyakan negeri, pilihan tindakan tidak mempengaruhi apa yang berlaku.

Akan lebih jelas jika kita mengambil contoh dalam makalah Dueling Network Architectures for Deep Reinforcement Learning.

Kami melihat bahawa aliran rangkaian nilai memberi perhatian (kabur oren) ke jalan, dan khususnya ke cakrawala di mana kereta itu dilahirkan. Ia juga memperhatikan skor.

Sebaliknya, aliran kelebihan pada bingkai pertama di sebelah kanan tidak banyak memperhatikan jalan, kerana tidak ada kereta di depan (jadi pilihan tindakan praktikal tidak relevan). Tetapi, pada kerangka kedua itu memperhatikan, kerana ada mobil tepat di depannya, dan membuat pilihan tindakan sangat penting dan sangat relevan.

Mengenai lapisan agregasi, kami ingin menghasilkan nilai q untuk setiap tindakan pada keadaan tersebut. Kami mungkin tergoda untuk menggabungkan aliran seperti berikut:

Tetapi jika kita melakukannya, kita akan jatuh ke dalammasalah pengenalpastian , iaitu - memandangkan Q (a, a) kita tidak dapat menemui A (s, a) dan V (s).

Dan tidak dapat menemui V (s) dan A (s, a) yang diberi Q (s, a) akan menjadi masalah bagi penyebaran belakang kita. Untuk mengelakkan masalah ini, kita dapat memaksa penganggar fungsi kelebihan kita untuk memiliki 0 kelebihan pada tindakan yang dipilih.

Untuk melakukannya, kami mengurangkan kelebihan rata-rata semua tindakan yang mungkin berlaku di negeri ini.

Oleh itu, seni bina ini membantu kita mempercepat latihan. Kita dapat mengira nilai keadaan tanpa mengira Q (s, a) untuk setiap tindakan pada keadaan tersebut. Dan ini dapat membantu kita mencari nilai Q yang jauh lebih dipercayai untuk setiap tindakan dengan melepaskan anggaran antara dua aliran.

Pelaksanaan

Satu-satunya perkara yang perlu dilakukan ialah mengubah suai seni bina DQN dengan menambahkan aliran baru ini:

Ulangan Pengalaman Diutamakan

Teori

Priorityized Experience Replay (PER) diperkenalkan pada tahun 2015 oleh Tom Schaul. Ideanya adalah bahawa beberapa pengalaman mungkin lebih penting daripada yang lain untuk latihan kita, tetapi mungkin berlaku lebih jarang.

Kerana kita mengambil sampel secara seragam (memilih pengalaman secara rawak) pengalaman kaya ini yang jarang berlaku hampir tidak mempunyai peluang untuk dipilih.

Itulah sebabnya, dengan PER, kami cuba mengubah taburan persampelan dengan menggunakan kriteria untuk menentukan keutamaan setiap tupel pengalaman.

Kami ingin mengambil pengalaman keutamaan di mana terdapat perbezaan besar antara ramalan kami dan sasaran TD, kerana ini bermakna kami harus banyak belajar mengenainya.

Kami menggunakan nilai mutlak besarnya kesalahan TD kami:

Dan kami meletakkan keutamaan itu dalam pengalaman setiap penyangga ulangan.

Tetapi kita tidak boleh melakukan keutamaan yang tamak, kerana akan selalu melatih pengalaman yang sama (yang mempunyai keutamaan besar), dan dengan demikian terlalu sesuai.

Oleh itu, kami memperkenalkan keutamaan stokastik, yang menghasilkan kebarangkalian dipilih untuk dimainkan semula.

Akibatnya, pada setiap langkah waktu, kita akan mendapatkumpulan sampel dengan taburan kebarangkalian ini dan latih rangkaian kami di atasnya.

Tetapi, kami masih mempunyai masalah di sini. Ingat bahawa dengan Replay Pengalaman biasa, kami menggunakan peraturan kemas kini stokastik. Akibatnya, cara kita mencuba pengalaman harus sesuai dengan sebaran yang mendasari.

Apabila kita mempunyai pengalaman normal, kita memilih pengalaman kita dalam taburan normal - secara sederhana, kita memilih pengalaman kita secara rawak. Tidak ada bias, kerana setiap pengalaman memiliki kesempatan yang sama untuk diambil, jadi kami dapat memperbarui bobot kami secara normal.

Tetapi , kerana kami menggunakan persampelan prioriti, persampelan rawak murni ditinggalkan. Akibatnya, kami memperkenalkan bias terhadap sampel dengan keutamaan tinggi (lebih banyak peluang untuk dipilih).

Dan, jika kita memperbaharui bobot kita secara normal, kita berisiko berlebihan. Sampel yang mempunyai keutamaan tinggi cenderung digunakan untuk latihan berkali-kali dibandingkan dengan pengalaman dengan keutamaan rendah (= berat sebelah). Akibatnya, kami akan mengemas kini bobot kami dengan hanya sebahagian kecil pengalaman yang kami anggap sangat menarik.

Untuk membetulkan bias ini, kami menggunakan bobot pensampelan penting (IS) yang akan menyesuaikan pengemaskinian dengan mengurangkan berat sampel yang sering dilihat.

Berat yang sepadan dengan sampel prioriti tinggi mempunyai penyesuaian yang sangat sedikit (kerana rangkaian akan melihat pengalaman ini berkali-kali), sedangkan yang sesuai dengan sampel dengan keutamaan rendah akan mendapat kemas kini penuh.

Peranan b adalah untuk mengawal sejauh mana kepentingan pensampelan ini mempengaruhi pembelajaran. Dalam praktiknya, parameter b dianalisis hingga 1 sepanjang latihan, kerana bobot ini lebih penting pada akhir pembelajaran ketika nilai q kita mulai berkumpul. Sifat kemas kini yang tidak berat sebelah adalah yang paling penting dalam pertemuan, seperti yang dijelaskan dalam artikel ini.

Pelaksanaan

Kali ini, pelaksanaannya sedikit lebih menarik.

Pertama sekali, kita tidak boleh hanya melaksanakan PER dengan menyusun semua Pengalaman Replay Buffer mengikut keutamaan mereka. Ini sama sekali tidak berkesan kerana O (nlogn) untuk penyisipan dan O (n) untuk persampelan.

Seperti yang dijelaskan dalam artikel yang sangat baik ini, kita perlu menggunakan struktur data yang lain dan bukannya menyusun array - jumlah pokok yang tidak disusun .

Sumtree adalah Binary Tree, iaitu pohon dengan maksimum dua anak untuk setiap simpul. Daun (node ​​terdalam) mengandungi nilai keutamaan, dan susunan data yang menunjuk ke daun berisi pengalaman.

Mengemas kini pokok dan pensampelan akan sangat berkesan (O (log n)).

Kemudian, kami membuat objek memori yang akan mengandungi jumlah dan data kami.

Seterusnya, untuk mengambil sampel kumpulan kecil ukuran k, julat [0, total_priority] akan dibahagikan kepada julat k. Nilai disampel secara seragam dari setiap julat.

Akhirnya, peralihan (pengalaman) yang sesuai dengan setiap nilai sampel ini diambil dari jumlah pokok.

Ia akan menjadi lebih jelas apabila kita mengetahui butiran lengkap dalam buku nota.

Ejen Doom Deathmatch

Ejen ini adalah Dueling Double Deep Q Learning dengan sasaran PER dan tetap q.

Kami membuat video tutorial pelaksanaan: Buku nota ada di sini

Itu sahaja! Anda baru sahaja membuat ejen yang lebih pintar yang belajar bermain Doom. Hebat! Ingatlah bahawa jika anda ingin mempunyai ejen dengan prestasi yang sangat baik, anda memerlukan lebih banyak jam GPU (lebih kurang dua hari latihan)!

Namun, dengan hanya latihan 2-3 jam di CPU (ya CPU), ejen kami memahami bahawa mereka perlu membunuh musuh sebelum dapat bergerak maju. Sekiranya mereka bergerak maju tanpa membunuh musuh, mereka akan terbunuh sebelum mendapatkan rompi.

Jangan lupa untuk melaksanakan setiap bahagian kod sendiri. Sangat mustahak untuk mencuba mengubah kod yang saya berikan kepada anda. Cuba tambahkan zaman, ubah seni bina, tambahkan nilai Q tetap, ubah kadar pembelajaran, gunakan persekitaran yang lebih sukar ... dan sebagainya. Eksperimen, bersenang-senang!

Ingatlah bahawa ini adalah artikel yang besar, jadi pastikan anda benar-benar memahami mengapa kami menggunakan strategi baru ini, cara kerjanya, dan kelebihan menggunakannya.

Dalam artikel seterusnya, kita akan belajar mengenai kaedah hibrid yang hebat antara algoritma pembelajaran pengukuhan berasaskan nilai dan dasar. Ini adalah asas untuk algoritma terkini : Advantage Actor Critic (A2C). Anda akan melaksanakan ejen yang belajar bermain Outrun!

Sekiranya anda menyukai artikel saya, sila klik? di bawah seberapa banyak yang anda suka artikelnya sehingga orang lain akan melihatnya di sini di Medium. Dan jangan lupa untuk mengikuti saya!

Sekiranya anda mempunyai pemikiran, komen, pertanyaan, sila komen di bawah atau hantarkan e-mel kepada saya: [email protected], atau tweet saya @ThomasSimonini.

Terus belajar, terus hebat!

Kursus Pembelajaran Pengukuhan Dalam dengan Tensorflow? ️

? Silibus

? Versi video

Bahagian 1: Pengenalan Pembelajaran Pengukuhan

Bahagian 2: Menyelami lebih mendalam Pembelajaran Pengukuhan dengan Pembelajaran Q

Bahagian 3: Pengenalan Pembelajaran Q Dalam: mari bermain Doom

Bahagian 3+: Peningkatan dalam Pembelajaran Q Dalam: Dueling Double DQN, Replay Pengalaman Diutamakan, dan sasaran Q tetap

Bahagian 4: Pengenalan Gradien Dasar dengan Doom dan Cartpole

Bahagian 5: Pengenalan kepada kaedah Kritikan Pelakon Advantage: mari bermain Sonic the Hedgehog!

Bahagian 6: Pengoptimuman Dasar Proksimal (PPO) dengan Sonic the Hedgehog 2 dan 3

Bahagian 7: Pembelajaran Bergerak Rasa ingin tahu menjadikan Bahagian I menjadi mudah