ニューラルネットワークとは?重みと層でわかる仕組み

30秒でわかる答え

ニューラルネットワークは、小さな計算をつなぎ、重みやバイアスを調整して入力と出力の関係を学ぶモデルです。基本的な形では、入力に重みを掛けて足し、活性化関数で変換した値を次の層へ渡します。脳をそのまま再現したものではありません。

「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

ReLUは負の値を0にし、0以上はそのまま返します。出力層では、この例では足した結果をそのまま使います。数値は仕組みを追うための設定で、学習済みモデルの予測や確率ではありません。

図の数値は、計算を追うために選んだものです。何かを正しく予測するように学習させたモデルではありません。最後に出る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

自分の言葉で説明してみよう

「重みを掛けて足す計算と層の関係を追い、学習をパラメータの調整として説明できる。」を、いまの自分の言葉で一文にしてみてください。途中の説明でも大丈夫です。