Ini adalah jaringan saraf tiruan paling sederhana yang mungkin dijelaskan dan didemonstrasikan.
Jaringan saraf tiruan terinspirasi oleh otak dengan memiliki neuron buatan yang saling terhubung yang menyimpan pola dan berkomunikasi satu sama lain. Bentuk paling sederhana dari neuron buatan memiliki satu atau beberapa masukan masing-masing mempunyai bobot tertentu dan satu keluaran .
Pada tingkat yang paling sederhana, keluaran adalah jumlah masukan dikalikan bobotnya.
Tujuan dari jaringan adalah untuk mempelajari keluaran tertentu diberikan masukan tertentu dengan memperkirakan fungsi kompleks dengan banyak parameter bahwa kita tidak bisa memikirkannya sendiri.
Katakanlah kita memiliki jaringan dengan dua input Dan dan dua beban Dan .
Idenya adalah untuk menyesuaikan bobot sedemikian rupa sehingga masukan yang diberikan menghasilkan keluaran yang diinginkan.
Bobot biasanya diinisialisasi secara acak karena kita tidak dapat mengetahui nilai optimalnya sebelumnya, namun untuk mempermudah kita akan menginisialisasi keduanya ke .
Jika kita menghitung output dari jaringan ini, kita akan mendapatkannya
Jika keluarannya tidak sesuai dengan nilai target yang diharapkan, maka kita mengalami error.
Misalnya kita ingin mendapatkan nilai target sebesar maka kita akan mempunyai perbedaan
Salah satu cara umum untuk mengukur kesalahan (juga disebut sebagai fungsi biaya) adalah dengan menggunakan kesalahan kuadrat rata-rata:
Jika kita memiliki beberapa asosiasi input dan nilai target, maka errornya menjadi jumlah rata-rata dari setiap asosiasi.
Kami menggunakan mean squared error untuk mengukur seberapa jauh hasil dari target yang kami inginkan. Pengkuadratan menghilangkan tanda-tanda negatif dan memberi bobot lebih pada perbedaan yang lebih besar antara output dan target.
Untuk memperbaiki kesalahan ini, kita perlu menyesuaikan bobot sedemikian rupa sehingga keluarannya sesuai dengan target kita. Dalam contoh kita, menurunkan dari ke akan melakukan triknya, karena
Namun, untuk menyesuaikan bobot jaringan saraf kita untuk banyak masukan dan nilai target yang berbeda, kita memerlukan algoritme pembelajaran untuk melakukan ini secara otomatis.
Idenya adalah menggunakan kesalahan untuk memahami bagaimana setiap bobot harus disesuaikan sehingga kesalahan diminimalkan, tetapi pertama-tama, kita perlu mempelajari tentang gradien.
Ini pada dasarnya adalah vektor yang menunjuk ke arah kenaikan paling curam suatu fungsi. Gradien dilambangkan dengan dan hanyalah turunan parsial dari setiap variabel suatu fungsi yang dinyatakan sebagai vektor.
Tampilannya seperti ini untuk fungsi dua variabel:
Mari masukkan beberapa angka dan hitung gradien dengan contoh sederhana. Katakanlah kita punya fungsi , maka gradiennya adalah
Bagian penurunan berarti menggunakan gradien untuk mencari arah kenaikan paling curam dari fungsi kita dan kemudian bergerak ke arah yang berlawanan berkali -kali untuk mencari fungsi minimum global (atau terkadang lokal) .
Kami menggunakan konstanta yang disebut kecepatan pembelajaran , dilambangkan dengan untuk menentukan seberapa kecil langkah yang harus diambil ke arah itu.
Jika terlalu besar, maka kita berisiko melampaui fungsi minimumnya, namun jika terlalu rendah maka jaringan akan membutuhkan waktu lebih lama untuk mempelajarinya dan kita berisiko terjebak dalam minimum lokal yang dangkal.
Untuk dua beban kami Dan kita perlu mencari gradien bobot tersebut sehubungan dengan fungsi kesalahan
Untuk keduanya Dan , kita dapat mencari gradien dengan menggunakan aturan rantai
Mulai sekarang kami akan menunjukkannya sebagai istilah untuk kesederhanaan.
Setelah kita memiliki gradien, kita dapat memperbarui bobot dengan mengurangkan gradien yang dihitung dikalikan dengan kecepatan pemelajaran.
Dan kami mengulangi proses ini hingga kesalahan diminimalkan dan mendekati nol.
Contoh yang disertakan mengajarkan kumpulan data berikut ke jaringan neural dengan dua masukan dan satu keluaran menggunakan penurunan gradien:
Setelah dipelajari, jaringan akan mengeluarkan ~0 ketika diberi dua s dan ~ ketika diberikan a dan sebuah .
docker build -t simplest-network .
docker run --rm simplest-network