Bagaimana cara gradient descent minibatch memperbarui bobot untuk setiap contoh dalam satu batch?

12

Jika kita memproses 10 contoh dalam satu batch, saya mengerti kita bisa menjumlahkan kerugian untuk setiap contoh, tetapi bagaimana cara backpropagation dalam hal memperbarui bobot untuk masing-masing contoh?

Sebagai contoh:

  • Contoh 1 -> kerugian = 2
  • Contoh 2 -> kerugian = -2

Ini menghasilkan kerugian rata-rata 0 (E = 0), jadi bagaimana ini akan memperbarui setiap bobot dan bertemu? Apakah hanya dengan pengacakan batch yang kita "mudah-mudahan" konvergen cepat atau lambat? Juga bukankah ini hanya menghitung gradien untuk set bobot pertama untuk contoh terakhir yang diproses?

dihitung karbon
sumber

Jawaban:

15

Keturunan gradien tidak cukup bekerja seperti yang Anda sarankan tetapi masalah serupa dapat terjadi.

Kami tidak menghitung kerugian rata-rata dari batch, kami menghitung gradien rata-rata dari fungsi kerugian. Gradien adalah turunan dari kerugian berkenaan dengan berat dan dalam jaringan saraf gradien untuk satu berat tergantung pada input dari contoh spesifik dan juga tergantung pada banyak bobot lainnya dalam model.

Jika model Anda memiliki 5 bobot dan Anda memiliki ukuran mini-batch 2 maka Anda mungkin mendapatkan ini:

Contoh 1. Kehilangan = 2,gradients=(1.5,2.0,1.1,0.4,0.9)

Contoh 2. Kehilangan = 3,gradients=(1.2,2.3,1.1,0.8,0.7)

Rata-rata gradien dalam batch mini ini dihitung, yaitu(1.35,0.15,0,0.2,0.8)

Manfaat rata-rata beberapa contoh adalah bahwa variasi dalam gradien lebih rendah sehingga pembelajaran lebih konsisten dan kurang tergantung pada spesifikasi satu contoh. Perhatikan bagaimana gradien rata-rata untuk bobot ketiga adalah , bobot ini tidak akan mengubah pembaruan bobot ini, tetapi kemungkinan besar akan menjadi nol untuk contoh berikutnya yang dipilih yang dihitung dengan bobot berbeda.0

edit dalam menanggapi komentar:

Dalam contoh saya di atas rata-rata gradien dihitung. Untuk ukuran mini-batch mana kami menghitung kerugian untuk setiap contoh kami dan bertujuan untuk mendapatkan gradien rata-rata kerugian sehubungan dengan bobot .kLiwj

Cara saya menulis dalam contoh saya, saya rata-rata setiap gradien seperti:Lwj=1ki=1kLiwj

Kode tutorial yang Anda tautkan dalam komentar menggunakan Tensorflow untuk meminimalkan kerugian rata-rata.

Tensorflow bertujuan untuk meminimalkan1ki=1kLi

Untuk meminimalkan ini, ia menghitung gradien dari kehilangan rata-rata sehubungan dengan setiap berat dan menggunakan gradien-turun untuk memperbarui bobot:

Lwj=wj1ki=1kLi

Diferensiasi dapat dimasukkan ke dalam jumlah sehingga sama dengan ekspresi dari pendekatan dalam contoh saya.

wj1ki=1kLi=1ki=1kLiwj

Hugh
sumber
Kena kau. Anda masih ingin rata-rata kerugian atas batch_size yang benar? Saya tidak yakin apakah Anda terbiasa dengan tensorflow tapi saya sudah mencoba untuk mendamaikan pemahaman saya dengan tutorial ini: tensorflow.org/get_started/mnist/beginners Anda dapat melihat bahwa kehilangan dirata-ratakan berdasarkan batch (mengurangi kode_mean). Saya kira tensorflow menyimpan hitungan internal / rata-rata dari bobot?
carboncomputed
1
@carboncomputed Oh ya Anda benar, mereka meratakan kerugian sehingga ketika Tensorflow menghitung gradien dari kerugian rata-rata, ia secara efektif menghitung rata-rata gradien untuk setiap kerugian. Saya akan mengedit jawaban saya untuk menunjukkan matematika untuk ini.
Hugh
Menarik. Terimakasih atas klarifikasinya. Jadi hanya untuk menggali sedikit lebih dalam, apakah gradien berat dihitung per contoh selama umpan maju dan disimpan atau apakah ini dihitung selama proses optimisasi dalam tensorflow? Saya kira saya hanya kehilangan "di mana" adalah gradien ini di tensorflow? Saya melihat forward pass dan loss, jadi tensorflow melakukan perhitungan gradien ini / rata-rata untuk saya?
carboncomputed
1
@carboncomputed Itulah daya tarik dari Tensorflow, ia menggunakan matematika simbolik dan dapat melakukan diferensiasi di bawah tenda
Hugh
Terima kasih atas jawaban yang rapi. Namun, saya gagal untuk memahami bagaimana TF tahu cara membuat propagate dengan kerugian rata-rata seperti yang ditunjukkan dalam contoh ini , code line 170?
pendosa
-1

Alasan untuk menggunakan batch mini adalah untuk memiliki jumlah contoh pelatihan yang baik sehingga kebisingan yang mungkin berkurang dengan rata-rata efeknya, tetapi juga itu bukan batch penuh yang bagi banyak set data membutuhkan banyak memori. Satu fakta penting adalah bahwa kesalahan yang Anda evaluasi selalu jauhantara output yang diprediksi dan output nyata: itu berarti itu tidak boleh negatif, jadi Anda tidak bisa, seperti yang Anda katakan, kesalahan 2 dan -2 yang membatalkan, tetapi itu malah akan menjadi kesalahan 4 Anda kemudian mengevaluasi gradien kesalahan sehubungan dengan semua bobot, sehingga Anda dapat menghitung perubahan bobot yang paling mengurangi itu. Setelah Anda melakukannya, Anda mengambil "langkah" ke arah itu, berdasarkan besarnya alpha tingkat pembelajaran Anda. (Ini adalah konsep dasar, saya tidak akan merinci tentang backpropagation untuk deep NN) Setelah menjalankan pelatihan ini pada dataset Anda untuk sejumlah zaman, Anda dapat mengharapkan jaringan Anda untuk menyatu jika langkah belajar Anda tidak terlalu besar untuk membuatnya berbeda. Anda masih dapat mencapai minimum lokal, ini dapat dihindari dengan menginisialisasi bobot yang berbeda, menggunakan pengoptimal yang berbeda, dan mencoba mengatur.

dante
sumber
Sebagai tambahan: kami menggunakan mini-batch sebagian besar untuk efisiensi komputasi. Kami memiliki trade-off antara akurasi keturunan dan frekuensi memperbarui bobot. Data harus sangat besar agar tidak masuk ke dalam memori.
Łukasz Grad
Saya mengerti masing-masing, tetapi bagaimana kita memperbarui bobot kami untuk batch tertentu? Apakah gradien berat juga dijumlahkan untuk setiap contoh?
carboncomputed
Tidak, hanya ada satu gradien, yang merupakan vektor turunan, pada total kesalahan batch. Ini berarti bahwa kami memperbarui setelah bobot kami didasarkan pada gradien, yaitu arah pembaruan yang membuat kesalahan pada batch mini ini berkurang paling banyak. Gradien dibuat dari turunan parsial, yaitu turunan dari kesalahan batch mini sehubungan dengan masing-masing berat: ini memberitahu kita jika setiap berat harus menjadi lebih kecil atau lebih besar, dan berapa banyak. Semua bobot mendapatkan satu pembaruan untuk batch, untuk mengurangi kesalahan pada batch mini itu, yang independen dari batch mini lainnya.
dante