Lensa ML

Cara Kerja Batch Normalization

Langkah 1 dari 6: Masalahnya

Kenapa pergeseran data mematikan proses belajar

Data mengalir melewati layer:
InputHiddenOutput
Posisi data output pada activation function:
zona datarzona datarcuram = gradient bagusnilai pre-activationgrad
Besar pergeseran data (coba geser)0.0
Pergeseran data
0.0
Rata-rata gradient
0.248
Kondisi gradient
Kuat

Data mengalir dari Input ke Output. Titik-titik mendarat di bagian tengah sigmoid yang curam (titik hijau). Di situ gradient kuat dan network belajar dengan cepat.

Geser slider pergeseran dari 0 ke 3 dan perhatikan angka gradient. Distribusi input setiap layer bergantung pada semua weight sebelumnya, jadi distribusi itu berubah setiap kali weight diperbarui. Ioffe dan Szegedy menyebutnya internal covariate shift dan mengusulkan BN untuk menghilangkannya. Penelitian berikutnya meragukan penjelasan itu. Santurkar dkk. (2018) menemukan bahwa BN tetap membantu walaupun noise sengaja disuntikkan setelahnya, dan berpendapat manfaat sebenarnya adalah permukaan loss yang lebih halus, sehingga gradient lebih mudah diprediksi dan langkah yang lebih besar aman dipakai.

Langkah 2 dari 6: Posisi BN

Di antara linear layer dan aktivasi

Alur BN: x → Wx+b → BN → aktivasi → output
x1.5Wx+b1.8BNmatiσ(·)0.858output0.858
Posisi nilai pada kurva sigmoid:
grad=0.122
Skala weight1.0
Pre-BN
1.8
Post-BN
1.8
Gradient
0.122

Tanpa BN, weight kecil menjaga nilai tetap di rentang sigmoid yang berguna. Namun, training sering mendorong weight menjadi lebih besar.

Aktifkan atau matikan Batch Norm dan geser skala weight dari 0,5 sampai 4. Paper aslinya menempatkan BN setelah transformasi linear dan sebelum fungsi non-linear, seperti yang ditampilkan di sini. Kalau BN mengikuti linear layer, bias pada layer itu jadi mubazir, karena BN mengurangkan rata-rata lalu menambahkan β-nya sendiri. Itu sebabnya framework membangun layer seperti ini dengan bias dimatikan. Beberapa arsitektur menaruh BN setelah aktivasi, dan dalam praktiknya bedanya kecil. Pada CNN, BN menghitung satu rata-rata dan varians per channel, atas seluruh batch dan semua posisi spasial.

Langkah 3 dari 6: Cara BN Menghitung

Lihat hitungannya di dalam network

Satu batch berisi 4 input mengalir melewati satu layer:
InputWx+bBNσ(·)Outputx₁0.81.7-0.50.380.38x₂1.52.80.40.590.59x₃2.33.91.40.800.80x₄0.20.8-1.30.220.22μ=2.3 σ=1.2
Sebelum dan sesudah BN (nilai yang sama pada garis bilangan):
Sebelum(Wx+b)Sesudah(norm.)-28mean=2.31.72.83.90.80-0.510.381.40-1.28
Weight (W)1.5
Bias (b)0.5
Rata-rata batch
2.30
Std batch
1.18
Rentang norm.
-1.3…1.4

Empat input melewati Wx+b dan menghasilkan nilai pre-activation yang tersebar (garis atas). BN menghitung rata-rata dan standar deviasi batch, lalu menormalkan setiap nilai sebagai (x − mean) / std, sehingga semuanya berpusat di nol (garis bawah).

Geser weight W dan bias b, lalu bandingkan kartu rata-rata dan std batch. Rumus lengkapnya x̂ = (x − μ_B)/√(σ²_B + ε), lalu y = γ·x̂ + β. μ_B dan σ²_B berasal dari mini-batch saat ini, dan ε (1e-5 di demo ini) mencegah pembagian dengan nol. Dengan empat nilai, statistik batch mengandung banyak noise, dan output setiap contoh bergantung pada tiga contoh lainnya. Noise itu berfungsi sebagai regularizer, tetapi juga membuat BN buruk pada batch yang sangat kecil, kira-kira di bawah 8 sampai 16 contoh per perangkat.

Langkah 4 dari 6: Skala dan Pergeseran

γ dan β yang dipelajari memulihkan kemampuan layer

Mentah (ref.)Normalisasi x̂y = γx̂ + β
γ (skala)1.00
β (pergeseran)0.00
γ
1.00
β
0.00
Rentang output
-1.5…1.5

γ=1, β=0: output sama dengan nilai ternormalisasi. Ini titik awal sebelum network mempelajari skala dan pergeseran terbaik.

Geser γ dan β, lalu tekan Pulihkan nilai asli. Contoh batch-nya 2, 5, −1, 8, 3, dengan rata-rata 3,4 dan standar deviasi sekitar 3,0, sehingga γ = 3.0 dan β = 3.4 membatalkan normalisasi secara tepat. γ dan β dipelajari per feature, seperti weight lainnya, dan dimulai dari 1 dan 0. Trik umum di residual network adalah menginisialisasi γ dengan 0 pada BN terakhir setiap blok. Setiap blok lalu mulai sebagai fungsi identitas, sehingga network yang sangat dalam lebih mudah dilatih di awal.

Langkah 5 dari 6: Training vs Inference

Statistik batch vs running average

Rata-rata batch (titik) vs running average (garis) selama training:
Batch training
Rata-rata batchRunning avg
Training
memakai statistik batch
mean=2.1
normalized=0.27
Inference
memakai running avg
mean=0.2
normalized=1.65
Indeks batch0
Momentum0.10
Rata-rata batch
2.1
Running mean
0.21
Selisih
1.38

Saat training, BN memakai rata-rata batch saat ini (titik oranye). BN juga menyimpan running average (garis biru) yang mengikuti rata-rata batch dari waktu ke waktu. Training dan inference memberi output berbeda untuk nilai input yang sama.

Ubah indeks batch langkah demi langkah dan geser slider momentum. Running mean diperbarui dengan μ_run = (1 − m)·μ_run + m·μ_B, jadi momentum m menentukan seberapa cepat batch lama dilupakan. Default PyTorch adalah 0,1. Keras memakai konvensi sebaliknya, dengan default 0,99 untuk nilai lama. Memanggil model.eval() di PyTorch mengalihkan BN ke running statistics. Lupa memanggilnya adalah bug yang umum: prediksi jadi berubah mengikuti isi batch, dan inference satu contoh memberi hasil buruk.

Langkah 6 dari 6: Hasilnya

Training lebih cepat, learning rate lebih tinggi

EpochLoss020406080
Dengan BNTanpa BN
Epoch0
Learning rate0.010
LR
0.010
Loss (BN)
2.65
Loss (tanpa BN)
2.90

Pada learning rate yang konservatif ini, kedua model belajar lambat. Tekan Putar untuk melihat training-nya. Di sini pun BN sedikit unggul.

Tekan Putar, atau melangkah dengan −1 dan +1, lalu naikkan learning rate melewati 0,04 dan putar ulang. Ioffe dan Szegedy melaporkan bahwa network Inception dengan BN menyamai akurasi ImageNet versi aslinya dengan training step 14 kali lebih sedikit, dan bahwa BN membuat learning rate yang jauh lebih tinggi bisa dipakai. BN juga membuat network dengan aktivasi jenuh seperti sigmoid praktis untuk dilatih. Kurva di sini adalah simulasi yang disederhanakan dari efek tersebut, bukan model yang benar-benar dilatih, tetapi polanya cocok dengan yang dilihat para praktisi.

Apa itu batch normalization?

Batch normalization (BN) adalah layer yang menormalkan setiap feature ke rata-rata nol dan varians satu memakai statistik dari mini-batch saat ini, lalu menerapkan skala γ dan pergeseran β yang dipelajari. Posisinya biasanya di antara linear layer atau convolutional layer dan aktivasinya. Saat inference, BN memakai running average dari rata-rata dan varians yang dikumpulkan selama training.

Ioffe dan Szegedy memperkenalkan batch normalization pada 2015, dan metode ini cepat menjadi standar di convolutional network seperti ResNet. BN memungkinkan learning rate yang lebih tinggi, membuat training tidak terlalu peka terhadap inisialisasi, dan menambah efek regularization ringan. Transformer umumnya memakai layer normalization, yang menormalkan nilai-nilai di dalam setiap contoh dan tidak bergantung pada batch.

Ide utama

  • Batch normalization menskalakan ulang setiap feature ke rata-rata nol dan varians satu di dalam satu mini-batch.
  • Parameter γ dan β yang dipelajari memungkinkan network memulihkan skala dan pergeseran apa pun yang dibutuhkannya.
  • Training memakai statistik batch, sedangkan inference memakai running average yang dikumpulkan selama training.
  • BN memungkinkan learning rate yang lebih tinggi dan mengurangi kepekaan terhadap inisialisasi weight.
  • Batch kecil membuat statistik BN mengandung banyak noise, itu sebabnya transformer memakai layer normalization.
  • Alasan BN berhasil masih diperdebatkan. Permukaan loss yang lebih halus adalah salah satu penjelasan utama.

Ulasan singkat tentang topik ini

Pertanyaan umum

Apa bedanya batch normalization dan layer normalization?

Batch normalization menghitung rata-rata dan varians setiap feature di seluruh contoh dalam satu batch. Layer normalization menghitungnya di seluruh channel atau hidden unit dari satu contoh. Layer norm tidak bergantung pada ukuran batch dan berperilaku sama saat training dan inference, sehingga cocok untuk transformer dan recurrent network.

Batch normalization sebaiknya sebelum atau sesudah aktivasi?

Paper aslinya menaruhnya sebelum aktivasi, tepat setelah linear layer atau convolutional layer, dan itu pilihan paling umum. Menaruhnya setelah aktivasi juga bisa, dan kadang hasilnya sedikit lebih baik. Pilihan ini jarang banyak mengubah hasil.

Bisakah batch normalization dipakai bersama dropout?

Bisa, tetapi keduanya bisa saling mengganggu: dropout mengubah varians aktivasi antara training dan inference, sehingga statistik yang diandalkan BN ikut bergeser. Network yang memakai BN sering hanya butuh sedikit dropout atau tidak sama sekali. Kalau keduanya dipakai, dropout biasanya ditaruh setelah layer BN terakhir.

Kenapa model dengan batch norm lebih buruk dalam mode evaluasi?

Dalam mode evaluasi, BN memakai running average, bukan statistik batch. Kalau running average itu buruk, misalnya setelah sangat sedikit training step, setelah fine-tuning pada data yang berbeda, atau dengan momentum yang terlalu rendah, output akan bergeser. Biasanya masalah ini beres dengan menghitung ulang running statistics pada data training.

Penjelasan terkait

Referensi

  1. Ioffe & Szegedy (2015), "Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift"
  2. Santurkar et al. (2018), "How Does Batch Normalization Help Optimization?"
  3. Zhang et al., "Dive into Deep Learning", section 8.5: Batch Normalization

Terakhir diperbarui