ChatGPTが脚光を浴びたことで、深層学習(=ディープラーニング)について興味を持たれた方も多と思います。
深層学習とは、「多層のニューラルネットワークを用いた機械学習の手法」なのですが、なんのこっちゃ分かりにくいですよね。
そこで、具体的なイメージが持てるように、図を使って概念的なことを解説したいと思います。
ChatGPTを理解するうえでの基礎知識となりますので、興味のある方は是非ご一読下さい。
ニューラルネットの概要
簡単に言うと、「人間の脳のメカニズムを数式で模倣したもの」です。
従って、まず人間の脳のメカニズムをおさらいしておきましょう。
人間の脳のメカニズム
人間が何かを考えたり記憶する場合、脳の神経細胞が互いに結合しながら、刺激として情報を伝達、処理します。
神経細胞同士は「シナプス」と呼ばれる結合部位を使って互いに結合するのですが、このことを「シナプス結合」と呼んでいます。

そして、人間が外界から受けた刺激(視覚、聴覚、触覚など)の強さによってシナプス結合の量が増え、それに伴い脳の機能(認知、感覚、運動など)も向上することが知られています。
ここでのポイントは、刺激の強さがどのように次の神経細胞に伝搬していくかです。
神経細胞同士が結合したからと言って、右から左に刺激が伝搬するわけではなく、ある一定量の刺激を超えたとき、はじめて次の神経細胞に刺激が伝搬されます。

こでまでのことを整理すると次の3点になります。
- 神経細胞はシナプスと呼ばれる部位で他の神経細胞と結合する
- 神経細胞の結合量(シナプスの結合量)が多いほど、脳の機能が向上する
- 神経細胞は複数の神経細胞の刺激を受け取るが、伝達する相手は1つだけ
- 神経細胞が一定量の刺激を超えたとき、はじめて次の神経細胞に刺激を伝搬する
シナプス結合の数式化
神経細胞は複数の神経細胞と結合しますが、受けた刺激を次の神経細胞に伝搬する相手は1つだけです。そして、受けた刺激が一定量を超えたとき、次の神経細胞に刺激を伝達します。
このルールは次のように言い換えることができます。
「複数の入力値(X1・・・Xn) という入力を受け取り、その値を合計した結果が閾値を超えたら、何らかの値を出力する」
つまり、このルールを数式にできれば、脳のメカニズムを数式化できたことになります。

まず、1つの神経細胞に1つの刺激(入力値)が伝えられた場合に着目してみます。
神経細胞は0や1の数値が伝搬されているわけではなく、神経伝達物質(アミノ酸やペプチドなどの化合物)で情報を伝達しているので、子のメカニズムを数値として扱う場合、何かの値を掛けたり足したりできるほうが都合がいいのです。
そこで、入力値 X に何らかの重みWを掛けて、バイアス値として b を足してあげることを考えます。
X1×W1+b1
1つの神経細胞に複数の刺激(入力値)がある場合は、単純に次の様になります。
X1×W1+b1 + X2×W2+b2 + ・・・・・Xn×Wn+bn
これで複数の刺激を計算することができました。次は、この計算結果が閾値を超えると1になるような数式を考えれば良さそうです。
ある閾値を超えると1になる曲線としてはロジスティック曲線があるので、これが使えそうですね。
実際には、より緩やかなカーブを描くシグモイド関数が使われますが、原理としては入力値を0~1までの値で表す数式を使うことで、神経細胞の出力を模倣することができます。
尚、数式の内容を理解する必要はありません。数式で表現できるという点だけ覚えておいてください)

ニューラルネットのメカニズム
人間の脳は、860億個の神経細胞で構成されています。ここまで説明してきたのはたった1つの神経細胞なので、これを860億個とは言わないまでも、ある程度の個数を用意して、結合させる必要があります。
つまり、実際の神経細胞のネットワークと同じように、数式化した神経細胞を複数個繋げてネットワーク化したものがニューラルネットです。

実際には、仮にA、B、Cという3つの神経細胞の数式があったとします。これらの計算結果をDという神経細胞の入力として使い、これを繰り返すことでネットワーク化しています。

上記の図で分かるように、ニューラルネットは入力と出力を1つの層として考えると、複数の層で構成されていることがわかります。
層にも呼び方があって、最初の入り口(データの受け口)が「入力層」、最終結果を出す最後の層(計算結果の出力)が「出力層」、入力層と出力層の間にある層が「隠れ層」とか「中間層」と呼んで区別しています。

深層学習(ディープラーニング)とは
ニューラルネットを理解していただければ、深層学習(ディープラーニング)の理解は簡単です。
隠れ層が3層以上あるものを深層学習(ディープラーニング又はディープニューラルネットワーク)と呼んでいます。

深層学習(ディープラーニング)の歴史
ニューラルネットワークが登場した時は、隠れ層を増やすことで複雑な問題が解けるようになると期待されていました。
しかし、層と層の間は総当たり的な計算が必要だったため、層を増やすごとに計算量は指数関数的に増加し、当時(1950年代)のコンピュータ能力では計算が追い付かず、せいぜい3層(入力層、出力層、隠れ層)までが限界でした。
それ以外にも、計算結果が収束(誤差が減らない)しない、学習に使ったデータ以外は精度が出ない(過学習)など、いくつかクリアすべき課題があり、長い間実用化されませんでした。
それでも、2010年ころから徐々に画像認識や音声認識での実用化が進み、2016年にGoogleが「AlphaGo」を開発、プロ棋士に勝利したことで一気に盛り上がりました。
その後ディープラーニングは急激に進化を遂げ、翻訳や画像生成、文書生成の分野で次々と成果を出してきました。
そして2022年11月にChatGPTが、2023年3月にはGPT4 が登場したことで、深層学習(ディープラーニング)を用いたAIが、我々の日常に浸透しようとしています。

ディープラーニングのパラメータとは
深層学習(ディープラーニング)では、パラメータという言葉がよく出てきます。例えばGPT-3のパラメータ数は1750億個にも及びます。
では、このパラメータとは一体何でしょうか。
答えは下図にある通り、数式における W、n、a の値です。

GPT-3の層の数は96層であると言われています。
ディープラーニングでは、各層に何千~何万もの神経細胞に相当する数式が置かれており、その数分のパラメータが存在します。
そして、次の3つのステップを何度も繰り返しながら、誤差が一番小さくなるパラメータの値(W、n、a )を求めます。
- 入力値に対して誤差が小さくなるようパラメータを調整(初回は適当に決める)
- 計算結果と正解値の誤差を計算
- 誤差を最上位の相に戻す
この作業がパラメータを調整するということです。

実際はもっと色々な点を考慮する必要があるため、もっと複雑になりますが、基本の考え方は上記のようになります。
実際のソースコード
では、実際にどのようなプログラムを書けば良いのでしょう?
Pythonの基本構文だけでディープラーニングのプログラムを書くと、それだけでソース量が多くなるので、ここではディープラーニング専用のライブラリ(フレームワーク)を使うことにします。
フレームワークにはいくつかの種類が存在しますが、下記の例は keras というフレームワークを使った例です。
1 2 3 4 5 6 7 8 9 10 11 |
from keras.models import Sequential from keras.layers import Dense model = Sequential() # 入力層。4次元の入力を受け取り、8個のニューロンに変換する。 model.add(Dense(8, input_dim=4, activation='sigmoid')) # 隠れ層兼出力層 1個のニューロンで出力を決定する。 model.add(Dense(1, activation='sigmoid')) # モデルのコンパイル model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) |
このプログラムは4つの入力を受け取り、1つの出力(True/False)を返す最も簡単なサンプルプログラムです。入力1層、隠れ層兼出力層1層、合計2層の構成になっています。
ディープラーニングでは、この隠れ層を3個以上用意します。
入力が4つしかないので計算量は少ないですが、例えば1024×768の画像を入力とし、隠れ層を3個用意した場合、飛躍的に計算量が増えることは想像できると思います。
次は GPT-3の元となるトランスフォーマのソースコードのサンプルです。様々な考慮を省いた最も単純なサンプルではありますが、中身はともかくとして、かなりソースコード量が増えたことがお分かりいただけると思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
from tensorflow import keras from tensorflow.keras import layers input_shape = (1024,) num_layers = 24 embed_dim = 768 num_heads = 12 ff_dim = 3072 # Create input layers input_ids = layers.Input(input_shape, dtype=tf.int32) attention_mask = layers.Input(input_shape, dtype=tf.int32) # Create embedding layers embedding_layer = layers.Embedding(input_dim=50000, output_dim=embed_dim) token_embeddings = embedding_layer(input_ids) # Add positional encoding position_embedding_layer = layers.Embedding(input_dim=1024, output_dim=embed_dim) position_embeddings = position_embedding_layer(tf.range(start=0, limit=1024, delta=1)) position_embeddings = layers.Dropout(0.1)(position_embeddings) # Add attention layers for i in range(num_layers): attention_heads = [] for j in range(num_heads): attention_layer = layers.MultiHeadAttention(num_heads=num_heads, key_dim=embed_dim//num_heads) attention_heads.append(attention_layer(token_embeddings, token_embeddings, attention_mask)) attention_outputs = layers.Concatenate()(attention_heads) attention_outputs = layers.LayerNormalization(epsilon=1e-6)(attention_outputs) attention_outputs = layers.Dropout(0.1)(attention_outputs + token_embeddings) # Add feedforward layers feed_forward_layer = keras.Sequential([ layers.Dense(ff_dim, activation="relu"), layers.Dense(embed_dim), ]) feed_forward_outputs = feed_forward_layer(attention_outputs) feed_forward_outputs = layers.Dropout(0.1)(feed_forward_outputs + attention_outputs) token_embeddings = layers.LayerNormalization(epsilon=1e-6)(feed_forward_outputs) # Add output layer outputs = layers.Dense(50000, activation="softmax")(token_embeddings) # Create the model model = keras.Model(inputs=[input_ids, attention_mask], outputs=outputs) # Compile the model optimizer = keras.optimizers.Adam(learning_rate=5e-5) loss = keras.losses.SparseCategoricalCrossentropy(from_logits=True) metric = keras.metrics.SparseCategoricalAccuracy("accuracy") model.compile(optimizer=optimizer, loss=[loss, *[None] * num_layers], metrics=[metric]) |
GPT-3は、これより遥かに複雑なプログラムで構成され、かつ数百GBの学習データを使っているため、普通のパソコンで計算できるレベルを超えていることがうかがえます。
深層学習で出来たモデルは謎だらけ
ここまでの説明を理解していただければ、深層学習は「脳の神経細胞を数式に置き換えて、総当たりの計算を繰り返してパラメータを調整しただけ」に過ぎません。
では、なぜこのような単純な構造で、ChatGPTをはじめとする文書作成、画像生成、様々な推論ができるのでしょうか?
なぜ深層学習のモデルを使えば、ここまでのことが出来るのか?その答えは誰にも分かっていません。
人間の脳についても未知の部分がほとんどですが、それを模倣した深層学習も同様に未知の部分が多いのです。
深層学習を使えば、人間と同じような思考ができること、その結果が人の役にたつことが分かったので、急速に普及しているのです。
ChatGPTに命令をすることを「プロンプトを作る」と言いますが、「プロンプト」の良し悪しがChatGPTの精度に大きく関わることが分かってきました。
これからは、深層学習で作られたモデルに対して、「適切なプロンプトの作成」ができるエンジニア(=プロンプトエンジニア)が世に登場するのかもしれません。
まとめ
今回は、深層学習(=ディープラーニング)の仕組みが概念的に理解できるよう、図を使って説明しました。
深層学習は脳の神経細胞を数式に置き換えたもので、数式の中に含まれる定数をパラメータと呼んでいます。
そして学習時は、与えられた答えとの誤差が小さくなるよう、何度も何度もパラメータを微調整するという作業を繰り返し、最終的なパラメータの値を決定していきます。
そこには、気が遠くなるような計算量が必要であり、GPT-3に至っては普通のパソコンでは計算できないくらいの計算量が必要となります。
そんなすごいAIが、無料で利用できるようになるのは、すごいことです。
今回の記事が、深層学習(ディープラーニング)やChatGPT(GPT-3,GPT-4)を理解する手助けになれば幸いです。