STEP 25:ハイパーパラメータチューニング

🎛️ STEP 25: ハイパーパラメータチューニング

最適なモデル設定を見つけて性能を最大化!

📋 このステップで学ぶこと

  • ハイパーパラメータとは何か?
  • 主要なハイパーパラメータの種類
  • Grid Search(グリッドサーチ)
  • Random Search(ランダムサーチ)
  • Keras Tunerの使い方
  • 実践的なチューニング戦略

🎛️ 1. ハイパーパラメータとは?

1-1. パラメータ vs ハイパーパラメータ

📊 パラメータとハイパーパラメータの違い

パラメータ(Parameters):
・モデルが学習中に自動で更新する値
・例:重み(weights)、バイアス(bias)
・データから学習される

ハイパーパラメータ(Hyperparameters):
・学習前に人間が設定する値
・例:学習率、層の数、ユニット数
・データからは学習されない

1-2. 主要なハイパーパラメータ

カテゴリ ハイパーパラメータ 典型的な範囲
学習 学習率(learning_rate) 1e-5 〜 1e-1
学習 バッチサイズ(batch_size) 16, 32, 64, 128, 256
学習 エポック数(epochs) 10 〜 1000(Early Stopping推奨)
構造 層の数 1 〜 10
構造 ユニット数(units) 32, 64, 128, 256, 512
正則化 ドロップアウト率(dropout) 0.1 〜 0.5
最適化 オプティマイザ Adam, SGD, RMSprop

🔍 2. Grid Search(グリッドサーチ)

2-1. Grid Searchとは?

Grid Searchは、指定した全ての組み合わせを網羅的に試す方法です。

【Grid Searchの例】 探索するハイパーパラメータ: ・学習率:[0.001, 0.01, 0.1] → 3通り ・バッチサイズ:[32, 64, 128] → 3通り ・ユニット数:[64, 128] → 2通り 全組み合わせ:3 × 3 × 2 = 18通り すべての組み合わせを試す: (0.001, 32, 64), (0.001, 32, 128), (0.001, 64, 64), … → 最も良い結果の組み合わせを選択

2-2. 手動実装

import itertools from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, Dropout from tensorflow.keras.datasets import mnist from tensorflow.keras.utils import to_categorical # データ準備 (X_train, y_train), (X_test, y_test) = mnist.load_data() X_train = X_train.reshape(-1, 784).astype(‘float32’) / 255.0 X_test = X_test.reshape(-1, 784).astype(‘float32’) / 255.0 y_train = to_categorical(y_train, 10) y_test = to_categorical(y_test, 10) # ハイパーパラメータの候補 param_grid = { ‘units’: [64, 128], ‘dropout’: [0.2, 0.3], ‘learning_rate’: [0.001, 0.01] } # 全組み合わせを生成 keys = param_grid.keys() combinations = list(itertools.product(*param_grid.values())) best_acc = 0 best_params = None for combo in combinations: params = dict(zip(keys, combo)) print(f”Testing: {params}”) # モデル構築 model = Sequential([ Dense(params[‘units’], activation=’relu’, input_shape=(784,)), Dropout(params[‘dropout’]), Dense(params[‘units’], activation=’relu’), Dropout(params[‘dropout’]), Dense(10, activation=’softmax’) ]) from tensorflow.keras.optimizers import Adam model.compile( optimizer=Adam(learning_rate=params[‘learning_rate’]), loss=’categorical_crossentropy’, metrics=[‘accuracy’] ) # 学習(少ないエポックで評価) model.fit(X_train, y_train, epochs=5, batch_size=64, validation_split=0.1, verbose=0) # 評価 _, acc = model.evaluate(X_test, y_test, verbose=0) print(f” Accuracy: {acc:.4f}”) if acc > best_acc: best_acc = acc best_params = params print(f”\nBest: {best_params}, Accuracy: {best_acc:.4f}”)
⚠️ Grid Searchの問題点
  • 組み合わせ爆発:パラメータが増えると指数関数的に増加
  • 計算コスト:全ての組み合わせを試すのは時間がかかる
  • 離散的な探索:グリッド間の最適値を見逃す可能性

🎲 3. Random Search(ランダムサーチ)

3-1. Random Searchとは?

Random Searchは、ハイパーパラメータの範囲からランダムにサンプリングする方法です。

✅ Random Searchの利点
  • 効率的:同じ試行回数でもGrid Searchより良い結果を見つけやすい
  • 連続値に対応:学習率などを連続的に探索できる
  • スケーラブル:試行回数を自由に設定できる

3-2. 実装例

import numpy as np from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, Dropout from tensorflow.keras.optimizers import Adam # ハイパーパラメータの範囲 param_distributions = { ‘units’: [32, 64, 128, 256], ‘dropout’: (0.1, 0.5), # 連続値 ‘learning_rate’: (1e-4, 1e-2), # 連続値(対数スケール) ‘batch_size’: [32, 64, 128] } n_trials = 10 best_acc = 0 best_params = None for trial in range(n_trials): # ランダムにパラメータを選択 params = { ‘units’: np.random.choice(param_distributions[‘units’]), ‘dropout’: np.random.uniform(*param_distributions[‘dropout’]), ‘learning_rate’: 10 ** np.random.uniform( np.log10(param_distributions[‘learning_rate’][0]), np.log10(param_distributions[‘learning_rate’][1]) ), ‘batch_size’: np.random.choice(param_distributions[‘batch_size’]) } print(f”Trial {trial+1}/{n_trials}: {params}”) # モデル構築・学習・評価 model = Sequential([ Dense(params[‘units’], activation=’relu’, input_shape=(784,)), Dropout(params[‘dropout’]), Dense(params[‘units’], activation=’relu’), Dropout(params[‘dropout’]), Dense(10, activation=’softmax’) ]) model.compile( optimizer=Adam(learning_rate=params[‘learning_rate’]), loss=’categorical_crossentropy’, metrics=[‘accuracy’] ) model.fit(X_train, y_train, epochs=5, batch_size=int(params[‘batch_size’]), validation_split=0.1, verbose=0) _, acc = model.evaluate(X_test, y_test, verbose=0) print(f” Accuracy: {acc:.4f}”) if acc > best_acc: best_acc = acc best_params = params print(f”\nBest: {best_params}”) print(f”Best Accuracy: {best_acc:.4f}”)

🔧 4. Keras Tuner

4-1. Keras Tunerとは?

Keras Tunerは、Kerasモデルのハイパーパラメータを自動で最適化するライブラリです。

# インストール(Google Colabで実行) !pip install keras-tuner -q

4-2. 基本的な使い方

import keras_tuner as kt from tensorflow import keras from tensorflow.keras import layers # ===== モデル構築関数 ===== def build_model(hp): “”” hp: HyperParametersオブジェクト ハイパーパラメータの範囲を指定 “”” model = keras.Sequential() # ユニット数を探索(32〜256、32刻み) units = hp.Int(‘units’, min_value=32, max_value=256, step=32) model.add(layers.Dense(units, activation=’relu’, input_shape=(784,))) # ドロップアウト率を探索(0.1〜0.5) dropout = hp.Float(‘dropout’, min_value=0.1, max_value=0.5, step=0.1) model.add(layers.Dropout(dropout)) # 2層目 model.add(layers.Dense(units, activation=’relu’)) model.add(layers.Dropout(dropout)) # 出力層 model.add(layers.Dense(10, activation=’softmax’)) # 学習率を探索(対数スケール) learning_rate = hp.Float(‘learning_rate’, min_value=1e-4, max_value=1e-2, sampling=’log’) model.compile( optimizer=keras.optimizers.Adam(learning_rate=learning_rate), loss=’categorical_crossentropy’, metrics=[‘accuracy’] ) return model

4-3. チューナーの実行

# ===== Random Searchチューナー ===== tuner = kt.RandomSearch( build_model, objective=’val_accuracy’, # 最大化する指標 max_trials=20, # 最大試行回数 executions_per_trial=1, # 各試行の実行回数 directory=’tuner_results’, # 結果の保存先 project_name=’mnist_tuning’ ) # 探索空間の確認 tuner.search_space_summary() # ===== 探索実行 ===== tuner.search( X_train, y_train, epochs=10, validation_split=0.2, callbacks=[keras.callbacks.EarlyStopping(patience=3)] ) # ===== 結果の確認 ===== # 最良のハイパーパラメータ best_hps = tuner.get_best_hyperparameters(num_trials=1)[0] print(f””” 最良のハイパーパラメータ: – units: {best_hps.get(‘units’)} – dropout: {best_hps.get(‘dropout’):.2f} – learning_rate: {best_hps.get(‘learning_rate’):.6f} “””) # 最良のモデルを取得 best_model = tuner.get_best_models(num_models=1)[0] test_loss, test_acc = best_model.evaluate(X_test, y_test) print(f”テスト精度: {test_acc:.4f}”)
実行結果:
Search space summary:
- units: Int(32, 256, step=32)
- dropout: Float(0.1, 0.5, step=0.1)
- learning_rate: Float(1e-4, 1e-2, sampling=log)

Trial 20/20 complete
Best val_accuracy: 0.9823

最良のハイパーパラメータ:
- units: 128
- dropout: 0.20
- learning_rate: 0.001234

テスト精度: 0.9801

💡 5. 実践的なチューニング戦略

5-1. チューニングの優先順位

📌 効果が大きいハイパーパラメータ(優先度順)
  1. 学習率:最も重要!まずこれを調整
  2. バッチサイズ:学習の安定性と速度に影響
  3. モデルの深さ/幅:層の数、ユニット数
  4. 正則化:ドロップアウト率、L2正則化
  5. オプティマイザ:Adamで十分なことが多い

5-2. 学習率の探索テクニック

# 学習率の探索範囲(対数スケール) # 1e-5, 1e-4, 1e-3, 1e-2, 1e-1 を試す learning_rates = [1e-5, 1e-4, 1e-3, 1e-2, 1e-1] for lr in learning_rates: model = create_model() model.compile(optimizer=Adam(learning_rate=lr), …) history = model.fit(X_train, y_train, epochs=5, …) # 学習曲線を確認 # 発散する → 学習率が高すぎる # 学習が遅すぎる → 学習率が低すぎる
💡 実務でのアドバイス
  • まずベースライン:デフォルト値で動くモデルを作る
  • 1つずつ変更:複数同時に変えると原因が分からない
  • Early Stopping:エポック数は自動で決める
  • 再現性:random_stateを固定して比較
  • 時間制限:無限に探索しない、締め切りを決める

📝 STEP 25 のまとめ

✅ このステップで学んだこと
  • ハイパーパラメータ:学習前に人間が設定する値
  • Grid Search:全組み合わせを網羅的に探索
  • Random Search:ランダムにサンプリング(効率的)
  • Keras Tuner:自動ハイパーパラメータ最適化ツール
  • 優先順位:学習率 > バッチサイズ > モデル構造 > 正則化
💡 覚えておくべきコード
# Keras Tunerの基本 import keras_tuner as kt def build_model(hp): units = hp.Int(‘units’, 32, 256, step=32) lr = hp.Float(‘lr’, 1e-4, 1e-2, sampling=’log’) # モデル構築… tuner = kt.RandomSearch(build_model, objective=’val_accuracy’, max_trials=20) tuner.search(X_train, y_train, epochs=10, validation_split=0.2)
🚀 次のステップへ

ハイパーパラメータチューニングを習得したので、次のSTEP 26ではモデル評価と可視化を学びます。

学習曲線、混同行列、Grad-CAMなど、モデルの理解を深める技術を身につけましょう!

📝 練習問題

問題1 やさしい

ハイパーパラメータの例

ハイパーパラメータとして正しくないものを選んでください。

  • A. 学習率
  • B. バッチサイズ
  • C. 重み(weights)
  • D. ドロップアウト率
正解:C

重み(weights)は学習中にモデルが自動で更新する「パラメータ」です。ハイパーパラメータは学習前に人間が設定する値です。

問題2 やさしい

Grid Searchの特徴

Grid Searchの特徴として、正しいものを選んでください。

  • A. ランダムに組み合わせを選ぶ
  • B. 全ての組み合わせを試す
  • C. 最も計算効率が良い
  • D. 連続値の探索に最適
正解:B

Grid Searchは指定した全ての組み合わせを網羅的に試します。そのため組み合わせ爆発が起きやすく、計算コストが高くなります。

問題3 ふつう

Random Searchの利点

Random SearchがGrid Searchより優れている点として、正しいものを選んでください。

  • A. 必ず最適解を見つける
  • B. 同じ試行回数でより良い結果を見つけやすい
  • C. 計算が複雑
  • D. 離散値の探索に限定される
正解:B

研究により、Random Searchは同じ試行回数でもGrid Searchより良い結果を見つけやすいことが示されています。特に重要なハイパーパラメータが少ない場合に効果的です。

問題4 ふつう

最も重要なハイパーパラメータ

一般的に、最も影響が大きいとされるハイパーパラメータはどれですか?

  • A. 活性化関数
  • B. 学習率
  • C. エポック数
  • D. 層の初期化方法
正解:B

学習率は最も重要なハイパーパラメータです。高すぎると学習が発散し、低すぎると学習が遅くなります。まず学習率を調整することが推奨されます。

問題5 むずかしい

Keras Tunerの使い方

Keras Tunerで対数スケールの学習率を探索するコードとして、正しいものを選んでください。

  • A. hp.Int(‘lr’, 1e-4, 1e-2)
  • B. hp.Float(‘lr’, 1e-4, 1e-2, sampling=’linear’)
  • C. hp.Float(‘lr’, 1e-4, 1e-2, sampling=’log’)
  • D. hp.Choice(‘lr’, [1e-4, 1e-2])
正解:C

学習率は対数スケールで探索するのが効果的です。sampling=’log’を指定することで、1e-4から1e-2の間を対数スケールでサンプリングします。

📝

学習メモ

ディープラーニング基礎 - Step 25

📋 過去のメモ一覧
#artnasekai #学習メモ
LINE