学ぶには、すべての手順を覚えていなければならない。それが壁になる。 上達するために、モデルは入力をすべての層を通して前向きに流す。そして自分の誤りから学ぶには、その途中結果をひとつ残らず取っておき、逆向きのパスに備えなければならない。問題は計算ではなかった。メモリだ。十分に深いモデルでは、前向きパス全体を一度に抱えること、それこそが場所を使い果たす原因になる。
なぜ全部とっておく? 責任を逆にたどるためだ。 Mstore=∑ℓ=1Laℓ=O(L)M_{\text{store}} = \sum_{\ell=1}^{L} a_{\ell} = O(L) 学習は各層にひとつ問う。君は誤差にどれだけ加担したか? それに答えるには、行きがけにその層が出した値の控えが要る。だからモデルは全部とっておく。コックが下ごしらえのボウルを一つ残らずパスに並べておくように: どの工程でソースが傷んだかを突き止めるため、ボウルをすべて出しっぱなしにすれば、料理が仕上がる前に台が埋まる。層ごとに値を一つ保存するということは、メモリの請求が深さ L と歩調を合わせて増えるということだ。
では保存しなければ? すると計算量が爆発する。 Crecompute=∑ℓ=1Lℓ=L(L+1)2=O(L2)C_{\text{recompute}} = \sum_{\ell=1}^{L} \ell = \frac{L(L+1)}{2} = O(L^{2}) あからさまな抜け道がある。何も保存せず、逆向きパスがある層の値を必要とするたびに、入力から計算し直せばいい。メモリは消える — だが計算量は膨れ上がる。毎回1階まで下りるように: 9階にたどり着くには、また一番下からやり直す、それを何度も。すべての層を一から作り直せば、総作業量は深さの二乗で増えていく。
解決策: いくつか目印を残し、あとはやり直す。 M(k)=Lk⏟waypoints+k⏟one segmentM(k) = \underbrace{\tfrac{L}{k}}_{\text{waypoints}} + \underbrace{k}_{\text{one segment}} どちらの極端もだめなら、中をとる。ほんの数層だけ活性値を保存し、残りは捨てる。逆向きパスが捨てた値を必要としたら、いちばん近い保存点からその短い区間だけを走らせ直す。ハイカーが1マイルごとに旗を立てるように: 一歩一歩は覚えない — 戻るには、最後の旗まで引き返してその短い一区間だけをやり直す。k 層ごとに目印を置けば、抱えるのは L/k 本の旗と、いまやり直している区間の k 歩だけだ。
間隔はどれだけ? 深さの平方根。 dMdk=−Lk2+1=0 ⇒ k∗=L,M∗=2L=O(L)\frac{dM}{dk} = -\frac{L}{k^{2}} + 1 = 0 \;\Rightarrow\; k^{*} = \sqrt{L}, \quad M^{*} = 2\sqrt{L} = O(\sqrt{L}) 目印を離しすぎれば一度の戻り歩きが長くなり、詰めすぎればメモリは少しも節約できない。二つのコストは互いに逆へ引き合い、釣り合ったとき合計が最小になる。リレーチームがバトンの間隔を配るように: 区間が長すぎれば各走者は消耗し、短すぎれば走者を雇った意味がない — どの区間も同じ短さのとき、チームは最速になる。釣り合いは √L 層ごとに旗1本のところに落ち着き、メモリはおよそ √L まで下がる。
代償は? 余分なパス1回。それだけの価値がある。 Cckpt≈Ffwd+Fbwd+Frecompute=F+2F+F=43 CfullC_{\text{ckpt}} \approx F_{\text{fwd}} + F_{\text{bwd}} + F_{\text{recompute}} = F + 2F + F = \tfrac{4}{3}\,C_{\text{full}} ただではない。捨てた区間はどれも逆向きパスのあいだに一度ずつ歩き直され、合計すると行きの旅全体をちょうどもう一回やり直すことになる。小さなバンを借りて二往復するように: 大きなトラックには手が届かなかったので、同じ道を二度走る — 少し時間はかかるが、荷物はちゃんと運べる。普通の一歩は行き1回・帰り2回。行きが1回増えれば、三つだったところが四つになる — およそ三分の一多い計算で、メモリはほぼ平方根まで削れる。
いまやメモリは壁ではなく、回せるつまみだ。 それが種明かしのすべてだ。メモリは壁であることをやめ、回せるつまみになる。少し時間を多くかければ、本来なら収まるはずのないモデルを収められる — 手元のハードが抱えきれないほど深いものを、忘れると決めたものを作り直すと引き受けるだけで、学習させられる。瓶の中で組み上げる帆船のように: 首を通らないはずのものが、それでもそこに収まる。辛抱強い巧みな手順で組み立てられて。捨てた作業は失われてなどいなかった — ただ、作り直すのが安かっただけだ。
🌱 作り直せる記憶は、そもそも記憶なのだろうか? それは忘れることを選び — そして、その考えがまた必要になったとき、ただ作り直した。私たちにはめったにその選択肢がない。私たちの過去は保存されるもので、導き直されるものではなく、失ったものはたいてい失われたままだ。だが、忘れたものをいつでも計算し直せるなら、忘れることははたして損失だったのか? すべてを覚えておくことこそ高くつく習慣で — 静かに作業をやり直すことが、より安く考える術なのかもしれない。