Tidak yakin apakah pertanyaan ini ada di sini, tetapi terkait erat dengan metode gradien dalam pengoptimalan, yang tampaknya menjadi topik di sini. Bagaimanapun, jangan ragu untuk bermigrasi jika Anda pikir beberapa komunitas lain memiliki keahlian yang lebih baik dalam topik ini.
Singkatnya, saya mencari contoh selangkah demi selangkah dari diferensiasi otomatis mode terbalik . Tidak banyak literatur tentang topik di luar sana dan implementasi yang ada (seperti yang ada di TensorFlow ) sulit untuk dipahami tanpa mengetahui teori di baliknya. Jadi saya akan sangat berterima kasih jika seseorang dapat menunjukkan secara rinci apa yang kami lewati , bagaimana kami memprosesnya dan apa yang kami ambil dari grafik komputasi.
Beberapa pertanyaan yang paling sulit saya hadapi:
- biji - mengapa kita membutuhkannya?
- membalikkan aturan diferensiasi - Saya tahu bagaimana membuat diferensiasi maju, tetapi bagaimana kita mundur? Misalnya dalam contoh dari bagian ini , bagaimana kita tahu bahwa ?
- apakah kita hanya bekerja dengan simbol atau melewati nilai aktual ? Misalnya dalam contoh yang sama , apakah dan simbol atau nilai?¯ w i
Jawaban:
Katakanlah kita memiliki ekspresi dan ingin mencari turunan dan . Reverse-mode AD membagi tugas ini menjadi 2 bagian, yaitu, meneruskan dan membalikkan pass.z=x1x2+sin(x1) dzdx1 dzdx2
Maju terus
Pertama, kami menguraikan ekspresi kompleks kami menjadi satu set yang primitif, yaitu ekspresi yang terdiri dari paling banyak pemanggilan fungsi tunggal. Perhatikan bahwa saya juga mengganti nama variabel input dan output untuk konsistensi, meskipun itu tidak perlu:
Keuntungan dari representasi ini adalah bahwa aturan diferensiasi untuk setiap ekspresi yang terpisah sudah diketahui. Sebagai contoh, kita tahu bahwa turunan dari adalah , dan karenanya . Kami akan menggunakan fakta ini secara terbalik di bawah ini.sin cos dw4dw1=cos(w1)
Pada dasarnya, umpan maju terdiri dari mengevaluasi setiap ekspresi ini dan menyimpan hasilnya. Katakan, input kami adalah: dan . Maka kita memiliki:x1=2 x2=3
Reverse pass
Ini adalah keajaiban dimulai, dan itu dimulai dengan aturan rantai . Dalam bentuk dasarnya, aturan rantai menyatakan bahwa jika Anda memiliki variabel yang bergantung pada yang, pada gilirannya, tergantung pada , maka:t(u(v)) u v
atau, jika bergantung pada melalui beberapa jalur / variabel , mis:t v ui
lalu (lihat buktinya di sini ):
Dalam hal grafik ekspresi, jika kita memiliki simpul akhir dan simpul input , dan jalur dari ke melewati simpul perantara (yaitu mana ), kita dapat menemukan turunannya sebagaiz wsaya z wsaya whal z= g(wp) wp=f(wi) dzdwi
Dengan kata lain, untuk menghitung turunan dari variabel keluaran wrt variabel antara atau input , kita hanya perlu mengetahui turunan dari orang tuanya dan rumus untuk menghitung turunan dari ekspresi primitif .z wsaya whal= f( bsaya)
Reverse pass dimulai pada bagian akhir (yaitu ) dan menyebar mundur ke semua dependensi. Di sini kita punya (ekspresi untuk "seed"):dzdz
Itu dapat dibaca sebagai "perubahan dalam menghasilkan perubahan yang persis sama dalam ", yang cukup jelas.z z
Maka kita tahu bahwa dan sebagainya:z= w5
Dari definisi dan aturan turunan parsial, kami menemukan bahwa . Demikian:w3= w1w2 dw3dw2= w1
Yang, seperti yang sudah kita ketahui dari umpan maju, adalah:
Akhirnya, berkontribusi ke melalui dan . Sekali lagi, dari aturan turunan parsial kita tahu bahwa dan . Demikian:w1 z w3 w4 dw3dw1= w2 dw4dw1= cos( b1)
Dan lagi, mengingat input yang diketahui, kita dapat menghitungnya:
Karena dan hanyalah alias untuk dan , kami mendapatkan jawaban kami:w1 w2 x1 x2
Dan itu dia!
Deskripsi ini hanya menyangkut input skalar, yaitu angka, tetapi sebenarnya itu juga dapat diterapkan pada array multidimensi seperti vektor dan matriks. Dua hal yang harus diingat ketika membedakan ekspresi dengan objek-objek tersebut:
Kekuatan diferensiasi otomatis adalah bahwa ia dapat menangani struktur rumit dari bahasa pemrograman seperti kondisi dan loop. Namun, jika semua yang Anda butuhkan adalah ekspresi aljabar dan Anda memiliki kerangka kerja yang cukup baik untuk bekerja dengan representasi simbolik, dimungkinkan untuk membangun ekspresi simbolik sepenuhnya. Pada kenyataannya, dalam contoh ini kita dapat menghasilkan ekspresi dan menghitung turunan ini untuk input apa pun yang kita inginkan.dzdw1= w2+ cos( b1) = x2+ cos( x1)
sumber