コントローラは,
設計を試し,その結果を設計にフィードバック
の形で,設計能力を向上させていく存在である。
そして,そのフィードバックは,
「良い設計をしたら,報酬を与える」
設計の評価・報酬は,つぎのプロセスになる:
検証データ
|
[ 評価関数 ]
↓
性能指標
|
[ 報酬関数 ]
↓
報酬
検証データ作成・評価関数・報酬関数は,PyTorch や TensorFlow (機械学習・深層学習のフレームワーク) のコードとして,標準で提供されている。
○ 検証データ
モデルがどれくらい汎化できているか(未知のデータに強いか)を測る。
標準的に使われるもので,訓練とは別に用意される。
備考 :
機械学習や深層学習の世界では,データを以下のように3つに分けるのが基本:
| データの種類 |
目的 |
使うタイミング |
訓練データ (training set) |
モデルの学習 |
学習中 |
検証データ (validation set) |
モデルの性能の 途中チェック |
学習の合間 |
テストデータ (test set) |
モデルの性能の 最終的チェック |
学習後 |
○ 評価
評価は,基準がタスクの目的に応じて変わる。
例えば:
1. 画像分類タスクなら
- 正解率(Accuracy):テスト画像に対して,正しく分類できた割合。
- 損失関数の値(Loss):予測と正解のズレの大きさ。
2. 自然言語処理タスクなら
- BLEUスコア(翻訳の正確さ)
- F1スコア(精度と再現率のバランス)
3. モデルの効率性も加味する場合
- パラメータ数(モデルの大きさ)
- 推論時間(どれだけ速く答えを出せるか)
- 消費メモリやエネルギー (リソース効率)
評価関数
検証データで得た性能を数値化する。
PyTorch の例
def evaluate(model, dataloader, criterion, device):
model.eval()
total_loss = 0
correct = 0
total = 0
with torch.no_grad():
for inputs, labels in dataloader:
inputs, labels = inputs.to(device), labels.to(device)
outputs = model(inputs)
loss = criterion(outputs, labels)
total_loss += loss.item()
preds = outputs.argmax(dim=1)
correct += (preds == labels).sum().item()
total += labels.size(0)
accuracy = correct / total
avg_loss = total_loss / len(dataloader)
return accuracy, avg_loss
この関数を使えば,検証データ (dataloader) から,精度 (accuracy) や損失 (loss) を一発で計算できる。
○ 報酬
考え方:
報酬 = 精度 - α × モデルサイズ
精度が高いほど報酬アップ
モデルが大きすぎるとペナルティ (αは重み)
こうすることで,「高性能だけど軽いモデル」を好むようにコントローラを導ける。
例えば,検証精度が80%,α=0 だったら,報酬 = 0.8 にする,といったぐあい。
報酬関数(reward function)
検証データで得られた性能指標をもとに,数値 (報酬) を出す。
基本的な形が提供されていて,例えばつぎのようなシンプルな報酬関数がよく使われる:
python
def reward_function(validation_accuracy):
return validation_accuracy
目的によってはカスタマイズすることも多い。
他には,つぎのような報酬関数もある:
1. 精度とモデルサイズのバランスをとる:
def reward_function(acc, model_size):
# モデルが大きいとペナルティ
return acc - 0.01 * model_size
2. 推論速度も考慮する:
def reward_function(acc, latency):
# 遅いモデルは報酬が下がる
return acc - 0.05 * latency
|