AIにおける学習とは何なのかを高校生にもわかるように説明する
学習とはいったい何なんだろう?
昨今身近に使われるAIとしてChatGPTがあります。
ユーザーである私たちがChatGPTをテキストに入力すると、そのテキストに対してChatGPTが返答をしてくれます。このChatGPTは、AIの一種である自然言語処理というものを使って、私たちのテキストを理解し、適切な返答をしてくれます。ChatGPTが作られる背景には、ウェキペディアのようなプラットフォームから大量のテキストデータを拾ってきて、AIが学習をしています。
しかし、言葉だけで「学習」といわれても、実際にどんなことをしているのか想像がつきません。
また、ChatGPT以外でも、テキストを入力すると、それに基づいた画像を生成してくれるAIや、音声を入力すると、それに基づいたテキストを生成してくれるAIなどがあります。
とにかく、AIを使うと「何かを入力すると、それに基づいた何かを出力してくれる」ということができるようになります。
しかし、何故そのような多種多様なことができるかはよくわかりません。
そこで今回は、AIとは何かを高校生にもわかるように少しだけ粒度を落として説明していきます。
AIの実態
簡単な例として、手書きで数字が書いてある画像を入力すると、その数字が3であるか、否かを判別するAIを考えます。
実際に判別する際には以下の手順で行います。
- 画像をピクセルごとに分解して、それぞれのピクセルの色を0から255の数値で表現します。例えば、28x28ピクセルの画像であれば、784個の数値が得られます。それぞれの数値を
とします。x_1, x_2, ..., x_{784} - これらの数値を入力として、関数
に代入し、F(\cdot) を計算します。計算した値をF(x_1, x_2, ..., x_{784}) とします。z -
を確率の形式に整えるため、z を0から1の範囲に収めるための関数z (後程解説します)に代入し、\sigma(x)=\frac 1 {1+e^{-x}} を計算します。計算した値を\sigma(z) とします。\hat{y} -
が0.5以上1以下であれば、画像に書かれている数字は3であると判定します。0以上0.5未満の場合は、3でないと判定します。\hat{y}
AIが学習する部分は、関数
学習とは
AIが学習するとは、関数
単純な例として、以下の問題を考えます。
問題: 入力される数字を
として、 x が 3x を超えるか否かを判定するAIを作成するように、関数 5 のパラメータ F(x)=wx+b を決定する。 w,b
まず、この問題を学習せずに
AIの出力では、あくまで確率を出力として出す必要があるため、そのための関数としてシグモイド関数
この関数は、
つまり、入力されるすべての実数に対する写像が存在して、常に0から1の範囲の値を取ることができます。
また、シグモイド関数には以下の性質があります。
入力変数
つまり、
よって、例えば
しかし、このように
データセットとして考えるものとして、以下のようなものが考えられます。
以下、
例えば、
このデータセットを使って、
具体的には、各データの正解
尤もらしさを表す関数として、尤度関数を定義します。
この関数は値が大きいほど予測が尤もらしいことを示します。データの
この性質をうまく利用して
この尤度関数を最大化するような
このように、
パラメータの更新は、高校数学の分野で言う、ニュートン法の発想と感覚が近いです。
ニュートン法とは
ニュートン法とは、関数
初期値
具体的には、
更に詳しく知りたい人は、ニュートン法で検索してみてください。
ニュートン法では、
しかし、AIにおける学習は、ニュートン法とは異なり、最急降下法という方法によって行われます。
最急降下法は、関数
ある出発点
AIの学習において最急降下法を用いる時、
この関数
この損失関数を、値が大きいほど、AIの予測が正解から外れていることを示すように設計したいです。
ここで、先ほど定義した尤度関数を使って、損失関数の設計を考えると、尤もらしいほど損失が小さく、尤もらしくないほど損失が大きいような関数を設計することができます。
よって、尤度にマイナスをかけたものを損失関数として設計することを考えて以下のように定義します。
この損失関数を最小化するように
実際にパラメータを更新してみましょう
-
パラメータの初期化:
w=1, b=0 -
w の更新:
w = w - \alpha \frac{\partial \mathcal{L}(w,b)}{\partial w} -
b の更新:
b = b - \alpha \frac{\partial \mathcal{L}(w,b)}{\partial b} -
2,3を、パラメータが収束するまで繰り返す
ここで、
また、
(
これらの勾配は、微分を使って計算することができます。
勾配の計算
損失関数
まず事前準備として、以下の微分を計算します。
これらを使って、
同様に、
よって、更新式は以下のようになります。
このように、データを使うことによって、そのデータに適合するようにパラメータが更新されていくことで学習されることが分かります。
ここで次節の事前準備として、このモデル全体をグラフィカルに表現してみましょう。
実際に用いられるAI
実際に用いられるAIは、このような単純な問題ではなく、画像認識、音声認識、自然言語処理、予測分析など、多様な問題に対応するために、複雑なモデルが使われます。
最初の例で述べた画像に書かれた数字を判別する物も入力変数も784個の数値で入力されるため、それに応じたパラメータ数が必要になります。
また、関数
この図にある
非線形性を持たせるとは
線形性とは、入力変数
AIのモデルには、非線形性を持たせることで、複雑な問題に対応することができます。
活性化関数がない場合、ネットワーク全体を表すF(以降、モデルとする)としては、単なる線形関数としてしか表現することができません。
具体的には、
のように、どれだけ層を重ねても、線形関数でしか表現することができません。そのため、活性化関数を計算の途中に挟み、非線形性を持たせることで、複雑な問題に対応することができます。
また汎用的に使われる活性化関数の例として、ReLU関数があります。
ReLU関数は以下のように定義されています。
ReLU関数は、入力が0以上の時、そのまま出力し、0未満の時、0を出力する関数です。
この関数が汎用的に使われているのは、微分が簡単であり、計算が高速であるためです。
この図に示すように、ユニットを多層に重ねたり、非線形な関数を使ったりすることで、複雑なタスクに対応できるようになります。我々が便利に使えるようにするためには、更に複雑なモデルが必要になります。
ChatGPTなどの自然言語処理のAIは、RNNと呼ばれる出力されたものを次の入力に使ったり、画像認識のためのAIは、CNNと呼ばれる、画像の部分的な特徴を抽出して、それを次の層に渡すなど様々な工夫によってモデルをより複雑にすることで、複雑な問題に対応できるようにします。
まとめ
AIにおける学習とは、与えられたデータに適合するように、モデルのパラメータを更新していくことです。
この学習は、最急降下法を使って、損失関数を最小化するようにパラメータを更新していきます。
我々が日常的に使えるようにするためには、非常に自由度の高い複雑なネットワークを構成して、より柔軟に様々なタスクに対応できるようにします。
しかしながら、AIの学習の観点からは、損失関数をうまく設計することができさえすれば、どのようなモデルを使っても、データに適合するようにパラメータが更新されるため、学習を行うことができます。
Discussion