Pertanyaan: apakah mungkin untuk melatih NN untuk membedakan antara angka ganjil dan genap hanya menggunakan sebagai input angka itu sendiri?
Saya memiliki dataset berikut:
Number Target
1 0
2 1
3 0
4 1
5 0
6 1
... ...
99 0
100 1
Saya melatih NN dengan dua neuron input (satu menjadi Variabel Number, yang lainnya menjadi neuron bias), sembilan neuron di lapisan tersembunyi dan satu neuron output menggunakan algoritma genetika yang sangat sederhana: pada setiap zaman, dua set bobot "bertarung "terhadap satu sama lain; yang memiliki kesalahan tertinggi hilang dan digantikan oleh versi pemenang yang dimodifikasi.
Script dengan mudah menyelesaikan masalah sederhana seperti AND, operator OR dan XOR tetapi macet ketika mencoba untuk mengkategorikan angka ganjil dan genap. Saat ini yang terbaik yang berhasil dilakukannya adalah mengidentifikasi 53 angka dari 100 dan butuh beberapa jam. Apakah saya menormalkan atau tidak input tampaknya tidak ada bedanya.
Jika saya ingin menyontek saya hanya bisa melakukan pra-proses data dan memberi makan% 2 ke NN sebagai input tetapi saya tidak ingin melakukannya; NN harus bisa mendekati setiap fungsi, termasuk operator modulo (saya percaya ). Apa yang saya lakukan salah?
sumber
Jawaban:
Seperti halnya tugas pembelajaran mesin, representasi input Anda memainkan peran penting dalam seberapa baik Anda belajar dan menggeneralisasi.
Saya pikir, masalah dengan representasi adalah bahwa fungsi (modulo) sangat tidak linier dan tidak mulus dalam representasi input yang Anda pilih untuk masalah ini.
Saya akan mencoba yang berikut:
Cobalah algoritma pembelajaran yang lebih baik (back-propagation / gradient descent dan variannya).
Cobalah mewakili angka dalam biner menggunakan presisi panjang tetap.
Jika representasi input Anda adalah angka b-bit, saya akan memastikan set pelatihan Anda tidak bias terhadap angka kecil atau besar. Memiliki angka yang seragam, dan dipilih secara acak dari rentang .[ 0 , 2b- 1 ]
Seperti yang telah Anda lakukan, gunakan jaringan multi-layer (coba 2 lapisan pertama: yaitu, output + tersembunyi, sebelum menggunakan lebih banyak lapisan).
Gunakan set pelatihan + tes terpisah. Jangan mengevaluasi kinerja Anda pada set pelatihan.
sumber
Belajar untuk mengklasifikasikan angka ganjil dan genap adalah masalah yang sulit. Pola sederhana terus berulang tanpa batas. 2,4,6,8 ..... 1,3,5,7 .....
Fungsi aktivasi nonlinear seperti sin (x) dan cos (x) berperilaku serupa. Karena itu, jika Anda mengubah neuron Anda untuk menerapkan dosa dan cos alih-alih fungsi aktivasi populer seperti tanh atau relu, saya kira Anda dapat menyelesaikan masalah ini dengan cukup mudah menggunakan neuron tunggal.
Transformasi linier selalu mendahului transformasi nonlinear. Oleh karena itu satu neuron pada akhirnya akan belajar dosa (ax + b) yang untuk kombinasi yang tepat dari a & b akan menghasilkan 0 dan 1 sebagai alternatif dalam frekuensi yang diinginkan yang kita inginkan dalam kasus ini adalah 1.
Saya belum pernah mencoba dosa atau cos di jaringan saraf saya sebelumnya. Jadi, permintaan maaf jika akhirnya menjadi ide yang sangat buruk.
sumber
Jadi saya bekerja dengan jaring saraf sekarang dan saya mengalami masalah yang sama seperti Anda. Apa yang saya akhirnya lakukan adalah merepresentasikan nomor input sebagai array dengan nilai yang sama dengan representasi biner dari angka tersebut. Karena apa yang kita lakukan adalah mengklasifikasikan saya merepresentasikan output saya sebagai array, bukan nilai tunggal. ex:
Semoga ini membantu!
sumber
Saya sampai di sini di mana berjuang dengan masalah yang sama. Jadi saya menulis apa yang saya kelola.
Sejauh yang saya tahu satu lapisan perceptron mampu menyelesaikan setiap masalah, yang pada akhirnya dapat disederhanakan untuk membagi objek dalam setiap geometri menggunakan garis lurus. Dan ini adalah masalah seperti ini. Jika Anda menggambar bit terakhir representasi biner di atas kertas, Anda juga dapat menggambar garis, dan semua angka ganjil ada di satu sisi, dan bahkan di sisi lain. Untuk alasan yang sama tidak mungkin untuk menyelesaikan masalah xor dengan jaringan satu lapis.
Baik. Masalah ini terlihat sangat sederhana, jadi mari kita ambil langkah Heaviside sebagai fungsi aktivasi. Setelah saya bermain sedikit dengan nomor saya, saya menyadari bahwa masalah di sini adalah dengan bias. Saya sedikit google, dan apa yang saya temukan adalah bahwa jika Anda tetap dengan representasi geometri, bias memungkinkan Anda untuk mengubah tempat aktivasi dalam sistem koordinat.
Masalah yang sangat mendidik
sumber
Diketahui bahwa gerbang logika TIDAK, DAN, ATAU semuanya dapat dilakukan dengan jaringan saraf yang sangat sederhana (NN), dan bahwa Anda dapat membangun kalkulator aritmatika lengkap dengan gerbang logika menggunakan angka biner sebagai input. Oleh karena itu Anda harus dapat membuat NN untuk menghitung n modulo k, untuk setiap angka n dan k yang dinyatakan dalam basis 2.
Jika Anda ingin menghitung n modulo k untuk angka k tetap (misalnya k = 4) Anda sebenarnya dapat membuat NN yang sangat sederhana yang melakukan itu: nyatakan angka input n dalam basis k, dan abaikan semua digit selain dari peringkat terendah digit, dan Anda punya jawabannya!
sumber
Satu ide yang menghindari penggunaan "mod 2" eksplisit dalam input bisa dengan mengkodifikasikan angka sebagai urutan piksel, maka masalahnya adalah jumlah untuk mengenali jika segmen dapat dibagi menjadi dua segmen yang sama. Ini adalah masalah penglihatan mesin dan itu bisa dipelajari oleh jaringan konvensional.
Di sisi lain, jika nomor disimpan sebagai float, pertanyaannya mengurangi (atau menggeneralisasi) untuk mengenali kapan angka float kira-kira bilangan bulat.
sumber
Saya membuat jaringan seperti itu di sini .
Representasi yang diberikan oleh @William Gottschalk adalah yayasan.
Itu hanya menggunakan 1 neuron di lapisan tersembunyi pertama dengan 32 input. Lapisan keluaran hanya memiliki 2 neuron untuk enkode satu panas 0 dan 1.
sumber
Solusi saya
Selain itu, bagi dengan angka lain (katakanlah, 7) juga baik:
Penjelasan:
Saya mendapatkan 2 solusi berbeda. Keduanya baik:
1. dosa sebagai aktivasi
2. lantai (atau int) sebagai aktivasi
Tidak mungkin menemukan bobot terbaik menggunakan gradient descent, dan saya menggunakan algoritma genetika (dari scikit-opt )
sumber