なぜ層を何枚も重ねるのか
ディープラーニング(深層学習)は、層を重ねたニューラルネットワークで答えの出し方を学ぶ方法です。層ごとに何をしているかがわかると、中身は暗い箱ではなくなります。
自転車の貸出店が、気温と雨と曜日から、明日が混むかどうかを知りたいとします。入力は3つの数で、答えは1つです。その間で層が何をするかを見ていきます。
このレッスンのゴール
メモ
ニューラルネットワークの各層が何をするかを説明できる。
キーワード
| ことば | いみ | れい |
|---|---|---|
| ニューロン | 重みをかけた入力を足して、数を1つ出すもの | |
| 重み | 1つの入力がどれだけ効くかを表す数 | |
| バイアス | 合計にそのまま足す数 | |
| 活性化関数 | 合計を、次の層へ渡す数に変える決まり | ReLU |
| 隠れ層 | 入力と出力のあいだにある層 | |
| 出力層 | 答えを出す最後の層 |
学生が入力するセルは、このプレビューでは空白です。
ニューロンは入力を重みで足し合わせる
ニューロンは、入力を1つずつ受け取り、それぞれに重みをかけて足します。最後にバイアスを足すと、合計が1つ出ます。
重みが大きい入力ほど、答えに強く効きます。重みがマイナスなら、その入力は逆の向きに押します。
例: 1日分の入力を足し合わせる
| 入力 | 値 | 重み | かけた値 |
|---|---|---|---|
| 気温(10度単位) | 2 | 3 | 6 |
| 雨(cm) | 1 | -2 | -2 |
| 週末(平日は0、週末は1) | 1 | 1 | 1 |
| バイアス | -1 | ||
| 合計 | 4 |
学生が入力するセルは、このプレビューでは空白です。
同じ計算を Python で
# 表の例と同じ計算です。
inputs = [2, 1, 1]
weights = [3, -2, 1]
bias = -1
total = bias
for n in range(3):
total = total + inputs[n] * weights[n]
print("合計:", total)
# 雨の重みを -2 から -5 に変えて、もう一度実行します。
# 合計はいくつになりますか。
入力の数は表の列で決まる
ラボの hires.csv は、1日が1行の表です。ニューロンの入力は、この表の列から選びます。
次のコマンドは、ファイルの1行目を表示します。そこに列の名前が並んでいて、気温、雨、曜日の列が見つかります。
列の名前を見る
docker exec jupyter head -n 1 hires.csvここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
活性化関数が合計を次へ渡す形にする
ニューロンの合計は、そのままでは次の層へ渡しません。活性化関数を通して、別の数に変えます。
ReLU(レルー)は、0より小さい数を0にし、ほかはそのまま返します。ステップ関数は、0より大きければ1、そうでなければ0を返します。切り取り関数は、0より下を0、1より上を1にします。
例: 5つの合計を3つの関数に通す
| 合計 | ステップ関数 | ReLU | 切り取り関数 |
|---|---|---|---|
| -3 | 0 | 0 | 0 |
| -1 | 0 | 0 | 0 |
| 0 | 0 | 0 | 0 |
| 0.5 | 1 | 0.5 | 0.5 |
| 2 | 1 | 2 | 1 |
学生が入力するセルは、このプレビューでは空白です。
層は入力層、隠れ層、出力層に分かれる
ニューロンを横に並べたものが層です。入力層は、気温や雨などの値を受け取るだけです。隠れ層は計算をして、次の層へ渡します。出力層は、最後の答えを出します。
層の中のニューロンは、前の層のすべての値を受け取ります。それぞれが自分の重みとバイアスを持ちます。
重みの数は掛け算で数えられる
入力3つ、隠れ4つ、出力2つなら、重みは 3×4 と 4×2 で20個です。バイアスはニューロンごとに1つなので、4+2 の6個です。
次のコマンドは、この数え方を計算します。重みとバイアスの数が、ネットワークの大きさの目安になります。
重みとバイアスの数を数える
docker exec jupyter python3 -c "print(3 * 4 + 4 * 2, 4 + 2)"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
よくある間違い
注意
層を重ねれば、活性化関数がなくても賢くなると考えがちです。しかし、層の間に活性化関数がないと、何層重ねても1層と同じ計算にしかなりません。層の間には必ず活性化関数を入れます。