Putus Sekolah yang lebih baik! Menerapkan DropBlock di PyTorch

Versi interaktif artikel ini dapat ditemukan di sini

DropBlock tersedia di kacamata di perpustakaan visi komputer saya!

Perkenalan

Hari ini kita akan menerapkan DropBlock di PyTorch! DropBlock yang diperkenalkan oleh Ghiasi dkk adalah teknik regularisasi perajin khusus untuk gambar yang secara empiris bekerja lebih baik daripada Dropout. Mengapa Dropout saja tidak cukup?

Masalah Dropout pada gambar

Dropout adalah teknik regularisasi yang secara acak menjatuhkan (disetel ke nol) bagian masukan sebelum meneruskannya ke lapisan berikutnya. Jika Anda belum mengenalnya, saya merekomendasikan catatan kuliah ini dari Standford (lompat ke bagian dropout). Jika kita ingin menggunakannya di PyTorch, kita bisa langsung mengimpornya dari perpustakaan. Mari kita lihat contohnya!

Seperti yang Anda lihat, piksel input acak dihilangkan!

Teknik ini bekerja dengan baik pada data 1D, namun dengan data 2D, kita bisa melakukannya lebih baik.

Masalah utamanya adalah kami menghilangkan piksel independen dan hal ini tidak efektif dalam menghapus informasi semantik karena aktivasi di sekitar berisi informasi yang berkaitan erat. Saya pikir ini cukup intuitif, meskipun kita menghilangkan satu elemen, tetangga masih dapat membawa informasi penting.

Mari jelajahi apa yang terjadi dengan peta fitur. Dalam kode berikut, pertama-tama kita mendapatkan gambar baby yoda, lalu kita membuat resnet18 yang telah dilatih sebelumnya menggunakan kacamata. Kemudian kita masukkan ke dalam gambar dan dapatkan peta fitur dari lapisan kedua. Terakhir, kami menampilkan aktivasi saluran pertama dengan dan tanpa Dropout

Di sebelah kiri, kami memiliki aktivasi peta fitur, di sebelah kanan, aktivasi peta fitur yang sama setelah putus sekolah. Mereka terlihat sangat mirip, perhatikan bagaimana di setiap wilayah, meskipun beberapa unit bernilai nol, aktivasi tetangga masih aktif. Artinya, informasi akan disebarkan ke lapisan berikutnya, itu tidak ideal.

JatuhkanBlok

DropBlock memecahkan masalah ini dengan menghapus wilayah berkelanjutan dari peta fitur, gambar berikut menunjukkan ide utamanya.

Dropblock berfungsi sebagai berikut

Penerapan

Kita bisa mulai dengan mendefinisikan layer DropBlock dengan parameter yang benar

block_size adalah ukuran setiap wilayah yang akan kita hapus dari sebuah input, p adalah keep_prob seperti di Dropout.

Sejauh ini bagus. Sekarang bagian yang sulit, kita perlu menghitung gamma yang mengontrol fitur yang akan dihapus. Jika kita ingin mempertahankan setiap aktivasi dengan p prob, kita dapat mengambil sampel dari distribusi Bernoulli dengan mean 1 - p seperti di Dropout. Masalahnya adalah kita menyetel ke nol block_size ** 2 unit.

Gamma dihitung menggunakan

Sisi kiri perkalian adalah banyaknya satuan yang akan dijadikan nol. Sedangkan sisi kanan adalah wilayah valid, jumlah pikselnya tidak tersentuh oleh dropblock

# Output
0.14222222222222222 

Langkah selanjutnya adalah mengambil sampel mask $M$ dengan ukuran yang sama dengan input dari distribusi Bernoulli dengan gamma pusat, di PyTorch semudah

Selanjutnya, kita perlu menghilangkan area berukuran block_size. Kita dapat menggunakan kumpulan maksimal dengan kernel_size sama dengan block_size dan satu langkah piksel untuk membuatnya. Ingatlah bahwa mask adalah topeng biner (hanya 0 dan 1) jadi ketika maxpool melihat 1 di radius kernel_size-nya, ia akan menghasilkan output satu, dengan menggunakan langkah 1 kami memastikan bahwa dalam output wilayah ukuran block_size x block_size dibuat jika setidaknya satu unit masukan disetel ke 1. Karena kita ingin menghilangkannya, kita perlu membalikkannya. Di PyTorch

Lalu kita normalkan

x = mask_block * x * (mask_block.numel() / mask_block.sum())

Mari kita uji dengan baby yoda, untuk lebih mudahnya kami akan menampilkan unit yang dijatuhkan di saluran pertama

Kelihatannya bagus, mari kita lihat peta fitur dari model yang telah dilatih sebelumnya (seperti sebelumnya)

Kami berhasil menghilangkan wilayah berkelanjutan dan tidak hanya unit individual.

Omong-omong, DropBlock sama dengan Dropout jika block_size = 1 dan dengan Dropout2d(alias SpatialDropout) jika block_size adalah peta fitur lengkap.

Kesimpulan

Sekarang kita tahu cara mengimplementasikan DropBlock di PyTorch, sebuah teknik regularisasi yang keren. Makalah ini menunjukkan hasil empiris yang berbeda. Mereka menggunakan vanilla resnet50 dan secara berulang menambahkan regularisasi yang berbeda, hal ini ditunjukkan pada tabel berikut

Seperti yang Anda lihat, arsip `ResNet-50 + DropBlock` + 1% dibandingkan dengan SpatialDropout (`Dropout2d` klasik di PyTorch).

Di makalah terdapat lebih banyak studi dengan hyperparameter DropBlock yang berbeda, jika Anda tertarik lihatlah :)

Terima kasih telah membaca!

Francesco