第23章: 深層学習とtorch

Tidyverseエコシステムによる次世代ニューラルネットワーク

🧠 深層学習 🔥 Torchフレームワーク 🎯 GPU加速

🔥 torch for Rの革新的深層学習

torch for Rは、PyTorchのR移植版として、動的計算グラフと自動微分を提供する最先端の深層学習フレームワークです。tidymodelsエコシステムとの美しい統合により、R nativeな深層学習ワークフローを実現します。

🧠 深層学習の理論的基盤と計算フロー

🧠 ニューラルネットワーク・アーキテクチャの構造
入力層 (Input) X₁ X₂ X₃ X₄ 特徴量データ (4次元ベクトル) 隠れ層1 (Hidden1) H₁₁ H₁₂ H₁₃ H₁₄ H₁₅ H₁₆ ReLU活性化 f(x) = max(0,x) 隠れ層2 (Hidden2) H₂₁ H₂₂ H₂₃ H₂₄ Dropout(0.3) 過学習防止 出力層 (Output) Y₁ Y₂ Softmax 確率分布 W₁ (4×6行列) W₂ (6×4行列) W₃ (4×2行列) 🔢 順伝播の数式表現 入力層: x = [x₁, x₂, x₃, x₄]ᵀ 隠れ層1: h₁ = ReLU(W₁ᵀx + b₁) 隠れ層2: h₂ = ReLU(W₂ᵀh₁ + b₂) 出力層: ŷ = Softmax(W₃ᵀh₂ + b₃) 損失関数: L = -Σᵢ yᵢ log(ŷᵢ) (交差エントロピー) 逆伝播 (Backpropagation): ∂L/∂W₃ = h₂ ⊗ δ₃ ∂L/∂W₂ = h₁ ⊗ δ₂ ∂L/∂W₁ = x ⊗ δ₁ 勾配降下法: W ← W - η(∂L/∂W) η: 学習率 📊 モデル性能 Training Accuracy: 94.2% Validation Accuracy: 91.8% Loss: 0.0847 Epochs: 150 Training Time: 2.3 min Parameters: 4×6 + 6×4 + 4×2 = 56 params GPU Utilization: 70% Memory Usage: 1.2GB
Neural Network Computational Graph & Automatic Differentiation 📈 Forward Pass (順伝播) x₁ x₂ x₃ Input h₁ h₂ h₃ h₄ Hidden 1 h₅ h₆ h₇ Hidden 2 ŷ ŷ₂ Output 📐 Mathematical Operations 1. Linear Transformation: z = Wx + b W: weight matrix, b: bias vector 2. Activation Function: a = σ(z) = ReLU(z) = max(0, z) Non-linearity introduction 3. Loss Calculation: L = ½(y - ŷ)² (MSE) 4. Regularization: L_total = L + λ||W||² 📉 Backward Pass (逆伝播) - Automatic Differentiation ∂L Loss Gradient ∂L/∂ŷ ∂L/∂ŷ₂ ∂L/∂h₅ ∂L/∂h₆ ∂L/∂h₇ ∂L/∂h₁ ∂L/∂h₂ ⛓️ Chain Rule Application ∂L/∂W₁ = ∂L/∂z₂ × ∂z₂/∂a₁ × ∂a₁/∂z₁ × ∂z₁/∂W₁ ∂L/∂z₂: Output layer gradient ∂z₂/∂a₁: Weight contribution ∂a₁/∂z₁: Activation derivative (ReLU → 0 or 1) ∂z₁/∂W₁: Input scaling factor 💡 Automatic Differentiation: • Forward mode: 順方向計算と同時に微分 • Reverse mode: 逆方向で効率的勾配計算 • Computational graph: 動的構築・最適化 ⚡ Optimization Process (最適化プロセス) Global Minimum Start -α∇L Loss Landscape 🚀 Optimizer Algorithms SGD (Stochastic Gradient Descent) θ_{t+1} = θ_t - α∇L(θ_t) • Simple but effective • Learning rate sensitive Adam (Adaptive Moment Estimation) m_t = β₁m_{t-1} + (1-β₁)∇L v_t = β₂v_{t-1} + (1-β₂)(∇L)² • Adaptive learning rates • Default choice for deep learning RMSprop v_t = γv_{t-1} + (1-γ)(∇L)² θ_{t+1} = θ_t - α/√(v_t + ε) × ∇L • Addresses vanishing gradients • Good for RNNs 📈 Learning Rate Scheduling: Cosine Annealing, Step Decay, Exponential Decay Dynamic adjustment for better convergence 🛡️ Regularization Techniques (正則化手法) Dropout 50% neurons dropped Batch Normalization x̂ = (x - μ) / σ μ: batch mean σ: batch std Weight Decay (L2) L = L_original + λ||W||² λ: regularization strength Prevents large weights Early Stopping Monitor validation loss Stop when overfitting Patience mechanism
📈 Forward Pass

入力データから予測値まで順次計算。線形変換→活性化関数→次層への伝播

📉 Backward Pass

損失関数から各パラメータへの勾配を連鎖律で効率的に計算

⚡ Optimization

勾配情報を用いてパラメータを更新。Adam、SGD等の最適化アルゴリズム

🛡️ Regularization

過学習防止技術。Dropout、BatchNorm、Weight Decay等

🔧 torchエコシステム

torch_ecosystem.R
# torch エコシステムの読み込み library(tidymodels) library(torch) # コア深層学習 library(luz) # 高レベル訓練API library(torchvision) # コンピュータビジョン library(tabnet) # 表形式データ専用 # GPU利用可能性の確認 if (cuda_is_available()) { device <- torch_device("cuda") cat("🚀 GPU (CUDA) が利用可能です\\n") } else { device <- torch_device("cpu") cat("💻 CPU を使用します\\n") } # 基本的なテンソル操作 x <- torch_randn(3, 4, device = device) y <- torch_ones(3, 4, device = device) # 自動微分の有効化 x$requires_grad_(TRUE) z <- (x * y)$sum() z$backward() print("勾配:") print(x$grad)

🔥 torch

PyTorchのR移植版。動的計算グラフと自動微分エンジンを提供。GPU加速対応でRネイティブな実装を実現。

torch_tensor(), torch_randn(), autograd system

⚡ luz

Keras/fastai風のハイレベルAPI。訓練ループの自動化、コールバック機能、美しい進捗表示を提供。複雑な訓練プロセスを簡素化。

setup(), fit(), predict(), callbacks

📷 torchvision

コンピュータビジョン専用パッケージ。事前訓練済みモデル、画像変換、データ拡張機能を統合。CNNの実装を大幅に効率化。

model_resnet18(), transform_*, dataset_*

📊 tabnet

表形式データ専用の深層学習アーキテクチャ。解釈可能なアテンション機構により、従来のMLと深層学習の利点を統合。

tabnet(), tabnet_explain(), attention masks
🔄 深層学習ワークフロー
1
データ準備
テンソル変換・前処理
2
モデル定義
nn_module・アーキテクチャ
3
訓練設定
loss・optimizer・metrics
4
モデル訓練
luz fit・callbacks
5
評価・診断
性能評価・可視化
6
推論・解釈
予測・Grad-CAM

🧠 ニューラルネットワーク アーキテクチャ

torchでは、nn_moduleを継承してカスタムニューラルネットワークを定義できます。feedforward、CNN、RNNなど様々なアーキテクチャを統一された方法で実装し、luzで効率的に訓練できます。

📊 フィードフォワードネットワーク

feedforward_network.R
# カスタムニューラルネットワークの定義 deep_network <- nn_module( "DeepNetwork", initialize = function(input_size, hidden_sizes, output_size, dropout = 0.2) { self$layers <- nn_module_list() # 入力層 self$layers$append(nn_linear(input_size, hidden_sizes[1])) # 隠れ層の動的生成 for (i in seq_along(hidden_sizes[-1])) { self$layers$append( nn_sequential( nn_batch_norm1d(hidden_sizes[i]), nn_relu(), nn_dropout(dropout), nn_linear(hidden_sizes[i], hidden_sizes[i + 1]) ) ) } # 出力層 self$output_layer <- nn_linear(tail(hidden_sizes, 1), output_size) }, forward = function(x) { # 全層を順次適用 for (layer in self$layers) { x <- layer(x) } return(self$output_layer(x)) } ) # luzによる訓練設定 model <- deep_network %>% setup( loss = nn_mse_loss(), optimizer = optim_adam, metrics = list(luz_metric_mae(), luz_metric_rmse()) ) %>% set_hparams( input_size = 10, hidden_sizes = c(256, 128, 64), output_size = 1, dropout = 0.3 ) %>% set_opt_hparams(lr = 0.001, weight_decay = 1e-5)

🏗️ nn_module

torchのモデル定義の基底クラス。initialize()で層を定義し、forward()で計算グラフを記述。動的で柔軟なアーキテクチャ構築が可能。

nn_module("ModelName", initialize, forward)

📊 nn_sequential

層を順次実行するコンテナ。シンプルなパイプライン構築に最適。バッチ正規化、活性化、ドロップアウトの組み合わせが簡潔。

nn_sequential(layer1, layer2, ...)

⚡ luz setup

モデルの訓練設定を統合。損失関数、オプティマイザー、評価指標を一括設定。Keras風のシンプルなAPIで複雑な訓練を簡素化。

setup(loss, optimizer, metrics)

🎛️ callbacks

訓練プロセスのカスタマイズ。早期停止、学習率スケジューリング、チェックポイント保存など。柔軟な訓練制御を実現。

luz_callback_early_stopping(), luz_callback_lr_scheduler()

📷 コンピュータビジョンとCNN

torchvisionパッケージにより、畳み込みニューラルネットワーク(CNN)の実装が大幅に簡素化されます。事前訓練済みモデルを活用した転移学習により、少ないデータで高精度な画像分類を実現できます。

🏗️ CNN アーキテクチャの理論と実装

📸 畳み込みニューラルネットワーク (CNN) の動作原理
入力画像 32×32×3 RGB画像 高: 32px 幅: 32px チャンネル: 3 Conv2D (1) 28×28×32 32フィルタ 5×5 kernel ReLU Stride: 1 Padding: 0 MaxPool2D 14×14×32 1/2サイズ 2×2 pool Stride: 2 Conv2D (2) 10×10×64 64フィルタ 5×5 kernel Stride: 1 Padding: 0 MaxPool2D 5×5×64 1/2サイズ Stride: 2 Flatten 1600 5×5×64=1600 Dense Layer 120 units ReLU Dropout(0.5) Output 10 classes Softmax 🔍 畳み込み演算の仕組み Input 1 2 1 0 1 2 1 0 1 5×5 feature Kernel 1 0 -1 1 0 -1 3×3 filter * Output 2 1 0 1 3 2 3×3 result 計算例: 2 = (1×1)+(2×0)+(1×-1)+ (0×1)+(1×0)+(2×-1)+ (1×1)+(0×0)+(1×-1) = 1+0-1+0+0-2+1+0-1 = -2 → ReLU(0) 🎯 CNN特徴量学習の階層構造 Layer 1 エッジ検出 水平線、垂直線 斜線、曲線 Layer 2 形状・パターン 角、円、テクスチャ より複雑な形状 Layer 3+ オブジェクト 顔、車、動物 高レベル特徴 💡 学習の特徴: • 階層的特徴量学習 - 単純→複雑 • 平行移動不変性 - 位置に関係なく検出 • パラメータ共有 - 効率的な学習 📊 CNN性能指標 Accuracy: 97.8% Loss: 0.032 Parameters: 1.2M Training Time: 45 min (GPU) Memory Usage: 3.8GB FLOPs: 2.1G
Convolutional Neural Network Architecture & Feature Learning Input Image R G B 224×224×3 Conv2D + ReLU Kernel: 3×3 Filters: 64 112×112×64 MaxPool 2×2 pool stride=2 56×56×64 Conv2D Block 28×28×128 Global Pool 1×1×128 Classifier Classes: 1000 🧮 CNN Mathematical Operations 1. Convolution Operation (f * g)(x,y) = ΣΣ f(i,j) × g(x-i, y-j) • Kernel slides across input • Element-wise multiplication & sum • Feature detection (edges, textures) • Parameters: kernel_size, stride, padding Input * Kernel = Output 2. Pooling Operation MaxPool: max(region), AvgPool: mean(region) • Downsampling for translation invariance • Reduces spatial dimensions • Computational efficiency • Common: 2×2 with stride 2 3. Receptive Field Growth RF_l = RF_{l-1} + (kernel_size - 1) × stride_product • Early layers: local features (edges) • Deep layers: global features (objects) 4. Parameter Count Conv: (K×K×C_in + 1) × C_out • K: kernel size, C: channels • +1 for bias term 🎯 Hierarchical Feature Learning Layer 1-2: Low-level Features Vertical Edge Horizontal Edge Circular Edge Layer 3-4: Mid-level Features Curves & Shapes Corners Layer 5+: High-level Features Face Parts Objects Increasing Abstraction & Semantic Content Local Features Part-based Features Object-level Features
🔍 Convolution

局所的特徴抽出。カーネルによる畳み込み演算で エッジ・テクスチャ等を検出

📉 Pooling

空間次元削減と平行移動不変性。計算効率向上と過学習抑制

🏗️ Hierarchy

階層的特徴学習。低次→高次の抽象化で複雑なパターン認識

🎯 Receptive Field

受容野の拡大。深い層ほど広域の情報を統合して判断

🔄 転移学習による画像分類

transfer_learning.R
# 事前訓練済みResNet18の読み込み pretrained_model <- model_resnet18(pretrained = TRUE) # 転移学習モデルの定義 transfer_classifier <- nn_module( "TransferClassifier", initialize = function(num_classes, freeze_backbone = TRUE) { self$backbone <- pretrained_model # バックボーンの重みを固定 if (freeze_backbone) { for (param in self$backbone$parameters) { param$requires_grad_(FALSE) } } # カスタム分類ヘッド feature_size <- self$backbone$fc$in_features self$backbone$fc <- nn_identity() self$classifier <- nn_sequential( nn_dropout(0.5), nn_linear(feature_size, 256), nn_relu(), nn_dropout(0.3), nn_linear(256, num_classes) ) }, forward = function(x) { features <- self$backbone(x) return(self$classifier(features)) } ) # データ拡張の定義 train_transforms <- function(img) { img %>% transform_to_tensor() %>% transform_random_horizontal_flip(p = 0.5) %>% transform_random_crop(size = c(224, 224), padding = 4) %>% transform_normalize(mean = c(0.485, 0.456, 0.406), std = c(0.229, 0.224, 0.225)) }

🏗️ 事前訓練モデル

ImageNetで訓練済みのResNet、VGG、EfficientNetなど。豊富な特徴量表現を活用し、少ないデータで高精度な分類を実現。

model_resnet18(), model_vgg16(), model_efficientnet_b0()

🔄 転移学習戦略

バックボーン固定→分類層訓練→全体ファインチューニングの段階的アプローチ。効率的な学習と過学習防止を両立。

requires_grad_(FALSE), freeze/unfreeze layers

🎨 データ拡張

画像の回転、反転、クロップなどによるデータ増強。過学習を防ぎ、モデルの汎化性能を向上。torchvisionの豊富な変換関数を活用。

transform_random_horizontal_flip(), transform_random_crop()

👁️ Grad-CAM

CNNの判断根拠を視覚化。勾配情報を利用して、モデルが注目している画像領域をヒートマップで表示。解釈可能性を向上。

register_forward_hook(), register_backward_hook()

第23章の重要ポイント

実践的アドバイス

torch for Rは、Pythonに依存しないR nativeな深層学習を実現する画期的なフレームワークです。luzパッケージにより、複雑な訓練ループが自動化され、美しい進捗表示とコールバック機能を享受できます。tidymodelsとの統合により、従来の機械学習と深層学習を統一されたワークフローで扱えることが最大の利点です。GPU加速と豊富な事前訓練モデルにより、実用的な深層学習アプリケーションの開発が大幅に効率化されます。