Beberapa bulan yang lalu, rekan kami dari Google
- Halo semua! Nama saya Roma Vlasov, hari ini saya akan bercerita tentang Quick, Draw! Tantangan Pengenalan Doodle.
Ada lima orang di tim kami. Saya bergabung tepat sebelum batas waktu penggabungan. Kami kurang beruntung, kami sedikit terguncang, tetapi kami terguncang dari posisi uang, dan mereka terguncang dari posisi emas. Dan kami mengambil tempat keempat yang terhormat.
(Selama kompetisi, tim mengamati diri mereka sendiri dalam sebuah penilaian, yang dibentuk berdasarkan hasil yang ditunjukkan pada satu bagian dari kumpulan data yang diusulkan. Peringkat akhir, pada gilirannya, dibentuk pada bagian lain dari kumpulan data. Hal ini dilakukan agar bahwa peserta kompetisi tidak menyesuaikan algoritmanya dengan data tertentu. Oleh karena itu, di final, ketika berpindah antar peringkat, posisinya sedikit berguncang (dari bahasa Inggris shake up - to mix): pada data lain, hasilnya mungkin berubah menjadi berbeda. Tim Roman pertama di tiga besar. Dalam hal ini, tiga teratas adalah uang, zona peringkat moneter, karena hanya tiga tempat pertama yang diberikan hadiah uang tunai. Setelah perombakan, tim sudah masuk tempat keempat. Dengan cara yang sama, tim lain kehilangan kemenangan, posisi emas. - Ed.)
Persaingan ini juga penting karena Evgeniy Babakhnin mendapat grandmaster, Ivan Sosin mendapat master, Roman Soloviev tetap menjadi grandmaster, Alex Parinov mendapat master, saya menjadi ahli, dan sekarang saya sudah menjadi master.
Apa ini Quick, Draw? Ini adalah layanan dari Google. Google memiliki tujuan untuk mempopulerkan AI dan dengan layanan ini ingin menunjukkan cara kerja jaringan saraf. Anda pergi ke sana, klik Ayo menggambar, dan halaman baru muncul di mana Anda diberitahu: menggambar zigzag, Anda punya waktu 20 detik untuk melakukannya. Anda mencoba menggambar zigzag dalam 20 detik, seperti di sini misalnya. Jika Anda berhasil, jaringan mengatakan itu zigzag dan Anda melanjutkan. Hanya ada enam gambar seperti itu.
Jika jaringan Google gagal mengenali apa yang Anda gambar, tugas tersebut diberi tanda silang. Nanti saya akan memberi tahu Anda apa artinya di masa depan apakah suatu gambar dikenali oleh jaringan atau tidak.
Layanan ini mengumpulkan sejumlah besar pengguna, dan semua gambar yang diambil pengguna dicatat.
Kami berhasil mengumpulkan hampir 50 juta gambar. Dari sini, tanggal kereta dan tes untuk kompetisi kami dibentuk. Omong-omong, jumlah data dalam tes dan jumlah kelas dicetak tebal karena suatu alasan. Saya akan menceritakannya kepada Anda nanti.
Format datanya adalah sebagai berikut. Ini bukan hanya gambar RGB, tetapi, secara kasar, log dari semua yang dilakukan pengguna. Kata adalah target kami, kode negara adalah asal pembuat orat-oret, stempel waktu adalah waktu. Label yang dikenali hanya menunjukkan apakah jaringan mengenali gambar dari Google atau tidak. Dan gambar itu sendiri adalah suatu barisan, perkiraan kurva yang digambar pengguna dengan titik-titik. Dan waktunya. Ini adalah waktu dari awal menggambar.
Data disajikan dalam dua format. Ini adalah format pertama, dan format kedua disederhanakan. Mereka memotong waktunya dari sana dan memperkirakan kumpulan poin ini dengan kumpulan poin yang lebih kecil. Untuk ini mereka menggunakan
Data tersebut didistribusikan sebagai berikut. Semuanya seragam, namun ada beberapa outlier. Saat kami memecahkan masalah, kami tidak melihatnya. Yang penting tidak ada kelas yang benar-benar sedikit, kita tidak perlu melakukan Weighted Sampler dan Data Oversampling.
Seperti apa gambar-gambarnya? Ini adalah kelas βpesawatβ dan contohnya dengan label yang dikenali dan tidak dikenali. Rasionya berkisar antara 1 banding 9. Seperti yang Anda lihat, datanya cukup berisik. Saya kira itu adalah pesawat terbang. Jika Anda melihatnya tidak dikenali, dalam banyak kasus itu hanya kebisingan. Seseorang bahkan mencoba menulis βpesawatβ, tetapi ternyata dalam bahasa Prancis.
Sebagian besar peserta hanya mengambil grid, mengambil data dari rangkaian garis ini sebagai gambar RGB, dan melemparkannya ke dalam jaringan. Saya menggambar dengan cara yang kira-kira sama: Saya mengambil palet warna, menggambar garis pertama dengan satu warna, yang ada di awal palet ini, baris terakhir dengan warna lain, yang ada di akhir palet, dan di antara keduanya. Saya melakukan interpolasi di mana-mana menggunakan palet ini. Omong-omong, ini memberikan hasil yang lebih baik daripada jika Anda menggambar seperti pada slide pertama - hanya dalam warna hitam.
Anggota tim lainnya, seperti Ivan Sosin, mencoba pendekatan menggambar yang sedikit berbeda. Dengan satu saluran ia hanya menggambar gambar abu-abu, dengan saluran lain ia menggambar setiap guratan dengan gradien dari awal hingga akhir, dari 32 hingga 255, dan dengan saluran ketiga ia menggambar gradien pada semua guratan dari 32 hingga 255.
Hal menarik lainnya adalah Alex Parinov mengunggah informasi ke jaringan menggunakan kode negara.
Metrik yang digunakan dalam kompetisi ini adalah Mean Average Precision. Apa inti dari metrik persaingan ini? Anda dapat memberikan tiga prediksi, dan jika tidak ada prediksi yang benar pada ketiga prediksi tersebut, maka Anda mendapatkan 0. Jika ada yang benar, maka urutannya diperhitungkan. Dan hasil targetnya akan dihitung 1 dibagi dengan urutan prediksi anda. Misalnya Anda membuat tiga prediktor, dan yang benar adalah yang pertama, lalu Anda membagi 1 dengan 1 dan mendapatkan 1. Jika prediktornya benar dan ordonya 2, lalu membagi 1 dengan 2, Anda mendapatkan 0,5. Yah, dll.
Dengan pra-pemrosesan data - cara menggambar dan sebagainya - kami telah memutuskan sedikit. Arsitektur apa yang kami gunakan? Kami mencoba menggunakan arsitektur besar seperti PNASNet, SENet, dan arsitektur klasik seperti SE-Res-NeXt, mereka semakin memasuki kompetisi baru. Ada juga ResNet dan DenseNet.
Bagaimana kami mengajarkan hal ini? Semua model yang kami ambil telah dilatih sebelumnya di imagenet. Meskipun terdapat banyak data, 50 juta gambar, namun tetap saja, jika Anda menggunakan jaringan yang telah dilatih sebelumnya di imagenet, hasilnya akan lebih baik dibandingkan jika Anda hanya melatihnya dari awal.
Teknik pengajaran apa yang kami gunakan? Ini adalah Cosing Annealing dengan Warm Restart, yang akan saya bicarakan nanti. Ini adalah teknik yang saya gunakan di hampir semua kompetisi saya baru-baru ini, dan dengan teknik ini ternyata melatih grid dengan cukup baik, untuk mencapai nilai minimum yang baik.
Berikutnya Mengurangi Learning Rate di Plateau. Anda mulai melatih jaringan, menetapkan kecepatan pembelajaran tertentu, terus mengajarkannya, dan kerugian Anda secara bertahap menyatu ke nilai tertentu. Anda cek ini, misalnya selama sepuluh epoch kerugiannya tidak berubah sama sekali. Anda mengurangi kecepatan pembelajaran Anda dengan nilai tertentu dan terus belajar. Kecepatannya turun sedikit lagi, menyatu pada titik minimum tertentu, dan Anda kembali menurunkan kecepatan pemelajaran, dan seterusnya, hingga jaringan Anda akhirnya menyatu.
Berikutnya adalah teknik yang menarik: Jangan mengurangi kecepatan pembelajaran, tingkatkan ukuran batch. Ada artikel dengan nama yang sama. Saat Anda melatih jaringan, Anda tidak perlu mengurangi kecepatan pembelajaran, Anda cukup meningkatkan ukuran batch.
Omong-omong, teknik ini digunakan oleh Alex Parinov. Dia memulai dengan batch yang sama dengan 408, dan ketika jaringannya mencapai titik tertinggi, dia hanya menggandakan ukuran batch, dan seterusnya.
Sebenarnya saya tidak ingat berapa nilai yang dicapai ukuran batch-nya, tapi yang menarik adalah ada tim di Kaggle yang menggunakan teknik yang sama, ukuran batch mereka sekitar 10000. Omong-omong, kerangka kerja modern untuk pembelajaran mendalam, seperti PyTorch, misalnya, memungkinkan Anda melakukan ini dengan sangat mudah. Anda membuat batch Anda dan mengirimkannya ke jaringan tidak sebagaimana adanya, secara keseluruhan, tetapi membaginya menjadi beberapa bagian sehingga cocok dengan kartu video Anda, menghitung gradien, dan setelah Anda menghitung gradien untuk seluruh batch, perbarui beban.
Omong-omong, ukuran kumpulan yang besar tetap disertakan dalam kompetisi ini, karena datanya cukup berisik, dan ukuran kumpulan yang besar membantu Anda memperkirakan gradien dengan lebih akurat.
Pelabelan semu juga digunakan, sebagian besar digunakan oleh Roman Soloviev. Dia mengambil sampel sekitar setengah data dari pengujian dalam batch, dan melatih grid pada batch tersebut.
Ukuran gambar itu penting, tetapi faktanya Anda memiliki data yang banyak, Anda perlu berlatih dalam waktu yang lama, dan jika ukuran gambar Anda cukup besar, maka Anda akan berlatih dalam waktu yang sangat lama. Namun hal ini tidak menambah banyak kualitas pengklasifikasi akhir Anda, jadi ada baiknya menggunakan semacam trade-off. Dan kami hanya mencoba gambar yang ukurannya tidak terlalu besar.
Bagaimana semua itu dipelajari? Pertama, gambar berukuran kecil diambil, beberapa epoch dijalankan, ini memakan waktu yang cukup banyak. Kemudian diberikan gambar-gambar berukuran besar, jaringannya dilatih, lalu lebih-lebih lagi, agar tidak melatihnya dari awal dan tidak membuang banyak waktu.
Tentang pengoptimal. Kami menggunakan SGD dan Adam. Dengan cara ini dimungkinkan untuk mendapatkan satu model, yang memberikan kecepatan 0,941-0,946 di papan peringkat publik, yang cukup bagus.
Jika Anda menggabungkan model dengan cara tertentu, Anda akan mendapatkan sekitar 0,951. Jika Anda menggunakan satu teknik lagi, Anda akan mendapatkan skor akhir 0,954 di papan publik, sama seperti yang kami dapatkan. Tapi lebih dari itu nanti. Selanjutnya saya akan memberi tahu Anda bagaimana kami merakit model, dan bagaimana kami berhasil mencapai kecepatan akhir tersebut.
Selanjutnya saya ingin membahas tentang Cosing Annealing dengan Warm Restart atau Stochastic Gradient Descent dengan Warm Restart. Secara kasar, pada prinsipnya, Anda dapat menggunakan pengoptimal apa pun, tetapi intinya adalah ini: jika Anda hanya melatih satu jaringan dan secara bertahap menyatu ke minimum tertentu, maka semuanya baik-baik saja, Anda akan mendapatkan satu jaringan, itu membuat kesalahan tertentu, tetapi Anda dapat melatihnya sedikit berbeda. Anda akan menetapkan beberapa kecepatan pembelajaran awal, dan secara bertahap menurunkannya sesuai dengan rumus ini. Anda menurunkannya, jaringan Anda mencapai batas minimum, lalu Anda menyimpan bobotnya, dan sekali lagi menetapkan kecepatan pemelajaran seperti pada awal pelatihan, sehingga naik ke atas dari nilai minimum ini, dan sekali lagi menurunkan kecepatan pemelajaran Anda.
Dengan demikian, Anda dapat mengunjungi beberapa minimum sekaligus, di mana kerugian Anda akan sama plus atau minusnya. Namun faktanya jaringan dengan bobot tersebut akan memberikan error yang berbeda-beda pada tanggal Anda. Dengan merata-ratakannya, Anda akan mendapatkan semacam perkiraan, dan kecepatan Anda akan lebih tinggi.
Tentang cara kami merakit model kami. Di awal pemaparan, saya katakan untuk memperhatikan jumlah data dalam ujian dan jumlah kelas. Jika Anda menambahkan 1 ke jumlah target dalam set tes dan membaginya dengan jumlah kelas, Anda akan mendapatkan angka 330, dan ini tertulis di forum - bahwa kelas dalam tes tersebut seimbang. Ini bisa digunakan.
Berdasarkan hal ini, Roman Soloviev membuat metrik, kami menyebutnya Skor Proksi, yang berkorelasi cukup baik dengan papan peringkat. Intinya adalah: Anda melakukan prediksi, ambil 1 teratas dari prediktor Anda dan hitung jumlah objek untuk setiap kelas. Selanjutnya, kurangi 330 dari setiap nilai dan jumlahkan nilai absolut yang dihasilkan.
Nilai-nilai berikut diperoleh. Hal ini membantu kami untuk tidak membuat papan peringkat yang menyelidik, namun untuk memvalidasi secara lokal dan memilih koefisien untuk ansambel kami.
Dengan ansambel Anda bisa mendapatkan kecepatan seperti itu. Apa lagi yang bisa saya lakukan? Misalkan Anda menggunakan informasi bahwa kelas-kelas dalam ujian Anda seimbang.
Penyeimbangannya berbeda.
Apa yang telah kita lakukan? Penyeimbangan kami cukup sederhana, seperti yang disarankan oleh Evgeny Babakhnin. Pertama-tama kita mengurutkan prediksi kita berdasarkan 1 teratas dan memilih kandidat darinya - sehingga jumlah kelas tidak melebihi 330. Namun untuk beberapa kelas, Anda akan mendapatkan kurang dari 330 prediktor. Oke, mari kita urutkan juga berdasarkan 2 teratas dan 3 teratas , dan kami juga akan memilih kandidat.
Apa perbedaan keseimbangan kita dengan keseimbangan yang pertama? Mereka menggunakan pendekatan berulang, mengambil kelas yang paling populer dan mengurangi probabilitas kelas tersebut sejumlah kecil hingga kelas tersebut tidak lagi menjadi yang paling populer. Kami mengambil kelas terpopuler berikutnya. Maka mereka terus menurunkannya hingga jumlah semua kelas menjadi sama.
Semua orang menggunakan pendekatan plus atau minus satu untuk melatih jaringan, namun tidak semua orang menggunakan penyeimbangan. Dengan menggunakan penyeimbangan, Anda bisa mendapatkan emas, dan jika Anda beruntung, maka menjadi uang.
Bagaimana cara memproses tanggal terlebih dahulu? Semua orang memproses tanggal, plus atau minus, dengan cara yang sama - membuat fitur buatan tangan, mencoba mengkodekan pengaturan waktu dengan warna guratan yang berbeda, dll. Alexei Nozdrin-Plotnitsky, yang menempati posisi ke-8, membicarakan hal ini.
Dia melakukannya secara berbeda. Dia mengatakan bahwa semua fitur buatan tangan Anda ini tidak berfungsi, Anda tidak perlu melakukan itu, jaringan Anda harus mempelajari semua ini sendiri. Dan sebagai gantinya, dia membuat modul pembelajaran yang memproses data Anda terlebih dahulu. Dia memasukkan data asli ke dalamnya tanpa pemrosesan awal - koordinat titik dan waktu.
Kemudian dia mengambil selisihnya berdasarkan koordinat, dan membuat rata-rata semuanya berdasarkan waktunya. Dan dia menghasilkan matriks yang agak panjang. Dia menerapkan konvolusi 1D beberapa kali untuk mendapatkan matriks berukuran 64xn, di mana n adalah jumlah total titik, dan 64 dibuat untuk memasukkan matriks yang dihasilkan ke lapisan jaringan konvolusional mana pun, yang menerima jumlah saluran - 64. ia memperoleh matriks 64xn, kemudian dari sini perlu dibuat tensor dengan ukuran tertentu sehingga jumlah salurannya sama dengan 64. Ia menormalkan semua titik X, Y dalam rentang 0 hingga 32 untuk membuat a tensor ukuran 32x32. Entah kenapa dia mau 32x32, kejadiannya begitu saja. Dan pada koordinat ini dia menempatkan sebuah fragmen dari matriks ini berukuran 64xn. Jadi itu hanya menghasilkan tensor 32x32x64 yang dapat Anda masukkan lebih jauh ke dalam jaringan saraf konvolusional Anda. Hanya itu yang ingin saya katakan.
Sumber: www.habr.com