2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【気まぐれAI】なぜ、AIの答えは毎回、変わるのか?

2
Posted at

なぜ同じ質問に違う答えが返ってくるのか?

ChatGPTなどのAIを使っていると、同じ設定(temperature=0)にしても、微妙に回答が変わることに気づきます。「AIに気分があるのか?」と思うかもしれませんが、実はAIの仕組み、つまり、数学的な問題にたどり着きます。

1. コンピュータは「0.1」を正しく扱えない

私たちが普段使っている10進法の「0.1」は、コンピュータが使う2進法では無限小数になってしまいます。そのため、コンピュータはどこかで数字を切り捨てます。

これを**「丸め誤差」**と呼びます。この時点で、数学的な正解とコンピュータの中の数値には、ほんのわずかな違いが生まれます。

2. 実験:足し算の順番を変えるだけで結果が狂う

「1 + 2 + 3」も「3 + 2 + 1」も答えは6ですよね?

しかし、AIの計算(浮動小数点演算)では、この常識が通用しません。実際にPythonで、精度を落とした計算(AIが高速化のために使っている形式)を試してみると面白い結果が出ます。

今回は、以下の2つの方法で、0.1を10個足すだけのシンプルな計算をしてみましょう。

  • 計算A: 一気に10個足す
  • 計算B: 3個と7個に分けてから足す
import numpy as np

# AIでよく使われる「float16」という低精度な型を指定
# これにより誤差が顕著に現れるようになります
dtype = np.float16

# 0.1を10個用意
vals = np.array([0.1] * 10, dtype=dtype)

# 2. 普通に全部足す (0.1 * 10 = 1.0 になるはず?)
sum_normal = vals.sum()

# 3. 最初の3つだけ先に足してから、残りを足す
# 数学的には同じはずですが、コンピュータの処理順序を強制的に変えます
sum_split = vals[:3].sum() + vals[3:].sum()

print(f"【計算A】一気に足した場合  : {sum_normal}")
print(f"【計算B】分割して足した場合 : {sum_split}")
print("-" * 35)
print(f"一致するか? :{sum_normal == sum_split}")
print(f"発生した誤差 :{abs(sum_normal - sum_split)}")

image.png

一気に足すと 1.0 なのに、分割して足すと 0.999... になる。

つまり、「計算の順序」が変わるだけで、結果が変わってしまうのです。

3. 原因はGPUの「超並列処理」

なぜAIでこの「計算順序の入れ換え」が起きるのでしょうか?

それは、AIを動かしているGPUというチップの仕組みにあります。

GPUは数千個の小さなコアが同時に計算を行う「超並列」の達人です。

「手が空いたコアから順番に計算を割り振る」というスタイルで爆速化を実現していますが、そのせいで 「どの数値とどの数値が先に足されるか」が、その時々のタイミングで微妙に変わってしまう のです。

AIの「気まぐれ」は高速化の代償

AIの内部では、この「0.000...」という微小な誤差が数兆回繰り返されています。

ある計算で 0.999 が 1.000 になった瞬間、AIが出す次の単語の確率ランキングが入れ替わり、私たちの目には「違う回答」として映ります。

AIの回答が毎回違うのは、AIが悩んでいるからではありません。

「2進法の限界」「爆速で計算しようとするGPUの努力」 が生んだ、物理的な副作用なのです。

💡 コラム:AIの「柔軟性」は、あえて曖昧にすることで生まれる

厳密な計算誤差が「不具合」だとしたら、AIの「学習方法」はその誤差を逆に活かして「余裕」を作っています。完全な、寸分違わぬ一つの答えを突き詰めようとすると機械は壊れてしまうのでしょうか?

「正解」ではなく「確率」を学んでいる

AIは「Aの次はB」と丸暗記しているわけではありません。「次に来る確率が高い(80%、15%...)」という確率の分布を学習しています。常に複数の選択肢を抱えているため、計算誤差による「0.000...1」の変動で、1位と2位が容易に入れ替わってしまうのです。

「あえてお休み」させて柔軟に育てる(Dropout)

学習中、AIの一部の神経回路をランダムに休ませる「ドロップアウト」という手法が取られます。これは、特定のパターンに依存しない「柔軟な思考」を身につけるためです。この育てられ方が、推論時の「ゆらぎ(多様な回答)」の土壌になっています。

ネットの「矛盾」をそのまま吸収している

AIの教科書は、世界中の人間が書いたインターネットの海です。そこには多様な意見や矛盾が溢れています。AIは「正解は一つではない」という現実をそのまま学んでいるため、答えが一つに固定されないのは、ある意味で 「情報の多様性」 の反映でもあります。

計算機としての「物理的なゆらぎ」と、学習による「柔軟な作り方」。これら二つの要素が合わさることで、AIは単なる計算機を超えた、人間のようにクリエイティブなパートナーとして振る舞うことができています。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?