Jaringan saraf: fungsi biaya manakah yang digunakan?

49

Saya menggunakan TensorFlow untuk eksperimen terutama dengan jaringan saraf. Meskipun saya telah melakukan beberapa percobaan (XOR-Problem, MNIST, beberapa hal Regresi, ...) sekarang, saya berjuang dengan memilih fungsi biaya "yang benar" untuk masalah tertentu karena secara keseluruhan saya dapat dianggap sebagai pemula.

Sebelum datang ke TensorFlow saya mengkodekan beberapa MLP yang sepenuhnya terhubung dan beberapa jaringan berulang saya sendiri dengan Python dan NumPy tetapi kebanyakan saya memiliki masalah di mana kesalahan kuadrat sederhana dan penurunan gradien sederhana sudah cukup.

Namun, karena TensorFlow menawarkan cukup banyak fungsi biaya itu sendiri serta membangun fungsi biaya kustom, saya ingin tahu apakah ada beberapa tutorial yang khusus untuk fungsi biaya pada jaringan saraf? (Saya sudah melakukan seperti setengah dari tutorial resmi TensorFlow tetapi mereka tidak benar-benar menjelaskan mengapa fungsi biaya khusus atau pelajar digunakan untuk masalah tertentu - setidaknya tidak untuk pemula)

Untuk memberikan beberapa contoh:

cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(y_output, y_train))

Saya kira itu berlaku fungsi softmax pada kedua input sehingga jumlah satu vektor sama dengan 1. Tapi apa sebenarnya cross entropy dengan logit? Saya pikir itu meringkas nilai-nilai dan menghitung entropi silang ... jadi beberapa pengukuran metrik ?! Bukankah ini akan sangat sama jika saya menormalkan output, jumlahkan dan ambil kesalahan kuadrat? Selain itu, mengapa ini digunakan misalnya untuk MNIST (atau masalah yang jauh lebih sulit)? Ketika saya ingin mengklasifikasikan seperti 10 atau bahkan mungkin 1000 kelas, tidakkah menjumlahkan nilai benar-benar menghancurkan informasi tentang kelas mana yang sebenarnya merupakan output?

cost = tf.nn.l2_loss(vector)

Untuk apa ini? Saya pikir kehilangan 2 adalah kesalahan kuadrat tapi API TensorFlow mengatakan bahwa inputnya hanya satu tensor. Tidak mengerti sama sekali ?!

Selain itu saya sering melihat ini untuk cross entropy :

cross_entropy = -tf.reduce_sum(y_train * tf.log(y_output))

... tapi mengapa ini digunakan? Bukankah kerugian dalam entropi silang secara matematis ini:

-1/n * sum(y_train * log(y_output) + (1 - y_train) * log(1 - y_output))

Di mana (1 - y_train) * log(1 - y_output)bagian dalam sebagian besar contoh TensorFlow? Bukankah itu hilang?


Jawaban: Saya tahu pertanyaan ini cukup terbuka, tetapi saya tidak berharap mendapatkan 10 halaman dengan setiap fungsi masalah / biaya tercantum dalam detail. Saya hanya perlu ringkasan singkat tentang kapan harus menggunakan fungsi biaya mana (secara umum atau di TensorFlow, tidak terlalu berarti bagi saya) dan beberapa penjelasan tentang topik ini. Dan / atau beberapa sumber untuk pemula;)

daniel451
sumber
1
Pertanyaan bagus. Selamat datang di situs :)
Dawny33
2
Biasanya, MSE diambil untuk regresi dan Cross-Entropy untuk klasifikasi. Classification Figure of Merit (CFM) diperkenalkan dalam "Fungsi tujuan baru untuk meningkatkan pengenalan fonem menggunakan jaringan saraf waktu tunda" oleh Hampshire dan Waibel. Jika saya mengingatnya dengan benar, mereka juga menjelaskan mengapa mereka merancang CFM seperti yang mereka lakukan.
Martin Thoma
1
Saya pikir mengurangi_sum (y_train * tf.log (y_output)) banyak digunakan karena contoh "kasus sederhana" yang cukup umum. Ini akan menjalankan jumlah kesalahan setiap batch, yang berarti kesalahan Anda menggandakan biaya (dan besarnya gradien) jika batch_sizes Anda berlipat ganda. Membuat perubahan sederhana untuk mengurangi_minan setidaknya akan membuat debugging dan bermain dengan pengaturan lebih dimengerti menurut pendapat saya.
neuron

Jawaban:

34

Jawaban ini ada di sisi umum fungsi biaya, tidak terkait dengan TensorFlow, dan sebagian besar akan membahas bagian "beberapa penjelasan tentang topik ini" dari pertanyaan Anda.

Dalam kebanyakan contoh / tutorial yang saya ikuti, fungsi biaya yang digunakan agak sewenang-wenang. Intinya adalah lebih untuk memperkenalkan pembaca ke metode tertentu, bukan ke fungsi biaya secara khusus. Seharusnya tidak menghentikan Anda untuk mengikuti tutorial agar terbiasa dengan alat, tetapi jawaban saya akan membantu Anda tentang cara memilih fungsi biaya untuk masalah Anda sendiri.

Jika Anda ingin jawaban mengenai Entrop Silang, Logit, norma L2, atau apa pun yang spesifik, saya menyarankan Anda untuk mengirim beberapa pertanyaan yang lebih spesifik. Ini akan meningkatkan kemungkinan seseorang dengan pengetahuan khusus akan melihat pertanyaan Anda.


Memilih fungsi biaya yang tepat untuk mencapai hasil yang diinginkan adalah titik kritis dari masalah pembelajaran mesin. Pendekatan dasar, jika Anda tidak tahu persis apa yang Anda inginkan dari metode Anda, adalah dengan menggunakan Mean Square Error (Wikipedia) untuk masalah regresi dan Persentase kesalahan untuk masalah klasifikasi. Namun, jika Anda ingin hasil yang baik dari metode Anda, Anda perlu mendefinisikan yang baik , dan dengan demikian mendefinisikan fungsi biaya yang memadai. Ini berasal dari pengetahuan domain (apa data Anda, apa yang ingin Anda capai), dan pengetahuan tentang alat yang Anda inginkan.

Saya tidak percaya saya bisa memandu Anda melalui fungsi biaya yang sudah diterapkan di TensorFlow, karena saya hanya memiliki sedikit pengetahuan tentang alat ini, tetapi saya dapat memberi Anda sebuah contoh tentang cara menulis dan menilai berbagai fungsi biaya.


Untuk menggambarkan berbagai perbedaan antara fungsi biaya, mari kita gunakan contoh masalah klasifikasi biner, di mana kita inginkan, untuk setiap sampel , kelas .xnf(xn){0,1}

Dimulai dengan sifat komputasi ; bagaimana dua fungsi mengukur "hal yang sama" dapat menghasilkan hasil yang berbeda. Ambil fungsi biaya sederhana berikut ini; persentase kesalahan. Jika Anda memiliki sampel , adalah kelas yang diprediksi dan adalah kelas yang benar, Anda ingin meminimalkanNf(yn)yn

  • 1Nn{1 if f(xn)yn0 otherwise=nyn[1f(xn)]+[1yn]f(xn) .

Fungsi biaya ini memiliki manfaat mudah ditafsirkan. Namun, itu tidak mulus; jika Anda hanya memiliki dua sampel, fungsi "melompat" dari 0, ke 0,5, ke 1. Ini akan menyebabkan inkonsistensi jika Anda mencoba menggunakan gradient descent pada fungsi ini. Salah satu cara untuk menghindarinya adalah dengan mengubah fungsi biaya untuk menggunakan probabilitas penugasan; . Fungsi menjadip(yn=1|xn)

  • 1Nnynp(yn=0|xn)+(1yn)p(yn=1|xn) .

Fungsi ini lebih halus, dan akan bekerja lebih baik dengan pendekatan gradient descent. Anda akan mendapatkan model yang 'lebih bagus'. Namun, ada masalah lain; jika Anda memiliki sampel yang ambigu, katakanlah Anda tidak memiliki cukup informasi untuk mengatakan sesuatu yang lebih baik daripada . Kemudian, menggunakan gradient descent pada fungsi biaya ini akan mengarah pada model yang meningkatkan probabilitas ini sebanyak mungkin, dan dengan demikian, mungkin, overfit.p(yn=1|xn)=0.5

Masalah lain dari fungsi ini adalah bahwa jika sementara , Anda yakin benar, tetapi Anda salah. Untuk menghindari masalah ini, Anda dapat mengambil log probabilitas, . Saat dan , fungsi berikut tidak memiliki masalah yang dijelaskan dalam paragraf sebelumnya:p(yn=1|xn)=1yn=0logp(yn|xn)log(0)=log(1)=0

  • 1Nnynlogp(yn=0|xn)+(1yn)logp(yn=1|xn) .

Ini harus menggambarkan bahwa untuk mengoptimalkan hal yang sama , persentase kesalahan, definisi yang berbeda dapat menghasilkan hasil yang berbeda jika mereka lebih mudah dipahami, secara komputasi.

Hal ini dimungkinkan untuk fungsi biaya dan untuk mengukur konsep yang sama , namun mungkin menyebabkan metode Anda untuk hasil yang lebih baik daripada .ABAB


Sekarang mari kita lihat bagaimana fungsi biaya yang berbeda dapat mengukur konsep yang berbeda. Dalam konteks pencarian informasi, seperti dalam pencarian google (jika kami mengabaikan peringkat), kami ingin hasilnya dikembalikan

  • memiliki presisi tinggi , tidak mengembalikan informasi yang tidak relevan
  • memiliki daya ingat yang tinggi , kembalikan hasil yang relevan sebanyak mungkin
  • Precision and Recall (Wikipedia)

Perhatikan bahwa jika algoritme Anda mengembalikan semuanya , itu akan mengembalikan setiap hasil yang relevan yang mungkin, dan karenanya memiliki daya ingat tinggi, tetapi memiliki presisi yang sangat buruk. Di sisi lain, jika hanya mengembalikan satu elemen, elemen yang paling pasti relevan, ia akan memiliki presisi tinggi tetapi daya ingat rendah.

Untuk menilai algoritma tersebut, fungsi biaya umum adalah -core (Wikipedia) . Kasus yang umum adalah -score, yang memberikan bobot yang sama untuk presisi dan daya ingat, tetapi pada umumnya -score, dan Anda dapat mengubah untuk mendapatkanFF1Fββ

  • Penarikan lebih tinggi, jika Anda menggunakanβ>1
  • Presisi lebih tinggi, jika Anda menggunakan .β<1

Dalam skenario seperti itu, memilih fungsi biaya adalah memilih apa yang harus dilakukan algoritme Anda .

Contoh lain yang sering diangkat adalah kasus diagnosis medis, Anda dapat memilih fungsi biaya yang menghukum lebih banyak negatif palsu atau positif palsu tergantung pada apa yang lebih disukai:

  • Lebih banyak orang sehat digolongkan sakit (Tapi kemudian, kita mungkin memperlakukan orang sehat, yang mahal dan mungkin melukai mereka jika mereka sebenarnya tidak sakit)
  • Semakin banyak orang sakit yang diklasifikasikan sebagai sehat (Tapi kemudian, mereka mungkin mati tanpa perawatan)

Sebagai kesimpulan, mendefinisikan fungsi biaya adalah menentukan tujuan dari algoritma Anda. Algoritma menentukan cara menuju ke sana.


Catatan: Beberapa fungsi biaya memiliki cara algoritma yang bagus untuk mencapai tujuan mereka. Misalnya, cara yang bagus untuk meminimalkan kerugian Engsel (Wikipedia) ada, dengan memecahkan masalah ganda dalam SVM (Wikipedia)

Mengedipkan mata
sumber
10

Untuk menjawab pertanyaan Anda tentang Cross entropy, Anda akan melihat bahwa kedua hal yang Anda sebutkan adalah hal yang sama.

1n(y_trainlog(y_output)+(1y_train)log(1y_output))

yang Anda sebutkan hanyalah kerugian entropi silang biner di mana Anda menganggap bahwa adalah skalar 0/1 dan bahwa lagi skalar yang menunjukkan kemungkinan output menjadi 1.y_trainy_output

Persamaan lain yang Anda sebutkan adalah varian yang lebih umum dari yang meluas ke beberapa kelas

-tf.reduce_sum(y_train * tf.log(y_output)) sama dengan menulis

ntrain_problog(out_prob)

di mana penjumlahan lebih dari beberapa kelas dan probabilitas untuk masing-masing kelas. Jelas dalam kasus biner itu adalah hal yang persis sama dengan apa yang disebutkan sebelumnya. The jangka dihilangkan karena tidak berkontribusi dengan cara apapun untuk meminimalkan kerugian karena merupakan konstan.n

srivas
sumber
4

BLUF: percobaan-dan-kesalahan berulang dengan subset data dan matplotlib.

Jawaban panjang:

Tim saya berjuang dengan pertanyaan yang sama belum lama ini. Semua jawaban di sini bagus, tetapi saya ingin berbagi dengan Anda "jawaban pemula" untuk konteks dan sebagai titik awal bagi orang-orang yang baru belajar mesin.

Anda ingin mengarahkan fungsi biaya yang halus dan cembung untuk algoritme dan kumpulan data pilihan spesifik Anda. Itu karena Anda ingin algoritme Anda dapat dengan yakin dan efisien menyesuaikan bobot untuk akhirnya mencapai minimum global dari fungsi biaya tersebut. Jika fungsi biaya Anda "bergelombang" dengan max dan min lokal, dan / atau tidak memiliki minimum global, maka algoritma Anda mungkin akan mengalami kesulitan konvergen; bobotnya mungkin melompati semua tempat, akhirnya gagal memberi Anda prediksi yang akurat dan / atau konsisten.

Misalnya, jika Anda menggunakan regresi linier untuk memprediksi berat seseorang (bilangan real, dalam pound) berdasarkan tinggi badannya (bilangan real, dalam inci) dan usia (bilangan real, dalam tahun), maka fungsi biaya kesalahan kuadrat rata-rata harus kurva cembung yang bagus, halus dan cembung. Algoritme Anda tidak akan mengalami masalah konvergen.

Tetapi katakan sebaliknya Anda menggunakan algoritma regresi logistik untuk masalah klasifikasi biner, seperti memprediksi jenis kelamin seseorang berdasarkan apakah orang tersebut telah membeli popok dalam 30 hari terakhir dan apakah orang tersebut telah membeli bir dalam 30 hari terakhir. Dalam hal ini, kesalahan kuadrat rata-rata mungkin tidak memberi Anda permukaan cembung yang halus, yang mungkin buruk untuk pelatihan. Dan Anda akan mengatakannya dengan eksperimen.

Anda bisa mulai dengan menjalankan percobaan dengan menggunakan MSE dan sampel kecil dan sederhana dari data Anda atau dengan data tiruan yang Anda buat untuk percobaan ini. Visualisasikan apa yang sedang terjadi dengan matplotlib (atau solusi apa pun yang Anda inginkan). Apakah kurva kesalahan yang dihasilkan halus dan cembung? Coba lagi dengan variabel input tambahan ... apakah permukaan yang dihasilkan masih mulus dan cembung? Melalui percobaan ini Anda mungkin menemukan bahwa MSE tidak sesuai dengan masalah / solusi Anda, cross entropy memberi Anda bentuk cembung halus yang lebih sesuai dengan kebutuhan Anda. Jadi Anda bisa mencobanya dengan kumpulan data sampel yang lebih besar dan melihat apakah hipotesis masih berlaku. Dan jika ya, maka Anda dapat mencobanya dengan pelatihan penuh yang Anda atur beberapa kali dan lihat bagaimana kinerjanya dan apakah itu secara konsisten menghasilkan model yang serupa. Jika tidak, pilih fungsi biaya lain dan ulangi prosesnya.

Jenis proses coba-coba yang sangat berulang ini telah bekerja cukup baik untuk saya dan tim ilmuwan data pemula saya, dan memungkinkan kami fokus pada menemukan solusi untuk pertanyaan kami tanpa harus menyelami teori matematika di balik pemilihan fungsi biaya dan optimisasi model.

Tentu saja, banyak percobaan dan kesalahan ini telah dilakukan oleh orang lain, jadi kami juga memanfaatkan pengetahuan publik untuk membantu kami menyaring pilihan kami tentang apa yang mungkin menjadi fungsi biaya yang baik di awal proses. Sebagai contoh, cross entropy umumnya merupakan pilihan yang baik untuk masalah klasifikasi, apakah itu klasifikasi biner dengan regresi logistik seperti contoh di atas atau klasifikasi multi-label yang lebih rumit dengan lapisan softmax sebagai output. Sedangkan MSE adalah pilihan pertama yang baik untuk masalah regresi linier di mana Anda mencari prediksi skalar alih-alih kemungkinan keanggotaan dalam kategori yang diketahui dari sekumpulan kategori yang mungkin diketahui, dalam hal ini alih-alih lapisan softmax sebagai output Anda, Anda ' d bisa saja memiliki jumlah tertimbang dari input dan bias tanpa fungsi aktivasi.

Semoga jawaban ini membantu pemula lain di luar sana tanpa terlalu sederhana dan jelas.

pengguna2055509
sumber
3

Mengatur ulang pertanyaan Anda

Di mana bagian (1 - y_train) * log (1 - y_output) dalam sebagian besar contoh TensorFlow? Bukankah itu hilang?

Jawabannya adalah sebagian besar fungsi output adalah softmax. Itu berarti Anda tidak perlu mengurangi semua probabilitas dalam kasus yang salah karena secara otomatis akan berkurang ketika Anda meningkatkan kemungkinan yang benar.

Sebagai contoh:

sebelum optimasi

y_output = [0.2, 0.2, 0.6] dan y_train = [0, 0, 1]

setelah optimasi

y_output = [0.15, 0.15, 0.7] dan y_train = [0, 0, 1]

di sini amati bahwa meskipun kami baru saja menambah jabatan ketiga, semua ketentuan lainnya secara otomatis berkurang

Maurice
sumber