📋 このステップで学ぶこと
- ハイパーパラメータとは何か?
- 主要なハイパーパラメータの種類
- 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. チューニングの優先順位
📌 効果が大きいハイパーパラメータ(優先度順)
- 学習率:最も重要!まずこれを調整
- バッチサイズ:学習の安定性と速度に影響
- モデルの深さ/幅:層の数、ユニット数
- 正則化:ドロップアウト率、L2正則化
- オプティマイザ: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の間を対数スケールでサンプリングします。
artnasekai
#artnasekai #学習メモ