答えが出るまでの計算の流れ
順伝播(フォワードパス)は、入力を最初の層から最後の層へ順に通して、ネットワークの答えを求める計算です。学習を終えたネットワークが答えを出すときは、いつもこの計算だけを行います。
小さなネットワークなら、この計算は紙の上でできます。1層ずつ、同じ手順をくり返すだけです。
このレッスンのゴール
メモ
小さなネットワークが出す答えを、手で計算できる。
キーワード
| ことば | いみ |
|---|---|
| 順伝播 | 入力から出力へ、層を順に計算していくこと |
| 層の出力 | 1つの層のすべてのニューロンが出す数 |
| 重み | 入力ごとにかける数 |
| バイアス | 合計に足す数 |
| ReLU | 0より小さい数を0にする活性化関数 |
| 予測 | ネットワークが出した答え |
学生が入力するセルは、このプレビューでは空白です。
1つの層は同じ計算を並べたもの
層の計算は、ニューロンごとの計算を並べたものです。ニューロンごとに、重み、バイアス、合計、ReLU の順で進みます。
同じ層のニューロンは、同じ入力を受け取ります。ただし、重みとバイアスは、ニューロンごとに別です。
例: 入力2つ、隠れ2つ、出力1つ
| ニューロン | 計算(入力は 2 と 1) | 合計 | ReLUのあと |
|---|---|---|---|
| 隠れ1 | 2×1 + 1×(-1) + 0 | 1 | 1 |
| 隠れ2 | 2×1 + 1×1 - 1 | 2 | 2 |
| 出力 | 1×2 + 2×(-1) + 1 | 1 | 1(ReLU なし) |
学生が入力するセルは、このプレビューでは空白です。
計算はコマンドで確かめられる
max(0, 合計) は、ReLU と同じ働きをします。次のコマンドは、表の隠れ1と隠れ2の値を、一度に計算します。
隠れ層の2つの値を確かめる
docker exec jupyter python3 -c "print(max(0, 2 * 1 + 1 * -1), max(0, 2 * 1 + 1 * 1 - 1))"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
ネットワーク全体を Python で
# 例の表と同じネットワークです。
hidden_weights = [[1, -1], [1, 1]]
hidden_biases = [0, -1]
out_weights = [2, -1]
out_bias = 1
inputs = [2, 1]
hidden = []
for n in range(2):
total = hidden_biases[n]
for k in range(2):
total = total + hidden_weights[n][k] * inputs[k]
if total < 0:
total = 0
hidden.append(total)
print("隠れ層:", hidden)
answer = out_bias
for n in range(2):
answer = answer + out_weights[n] * hidden[n]
print("出力:", answer)
# inputs を [0, 3] に変えて、もう一度実行します。
# 出力はいくつになりますか。
出力が複数なら、いちばん大きいものが答え
出力層に数が複数あるとき、いちばん大きい数の位置が、ネットワークの答えです。出力が3つなら、「静か」「ふつう」「混む」に1つずつ当てはめます。
同点のときは、先に並んだほうを選ぶと決めておきます。
例: 出力3つから答えを選ぶ
| 出力のニューロン | 重み | バイアス | 計算(隠れ層は 1 と 2) | 値 |
|---|---|---|---|---|
| 静か | 2、-1 | 1 | 1×2 + 2×(-1) + 1 | 1 |
| ふつう | 0、1 | 0 | 1×0 + 2×1 + 0 | 2 |
| 混む | -1、0 | 2 | 1×(-1) + 2×0 + 2 | 1 |
学生が入力するセルは、このプレビューでは空白です。
層の数が増えても手順は同じ
層が3つでも10でも、手順は同じです。前の層の出力が、次の層の入力になります。
最後の出力層だけは ReLU をかけず、合計をそのまま答えに使います。数を予測するときは値そのものが、分類のときは最大の位置が答えです。
よくある間違い
注意
同じ層のニューロンは、同じ重みを使うと考えがちです。実際は、ニューロンごとに重みとバイアスが別です。だから、同じ入力を受け取っても、ニューロンごとに違う数が出ます。