Bagaimana cara mengubah input dan mengekstrak output yang bermanfaat di Jaringan Saraf Tiruan?

9

Jadi saya sudah mencoba memahami jaringan saraf sejak saya menemukan blog Adam Geitgey tentang pembelajaran mesin. Saya telah membaca sebanyak mungkin tentang subjek (yang dapat saya pahami) dan percaya saya memahami semua konsep luas dan beberapa cara kerjanya (meskipun sangat lemah dalam matematika), neuron, sinapsis, bobot, fungsi biaya, backpropagation dll. Namun, saya belum bisa menemukan cara menerjemahkan masalah dunia nyata menjadi solusi jaringan saraf.

Contohnya, Adam Geitgey memberikan contoh penggunaan, sistem prediksi harga rumah di mana diberikan satu set data yang berisi Jumlah kamar tidur , Sq. kaki , Lingkungan dan Harga Jual Anda dapat melatih jaringan saraf untuk dapat memprediksi harga sebuah rumah. Namun dia berhenti benar-benar menerapkan solusi yang mungkin dalam kode. Contoh terdekat, yang didapatnya, adalah fungsi dasar yang menunjukkan bagaimana Anda menerapkan bobot:

def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood):
  price = 0

  # a little pinch of this
  price += num_of_bedrooms * 1.0

  # and a big pinch of that
  price += sqft * 1.0

  # maybe a handful of this
  price += neighborhood * 1.0

  # and finally, just a little extra salt for good measure
  price += 1.0

  return price 

Sumber daya lain tampaknya lebih fokus pada matematika dan satu-satunya contoh kode dasar yang dapat saya temukan yang saya pahami (yaitu tidak semua bernyanyi, semua menari berdasarkan klasifikasi gambar) adalah implementasi yang melatih jaringan saraf menjadi XOR Gerbang yang hanya menangani 1 dan 0.

Jadi ada celah dalam pengetahuan saya bahwa saya sepertinya tidak bisa menjembatani. Jika kita kembali ke masalah prediksi harga rumah , bagaimana cara membuat data yang cocok untuk dimasukkan ke dalam jaringan saraf? Sebagai contoh:

  • Jumlah kamar tidur: 3
  • Sq. kaki: 2000
  • Sekitar: Normaltown
  • Harga jual: $ 250.000

Bisakah Anda memberi makan 3 dan 2000 langsung ke jaringan saraf karena jumlahnya? Atau apakah Anda perlu mengubahnya menjadi sesuatu yang lain? Demikian pula bagaimana dengan nilai Normaltown , itu sebuah string, bagaimana Anda menerjemahkannya menjadi nilai yang bisa dipahami oleh jaringan saraf? Bisakah Anda memilih nomor, seperti indeks, asalkan konsisten di seluruh data?

Sebagian besar contoh jaringan saraf yang pernah saya lihat angka yang lewat di antara lapisan adalah 0 hingga 1 atau -1 hingga 1. Jadi pada akhir pemrosesan, bagaimana Anda mengubah nilai output menjadi sesuatu yang dapat digunakan seperti $ 185.000 ?

Saya tahu contoh prediksi harga rumah mungkin bukan masalah yang sangat berguna mengingat bahwa itu telah disederhanakan secara besar-besaran menjadi hanya tiga poin data. Tapi saya hanya merasa bahwa jika saya bisa mengatasi rintangan ini dan menulis aplikasi yang sangat mendasar yang melatih menggunakan data kehidupan nyata semu dan melontarkan jawaban kehidupan nyata semu daripada saya akan merusak bagian belakangnya dan dapat menendang dan selami lebih dalam pembelajaran mesin.

David
sumber

Jawaban:

10

Ini adalah pertanyaan bagus yang saya geluti saat mencoba kode ANN.

Di bawah ini adalah solusi tujuan umum yang baik, dan inilah yang saya terapkan dalam kode saya untuk mencoba memprediksi data numerik yang berperilaku baik. Jika data Anda tidak berperilaku baik (mis. Penuh dengan outlier) maka Anda mungkin perlu melakukan lebih banyak pekerjaan menormalkan input dan output. Beberapa metode yang lebih maju dijelaskan di sini .

Catatan: Saya akan berasumsi bahwa Anda menggunakan f (x) = tanh (x) sebagai fungsi aktivasi Anda. Jika tidak, Anda masih bisa memikirkan cara menormalkan data setelah membaca ini.

Cara menyiapkan data input:

Ide dasarnya adalah bahwa Anda ingin variasi yang signifikan pada setiap parameter input dicerminkan oleh variasi signifikan dalam aktivasi neuron input tersebut dimasukkan. Dengan melihat sebidang turunan dari fungsi aktivitas tanh (x), Anda akan melihat bahwa wilayah kemiringan yang signifikan berada dalam jarak satu atau dua dari titik asal. Ini berarti bahwa apakah input ke fungsi aktivasi adalah 2000 atau 3000 (nilai x yang turunannya kecil), output dari aktivasi akan hampir sama ... sehingga keadaan neuron Anda akan terlepas dari perbedaan antara 2000 dan 3000, dan jaringan Anda tidak akan pernah menghasilkan daya prediksi dari nilai dalam rentang itu.

Jadi, jika Anda ingin memasukkan rekaman persegi rumah ke neuron, Anda perlu menormalkan rekaman persegi sehingga jaringan dapat mengetahui perbedaan antara 2000 dan 3000. Salah satu cara untuk melakukan ini sehingga semua variasi signifikan dalam data yang 'diperhatikan' oleh neuron adalah untuk z-skor-menormalkan input .

  • Kumpulkan semua nilai rekaman persegi Anda (dari set pelatihan Anda) dan hitung rata-rata dan standar deviasi. Menyimpan mean dan standar deviasi --- Anda akan memerlukan informasi ini untuk menormalkan nilai rekaman kuadrat baru saat pengujian.

  • Normalisasi vektor nilai rekaman persegi dengan mengurangi rata-rata dan kemudian membagi hasilnya dengan standar deviasi (tentu saja semua elemen operasi). Mengurangi mean pusat data Anda di asal, dan membaginya dengan standar deviasi memastikan sebagian besar itu adalah antara -1 dan 1, di mana output neuron paling sensitif terhadap inputnya. Ini disebut normalisasi skor-z karena setiap nilai input diganti dengan skor-znya .

  • Lakukan hal di atas untuk setiap variabel input.

Sekarang, ketika Anda menempatkan setiap nilai input melalui neuron, output neuron adalah aktivasi antara -1 dan 1 (lihat gambar tanh (x)). Karena ini sudah dalam kisaran 'sensitif' dari fungsi aktivasi, Anda tidak perlu khawatir mengubah output dari neuron layer-input sebelum mengirimnya ke layer tersembunyi pertama. Hanya memberikan setiap lapisan tersembunyi neuron output dari lapisan sebelumnya langsung --- mereka akan mampu menangani mereka baik-baik saja.

Saat Anda mencapai lapisan terakhir (neuron keluaran), yang Anda dapatkan adalah aktivasi lagi antara -1 dan 1. Anda harus mengonversi ini kembali menjadi nilai untuk rumah yang dimaksud , apakah nilai itu akan digunakan sebagai prediksi dalam set tes atau untuk menghitung kesalahan selama pelatihan. Bagaimanapun Anda melakukan ini, Anda hanya harus konsisten dan menggunakan prosedur de-normalisasi yang sama dalam pelatihan dan pengujian. Salah satu cara untuk memikirkannya adalah: ketika neuron output mengembalikan 1, itu berarti jaringan mengembalikan nilai rumah maksimum yang mungkin sebagai prediksi. Berapa nilai tertinggi yang bisa diperkirakan oleh jaringan? Pendekatan yang tepat di sini tergantung pada aplikasi Anda. Inilah yang saya lakukan:

  • Hitung rata-rata variabel keluaran dan simpanlah.
  • Hitung deviasi maksimum dari variabel output dari rata-rata. Python:MaxDev = max([abs(DataPoint-numpy.mean(TrainingData)) for DataPoint in TrainingData])
  • Ketika jaringan mengembalikan output antara -1 dan 1, gandakan output dengan MaxDevdan tambahkan ke mean.

Dua pemeriksaan cepat dasar yang dapat Anda lakukan untuk melihat apakah skema normalisasi-renormalisasi Anda cocok (ini perlu, tetapi mungkin tidak cukup kondisi):

  1. Jika semua nilai input rata-rata (mis. Rata-rata jumlah kamar tidur, rata-rata sq.feet, dll), apakah output jaringan sama dengan rata-rata variabel output (misalnya nilai rumah) juga? (Harus.)
  2. Jika semua nilai input luar biasa tinggi / rendah, apakah output jaringan juga luar biasa tinggi / rendah? (Ini hanya berfungsi jika semua input terkait positif dengan output ... jika beberapa di antaranya terkait terkait terbalik, Anda harus berpikir lebih banyak).

Perhatikan bahwa skema yang disajikan di sini memenuhi dua syarat ini.

Perhatikan bahwa skema ini akan memungkinkan jaringan Anda untuk hanya memprediksi nilai rumah di dalam kisaran nilai rumah di set data pelatihan Anda. Bergantung pada aplikasinya, perilaku ini dapat diinginkan atau tidak diinginkan.

Misalnya: Anda mungkin ingin membuatnya mustahil bagi jaringan Anda untuk memprediksi nilai rumah negatif. Pikirkan bagaimana Anda akan melakukan ini. De-normalisasikan output sehingga -1 dipetakan ke 0.

Jika Anda ingin menetapkan batas pada nilai yang tidak dapat diprediksi oleh jaringan Anda, maka Anda dapat menjalankan output jaringan melalui fungsi yang memetakan rentang [-1,1] ke semua bilangan real ... seperti arctanh (x)! Selama Anda melakukan ini selama pelatihan, jaringan Anda akan menyesuaikan bobotnya untuk mengakomodasi hal ini.

Saya harap ini membantu. Beri tahu saya jika Anda memiliki pertanyaan lebih lanjut. Modul JST saya menggunakan Python, jadi saya mungkin memiliki saran khusus bahasa.

Marko Bakić
sumber
Ini sangat berguna! Setiap blog / tutorial yang saya temui tampaknya menghindari (hampir dengan sengaja) menggambarkan proses ini, tapi ya itu semua masuk akal. Butuh waktu cukup lama bagi saya untuk mencerna dengan baik, tetapi saya akan kembali jika saya memiliki pertanyaan lanjutan. Terima kasih banyak!
David
Jadi beberapa pertanyaan. Jika Sq saya. Data latihan kaki adalah {2000, 800, 850, 550, 2000} maka input z-score saya untuk {1900, 1500, 600} akan menjadi (jika saya telah menghitung dengan benar) {1.0496, 0.4134, -1.0177}. Jadi salah satu dari nilai itu adalah> 1 dan satu adalah <-1, apa yang akan saya lakukan dengan itu? Masukkan mereka ke dalam simpul lapisan input terlepas atau membulatkannya ke 1 & -1? Mengapa 1900 & 600 menghasilkan nilai-nilai itu ketika berada dalam kisaran 550 - 2000? Apakah ini hanya tipuan data karena ada set data yang kecil?
David
Berkenaan dengan renormalisasi lapisan keluaran, apakah saya sudah benar bahwa Anda akan memplot output ke nilai min dan max? Jadi jika nilai minimumnya adalah0SebuahndthemSebuahxsayamkamum100 dan outputnya nol (dengan asumsi -1 ke 1) maka itu akan diterjemahkan sebagai $ 50?
David
Ingat bahwa input tidak harus benar-benar antara 1 dan -1. Yang Anda butuhkan untuk input adalah sebagian besar data berada dalam kisaran itu. Nilai yang lebih besar atau kurang dari satu berarti bahwa titik itu lebih dari satu standar deviasi dari rata-rata, sehingga titik itu lebih dekat ke ujung data yang lebih tinggi. Seharusnya agak jarang data Anda keluar dari [-1, 1], bahkan lebih jarang lagi untuk keluar dari [-2, 2] dan sangat jarang keluar di luar [-3, 3]. Lihatlah tanh (x) dan Anda akan melihat rentang sensitif tidak hanya antara -1 dan 1, tetapi sedikit lebih jauh dari itu.
Marko Bakić
Mengenai denormalisasi keluaran, denormalisasi min-max itu adalah apa yang saya lakukan dalam implementasi saya, dan interpretasi Anda benar, tetapi Anda tidak perlu melakukan itu. Anda dapat membuatnya sehingga 1 sesuai dengan dua kali nilai rumah maksimum - dengan cara itu jaringan Anda akan dapat memprediksi nilai rumah di atas apa yang Anda latih.
Marko Bakić