Saya ingin mengusulkan berbagai tantangan golf untuk komunitas ini:
(Buatan) Jaringan Saraf Tiruan adalah model pembelajaran mesin yang sangat populer yang dapat dirancang dan dilatih untuk memperkirakan fungsi apa pun (biasanya tidak diketahui). Mereka sering digunakan untuk memecahkan masalah yang sangat kompleks yang kita tidak tahu bagaimana menyelesaikan secara algoritmik seperti pengenalan suara, beberapa jenis klasifikasi gambar, berbagai tugas dalam sistem mengemudi otonom, ... Untuk primer pada jaringan saraf, pertimbangkan ini sangat baik Artikel Wikipedia .
Karena ini adalah yang pertama dalam apa yang saya harapkan menjadi serangkaian tantangan golf pembelajaran mesin, saya ingin menjaga semuanya sesederhana mungkin:
Dalam bahasa dan kerangka kerja pilihan Anda, rancang dan latih jaringan saraf yang, diberikan menghitung produk mereka untuk semua bilangan bulat x_1, x_2 antara (dan termasuk) -10 dan 10 .
Tujuan Kinerja
Agar memenuhi syarat, model Anda tidak boleh menyimpang lebih dari dari hasil yang benar pada salah satu entri tersebut.
Aturan
Model Anda
- harus berupa jaringan saraf 'tradisional' (nilai sebuah simpul dihitung sebagai kombinasi linear tertimbang dari beberapa simpul dalam lapisan sebelumnya diikuti oleh fungsi aktivasi),
- hanya dapat menggunakan fungsi aktivasi standar berikut:
- ,
- ,
- ,
- ,
- ,
- ,
- ,
- ,
- harus menggunakan sebagai tupel / vektor / daftar / ... bilangan bulat atau mengapung sebagai satu-satunya input,
- kembalikan jawaban sebagai bilangan bulat, float (atau wadah yang sesuai, misalnya vektor atau daftar, yang berisi jawaban ini).
Jawaban Anda harus mencakup (atau menautkan ke) semua kode yang diperlukan untuk memeriksa hasil Anda - termasuk bobot yang terlatih dari model Anda.
Mencetak gol
Jaringan saraf dengan jumlah bobot terkecil (termasuk bobot bias) menang.
Nikmati!
sumber
f(x) = x
untuk meneruskan inputnya?Jawaban:
21 13 119 bobotIni didasarkan pada identitas polarisasi bentuk bilinear yang dalam kasus nyata satu dimensi direduksi menjadi identitas polinomial:
Jadi
y1
hanya menghitung[x+y, x-y]
menggunakan transformasi linier, dany3
hanya nilai absoluty1
sebagai langkah preprocessing untuk yang berikutnya: Kemudian bagian "keras" adalah menghitung kotak yang akan saya jelaskan di bawah, dan setelah itu hanya menghitung perbedaan dan penskalaan yang sekali lagi merupakan operasi linier.Untuk menghitung kuadrat saya menggunakan seri eksponensial yang harus akurat untuk semua bilangan bulat dalam waktu sekitar . Seri ini berbentuks {0,1,2,…,20} 0.5
di mana saya hanya dioptimalkan untuk bobot=(wi)i
W2
( ). Keseluruhan perkiraan ini terdiri dari hanya dua transformasi linear dengan aktivasi eksponensial yang berada di antaranya. Pendekatan ini menghasilkan penyimpangan maksimal tentang .0.02
Cobalah online!
sumber
abs
. Tapi bagaimanapun juga semuanya baik-baik saja.y0
kebutuhan 4,y1
kebutuhan 2,y3
kebutuhan 2,y4
kebutuhan 1,y5
kebutuhan 1 dany6
kebutuhan 2. Itu 12?7 bobot
Cobalah online!
Gunakan perkiraan persamaan berikut untuk kecil berdasarkan ekspansi Taylor :ϵ ex≈1+x+x22
Memilih cukup kecil membuat kita dalam batas kesalahan yang diperlukan. Perhatikan itu dan merupakan bobot konstan dalam kode.ϵ
eps
c
sumber
C = -B
(1 berat) dan kemudian memiliki[e_s, e_d] = conv([A,B,C], [eps, eps])
(2 bobot) untuk menghemat satu berat :) (BTW: Pendekatan yang sangat cerdas!)exp
)3331 bobotCobalah online!
Ini melakukan multiplikasi panjang dalam (agak) biner, dan dengan demikian mengembalikan hasil yang tepat. Seharusnya dimungkinkan untuk memanfaatkan jendela kesalahan 0,5 untuk golf ini lagi, tapi saya tidak yakin bagaimana.
Lapisan 1 hingga 6 menguraikan input pertama dalam 5 "bit". Untuk alasan bermain golf, kami tidak menggunakan biner yang sebenarnya. "Bit" yang paling signifikan memiliki bobot -15 bukannya 16, dan ketika inputnya 0, semua "bit" adalah 0,5 (yang masih berfungsi dengan baik, karena ia mempertahankan identitas
inputA = -15*a15 + 8*a8 + 4*a4 + 2*a2 + 1*a1
).sumber
43 bobot
Dua solusi yang diposting sejauh ini sangat pintar tetapi pendekatan mereka kemungkinan tidak akan bekerja untuk tugas-tugas yang lebih tradisional dalam pembelajaran mesin (seperti OCR). Karenanya saya ingin mengajukan solusi 'generik' (tanpa trik pintar) untuk tugas ini yang semoga menginspirasi orang lain untuk meningkatkannya dan terjebak dalam dunia pembelajaran mesin:
Model saya adalah jaringan saraf yang sangat sederhana dengan 2 lapisan tersembunyi yang dibangun di TensorFlow 2.0 (tetapi kerangka kerja lainnya juga akan berfungsi):
Seperti yang Anda lihat, semua layer padat (yang pastinya tidak optimal), fungsi aktivasi tanh (yang sebenarnya mungkin oke untuk tugas ini), kecuali untuk layer output itu, karena sifat dari tugas ini, memiliki fungsi aktivasi linier.
Ada 43 bobot:
Bobot telah dilatih (dengan adam optimizer) dengan pendekatan pemasangan berlapis: Pertama, mereka telah dipasang untuk meminimalkan kesalahan kuadrat rata-rata tidak hanya pada perkalian bilangan bulat antara dan tetapi sebenarnya pada input di lingkungan tertentu di sekitar nilai-nilai ini . Ini menghasilkan konvergensi yang jauh lebih baik karena sifat gradient descent. Dan itu menyumbang 400 epochs pelatihan senilai 57.600 sampel pelatihan masing-masing, menggunakan ukuran batch 32.−10 10
Selanjutnya, saya telah menyesuaikan mereka - mengoptimalkan untuk deviasi maksimum pada salah satu tugas perkalian bilangan bulat. Sayangnya, catatan saya tidak menunjukkan banyak penyesuaian yang akhirnya saya lakukan, tetapi itu sangat kecil. Di lingkungan 100 zaman pada 441 sampel pelatihan, dengan ukuran batch 441.
Inilah bobot yang akhirnya saya dapatkan:
yang hampir tidak memenuhi sasaran kinerja yang dinyatakan. Penyimpangan maksimal berakhir menjadi sebagai saksi oleh .0.44350433 9⋅10=90.443504
Model saya dapat ditemukan di sini dan Anda juga dapat mencobanya online! di lingkungan Google Colab.
sumber
2 beban
Saya terinspirasi oleh jawaban lain untuk memperkirakan identitas polarisasi dengan cara yang berbeda. Untuk setiap , ia berpendapat demikianϵ>0
Cukup untuk mengambil untuk tantangan ini.ϵ=0.01
Implementasi neural net yang jelas dari perkiraan ini membutuhkan bobot dalam . Keempat bobot ini dapat diturunkan menjadi tiga dengan memfaktorkan . Seperti yang saya sebutkan di komentar di atas, setiap jaring saraf dengan bobot dalam presisi mesin dapat di-golf ke jaring saraf (besar!) Dengan hanya dua bobot berbeda. Saya menerapkan prosedur ini untuk menulis kode MATLAB berikut:{±ϵ,±(4ϵ2)−1} {±ϵ,(4ϵ3)−1} ±(4ϵ2)−1=±ϵ⋅(4ϵ3)−1
Semua mengatakan, jaring saraf ini terdiri dari 1.250.010 bobot, yang semuanya berada di .{±0.1}
Cara melepaskan diri hanya dengan 1 berat (!)
Ternyata Anda dapat mensimulasikan jaring saraf mana pun yang memiliki bobot dalam dengan jaring saraf yang lebih besar yang hanya memiliki satu berat, yaitu, . Memang, perkalian dengan dapat diimplementasikan sebagai{±0.1} −0.1 0.1
di mana adalah vektor kolom dari entri, semua sama dengan . Untuk jaring saraf di mana setengah dari bobotnya positif, transformasi ini menghasilkan jaring saraf yang kali lebih besar.w 10 −0.1 10.5
Generalisasi yang jelas dari prosedur ini akan mengubah jaring saraf dengan bobot dalam menjadi jaring saraf yang lebih besar dengan berat tunggal . Dikombinasikan dengan prosedur dalam komentar saya di atas, oleh karena itu menyatakan bahwa setiap jaring saraf dengan bobot presisi mesin dapat diubah menjadi jaring saraf berat tunggal.{±10−k} −10−k
(Mungkin kita harus memodifikasi bagaimana bobot yang digunakan kembali dinilai dalam tantangan golf saraf masa depan.)
sumber