# 학습 ## CLI - cli로 학습할 수 있는 쉘 스크립트를 작성한다. - argument - script_dir - working_dir - data_dir - train_data_count = 100 - validate_data_count = 20 - margin = 0.5 - validate_iterations = 5 ## 학습 모델 - **추천:** PyTorch 기반의 **Deep MLP** (Dropout 및 Weight Decay 필수 적용) - **과적합 방지 전략:** - **Dropout (0.3 ~ 0.5):** 학습 시 뉴런을 의도적으로 꺼서 특정 데이터 암기를 방지한다. - **L2 Regularization (Weight Decay):** 가중치가 비정상적으로 커지는 것을 막는다. - **Output Mapping:** 최종 출력에 `Sigmoid`를 걸고 (y * 11) + 1을 적용해 [1, 12] 범위를 강제한다. ## 학습 과정 1. `{data_dir}/tja`의 tja를 파싱한다. (`{script_dir}/parse.ts`) 2. `oni`와 `edit` course를 factorize하여 `{working_dir}/factors.json`에 저장한다. - 이미 존재하면 생략하되, Factor 로직 수정 시 삭제 후 재실행한다. 3. 데이터 표준화(Standardization)를 위한 스케일링 파라미터를 계산하고 `{working_dir}/scaler.json`에 저장한다. 4. **학습 단계:** 전체 데이터 중 `train_data_count`만큼 데이터를 랜덤하게 추출하여 학습을 진행한다. - `edit` 코스는 `ura`와 매칭하여 오차를 계산한다. - 모델이 충분히 수렴할 때까지 학습을 수행하며, 기존 모델 존재 시 가중치를 로드하여 업데이트한다. 5. **검증 단계:** 학습이 완료된 모델을 대상으로 아래 과정을 수행한다. - `validate_data_count`만큼의 데이터를 랜덤하게 추출하여 오차를 계산하고 `validate_result_{n}.csv`에 저장한다. - 이 과정을 `validate_iterations` 횟수만큼 반복한다. - **재시도 조건:** 검증 루프 도중 단 한 번이라도 Mean Absolute Error(MAE)가 `margin`보다 크다면, 즉시 검증을 중단하고 4번(학습 단계)으로 돌아가 데이터를 새로 샘플링하여 재학습한다. 6. **성공 및 종료:** 모든 `validate_iterations` 회차에서 MAE가 `margin` 이하일 경우에만 학습 성공으로 간주하고 최종 모델 파일을 저장한다. ### 유의 사항 - 모든 데이터는 `working_dir`에 저장한다. - Apple Silicon 환경에서 `mps` 디바이스를 할당하여 GPU 가속을 사용한다. # 예측 ## CLI - argument: `working_dir`, `tja`, `difficulty` (oni | edit) ## 예측 과정 - 로드된 모델과 학습 시 사용했던 스케일링 파라미터(Mean, Std)를 동일하게 적용하여 예측을 진행한다. # Factor ## 종류 - average_density: 평균 밀도 - peak_density: 최고 초당 밀도 - max_combo: 노트의 수 # Scripts - `parse.ts`: TJA 문자열을 `Course` 객체로 변환. - `factorize.ts`: `Course`를 입력받아 확장된 `Factor` 세트를 반환.