b belajar.myudak

Inisialisasi bobot

Kembalikan simpangan baku untuk inisialisasi normal bobot sebuah layer dengan fan_in input dan fan_out output:

modestdcocok untuk
"xavier"2/(fan_in+fan_out)\sqrt{2/(\text{fan\_in}+\text{fan\_out})}tanh, sigmoid
"kaiming"2/fan_in\sqrt{2/\text{fan\_in}}ReLU
"lecun"1/fan_in\sqrt{1/\text{fan\_in}}linear, SELU
init_std(100, 100, "xavier")  →  0.1

Masalahnya

Satu neuron menjumlahkan fan_in suku wixiw_i x_i. Jika ww dan xx independen dengan rata-rata 0:

Var(z)=fan_in⋅Var(w)⋅Var(x)\text{Var}(z) = \text{fan\_in}\cdot\text{Var}(w)\cdot\text{Var}(x)

Jika Var(w)\text{Var}(w) terlalu besar, varians aktivasi berlipat di setiap layer dan meledak. Jika terlalu kecil, aktivasi mengecil sampai nol. Di jaringan 50 layer, faktor 1.1 per layer sudah berarti 1.150≈1171.1^{50} \approx 117.

Solusinya

Pilih Var(w)=1/fan_in\text{Var}(w) = 1/\text{fan\_in} supaya Var(z)=Var(x)\text{Var}(z) = \text{Var}(x) (LeCun). ReLU membuang separuh sinyal (bagian negatif), jadi Kaiming mengalikannya dengan 2. Xavier merata-rata fan_in dan fan_out supaya varians terjaga di arah forward dan backward.

Di GPT

GPT-2 memakai std 0.02 untuk hampir semua bobot, lalu mengecilkan proyeksi residual dengan faktor 1/2L1/\sqrt{2L}. Tanpa itu, penjumlahan LL blok residual akan membuat varians tumbuh sebanding dengan kedalaman.

Penjelasan

Yang diminta. Simpangan baku inisialisasi untuk tiga skema, dari fan_in dan fan_out.

Asal rumusnya. Satu neuron menjumlahkan fan_in suku wixiw_i x_i. Jika semuanya independen dengan rata-rata 0, varians jumlahnya adalah jumlah variansnya:

Var(z)=fan_in⋅Var(w)⋅Var(x)\text{Var}(z) = \text{fan\_in}\cdot\text{Var}(w)\cdot\text{Var}(x)

Supaya sinyal tidak membesar atau mengecil dari layer ke layer, kita ingin Var(z)=Var(x)\text{Var}(z) = \text{Var}(x):

  • LeCun: Var(w)=1/fan_in\text{Var}(w) = 1/\text{fan\_in}, jadi std = sqrt(1 / fan_in).
  • Kaiming (He): ReLU membuang separuh sinyal, jadi variansnya digandakan: std = sqrt(2 / fan_in).
  • Xavier (Glorot): menjaga varians di arah forward (fan_in) dan backward (fan_out), sehingga memakai rata-rata keduanya: std = sqrt(2 / (fan_in + fan_out)).

Langkah di kode: tiga if yang mengembalikan rumus masing-masing, plus raise ValueError untuk mode yang tidak dikenal.

Cek. Xavier (100, 100): 2/200=0.1\sqrt{2/200} = 0.1. Kaiming 512: 2/512=0.0625\sqrt{2/512} = 0.0625.

Yang dikembalikan: satu float.

Topik
inisialisasixavierkaiming
Petunjuk 1

Xavier (Glorot): std = √(2 / (fan_in + fan_out)).

Petunjuk 2

Kaiming (He): std = √(2 / fan_in). LeCun: std = √(1 / fan_in).

Python 3.14 · NumPy

Pengaturan editor

Ukuran font
Ukuran huruf di editor.
Ukuran tab
Lebar indentasi. Otomatis: 2 spasi untuk TypeScript, 4 untuk Python.
Key bindings
Ganti ke mode Vim.
Nomor baris relatif
Nomor baris dihitung dari posisi kursor (berguna untuk gerakan Vim).
Word wrap
Baris panjang dilipat agar muat di lebar editor.
IntelliSense
Saran kode otomatis saat mengetik (Ctrl+Spasi tetap bisa dipakai saat mati).

Nilai ditulis sebagai JSON. Output yang diharapkan dihitung dari solusi referensi.