AI 자동 매매 시스템 개발 과정 (파트 2: 학습 과정 및 결과 분석)
이 글은 파트 1: AutoTrain(파인 튜닝) 및 데이터 준비에 이어지는 내용으로, 실제 모델 학습 과정과 결과를 다룹니다.
학습 파라미터 설정
모델 학습에 사용된 파라미터들은 AI 성능에 직접적인 영향을 미치는 중요한 요소입니다. 각 파라미터의 역할과 설정 이유를 상세히 살펴보겠습니다.
기본 학습 설정
1. 채팅 템플릿
- 설정값: none (일반 텍스트 형식으로 학습)
- 설명:
- LLM을 채팅 형태로 fine-tuning할 때, 사용자/시스템 프롬프트를 어떻게 포맷팅할지 결정합니다.
- 예: Alpaca 형식(
### Instruction: {instruction}\n\n### Response:
), Vicuna 형식, ChatGPT 형식 등이 있습니다. - "none"으로 설정한 이유: 자동 매매 시스템은 대화형 인터페이스가 아닌 데이터 기반 예측에 중점을 두기 때문입니다.
2. 혼합 정밀도(Mixed Precision)
- 설정값: fp16 (16비트 부동소수점)
- 자세한 비교:
정밀도 유형 | 비트 수 | 데이터 범위 | 주요 특징 | 적합한 상황 |
---|---|---|---|---|
fp32 | 32비트 | 넓음 | 정확도 높음, 메모리 많이 사용 | 높은 정확도가 필수적인 경우 |
fp16 | 16비트 | 제한적 | 메모리 절반 사용, 속도 향상, overflow 위험 | 일반적인 학습, 메모리 제약 상황 |
bf16 | 16비트 | fp32와 유사 | fp32의 범위 + fp16의 효율성, 최신 GPU 필요 | 정확도와 효율성 모두 중요한 경우 |
- fp16 vs bf16 심층 비교:
- fp16(Float16): IEEE 754 표준의 16비트 부동소수점 형식
- 구조: 1비트(부호) + 5비트(지수) + 10비트(가수)
- 장점: 메모리 사용량 절반, 계산 속도 향상
- 단점: 숫자 표현 범위가 제한되어 학습 중 gradient explosion이나 vanishing gradient 문제 발생 가능
- bf16(BFloat16): 구글이 개발한 16비트 부동소수점 형식
- 구조: 1비트(부호) + 8비트(지수) + 7비트(가수)
- 장점: fp32와 동일한 범위 표현 가능, 오버플로우 위험 감소
- 단점: 일부 최신 GPU에서만 하드웨어 지원 (A100, TPU 등)
- fp16(Float16): IEEE 754 표준의 16비트 부동소수점 형식
- 선택 이유: 하드웨어 호환성과 메모리 효율성을 고려해 fp16 선택
3. PEFT/LoRA 및 QLoRA
- 설정값: true (전체 모델 대신 저랭크 매트릭스만 학습)
- 개념 설명:
- PEFT(Parameter-Efficient Fine-Tuning): 전체 모델 대신 일부 파라미터만 학습시켜 효율성 높이는 기법
- LoRA(Low-Rank Adaptation): 가중치 행렬을 저랭크 분해하여 적은 파라미터로 효과적인 학습 가능
- LoRA의 작동 원리:
원본 가중치 행렬 W → W + ∆W 여기서 ∆W = A × B (A와 B는 저랭크 행렬)
- LoRA vs QLoRA 비교:
특성 | LoRA | QLoRA |
---|---|---|
기본 모델 처리 | 원본 정밀도 유지 | 4/8비트로 양자화 |
메모리 효율성 | 중간 | 매우 높음 |
학습 가능 모델 크기 | 중간 규모 | 더 큰 모델 가능 |
구현 복잡성 | 낮음 | 중간 |
최소 필요 VRAM | 16-24GB | 8-12GB |
- 활용 이유: 32B 대형 모델을 제한된 GPU 리소스로 효율적으로 학습하기 위함
학습률 및 최적화 설정
1. 스케줄러
- 설정값: adamw_torch (AdamW 옵티마이저 기반)
- 스케줄러의 역할: 학습 과정에서 학습률(learning rate)을 동적으로 조절하여 최적화 과정을 개선
- 주요 스케줄러 상세 비교:
스케줄러 | 핵심 특징 | 수학적 원리 | 장점 | 단점 | 적합한 상황 |
---|---|---|---|---|---|
linear | 선형적 학습률 감소 | lr = start_lr - (start_lr - end_lr) × (current_step / total_steps) | 단순하고 예측 가능 | 초기 빠른 학습에 비효율적 | 안정적 학습 필요 시 |
cosine | 코사인 함수 형태로 감소 | lr = end_lr + 0.5 × (start_lr - end_lr) × (1 + cos(π × current_step / total_steps)) | 초반 완만, 중간 빠르게, 후반 완만하게 감소 | 파라미터 조정 필요 | LLM 파인튜닝에 널리 사용 |
constant | 일정한 학습률 유지 | lr = start_lr | 구현 간단, 예측 가능 | 후반부 불안정 가능 | 짧은 학습, 사전 실험 |
adamw_torch | AdamW 옵티마이저와 연동 | 적응적 학습률 + 가중치 감쇠 | 다양한 데이터에 적응적 | 메모리 사용량 증가 | 복잡한 데이터셋 |
polynomial | 다항식 함수로 감소 | lr = end_lr + (start_lr - end_lr) × (1 - current_step / total_steps)^power | 감소 곡선 조절 가능 | 추가 하이퍼파라미터 필요 | 세밀한 조절 필요 시 |
- 프로젝트 변경 사항: 초기 adamw_torch에서 최종적으로 linear 스케줄러로 변경하여 안정성 확보
2. 학습률(Learning Rate)
- 설정값: 0.0003 (3e-4)
- 역할: 각 학습 단계에서 모델 가중치를 얼마나 크게 업데이트할지 결정
- 선택 기준:
- 너무 큰 값: 학습이 수렴하지 않거나 발산할 수 있음
- 너무 작은 값: 학습이 매우 느리거나 지역 최소값에 갇힐 수 있음
- 3e-4는 NLP 모델 파인튜닝에서 자주 사용되는 초기값
배치 및 시퀀스 설정
1. 블록 크기(Block Size)
- 설정값: 1024 (한 번에 처리할 최대 토큰 수)
- 시각적 이해:
[토큰1, 토큰2, ..., 토큰1024] → 모델 → 예측
- 블록 크기 선택의 트레이드오프:
- 크게 설정 (예: 2048)
- 장점: 더 넓은 문맥 정보 활용, 장기 패턴 인식 향상
- 단점: 메모리 사용량 2배 증가, 학습 속도 저하
- 작게 설정 (예: 512)
- 장점: 메모리 효율성 증가, 학습 속도 2배 향상
- 단점: 문맥 정보 손실, 장기 패턴 인식 제한
- 크게 설정 (예: 2048)
- 암호화폐 트레이딩 관점: 과거 n개 데이터 포인트를 보고 다음 움직임 예측하는 형태로, 적절한 문맥 범위 설정 중요
2. 배치 크기와 기울기 누적
- 배치 크기: 5 (한 번의 학습 스텝에서 처리할 샘플 수)
- 기울기 누적: 4 (여러 배치의 기울기를 누적한 후 가중치 업데이트)
- 유효 배치 크기 = 배치 크기 × 기울기 누적 횟수 = 5 × 4 = 20
- 작동 방식 시각화:
배치 1 → 기울기 계산 (저장만 하고 업데이트는 안 함) 배치 2 → 기울기 계산 + 배치 1 기울기 (저장) 배치 3 → 기울기 계산 + 배치 2 누적 기울기 (저장) 배치 4 → 기울기 계산 + 배치 3 누적 기울기 (이 누적된 기울기로 모델 업데이트)
- 설정 변화: 초기 값인 기울기 누적 1024는 극단적으로 큰 값이었으며, 4로 대폭 감소시켜 학습 효율성 크게 향상
3. 에폭(Epochs)
- 설정값: 2 (전체 데이터셋 반복 학습 횟수)
- LLM 파인튜닝 특성: 대형 언어 모델은 일반적으로 적은 에폭만으로도 특정 도메인에 효과적으로 적응
LoRA 상세 설정
1. 타겟 모듈(Target Modules)
- 설정값: q_proj, k_proj, v_proj (특정 어텐션 레이어만 타겟팅)
- 트랜스포머 모델의 핵심 컴포넌트:
모듈 이름 | 역할 | 학습 효과 |
---|---|---|
q_proj (Query) | 검색할 정보 정의 | 무엇을 찾을지 학습 |
k_proj (Key) | 검색 대상 정보 정의 | 어디서 찾을지 학습 |
v_proj (Value) | 실제 정보 값 저장 | 찾은 정보를 어떻게 해석할지 학습 |
MLP/FFN | 고차원 특성 추출 | 복잡한 패턴 학습 |
타겟 모듈 선택 전략:
어텐션 메커니즘 구조 (Q, K, V)
+-------------+ +-------------+ +-------------+
| Query(Q) | | Key(K) | | Value(V) |
| 벡터 생성 | | 벡터 생성 | | 벡터 생성 |
+-------------+ +-------------+ +-------------+
| | |
v v |
| | |
+---------->+---------------+ |
| Q·K^T 연산 | |
| (유사도 계산) | |
+---------------+ |
| |
v |
+---------------+ |
| Softmax | |
| (가중치화) | |
+---------------+ |
| |
v v
+-----------+---------------+
|
+------------+
| 어텐션 출력 |
+------------+
트랜스포머 모델에서 QKV 모듈의 학습이 미치는 영향:
타겟 모듈 | 학습되는 능력 | 계산량 영향 | 파라미터 수 |
---|---|---|---|
Q_proj | 검색 패턴 학습 | 낮음 | 약 33% |
K_proj | 키 패턴 학습 | 낮음 | 약 33% |
V_proj | 값 변환 학습 | 낮음 | 약 33% |
전체 모델 | 모든 패턴 학습 | 매우 높음 | 100% |
- 최적화 선택: 어텐션 메커니즘(Q, K, V)만 학습하면 전체 모델을 학습하는 것보다 파라미터 수가 약 1/4로 감소하면서도 효과적인 성능 유지
2. LoRA 하이퍼파라미터
- lora_r: 16 (저랭크 차원)
- lora_alpha: 16 (스케일링 파라미터)
- lora_dropout: 0.05 (드롭아웃 비율)
작동 원리 설명:
- 원래 가중치 W ∈ ℝ^(d×k)를 직접 업데이트하는 대신
- 두 개의 작은 행렬 A ∈ ℝ^(d×r), B ∈ ℝ^(r×k) (여기서 r ≪ min(d,k))을 학습
- 최종 계산: W + ∆W = W + A×B
조정된 가중치 영향력: (lora_alpha/lora_r) × A×B
학습 과정에서의 문제점과 해결 방안
발생한 문제점
- 학습 시간과 비용 문제: 초기 설정으로는 학습 시간이 지나치게 오래 걸리는 문제가 발생했습니다.
- 예상 학습 시간: 3,000시간 이상
- 예상 비용: $0.8/hour * 3,000시간 = $2,400 (약 352만원)
- 이는 프로젝트 예산을 크게 초과하는 금액이었습니다.
해결 방안
1. 하드웨어 사양 변경
- 변경 전: Nvidia 1xL4 · 8 vCPU · 30 GB · $0.80/hour
- 변경 후: Nvidia A10G large · 12 vCPU · 46 GB · $1.50/hour
- 개선 효과: 시간당 비용은 증가했지만, GPU 연산 능력 향상으로 총 학습 시간 단축
GPU 비교:
| 스펙 | NVIDIA L4 | NVIDIA A10G |
|------|-----------|-------------|
| CUDA 코어 | 7,424 | 9,216 |
| 메모리 | 24GB GDDR6 | 24GB GDDR6 |
| 메모리 대역폭 | 300 GB/s | 600 GB/s |
| 텐서 코어 | 232 TFLOPs | 149.7 TFLOPs |
| 전력 소비 | 72W | 300W |
2. 학습 파라미터 최적화
- 학습 종료 후 생성된 training_params.json을 통해 최적화된 파라미터를 확인할 수 있었습니다.
- 주요 변경 파라미터:
{
"model": "deepseek-ai/DeepSeek-R1-Distill-Qwen-32B",
"project_name": "autotrain-Batch5",
"data_path": "kor-kms/2024_second_half",
"add_eos_token": true,
"block_size": 512, // 1024에서 512로 축소
"model_max_length": 2048,
"mixed_precision": "fp16",
"lr": 0.0001, // 0.0003에서 0.0001로 조정
"epochs": 2, // 에폭 수 축소
"batch_size": 5, // 배치 크기 명시적 설정
"gradient_accumulation": 4, // 1024에서 4로 대폭 축소
"optimizer": "adamw_torch",
"scheduler": "linear", // 선형 스케줄러 사용
"chat_template": "none",
"quantization": "int4", // 4비트 양자화 적용
"target_modules": "q_proj, k_proj, v_proj", // 특정 어텐션 모듈만 타겟팅
"peft": true,
"lora_r": 16, // LoRA 랭크 설정
"lora_alpha": 16, // LoRA 알파 설정
"lora_dropout": 0.05, // LoRA 드롭아웃 설정
"unsloth": false
}
```
이러한 파라미터 최적화를 통해:
- 블록 크기 축소: 1024 → 512로 메모리 효율성 증가
- 기울기 누적 대폭 감소: 1024 → 4로 학습 속도 크게 향상
- int4 양자화: 모델 크기 8배 축소, 메모리 효율성 대폭 증가
- 타겟 모듈 최적화: 어텐션 메커니즘 핵심 부분만 학습
- LoRA 하이퍼파라미터 조정: 모델 성능과 계산 효율성 균형 유지
이러한 변경으로 예상 학습 시간을 3,000시간에서 약 100시간으로 대폭 단축할 수 있었습니다.
3. 소형 모델 활용 검토
- 대규모 모델(32B)의 단점: 학습 비용과 시간이 기하급수적으로 증가
- 소형 모델 옵션:
- 7B 파라미터 모델: 기본 모델 대비 약 1/4 크기, 학습 시간 및 비용 크게 절감
- 14B 파라미터 모델: 중간 규모, 32B 모델 대비 절반 이하의 리소스로 학습 가능
- 모델 크기별 리소스 소요 분석:
모델 크기 | 메모리 요구량 | 상대적 학습 시간 | 비용 효율성 | 성능 예상 |
---|---|---|---|---|
7B | ~12GB | 1x | ★★★★★ | 적절한 데이터로 도메인 특화 시 우수 |
14B | ~24GB | 2x | ★★★★ | 복잡한 패턴 인식 가능, 비용 효율적 |
32B | ~48GB+ | 5x | ★★ | 가장 뛰어난 패턴 인식, 비용 비효율적 |
70B+ | ~100GB+ | 12x | ★ | 범용성 뛰어나지만 특화 학습 비효율적 |
- 이번 프로젝트의 선택: 32B 모델을 최적화하여 진행했지만, 향후 7B/14B 모델 검토 계획
학습 결과
학습 후 성능 평가
학습이 완료된 모델은 다음과 같은 지표로 평가할 예정입니다:
- 실제 시장 데이터에서의 예측 정확도: 2022-2023년 데이터에 대한 예측 성능 테스트
- 매수/매도 시점 식별 정확도: 주요 추세 전환점 예측 정확도 평가
- 수익률 시뮬레이션 결과: 백테스트를 통한 가상 투자 수익률 계산
향후 계획
- 실제 학습된 모델을 ollama로 돌리는 작업
- 자동 매매 시스템과 연동하여 실시간 신호 생성 테스트
- 다양한 크기의 모델 성능 비교 테스트
- 더 많은 기술적 지표 및 파생상품 데이터 통합
주의사항
- 본 글은 학습 및 연구 목적으로 작성되었으며, 실제 투자에 활용 시 발생하는 어떠한 손실에 대해서도 책임지지 않습니다.
- 투자는 항상 본인의 책임 하에 신중하게 결정하시기 바랍니다.
- 해당 글은 직접 작성한 내용을 AI를 통해 가다듬는 방식으로 작성되었습니다.
- 해당 글의 예시 중 일부는 AI를 통해서 제작되었습니다.
'IT개발 > AI 공부' 카테고리의 다른 글
9. AI 자동 매매 시스템 개발 과정: 모델 병합 (0) | 2025.04.10 |
---|---|
8. 용어 설명: 디스크리트 액션 (1) | 2025.04.10 |
6. AI 자동 매매) 파트 1: AutoTrain(파인 튜닝) 및 데이터 준비 (1) | 2025.03.27 |
5. 추론 결과 가공 (4) | 2025.03.22 |
4. 로컬 LLM 구축하기 (2) | 2025.03.13 |