modelについて調査してみた。(初心者がChatGPTを使ってAIを作って研究してみた)

ChatGTP-AI研究開発

はじめに

前回に引き続きChatGPTに聞いたAIのコードを勉強していきます。今回はmodelについて調べていきます。modelはAIの根幹であり、精度や性能に関わってくるようです。詳しく調べていきましょう。

modelについて調査してみた

とりあえず、ChatGPTに聞いたコードを再掲。

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical

# MNISTデータセットの読み込み
(X_train, y_train), (X_test, y_test) = mnist.load_data()

# データの前処理
X_train = X_train.reshape((X_train.shape[0], -1)).astype('float32') / 255
X_test = X_test.reshape((X_test.shape[0], -1)).astype('float32') / 255
y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)

# モデルの構築
model = Sequential([
    Dense(128, activation='relu', input_shape=(784,)),
    Dense(64, activation='relu'),
    Dense(10, activation='softmax')
])

# モデルのコンパイル
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])

# モデルのトレーニング
model.fit(X_train, y_train, epochs=10, batch_size=32)

# テストデータでモデルを評価
loss, accuracy = model.evaluate(X_test, y_test)
print(f"Loss: {loss}, Accuracy: {accuracy}")

前回はライブラリ、データの読み込み、データの前処理を調べました。

modelについて

今回はモデルについて調べていきます。前回もライブラリでmodelsについて簡単に調べています。

modelsはAIモデルともいわれているようで、AIがどういったプロセス(例えば、本で学習するとか動画で学習するとか)で学習する方法のようです。中でもライブラリに書かれているSequentialが一般的な方法らしく(参考)入力に対して前から順々に学習しているようです。学生時の教科書を前から順々に学んでいくプロセスみたいです。

と分かりました。これでもだいたい分かるのですが、より深く理解するために深堀しましょう。

モデルという意味から考える

まずはモデルという意味から考えましょう。

AI(人口知能)とは人の脳を真似して機械に脳のような機能を持たせることなので、人の脳をできるだけ機械が使えるようにする必要があります。

そこで、人の脳がどうやって学習したり理解するかを知る必要があります。

人の脳の仕組みについてはこちらこちらで述べられているようにニューロンや電気信号の伝達でできているようです。

これをコンピュータで実行するためにはニューロンや電気信号の伝達を真似させる必要があります。この真似がモデルと言われる所以のようです。

ニューロンや電気信号の伝達を模式的に示した図が以下の図になります。これはAIや人口知能を調べるといたるところに目にすると思います。これは脳を模倣したものだったのですね。調べて初めて知りました。

丸がニューロンで線が電気信号を伝える導線のようです。

脳がどうやって判断しているのか

次にどのように脳が判断しているか調べてみます。

五感で受け取った反応(インプット)を過去の経験や知識から判断(アウトプット)しているようです。

例えば、数字を見たとき、脳の中では特定のニューロンが活性化して、これの数字は「7」であると判断できるようです。この特定のニューロンの活性化は過去の経験や知識といった学習で変化するようです。数字ではないマークが数字に見えたりするのはこのような特定のニューロンが活性化してしまってみえているようです。

これを真似するにはインプットデータとアウトプットの関係を結び付けさせる必要があり、各ニューロンの活性化も再現する必要があります。

この結び付けさせる行為やニューロンが活性化の記憶を学習というようです。

脳をモデル化し、コンピュータに移植する

これらを数式に落とし込み人の脳をモデル化を学んでいきます。

では、まずどのように電気信号が伝達されていくか調べていきます。

インプットデータ(数字と見たとき)としてx0、x1、アウトプットデータ(見た数字がどんな数字なのか判断)としてy0、y1とします。

そして、その中間にニューロンが隠れており、インプットデータとアウトプットデータと結合されています。これを隠れ層などというようです。ディープラーニングはこの層がたくさんあるようです。

この隠れ層のニューロンとインプットデータのニューロンとアウトプットデータのニューロンの結合の強弱が判断の強弱につながってくるようです。なのでその結合の強さも数字で置き換えます。これをwとします。このwを重みというようです(重みに関してはこちらの記事でも紹介)。各線にこの重みが割り当てられています。

この重みが変わることで電気信号の伝達が為されるようです。

次にニューロンの活性化について調べていきます。

こちらを調べるとまんまの用語がありました。それが「活性化関数」です。

ニューロンが電気信号を受け取って「ある大きさ」になったら次のニューロンに電気信号を伝達するようになります。

「ある大きさ」というのを決めるのが活性化関数です。例えば、0なら流さない、1なら流す。という感じです。

活性化関数にはいろいろな種類があるようです。それらを纏めているものがありました。こちらです。

これまでの説明を下図のようになります。

モデルというものの概要が分かりました。

手計算してモデル化した脳を深く理解する

実際に計算してみてどういったことが起きているか確認してみます。

今回は入力のxと第1層目の第1ニューロンだけの結合の計算と活性化関数の計算だけやってみたいと思います。以下の図の濃い色の部分だけの計算になります。

入力のxと第1層目の第1ニューロンだけの結合の計算は以下の式で計算できます。

xは入力値でwは重みです。xの添え字は入力の番号でwの添え字は下付きは入力(0か1)→第1ニューロンを示しており、上付きは第1層目を示しています。この計算で第1層、第1ニューロンの値N1が計算できます。

今回は計算を簡単にするためにx0=0、x1=1として計算してみます。するとN1は

w(1)_11だけになります。単純な比例の形になりました。

x1と第1層第1ニューロンの結合の重みがそのまま第1層第1ニューロンの入力になります。

次にこのN1に活性化関数を通して、第1層、第1ニューロンの出力を求めます。今回の活性化関数はReLuとsoftmax関数で実験してみます。

横軸に上記で計算されたN1となり、これが入力値になります。青と赤の線が入力されたN1に対して出力される活性化関数になります。

例えば、N1が-3で入力された場合、ReLu関数だと0を出力し、softmax関数だと3.19×10^-5を出力します。もしN1が3で入力された場合、ReLu関数だと3を出力し、softmax関数だと0.013を出力します。

この結合の計算と活性化関数の計算をすべてのニューロンで行っているようですね。

これでなんとなくの計算の流れが分かりました。

本題

さて、ChatGPTのコードに戻りましょう。(調査までが長いですね…)

# モデルの構築
model = Sequential([
    Dense(128, activation='relu', input_shape=(784,)),
    Dense(64, activation='relu'),
    Dense(10, activation='softmax')
])

読み解いていきましょう。Sequential入力に対して前から順々に学習して、Denseというキーワードでニューロンの数とそのニューロンの活性化関数を定義しているようです。

第1層目は128ニューロンでそのニューロンの活性化関数はrelu関数で定義しているようです。入力層は前回の数字データ数なので784個になっています。

第2層目は64ニューロンでそのニューロンの活性化関数もrelu関数で定義していますね。

最後の出力層は10ニューロンでその活性化関数はsoftmax関数になっていますね。
最後のニューロン数は0~9までの数字を判別するので10個になっているようです。

このモデルを図で示すと下のようになりますね。

めちゃめちゃ数が多いですね。(作るのが大変でした…。)

最後に

モデル作りが大切であり、大変であることが分かりました。

今後の開発や研究ではモデル作りも意識しながらAIを作っていきましょう

コメント

タイトルとURLをコピーしました