「AIが学習する」と聞くと、コンピューターの中に小さな脳があるように感じるかもしれません。ニューラルネットワークの入口では、まず、数を受け取って次の数を作る計算に注目してみましょう。
ニューラルネットワークとは、小さな計算をつないだモデル
ニューラルネットワークは、複数の計算部品をつなぎ、重みなどの数値を調整することで、入力と出力の関係を学ぶモデルです。 生物の神経のつながりから着想を得ていますが、脳をそのまま再現したものではありません。
各部品は、受け取った数に決められた計算を行い、次の部品へ結果を渡します。画像なら画素などを数値にし、文章なら数値表現へ変換して入力します。入力の種類や目的によって、モデルの構造や出力の扱いは異なります。
ここでは基本的な**順伝播型(じゅんでんぱがた)**を扱います。入力側から出力側へ順に計算する形です。すべてのニューラルネットワークが、以下の小さな図と同じ構造という意味ではありません。
ユイ
脳の絵がなくても、ニューラルネットワークの仕組みを考えられるんですか?
マコト
考えられるよ。まず一つの部品が、入ってきた数をどう変えるか見てみよう
入力層・隠れ層・出力層は、何をする?
計算部品のまとまりを、層と呼びます。入力を受ける入口が入力層、結果を返す側が出力層。その間にある層が、隠れ層(中間層)です。計算部品は「ノード」や「ニューロン」と呼ばれます。
| 場所 | この例での仕事 |
|---|---|
| 入力層 | 2と1という数を受け取る |
| 隠れ層 | 二つの計算A・Bで、入力を別々に組み合わせる |
| 出力層 | A・Bの結果を使って、最後の数を計算する |
「隠れ」は、魔法の処理や秘密の意識という意味ではありません。入力として渡した値と、最後に得たい出力の間にある計算段階を指します。
入力の2と1を、二つの計算へ渡す
入力①:2
入力②:1
計算A:1
計算B:0
結果:2
入力 → 隠れ層 → 出力の順に計算
重みだけを手で変えます。学習を実行する体験ではありません。
計算A(バイアス0)
2 × 1 + 1 × (−1) + 0 = 1 → ReLUで1
計算B(バイアス0)
2 × (−1) + 1 × 2 + 0 = 0 → ReLUで0
出力の計算(バイアス0)
1 × 2 + 0 × 1 + 0 = 2
図の数値は、計算を追うために選んだものです。何かを正しく予測するように学習させたモデルではありません。最後に出る2も、正解率や確率を表していません。
同じ2と1を受け取ったのに、途中のAは1、Bは0になっています。この違いを作る、入力に掛ける数を見てみましょう。
重みとバイアス:掛ける数と、足す数
一つのノードでは、受け取る各入力に重みを掛け、足し合わせます。そこへ加える調整値がバイアスです。このように調整する数値を、パラメータと呼びます。
上の計算Aでは、入力の2に重み1を掛け、入力の1に重み−1を掛けます。バイアスを0にすると、合計は「2 × 1 + 1 × (−1) + 0 = 1」です。
計算Bは、同じ入力を使っても重みが違います。「2 × (−1) + 1 × 2 + 0 = 0」となります。同じデータを受け取りながら、別の組み合わせを作れるわけです。
重みには負の値もあります。「大きい重みが付いた入力ほど、人間にとって重要」と単純に読むものではありません。入力の尺度や、ほかの値との組み合わせも関係します。
バイアスは、入力との掛け算とは別に合計へ加える値です。ここでは仕組みが見えるよう0にしましたが、実際のモデルではバイアスも学習で調整する対象になります。これで掛けて足す計算は追えました。ただし、その合計がそのまま次の層へ渡るとは限りません。
活性化関数は、足した結果をどう変える?
足し合わせた値を、次に渡す値へ変換する規則を活性化関数と呼びます。この例の隠れ層では、ReLU(レルー)という関数を使っています。
- 合計が負なら、0を返す。
- 合計が0以上なら、その値をそのまま返す。
計算Aの合計1は1のまま、計算Bの合計0は0のままです。もしAの合計が−1になれば、次へ渡す値は0になります。
重みを掛けて足すだけの処理を何層重ねても、全体を一つの同種の式にまとめられます。ReLUのような非線形の変換を途中へ入れることで、その範囲を超えた複雑な関係を表せるようになります。「層を増やす」ことに加え、各層でどう変換するかも大切です。
活性化関数はReLUだけではありません。また、最後の出力の変換は、数値を予測するのか、分類するのかなど、目的に合わせて選びます。
学習すると、ニューラルネットワークの何が変わる?
ここまでの図は、決めた重みで答えを計算する流れでした。学習では、データを使い、望む出力に近づくよう重みやバイアスを調整します。
正解のある例で考えると、まず入力から出力を計算し、正解とのずれを評価します。このずれを数値化する尺度を損失といいます。次に、各パラメータを少し動かしたとき、損失がどう変わるかを計算します。
多層のネットワークで、その変わり方を出力側から順に求める方法が**誤差逆伝播(ごさぎゃくでんぱ)**です。そこで求めた勾配を使い、勾配降下法などの最適化手法でパラメータを更新します。逆伝播は、入力の画像そのものを逆向きに流して覚えることではありません。
上のスライダーは、人が一つの重みを変えて結果を見るためのものです。損失から自動で更新する学習は実行していません。
また、学習に使ったデータで損失が下がっても、未知のデータへうまく対応できるとは限りません。データを分けて評価する理由は機械学習とは、学習と利用時の計算の違いはAIの学習と推論で扱います。
脳やディープラーニングとは、どう違う?
ここまで追ったのは、数値を計算し、ずれに合わせて調整する仕組みです。「ニューロン」という名前でも、生物の神経細胞の働きを丸ごと再現しているわけではありません。図だけから人間のような理解や意識があるとも判断できません。
ディープラーニングは、複数の層を重ねたニューラルネットワークを使う機械学習の一分野です。AI・機械学習・ディープラーニングの包含関係は、三つの言葉の違いで確認できます。
層を通る中で、入力が別の表現へ変わっていきます。ただし「このノードは必ず目を見分ける」といった役割を、人が最初から一つずつ与えるとは限りません。内部の数値を、分かりやすい言葉だけで読み切れない場合もあります。
一つの重みを変えて、出力まで追ってみる
図の計算Aで、入力①に掛ける重みを1から0へ変えてみましょう。合計は−1になり、ReLUを通ると0になります。計算Bは変わらず0なので、この例の最終出力も2から0へ変わります。JavaScriptが使えない場合も、この計算を紙で追えます。
ユイ
途中の重みを変えると、次へ渡す値も、最後の結果も変わるんですね
マコト
そう。その数値をデータに合わせて調整するのが学習なんだ。まずは一つの変更を、最後まで追えればいいよ
Q1. 機械学習は、すべてニューラルネットワークですか?
違います。決定木など、ほかの方法もあります。ニューラルネットワークは、機械学習で使われるモデルの一群です。
Q2. 利用するたびに、重みは自動で変わりますか?
通常の推論では、その時点の重みを使って出力を計算します。追加学習などの工程を行わない限り、一回の入力だけでモデルの重みを更新するわけではありません。
入力、重み、途中の計算、出力を区別すると、「ネットワークが学ぶ」という言葉を、数値がどう変わるかという具体的な動きで捉えられます。
重みを変えれば答えが変わることは追えました。では、学習に使った例でうまく答えられるようになったら、初めて見るデータにも通用するのでしょうか。機械学習とはでは、練習用と評価用のデータを分ける理由を、果物を選り分ける例で確かめます。「答えが出た」の先にある、役立つかどうかの確かめ方へ進んでみましょう。
この記事について
LAB WHITEBOARD
自分の言葉で説明してみよう
「重みを掛けて足す計算と層の関係を追い、学習をパラメータの調整として説明できる。」を、いまの自分の言葉で一文にしてみてください。途中の説明でも大丈夫です。




