STEP 4・パラメータ初期化

ガウス分布で初期化 ― ゼロ近傍の当て推量から始める

記事で詰まったところ

「重みをガウス分布(正規分布)で初期化」「対称性の破れ」が、なぜ必要なのか分からない。

機械学習ではこう言う

学習前の重みを、平均0・小さな分散の正規分布でランダムに置く。全部同じ値だと各重みの区別がつかず学習が進まない(対称性の破れ)。

期初見積りの「当て推量」

実績のない新設子会社の引当率を、最初は根拠の薄いまま、ゼロ近傍で少しずつ違う値としてばらまくのに似ている。

なぜ全科目を同じ値にしないか。全部同じだと、どの科目がどう効いたのか区別がつかなくなり、月次実績で修正しようにも動かしようがない。少しずつ違えておくから、実績との差で各々を別々に寄せていける。

平均0・小さい分散にするのは、最初から大きく振らずに「ほぼ横並びの当て推量」から出発し、データで妥当値へ寄せていくため。

言葉の対応表

microGPT(機械学習)
会計・簿記の言葉
ガウス分布で初期化
ゼロ近傍の当て推量で見積りを置く
対称性の破れ
全科目同値だと区別がつかない
平均0・小さい分散
大きく振らずほぼ横並びから出発

触って確かめる

−25.0%0%(平均)+25.0%

新設子会社の引当率を、実績がないままゼロ近傍で少しずつ違う値として置いた状態。 全科目を同じ値にすると区別がつかず(=対称性が破れず)、月次実績で各々を別々に寄せられない。だからわざとバラす。

⚠️ 初期化の分散の取り方には理論(Xavier等)がある。ここは「区別をつける」直感に絞った例示。

実際のコード(microgpt.py L80-81)

この簿記アナロジーが、Karpathy のオリジナル200行のどの行に当たるか。

matrix = lambda nout, nin, std=0.08: [[Value(random.gauss(0, std))
              for _ in range(nin)] for _ in range(nout)]
state_dict = {'wte': matrix(vocab_size, n_embd),
              'wpe': matrix(block_size, n_embd),
              'lm_head': matrix(vocab_size, n_embd)}

random.gauss(0, std=0.08)=平均0・小さな分散の正規分布で各重みを別々の値に。全部違えるから後で個別に修正できる(対称性の破れ)。

出典: karpathy / microgpt.py (本体は原文ママ、コメントのみ日本語に補足)