Pemrograman dibedakan


Dengan empat parameter, saya bisa bertanya pada gajah, dan dengan lima saya bisa membuatnya memindahkan kopernya.
- John Von Neumann

Gagasan " pemrograman terdiferensiasi " sangat populer di dunia pembelajaran mesin. Bagi banyak orang, tidak jelas apakah istilah ini mencerminkan perubahan nyata dalam bagaimana para peneliti memahami pembelajaran mesin, atau itu hanya (lain) rebranding "pembelajaran mendalam". Posting ini menjelaskan apa yang baru dibedakan pemrograman (atau βˆ‚P) dalam tabel pembelajaran mesin.


Yang paling penting, pemrograman yang dibedakan adalah pergeseran yang berlawanan dengan arah pembelajaran yang mendalam; dari model yang semakin parameter ke model yang lebih sederhana yang menggunakan struktur masalah ke tingkat yang lebih besar.


Selanjutnya, kita membolak-balik kanvas teks yang tidak menarik, kita ingin mencari tahu apa pembedaan otomatis itu, dan bahkan mengisinya dari ketapel!


Kekerasan dengan manfaat


Diferensiabilitas adalah ide dasar yang membuat pembelajaran yang mendalam sangat sukses. Di mana brute force mencari bahkan untuk beberapa ratus parameter model akan terlalu mahal, gradien memungkinkan traversal pseudo-acak bagian-bagian yang menarik dari ruang parameter dan menemukan set yang baik. Dengan melakukan algoritme yang tampaknya naif, kami mendapatkan generalisasi yang baik, tetapi jauh dari jelas bahwa kami perlu membedakan, katakanlah, dengan bekerja dengan urutan dalam terjemahan bahasa, tetapi semuanya ternyata sederhana, kami menunjukkan sedikit kecerdikan.


Bagaimana dengan neuron biologis dan y=Οƒ(W kalix+b)? Tidak ada yang istimewa dari formula ini; Ini adalah contoh sederhana dan fleksibel dari fungsi non-linear yang sangat parametrik. Bahkan, ini mungkin fitur terburuk dalam banyak kasus. Satu lapisan jaringan saraf, pada prinsipnya, dapat mengklasifikasikan gambar kucing, tetapi hanya menggunakan trik yang relatif tidak menarik. Ini bekerja dengan sempurna! - tetapi cetakan kecil memperingatkan bahwa Anda mungkin membutuhkan lebih banyak parameter daripada atom di alam semesta. Untuk benar-benar membuat pekerjaan ini berhasil, Anda perlu kode struktur bermasalah dalam model - ini adalah di mana ia mulai terlihat lebih seperti pemrograman tradisional.


Misalnya, ConvNets memiliki keunggulan besar dibandingkan perceptron, karena mereka bekerja dengan kernel gambar , yang dikenal menggunakan invarian terjemahan. Wajah - itu adalah wajah, terlepas dari apakah itu ditampilkan di sudut kiri atas gambar atau di tengah, tetapi di mana perceptron harus mempelajari kasus ini dalam setiap kasus, kernel dapat segera menanggapi bagian gambar apa pun. Sulit untuk menganalisis jaringan konvolusional dalam hal statistik, tetapi jauh lebih mudah untuk menganggapnya sebagai versi otomatis dari apa yang ditulis oleh para ahli pemrosesan gambar dengan tangan. Kernel dari gambar adalah program terdiferensiasi pertama dan termudah.


Struktur Pengkodean, Redux


Toolkit ML semakin mendukung diferensiasi algoritmik (AD), yang memungkinkan kita untuk membedakan model menggunakan loop, cabang, dan rekursi - atau program apa pun yang dibangun di atas serangkaian matematika primitif yang dapat dibedakan. Ini mengarah pada arsitektur yang lebih kompleks: model NLP lebih dan lebih seperti parser tata bahasa klasik dengan model stack-augmented , dan Anda bahkan dapat membedakan analog dari mesin Turing atau juru bahasa pemrograman .


Langkah terakhir yang diambil oleh pemrograman terdiferensiasi adalah tidak lagi menganggap perkalian matriks, konvolusi, dan RNN sebagai blok pembangun dasar dari pembelajaran mendalam, tetapi hanya sebagai kasus khusus. Kita dapat menerapkan metode pembelajaran yang mendalam untuk fungsi berdiferensiasi parameter apa pun f(x). Fungsinya serumit simulator fisik atau pelacak sinar juga dapat dibedakan dan dioptimalkan. Bahkan komputasi kuantum dapat masuk ke dalam struktur ini.



Para ilmuwan telah lama menggunakan model mekanistik yang terletak di antara pemrograman eksplisit dan pembelajaran mesin. Persamaan diferensial dengan parameter bebas yang digunakan dalam fisika, epidemiologi, atau farmakodinamik sama dengan jaringan saraf dalam segala hal kecuali terminologi. Mereka hanya bertujuan untuk menyediakan fungsionalitas yang jauh lebih sempit, karena sangat sederhana.


Kemajuan yang benar-benar kuat adalah ini: diferensiasi luas berarti bahwa semua metode ini terhubung bersama seperti batu bata lego .
Alih-alih selalu menulis program baru untuk ML, kita dapat menggunakan kembali program yang ada dengan menggunakan mesin fisik dalam model robot pembelajaran dalam. Di mana algoritma pembelajaran penguatan modern perlu membangun model terperinci dari dunia luar hanya berdasarkan pada apa yang mereka terima (kedengarannya seperti kekerasan ), kita dapat menerapkan pengetahuan sistem fisik yang terperinci dan akurat sebelum pembelajaran dimulai.


Bahkan bidang pembelajaran mendalam yang paling matang pun tidak menonjol; setelah kernel konvolusi, langkah alami berikutnya untuk model gambar adalah pelacak sinar yang dapat dibedakan . Render 3D berisi banyak pengetahuan struktural tentang bagaimana adegan ditampilkan dalam piksel, yang masih akan memainkan peran di dapur kami. Katakanlah model membuat keputusan dalam lingkungan simulasi yang ditampilkan sebagai piksel, yang digunakan model sebagai input. Pada prinsipnya, sekarang kita dapat membuat seluruh siklus dapat dibedakan, yang akan memungkinkan kita untuk secara langsung melihat pengaruh lingkungan pada keputusan model dan sebaliknya. Ini secara signifikan dapat meningkatkan kekuatan lingkungan simulasi yang realistis untuk model pelatihan, seperti mobil dengan mengemudi otomatis.


Seperti dalam sains, model hybrid dapat lebih efisien dan menyelesaikan beberapa pertukaran antara pembelajaran yang mendalam dan pemrograman eksplisit. Sebagai contoh, seorang perencana jalur penerbangan drone dapat memiliki komponen jaringan saraf yang hanya dapat membuat sedikit perubahan korektif ke program eksplisit yang dapat diandalkan, membuat perilaku umumnya dianalisis, sambil beradaptasi dengan data empiris. Ini juga baik untuk interpretabilitas: parameter model mekanis dan simulasi biasanya memiliki interpretasi fisik yang jelas, jadi jika model mengevaluasi parameter di dalam, itu membuat pernyataan yang jelas tentang apa, menurut pendapatnya, yang terjadi di luar.


Jika ini semua sangat luar biasa, mengapa tidak semua orang menyerah dan terburu-buru belajar membedakan? Sayangnya, keterbatasan kerangka kerja yang ada membuat sulit untuk membangun model kompleksitas seperti itu, dan tidak mungkin untuk menggunakan kembali kekayaan pengetahuan yang tertanam dalam kode ilmiah yang ada. Kebutuhan untuk mengimplementasikan kembali mesin fisik dari awal dalam bahasa pemodelan yang sangat terbatas mengubah skrip sepuluh baris menjadi proyek penelitian multi-tahun. Tetapi kemajuan dalam teknologi bahasa dan kompilasi , terutama diferensiasi otomatis , membawa kita lebih dekat ke Holy Grail: "tolong bedakan mesin gim saya saja."


Jadi apa pemrograman yang dibedakan?


Pemrograman dibedakan memungkinkan Anda untuk menerapkan metode pembelajaran yang mendalam untuk program yang ada kompleks, menggunakan kembali dengan mereka sejumlah besar pengetahuan yang tertanam di dalamnya. Pembelajaran mendalam, statistik, pemrograman, dan sains - segala sesuatu yang mencoba mengatakan kata-katanya dalam memodelkan dunia di sekitar kita - inilah saatnya untuk menggabungkannya, mendorongnya bersama-sama seperti partikel dalam collider hadron . Ini akan meningkatkan model saat ini dan memungkinkan ML untuk diterapkan di daerah di mana keterbatasan saat ini - baik interpretasi atau persyaratan komputasi dan data - membuat mereka tidak berlaku secara individual.


Masalah Manajemen yang Dapat Dibedakan


Selanjutnya, kami menunjukkan bahwa diferensiabilitas dapat membawa beberapa tugas manajemen yang sederhana namun klasik, di mana kami biasanya menggunakan Reinforcement Learning (RL) sebagai kotak hitam. Model yang dapat dibedakan (model )P) tidak hanya mengungkapkan strategi kontrol yang jauh lebih efektif, tetapi juga mempelajari beberapa urutan besarnya lebih cepat. Kode ini tersedia untuk dipelajari - dalam banyak kasus, kode ini belajar dalam beberapa detik pada laptop apa pun.


Ikuti gradien


Diferensiasi adalah kekuatan pendorong di hampir setiap langkah pembelajaran mendalam; untuk fungsi ini y=f(x)kami menggunakan gradien  fracdydxuntuk mengetahui bagaimana perubahan dalam x akan mempengaruhi y . Terlepas dari sifat matematika, gradien sebenarnya adalah konsep yang sangat umum dan intuitif. Lupakan formula yang harus Anda lihat di sekolah; mari kita lakukan sesuatu yang lebih menyenangkan, seperti melempar sesuatu di sepanjang jalan parabola.



Ketika kita melempar proyektil dengan bantuan tiga tembakan, x (input) kami mewakili pengaturan (katakanlah, ukuran penyeimbang atau sudut lontar), dan y adalah jarak yang ditempuh proyektil sebelum mendarat. Jika Anda mencoba membidik, gradien memberi tahu Anda sesuatu yang sangat berguna - menambah atau mengurangi parameter tertentu. Untuk memaksimalkan jarak, cukup ikuti gradien.


OK, tapi bagaimana kita mendapatkan parameter yang benar? Tetapi dengan bantuan hal rumit yang disebut diferensiasi algoritmik , yang memungkinkan Anda untuk membedakan tidak hanya rumus sederhana yang Anda pelajari di sekolah, tetapi juga program kompleksitas apa pun - misalnya, simulator Trebuchet kami. Sebagai hasilnya, kita dapat mengambil simulator sederhana yang ditulis dalam Julia dan paket diff Diff Diff tanpa studi mendalam, dan mendapatkan gradien untuk itu dalam satu panggilan fungsi.


 # what you did in school gradient(x -> 3x^2 + 2x + 1, 5) # (32,) # something a little more advanced gradient((wind, angle, weight) -> Trebuchet.shoot(wind, angle, weight), -2, 45, 200) # (4.02, -0.99, 0.051) 

Melempar barang


Kita perlu menargetkan trebuchet pada target, menggunakan gradien untuk menyempurnakan sudut ejeksi; Ini disebut estimasi parameter, dan kami telah melihat contoh serupa . Kita dapat membuat tugas lebih menarik dengan pindah ke meta-metode: alih-alih mengarahkan trebuchet pada satu target, kita mengoptimalkan jaringan saraf, yang dapat menargetkannya ke target apa pun. Begini cara kerjanya: jaringan saraf menerima dua input, jarak target dalam meter dan kecepatan angin saat ini. Dalam jaringan, pengaturan untuk trebuchet diletakkan (massa penyeimbang dan sudut tersandung), yang dimasukkan ke simulator yang menghitung jarak yang ditempuh. Kemudian kami membandingkan dengan tujuan kami dan bergerak di sepanjang rantai untuk menyesuaikan bobot jaringan. β€œDataset” kami adalah serangkaian target dan kecepatan angin yang dipilih secara acak.



Fitur bagus dari model sederhana ini adalah pembelajaran cepat karena kami mengekspresikan apa yang kami inginkan dari model dengan cara yang benar-benar dapat dibedakan. Awalnya, ini terlihat seperti ini:



Setelah sekitar lima menit pelatihan (pada inti prosesor yang sama dengan laptop saya) kelihatannya seperti ini:



Jika Anda ingin memengaruhi lintasan, tingkatkan kecepatan angin:



Menyimpang 16 cm, atau sekitar 0,3%. Bagaimana dengan membidik trebuchet secara langsung? Ini mudah dilakukan dengan gradient descent, mengingat kita memiliki gradient. Namun, ini adalah proses berulang yang lambat yang memakan waktu sekitar 100 ms setiap kali. Sebaliknya, pengoperasian jaringan saraf membutuhkan 5 ΞΌs (dua puluh ribu kali lebih cepat) dengan sedikit kehilangan akurasi. Trik ini, yang disebut "perkiraan fungsi inversi melalui gradien", sangat umum dan dapat digunakan tidak hanya dengan sistem dinamis, tetapi juga dengan algoritma transfer gaya cepat .


Ini adalah masalah manajemen sesederhana mungkin yang kami gunakan terutama untuk tujuan ilustrasi. Tapi kita bisa menerapkan metode yang sama dengan cara yang lebih maju untuk masalah RL klasik.


Kereta, temui tiang


Tantangan manajemen yang lebih mudah dikenali adalah CartPole , "Hello world" untuk pembelajaran penguatan. Tantangannya adalah mempelajari bagaimana menyeimbangkan pilar vertikal dengan mendorong alasnya ke kiri atau kanan. Pengaturan kami umumnya mirip dengan kasus dengan Trebuchet: penerapan Julia memungkinkan kami untuk secara langsung mempertimbangkan penghargaan yang diterima oleh lingkungan sebagai kerugian. βˆ‚P memungkinkan kita untuk beralih dari model sederhana ke model RL.



Pembaca yang cerdik mungkin melihat adanya hambatan. Area aksi untuk papan lantai - offset ke kiri atau kanan - terpisah dan karenanya tidak dapat dibedakan. Kami memecahkan masalah ini dengan memperkenalkan diskretisasi yang dapat dibedakan, didefinisikan sebagai berikut :


f (x) = \ kiri \ {\ begin {matrix} \, 1, \, x \ geqslant0 \\ -1, \, x <0 \ end {matrix} \ kanan.


 fracdfdx=1


Dengan kata lain, kita membuat gradien berperilaku seolah-olah fadalah fungsi yang identik. Mengingat seberapa banyak ide matematika diferensiasi sudah digunakan dalam ML, mungkin tidak mengherankan bahwa kita bisa menipu di sini; untuk pelatihan, yang kita butuhkan adalah sinyal untuk memberi tahu pseudo-random berjalan di sekitar ruang parameter, dan sisanya adalah detailnya. Hasilnya berbicara sendiri. Dalam kasus di mana metode RL perlu dilatih dalam ratusan episode sebelum menyelesaikan masalah, modelsP model hanya membutuhkan sekitar 5 episode untuk akhirnya menang.



Pendulum & Backprop melalui Waktu


Tujuan penting untuk RL (pembelajaran penguatan) adalah menangani remunerasi yang ditangguhkan ketika suatu tindakan tidak membantu kami meningkatkan hasil beberapa langkah berturut-turut. Ketika lingkungan dapat dibedakan, βˆ‚P memungkinkan Anda untuk melatih agen dalam propagasi balik tepat waktu, seperti dalam jaringan rekursif! Dalam hal ini, keadaan lingkungan menjadi "keadaan tersembunyi" yang berubah di antara langkah waktu.



Untuk mendemonstrasikan teknik ini, kami mempertimbangkan model pendulum , di mana tugasnya adalah mengayunkan pendulum hingga berdiri tegak dan menjaganya dalam keseimbangan yang tidak stabil. Ini sulit untuk model RL; setelah sekitar 20 episode pelatihan, masalahnya selesai, tetapi seringkali jalan menuju solusi jelas tidak optimal. Sebaliknya, BPTT dapat mengalahkan peringkat pemimpin RL dalam satu episode pelatihan. Penting untuk mengamati bagaimana episode ini terungkap; pada awal rekaman, strateginya acak, dan modelnya meningkat seiring waktu. Langkah belajarnya hampir mengkhawatirkan.



Model ini sangat cocok untuk pemesinan setiap sudut awal dan memiliki sesuatu yang dekat dengan strategi optimal. Saat memulai ulang, modelnya terlihat seperti ini.



Ini baru permulaan; kita akan mencapai kesuksesan nyata dengan menerapkan DP pada lingkungan yang pada umumnya RL terlalu sulit untuk dikerjakan, di mana simulasi dan model yang kaya sudah ada (seperti dalam kebanyakan teknik dan ilmu alam), dan di mana interpretabilitas merupakan faktor penting (seperti dalam kedokteran).


Peta Bukan Wilayah


Keterbatasan model mainan ini adalah bahwa mereka menyamakan lingkungan belajar yang disimulasikan dengan lingkungan pengujian; Tentu saja, dunia nyata tidak dapat dibedakan. Dalam model yang lebih realistis, simulasi memberi kita pola perilaku kasar, yang disempurnakan oleh data. Data ini menginformasikan, katakanlah, efek simulasi angin, yang, pada gilirannya, meningkatkan kualitas gradien yang dilewati simulator ke pengontrol. Model bahkan dapat membentuk bagian dari lintasan langsung controller, yang memungkinkannya untuk memperbaiki perkiraannya tanpa harus mempelajari dinamika sistem dari awal. Mempelajari arsitektur baru ini akan membuat pekerjaan yang menarik di masa depan.


Coda


Ide dasarnya adalah bahwa pemrograman yang dapat dibedakan, di mana kami hanya menulis program numerik yang sewenang-wenang dan mengoptimalkannya menggunakan gradien, adalah cara yang kuat untuk membuat model dan arsitektur yang lebih baik yang mirip dengan pembelajaran yang mendalam, terutama ketika kami memiliki perpustakaan besar program yang dapat dibedakan yang tersedia. . Model yang diuraikan hanyalah pratinjau, tetapi kami berharap mereka akan memberikan gagasan tentang bagaimana gagasan ini dapat diimplementasikan dengan cara yang lebih realistis.


Sama seperti pemrograman fungsional melibatkan penalaran dan pengekspresian algoritma menggunakan pola fungsional, pemrograman terdiferensiasi juga melibatkan pengekspresian algoritma menggunakan pola terdiferensiasi. Komunitas pembelajaran yang mendalam telah mengembangkan banyak pola desain seperti itu, misalnya, untuk menangani masalah manajemen atau struktur data yang konsisten dan mirip pohon. Seiring dengan pertumbuhan area, banyak yang akan ditemukan, dan sebagai hasil dari program-program ini, mungkin bahkan arsitektur pembelajaran mendalam yang paling maju pun akan terlihat kasar dan terbelakang.


Referensi



Source: https://habr.com/ru/post/id459562/


All Articles