深層学習の設計と最適化には数学が不可欠であり、その理解がモデルの性能を左右する。本稿では、データの構造を解析するための線形代数、変化率を計算する微積分、不確実性を扱う統計学、そしてモデルを訓練する最適化アルゴリズムの実用的な側面を解説する。
線形代数の実践的応用 データの次元を効率的に処理するため、行列演算は必須のツールである。例えば、画像データを圧縮する際、特異値分解(SVD)を用いて主要な特徴を抽出する手法が用いられる。以下は、画像データを2次元に圧縮する例である。
import numpy as np
# 元の高次元データ(300×500の画像を例に)
raw_data = np.random.rand(300, 500)
# 特異値分解による次元削減
U, S, Vt = np.linalg.svd(raw_data, full_matrices=False)
reduced_data = U @ np.diag(S[:100]) # 100次元に圧縮
print(f"圧縮後次元: {reduced_data.shape}")
この処理により、元データの95%の情報を保持しつつ、計算コストを大幅に削減できる。特異値の大小を比較することで、どの次元が重要かを定量的に判断できる。
微分の最適化への応用 損失関数の最小化には勾配の計算が不可欠である。以下は、3次関数の最小値を求める勾配降下法の実装例。
def cubic_function(x):
return x**3 - 3*x
def cubic_gradient(x):
return 3*x**2 - 3
def adaptive_gradient_descent(start, lr=0.1, steps=50):
x = start
for _ in range(steps):
grad = cubic_gradient(x)
x -= lr * grad
lr *= 0.95 # 学習率の動的調整
return x
min_point = adaptive_gradient_descent(2.0)
print(f"最小値位置: {min_point:.4f}")
勾配の符号を確認し、学習率を段階的に減衰させることで、収束速度を向上させる手法が実装されている。この技術は、複雑な損失曲面の最適化に応用される。
確率分布の実用例 分類問題では、確率分布を用いた不確実性の評価が重要である。以下は、二項分布を用いた予測確率の計算例。
from scipy.stats import binom
# 10回の試行で成功確率0.6の二項分布
n, p = 10, 0.6
prob = binom.pmf(7, n, p) # 7回成功する確率
print(f"7回成功確率: {prob:.4f}")
この計算結果を基に、モデルの信頼性を定量的に評価し、予測結果の信頼区間を算出できる。例えば、医療診断では、確率値を基に治療方針を決定する際の根拠として利用される。
最適化アルゴリズムの比較 異なる最適化手法の性能を比較する際、AdamとSGDの違いを実データで検証する。
import torch
import torch.optim as optim
model = torch.nn.Sequential(
torch.nn.Linear(784, 256),
torch.nn.ReLU(),
torch.nn.Linear(256, 10)
)
# AdamとSGDの比較
adam_opt = optim.Adam(model.parameters(), lr=0.001)
sgd_opt = optim.SGD(model.parameters(), lr=0.01)
# トレーニングループ(簡略化)
for _ in range(10):
adam_opt.step()
sgd_opt.step()
Adamはパラメータごとに学習率を自動調整するため、初期の収束が速く、特に高次元データでの性能が優れる。一方、SGDは単純なアルゴリズムであり、メモリ効率が良いが、適切な学習率の設定が求められる。