本ページでは、 深層学習の代表的アーキテクチャを統合的に解説します。 CNN・RNN/LSTM/GRU・Attention・Transformer・ResNet・U-Net・BERT/GPT を一気通貫で扱います。
2012 年の AlexNet 以降、 画像・音声・言語・系列データで深層学習が圧倒的な性能を出すようになりました。 各アーキテクチャが「どんなデータの性質を活かす」設計なのかを理解することが本質です。
論文記事から各用語のリンクをクリックすると、 該当箇所が開きます:
万能近似定理は「十分な幅の MLP は任意の関数を近似できる」と言うが、 実用にはデータの構造に合った帰納バイアスが必要:
入力画像 $X$ にカーネル $K$ をスライドさせながら積和:
$$Y_{i,j} = \sum_{m,n} X_{i+m, j+n} K_{m,n} + b$$
1 カーネルが 1 つの特徴を検出(エッジ・テクスチャ等)。 多数のカーネルで多数の特徴マップを出力。
1 2 3 4 5 6 7 8 9 10 11 12 13 | import torch.nn as nn class SimpleCNN(nn.Module): def __init__(self, num_classes=10): super().__init__() self.features = nn.Sequential( nn.Conv2d(3, 32, 3, padding=1), nn.ReLU(), nn.MaxPool2d(2), nn.Conv2d(32, 64, 3, padding=1), nn.ReLU(), nn.MaxPool2d(2), nn.Conv2d(64, 128, 3, padding=1), nn.ReLU(), nn.AdaptiveAvgPool2d(1), ) self.classifier = nn.Linear(128, num_classes) def forward(self, x): x = self.features(x).flatten(1) return self.classifier(x) |
$$\mathbf{y} = F(\mathbf{x}) + \mathbf{x}$$
「恒等関数を足す」だけで深い NN の勾配消失を劇的に緩和。 深層学習史上最重要発明の 1 つ。
セグメンテーション(ピクセル単位分類)の標準。 Encoder で圧縮→Decoder で復元、 同階層をスキップ接続。 医療画像・衛星画像で活躍。
$$\mathbf{h}_t = \tanh(W_h \mathbf{h}_{t-1} + W_x \mathbf{x}_t + \mathbf{b})$$
隠れ状態 $\mathbf{h}_t$ が「記憶」を持ち越す。 ただし長期依存で勾配消失/爆発が起きやすい。
3 つのゲート(入力・忘却・出力)+ セル状態 $C_t$ で長期記憶を制御:
$$f_t = \sigma(W_f \cdot [\mathbf{h}_{t-1}, \mathbf{x}_t] + \mathbf{b}_f)$$
$$C_t = f_t \odot C_{t-1} + i_t \odot \tilde{C}_t$$
$\odot$ は要素積。 ゲートが「何を忘れ・記憶し・出力するか」を学習。
LSTM 簡略版。 更新ゲート・リセットゲートの 2 つ。 パラメータが少なくほぼ同等の性能。
1 2 3 4 5 6 7 8 9 | import torch.nn as nn class LSTMModel(nn.Module): def __init__(self, input_size, hidden_size, num_layers, num_classes): super().__init__() self.lstm = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True) self.fc = nn.Linear(hidden_size, num_classes) def forward(self, x): out, _ = self.lstm(x) return self.fc(out[:, -1, :]) |
前向き + 後向きの 2 つの RNN を連結。 全系列を見て予測(過去・未来両方)。
系列の各位置に重みを付け、 重要な部分に「注目」する。 元は機械翻訳(Bahdanau 2014)。
Query・Key・Value を入力から計算し、 各位置と全位置の関係を学習:
$$\mathrm{Attention}(Q, K, V) = \mathrm{softmax}\left(\frac{QK^\top}{\sqrt{d_k}}\right) V$$
記号読み:$Q, K, V$ は「キュー・ケイ・ブイ」、 すべて入力の線形変換。 $d_k$ で割るのは softmax の勾配安定化。
複数の Attention を並列に実行、 異なる関係性を捉える。 通常 8〜16 ヘッド。
系列長 $n$ で $O(n^2 d)$。 長系列で重い → FlashAttention・Sparse Attention・Linear Attention 等の高速化。
RNN を捨て Self-Attention のみで構築。 並列学習可能で大規模化が容易。
1 2 3 4 5 6 7 8 | import torch import torch.nn as nn # PyTorch 標準の Transformer model = nn.Transformer(d_model=512, nhead=8, num_encoder_layers=6, num_decoder_layers=6) # Encoder のみ(BERT 系) encoder_layer = nn.TransformerEncoderLayer(d_model=512, nhead=8, batch_first=True) encoder = nn.TransformerEncoder(encoder_layer, num_layers=6) |
Transformer Encoder のみ。 双方向 Masked Language Model + Next Sentence Prediction で事前学習。 分類・抽出系タスクに強い。
Transformer Decoder のみ。 次の単語予測で自己回帰的に生成。 GPT-3(2020)以降、 大規模化で zero-shot/few-shot 能力が出現。
画像を 16×16 パッチに分割し、 トークン列として Transformer に投入。 大規模事前学習で CNN を上回るケース増加。
カテゴリ・単語等の離散シンボルを密ベクトルに変換。 NN の入り口の標準技。
大規模データで事前学習したモデルを、 自分の問題に流用。 少データで高精度が出る現代深層学習の主流。
1 2 3 4 | from transformers import AutoModelForSequenceClassification, AutoTokenizer, Trainer model = AutoModelForSequenceClassification.from_pretrained('bert-base-japanese-v3', num_labels=2) tokenizer = AutoTokenizer.from_pretrained('bert-base-japanese-v3') # Trainer で fine-tuning(HuggingFace 標準パターン) |
ノードと辺で構造化されたデータ(SNS、 分子、 知識グラフ)向け。
| アーキ | 得意なデータ | 帰納バイアス | 特徴 |
|---|---|---|---|
| MLP | 表データ | なし | 汎用 |
| CNN | 画像・音声 | 局所性・並進不変 | パラメータ少 |
| RNN/LSTM | 系列 | 時間依存 | 逐次計算 |
| Transformer | 系列・画像・全般 | Attention | 並列・大規模 |
| GNN | グラフ | 近傍集約 | 関係構造 |
| U-Net | 画像セグメント | Encoder-Decoder + skip | 医療画像 |
| 落とし穴 | 対処 |
|---|---|
| テーブルに巨大 NN | n < 10万なら GBDT が強い。 NN は構造化されたデータ向け。 |
| 乱数依存 | 複数 seed で平均、 不確実性を報告。 |
| 過学習 | Dropout・Weight Decay・Data Aug・Early Stopping。 |
| 勾配消失/爆発 | 残差接続・LayerNorm・勾配クリッピング・He初期化。 |
| Transformer の長系列 | FlashAttention・スライディングウィンドウ・サブ二乗化。 |
| 事前学習モデルの fine-tune 失敗 | 学習率を小さく(1e-5 等)、 warmup、 LoRA を検討。 |
| model.eval() 忘れ | 推論時は必ず。 Dropout/BN の挙動が変わる。 |
注意:深層学習はテーブルデータの SSDSE-B 47 行では本領発揮しません。 公開画像・テキストデータセットを併用してください。
1 2 3 4 5 6 7 | import torch import torchvision from torchvision import transforms trans = transforms.Compose([transforms.ToTensor()]) train = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=trans) test = torchvision.datasets.CIFAR10(root='./data', train=False, download=True, transform=trans) # 学習ループは前述の SimpleCNN を参考 |
1 2 3 4 | from transformers import AutoTokenizer, AutoModelForSequenceClassification, Trainer tokenizer = AutoTokenizer.from_pretrained('cl-tohoku/bert-base-japanese-v3') model = AutoModelForSequenceClassification.from_pretrained('cl-tohoku/bert-base-japanese-v3', num_labels=2) # Trainer で fine-tune |
BERT/GPT 系の attention weights を可視化するライブラリ:bertviz, captum。 入力トークンと attention 行列のヒートマップで「どこに注目しているか」を観察。
「Transformer を使って良い結果が出ました。」
「日本語感情分類タスク(n_train=8,000、 n_test=2,000、 2クラス)で、 ベースライン LightGBM (TF-IDF) Macro-F1 = 0.78 に対し、 bert-base-japanese-v3 を batch_size=16, lr=2e-5, 3epoch で fine-tune した結果 0.91 を達成。 GPU は V100、 学習時間 12 分。 アテンション可視化で『否定語』周辺に強い注目が確認された。 過学習対策として early stopping (patience=2) を使用。」
| 用途 | パッケージ |
|---|---|
| 基本フレームワーク | torch, jax, tensorflow |
| 高レベルAPI | pytorch-lightning, keras, flax |
| 事前学習モデル | transformers (HuggingFace), timm |
| CNN特化 | torchvision.models, timm |
| セグメンテーション | segmentation_models_pytorch |
| 物体検出 | ultralytics (YOLO), detectron2, mmdetection |
| NLP前処理 | tokenizers, sentencepiece, fugashi (日本語) |
| PEFT・LoRA | peft, lit-gpt |
| 分散学習 | deepspeed, accelerate, fsdp |
| 実験管理 | wandb, mlflow, tensorboard |
| GNN | torch-geometric, dgl |
| 時系列DL | darts, neuralforecast, pytorch-forecasting |
model.eval() を呼んだか?事前学習モデルのデファクト標準。 数万のモデルが公開されている。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | from transformers import pipeline # 感情分析 clf = pipeline('sentiment-analysis', model='cl-tohoku/bert-base-japanese-v3') print(clf('この商品は素晴らしいです')) # テキスト生成 gen = pipeline('text-generation', model='rinna/japanese-gpt-neox-3.6b') print(gen('日本の首都は')) # ゼロショット分類 zsc = pipeline('zero-shot-classification', model='facebook/bart-large-mnli') print(zsc('I love this movie', candidate_labels=['positive','negative'])) # 画像分類 img = pipeline('image-classification', model='google/vit-base-patch16-224') |
A. 大規模事前学習があれば ViT が勝つことが多いですが、 中小規模では CNN が依然強力。 ConvNeXt 等の現代 CNN は ViT と互角。
A. 短系列・低リソースなら現役。 長系列・大規模なら Transformer が標準。 最近は Mamba(SSM)が中間域で注目。
A. GPT-3 級は数千〜数億ドル。 現実的には公開モデルを fine-tune が標準。 ドメイン特化なら継続事前学習(Domain-Adaptive Pretraining)。
A. 一般に大きいほど性能向上(scaling law)だが、 推論コスト・遅延・環境負荷とのトレードオフ。 蒸留・量子化で運用効率化。
Kaplan ら 2020 / Hoffmann ら 2022(Chinchilla)。 モデル損失 $L$ はパラメータ数 $N$・データ量 $D$・計算量 $C$ の冪乗則に従う:
$$L(N, D) \approx L_\infty + \frac{A}{N^\alpha} + \frac{B}{D^\beta}$$
Chinchilla 則:与えられた計算量に対し、 $N \propto D$ で釣り合わせるのが最適。 つまり「データ不足の大モデル」より「データ豊富な小〜中モデル」のほうが効率良い。
| 分野 | ベンチマーク |
|---|---|
| 画像分類 | ImageNet, CIFAR-10/100 |
| 物体検出 | COCO, Pascal VOC |
| セグメンテーション | Cityscapes, ADE20K |
| NLP 理解 | GLUE, SuperGLUE, JGLUE |
| 機械翻訳 | WMT, FLORES |
| LLM 総合 | MMLU, BIG-Bench, HELM |
| コード生成 | HumanEval, MBPP |
| 音声認識 | LibriSpeech, CSJ |
Transformer の長系列計算量 $O(n^2)$ を線形 $O(n)$ にする試み。 2023 年以降の有力候補。
テーブルデータには不要だが、 長系列処理の最前線として知っておく価値あり。
画像・テキスト・音声・動画など複数モダリティを統一的に扱う。
深層学習アーキテクチャに関する概念のチップ集。
SSDSE-B-2026 は表形式のため CNN/RNN の本領ではないが、 MLP(多層パーセプトロン)の学習練習に使えます。
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 | import pandas as pd import torch import torch.nn as nn from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', header=1) num = df.select_dtypes('number').dropna() X = StandardScaler().fit_transform(num.iloc[:, 1:6].values) y = num.iloc[:, 0].values.astype('float32') X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.2, random_state=42) X_tr_t = torch.tensor(X_tr, dtype=torch.float32) y_tr_t = torch.tensor(y_tr).unsqueeze(1) class MLP(nn.Module): def __init__(self, d_in): super().__init__() self.net = nn.Sequential( nn.Linear(d_in, 32), nn.ReLU(), nn.Dropout(0.2), nn.Linear(32, 16), nn.ReLU(), nn.Linear(16, 1)) def forward(self, x): return self.net(x) model = MLP(X.shape[1]) opt = torch.optim.AdamW(model.parameters(), lr=1e-2, weight_decay=1e-4) loss_fn = nn.MSELoss() for ep in range(200): opt.zero_grad() pred = model(X_tr_t) loss = loss_fn(pred, y_tr_t) loss.backward(); opt.step() print('最終 loss:', loss.item()) |
1 2 3 4 5 6 7 8 9 10 11 12 13 | import pandas as pd from sklearn.neural_network import MLPRegressor from sklearn.preprocessing import StandardScaler from sklearn.model_selection import cross_val_score df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', header=1) num = df.select_dtypes('number').dropna() X = StandardScaler().fit_transform(num.iloc[:, 1:6].values) y = num.iloc[:, 0].values mlp = MLPRegressor(hidden_layer_sizes=(32, 16), max_iter=500, alpha=1e-4, random_state=0) print('CV R²:', cross_val_score(mlp, X, y, cv=5, scoring='r2').mean()) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | import torch import torch.nn as nn from torch.utils.data import DataLoader, TensorDataset class Net(nn.Module): def __init__(self, d_in): super().__init__() self.fc = nn.Sequential(nn.Linear(d_in, 64), nn.ReLU(), nn.Linear(64, 1)) def forward(self, x): return self.fc(x) # X, y は事前に標準化済み torch tensor net = Net(5) opt = torch.optim.AdamW(net.parameters(), lr=1e-3) loss_fn = nn.MSELoss() # ループ例 for epoch in range(100): opt.zero_grad() # pred = net(X); loss = loss_fn(pred, y); loss.backward(); opt.step() |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | import pytorch_lightning as pl import torch import torch.nn as nn class LitMLP(pl.LightningModule): def __init__(self, d_in): super().__init__() self.net = nn.Sequential(nn.Linear(d_in, 32), nn.ReLU(), nn.Linear(32, 1)) self.loss = nn.MSELoss() def training_step(self, batch, _): x, y = batch return self.loss(self.net(x), y) def configure_optimizers(self): return torch.optim.AdamW(self.parameters(), lr=1e-3) # trainer = pl.Trainer(max_epochs=50); trainer.fit(LitMLP(5), dataloader) |
1 2 3 4 5 6 7 8 9 10 | import tensorflow as tf model = tf.keras.Sequential([ tf.keras.layers.Dense(32, activation='relu', input_shape=(5,)), tf.keras.layers.Dropout(0.2), tf.keras.layers.Dense(16, activation='relu'), tf.keras.layers.Dense(1) ]) model.compile(optimizer=tf.keras.optimizers.AdamW(1e-3), loss='mse', metrics=['mae']) # model.fit(X, y, epochs=50, validation_split=0.2, batch_size=8) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | from sklearn.neural_network import MLPRegressor, MLPClassifier from sklearn.preprocessing import StandardScaler # 表形式の小〜中規模データ向け mlp = MLPRegressor( hidden_layer_sizes=(64, 32), activation='relu', solver='adam', learning_rate_init=1e-3, early_stopping=True, n_iter_no_change=10, max_iter=500, random_state=0 ) # mlp.fit(StandardScaler().fit_transform(X), y) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | from transformers import AutoModel, AutoTokenizer, AutoConfig import torch.nn as nn class TextClassifier(nn.Module): def __init__(self, model_name, n_classes): super().__init__() self.encoder = AutoModel.from_pretrained(model_name) hidden = self.encoder.config.hidden_size self.head = nn.Linear(hidden, n_classes) def forward(self, input_ids, attention_mask): out = self.encoder(input_ids=input_ids, attention_mask=attention_mask) cls = out.last_hidden_state[:, 0, :] return self.head(cls) # model = TextClassifier('cl-tohoku/bert-base-japanese-v3', n_classes=4) |
深層学習の応用領域は広く、 画像認識(CNN)、 自然言語(Transformer)、 強化学習、 生成 AI(拡散モデル)等が含まれる。 SSDSE-B-2026 のような 47 行 × 100 列の小規模表データには通常向かないが、 多年度を統合した時系列・パネル化や、 都道府県別の衛星画像等と組み合わせると深層学習の出番が出てくる。
直感で全体像を掴んだら、 次は厳密な定義を見ます。 数式は短いものでも、 「何を入力にして、 何を出力するのか」を意識して読むと早く慣れます。
上の数式に出てくる各記号が何を表すかを、 言葉で翻訳します。 1 つずつ自分の言葉で言い換えられるようになると、 論文や教科書のスピードが一気に上がります。
| 記号 | 意味(言葉での説明) |
|---|---|
| $Q, K, V$ | クエリ・キー・バリュー行列 |
| $d_k$ | キー次元(スケーリングで softmax を安定化) |
| softmax | 注意重みを総和 1 に正規化 |
| Multi-Head | 異なる視点を並列に学習 |
| Self-Attention | 系列内の全要素同士の関連性を計算 |
数式だけでは「分かった気になる」だけで終わりがち。 ここで SSDSE-B-2026(教育用標準データセット — 47 都道府県 × 100+ 指標、 2018-2023 年度)の実値を当てはめて、 深層学習(応用) の挙動を電卓的に追体験します。
SSDSE-B-2026 は 統計センターの SSDSE 配布ページ から CSV を直接ダウンロードできます。 本サイトでは data/raw/SSDSE-B-2026.csv に配置している前提でコードを書いています。
以下のコードは最小限の構成です。 pd.read_csv('data/raw/SSDSE-B-2026.csv') を直書きしているので、 同じ階層に CSV を置けばそのまま動きます。 変数化しないのは、 初学者が「パスをどこに書くべきか」で迷わないようにするためです。
# 深層学習(応用) を SSDSE-B-2026 で確かめる最小コード
import pandas as pd
import numpy as np
# 1) SSDSE-B-2026(教育用標準データセット)を読み込み
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=1)
print('shape:', df.shape) # (564, 112) — 47 都道府県 × 6 年度
print('cols head:', list(df.columns[:8]))
# 2) 直近年度(2023 年度)に絞る
df23 = df[df['年度'] == 2023].copy()
print('rows in 2023:', len(df23))
# 3) 深層学習(応用) を動かすために必要な列だけ取り出す
y = df23['合計特殊出生率'].astype(float)
x = df23['総人口'].astype(float)
print('y stats:', y.describe().round(3).to_dict())
print('x stats:', x.describe().round(0).to_dict())
# 4) 深層学習(応用) の本処理(このページの主題)
# — 具体実装は同カテゴリの個別ページにも掲載
print('---- 深層学習(応用) 結果 ----')
print('mean y:', y.mean().round(3), '/ std y:', y.std().round(3))
print('mean x:', x.mean().round(0), '/ std x:', x.std().round(0))
print('corr(x, y):', y.corr(x).round(3))うまく動かないときは ①data/raw/SSDSE-B-2026.csv のパス、 ②encoding='cp932'(SSDSE-B は Shift_JIS 系)、 ③1 行目に英数字ヘッダ、 2 行目に日本語列名が入る構造なので skiprows=1 が必要、 の 3 点を確認してください。
この用語を実務で使うときにつまずきやすい点を、 失敗パターン別に整理しました。 1 度経験すれば回避できるものばかりですが、 先に知っておくと事故が大幅に減ります。
深層学習(応用) と一緒に覚えておくと選択肢が広がる関連手法。 状況によって使い分けが必要なので、 それぞれの強みと弱みを 1 行で言えるようにしておきましょう。
表中の各手法は本サイト内に個別ページが用意されているものが多いです。 興味を持った概念は、 横展開的に読むと体系的な理解が早く進みます。