学習コースLearn
深層学習
多層のニューラルネットワークが、データから表現(特徴)を自動で学ぶ仕組みを、基礎の理論から実際に動かせるコードまで、順を追って学ぶモジュールです。各ステップは「概要 → 仕組み(座学)→ コードで動かす」の3層で進みます。ページ内には手を動かせるデモを3つ用意しました。
この教材は日本語のみで提供していますThis learning material is available in Japanese only.
はじめにIntroduction
このモジュールの全体像
深層学習(ディープラーニング)とは、多くの層を重ねたニューラルネットワークを使って、データから複雑なパターンを学ぶ機械学習の手法です。画像認識、音声認識、機械翻訳、そして大規模言語モデルまで、近年の人工知能の多くがこの技術を土台にしています。
従来の機械学習では、どんな特徴に注目するかを人間が設計していました。深層学習の大きな特徴は、この特徴(表現)そのものをデータから自動で学ぶ点にあります。層を重ねることで、単純な特徴(線や角)から、より複雑な特徴(形やパーツ)へと、段階的に抽象度の高い表現を組み立てます。
ニューラルネットワークは、入力層・隠れ層・出力層からなります。データは入力層から出力へ向かって計算され(順伝播)、予測の誤差を出力側から入力側へ戻して重みを少しずつ直します(逆伝播)。この2つの流れが、深層学習の心臓部です。
ニューラルネットワークの層構造と、順伝播・逆伝播
このモジュールは、上の仕組みを土台から一つずつ組み立てます。各ステップは次の3層で構成します。
- 概要:その考え方が何のためにあるのか、あらましをつかむ。
- 仕組み(座学):背後にある理論・定義・式を、ていねいに理解する。
- コードで動かす:Python の定番ライブラリや、ページ内デモで実際に動かして確かめる。
手を動かす題材には、実在の公開データセット(手書き数字の digits や MNIST など)や、ページ内の小さなサンプルだけを使います。特別な環境がなくても、読みながら試せる構成です。
深層学習とは
What is deep learning概要Overview
深層学習は機械学習の一分野です。機械学習が「データからパターンを学ぶ」技術の総称だとすれば、深層学習はその中でも多層のニューラルネットワークを使う手法を指します。近年めざましい成果を上げ、人工知能の話題の中心になっています。
すでに私たちは、その成果に日常的に触れています。
- 画像:写真に写る物体の認識、顔認証、医用画像の診断支援。
- 音声:音声アシスタントの聞き取り、文字起こし、音声合成。
- 言語:機械翻訳、要約、そして大規模言語モデルによる対話。
- その他:ゲーム、自動運転の知覚、画像や音楽の生成。
仕組みHow it works
なぜ「深い」のか
ここでの「深い(deep)」は、ネットワークの層が多いことを指します。入力層と出力層の間に、たくさんの隠れ層を挟みます。層を重ねると、前の層が見つけた単純な特徴を組み合わせて、より複雑で抽象的な特徴を作れます。画像なら、はじめの層は線や角のような部品を、中ほどの層は目や車輪のようなパーツを、深い層は顔や車のような全体像を捉える、という具合です。
表現学習
従来の機械学習では、「どんな特徴を入力にするか」を人間が設計する必要がありました。たとえば画像なら、色のヒストグラムや輪郭の統計量などを、人手で選んで計算していました。深層学習の核心は、この特徴(表現)そのものをデータから自動で学ぶことです。これを表現学習(representation learning)と呼びます。良い特徴を人が作る手間を、学習に肩代わりさせるわけです。
成功を支えた条件
ニューラルネットワークの発想自体は古くからありましたが、実用的な成果が一気に広がったのは近年です。背景には、大量のデータ、GPU による高速な計算、そして学習を安定させる工夫(ReLU などの活性化関数や各種の正則化)の3つがそろったことがあります。
この Step のまとめ
深層学習は、多層のニューラルネットワークで表現を自動的に学ぶ機械学習の手法です。層を深くすることで、単純な特徴から複雑な特徴へと段階的に組み立てられます。次の Step から、その最小単位であるニューロンを組み立てていきます。
ニューラルネットワークの基礎
Neural network basics概要Overview
ニューラルネットワークの最小単位はニューロン(ユニット)です。各入力に重みをかけて足し合わせ、バイアスを加え、その結果を活性化関数に通して出力します。このニューロンを横に並べて層を作り、層を縦に積み重ねると、多層パーセプトロン(MLP)ができあがります。
仕組みHow it works
1つのニューロン
ニューロンは、入力 x に重み w をかけて総和を取り、バイアス b を足します。この加重和を、活性化関数 f に通したものが出力です。重みは「どの入力をどれだけ重視するか」を表し、バイアスは出力の基準をずらす役割を持ちます。
加重和をとってから、活性化関数で出力の形を決めます。
活性化関数
もし活性化関数がなければ、層をいくら重ねても全体は1つの線形変換にまとまってしまい、複雑な関係を表せません。そこで非線形な活性化関数を挟むことが決定的に重要です。代表的なものを3つ挙げます。
- シグモイド:出力を 0 から 1 に収める、なめらかなS字。確率のように扱いたい出力に向きます。
- tanh:出力を -1 から 1 に収めるS字。シグモイドを中心が0になるように調整したものです。
- ReLU:負の入力を0に、正の入力はそのまま通す折れ線。計算が軽く、深い層でも学習が進みやすいため、現在の標準です。
順伝播と多層パーセプトロン
層のニューロンすべてを一度に計算し、その出力を次の層の入力とする。これを出力層まで繰り返すのが順伝播(forward propagation)です。入力層・隠れ層・出力層をすべて全結合でつないだネットワークを多層パーセプトロンと呼び、最も基本的な深層モデルです。次のデモで、活性化関数の形を目で確かめてみましょう。
活性化関数
活性化関数を選び、入力 x のスライダを動かすと、曲線と出力値がその場で変わります。シグモイドと tanh はなめらかなS字、ReLU は負を0にする折れ線です。ニューロンは加重和にこの関数をかけて出力を決めます。
コードで動かすRun the code
順伝播は、行列の掛け算と活性化関数だけで書けます。入力2・隠れ3・出力1 の小さなネットワークを、NumPy で計算してみましょう。重みは適当に決めた固定値です。
import numpy as np
def sigmoid(x):
return 1 / (1 + np.exp(-x))
# 入力2 → 隠れ3 → 出力1 の順伝播
x = np.array([0.5, -0.2])
W1 = np.array([[0.1, 0.4, -0.3],
[0.2, -0.5, 0.8]]) # 形 (2, 3)
b1 = np.array([0.0, 0.1, -0.1])
W2 = np.array([[0.7], [-0.6], [0.3]]) # 形 (3, 1)
b2 = np.array([0.2])
h = sigmoid(x @ W1 + b1) # 隠れ層の出力
y = sigmoid(h @ W2 + b2) # 出力層の出力
print(np.round(h, 3))
print(np.round(y, 3))
[0.502 0.599 0.399]
[0.577]実際に多層のネットワークを学習させるなら、scikit-learn の MLPClassifier が手軽です。実在のデータセット digits(8×8 の手書き数字 1797 枚)を分類してみます。隠れ層1つ・ReLU 活性化の素直な MLP です。
from sklearn.datasets import load_digits
from sklearn.neural_network import MLPClassifier
from sklearn.model_selection import train_test_split
X, y = load_digits(return_X_y=True) # 8x8 の手書き数字 1797枚
X_tr, X_te, y_tr, y_te = train_test_split(
X, y, test_size=0.25, random_state=0)
clf = MLPClassifier(hidden_layer_sizes=(64,), activation="relu",
max_iter=300, random_state=0)
clf.fit(X_tr, y_tr)
print(len(X_tr), "training images")
print(round(clf.score(X_te, y_te), 3))
1347 training images
0.976この Step のまとめ
ニューロンは「加重和 → 活性化関数」。非線形な活性化関数(シグモイド・tanh・ReLU)を挟むことで、層を重ねる意味が生まれます。これらを全結合でつないだ多層パーセプトロンが、深層学習の出発点です。次は、この重みをどう学習するのかを見ます。
学習の仕組み
How learning works概要Overview
ここまでのネットワークは、重みを適当に決めていました。学習とは、予測の誤差を測る損失関数を用意し、その値が小さくなるように重みを少しずつ調整していく作業です。中心となる道具が勾配降下法と誤差逆伝播です。
仕組みHow it works
損失関数
まず、予測がどれだけ外れているかを1つの数字で表します。これが損失関数(loss function)です。数値を当てる回帰では平均二乗誤差(MSE)、クラスを当てる分類では交差エントロピーがよく使われます。
MSE は予測と正解の差の二乗の平均。交差エントロピーは正解クラスの予測確率が高いほど小さくなります。
勾配降下法
損失を小さくするには、各重みを「損失が減る向き」に動かします。損失を重みで微分した勾配は、損失が最も増える向きを指すので、その逆向きに進めば損失は減ります。進む歩幅を決めるのが学習率(learning rate)です。大きすぎると行き過ぎて発散し、小さすぎるとなかなか収束しません。
勾配の逆向きに、学習率のぶんだけ重みを更新します。
誤差逆伝播
多層のネットワークでは、各重みの勾配を効率よく求める必要があります。これを担うのが誤差逆伝播(backpropagation)です。出力側で計算した誤差を、合成関数の微分(連鎖律)を使って入力側へ順に伝えていくことで、すべての重みの勾配をまとめて計算します。
エポック・バッチ・学習率
実際の学習では、データを少しずつ(ミニバッチ)に分けて勾配を計算し、重みを更新します。学習データ全体を1回使い切ることを1エポックと数え、これを何回も繰り返します。エポックを重ねるごとに損失が下がっていくのが、うまく学習できているしるしです。次のデモで、最も単純なニューロン(パーセプトロン)が論理を表せることを確かめましょう。
パーセプトロンで論理ゲート
2つの入力に重み w1・w2 とバイアス b をかけて合計し、0以上なら1、そうでなければ0を出力します(ステップ活性)。スライダを動かして、AND と OR の真理値表を正しく分けられる重みを探してください。「解」ボタンで正解の一例も見られます。
コードで動かすRun the code
勾配降下法の中身は、じつは数行です。「y = 2x + 1」に近い点に、直線 y = w x + b を当てはめます。損失(平均二乗誤差)の勾配で w と b を更新し、エポックごとに損失が下がる様子を見てみましょう。
import numpy as np
X = np.array([0.0, 1.0, 2.0, 3.0, 4.0])
y = np.array([1.0, 3.1, 4.9, 7.2, 9.0]) # y ≒ 2x + 1
w, b, lr = 0.0, 0.0, 0.05
for epoch in range(1, 401):
pred = w * X + b
err = pred - y
loss = np.mean(err ** 2) # 平均二乗誤差
w -= lr * np.mean(2 * err * X) # 勾配で更新
b -= lr * np.mean(2 * err)
if epoch % 100 == 0:
print(f"epoch {epoch:3d} loss {loss:.4f} w {w:.3f} b {b:.3f}")
epoch 100 loss 0.0103 w 2.015 b 1.006
epoch 200 loss 0.0102 w 2.010 b 1.019
epoch 300 loss 0.0102 w 2.010 b 1.020
epoch 400 loss 0.0102 w 2.010 b 1.020損失が下がり、w が 2、b が 1 に近づきました。データの背後にある「y = 2x + 1」という関係を、勾配降下法が自力で見つけたことになります。ニューラルネットワークの学習も、規模が大きくなるだけで、根っこはこの繰り返しです。
この Step のまとめ
学習とは、損失関数を勾配降下法で小さくすること。多層では誤差逆伝播で全重みの勾配をまとめて求めます。学習率・エポック・ミニバッチが、学習を回すための基本の設定です。
畳み込みニューラルネットワーク(CNN)
Convolutional neural networks概要Overview
画像を全結合の MLP に入れると、うまくいきません。28×28 の小さな画像でも 784 個の入力になり、位置が少しずれただけで別物として扱われてしまうからです。画像のために生まれたのが畳み込みニューラルネットワーク(CNN)です。小さなフィルタを画像全体に滑らせて、局所的な特徴を効率よく捉えます。
仕組みHow it works
畳み込み
畳み込み(convolution)は、小さな重みの格子(カーネル、たとえば 3×3)を画像の上で少しずつ動かし、重なった部分との積の合計を計算する操作です。カーネルの値によって、縦の線・横の線・輪郭など、特定の模様に強く反応します。1枚のカーネルから作られる出力を特徴マップ(feature map)と呼びます。同じカーネルを画像全体で使い回すので、どこに現れた特徴でも同じように検出でき、重みの数も少なくてすみます。
プーリング
畳み込みの後には、しばしばプーリング(pooling)を挟みます。近くの数マスをまとめて代表値を取る操作で、最大値を取る最大プーリングが定番です。これにより特徴マップを小さくし、多少の位置のずれに強くします。
階層的な特徴
「畳み込み → 活性化 → プーリング」を何段も重ねると、はじめの層は線や角のような単純な模様を、深い層は目や車輪のような複雑なパーツを捉えるようになります。最後に全結合層で、これらの特徴を使ってクラスを判定します。次のデモで、カーネルによって画像がどう変わるかを見てみましょう。
畳み込みフィルタ
左のグレースケール画像(マスをクリックすると明暗が反転します)に、3×3のカーネルを重ねて畳み込みます。各出力マスは、重なる9マスとカーネルの積の合計です。ぼかしは画像を平滑化し、エッジ検出は輪郭を強調します。端はゼロで埋めています。
コードで動かすRun the code
PyTorch なら、CNN は nn.Module を継承して層を並べるだけです。畳み込み nn.Conv2d・活性化 nn.ReLU・最大プーリング nn.MaxPool2d・全結合 nn.Linear を組み合わせた、MNIST(28×28 の手書き数字)向けの小さな CNN を定義します。
import torch
import torch.nn as nn
import torch.nn.functional as F
class SmallCNN(nn.Module):
def __init__(self):
super().__init__()
self.conv1 = nn.Conv2d(1, 16, kernel_size=3, padding=1)
self.conv2 = nn.Conv2d(16, 32, kernel_size=3, padding=1)
self.pool = nn.MaxPool2d(2)
self.fc = nn.Linear(32 * 7 * 7, 10)
def forward(self, x):
x = self.pool(F.relu(self.conv1(x))) # 28 → 14
x = self.pool(F.relu(self.conv2(x))) # 14 → 7
x = x.flatten(1)
return self.fc(x)
model = SmallCNN()
print(model)
SmallCNN(
(conv1): Conv2d(1, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(conv2): Conv2d(16, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(pool): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
(fc): Linear(in_features=1568, out_features=10, bias=True)
)学習は、損失に交差エントロピー、最適化に Adam を使い、エポックを回すだけです。学習ループの骨格と、典型的なログは次のようになります。
opt = torch.optim.Adam(model.parameters(), lr=1e-3)
loss_fn = nn.CrossEntropyLoss()
for epoch in range(1, 4):
model.train()
for xb, yb in train_loader: # ミニバッチ
opt.zero_grad()
loss = loss_fn(model(xb), yb)
loss.backward() # 誤差逆伝播
opt.step() # 重みを更新
acc = evaluate(model, test_loader) # 検証データで精度
print(f"epoch {epoch} test_acc {acc:.3f}")
epoch 1 test_acc 0.972
epoch 2 test_acc 0.983
epoch 3 test_acc 0.987同じネットワークは、Keras なら Sequential に層を並べて、さらに簡潔に書けます。
from tensorflow import keras
from tensorflow.keras import layers
model = keras.Sequential([
layers.Conv2D(16, 3, padding="same", activation="relu",
input_shape=(28, 28, 1)),
layers.MaxPooling2D(),
layers.Conv2D(32, 3, padding="same", activation="relu"),
layers.MaxPooling2D(),
layers.Flatten(),
layers.Dense(10, activation="softmax"),
])
model.compile(optimizer="adam",
loss="sparse_categorical_crossentropy",
metrics=["accuracy"])
この Step のまとめ
CNN は、小さなカーネルを画像に滑らせる畳み込みで局所特徴を捉え、プーリングで縮約し、階層的に複雑な特徴を組み立てます。同じカーネルを使い回すため、位置に強く、重みも少なくてすみます。画像認識の主役です。
系列を扱うモデル
Models for sequences概要Overview
画像は縦横に広がるデータでしたが、世の中には順番が意味を持つデータもあります。文章(単語の並び)、音声、株価などの時系列がそうです。こうした系列データを扱うために、専用のネットワークが発展してきました。
仕組みHow it works
再帰型ニューラルネットワーク(RNN)
RNN(recurrent neural network)は、系列を1つずつ順に読み、それまでの内容を状態として次の時刻へ持ち越します。前の情報を覚えながら進めるので、文脈のあるデータに向きます。ただし、系列が長くなると前の情報が薄れやすく(勾配消失)、逐次処理のため学習に時間がかかるという弱点があります。
LSTM と GRU
この弱点をやわらげるのがLSTMやGRUです。情報を「どれだけ覚え、どれだけ忘れ、どれだけ出力するか」を制御するゲートという仕組みを備え、長い系列でも重要な情報を保ちやすくしています。長らく系列処理の主力でした。
注意機構と Transformer
さらに大きな転機となったのが注意機構(attention)です。系列を順に読むのではなく、どの要素とどの要素が関係するかを直接・並列に捉えます。これを全面的に採用したのが Transformer で、長い依存関係に強く、大規模な並列学習ができます。現在の大規模言語モデルの土台であり、くわしくは別モジュール(LLM)で扱います。
この Step のまとめ
系列データは、状態を持ち越す RNN、ゲートで記憶を制御する LSTM/GRU、そして関係を並列に捉える注意機構・Transformer へと発展しました。Transformer は現代の言語モデルの中核で、次のステップへの橋渡しになります。
実践と課題、これから
Practice and challenges概要Overview
ここまでで、深層学習の基本の部品はそろいました。最後に、実際に使うための道具立てと、必ずぶつかる課題、そしてその先の広がりを見ておきましょう。
仕組みHow it works
フレームワーク
深層学習を一から実装するのは大変ですが、PyTorchやTensorFlow / Kerasといったフレームワークを使えば、層を並べるだけでモデルを組めます。勾配の計算(誤差逆伝播)は自動で行われ(自動微分)、GPU による高速化も透過的に使えます。
過学習とその対策
深層学習は表現力が高いぶん、学習データを丸暗記してしまい、未知のデータで性能が落ちる過学習を起こしやすいです。代表的な対策を挙げます。
- ドロップアウト:学習中にニューロンをランダムに一部無効化し、特定の経路に頼りすぎないようにする。
- 正則化:重みが大きくなりすぎないよう、損失に罰則を加える(L2 正則化など)。
- データ拡張:画像を反転・回転・切り抜きするなどして、学習データを実質的に増やす。
- 早期終了:検証データの性能が悪化し始めたら学習を止める。
計算資源と転移学習
大きなモデルの学習には、GPUと大量のデータ、そして時間が必要です。そこで役立つのが転移学習です。大規模なデータであらかじめ学習させた事前学習モデルを土台にして、手元の小さなデータで目的に合わせて微調整します。ゼロから学習するより、少ないデータと計算で高い性能に届きます。この「事前学習+微調整」の発想が、現代の大規模モデルへとつながっています。
この Step のまとめ
実践ではフレームワーク(PyTorch・TensorFlow/Keras)を使い、過学習にはドロップアウト・正則化・データ拡張・早期終了で対処します。GPU と転移学習が、大きなモデルを現実的にします。基礎の一続きが、ここでひとまず完成しました。
まとめWrap-up
学びの振り返りと、さらに学ぶために
このモジュールでは、深層学習の基礎を土台から順に組み立てました。
- ニューロン:加重和に活性化関数(シグモイド・tanh・ReLU)をかけて出力する。
- 多層パーセプトロン:ニューロンを層状に積み、順伝播で予測を計算する。
- 学習:損失関数を勾配降下法で小さくし、誤差逆伝播で勾配を求める。
- CNN:畳み込みとプーリングで、画像から階層的な特徴を学ぶ。
- 系列モデル:RNN・LSTM から注意機構・Transformer へと発展する。
次に進むなら、下の道具と資料が役に立ちます。
公開データセット
- MNIST:28×28 の手書き数字 7万枚。深層学習の入門で最も有名。
- Fashion-MNIST:衣類画像 7万枚。MNIST と同じ形式で、少し難しい。
- CIFAR-10:32×32 のカラー画像 6万枚を10クラスに分類。
- digits:8×8 の手書き数字 1797枚。scikit-learn から取得可能。
ライブラリ
- PyTorch:研究でも実務でも定番の深層学習フレームワーク。
- TensorFlow / Keras:簡潔な記述で使えるフレームワーク。
- scikit-learn:MLPClassifier など、手軽なモデルと評価。
- NumPy:行列計算の基盤。仕組みを自作するときに。
参考書
- 斎藤康毅『ゼロから作る Deep Learning』オライリー・ジャパン
- 岡谷貴之『深層学習』講談社
- Ian Goodfellow ほか『Deep Learning』
次のモジュールへ
- 大規模言語モデル(LLM)
- 自然言語処理(NLP)
- 機械学習(基礎の復習)
おつかれさまでした
ここで学んだ「順伝播で予測し、損失を勾配降下法で小さくする」という流れは、どんなに大きなモデルでも共通の骨格です。3つのデモの設定を書き換えて、もう一度動かしてみてください。活性化関数の形、パーセプトロンの判定、畳み込みの効き方が、手ざわりとして残るはずです。
発展トピックBeyond this module
このコースでは扱わない、関係する発展トピック
このモジュールでは、ニューラルネットワークの「基礎の流れ」を扱いました。いっぽうで近年の深層学習は、より大きなモデルと新しい学習の枠組みを軸に急速に広がっています。ここでは、このコースでは踏み込まないものの、知っておくと視野が広がる発展的なトピックを、特に近年の主流を中心に紹介します。深掘りは各自の興味に合わせてどうぞ。大規模言語モデル(LLM)まわりは、大規模言語モデル(LLM)のモジュールで改めて扱います。
Transformer と自己注意
- 自己注意機構:系列の要素どうしの関係を重みづけて捉える、現代の中核アーキテクチャ。
- Transformer:注意機構だけで構成し、大規模な並列学習を可能にした。言語だけでなく画像にも広がる(Vision Transformer)。
生成モデル
- GAN(敵対的生成ネットワーク):生成器と識別器を競わせて、本物らしいデータを作る。
- 拡散モデル:ノイズから徐々に画像を作り出す。近年の画像生成の主流。
- VAE(変分オートエンコーダ):データを圧縮・復元しながら、生成もできる潜在表現を学ぶ。
学習の枠組みと基盤モデル
- 自己教師あり学習:ラベルなしのデータから、データ自身を手がかりに表現を学ぶ。
- 基盤モデル:大量のデータで事前学習し、多くの課題に転用できる汎用モデル。
- 強化学習:試行錯誤と報酬から、行動の方針を学ぶ枠組み。
効率化と広がり
- モデル圧縮・量子化:小型化や低精度化で、少ない資源でも動かせるようにする。
- グラフニューラルネットワーク:ノードとエッジで表される関係データを扱う深層モデル。
- マルチモーダル:画像と言語など、複数種類のデータを結びつけて扱うモデル。