計算が苦手なのは、直らない
文章を書く人工知能のことを、大規模言語モデルという。英語で large language model、その頭文字をとって LLM とも書く。オープンAIの GPT、グーグルの Gemini、アンソロピックの Claude が、それにあたる。以下ではモデルと呼ぶ。
難しい文章は書けるのに、四桁の掛け算を間違える。この落差は、有名な割に、理由があまり説明されていない。
賢さの問題ではない。仕組みから出てくる話である。
数字も、語として並んでいる
モデルは文字列を受け取って文字列を返す。数字も、その文字列の一部でしかない。
数を渡したとき、モデルの側でそれがどう区切られているかは、こちらから見えない。しかも、揃っていない。
よく挙げられる例がある。「480」は一つの塊として扱われるのに、「481」は「4」と「81」に割れる。隣り合った数なのに、切れ目の位置が違う。区切り方は、その並びが世の中にどれくらい出てくるかで決まっていて、数としての性質とは関係がないからである。
こうなると、筆算に必要な桁の縦の揃えが、そもそも作れない。一の位と一の位が同じ形で並んでいない。
つまり、モデルにとって「3742」は、三千七百四十二という量ではない。よく一緒に出てくる記号の並びである。
筆算は、手続きである
掛け算の筆算を思い出すと、やっていることは並べる作業ではない。
一の位から順に掛けて、繰り上がりを覚えておいて、次の桁に足す。桁をずらして書く。最後に縦に足す。途中で覚えておく値があって、それを持ち回りながら、決まった順で処理する。
この「覚えておいて、次に使う」という動作が、確率で語を並べる仕組みの中に無い。あるのは、次に来そうな記号を選ぶ動作だけである。
だから、モデルは筆算をしていない。掛け算の答えらしい数を、選んでいる。
見たことのある式は当たる
これで、実際の振る舞いが説明できる。
12×12 は当たる。よく出てくる並びだからである。144 という答えが、その式のあとに来る確率がとても高い。覚えているのに近い。
四桁どうしになると外す。その式が世の中にほとんど出てこないので、答えの並びを覚えようがない。かわりに、それらしい桁数の、それらしい数が出る。上の桁は合っていて、下の桁が違う、という外し方をよくする。上の桁は大まかな大きさから当てられるが、下の桁は繰り上がりを最後まで持ち回らないと決まらないからである。
そして、外したことが見た目に出ない。確からしさは出力に現れない。144 と同じ顔で、間違った八桁が出てくる。
大きくしても、消えない
ここが肝心なところだと思う。
これは、モデルが大きくなれば直る種類の欠陥ではない。大きくすれば、よく出てくる式の範囲が広がるので、当たる範囲は広がる。だが、当て方が変わるわけではない。相変わらず、答えらしい数を選んでいる。
手続きを実行する場所が仕組みの中に無い、というのが原因なので、原因の側は動かない。
区切り方を変えただけで、上がった
これが構造の話だという証拠が一つある。
二〇二四年、シンとストラウスという二人が、数字を右から区切るようにしただけで、計算の正答率が二十二ポイント以上上がることを示した。
モデルは変えていない。大きくもしていない。学習し直してもいない。数の切り分け方を、筆算の向きに揃えただけである。
賢さの側をいじらずに、並び方の側をいじったら効いた。効いた場所が、原因の場所である。
対処は、外に出すこと
だから、対処も決まっている。計算を、モデルの外でやる。
いまはたいていの道具で、これが自動でできるようになっている。モデルが計算式を書いて、外側のプログラムがそれを実行して、結果を返す。モデルがやったのは、計算ではなく、計算式を書くことである。コードは文章なので、そこは得意な仕事になる。
途中式を書かせるのも、少し効く。桁ごとに分けて書かせれば、一度に決めなければならない量が減るからである。ただし、途中式も確率で選ばれているので、保証にはならない。
見分け方
同じ形の欠陥は、他にもある。
数える。並べ替える。個数を数え上げる。順番どおりに処理する。どれも、途中の状態を持ち回る手続きであって、次に来そうなものを選ぶ動作とは別物である。
こういう仕事を頼むときは、いくら賢いモデルでも当てにしない方がいい。賢さが足りないのではなく、そういう動作が入っていない。
そして、入っていないものは、外に足すしかない。