AIに未来を予想させよう!予測機能の仕組みを分かりやすく解説

2024年8月20日

AI予測
イラスト出展:OpenAI dall-e-3

初めに

こんにちは。イムでーす。今日はAIの予測機能について説明するねー。

世界一分かり易くAIについて解説します。本日はAIの予測機能について説明します。

※AIによる予測は専門的には回帰分析と言いますが、ここでは専門用語はあまり使わず予測と表記します。

予測機能とは

それでは予測とは何でしょうか?
予測の例として馴染の深いのは天気予報です。天気予報は明日は晴れるとか、今週末は雨だとかを予測して皆さんにお伝えしています。

このように、確定していない将来・未知の事を予想することを予測といいます。

予測ってAIでしか出来ないの?

AIは予測が得意ですが、先に述べた天気予報の様にAIの登場前から人は予測をしています。予測は別に未来が見える超能力者にしか出来ないことではなく、やり方が分かればAIやコンピューターが無くても出来ることです。

予測の仕方

例えば子供が毎年、身長を測りますね。今年は5cm伸びたから、来年も5cm伸びるかなーなんて予想したりしましたよね。この様に子供でも予測はできるのです。

では人はどうやって未来を予測しているかと言うと過去の経験を元に未来を予測しています。決して未来が見えているわけではないので外れることもありますが、過去にあったという根拠を元にしているので当たりやすいという理由です。

予測は線を引くこと

もう少しだけ難しいことを話します。
予測は線を引くことです。

何言ってるのー。わかんないー。

前述の身長の話を例にします。
6歳は115cm、7歳は121cm、8歳は124cmだったとします。この情報(データ)を紙にプロットして点を通るような線を引いてみて下さい。
人によっては直線で引くかもしれませんし、人によってはぐにゃぐにゃーと線を引くかもしれませんが、何れにしても線がひけましたね。

予測

そうすると、紙状に9歳より後の身長にも線が現れます。これが予測です。

小学校高学年から中学校で比例や二次関数を習いますが、あれが実は予想です。過去の事実など今ある情報(データ)を元に線をびーって引いて、将来など手持ちに無い情報も予想することが出来ます。専門用語でこれを回帰分析と言います。

機械(コンピューター)は予測が出来なかったの?

では人ができた予測をAIの登場前にコンピューターが出来なかったかというとそんなことはありません。

計算はコンピューターの得意とするところです。コンピューターでデータに比例線や二次曲線などを引くことは簡単に出来ます。もちろんもっと複雑な近似曲線を引くことも出来ます。

AIが何で騒がれてるの?

では従来のコンピューターで出来ていた予測をAIが出来るようになる何が嬉しいでしょうか?
AIを利用すると大きくは3つ良いことがあります。

より大量で複雑なデータを分析出来る

先の身長の例だと簡単なのですが、世の中のほとんどの事象は物凄く沢山の要因(専門用語で次元と言う)によって決まってきます。例えばラーメン屋の売上は、過去の客足数だけでなく天気やはたまた景気の見通しなどの様々な要因により変わってきます。

この様な予測をコンピューターでも計算出来なくは無いのですが、コンピューターに計算して貰うためには計算方法を人が考えてプログラムする必要がありました。
たくさんの要因があるとプログラムを考えるのがものすごーく大変でした。

しかし、AIは複雑で予測が大変な作業もデータを渡せば勝手にやってくれます。文系の上司が、理系の部下にこれ分析しといてって頼む感じです。

AI仕事
出展:OpenAI dall-e-3

※実際にはAIモデル作って学習させたり色々人がやることがありますが、高次元な問題はプログラムを書くよりAIに学習させる方が簡単です

AIは数字以外のデータも予測出来る

AIは例えば人物画像など数字以外のデータも予測が出来ます。先に予測は線を引くことと言いました。人物画像に線を引くって何のことと思うかもしれませんが、人物画像も無数の点の集まりなんです。なので線を引いて予想することが出来ます。
これをコンピュータのプログラムでやろうとすると非常に難しいというか現実的でないのですが、何とAIは画像でも予測が出来てしまいます。

※ 正しくはディープラーニングで次元圧縮をして線を引きやすくしてから線を引いてますが難しいことはここでは割愛します。

革新的な予想をする可能性がある

前述の身長の例ですが、小学生くらいの子供に線を引いてもらうと恐らく直線を引くと思います。もう少し大きな中学生以上ですと大人になると成長が止まるのを理解していますから直線ではなく成長が止まる方に収束するような曲線を引くかもしれません。
でも、幼稚園児とかに線を引いてもらったらどうでじょう。大人がハッとするような面白い線を引くかもしれません。

AIも時には人が考えない様な面白い予想をすることがあります。上記の幼稚園児の例は極端な話で、AIは基本的には与えるデータが正しければ突拍子も無いことはしませんが、大学の研究者でも解けない様な難解な問題をAIに解かせると研究者が考えつかなかった様な事を考えてくれる可能性があります。

AIが注目を集める理由の総括

総括しますとAIが昨今騒がれているのは、今まではプログラムで計算できなかった複雑な事象をAIなら(比較的)簡単に予測出来ること。また、人が考えつかなかったような革新的な予想をしてくれる可能性があるからとなります。

AIはどの様な方法で予測をしているのか?

では、AIはどのようにして予測を行っているのでしょうか?AIに詳しい方は、「AIは人の脳を模したニューラルネットワークを使っている」と答えるかもしれません。でも、正直なところ、何のことかよくわからないですよね?
ニューラルネットワーク

もう少し分かり易く教えて欲しいです。

AI専門家に怒られることを覚悟で簡単に説明すると、AIも人と同じようにデータに線を引いて、将来を予想しています。AIも人と同じ様に線を引いているのです。

ただ単純に線を引くのではなく高次元のデータ(要因がたくさんあるデータ)を無理やり低次元(極論は1次元)に次元圧縮して線を引きやすくした後に線を引いています。

次元圧縮
出展:OpenAI dall-e-3

AIの専門的な話

ちょっとー。私たちAIってそんなに簡単な仕組みじゃないと思うよ?プンプン

すみません。分かりやすく説明するために、かなり極端な例えをしました。
ここからは、コンピューターに詳しい方や興味がある方に向けて、少し専門的な話をします。

従来のプログラムの予測の仕方

それではまず、AIの前に従来のプログラムで予測する方法を説明します。
従来のプログラムで予想を行う場合、データ(点)を通るように線を引きます。線の引き方は色々ですが、基本的に線と点の距離が近くなる様に線を引きます。一番簡単な比例の直線の引き方は以下になります。

Python

# 比例の近似曲線を作成(ライブラリを使用しない方法)
#  x_dataとy_dataのデータ点から比例の近似直線を計算し、傾きと切片を返す。
#  引数:
#    x_data: 説明変数のデータリスト
#    y_data: 目的変数のデータリスト
#  戻り値:
#    (傾き, 切片) のタプル
def proportion_line(x_data, y_data):
  # データ数の確認
  if len(x_data) != len(y_data):
    raise ValueError("データ数が一致しません。")

  # 平均と分散の計算
  x_mean = sum(x_data) / len(x_data)
  y_mean = sum(y_data) / len(y_data)
  x_var = sum([(xi - x_mean)**2 for xi in x_data]) / len(x_data)
  xy_cov = sum([(xi - x_mean) * (yi - y_mean) for xi, yi in zip(x_data, y_data)]) / len(x_data)

  # 傾きの計算
  slope = xy_cov / x_var

  # 切片の計算
  intercept = y_mean - slope * x_mean

  return slope, intercept

# 例:データセットを用いた実行
x_data = [1, 2, 3, 4, 5]
y_data = [2, 4, 6, 8, 10]

slope, intercept = proportion_line(x_data, y_data)

print("傾き:", slope)
print("切片:", intercept)

AIによる予測の仕方

次にAIで予想を行う方法です。AIで予想を行う場合、RNNモデルとかLSTMというモデルにデータを食わせます。すると勝手に線を引いてくれます。ソースにすると以下になります。

Python
import numpy as np

def create_dataset(data, look_back):
  """
  時系列データをLSTMモデルで扱える形に変換する関数

  引数:
    data: 時系列データのリスト
    look_back: 過去のデータ点の数

  戻り値:
    x_train, y_train: トレーニングデータ
    x_test, y_test: テストデータ
  """
  x_data, y_data = [], []
  for i in range(len(data) - look_back):
    x_data.append(data[i:i + look_back])
    y_data.append(data[i + look_back])
  x_data = np.array(x_data)
  y_data = np.array(y_data)
  return x_data, y_data

def build_model(look_back, units):
  """
  LSTMモデルを構築する関数

  引数:
    look_back: 過去のデータ点の数
    units: LSTM層のユニット数

  戻り値:
    LSTMモデル
  """
  model = Sequential()
  model.add(LSTM(units, input_shape=(look_back, 1)))
  model.add(Dense(1))
  model.compile(loss='mean_squared_error', optimizer='adam')
  return model

def train_model(model, x_train, y_train, epochs, batch_size):
  """
  LSTMモデルを学習させる関数

  引数:
    model: 学習対象のLSTMモデル
    x_train: トレーニングデータ(入力)
    y_train: トレーニングデータ(出力)
    epochs: エポック数
    batch_size: バッチサイズ
  """
  model.fit(x_train, y_train, epochs=epochs, batch_size=batch_size, verbose=2)

def predict_model(model, x_test):
  """
  LSTMモデルを用いて予測を行う関数

  引数:
    model: 学習済みのLSTMモデル
    x_test: 予測対象データ

  戻り値:
    予測値
  """
  predictions = model.predict(x_test)
  return predictions

# データの準備
data = [10, 15, 20, 25, 30, 35, 40, 45, 50]
look_back = 3  # 過去の3データ点を利用する
x_train, y_train = create_dataset(data, look_back)

# モデルの構築
model = build_model(look_back, 10)

# モデルの学習
train_model(model, x_train, y_train, 100, 32)

# 予測の実行
x_test = np.array([data[-3:], data[-2:], data[-1:]])  # 過去の3データ点を入力
predictions = predict_model(model, x_test)
print(predictions)

詳しく解説しているサイトはたっくさんありますので、参考にリンク掲載致します。
https://qiita.com/m1takahashi/items/671d0e964fbac14c8f38

最後、まるっと別サイトにぶん投げました。
詳しく解説したらものすごーく長くなるので、別の機会に記事にしようと思います。

まあー、AI技術って、AI にぶん投げたら良きにAIがやってくれるものなので、ぶん投げ御愛嬌として下さいm( )m

わー。さいごぶんなげたーねー

本日のまとめ

まとめ
  • 予測とは今ある事実から未知の事象を推測することです
  • 予測するためにはデータに近似線を引きます
  • AIならプログラムでは難しい高度な予測もできます
  • AIは人が考え付かない様なことも考え付いてくれる可能性があります。
  • AIで予測をする場合、AIモデルにデータをぶん投げます