Klasifikasi gambar tulisan tangan. Laporkan di Yandex

Beberapa bulan yang lalu, rekan kami dari Google dihabiskan di Kaggle kompetisi untuk membuat pengklasifikasi gambar yang diperoleh secara sensasional permainan "Menggambar cepat!" Tim, termasuk pengembang Yandex Roman Vlasov, menempati posisi keempat dalam kompetisi tersebut. Pada pelatihan pembelajaran mesin bulan Januari, Roman berbagi ide timnya, implementasi akhir pengklasifikasi, dan praktik menarik dari lawannya.


- Halo semua! Nama saya Roma Vlasov, hari ini saya akan bercerita tentang Quick, Draw! Tantangan Pengenalan Doodle.

Klasifikasi gambar tulisan tangan. Laporkan di Yandex

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.)

Klasifikasi gambar tulisan tangan. Laporkan di Yandex

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.

Klasifikasi gambar tulisan tangan. Laporkan di Yandex

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.

Klasifikasi gambar tulisan tangan. Laporkan di Yandex

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.

Klasifikasi gambar tulisan tangan. Laporkan di Yandex

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 Algoritma Douglas-Pecker. Anda memiliki sekumpulan besar titik yang hanya mendekati garis lurus, namun sebenarnya Anda dapat memperkirakan garis ini hanya dengan dua titik. Ini adalah ide dari algoritma.

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.

Klasifikasi gambar tulisan tangan. Laporkan di Yandex

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.

Klasifikasi gambar tulisan tangan. Laporkan di Yandex

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.

Klasifikasi gambar tulisan tangan. Laporkan di Yandex

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.

Klasifikasi gambar tulisan tangan. Laporkan di Yandex

Klasifikasi gambar tulisan tangan. Laporkan di Yandex

Klasifikasi gambar tulisan tangan. Laporkan di Yandex

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.

Klasifikasi gambar tulisan tangan. Laporkan di Yandex

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.

Klasifikasi gambar tulisan tangan. Laporkan di Yandex

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. Contoh salah satunya β€” menyeimbangkan dari orang-orang yang menempati posisi pertama.

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.

Klasifikasi gambar tulisan tangan. Laporkan di Yandex

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

Tambah komentar