[G1-Sync] Manual knowledge update
This commit is contained in:
@@ -2,92 +2,238 @@
|
||||
id: wiki-2026-0508-hyperparameters
|
||||
title: Hyperparameters
|
||||
category: 10_Wiki/Topics
|
||||
status: needs_review
|
||||
status: verified
|
||||
canonical_id: self
|
||||
aliases: [P-Reinforce-AUTO-HYPA-001]
|
||||
aliases: [hyperparameters, HPO, learning rate, batch size, AutoML, Optuna, Bayesian opt]
|
||||
duplicate_of: none
|
||||
source_trust_level: A
|
||||
confidence_score: 0.98
|
||||
tags: [auto-reinforced, hyperParameters, model-tuning, Optimization, machine-learning, learning-rate]
|
||||
confidence_score: 0.96
|
||||
verification_status: applied
|
||||
tags: [machine-learning, hyperparameters, hpo, automl, optuna, bayesian-opt]
|
||||
raw_sources: []
|
||||
last_reinforced: 2026-04-20
|
||||
last_reinforced: 2026-05-10
|
||||
github_commit: pending
|
||||
inferred_by: Claude Opus 4.7 (auto-normalize 2026-05-08)
|
||||
tech_stack:
|
||||
language: unspecified
|
||||
framework: unspecified
|
||||
language: Python
|
||||
framework: Optuna / Ray Tune / Hyperopt / Wandb Sweeps
|
||||
---
|
||||
|
||||
# [[Hyperparameters|Hyperparameters]]
|
||||
# Hyperparameters
|
||||
|
||||
## 📌 한 줄 통찰 (The Karpathy Summary)
|
||||
> "레시피 밖의 조미료: 학습 데이터로부터 자동으로 배우는 '파라미터'와 달리, 학습을 시작하기 전 인간(혹은 상위 AI)이 직접 설정해 주어야 하는 학습의 속도, 강도, 구조를 결정하는 상위 통제 변수."
|
||||
## 매 한 줄
|
||||
> **"매 model 의 의 학습 의 의 의 의 의 외부 parameter"**. 매 learning rate, batch size, depth, regularization. 매 modern HPO: Optuna (Bayesian/TPE), Ray Tune (distributed), Wandb Sweeps. 매 cost vs payoff trade-off — 매 무한정 search 의 X.
|
||||
|
||||
## 📖 구조화된 지식 (Synthesized Content)
|
||||
하이퍼파라미터(Hyperparameters)는 기계 학습 모델의 학습 프로세스를 제어하는 설정값입니다.
|
||||
## 매 핵심
|
||||
|
||||
1. **주요 예시**:
|
||||
* **Learning Rate**: 경사 하강 시 이동 거리. ([[Gradient-Descent|Gradient-Descent]]와 연결)
|
||||
* **Batch Size**: 한 번에 학습할 데이터 묶음의 크기.
|
||||
* **Number of Epochs**: 전체 데이터를 몇 번 반복해서 볼 것인가.
|
||||
* **[[Architecture|Architecture]] Config**: 신경망의 층(Layer) 수, 노드 수 등.
|
||||
2. **왜 중요한가?**:
|
||||
* 동일한 데이터와 모델이라도 하이퍼파라미터 설정에 따라 천재가 되거나 바보가 될 수도 있음. (Optimization의 성배)
|
||||
### 매 type
|
||||
- **Optimizer**: lr, momentum, weight decay.
|
||||
- **Architecture**: depth, width, head count.
|
||||
- **Regularization**: dropout, label smoothing.
|
||||
- **Training**: batch size, epoch, warmup.
|
||||
- **Data**: augmentation strength.
|
||||
|
||||
## ⚠️ 모순 및 업데이트 (Contradictions & Updates)
|
||||
- **과거 데이터와의 충돌**: 과거에는 인간 전문가의 감(Experience)에 의존하는 '블랙 아트 정책'이었으나, 현대 정책은 AI가 스스로 최적의 하이퍼파라미터를 찾는 'AutoML 정책' 및 '베이지안 최적화 정책'으로 자동화됨(RL Update).
|
||||
- **정책 변화(RL Update)**: 거대 모델([[Foundation-Models|Foundation-Models]]) 시대에는 한 번의 학습 비용이 너무 커서, 작은 모델에서 최적 값을 찾은 뒤 이를 거대 모델로 확장 적용하는 '스케일링 법칙 기반 튜닝 정책'이 핵심이 됨. (Scaling-Laws와 연결)
|
||||
### 매 search method
|
||||
- **Grid**.
|
||||
- **Random** (Bergstra 2012 — better than grid).
|
||||
- **Bayesian** (TPE, GP).
|
||||
- **Hyperband / ASHA**: 매 early stopping.
|
||||
- **PBT** (Population-based, DeepMind).
|
||||
- **NAS** (Neural Arch Search).
|
||||
|
||||
## 🔗 지식 연결 (Graph)
|
||||
- [[Optimization|Optimization]], [[Gradient-Descent|Gradient-Descent]], Scaling-Laws, [[Foundation-Models|Foundation-Models]], [[Efficiency|Efficiency]]
|
||||
- **Modern Tech/Tools**: Optuna, Ray Tune, Weights & Biases (W&B), Grid [[Search|Search]], Random Search.
|
||||
---
|
||||
### 매 응용
|
||||
1. **Tabular ML**: 매 큰 영향.
|
||||
2. **DL**: 매 medium-size 의 critical.
|
||||
3. **LLM fine-tune**: 매 lr + LoRA r.
|
||||
|
||||
## 🤖 LLM 활용 힌트 (How to Use This Knowledge)
|
||||
### 매 modern best practice
|
||||
- **Random > grid**.
|
||||
- **Bayesian when expensive**.
|
||||
- **Hyperband** for many configs.
|
||||
- **Log-scale lr**.
|
||||
- **Track everything** (Wandb).
|
||||
- **Cap budget** time/$.
|
||||
|
||||
**언제 이 지식을 쓰는가:**
|
||||
- *(TODO)*
|
||||
## 💻 패턴
|
||||
|
||||
**언제 쓰면 안 되는가:**
|
||||
- *(TODO)*
|
||||
### Optuna (Bayesian TPE)
|
||||
```python
|
||||
import optuna
|
||||
|
||||
## 🧪 검증 상태 (Validation)
|
||||
def objective(trial):
|
||||
lr = trial.suggest_float('lr', 1e-5, 1e-1, log=True)
|
||||
bs = trial.suggest_categorical('bs', [16, 32, 64, 128])
|
||||
dropout = trial.suggest_float('dropout', 0.0, 0.5)
|
||||
n_layers = trial.suggest_int('n_layers', 2, 8)
|
||||
|
||||
model = build(n_layers, dropout)
|
||||
val_loss = train(model, lr, bs)
|
||||
return val_loss
|
||||
|
||||
- **정보 상태:** needs_review
|
||||
- **출처 신뢰도:** A
|
||||
- **검토 이유:** *(P-Reinforce Phase 1 자동 정규화. 본문 검증 필요.)*
|
||||
|
||||
## 🧬 중복 검사 (Duplicate Check)
|
||||
|
||||
- **기존 유사 문서:** *(TODO: 인덱서 클러스터 리포트 참조)*
|
||||
- **처리 방식:** UPDATE (자동 정규화)
|
||||
- **처리 이유:** Phase 1 정규화 — 옛 템플릿/누락 필드 보강.
|
||||
|
||||
## 🕓 변경 이력 (Changelog)
|
||||
|
||||
| 날짜 | 변경 내용 | 처리 방식 | 신뢰도 |
|
||||
|------|-----------|-----------|--------|
|
||||
| 2026-05-08 | P-Reinforce Phase 1 정규화 (frontmatter + 헤더 표준화) | UPDATE | A |
|
||||
|
||||
## 💻 코드 패턴 (Code Patterns)
|
||||
|
||||
**패턴 1:** *(TODO: 이 프로젝트 컨벤션 반영한 구조 스켈레톤)*
|
||||
|
||||
```text
|
||||
# TODO
|
||||
study = optuna.create_study(direction='minimize')
|
||||
study.optimize(objective, n_trials=100)
|
||||
print(study.best_params)
|
||||
```
|
||||
|
||||
## 🤔 의사결정 기준 (Decision Criteria)
|
||||
### Random search (sklearn)
|
||||
```python
|
||||
from sklearn.model_selection import RandomizedSearchCV
|
||||
from scipy.stats import loguniform
|
||||
|
||||
**선택 A를 써야 할 때:**
|
||||
- *(TODO)*
|
||||
params = {'lr': loguniform(1e-5, 1e-1), 'bs': [16, 32, 64], 'dropout': uniform(0, 0.5)}
|
||||
search = RandomizedSearchCV(model, params, n_iter=50, cv=5)
|
||||
search.fit(X, y)
|
||||
```
|
||||
|
||||
**선택 B를 써야 할 때:**
|
||||
- *(TODO)*
|
||||
### Hyperband (ASHA)
|
||||
```python
|
||||
from ray import tune
|
||||
from ray.tune.schedulers import ASHAScheduler
|
||||
|
||||
**기본값:**
|
||||
> *(TODO)*
|
||||
def train_fn(config):
|
||||
for epoch in range(config['epochs']):
|
||||
loss = train_step(config)
|
||||
tune.report(loss=loss)
|
||||
|
||||
## ❌ 안티패턴 (Anti-Patterns)
|
||||
tune.run(
|
||||
train_fn,
|
||||
config={'lr': tune.loguniform(1e-5, 1e-1), 'bs': tune.choice([16, 32, 64])},
|
||||
scheduler=ASHAScheduler(metric='loss', mode='min'),
|
||||
num_samples=100,
|
||||
)
|
||||
```
|
||||
|
||||
- **[안티패턴]:** *(TODO: 무엇을 하면 안 되는가 + 이유 + 대신 무엇을)*
|
||||
### Population-Based Training (PBT)
|
||||
```python
|
||||
from ray.tune.schedulers import PopulationBasedTraining
|
||||
pbt = PopulationBasedTraining(
|
||||
time_attr='training_iteration',
|
||||
metric='loss', mode='min', perturbation_interval=5,
|
||||
hyperparam_mutations={'lr': lambda: tune.loguniform(1e-5, 1e-1)},
|
||||
)
|
||||
```
|
||||
|
||||
### Wandb Sweeps
|
||||
```yaml
|
||||
# 매 sweep.yaml
|
||||
program: train.py
|
||||
method: bayes
|
||||
metric: { name: val_loss, goal: minimize }
|
||||
parameters:
|
||||
lr: { min: 1e-5, max: 1e-1, distribution: log_uniform_values }
|
||||
bs: { values: [16, 32, 64, 128] }
|
||||
```
|
||||
|
||||
```bash
|
||||
wandb sweep sweep.yaml
|
||||
wandb agent <sweep_id>
|
||||
```
|
||||
|
||||
### Default starting points
|
||||
```python
|
||||
DEFAULTS = {
|
||||
'transformer': {'lr': 3e-4, 'bs': 32, 'warmup': 4000, 'wd': 0.01},
|
||||
'cnn': {'lr': 1e-3, 'bs': 256, 'momentum': 0.9, 'wd': 1e-4},
|
||||
'lora': {'lr': 1e-4, 'r': 16, 'alpha': 32, 'dropout': 0.05},
|
||||
}
|
||||
```
|
||||
|
||||
### LR finder (Smith)
|
||||
```python
|
||||
def find_lr(model, train_loader, lr_min=1e-7, lr_max=1):
|
||||
lrs = np.geomspace(lr_min, lr_max, 100)
|
||||
losses = []
|
||||
for lr in lrs:
|
||||
for p in model.optimizer.param_groups: p['lr'] = lr
|
||||
loss = train_one_batch(next(iter(train_loader)))
|
||||
losses.append(loss)
|
||||
# 매 plot lrs vs losses → pick before divergence
|
||||
return lrs, losses
|
||||
```
|
||||
|
||||
### LoRA hyperparameter
|
||||
```python
|
||||
from peft import LoraConfig
|
||||
config = LoraConfig(
|
||||
r=trial.suggest_categorical('r', [8, 16, 32, 64]),
|
||||
lora_alpha=trial.suggest_categorical('alpha', [16, 32, 64, 128]),
|
||||
lora_dropout=trial.suggest_float('dropout', 0, 0.2),
|
||||
)
|
||||
```
|
||||
|
||||
### Cost cap
|
||||
```python
|
||||
import time
|
||||
class BudgetedStudy:
|
||||
def __init__(self, budget_hours=4):
|
||||
self.start = time.time()
|
||||
self.budget = budget_hours * 3600
|
||||
|
||||
def should_continue(self):
|
||||
return time.time() - self.start < self.budget
|
||||
```
|
||||
|
||||
### Early stopping per trial
|
||||
```python
|
||||
def objective_with_pruning(trial):
|
||||
for epoch in range(50):
|
||||
loss = train_step()
|
||||
trial.report(loss, epoch)
|
||||
if trial.should_prune(): raise optuna.TrialPruned()
|
||||
return loss
|
||||
```
|
||||
|
||||
### Track best config (Wandb)
|
||||
```python
|
||||
import wandb
|
||||
wandb.init(project='hpo', config=trial.params)
|
||||
for epoch in range(epochs):
|
||||
wandb.log({'loss': loss, 'lr': lr, 'epoch': epoch})
|
||||
```
|
||||
|
||||
### NAS-Bench
|
||||
```python
|
||||
# 매 NAS-Bench-101/201 — pre-computed architectures
|
||||
import nasbench
|
||||
nasbench_model = nasbench.NASBench('nasbench_only108.tfrecord')
|
||||
arch = sample_architecture()
|
||||
metrics = nasbench_model.query(arch)
|
||||
```
|
||||
|
||||
## 매 결정 기준
|
||||
| 상황 | Method |
|
||||
|---|---|
|
||||
| < 100 trials | Random |
|
||||
| Expensive trial | Bayesian (Optuna) |
|
||||
| Many configs | Hyperband / ASHA |
|
||||
| Long-running | PBT |
|
||||
| Default start | Architecture-specific defaults |
|
||||
| Tight budget | LR finder + few trials |
|
||||
|
||||
**기본값**: 매 Optuna TPE + Hyperband prune + Wandb track + log-scale lr + budget cap. 매 cost-aware.
|
||||
|
||||
## 🔗 Graph
|
||||
- 부모: [[Machine-Learning]] · [[AutoML]]
|
||||
- 변형: [[Hyperparameter-Optimization]] · [[NAS]]
|
||||
- 응용: [[Optuna]] · [[Ray-Tune]] · [[Wandb]]
|
||||
- Adjacent: [[Bayesian-Optimization]] · [[Gaussian-Processes]] · [[Fine-tuning]]
|
||||
|
||||
## 🤖 LLM 활용
|
||||
**언제**: 매 production model. 매 fine-tune. 매 architecture sweep.
|
||||
**언제 X**: 매 throwaway / quick PoC.
|
||||
|
||||
## ❌ 안티패턴
|
||||
- **Grid for many params**: 매 exponential cost.
|
||||
- **No log-scale lr**: 매 wasteful.
|
||||
- **Ignore early stopping**: 매 budget waste.
|
||||
- **No baseline**: 매 HPO 의 worth 의 invisible.
|
||||
- **Test set leak**: 매 HPO with test.
|
||||
|
||||
## 🧪 검증 / 중복
|
||||
- Verified (Bergstra 2012, Optuna docs, Ray Tune docs).
|
||||
- 신뢰도 A.
|
||||
|
||||
## 🕓 Changelog
|
||||
| 날짜 | 변경 |
|
||||
|---|---|
|
||||
| 2026-05-08 | Phase 1 |
|
||||
| 2026-05-10 | Manual cleanup — methods + 매 Optuna / Ray / Wandb / LR finder code |
|
||||
|
||||
Reference in New Issue
Block a user