論文一覧に戻る 📚 用語集トップ 🗺 概念マップ
📚 用語解説
📚 用語解説
深層学習
Deep Learning
深層学習
別称: ディープラーニング / DL

🔖 キーワード索引

ニューラルネット誤差逆伝播GPUCNNRNNTransformer勾配降下法活性化関数ReLUDropoutBatch Normalizationスケール則表現学習

別名・略称:ディープラーニング、 DL、 深層ニューラルネット

深層学習は 多層のニューラルネット で表現を自動獲得する手法群。 2012 年の AlexNet 以降、 画像・音声・言語の全領域で従来手法を凌駕しました。

🔖 キーワード索引(深掘り)

深層学習(Deep Learning, DL)は、 多層ニューラルネットワーク(NN)を用いて、 入力から出力までの複雑な関数を勾配降下で学習する機械学習手法。 2012 年 AlexNet による ImageNet 革命以降、 画像認識・音声認識・自然言語処理・強化学習・科学計算など、 ほぼすべての AI 分野で支配的なアプローチとなった。 2025 年現在、 LLM(GPT-4/Claude/Gemini)、 画像生成(Stable Diffusion)、 ロボット制御(V-JEPA 2)など、 基盤モデルの全てが深層学習の上に成り立つ。

forward propagation backpropagation chain rule SGD Adam 活性化関数 ReLU softmax 過学習 dropout batch normalization CNN RNN/LSTM Transformer attention

💡 30秒で分かる結論

🍰 まずはやさしく

コンピューターが自ら学ぶ仕組みです。

データから特徴を自動で見つけるために使います。

スマホの顔認証などで使われています。

この章では深層学習の基本を学びます。

深層学習(Deep Learning):多層ニューラルネットで特徴を自動学習する機械学習

📍 あなたが今見ているもの

🍰 まずはやさしく

今のAIブームを支える主役です。

画像や言葉を正しく処理するために使います。

生成AIなどの便利な機能に役立っています。

なぜ層を深くすると性能が上がるのかを読みます。

2010 年代以降の AI 第 3 次ブームを支えるのが 深層学習 です。 GPU の高速化、 大量データ、 勾配降下法とその改良(Adam, BN)が揃ったことで、 「層を深くしても学習可能」になり、 画像認識(ResNet)、 音声認識(Whisper)、 言語モデル(GPT/BERT)、 生成 AI(Diffusion)の全てが急速に進展しました。

📍 文脈ボックス(深掘り):なぜ「深い」のか

「深い」とは「層数が多い」という意味。 1980 年代までの NN は浅い(2-3 層)ものが主流で、 表現力に限界があった。 1980 年代後半 backpropagation が再発見されたが、 深い NN は 勾配消失問題で訓練が困難だった。

2006 年 Hinton らによる「層ごとの事前訓練」で深い NN の訓練が可能と示され、 2012 年 AlexNet(8 層 CNN)が ImageNet で従来手法を一気に 10 ポイント上回り、 深層学習革命が始まった。 ReLU、 dropout、 batch normalization、 ResNet(skip connection)などの工夫により、 数百層・数千層の NN も訓練可能になった。 2025 年の GPT-5、 Claude 4、 Gemini 2 は数千億~数兆パラメータの巨大 DL モデルである。

🎨 直感で掴む

🍰 まずはやさしく

人間が絵を見る方法に似ています。

複雑な形を段階的に理解するために使います。

写真の猫を判別する仕組みに似ています。

浅い学習と深い学習の違いについて読みます。

浅い学習 vs 深層学習

観点浅い機械学習深層学習
特徴量人手で設計(特徴量エンジニアリング)モデルが自動学習
層数1〜2 層(線形 / SVM / 決定木)10〜1000 層以上
データ要求数百〜数万件で OK数万〜数億件が望ましい
計算資源CPU でも十分GPU/TPU ほぼ必須
解釈比較的容易ブラックボックス気味
代表ロジスティック回帰、 SVM、 RFCNN、 Transformer、 Diffusion

なぜ「層を深く」する?

  • 階層的表現:低層がエッジ → 中層がパーツ → 高層が物体、 のように抽象度が上がる。
  • 万能近似定理の実用化:理論上は 1 層でも近似可能だが、 深い方が指数的に効率良い。
  • End-to-end 学習:入力 → 出力を一気通貫で最適化、 人手の中間表現が不要。

🎨 直感で掴む(深掘り):階層的特徴学習

メタファ 1:絵を見て理解するように

人間が絵を見るとき、 まずエッジ・色を捉え、 次に形・テクスチャ、 さらに物体パーツ、 最後に「これは猫」と認識する。 CNN はこの階層的処理を模倣する。 浅い層がエッジを、 中間層が形・パーツを、 深い層が物体全体を表現する。

メタファ 2:レゴブロックの組み立て

深層 NN は単純な変換ブロック(線形変換 + 活性化)を積み重ねたレゴ。 1 ブロックでは単純な関数しか表せないが、 100 ブロック積めば任意の複雑な関数を近似できる(universal approximation theorem)。

メタファ 3:プログラムを書く代わりに学習させる

「写真から猫を見つける」プログラムを人手で書くのは絶望的。 DL は「写真と正解ラベルを大量に見せる」だけで、 NN が必要な特徴抽出と判定を 自動で学習する。 ルールを書く代わりにデータを与えるパラダイム転換。

📐 定義 / 数式

🍰 まずはやさしく

計算のルールを数式で表したものです。

正解に近づくための計算をするために使います。

テストの点数を上げる勉強法のようなものです。

学習に使われる具体的な数式について読みます。

【全結合層 + ReLU】
$$h_l = \sigma(W_l h_{l-1} + b_l), \quad \sigma(z) = \max(0, z)$$
【損失と勾配降下】
$$\mathcal{L}(\theta) = \frac{1}{N}\sum_{i=1}^{N} \ell(y_i, f_\theta(x_i)), \quad \theta \leftarrow \theta - \eta \nabla_\theta \mathcal{L}$$
【誤差逆伝播:連鎖律】
$$\frac{\partial \mathcal{L}}{\partial W_l} = \frac{\partial \mathcal{L}}{\partial h_l} \cdot \frac{\partial h_l}{\partial W_l}$$

📐 数式(深掘り):forward / backward propagation

Forward Propagation

$L$ 層 NN の各層 $l$ の出力 $\mathbf{a}^{(l)}$ は:

$$\mathbf{z}^{(l)} = W^{(l)} \mathbf{a}^{(l-1)} + \mathbf{b}^{(l)}, \quad \mathbf{a}^{(l)} = \sigma(\mathbf{z}^{(l)})$$

$\sigma$ は活性化関数(ReLU, sigmoid, tanh, GELU 等)、 $W^{(l)}$ は重み行列、 $\mathbf{b}^{(l)}$ はバイアス。 最終層で予測 $\hat{\mathbf{y}} = \mathbf{a}^{(L)}$、 損失 $\mathcal{L}(\hat{\mathbf{y}}, \mathbf{y})$ を計算。

Backpropagation(chain rule)

勾配を出力側から入力側へ逆伝播:

$$\delta^{(L)} = \nabla_{\mathbf{a}^{(L)}} \mathcal{L} \odot \sigma'(\mathbf{z}^{(L)})$$

$$\delta^{(l)} = ((W^{(l+1)})^\top \delta^{(l+1)}) \odot \sigma'(\mathbf{z}^{(l)})$$

$$\frac{\partial \mathcal{L}}{\partial W^{(l)}} = \delta^{(l)} (\mathbf{a}^{(l-1)})^\top, \quad \frac{\partial \mathcal{L}}{\partial \mathbf{b}^{(l)}} = \delta^{(l)}$$

SGD / Adam による更新

$$W^{(l)} \leftarrow W^{(l)} - \eta \frac{\partial \mathcal{L}}{\partial W^{(l)}}$$

$\eta$ は学習率。 Adam は 1 次・2 次モーメントの指数移動平均を保持し、 適応的に LR を調整する。

数式を言葉で読み解く

📐 DL 損失関数ファミリー

損失タスク式概要
MSE回帰$\frac{1}{N}\sum (y - \hat{y})^2$
MAE回帰(外れ値耐性)$\frac{1}{N}\sum |y - \hat{y}|$
Cross Entropy分類$-\sum y \log \hat{y}$
Focal Loss不均衡分類$-(1-\hat{y})^\gamma \log \hat{y}$
Contrastive (InfoNCE)SSLpositive を softmax で最大化
Triplet Lossembedding 学習$\max(0, d(a,p) - d(a,n) + \alpha)$
Dice Losssemantic segmentation$1 - 2 |X \cap Y| / (|X| + |Y|)$
CTC音声認識全アラインメントの周辺化

⚙️ 最適化アルゴリズム比較

名称特徴適用
SGD基本、 LR が命CNN(warmup + cosine)
SGD with Momentum慣性で振動緩和ResNet 系
Nesterov先読み momentum高速収束
AdaGradLR を成分別に減衰疎な勾配
RMSProp指数移動平均で LR 調整RNN
Adam1 次 + 2 次モーメント汎用デフォルト
AdamWweight decay 修正Transformer/LLM
LAMB大 batch 対応BERT 大規模訓練
Lion符号のみ更新、 軽量2023+ 流行

🏢 DL の実産業応用

分野応用例代表モデル
医療X 線・MRI・病理画像診断、 創薬CheXNet, AlphaFold
自動運転物体検知、 セグメンテーション、 行動予測YOLOv8, BEVFormer
音声音声認識、 合成、 翻訳Whisper, Tacotron
言語翻訳、 要約、 質問応答、 コード生成GPT-4, Claude, Gemini
画像生成Text-to-Image、 編集、 動画Stable Diffusion, DALL-E 3
推薦Netflix, YouTube, AmazonTwo-Tower, deep retrieval
金融不正検知、 信用スコア、 アルゴ取引TabNet, FinBERT
気象数値予報、 災害予測GraphCast, Pangu-Weather
材料科学新材料探索、 物性予測GNoME, MatterGen
ロボット把持、 ナビゲーション、 模倣学習RT-2, Optimus

📘 DL 用語ミニ辞典

用語意味
epoch全訓練データを 1 回見た単位。 通常 10-1000 epoch 訓練。
batch / mini-batch1 度に勾配計算するサンプル数。 32, 64, 256 が一般的。
iteration / step1 batch で 1 更新。 1 epoch = N/batch_size 回の iteration。
learning rate (LR)勾配を重みに反映する係数。 通常 1e-3 ~ 1e-5。
activation function非線形関数(ReLU, GELU, sigmoid, tanh)。 NN に表現力を与える。
dropout訓練時にランダムにニューロンを 0 化。 過学習対策。
batch normalization層出力を batch 内で正規化。 学習安定化。
layer normalization層内正規化。 Transformer 標準。
residual / skip connection入力を出力に加算。 深い NN 訓練の鍵(ResNet)。
attentionトークン間の関係性を学習。 Transformer の核。
embedding離散値(単語等)の高次元連続表現。
weight decay重みの L2 正則化。 過学習対策。
gradient clipping勾配の大きさを上限制限。 勾配爆発対策。
warmup学習初期に LR を徐々に上げる。 安定化。
checkpoint途中のモデル重みを保存。 訓練中断・再開可能。
overfitting訓練データに過剰適合。 汎化性能が落ちる。
early stopping検証精度が下がり始めたら訓練終了。 過学習対策。
data augmentation既存データから変換でサンプル増やす。 汎化性向上。
transfer learning事前学習モデルを別タスクに転用。
fine-tuning事前学習モデルを新データで再学習。

✅ DL プロジェクト実行チェックリスト

フェーズ 1:データ準備

フェーズ 2:ベースライン

フェーズ 3:モデル設計

フェーズ 4:訓練

フェーズ 5:評価と本番化

📖 ストーリーで理解:DL までの 70 年

1940-50 年代:神経の数理化。 McCulloch-Pitts、 Rosenblatt のパーセプトロンで「人工ニューロン」の概念が生まれる。

1969 年:第 1 次 AI 冬。 Minsky & Papert が「パーセプトロンは XOR を学習できない」と指摘。 NN 研究は冬眠へ。

1986 年:backprop 再発見。 Rumelhart, Hinton らが多層 NN の訓練法 backpropagation を整理。 NN 復活。

1990 年代:第 2 次 AI 冬。 SVM、 ブースティングが台頭。 NN は浅いまま、 訓練困難で人気低下。

2006 年:Deep Learning 命名。 Hinton の deep belief net で深層 NN 訓練の可能性が示される。

2012 年:AlexNet 革命。 GPU + 大量データ + ReLU + dropout で ImageNet を圧勝。 DL 時代の幕開け。

2014-2017 年:アーキ革新。 GAN, VGG, GoogLeNet, ResNet, Transformer が次々と。

2018-2020 年:基盤モデル。 BERT, GPT-2, GPT-3 で大規模事前学習がパラダイムに。

2022 年-:ChatGPT 後の世界。 LLM が一般普及、 マルチモーダル AI、 生成 AI が主流に。 2025 年現在、 GPT-5, Claude 4, Gemini 2 が「人間と対話できる AI」を実現。

🧪 追加実験:層数と精度の関係

🎯 このコードでやること:MLP の層数を 1~5 で変え、 CV 精度の変化を観察。 「深ければよい」とは限らないことを確認。

📥 入力:X (47×6), y (47)(先のコードで作成)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import pandas as pd
import numpy as np
from sklearn.neural_network import MLPClassifier
from sklearn.model_selection import cross_val_score

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
d = df[df['SSDSE-B-2026'] == 2023]  # 2023 年の 47 都道府県
features = ['A1101', 'A1303', 'A4101', 'A4200', 'H1801', 'E3101']
X = d[features].astype(float).values
X = (X - X.mean(axis=0)) / X.std(axis=0)
y = pd.qcut(d['A1101'].astype(float), 3, labels=[0,1,2]).astype(int).values

architectures = {
    '1 層 [8]': (8,),
    '2 層 [16, 8]': (16, 8),
    '3 層 [32, 16, 8]': (32, 16, 8),
    '4 層 [64, 32, 16, 8]': (64, 32, 16, 8),
    '5 層 [128, 64, 32, 16, 8]': (128, 64, 32, 16, 8),
}

for name, arch in architectures.items():
    clf = MLPClassifier(hidden_layer_sizes=arch, max_iter=3000, random_state=0)
    s = cross_val_score(clf, X, y, cv=5)
    print(f'{name}: {s.mean():.3f} ± {s.std():.3f}')

📤 実行結果:

1 層 [8]: 0.916 ± 0.104 2 層 [16, 8]: 0.913 ± 0.129 3 層 [32, 16, 8]: 0.933 ± 0.133 4 層 [64, 32, 16, 8]: 0.933 ± 0.133 5 層 [128, 64, 32, 16, 8]: 0.933 ± 0.133

💬 47 サンプル × 6 特徴の小データでは、 1〜5 層いずれも CV 精度 0.91〜0.93 に収まり、 差は CV 標準偏差(±0.10〜0.13)の範囲内で有意ではない。 「層を深くしても精度はほぼ頭打ち」=小データでは深さがほとんど効かない典型例。 大データなら深いほど有利だが、 この規模では浅いモデルや古典 ML で十分。

📖 試験対策クイックリファレンス

よく問われる定義

よく問われる比較

🔧 DL デバッグ・トラブルシューティング

症状原因の可能性対処
loss が NaN勾配爆発、 log(0), 0除算gradient clipping、 LR 減少、 epsilon 追加
loss が下がらないLR 小さすぎ、 勾配消失LR 上昇、 ReLU/BatchNorm 導入
訓練精度高、 検証精度低過学習dropout、 weight decay、 augmentation、 early stopping
訓練・検証両方低いunderfittingモデル深く、 LR 調整、 epoch 増やす
特定クラスばかり予測クラス不均衡class weight、 oversampling、 focal loss
GPU メモリ不足 (OOM)batch / モデル大きすぎbatch 縮小、 gradient checkpointing、 mixed precision
訓練が遅いCPU で動いている、 data loader ボトルネックGPU 使用、 num_workers 増、 pin_memory=True
再現性が無いrandom seed 未固定torch/numpy/cuda seed 全て固定
推論結果が変model.eval() 忘れmodel.eval() で dropout/BN を推論モードに

🗾 日本の深層学習

主要プレイヤー

日本の DL 用データセット

教育リソース

🔬 記号・式を言葉で読み解く

$h_l$ — 第 $l$ 層の出力
前層の出力を線形変換 + 活性化したもの。 「中間表現」とも呼ぶ。
$W_l, b_l$ — 学習パラメータ
層ごとの重み行列と偏り。 これら全体を $\theta$ と書く。
$\sigma$ — 活性化関数
非線形性を導入。 ReLU, GELU, Swish などが定番。
$\mathcal{L}$ — 損失関数
予測と正解の乖離。 回帰なら MSE、 分類なら Cross-Entropy。
$\eta$ — 学習率
パラメータ更新の歩幅。 大きすぎると発散、 小さすぎると学習が遅い。
$\nabla_\theta \mathcal{L}$ — 勾配
損失を $\theta$ で偏微分したベクトル。 「損失が最も増える方向」。
連鎖律
層が連なっていても合成関数の微分で勾配を逐次計算できる。 これが 誤差逆伝播

🧮 実値で計算してみる(SSDSE-B-2026・47 都道府県)

SSDSE-B-2026(2023 年)から都道府県の「総人口(A1101)」を特徴量、 「新規求職申込件数(F3101)」を目標として、 2 層の MLP で回帰します。 47 件のサンプルでも、 線形回帰よりわずかに非線形を捉えられます。

都道府県総人口(千人)新規求職申込件数(件)
北海道5092156458
青森県118443713
秋田県91430175
東京都14086270954
神奈川県9229150949
大阪府8763203553

深層学習は 非線形関係多変量交互作用 がある場面で真価を発揮します。 47 件は本来「深い」モデルには小さすぎますが、 仕組み学習用としては理想的です。

🧮 実値で確認(深掘り):SSDSE-B-2026 を DL で分類

SSDSE-B-2026 の 47 都道府県を、 6 統計指標から「人口規模 3 段階」に分類するタスクを DL で解く。 シンプルな 3 層 MLP(入力 6 → 隠れ 16 → 隠れ 8 → 出力 3)で実装し、 sklearn の MLP と比較する。

📥 入力データ(実測、 抜粋):

Prefecture 人口A1101 65歳A1303 出生A4101 死亡A4200 着工H1801 中学E3101 北海道 5,092,000 1,681,000 24,430 75,120 8,168 563 東京都 14,086,000 3,205,000 86,348 137,241 13,289 800 神奈川県 9,229,000 2,390,000 53,991 98,744 11,120 471 (47 行 × 6 指標・2023 年)→ ラベル:人口を 3 ビン(小・中・大)に離散化

🧮 数式に値を入れて手で計算する — 1 ニューロンの forward pass

深層学習の最小単位である 1 ニューロンの forward pass ($z = W x + b$, $a = \sigma(z)$) に、 多様な整数の合成データを代入して計算過程を Step 1〜4 で展開する。 同じ計算を Python (numpy) で再現し、 結果が一致することを確認する。

📐 用語の主要数式 (再掲)

$$ z = W x + b, \quad a = \sigma(z) = \frac{1}{1 + e^{-z}} $$

ここで $W$ は重みベクトル、 $x$ は入力ベクトル、 $b$ はバイアススカラ、 $\sigma$ はシグモイド活性化関数を表す。 これは多層パーセプトロンを構成する 1 ユニット分の処理。

Step 1: データ準備 (合成、 多様な整数)

記号意味
$W$$[2, 3]$重みベクトル (2 入力 → 1 ユニット)
$x$$[1, 2]$入力ベクトル
$b$$-1$バイアス
$\sigma$sigmoid活性化関数

Step 2: 内積 $W \cdot x$

項目計算結果
$W_1 x_1$$2 \times 1$2
$W_2 x_2$$3 \times 2$6
$W \cdot x$$2 + 6$8

Step 3: 線形和 $z = W \cdot x + b$

項目計算結果
$z$$8 + (-1)$7

Step 4: シグモイド活性化 $a = \sigma(z)$

項目計算結果
$e^{-z}$$e^{-7}$0.000912
$1 + e^{-z}$$1 + 0.000912$1.000912
$a = \sigma(z)$$1 / 1.000912$0.999089

🐍 同じ計算を Python で再現

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
import numpy as np

W = np.array([2, 3])
x = np.array([1, 2])
b = -1

z = W @ x + b
a = 1.0 / (1.0 + np.exp(-z))

print(f"W . x  = {W @ x}")
print(f"z      = {z}")
print(f"a=σ(z) = {a:.6f}")

📤 実行結果

W . x = 8 z = 7 a=σ(z) = 0.999089

💬 手計算 Step 2-4 (内積 8, 線形和 7, シグモイド 0.999089) と Python の出力が完全一致。 シグモイドは $z=7$ という大きな値で 1 にほぼ飽和することがわかる ($\sigma(7)\approx 0.999$)。 これが大きな $|z|$ で勾配が 0 に近づく「勾配消失」の正体で、 ReLU や GELU が現代の標準活性化関数として使われる理由でもある。

🐍 Python 実装

SSDSE-B-2026(47 都道府県・2023 年)の実データを使った最小コード:

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 A1101(総人口) F3101(新規求職申込件数(一般)) 北海道 5,092,000 156,458 東京都 14,086,000 270,954 沖縄県 1,468,000 43,877 …(全 47 行)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# SSDSE-B-2026 で MLP 回帰:人口 → 新規求職申込件数
import pandas as pd, numpy as np, torch
import torch.nn as nn

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
d = df[df['SSDSE-B-2026'] == 2023]           # 2023 年の 47 都道府県

X = d[['A1101']].astype(float).values   # 総人口
y = d['F3101'].astype(float).values     # 新規求職申込件数

# 標準化
X = (X - X.mean()) / X.std()
y = (y - y.mean()) / y.std()
X_t = torch.tensor(X, dtype=torch.float32)
y_t = torch.tensor(y, dtype=torch.float32).unsqueeze(1)

# 2 層 MLP
model = nn.Sequential(
    nn.Linear(1, 16), nn.ReLU(),
    nn.Linear(16, 8), nn.ReLU(),
    nn.Linear(8, 1)
)
opt = torch.optim.Adam(model.parameters(), lr=0.05)
loss_fn = nn.MSELoss()

for epoch in range(500):
    pred = model(X_t)
    loss = loss_fn(pred, y_t)
    opt.zero_grad(); loss.backward(); opt.step()
    if epoch % 100 == 0:
        print(f'epoch {epoch:3d}  loss={loss.item():.4f}')

🐍 Python 実装(深掘り):MLP で都道府県分類

コード 1:データ準備

🎯 このコードでやること:SSDSE-B-2026 を読み込み、 6 特徴と人口 3 段階ラベルを準備。

📥 入力:data/raw/SSDSE-B-2026.csv(cp932)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
import pandas as pd
import numpy as np

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
d = df[df['SSDSE-B-2026'] == 2023].reset_index(drop=True)  # 2023 年の 47 都道府県
features = ['A1101', 'A1303', 'A4101', 'A4200', 'H1801', 'E3101']
X = d[features].astype(float).values
X = (X - X.mean(axis=0)) / X.std(axis=0)  # z-score

pop = d['A1101'].astype(float).values
# qcut が返すのは Categorical。astype(int) の時点で ndarray になるので .values は付けない
y = pd.qcut(pop, 3, labels=[0, 1, 2]).astype(int)

print('X shape:', X.shape, 'y shape:', y.shape)
print('クラス分布:', np.bincount(y))

📤 実行結果:

X shape: (47, 6) y shape: (47,) クラス分布: [16 15 16]

💬 47 県を 3 クラスに均等分割。 z-score で各特徴を正規化。 DL モデルへの入力準備完了。

コード 2:3 層 MLP を numpy で実装(教育目的)

🎯 このコードでやること:自前 numpy で 3 層 MLP の forward を実装し、 重みのランダム初期化で 1 回推論。

📥 入力:X (47×6)、 ランダム重み

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
rng = np.random.default_rng(0)
W1 = rng.normal(scale=0.3, size=(6, 16))
b1 = np.zeros(16)
W2 = rng.normal(scale=0.3, size=(16, 8))
b2 = np.zeros(8)
W3 = rng.normal(scale=0.3, size=(8, 3))
b3 = np.zeros(3)

def relu(x): return np.maximum(0, x)
def softmax(x):
    e = np.exp(x - x.max(axis=-1, keepdims=True))
    return e / e.sum(axis=-1, keepdims=True)

z1 = X @ W1 + b1
a1 = relu(z1)
z2 = a1 @ W2 + b2
a2 = relu(z2)
z3 = a2 @ W3 + b3
pred = softmax(z3)
print('予測分布(東京):', pred[d.index[d['Prefecture']=='東京都'][0]].round(3))
print('初期 accuracy:', (pred.argmax(axis=1) == y).mean())

📤 実行結果:

予測分布(東京): [0.448 0.416 0.136] 初期 accuracy: 0.34

💬 ランダム初期化のため東京の予測分布はほぼ均等(class 0 が僅差で最大)で、 全体精度 34% は chance(33%)とほぼ同じ。 未学習の NN は当て推量に等しく、 学習でこれを 90%+ に引き上げる。

コード 3:sklearn MLPClassifier で fit

🎯 このコードでやること:sklearn の MLPClassifier(隠れ層 [16, 8])で実際に学習し、 cross validation 精度を測定。

📥 入力:X, y(先のコード)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
from sklearn.neural_network import MLPClassifier
from sklearn.model_selection import cross_val_score

clf = MLPClassifier(
    hidden_layer_sizes=(16, 8),
    activation='relu',
    solver='adam',
    max_iter=2000,
    random_state=0,
)
scores = cross_val_score(clf, X, y, cv=5)
print(f'MLP CV accuracy: {scores.mean():.3f} ± {scores.std():.3f}')

# 全データで学習し、 訓練精度を見る
clf.fit(X, y)
print(f'train accuracy: {clf.score(X, y):.3f}')
print(f'layers: {[clf.coefs_[i].shape for i in range(len(clf.coefs_))]}')

📤 実行結果:

MLP CV accuracy: 0.913 ± 0.129 train accuracy: 1.000 layers: [(6, 16), (16, 8), (8, 3)]

💬 5-fold CV で 91.4% 精度。 訓練精度 100% から CV 91% への差は過学習だが許容範囲。 47 サンプルしかないことを考えると驚異的。

コード 4:他手法との比較

🎯 このコードでやること:同じ問題を logistic regression、 random forest、 MLP の 3 手法で解き、 精度を比較。

📥 入力:X, y

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier

models = {
    'Logistic Regression': LogisticRegression(max_iter=2000),
    'Random Forest': RandomForestClassifier(n_estimators=100, random_state=0),
    'MLP (3 層)': MLPClassifier(hidden_layer_sizes=(16, 8), max_iter=2000, random_state=0),
}

for name, m in models.items():
    s = cross_val_score(m, X, y, cv=5)
    print(f'{name}: {s.mean():.3f} ± {s.std():.3f}')

📤 実行結果:

Logistic Regression: 0.804 ± 0.177 Random Forest: 0.936 ± 0.088 MLP (3 層): 0.913 ± 0.129

💬 47 サンプルの小データでは、 むしろ Random Forest(0.936)が MLP(0.913)を上回り、 Logistic Regression は 0.804 とばらつき(±0.18)も大きい。 「小データでは DL が必ずしも勝たない」という典型例。 真の DL の強みは数万~数億サンプルで発揮される。

🐍 PyTorch で DL ミニ実装(参考)

PyTorch で同じ MLP を組む

🎯 このコードでやること:sklearn と等価な 3 層 MLP を PyTorch で実装し、 訓練ループを書く。

📥 入力:X (47×6 numpy), y (47 numpy)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import pandas as pd
import numpy as np
import torch
import torch.nn as nn
torch.manual_seed(0)   # 実行のたびに同じ結果が出るようにする

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
d = df[df['SSDSE-B-2026'] == 2023]  # 2023 年の 47 都道府県
features = ['A1101', 'A1303', 'A4101', 'A4200', 'H1801', 'E3101']
X = d[features].astype(float).values
X = (X - X.mean(axis=0)) / X.std(axis=0)
pop = d['A1101'].astype(float).values
y = pd.qcut(pop, 3, labels=[0, 1, 2]).astype(int)   # qcut().astype(int) は既に配列

X_t = torch.tensor(X, dtype=torch.float32)
y_t = torch.tensor(y, dtype=torch.long)

class MLP(nn.Module):
    def __init__(self):
        super().__init__()
        self.fc1 = nn.Linear(6, 16)
        self.fc2 = nn.Linear(16, 8)
        self.fc3 = nn.Linear(8, 3)
    def forward(self, x):
        x = torch.relu(self.fc1(x))
        x = torch.relu(self.fc2(x))
        return self.fc3(x)

model = MLP()
opt = torch.optim.Adam(model.parameters(), lr=1e-2)
crit = nn.CrossEntropyLoss()

for epoch in range(500):
    opt.zero_grad()
    logits = model(X_t)
    loss = crit(logits, y_t)
    loss.backward()
    opt.step()
    if (epoch+1) % 100 == 0:
        acc = (logits.argmax(1) == y_t).float().mean().item()
        print(f'epoch {epoch+1}: loss={loss.item():.4f}, acc={acc:.3f}')

📤 実行結果(実行例・環境依存):

epoch 100: loss=0.1178, acc=0.957 epoch 200: loss=0.0207, acc=1.000 epoch 300: loss=0.0082, acc=1.000 epoch 400: loss=0.0038, acc=1.000 epoch 500: loss=0.0020, acc=1.000

💬 500 epoch で訓練精度 100%(loss/acc の具体値は乱数シード未固定のため環境依存・上は一実行例)。 CV で評価すると 91% 前後(sklearn と一致)。 PyTorch なら GPU 化、 大規模化、 自前 layer 設計が自由自在。

⚠️ よくある落とし穴

⚠️ データが少ない
深層学習は数千〜数万件が前提。 47 件規模では木モデル(XGBoost)の方が安全。
⚠️ 過学習
パラメータ数 ≫ サンプル数で必発。 Dropout / Weight Decay / Early Stopping で抑制。
⚠️ 学習率の調整不足
Adam のデフォルト 0.001 が必ずしも最適ではない。 LR スケジューラ併用が安全。
⚠️ 勾配消失・爆発
深いネットで頻発。 ReLU + Batch Norm + Residual Connection が定番対策。
⚠️ 解釈の限界
ブラックボックス。 SHAP / Grad-CAM / Integrated Gradients で説明性を補う。

⚠️ 落とし穴(深掘り、 10 件)

  1. 過学習:訓練データには適合するが、 新データに弱い。 dropout、 weight decay、 early stopping、 data augmentation で対策。
  2. 勾配消失:深い NN で勾配が指数的に減衰。 ReLU、 BatchNorm、 skip connection(ResNet)で解決。
  3. 勾配爆発:逆に勾配が発散。 gradient clipping、 LR 調整で対応。
  4. ハイパーパラメータ地獄:層数、 ユニット数、 LR、 batch、 optimizer、 epoch、 正則化…組合せが膨大。 hyperopt や Optuna 等で自動化。
  5. 初期化の重要性:Xavier / He 初期化を使わないと深い NN は学習しない。 PyTorch/Keras はデフォルトで適用。
  6. データリーク:訓練・検証データの分離ミスで精度が過大評価される。 時系列なら特に注意。
  7. 計算コスト:GPU/TPU が必須、 電力消費大。 環境負荷の議論も。
  8. 解釈性の欠如:「なぜそう判断したか」が説明困難。 SHAP、 LIME、 attention 可視化等で補う。
  9. 少データでは負ける:本ページの例の通り、 数十~数百サンプルでは線形モデルや木で十分。 DL は数万以上で本領発揮。
  10. 分布シフト脆弱性:訓練データと推論データの分布が違うと精度激減。 domain adaptation や継続学習が必要。

🗺 概念マップ

深層学習の周辺概念をテーマ別ツリーで整理:

機械学習 (上位概念)
  ├── 古典機械学習 (SVM・ランダムフォレスト)
  ├── 【深層学習】 ← ここ
  │     ├── CNN (画像認識)
  │     ├── RNN/LSTM (時系列)
  │     ├── Transformer (自然言語・基盤モデル)
  │     └── 拡散モデル (生成)
  └── 強化学習 (方策最適化)

この階層構造を頭に入れておくと、 学習や論文読みで「自分が今どこにいるか」を見失わずに済みます。

🎓 学習パス(推奨順)

「深層学習」を確実にマスターするには、 次の順序で進むのが効率的です:

  1. 前提知識の確認 — 上記「🔗 前提となる用語」セクションのリンクを順に読む(30 分〜)
  2. 直感を作る — 本ページの「🎨 直感で掴む」と「🧮 実値で計算」を SSDSE-B で手を動かしてみる
  3. 数式を読み下す — 「📐 定義」と「🔬 数式を言葉で読み解く」で 1 つずつ意味を確認
  4. Python で動かす — 「🐍 Python 実装」のコードをコピペし、 別の指標で実験
  5. 落とし穴を知る — 「⚠️ 落とし穴」を読み、 自分のコードに該当箇所がないか確認
  6. 関連手法を学ぶ — 「🌐 関連手法・派生」で次に学ぶべき派生概念へ
  7. 論文で活用 — 上位「📚 関連グループ教材」のページで実論文の文脈を確認

焦らず、 1 段ずつ確実に。 7 ステップを 1 周すれば、 単に「知っている」から「使える」レベルに到達できます。

🗺 概念マップ:深層学習の全体像

機械学習
├── 教師あり学習 ──── 古典 ML(SVM, RF, XGBoost)
│                  └── 深層学習 ──── MLP, CNN, RNN, Transformer
├── 教師なし学習 ──── PCA, k-means
├── 自己教師あり学習 ── SimCLR, BERT, MAE, CLIP, DINO
└── 強化学習 ────── DQN, PPO, AlphaGo

深層学習の重要要素
├── アーキテクチャ
│   ├── MLP(基本)
│   ├── CNN(画像)
│   ├── RNN/LSTM(時系列、 旧)
│   ├── Transformer(言語+全領域)
│   ├── GAN / VAE / Diffusion(生成)
│   └── GNN(グラフ)
├── 学習要素
│   ├── 損失関数(cross entropy, MSE, contrastive)
│   ├── 活性化関数(ReLU, GELU, sigmoid)
│   ├── 最適化(SGD, Adam, AdamW)
│   ├── 正則化(dropout, BatchNorm, weight decay)
│   └── 初期化(Xavier, He)
└── 学習パラダイム
    ├── from scratch
    ├── pretraining + fine-tuning
    ├── 自己教師あり pretraining
    ├── few-shot / zero-shot
    └── prompt engineering(LLM 時代)

❓ FAQ

Q1. NN と DL の違いは?

NN(ニューラルネットワーク)は手法そのもの。 DL(深層学習)は「層数の多い NN を訓練すること」。 重なる概念で、 厳密には「DL = 多層 NN による表現学習」。

Q2. PyTorch と TensorFlow どちらを使うべき?

研究は PyTorch が主流(柔軟性、 huggingface 連携)。 本番運用 TensorFlow(モバイル推論、 TF Serving)。 2025 現在は PyTorch 一強傾向で、 Keras 3 も PyTorch backend 対応。

Q3. GPU は何を選べばよい?

学習目的:NVIDIA RTX 4090 / 5090(個人)、 A100 / H100 / B200(業務)。 推論:CPU でも可だが、 LLM や生成は GPU 必須。 クラウド:AWS, GCP, Azure, Lambda Labs 等で時間貸し。

Q4. DL を学ぶ最短ルートは?

数学:線形代数、 微分積分、 確率統計の基礎。 プログラミング:Python + numpy + PyTorch。 順序:MLP → CNN → Transformer → 生成モデル。 教材:Andrej Karpathy の youtube、 fast.ai、 Deep Learning Specialization(Coursera)。

Q5. SSDSE のような小データで DL は意味あるか?

本ページの例の通り、 47 サンプルでは線形モデルと差がほぼ無い。 数千~数万以上で DL の優位性が現れる。 ただし、 教育目的での実装演習には有効。

🛠 実務 Tips

  1. 事前学習済みモデルから始める:from scratch でなく、 huggingface の事前学習モデル + fine-tuning が高速・高精度。
  2. baseline を確立:DL 前に必ず線形モデルや勾配ブースティングで baseline 精度を測る。 これを超えなければ DL の意義なし。
  3. データの質 > モデルの複雑さ:データクレンジング、 augmentation、 ラベルの正確さで精度の 8 割が決まる。
  4. monitoring 必須:訓練 loss、 検証 loss、 学習曲線を毎エポック確認。 wandb / tensorboard を活用。
  5. 正則化を確実に:dropout 0.2-0.5、 weight decay 1e-4 〜 1e-2、 early stopping、 augmentation。
  6. 学習率は最重要ハイパラ:LR finder(fast.ai)、 cosine schedule、 warmup を使う。 デフォルト 1e-3 は出発点に過ぎない。
  7. mixed precision で高速化:fp16/bf16 訓練で 2-3 倍高速、 メモリ半減。 PyTorch torch.cuda.amp で簡単に有効化。
  8. checkpoint と再現性:random seed 固定、 モデル定期保存、 環境記録(pip freeze)必須。

⚖️ DL の社会的影響と倫理

🔮 今後の展望(2026 以降)

  1. スケーリング法則の限界と新パラダイム:パラメータ・データ・計算の指数拡大が限界に。 sparse モデル(MoE)、 メモリ機構、 推論時計算(reasoning)が次の鍵。
  2. 世界モデル:JEPA 系列。 物理的に世界を理解し、 行動を計画する agent。
  3. マルチモーダル統合:画像・テキスト・音声・動画・3D・ロボット行動の統一表現。
  4. 効率化革命:MobileLLM、 蒸留、 量子化、 sparse activation で edge AI 実現。
  5. 科学発見:AlphaFold、 GNoME のような DL が新材料・新薬・新数学定理を発見。
  6. ニューロモーフィック:脳に似たスパイク NN、 専用ハードウェア(Intel Loihi 等)。
  7. 量子 + DL:量子優位を発揮する DL の探索(量子変分回路等)。
  8. AGI への道:自己改善 AI、 メタ学習、 オンライン学習の進化。

📑 必読論文・教科書

古典

現代

教科書

deep learning CNN(畳み込みニューラルネ RNN/LSTM/GRU Transformer GAN・VAE・Diffus Graph Neural N 強化学習 + 深層学習(De

🔗 隣接手法への橋渡し

「深層学習」は単独で完結する手法ではなく、 隣接領域と連携することで真価を発揮する。 具体的には次の 3 方向と密接につながる:

深層学習は NN の発展形で、 多層化により表現力が飛躍的に高まる。

🌳 「DL を使うべきか」決定木

Q1: データは画像・音声・テキスト・動画ですか?
├── Yes → DL(特に CNN/Transformer)を強く推奨
└── No (表形式) → Q2 へ
    Q2: データ量は?
    ├── 数百以下 → 線形モデル or 古典 ML(DL は過剰)
    ├── 数千~数万 → 古典 ML(XGBoost)と DL(TabNet)を両方試す
    └── 数十万以上 → DL の優位性が出やすい
        Q3: 解釈性が必要?
        ├── Yes(医療・司法・金融審査)→ 線形/木 + SHAP
        └── No → DL OK
            Q4: GPU リソースは?
            ├── 限定 → 小型モデル(軽量 BERT、 MobileNet 等)
            └── 潤沢 → 事前学習 + fine-tuning
                Q5: ラベルは十分?
                ├── 不足 → SSL pretraining + few-shot
                └── 十分 → supervised fine-tune

🧰 DL エコシステム(2025 現在)

2025 年現在、 PyTorch + HuggingFace + wandb + Optuna が研究での「黄金スタック」。 業務では加えて Vertex AI / SageMaker / Databricks 等のマネージドサービスが主流。

🎓 ワンページまとめ

🧠 CNN / RNN / Transformer 徹底比較

深層学習の主要 3 アーキテクチャを、 入力形式・帰納バイアス・典型タスクで整理する。 「いつ何を使うか」の判断基準を SSDSE-B-2026 と国際比較データで具体化。

アーキ入力帰納バイアス計算量典型タスク
CNN画像 (2D/3D)局所性 + 平行移動不変O(N)画像分類 / 物体検出
RNN / LSTM系列 (時系列・テキスト)逐次依存 + 隠れ状態O(N)系列予測 / 旧型 NLP
Transformerトークン列 (任意)弱い (Attention で全結合)O(N^2)LLM / VLM / 全分野

🔬 数式を言葉で読み解く: Self-Attention

Transformer の中核は Self-Attention: $\text{Attn}(Q,K,V) = \text{softmax}(QK^T / \sqrt{d_k}) V$。 Q(クエリ)・K(キー)・V(バリュー)はすべて入力 $X$ を線形変換したもの。 $QK^T$ は「どのトークンとどのトークンが関連するか」のスコア行列、 softmax で正規化、 $V$ で値を集約。 系列全体を一度に見るため位置情報は位置エンコーディングで追加する。

🎯 このコードでやること

SSDSE-B-2026 の都道府県人口時系列を PyTorch の小型 Transformer Encoder で次年予測する。 同じデータで MLP と比較し、 小データでの DL の限界を体感する。

📥 入力データ: 1975-2021 年の全国人口時系列 (47 年 × 1 系列)

年度 全国人口 0 1975 111939643 1 1980 117060396 2 1985 121048923 3 1990 123611167 4 1995 125570246
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import pandas as pd
import torch
import torch.nn as nn

# 全国人口の時系列(年 × 全国人口)を読み込み、平均0・分散1に正規化
df = pd.read_csv('data/raw/population_jp.csv')   # 列: 年度, 全国人口
z = (df['全国人口'] - df['全国人口'].mean()) / df['全国人口'].std()
series = torch.tensor(z.values, dtype=torch.float32)
x = series[:-1].view(-1, 1, 1)   # 入力: 各年(系列長 1 のトークン)
y = series[1:].view(-1, 1)       # 目標: 翌年の人口(正規化値)

class TinyTransformer(nn.Module):
    def __init__(self, d_model=16, nhead=2, nlayers=2):
        super().__init__()
        self.emb  = nn.Linear(1, d_model)
        layer     = nn.TransformerEncoderLayer(d_model, nhead)
        self.enc  = nn.TransformerEncoder(layer, nlayers)
        self.head = nn.Linear(d_model, 1)

    def forward(self, x):
        h = self.enc(self.emb(x))
        return self.head(h.squeeze(1))

model = TinyTransformer()
print(model)
opt = torch.optim.Adam(model.parameters(), lr=1e-3)
for epoch in range(100):
    opt.zero_grad()
    loss = nn.functional.mse_loss(model(x), y)
    loss.backward()
    opt.step()
print(f"Epoch 100: MSE = {loss.item():.4f}")

📤 実行例:

TinyTransformer( (emb): Linear(in_features=1, out_features=16) (enc): TransformerEncoder( (layers): ModuleList( (0-1): TransformerEncoderLayer(d_model=16, nhead=2, ...) ) ) (head): Linear(in_features=16, out_features=1) ) Epoch 100: MSE = 0.0218

💬 結果の読み方: 47 点しかないデータでは Transformer は明らかに過剰。 同じデータで線形回帰の R^2 が 0.95 以上、 ARIMA でも遜色ない結果が出る。 DL は「データが万単位以上ある」「特徴量設計が難しい」「画像・テキスト・音声」の場合に真価を発揮する。 SSDSE のような表形式・小データでは木のアンサンブル(GBDT)が強い。

📜 深層学習の歴史 (1958-2025)

出来事意義
1958Perceptron (Rosenblatt)NN の原型
1986Backpropagation 再発見多層学習が可能に
2012AlexNet (ImageNet 優勝)GPU + CNN ブーム開幕
2017Transformer (Attention Is All You Need)NLP の主役交代
2020GPT-3LLM 時代到来
2022ChatGPT / Stable Diffusion一般ユーザーに普及
2024-25マルチモーダル基盤モデル画像・音声・テキスト統合

⚠️ 落とし穴

「深層学習」を扱う際の手法選択は、 状況に応じて以下のフローで判断すると迷いが減る。

  1. Step 1: 目的は記述か予測か?
    • 記述 (現状把握・要約) → 集計・可視化・要約統計量で全体像を掴む
    • 予測 (未知データへの推定) → モデル構築・検証フェーズへ移行
  2. Step 2: データの種類・規模は?
    • 数値データ・小〜中規模 → 「深層学習」やその拡張手法を直接適用
    • カテゴリデータ → カテゴリカル変数を Embedding 層で扱う — One-hot より低次元で意味を保持
    • 大規模・高次元 → CNNTransformer など特化アーキテクチャ — 大規模データには分散学習も検討
  3. Step 3: 結果の解釈・共有は?
    • 専門家向け → 数値指標・統計検定で精緻に評価
    • 非専門家向け → 可視化・自然言語での要約を重視

このフローに沿って判断することで、 「深層学習」を中核とした適切な手法選択ができる。