← 一覧へ
連載 Agentic OS:技術スタックを下から読む の一部です ―― 目次を見る →

Agentic OS 技術スタックを下から読む 第33回:ゼロから鍛えるとき、効くのは派手な工夫ではない ―― 静かに失敗する訓練を、一段ずつ確かめる

この記事の読み方
前回は、できあがった賢さを少ないビットに載せる話をしました。

Agentic OS 技術スタックを下から読む 第33回:ゼロから鍛えるとき、効くのは派手な工夫ではない ―― 静かに失敗する訓練を、一段ずつ確かめる

派手な工夫の前に、地味な土台

前回は、できあがった賢さを少ないビットに載せる話をしました。

今回は、その手前に戻ります。

そもそも、モデルをゼロから鍛えるとき、何がいちばん効くのでしょうか。

答えは、意外なほど地味です。

派手な形の工夫ではありません。

複雑な部品を足すことでもありません。

まず効くのは、データを目で見て、各段を検算し、一度に一つだけ変え、先に小さく過学習させることです。

訓練は、外から見ると数行の処理に見えます。

入力を入れる。

誤差を計算する。

重みを少し動かす。

これを何度も繰り返す。

けれど、その数行の下では、静かな失敗がいくつも起きます。

しかも、その失敗は大きな音を立てません。

止まりません。

例外も出ません。

ただ、少しだけ悪いモデルができあがります。

部品を正しく呼んでも、勝手には効かない

普通のソフトでは、よくできた部品は中の複雑さを隠してくれます。

正しい形で呼べば、だいたい期待どおりに動きます。

ファイルを読む部品なら、ファイルを読みます。

並べ替える部品なら、順番を整えます。

間違えば、その場でエラーが出ることも多いです。

訓練では、ここが違います。

部品を正しく呼んでも、よいモデルになるとは限りません。

入力の形が合っている。

誤差も計算されている。

重みも更新されている。

画面には数字が流れている。

それでも、肝心の学び方が少しずれていることがあります。

原因は、文法の誤りではありません。

データの誤りです。

設定の誤りです。

手順の誤りです。

そして、それらは多くの場合、処理を止めてくれません。

訓練とは、動くか動かないかの作業ではありません。

動いているように見えるものが、本当に正しく学んでいるかを確かめる作業です。

静かに失敗する

いちばん厄介なのは、失敗が静かに起きることです。

訓練は走ります。

誤差も下がります。

途中の表示もそれらしく見えます。

それなのに、できあがったものは少しだけ悪い。

あるいは、ある場面でだけ結論を間違えます。

たとえば、画像を左右反転してデータを増やすとします。

左を向いたものを右向きにして、見かけの数を増やすわけです。

このとき、対応する正解の向きも反転しなければなりません。

入力だけ反転して、正解を元のままにすると、入力と正解の関係が壊れます。

モデルは、その壊れた関係も学ぼうとします。

すると、反転された画像を見抜いて、内部でずれを打ち消すような変な近道を覚えます。

訓練の数字は下がるかもしれません。

けれど、それは本来の課題を解いたからではありません。

壊れた癖に合わせただけです。

別の例もあります。

外れ値の影響を抑えたいとします。

外れ値とは、ほかの値から大きく離れた値です。

本当は、入力の値を一定の範囲に収めるつもりでした。

ところが、間違って損失のほうを切ってしまったとします。

損失とは、答えの外れ具合を数字にしたものです。

損失を切ると、大きく間違えた例の痛みが消えます。

すると、見かけの数字は良くなります。

でも、難しい例を学んだわけではありません。

ただ、都合の悪い間違いを数えなくしただけです。

さらに、前に鍛えた状態から再開するときにも落とし穴があります。

前の訓練では、入力の値をある範囲にならしていたとします。

ならすとは、値の中心や幅をそろえて、扱いやすくすることです。

そのならし方を引き継ぎ忘れると、同じ見た目の入力でも、モデルに届く数値の意味が変わります。

モデルは、前に覚えた重みを持っています。

しかし、入ってくる値の尺度が変わっています。

これも止まりません。

ただ、少しずれたまま進みます。

だから、自分から見に行く必要があります。

静かな失敗は、待っていても見つかりません。

まずデータに触れる、モデルには触れない

最初の一歩は、モデルのコードに触れないことです。

代わりに、データを見ます。

何時間もかけて、何千ものサンプルを眺めます。

同じものが何度も入っていないかを見ます。

壊れた中身が混ざっていないかを見ます。

特定の種類だけ多すぎないかを見ます。

正解の付け方がずれていないかを見ます。

そもそも、解きたい問いに必要な手がかりが、入力の中に本当にあるかを見ます。

これは退屈に見えます。

けれど、いちばん割に合う時間です。

データに手がかりが入っていなければ、どんなモデルでも取り出せません。

たとえば、写真から部品の向きを当てたいのに、写真がすべて正面からしか撮られていないとします。

横向きの手がかりは、そこにはありません。

その状態で訓練を工夫しても、横向きの判断は安定しません。

モデルが弱いのではありません。

材料が足りないのです。

データを見るとは、入力と正解の契約を読むことです。

この入力から、この正解は本当に決まるのか。

人間が見ても迷うものを、モデルだけに解かせようとしていないか。

そこを先に確かめます。

信頼を積むための検算

データをつかんだら、いきなり複雑なものを作りません。

端から端まで通る最小の骨組みを作ります。

そして、それが正しく動くことを検算します。

まず、乱数の種を固定します。

乱数の種とは、ばらつきの始まりを決める値です。

これを固定すると、同じ条件では同じ結果が出ます。

そうしないと、良くなった理由が分かりません。

工夫が効いたのか。

たまたま良い初期値を引いただけなのか。

区別できなくなります。

次に、鍛え始めの誤差を手計算と突き合わせます。

いくつかの選択肢から一つを当てる課題を考えます。

まだ何も学んでいないなら、どれも同じくらいの確率で選ぶはずです。

選択肢が n 個なら、正解に置かれる確率は 1/n です。

このときの誤差は、一般に -log(1/n) になります。

実際の値がそこから大きくずれていたら、すでに何かがおかしいです。

正解の番号がずれているかもしれません。

誤差の計算に入れる形が違うかもしれません。

次に、入力を全部ゼロにした基線と比べます。

基線とは、最低限の比べ相手です。

本物の入力を入れたほうが、ゼロだけの入力より良くなるはずです。

良くならないなら、モデルは入力を見ていない可能性があります。

途中で値が消えているかもしれません。

列の順番が違っているかもしれません。

正解だけを見ているような漏れがあるかもしれません。

さらに、サンプルを二つだけ取り出します。

その二つだけを、完全に覚え込ませます。

二つしかないなら、訓練の誤差はほぼゼロまで落ちるはずです。

落ちないなら、能力の問題ではありません。

配管のどこかが壊れています。

重みが更新されていない。

誤差が正しい場所から返っていない。

入力と正解が対応していない。

そういう問題を疑います。

最後に、計算へ通す直前の中身を目で見ます。

頭の中では、きれいな数値が流れているつもりです。

実際には、空の文字列が混ざっていることがあります。

単位が違うことがあります。

順番が一つずれていることがあります。

見れば一分で分かる問題を、見ないまま一週間追うことがあります。

だから、直前の中身を見るのです。

英雄にならない

骨組みが信頼できたら、少しずつ複雑にします。

ここで大事なのは、英雄にならないことです。

最初から、複雑で見栄えのする作りにしません。

まず、確かに動くと分かっている地味な作りを真似ます。

そのうえで、複雑さを一つだけ足します。

足したら測ります。

予期した分だけ良くなったかを見ます。

悪くなったなら戻します。

これは、自分のコードを小さな学習率で育てるようなものです。

学習率とは、一回でどれだけ重みを動かすかを決める幅です。

大きすぎると、良い方向を通り過ぎます。

小さければ遅いですが、崩れにくいです。

コードも同じです。

一度に十の工夫を入れると、良くなっても理由が分かりません。

どれが効いたのかが消えます。

悪くなったときは、もっと困ります。

どれが壊したのかを探すために、十の変更をほどく必要があります。

小さく変えることは、臆病ではありません。

原因を残すための技術です。

訓練の仕事では、速く進むことより、あとで説明できることのほうが強いです。

まず過学習し、それから締める

モデル探しにも順番があります。

まず、十分に大きいモデルで、手元の訓練のまとまりを過学習させます。

過学習とは、手元の例を覚えすぎて、見たことのない例に弱くなることです。

ふつうは避けたい状態です。

けれど、最初はあえてそこまで行かせます。

理由は単純です。

手元の訓練例すら覚えられないなら、まだ先へ進めないからです。

訓練の誤差がどうしても下がらないとします。

そのとき、すぐに賢さ不足だと考えてはいけません。

まだバグがあるかもしれません。

データに誤りがあるかもしれません。

設定がきつすぎるかもしれません。

能力の話に進む前に、まず訓練例を覚えられることを確かめます。

覚えられると分かったら、初めて締めます。

データを増やします。

反転や切り出しなどで、水増しします。

入力から余計な手がかりを外します。

モデルを少し小さくします。

覚えすぎる前に早めに止めます。

こうして、訓練の見事さを少し犠牲にします。

その代わり、見たことのない側での出来を上げます。

順番を逆にすると、分からなくなります。

先に締めてしまうと、誤差が下がらない理由が二つに割れます。

モデルに力がないのか。

締めすぎたのか。

その区別がつきません。

だから、まず能力を見せます。

それから締めます。

土台の背骨としての規律

ゼロから鍛える土台は、ひらめきではありません。

静かな失敗を、一段ずつ潰していく規律です。

データに先に触れる。

検算で配管を確かめる。

一度に一つだけ変える。

まず過学習してから締める。

この順番は、地味です。

けれど、地味だから効きます。

そして、この規律は今回だけの話ではありません。

この連載のあちこちで、同じ姿勢が出てきました。

検証では、失敗の記録を一件ずつ人が読みました。

判定を任せる前に、判定者を人手の判定につなぎ留めました。

外の現場では、戻せない操作の手前に人を置きました。

どれも根は同じです。

一度に賭けない。

各段で確かめる。

静かな失敗を早く捕まえる。

これが、賢さを積み上げる土台のいちばん下にある背骨です。

賢さは、土台が信頼できて初めて、その上に積み上がります。

次回は、この連載で下から積んできた層の全体を、何が一つに束ねるのか、という話へ向かいます。

← 一覧へ