initial commit FESurrogateModelTutorial
This commit is contained in:
@@ -0,0 +1,76 @@
|
||||
# Architecture Decision Records
|
||||
|
||||
## 철학
|
||||
이 프로젝트는 연구용 개념 전달과 재현성을 우선한다. 구현은 작고 명시적이어야 하며, notebook 교육 흐름과 테스트 가능한 Python 모듈 사이의 경계를 분명히 둔다.
|
||||
|
||||
---
|
||||
|
||||
## ADR-001: Python tutorial project로 구성
|
||||
**결정**: Python `>=3.12,<3.15` 기반의 문서 + notebook + src package 구조를 사용한다.
|
||||
|
||||
**이유**: 대상 사용자는 FEM/CAE 연구자이며 Python scientific stack에 익숙하다. NumPy, SciPy, scikit-learn, pandas, matplotlib로 FEM 데이터 생성과 surrogate 모델링을 모두 재현할 수 있다.
|
||||
|
||||
**트레이드오프**: 브라우저 대시보드 기반 상호작용은 제공하지 않는다. 시각적 결과는 notebook과 저장된 figure로 제한한다.
|
||||
|
||||
---
|
||||
|
||||
## ADR-002: `uv`와 `pyproject.toml` 사용
|
||||
**결정**: 의존성 관리는 `uv`, 프로젝트 설정은 `pyproject.toml`, lock은 `uv.lock`으로 관리한다.
|
||||
|
||||
**이유**: 튜토리얼 재현성을 높이고, pytest/ruff/jupyter 실행 명령을 하나의 환경에서 고정하기 쉽다.
|
||||
|
||||
**트레이드오프**: conda 기반 연구실 환경보다 초기 학습 비용이 있을 수 있다. 대신 repository-local workflow가 단순해진다.
|
||||
|
||||
---
|
||||
|
||||
## ADR-003: 자체 2D Euler-Bernoulli beam/frame solver 사용
|
||||
**결정**: FEM 데이터는 NumPy/SciPy로 구현한 2-node 2D Euler-Bernoulli beam/frame element에서 생성한다.
|
||||
|
||||
**이유**: 외부 CAE solver 없이 해석 데이터 생성 과정을 완전히 설명할 수 있다. 요소 강성, 조립, 경계조건, 응답 계산이 surrogate 학습 데이터와 직접 연결된다.
|
||||
|
||||
**트레이드오프**: 산업용 고충실도 해석과 차이가 있다. v1은 선형 정적, slender beam 가정에 제한된다.
|
||||
|
||||
---
|
||||
|
||||
## ADR-004: Notebook은 orchestration layer로 제한
|
||||
**결정**: 핵심 계산과 학습 helper는 `src/femsurrogate/`에 두고 notebook은 설명, 호출, 시각화, 해석을 담당한다.
|
||||
|
||||
**이유**: notebook hidden state 문제를 줄이고, pytest로 핵심 로직을 검증할 수 있다. 모델별 notebook도 같은 helper를 사용하므로 비교 조건이 일관된다.
|
||||
|
||||
**트레이드오프**: 독자가 처음 볼 파일 수는 늘어난다. 대신 코드 재사용성과 검증 가능성이 높아진다.
|
||||
|
||||
---
|
||||
|
||||
## ADR-005: scikit-learn 중심 surrogate 모델
|
||||
**결정**: Response Surface, Gaussian Process/Kriging, Random Forest, Gradient Boosting, MLP를 모두 scikit-learn API로 구현한다.
|
||||
|
||||
**이유**: 공통 `fit/predict` 인터페이스를 사용하면 모델별 비교가 단순하다. 연구자에게 익숙하고 설치 부담이 낮다.
|
||||
|
||||
**트레이드오프**: PyTorch 기반 deep learning, GPU 학습, 복잡한 Bayesian optimization framework는 제외한다.
|
||||
|
||||
---
|
||||
|
||||
## ADR-006: 기준 데이터셋은 CSV + metadata JSON
|
||||
**결정**: 기준 FEM 데이터는 CSV로 저장하고, 생성 조건은 JSON metadata로 별도 저장한다.
|
||||
|
||||
**이유**: CSV는 notebook, pandas, spreadsheet, 다른 ML 도구에서 쉽게 읽을 수 있다. Metadata JSON은 seed, bounds, 단위, target 정보를 명확히 남긴다.
|
||||
|
||||
**트레이드오프**: 대용량/버전관리형 데이터셋에는 Parquet, DVC, database가 더 적합할 수 있다. v1에서는 단순성과 가독성을 우선한다.
|
||||
|
||||
---
|
||||
|
||||
## ADR-007: 모델별 이론 문서와 모델별 notebook 분리
|
||||
**결정**: 각 surrogate 모델은 별도 이론 문서와 별도 실습 notebook으로 구성한다. 최종 비교는 별도 notebook에서 수행한다.
|
||||
|
||||
**이유**: 모델별 가정, 장점, 실패 모드, hyperparameter가 다르므로 독립적으로 학습하는 편이 좋다. 최종 비교 notebook은 같은 입력 데이터와 metric을 기준으로 모델 선택을 돕는다.
|
||||
|
||||
**트레이드오프**: notebook 수가 늘어난다. 대신 각 notebook의 목표가 분명하고 실행 실패 범위가 작아진다.
|
||||
|
||||
---
|
||||
|
||||
## ADR-008: Notebook 중심 범위 고정
|
||||
**결정**: 브라우저 앱과 디자인 시스템 계획을 프로젝트 범위에서 제외한다.
|
||||
|
||||
**이유**: 튜토리얼은 notebook 기반이다. 브라우저 앱 설계 지침은 현재 목표에 직접 기여하지 않으며 미래 agent에게 잘못된 구현 방향을 줄 수 있다.
|
||||
|
||||
**트레이드오프**: 웹 기반 인터랙티브 학습 환경은 제공하지 않는다.
|
||||
@@ -0,0 +1,226 @@
|
||||
# 아키텍처
|
||||
|
||||
## 개요
|
||||
이 프로젝트는 문서와 Jupyter notebook이 중심인 교육용 Python 프로젝트다. 재사용 가능한 계산 로직은 `src/femsurrogate/`에 모듈화하고, notebook은 설명, 시각화, 실행 순서, 결과 해석을 담당한다.
|
||||
|
||||
## 기술 스택
|
||||
- Python `>=3.12,<3.15`
|
||||
- `uv` + `pyproject.toml` + `uv.lock`
|
||||
- NumPy, SciPy
|
||||
- pandas, matplotlib
|
||||
- scikit-learn
|
||||
- JupyterLab, ipykernel, nbconvert
|
||||
- pytest, ruff
|
||||
- joblib, CSV, JSON
|
||||
|
||||
## 디렉토리 구조
|
||||
```text
|
||||
docs/
|
||||
PRD.md
|
||||
ARCHITECTURE.md
|
||||
ADR.md
|
||||
theory/
|
||||
00_surrogate_modeling_for_fem.md
|
||||
01_doe_sampling_validation.md
|
||||
02_response_surface_methodology.md
|
||||
03_gaussian_process_kriging.md
|
||||
04_random_forest.md
|
||||
05_gradient_boosting.md
|
||||
06_mlp_neural_network.md
|
||||
|
||||
BeamExamples/
|
||||
CantileverBeam.txt
|
||||
CantileverBeam_Displacements.txt
|
||||
|
||||
notebooks/
|
||||
00_beam2d_fea_dataset.ipynb
|
||||
01_response_surface_surrogate.ipynb
|
||||
02_gaussian_process_kriging_surrogate.ipynb
|
||||
03_random_forest_surrogate.ipynb
|
||||
04_gradient_boosting_surrogate.ipynb
|
||||
05_mlp_surrogate.ipynb
|
||||
06_compare_surrogate_models.ipynb
|
||||
|
||||
src/femsurrogate/
|
||||
fea/
|
||||
element.py
|
||||
model.py
|
||||
io.py
|
||||
assembly.py
|
||||
solver.py
|
||||
responses.py
|
||||
benchmark.py
|
||||
data/
|
||||
bounds.py
|
||||
sampling.py
|
||||
dataset.py
|
||||
schema.py
|
||||
surrogates/
|
||||
common.py
|
||||
rsm.py
|
||||
gpr.py
|
||||
random_forest.py
|
||||
boosting.py
|
||||
mlp.py
|
||||
registry.py
|
||||
plotting/
|
||||
diagnostics.py
|
||||
comparison.py
|
||||
|
||||
tests/
|
||||
data/
|
||||
reference/
|
||||
processed/
|
||||
reports/
|
||||
results/
|
||||
predictions/
|
||||
figures/
|
||||
```
|
||||
|
||||
## 핵심 모듈 책임
|
||||
### `femsurrogate.fea`
|
||||
2D Euler-Bernoulli beam/frame 요소 기반 선형 정적 해석을 담당한다.
|
||||
|
||||
- `element.py`: local 6x6 stiffness matrix와 좌표 변환 행렬.
|
||||
- `model.py`: node, element, support, load, material, section, parameter dataclass.
|
||||
- `io.py`: `BeamExamples/*.txt`의 간단한 텍스트 fixture parser.
|
||||
- `assembly.py`: global sparse stiffness matrix 조립.
|
||||
- `solver.py`: 경계조건 적용과 `K u = f` 풀이.
|
||||
- `responses.py`: tip displacement, bending stress, mass, compliance 계산.
|
||||
- `benchmark.py`: cantilever analytical solution 등 검증 helper.
|
||||
|
||||
### `femsurrogate.data`
|
||||
입력 공간 정의, 샘플링, batch 해석, dataset schema를 담당한다.
|
||||
|
||||
- `bounds.py`: 설계변수 범위와 단위.
|
||||
- `sampling.py`: Latin Hypercube Sampling.
|
||||
- `dataset.py`: 샘플별 FEM 실행과 CSV/metadata 저장.
|
||||
- `schema.py`: 컬럼명, target명, 단위, split seed.
|
||||
|
||||
### `femsurrogate.surrogates`
|
||||
scikit-learn 기반 모델 생성, 학습, 평가를 담당한다.
|
||||
|
||||
- `common.py`: train/test split, scaling, metric, timing, JSON 저장.
|
||||
- `rsm.py`: `PolynomialFeatures` + `Ridge`.
|
||||
- `gpr.py`: `GaussianProcessRegressor`.
|
||||
- `random_forest.py`: `RandomForestRegressor`.
|
||||
- `boosting.py`: `GradientBoostingRegressor`.
|
||||
- `mlp.py`: `MLPRegressor`.
|
||||
- `registry.py`: notebook에서 모델명을 통해 builder를 가져오는 작은 registry.
|
||||
|
||||
### `femsurrogate.plotting`
|
||||
모델 진단과 최종 비교 그림을 담당한다.
|
||||
|
||||
- `diagnostics.py`: parity plot, residual plot, error histogram.
|
||||
- `comparison.py`: 모델별 metric table, bar plot, prediction-time comparison.
|
||||
|
||||
## 주요 인터페이스
|
||||
```python
|
||||
def run_beam2d_case(params: BeamParameters) -> AnalysisResult:
|
||||
...
|
||||
|
||||
def generate_lhs_samples(bounds: ParameterBounds, n: int, seed: int) -> pd.DataFrame:
|
||||
...
|
||||
|
||||
def build_dataset(samples: pd.DataFrame) -> pd.DataFrame:
|
||||
...
|
||||
|
||||
def make_model(model_name: str, random_state: int):
|
||||
...
|
||||
|
||||
def evaluate_model(model, X_train, X_test, y_train, y_test) -> MetricsReport:
|
||||
...
|
||||
```
|
||||
|
||||
## 데이터 흐름
|
||||
```text
|
||||
Parameter bounds
|
||||
-> Latin Hypercube samples
|
||||
-> Beam2D FEM batch analysis
|
||||
-> data/reference/beam2d_lhs_300.csv
|
||||
-> model-specific notebooks
|
||||
-> reports/results/<model>_metrics.json
|
||||
-> reports/predictions/<model>_predictions.csv
|
||||
-> notebooks/06_compare_surrogate_models.ipynb
|
||||
```
|
||||
|
||||
## FEM 해석 설계
|
||||
- 요소: 2-node 2D Euler-Bernoulli frame element.
|
||||
- 노드 DOF: `[ux, uy, rz]`.
|
||||
- Local stiffness matrix: axial `EA/L` 항과 bending `EI` 항을 포함한 6x6 matrix.
|
||||
- Global assembly: sparse matrix 기반.
|
||||
- Solver: constrained DOF 제거 후 `scipy.sparse.linalg.spsolve`.
|
||||
- 기준 검증: cantilever tip displacement `P L^3 / (3 E I)`.
|
||||
|
||||
## Solver Verification Fixture
|
||||
`BeamExamples/`의 cantilever 예제는 solver 구현의 canonical regression fixture다.
|
||||
|
||||
```text
|
||||
BeamExamples/CantileverBeam.txt
|
||||
BeamExamples/CantileverBeam_Displacements.txt
|
||||
```
|
||||
|
||||
입력 파일은 다음 항목을 포함한다.
|
||||
|
||||
- Section/material metadata: `Area`, `J`, `Iyy`, `Izz`, `ElasticModulus`, `Poisson'sRatio`.
|
||||
- Geometry: `Node, NodeID, X, Y`.
|
||||
- Connectivity: `Beam, BeamID, NodeID1, NodeID2`.
|
||||
- Boundary condition: `Fix, NodeID`.
|
||||
- Load: `NodeLoad, NodeID, Fx, Fy, Mz`.
|
||||
|
||||
2D in-plane Euler-Bernoulli frame solver는 `Area`, `Izz`, `ElasticModulus`, node coordinates, beam connectivity, fixed nodes, nodal loads를 사용한다. `J`, `Iyy`, `Poisson'sRatio`는 fixture metadata로 보존하되 v1 해석에는 사용하지 않는다.
|
||||
|
||||
기준 변위 파일은 다음 형식을 가진다.
|
||||
|
||||
```text
|
||||
# NodeID, Ux, Uy, Rz
|
||||
1 0.000000, 0.000000, 0.000000
|
||||
...
|
||||
```
|
||||
|
||||
검증 test는 solver 결과의 모든 node별 `[Ux, Uy, Rz]`를 기준 파일과 비교한다. 기준 파일 값은 소수점 6자리로 반올림되어 있으므로 기본 허용오차는 `atol=5e-7`, `rtol=1e-6`로 둔다. Tip displacement는 별도로 해석해 `P L^3 / (3 E I)`와 비교해 부호와 크기를 확인한다.
|
||||
|
||||
## Dataset Schema
|
||||
기본 dataset은 SI 단위 컬럼을 사용한다.
|
||||
|
||||
```text
|
||||
L_m
|
||||
b_m
|
||||
h_m
|
||||
E_pa
|
||||
P_n
|
||||
A_m2
|
||||
I_m4
|
||||
tip_uy_m
|
||||
max_abs_bending_stress_pa
|
||||
mass_kg
|
||||
compliance_j
|
||||
```
|
||||
|
||||
Metadata JSON에는 다음을 포함한다.
|
||||
|
||||
```text
|
||||
dataset_name
|
||||
created_by
|
||||
sample_count
|
||||
random_seed
|
||||
parameter_bounds
|
||||
target_columns
|
||||
unit_system
|
||||
fea_model
|
||||
notes
|
||||
```
|
||||
|
||||
## Notebook 책임
|
||||
- Notebook은 한 번에 위에서 아래로 실행 가능해야 한다.
|
||||
- Notebook 셀에 핵심 FEM 또는 ML helper 구현을 길게 두지 않는다.
|
||||
- 각 모델별 notebook은 같은 dataset, target, split seed를 사용한다.
|
||||
- 각 모델별 notebook은 metric JSON과 prediction CSV를 저장한다.
|
||||
- 최종 비교 notebook은 이전 notebook 결과물을 읽어 비교만 수행한다.
|
||||
|
||||
## 검증 전략
|
||||
- Unit tests: FEM element, solver, dataset generation, model factory.
|
||||
- Regression tests: `BeamExamples/CantileverBeam.txt`를 해석하고 `BeamExamples/CantileverBeam_Displacements.txt`와 비교.
|
||||
- Integration tests: 작은 sample count로 dataset 생성과 모든 surrogate smoke test.
|
||||
- Notebook tests: `nbconvert --execute`로 순차 실행.
|
||||
- Documentation checks: 문서의 경로와 notebook/file 이름이 실제 구조와 일치하는지 검토.
|
||||
@@ -0,0 +1,60 @@
|
||||
# PRD: FEM Surrogate Tutorial
|
||||
|
||||
## 목표
|
||||
FEM 기반 구조해석 데이터로 surrogate model을 구축하고 검증하는 전체 절차를 학습할 수 있는 한국어 튜토리얼을 만든다. 독자는 2D beam 요소로 해석 데이터를 직접 생성하고, 여러 surrogate 모델을 같은 데이터셋에서 학습, 평가, 비교한다.
|
||||
|
||||
## 사용자
|
||||
- FEM과 선형 정적 구조해석의 기본 개념을 아는 대학원생.
|
||||
- CAE 해석 결과를 기계학습 모델로 근사하고 싶은 연구자.
|
||||
- surrogate 기반 설계 탐색, 민감도 분석, 최적화의 입문 파이프라인을 재현하고 싶은 엔지니어.
|
||||
|
||||
## 사용자 문제
|
||||
고정밀 구조해석은 반복 설계, 불확실성 분석, 최적화에서 계산 비용이 커진다. Surrogate model은 해석 데이터에서 입력 변수와 응답의 관계를 학습하여 빠른 근사 예측을 제공하지만, 모델별 가정, 데이터 설계, 검증 방법, 외삽 위험을 함께 이해해야 실무적으로 사용할 수 있다.
|
||||
|
||||
## 학습 성과
|
||||
튜토리얼을 완료한 독자는 다음을 할 수 있어야 한다.
|
||||
|
||||
1. 2D Euler-Bernoulli beam/frame 요소를 이용해 선형 정적 FEM 해석 데이터를 생성한다.
|
||||
2. DOE와 Latin Hypercube Sampling으로 입력 공간을 정의하고 해석 케이스를 만든다.
|
||||
3. Response Surface, Gaussian Process/Kriging, Random Forest, Gradient Boosting, MLP를 같은 데이터셋에 적용한다.
|
||||
4. RMSE, MAE, R2, residual, parity plot, uncertainty 또는 feature importance로 모델을 진단한다.
|
||||
5. 최종 비교표를 통해 구조해석 surrogate 문제에 맞는 모델을 선택하는 기준을 설명한다.
|
||||
|
||||
## 핵심 산출물
|
||||
- `docs/theory/`: surrogate 모델별 이론 문서와 출처.
|
||||
- `notebooks/`: 데이터 생성, 모델별 학습, 최종 비교 notebook.
|
||||
- `src/femsurrogate/`: notebook에서 재사용하는 FEM, 데이터, 모델, plotting helper.
|
||||
- `tests/`: FEM 공식 검증, dataset schema, surrogate pipeline smoke test.
|
||||
- `BeamExamples/`: 2D beam solver 검증용 cantilever 예제와 기준 변위 파일.
|
||||
- `data/reference/`: 재현 가능한 기준 해석 데이터.
|
||||
- `reports/`: 모델별 metric, 예측값, 그림.
|
||||
|
||||
## MVP 범위
|
||||
- 선형 정적 2D Euler-Bernoulli beam/frame 요소.
|
||||
- 기준 구조: fixed-free cantilever beam 또는 간단한 planar frame.
|
||||
- Solver 검증 기준 fixture: `BeamExamples/CantileverBeam.txt`와 `BeamExamples/CantileverBeam_Displacements.txt`.
|
||||
- 입력 변수: `L`, `b`, `h`, `E`, `P`.
|
||||
- 응답 변수: `tip_uy_m`, `max_abs_bending_stress_pa`, `mass_kg`, `compliance_j`.
|
||||
- Surrogate 모델:
|
||||
- Response Surface Methodology: polynomial features + Ridge regression.
|
||||
- Gaussian Process Regression/Kriging.
|
||||
- Random Forest Regressor.
|
||||
- Gradient Boosting Regressor.
|
||||
- Multi-layer Perceptron Regressor.
|
||||
|
||||
## MVP 제외 사항
|
||||
- 상용 CAE 연동.
|
||||
- 3D beam, shell, solid element.
|
||||
- Timoshenko beam, geometric nonlinearity, material nonlinearity, contact, buckling, modal, transient analysis.
|
||||
- PyTorch/TensorFlow 기반 deep learning framework.
|
||||
- Bayesian optimization, active learning, MLflow, DVC, browser dashboard.
|
||||
- 배포용 Python package publishing.
|
||||
|
||||
## 성공 기준
|
||||
- 이론 문서가 모델별로 분리되어 있고 각 문서에 출처가 있다.
|
||||
- FEM solver가 `BeamExamples/CantileverBeam.txt`를 해석했을 때 `BeamExamples/CantileverBeam_Displacements.txt`의 모든 노드 `Ux`, `Uy`, `Rz` 기준값과 허용오차 내에서 일치한다.
|
||||
- `00_beam2d_fea_dataset.ipynb`가 데이터셋을 생성하고, 생성 데이터가 동일 seed에서 재현된다.
|
||||
- 모든 모델별 notebook이 같은 dataset과 split을 사용한다.
|
||||
- 최종 비교 notebook이 모든 모델의 metric JSON을 읽어 하나의 비교표와 그림을 만든다.
|
||||
- FEM solver는 cantilever beam 해석해와 BeamExamples regression fixture를 모두 비교하는 pytest를 통과한다.
|
||||
- 전체 notebook은 `nbconvert --execute`로 순서대로 실행 가능하다.
|
||||
@@ -0,0 +1,98 @@
|
||||
# FEM 구조해석을 위한 Surrogate Modeling 개요
|
||||
|
||||
## 목적
|
||||
Surrogate model은 계산 비용이 큰 해석 모델을 반복 호출하기 어려울 때, 입력 변수와 출력 응답 사이의 관계를 데이터 기반으로 근사하는 모델이다. FEM 구조해석에서는 설계변수 변화에 따른 변위, 응력, 질량, compliance 같은 응답을 빠르게 예측하기 위해 사용한다.
|
||||
|
||||
이 튜토리얼의 surrogate는 고충실도 산업용 solver를 대체하는 범용 도구가 아니라, 제한된 입력 범위 안에서 반복 설계 탐색과 모델 비교를 학습하기 위한 교육용 근사 모델이다.
|
||||
|
||||
## 문제 정의
|
||||
FEM 해석 모델을 다음 함수로 본다.
|
||||
|
||||
```text
|
||||
y = f(x)
|
||||
```
|
||||
|
||||
- `x`: 설계변수 벡터. 예: beam 길이 `L`, 폭 `b`, 높이 `h`, 탄성계수 `E`, 하중 `P`.
|
||||
- `f`: FEM solver. 이 튜토리얼에서는 2D Euler-Bernoulli beam/frame solver.
|
||||
- `y`: 응답. 예: tip displacement, maximum bending stress, mass, compliance.
|
||||
|
||||
Surrogate model은 해석 데이터 `{x_i, y_i}`를 이용해 `f`를 근사하는 `\hat{f}`를 만든다.
|
||||
|
||||
```text
|
||||
\hat{y} = \hat{f}(x)
|
||||
```
|
||||
|
||||
좋은 surrogate는 빠른 예측뿐 아니라, 어떤 영역에서 믿을 수 있고 어떤 영역에서 위험한지도 설명할 수 있어야 한다.
|
||||
|
||||
## 왜 FEM에서 필요한가
|
||||
구조해석에서는 다음 작업이 반복 평가를 요구한다.
|
||||
|
||||
- 설계변수 sweep.
|
||||
- 민감도 분석.
|
||||
- 최적화.
|
||||
- 불확실성 전파.
|
||||
- 신뢰성 분석.
|
||||
- inverse problem 또는 model calibration.
|
||||
|
||||
Queipo et al.은 surrogate-based analysis and optimization이 비싼 high-fidelity model의 계산 부담을 줄이고 민감도/최적화 연구를 가능하게 한다고 정리한다. Forrester와 Keane도 긴 계산 시간이 필요한 aerospace design evaluation에서 surrogate 기반 방법이 효율적 최적화를 가능하게 하는 배경을 설명한다.
|
||||
|
||||
## 전체 workflow
|
||||
```text
|
||||
1. 해석 문제 정의
|
||||
2. 입력 변수와 범위 설정
|
||||
3. DOE로 샘플 생성
|
||||
4. FEM batch 해석
|
||||
5. 데이터 정리와 train/test split
|
||||
6. surrogate 모델 학습
|
||||
7. 검증과 진단
|
||||
8. 모델 비교
|
||||
9. 설계 탐색 또는 최적화에 활용
|
||||
```
|
||||
|
||||
이 workflow에서 가장 중요한 판단은 데이터의 범위다. Surrogate는 학습한 입력 영역 안에서만 신뢰할 수 있다. 학습 범위를 벗어난 외삽은 모델별로 다르게 실패하며, 예측값이 그럴듯해 보여도 구조적으로 틀릴 수 있다.
|
||||
|
||||
## 이 튜토리얼의 FEM 모델
|
||||
기준 해석 모델은 2D Euler-Bernoulli beam/frame element이다.
|
||||
|
||||
- 노드당 자유도: `ux`, `uy`, `rz`.
|
||||
- 요소: 축방향 변형과 굽힘 변형을 포함한 2-node frame element.
|
||||
- 해석: 선형 정적 해석.
|
||||
- solver: sparse global stiffness matrix를 조립하고 `scipy.sparse.linalg.spsolve`로 선형 시스템을 푼다.
|
||||
- 검증: cantilever beam tip displacement 해석해 `P L^3 / (3 E I)`와 비교한다.
|
||||
|
||||
이 선택은 학습 목적에 맞다. Beam 요소는 수식이 충분히 작아 직접 구현할 수 있고, 단면 형상과 하중 변화가 변위/응력에 비선형적인 영향을 주므로 surrogate 비교에도 적합하다.
|
||||
|
||||
## 모델 비교 관점
|
||||
이 튜토리얼은 다음 질문에 답하도록 설계한다.
|
||||
|
||||
| 모델 | 핵심 질문 |
|
||||
| --- | --- |
|
||||
| Response Surface | 낮은 차수 다항식으로 구조 응답을 충분히 설명할 수 있는가? |
|
||||
| Gaussian Process/Kriging | 적은 데이터에서 예측 불확실성을 함께 얻을 수 있는가? |
|
||||
| Random Forest | 비선형성과 변수 상호작용을 튼튼하게 포착하는가? |
|
||||
| Gradient Boosting | 작은 tree를 순차적으로 더해 높은 정확도를 얻는가? |
|
||||
| MLP | scaling과 충분한 데이터가 있을 때 매끄러운 비선형 근사가 가능한가? |
|
||||
|
||||
## 검증 원칙
|
||||
Surrogate 검증은 단순히 test R2 하나로 끝내지 않는다.
|
||||
|
||||
- Train/test split은 고정 seed로 재현한다.
|
||||
- K-fold cross validation으로 표본 의존성을 확인한다.
|
||||
- RMSE, MAE, R2를 함께 본다.
|
||||
- Parity plot으로 편향과 outlier를 본다.
|
||||
- Residual plot으로 입력 영역별 오류 구조를 본다.
|
||||
- 모델별 uncertainty 또는 feature importance를 해석한다.
|
||||
- 해석 데이터의 물리 단위와 target 정의를 metadata에 남긴다.
|
||||
|
||||
## 실패 모드
|
||||
- 학습 영역 밖에서 외삽한다.
|
||||
- 입력 변수 범위가 물리적으로 의미 없는 조합을 포함한다.
|
||||
- 응력처럼 국소적이고 비선형적인 응답을 너무 단순한 모델로 근사한다.
|
||||
- train/test split이 샘플링 편향을 숨긴다.
|
||||
- feature scaling을 하지 않아 MLP나 GPR 학습이 불안정하다.
|
||||
- 예측 정확도만 보고 물리 제약을 확인하지 않는다.
|
||||
|
||||
## References
|
||||
- Queipo, N. V. et al. (2005), "Surrogate-based analysis and optimization", Progress in Aerospace Sciences. https://doi.org/10.1016/j.paerosci.2005.02.001
|
||||
- Forrester, A. I. J. and Keane, A. J. (2009), "Recent advances in surrogate-based optimization", Progress in Aerospace Sciences. https://doi.org/10.1016/j.paerosci.2008.11.001
|
||||
- SciPy `spsolve` documentation. https://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.linalg.spsolve.html
|
||||
@@ -0,0 +1,114 @@
|
||||
# DOE, Sampling, Validation
|
||||
|
||||
## 목적
|
||||
Surrogate model의 품질은 모델 종류만큼이나 데이터 설계에 좌우된다. FEM surrogate에서는 입력 변수 범위, 샘플링 방법, train/test split, 검증 지표가 모두 모델 해석에 영향을 준다.
|
||||
|
||||
## 입력 공간 정의
|
||||
이 튜토리얼의 기본 입력 변수는 다음과 같다.
|
||||
|
||||
| 변수 | 의미 | 단위 | 예시 범위 |
|
||||
| --- | --- | --- | --- |
|
||||
| `L_m` | beam length | m | 1.0-3.0 |
|
||||
| `b_m` | rectangular section width | m | 0.02-0.08 |
|
||||
| `h_m` | rectangular section height | m | 0.04-0.16 |
|
||||
| `E_pa` | Young's modulus | Pa | 100e9-220e9 |
|
||||
| `P_n` | tip point load magnitude | N | 100-2000 |
|
||||
|
||||
파생 변수는 FEM 해석 직전에 계산한다.
|
||||
|
||||
```text
|
||||
A = b h
|
||||
I = b h^3 / 12
|
||||
```
|
||||
|
||||
`h`는 bending stiffness에 세제곱으로 들어가므로, tip displacement와 bending stress에 큰 영향을 준다. 이런 구조적 비선형성 때문에 단순 선형 회귀보다 다양한 surrogate 비교가 의미를 가진다.
|
||||
|
||||
## Latin Hypercube Sampling
|
||||
Latin Hypercube Sampling(LHS)은 각 입력 변수의 marginal distribution을 층화하여, 적은 샘플에서도 각 변수 범위를 비교적 고르게 덮도록 설계한다. McKay, Beckman, Conover의 1979년 논문은 computer code output 분석에서 sampling plan을 비교한 고전적 출처다.
|
||||
|
||||
SciPy의 `scipy.stats.qmc.LatinHypercube`는 `[0, 1)^d` 단위 hypercube에 샘플을 만들고, 이후 사용자가 물리 범위로 scaling한다.
|
||||
|
||||
```text
|
||||
u ~ LHS([0,1)^d)
|
||||
x_j = lower_j + u_j (upper_j - lower_j)
|
||||
```
|
||||
|
||||
이 튜토리얼은 다음을 기본값으로 사용한다.
|
||||
|
||||
- `n_samples = 300`
|
||||
- `seed = 20260521`
|
||||
- `target = tip_uy_m`
|
||||
- 동일 dataset과 동일 split을 모든 model notebook에서 사용
|
||||
|
||||
## Train/Test Split
|
||||
단일 test set만으로 모델을 판단하면 샘플 배치에 민감할 수 있다. 따라서 다음 두 가지를 함께 사용한다.
|
||||
|
||||
- Hold-out test set: 최종 성능 비교용.
|
||||
- K-fold cross validation: 학습 데이터 안에서 모델 안정성 확인용.
|
||||
|
||||
추천 기본값:
|
||||
|
||||
```text
|
||||
test_size = 0.2
|
||||
cv_folds = 5
|
||||
random_state = 20260521
|
||||
```
|
||||
|
||||
## 평가 지표
|
||||
### RMSE
|
||||
큰 오차에 민감하다. 구조해석 surrogate에서 위험한 outlier를 확인하는 데 유용하다.
|
||||
|
||||
```text
|
||||
RMSE = sqrt(mean((y - y_hat)^2))
|
||||
```
|
||||
|
||||
### MAE
|
||||
평균적인 절대 오차를 직관적으로 보여준다.
|
||||
|
||||
```text
|
||||
MAE = mean(abs(y - y_hat))
|
||||
```
|
||||
|
||||
### R2
|
||||
분산 설명력을 나타낸다. 다만 target scale이나 test set 분포에 따라 해석이 왜곡될 수 있으므로 RMSE/MAE와 함께 본다.
|
||||
|
||||
```text
|
||||
R2 = 1 - sum((y - y_hat)^2) / sum((y - mean(y))^2)
|
||||
```
|
||||
|
||||
## Plot 기반 진단
|
||||
- Parity plot: 예측값과 실제값이 `y=x` 선 주변에 있는지 확인.
|
||||
- Residual plot: 예측값 또는 주요 입력 변수에 따른 오차 패턴 확인.
|
||||
- Error histogram: 오차 분포와 outlier 확인.
|
||||
- Model comparison bar plot: RMSE, MAE, R2, 학습 시간, 예측 시간 비교.
|
||||
|
||||
## Dataset Metadata
|
||||
CSV만으로는 dataset의 생성 조건을 알기 어렵다. 따라서 metadata JSON을 함께 저장한다.
|
||||
|
||||
```json
|
||||
{
|
||||
"dataset_name": "beam2d_lhs_300",
|
||||
"sample_count": 300,
|
||||
"random_seed": 20260521,
|
||||
"unit_system": "SI",
|
||||
"fea_model": "2D Euler-Bernoulli beam/frame, linear static",
|
||||
"target_columns": [
|
||||
"tip_uy_m",
|
||||
"max_abs_bending_stress_pa",
|
||||
"mass_kg",
|
||||
"compliance_j"
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
## 주의점
|
||||
- DOE 범위는 surrogate의 유효 영역이다. 범위 밖 예측은 별도 경고를 둔다.
|
||||
- 물리적으로 불가능한 조합을 허용하지 않는다.
|
||||
- FEM solver 실패 케이스는 조용히 버리지 말고 metadata에 기록한다.
|
||||
- 단위가 섞이면 모델 비교가 무의미해진다.
|
||||
- 동일 데이터셋을 쓰지 않으면 모델별 비교가 공정하지 않다.
|
||||
|
||||
## References
|
||||
- McKay, M. D., Beckman, R. J., and Conover, W. J. (1979), "Comparison of Three Methods for Selecting Values of Input Variables in the Analysis of Output from a Computer Code", Technometrics. https://doi.org/10.1080/00401706.1979.10489755
|
||||
- OSTI bibliographic record for McKay et al. https://www.osti.gov/biblio/5236110
|
||||
- SciPy `LatinHypercube` documentation. https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.qmc.LatinHypercube.html
|
||||
@@ -0,0 +1,77 @@
|
||||
# Response Surface Methodology
|
||||
|
||||
## 핵심 아이디어
|
||||
Response Surface Methodology(RSM)는 입력 변수와 응답 사이의 관계를 낮은 차수 다항식으로 근사한다. 구조해석 surrogate에서는 물리 응답이 충분히 매끄럽고 입력 범위가 좁을 때 강력한 기준선이 된다.
|
||||
|
||||
기본 2차 response surface는 다음 형태다.
|
||||
|
||||
```text
|
||||
y = beta_0 + sum beta_i x_i + sum beta_ii x_i^2 + sum beta_ij x_i x_j + epsilon
|
||||
```
|
||||
|
||||
- `x_i`: scaling된 설계변수.
|
||||
- `beta`: 회귀 계수.
|
||||
- `x_i x_j`: 변수 상호작용.
|
||||
- `epsilon`: 모델이 설명하지 못한 잔차.
|
||||
|
||||
## FEM surrogate에서의 의미
|
||||
Beam 문제에서는 `I = b h^3 / 12` 때문에 응답이 입력 변수에 대해 비선형이다. 낮은 차수 다항식은 이 관계를 완벽히 재현하지 못할 수 있지만, 다음 장점이 있다.
|
||||
|
||||
- 빠르다.
|
||||
- 계수 해석이 가능하다.
|
||||
- 적은 데이터에서도 안정적이다.
|
||||
- 복잡한 모델의 baseline으로 적합하다.
|
||||
|
||||
RSM은 특히 설계변수 범위가 좁고 응답이 단조롭고 매끄러울 때 유용하다.
|
||||
|
||||
## 구현 선택
|
||||
이 튜토리얼에서는 scikit-learn의 `PolynomialFeatures`와 `Ridge`를 조합한다.
|
||||
|
||||
```text
|
||||
StandardScaler
|
||||
-> PolynomialFeatures(degree=2, include_bias=False)
|
||||
-> Ridge(alpha=...)
|
||||
```
|
||||
|
||||
`PolynomialFeatures`는 입력 변수의 다항 조합을 만들고, `Ridge`는 L2 regularization으로 계수 크기를 제어한다. 일반 선형회귀 대신 Ridge를 쓰는 이유는 다항 feature가 늘어나면 feature 간 상관성이 커지고 계수가 불안정해질 수 있기 때문이다.
|
||||
|
||||
## Notebook 실습 포인트
|
||||
`notebooks/01_response_surface_surrogate.ipynb`는 다음을 보여준다.
|
||||
|
||||
1. 동일 FEM dataset 로드.
|
||||
2. target `tip_uy_m` 선택.
|
||||
3. degree 1, 2, 3 비교.
|
||||
4. Ridge `alpha` 변화에 따른 train/test error 비교.
|
||||
5. parity plot과 residual plot.
|
||||
6. 다항 feature 이름과 계수 크기 해석.
|
||||
|
||||
## 장점
|
||||
- 학습과 예측이 매우 빠르다.
|
||||
- 작은 데이터에서 baseline으로 좋다.
|
||||
- 변수 간 interaction을 명시적으로 볼 수 있다.
|
||||
- extrapolation이 tree model보다 연속적이다.
|
||||
|
||||
## 한계와 실패 모드
|
||||
- 실제 응답이 강하게 비선형이면 낮은 차수 다항식으로 부족하다.
|
||||
- 높은 차수는 과적합과 수치 불안정을 만든다.
|
||||
- 입력 scaling 없이 다항 feature를 만들면 큰 단위의 변수가 학습을 지배할 수 있다.
|
||||
- 설계공간 경계 밖에서는 다항식이 물리적으로 말이 안 되는 큰 값을 낼 수 있다.
|
||||
|
||||
## 구조해석 해석 기준
|
||||
RSM이 좋은 선택인 경우:
|
||||
|
||||
- 설계변수 수가 적다.
|
||||
- 입력 범위가 좁다.
|
||||
- 응답이 매끄럽고 단조적이다.
|
||||
- 설명 가능한 surrogate가 중요하다.
|
||||
|
||||
RSM을 피해야 하는 경우:
|
||||
|
||||
- 응답에 threshold, discontinuity, contact-like behavior가 있다.
|
||||
- 입력 범위가 넓고 상호작용이 복잡하다.
|
||||
- 국소 응력 peak처럼 고차 비선형성이 크다.
|
||||
|
||||
## References
|
||||
- Box, G. E. P. and Wilson, K. B. (1951), "On the Experimental Attainment of Optimum Conditions", Journal of the Royal Statistical Society Series B. https://doi.org/10.1111/j.2517-6161.1951.tb00067.x
|
||||
- scikit-learn `PolynomialFeatures` documentation. https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.PolynomialFeatures.html
|
||||
- scikit-learn `Ridge` documentation. https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.Ridge.html
|
||||
@@ -0,0 +1,86 @@
|
||||
# Gaussian Process Regression and Kriging
|
||||
|
||||
## 핵심 아이디어
|
||||
Gaussian Process Regression(GPR)은 함수값을 확률변수로 보고, 입력 위치 사이의 상관관계를 kernel로 정의한다. Engineering design 분야에서는 Kriging이라는 이름으로 널리 사용된다.
|
||||
|
||||
GPR은 예측 평균뿐 아니라 예측 표준편차를 제공한다.
|
||||
|
||||
```text
|
||||
y(x) ~ GP(m(x), k(x, x'))
|
||||
```
|
||||
|
||||
- `m(x)`: mean function.
|
||||
- `k(x, x')`: covariance function 또는 kernel.
|
||||
- 예측 결과: `mean`, `standard deviation`.
|
||||
|
||||
## FEM surrogate에서의 의미
|
||||
FEM 해석 데이터는 deterministic한 computer experiment인 경우가 많다. 같은 입력을 넣으면 같은 출력이 나온다. 이런 상황에서 GPR/Kriging은 적은 해석점으로 매끄러운 응답면을 만들고, 학습점에서 먼 영역의 불확실성을 크게 줄 수 있어 surrogate 신뢰도 설명에 유리하다.
|
||||
|
||||
Sacks et al.의 computer experiment 연구는 계산 모델 입력과 출력 사이의 응답을 stochastic process로 모델링하는 관점을 제시했다. Rasmussen과 Williams의 GPML은 Gaussian process의 수학적 기반과 kernel 관점을 체계적으로 설명한다.
|
||||
|
||||
## 구현 선택
|
||||
이 튜토리얼에서는 다음 kernel을 기본으로 사용한다.
|
||||
|
||||
```text
|
||||
ConstantKernel * RBF + WhiteKernel
|
||||
```
|
||||
|
||||
- `ConstantKernel`: 응답 scale.
|
||||
- `RBF`: 입력 공간에서 가까운 점은 비슷한 응답을 가진다는 smoothness 가정.
|
||||
- `WhiteKernel`: 수치 noise 또는 모델 불일치 허용.
|
||||
|
||||
Notebook pipeline:
|
||||
|
||||
```text
|
||||
StandardScaler
|
||||
-> GaussianProcessRegressor(kernel=..., normalize_y=True)
|
||||
```
|
||||
|
||||
## Hyperparameter 의미
|
||||
- `length_scale`: 각 입력 방향에서 함수가 얼마나 빨리 변하는지 나타낸다.
|
||||
- `noise_level`: 해석 데이터의 noise 또는 모델 불일치 허용량이다.
|
||||
- `alpha`: numerical stability를 위한 diagonal jitter로 사용할 수 있다.
|
||||
- `n_restarts_optimizer`: kernel hyperparameter 최적화의 local optimum 위험을 줄인다.
|
||||
|
||||
## Notebook 실습 포인트
|
||||
`notebooks/02_gaussian_process_kriging_surrogate.ipynb`는 다음을 보여준다.
|
||||
|
||||
1. 동일 dataset과 split 로드.
|
||||
2. RBF kernel 기반 GPR 학습.
|
||||
3. 예측 평균과 표준편차 계산.
|
||||
4. parity plot에 uncertainty band 또는 error coloring 추가.
|
||||
5. 입력 공간에서 학습점과 먼 샘플의 uncertainty 확인.
|
||||
6. 학습 sample 수 증가에 따른 RMSE와 예측 표준편차 변화.
|
||||
|
||||
## 장점
|
||||
- 작은 데이터에서 강력하다.
|
||||
- 예측 uncertainty를 제공한다.
|
||||
- Smooth response surface에 적합하다.
|
||||
- Bayesian optimization과 active learning으로 확장하기 좋다.
|
||||
|
||||
## 한계와 실패 모드
|
||||
- 기본 exact GPR은 학습 데이터 수가 커지면 계산 비용이 급격히 증가한다.
|
||||
- Kernel 선택이 성능을 크게 좌우한다.
|
||||
- 입력 scaling이 중요하다.
|
||||
- 고차원 입력에서는 length scale 학습이 불안정할 수 있다.
|
||||
- 예측 표준편차는 모델 가정 하의 불확실성이지, 모든 물리 오류를 보장하지 않는다.
|
||||
|
||||
## 구조해석 해석 기준
|
||||
GPR/Kriging이 좋은 선택인 경우:
|
||||
|
||||
- FEM 해석이 비싸고 sample 수가 작다.
|
||||
- 응답이 매끄럽다.
|
||||
- uncertainty 기반 추가 샘플링을 설명하고 싶다.
|
||||
- 설계공간 탐색에서 신뢰도 경고가 필요하다.
|
||||
|
||||
주의할 경우:
|
||||
|
||||
- sample 수가 수천 개 이상이다.
|
||||
- 응답이 불연속적이다.
|
||||
- 입력 차원이 많고 상호작용이 복잡하다.
|
||||
|
||||
## References
|
||||
- Sacks, J., Welch, W. J., Mitchell, T. J., and Wynn, H. P. (1989), "Design and Analysis of Computer Experiments", Statistical Science. https://doi.org/10.1214/ss/1177012413
|
||||
- Sacks, J., Schiller, S. B., and Welch, W. J. (1989), "Designs for Computer Experiments", Technometrics. https://doi.org/10.1080/00401706.1989.10488474
|
||||
- Rasmussen, C. E. and Williams, C. K. I. (2006), Gaussian Processes for Machine Learning. https://gaussianprocess.org/gpml/chapters/RW.pdf
|
||||
- scikit-learn Gaussian Process documentation. https://scikit-learn.org/stable/modules/gaussian_process.html
|
||||
@@ -0,0 +1,76 @@
|
||||
# Random Forest Surrogate
|
||||
|
||||
## 핵심 아이디어
|
||||
Random Forest는 여러 decision tree를 bootstrap sample로 학습하고 평균하여 예측하는 ensemble 모델이다. 각 tree는 입력 공간을 여러 영역으로 나누고, 회귀 문제에서는 leaf의 평균값을 예측한다.
|
||||
|
||||
```text
|
||||
\hat{f}(x) = (1 / T) sum_{t=1}^{T} h_t(x)
|
||||
```
|
||||
|
||||
- `T`: tree 개수.
|
||||
- `h_t`: 개별 regression tree.
|
||||
|
||||
Breiman의 2001년 Random Forest 논문은 bagging과 random feature selection을 결합한 ensemble 방법을 제시했다.
|
||||
|
||||
## FEM surrogate에서의 의미
|
||||
Random Forest는 비선형성과 변수 상호작용을 명시적 feature engineering 없이 포착할 수 있다. Beam surrogate에서는 `h`, `b`, `L`, `P`, `E`의 비선형 영향과 interaction을 빠르게 잡는 비교 모델로 좋다.
|
||||
|
||||
## 구현 선택
|
||||
이 튜토리얼에서는 scikit-learn의 `RandomForestRegressor`를 사용한다.
|
||||
|
||||
기본 설정 예:
|
||||
|
||||
```text
|
||||
RandomForestRegressor(
|
||||
n_estimators=300,
|
||||
max_depth=None,
|
||||
min_samples_leaf=2,
|
||||
random_state=20260521,
|
||||
n_jobs=-1
|
||||
)
|
||||
```
|
||||
|
||||
Tree model은 feature scaling이 필수는 아니지만, 다른 모델과 공통 전처리 구조를 설명하기 위해 입력 column 관리는 동일하게 유지한다.
|
||||
|
||||
## Notebook 실습 포인트
|
||||
`notebooks/03_random_forest_surrogate.ipynb`는 다음을 보여준다.
|
||||
|
||||
1. 동일 dataset과 split 로드.
|
||||
2. `n_estimators`, `max_depth`, `min_samples_leaf` 영향 비교.
|
||||
3. test metric 계산.
|
||||
4. parity plot과 residual plot.
|
||||
5. permutation importance로 입력 변수 영향 확인.
|
||||
6. feature importance와 beam 물리 관계 비교.
|
||||
|
||||
## 장점
|
||||
- scaling에 덜 민감하다.
|
||||
- 비선형성과 interaction을 잘 포착한다.
|
||||
- outlier에 비교적 튼튼하다.
|
||||
- feature importance를 계산하기 쉽다.
|
||||
- 학습이 안정적이고 baseline으로 좋다.
|
||||
|
||||
## 한계와 실패 모드
|
||||
- 예측이 piecewise constant라 매끄러운 응답면이 필요한 경우 부자연스러울 수 있다.
|
||||
- 학습 데이터 범위 밖으로 외삽하지 못한다.
|
||||
- 물리적으로 단조여야 하는 관계를 자동으로 보장하지 않는다.
|
||||
- uncertainty는 GPR처럼 원래 제공되는 개념이 아니다.
|
||||
- feature importance는 correlated feature에서 오해될 수 있다.
|
||||
|
||||
## 구조해석 해석 기준
|
||||
Random Forest가 좋은 선택인 경우:
|
||||
|
||||
- 빠르고 안정적인 비선형 baseline이 필요하다.
|
||||
- 변수 중요도 분석을 보고 싶다.
|
||||
- 데이터가 중간 규모 이상이다.
|
||||
- target이 매끄러운 global response다.
|
||||
|
||||
주의할 경우:
|
||||
|
||||
- 설계 최적화에서 매끄러운 gradient-like response가 필요하다.
|
||||
- 외삽이 필요하다.
|
||||
- 응답면의 국소 smoothness가 중요하다.
|
||||
|
||||
## References
|
||||
- Breiman, L. (2001), "Random Forests", Machine Learning, 45, 5-32. https://doi.org/10.1023/A:1010933404324
|
||||
- CiNii bibliographic record for Breiman (2001). https://cir.nii.ac.jp/crid/1360574092892023168
|
||||
- scikit-learn `RandomForestRegressor` documentation. https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestRegressor.html
|
||||
@@ -0,0 +1,77 @@
|
||||
# Gradient Boosting Surrogate
|
||||
|
||||
## 핵심 아이디어
|
||||
Gradient Boosting은 약한 예측기, 보통 shallow decision tree를 순차적으로 더해 손실함수를 줄이는 additive model이다. 각 단계의 tree는 이전 모델의 오차를 보정하는 방향으로 학습된다.
|
||||
|
||||
```text
|
||||
F_M(x) = F_0(x) + sum_{m=1}^{M} nu h_m(x)
|
||||
```
|
||||
|
||||
- `F_M`: 최종 모델.
|
||||
- `h_m`: m번째 weak learner.
|
||||
- `nu`: learning rate.
|
||||
|
||||
Friedman의 2001년 논문은 gradient boosting machine을 함수공간에서의 greedy approximation으로 설명한다.
|
||||
|
||||
## FEM surrogate에서의 의미
|
||||
Gradient Boosting은 Random Forest보다 bias를 더 적극적으로 줄이는 경우가 많다. Beam surrogate에서 낮은 차수 RSM이 놓치는 비선형성을 tree ensemble이 순차적으로 보정할 수 있다.
|
||||
|
||||
## 구현 선택
|
||||
이 튜토리얼에서는 scikit-learn의 `GradientBoostingRegressor`를 사용한다.
|
||||
|
||||
기본 설정 예:
|
||||
|
||||
```text
|
||||
GradientBoostingRegressor(
|
||||
loss="squared_error",
|
||||
learning_rate=0.05,
|
||||
n_estimators=300,
|
||||
max_depth=3,
|
||||
subsample=0.9,
|
||||
random_state=20260521
|
||||
)
|
||||
```
|
||||
|
||||
`learning_rate`와 `n_estimators`는 함께 조정해야 한다. 작은 learning rate는 더 많은 tree를 요구하지만 과적합을 완화할 수 있다.
|
||||
|
||||
## Notebook 실습 포인트
|
||||
`notebooks/04_gradient_boosting_surrogate.ipynb`는 다음을 보여준다.
|
||||
|
||||
1. 동일 dataset과 split 로드.
|
||||
2. `learning_rate`와 `n_estimators` tradeoff.
|
||||
3. staged prediction으로 train/test error curve 확인.
|
||||
4. parity plot과 residual plot.
|
||||
5. permutation importance 또는 built-in feature importance 비교.
|
||||
6. Random Forest와 오차 패턴 비교.
|
||||
|
||||
## 장점
|
||||
- tabular regression에서 높은 성능을 내기 쉽다.
|
||||
- 비선형성과 interaction을 잘 포착한다.
|
||||
- model size와 성능의 tradeoff를 조절하기 쉽다.
|
||||
- staged prediction으로 과적합 진행을 관찰할 수 있다.
|
||||
|
||||
## 한계와 실패 모드
|
||||
- hyperparameter에 Random Forest보다 민감하다.
|
||||
- noise가 큰 데이터에서는 오차를 과도하게 따라갈 수 있다.
|
||||
- tree 기반 모델이므로 외삽은 약하다.
|
||||
- 학습 순서가 sequential하므로 Random Forest보다 병렬화 이점이 작다.
|
||||
- 너무 복잡한 설정은 교육용 notebook을 흐리게 만들 수 있다.
|
||||
|
||||
## 구조해석 해석 기준
|
||||
Gradient Boosting이 좋은 선택인 경우:
|
||||
|
||||
- 정확도가 중요한 tabular surrogate가 필요하다.
|
||||
- 입력 변수 수가 적거나 중간 규모다.
|
||||
- 해석 응답이 비선형이지만 불연속은 아니다.
|
||||
- 최종 비교에서 강한 classical ML baseline이 필요하다.
|
||||
|
||||
주의할 경우:
|
||||
|
||||
- uncertainty가 핵심 요구사항이다.
|
||||
- 모델 해석성이 RSM 수준으로 필요하다.
|
||||
- 데이터 수가 매우 적다.
|
||||
|
||||
## References
|
||||
- Friedman, J. H. (2001), "Greedy Function Approximation: A Gradient Boosting Machine", The Annals of Statistics. https://doi.org/10.1214/aos/1013203451
|
||||
- CiNii bibliographic record for Friedman (2001). https://cir.nii.ac.jp/crid/1360292617909870720
|
||||
- scikit-learn `GradientBoostingRegressor` documentation. https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.GradientBoostingRegressor.html
|
||||
@@ -0,0 +1,90 @@
|
||||
# MLP Neural Network Surrogate
|
||||
|
||||
## 핵심 아이디어
|
||||
Multi-layer Perceptron(MLP)은 affine transform과 nonlinear activation을 여러 층으로 쌓아 입력과 출력의 비선형 관계를 학습한다.
|
||||
|
||||
단일 hidden layer MLP는 다음처럼 표현할 수 있다.
|
||||
|
||||
```text
|
||||
\hat{y} = W_2 phi(W_1 x + b_1) + b_2
|
||||
```
|
||||
|
||||
- `x`: scaling된 입력.
|
||||
- `phi`: activation function.
|
||||
- `W`, `b`: 학습되는 weight와 bias.
|
||||
|
||||
Cybenko의 universal approximation theorem은 충분한 hidden unit을 가진 신경망이 넓은 함수군을 근사할 수 있음을 보인 고전적 결과다. 다만 "근사 가능하다"는 말이 적은 데이터에서 항상 잘 학습된다는 뜻은 아니다.
|
||||
|
||||
## FEM surrogate에서의 의미
|
||||
MLP는 beam 응답처럼 매끄러운 비선형 함수를 학습할 수 있다. 그러나 데이터 수, scaling, regularization, optimization 설정에 민감하다. 이 튜토리얼에서는 deep learning framework를 도입하지 않고 scikit-learn의 `MLPRegressor`로 작은 neural surrogate의 특성을 보여준다.
|
||||
|
||||
## 구현 선택
|
||||
기본 pipeline:
|
||||
|
||||
```text
|
||||
StandardScaler
|
||||
-> TransformedTargetRegressor(
|
||||
regressor=MLPRegressor(...),
|
||||
transformer=StandardScaler()
|
||||
)
|
||||
```
|
||||
|
||||
추천 기본 설정:
|
||||
|
||||
```text
|
||||
MLPRegressor(
|
||||
hidden_layer_sizes=(64, 32),
|
||||
activation="relu",
|
||||
solver="adam",
|
||||
alpha=1e-4,
|
||||
learning_rate_init=1e-3,
|
||||
early_stopping=True,
|
||||
max_iter=2000,
|
||||
random_state=20260521
|
||||
)
|
||||
```
|
||||
|
||||
입력뿐 아니라 target scaling도 중요하다. FEM 응답은 단위와 scale이 크게 다를 수 있기 때문이다.
|
||||
|
||||
## Notebook 실습 포인트
|
||||
`notebooks/05_mlp_surrogate.ipynb`는 다음을 보여준다.
|
||||
|
||||
1. 동일 dataset과 split 로드.
|
||||
2. 입력 scaling과 target scaling의 효과.
|
||||
3. hidden layer 크기 비교.
|
||||
4. train/test learning curve.
|
||||
5. parity plot과 residual plot.
|
||||
6. RSM, GPR, tree ensemble 대비 MLP의 장단점 정리.
|
||||
|
||||
## 장점
|
||||
- 매끄러운 비선형 함수 근사에 적합하다.
|
||||
- 다중 출력 surrogate로 확장하기 쉽다.
|
||||
- 충분한 데이터와 tuning이 있으면 복잡한 관계를 학습할 수 있다.
|
||||
- 동일 pipeline 구조로 다른 neural framework로 확장 가능하다.
|
||||
|
||||
## 한계와 실패 모드
|
||||
- 작은 데이터에서는 과적합하거나 불안정할 수 있다.
|
||||
- scaling 없이 학습하면 convergence가 나빠질 수 있다.
|
||||
- hyperparameter 선택이 성능에 큰 영향을 준다.
|
||||
- GPR처럼 기본 uncertainty를 제공하지 않는다.
|
||||
- 모델 해석성이 낮다.
|
||||
|
||||
## 구조해석 해석 기준
|
||||
MLP가 좋은 선택인 경우:
|
||||
|
||||
- 데이터 수가 충분하다.
|
||||
- 응답이 매끄럽지만 단순 다항식으로 부족하다.
|
||||
- 다중 출력 또는 복잡한 feature representation 확장을 고려한다.
|
||||
- 최종 정확도가 중요하고 해석성 요구가 낮다.
|
||||
|
||||
주의할 경우:
|
||||
|
||||
- sample 수가 매우 작다.
|
||||
- 예측 불확실성이 중요하다.
|
||||
- 실험자가 scaling과 validation을 엄격히 관리하기 어렵다.
|
||||
|
||||
## References
|
||||
- Cybenko, G. (1989), "Approximation by Superpositions of a Sigmoidal Function", Mathematics of Control, Signals, and Systems. https://doi.org/10.1007/BF02551274
|
||||
- CiNii bibliographic record for Cybenko (1989). https://cir.nii.ac.jp/crid/1361981471344652032
|
||||
- Glorot, X. and Bengio, Y. (2010), "Understanding the difficulty of training deep feedforward neural networks", AISTATS. https://proceedings.mlr.press/v9/glorot10a.html
|
||||
- scikit-learn `MLPRegressor` documentation. https://scikit-learn.org/stable/modules/generated/sklearn.neural_network.MLPRegressor.html
|
||||
Reference in New Issue
Block a user