과제 5: 인터프리터와 역전파 학습 (Interpreter & Autograd)
마지막 관문입니다! 우리는 앞선 과제들을 통해 수학 엔진(HW2), 파서(HW3), 차원 검사기(HW4)를 모두 구축했습니다. 그러나 이 코드 트리(AST)들은 어떻게 평가되고 실행되어 훈련되는 것일까요?
이번 최종 과제에서는 AST 노드들을 순회하며 실제 텐서 값을 넣고 연산을 수행하는 명령어 처리기(Interpreter)와 기울기를 타고 내려와 파라미터를 업데이트하는 역전파(Autograd/Backward) 코어를 스스로 100% 통합 및 완성합니다.
1. 평가 코어 (Evaluation in Interpreter)
우리가 파싱한 노드 하나를 볼 때마다 실제로 무언가 액션을 실행해서 OCaml 상의 값(Value)을 만들어 내야 합니다.
eval env expr 시스템은 주어진 expr트리 형태를 따라 밑바닥부터 파고 들어간 뒤 연산들을 돌려줍니다.
예를 들어 Forward (m, x) AST 노드를 만났다면?
- 내부에 있는 모델 트리
m을 먼저 평가해 실제 행렬 세트 값 (VModel)을 뽑아냅니다. - 텐서 트리
x를 평가해 입력 텐서 값 (VTensor)을 뽑아냅니다. - 두 스칼라 덩어리를
forward_model이라는 순전파 함수에 태워 최종 예측값 벡터를 도출합니다!
2. 순전파 레이어 (Forward Pass)
코드 안에 존재하는 forward_model (m: model_val) (x: vec) 함수를 구현해야 합니다.
m이 선형 회귀(MLinear (w, b)) 일 때는 HW2에서 구현한 mat_vec_mul과 벡터 덧셈 연산을 이용해 $W imes x + b$ 수식을 OCaml로 표현하세요.
이 과정이 곧 딥러닝 1사이클에서의 예측값 추론 과정입니다.
3. 역전파 최적화 루프 (Backward Pass & SGD)
오차를 계산했다면 이젠 가중치들을 역추적하여 깎아내야(Gradient Descent, SGD) 합니다!
backward_model m x dy lr 함수에 출력부에서의 오차 미분값(dy)이 첫 인자로 진입합니다.
A. 연쇄 법칙 (Chain Rule for Linear Layer)
MLinear 층을 지날 때:
- 입력 기울기(Input gradient)인 $dx$ 는 수식 $dx = W^T \cdot dy$에 의해 계산되어 이전 층으로 반환(Return)해줘야 합니다.
- 가중치 기울기(Weight gradient)인 $dW$ 는 $dy \cdot x^T$(외적)에 의해 도출됩니다.
- 편향 기울기는 그대로 $db = dy$ 입니다.
B. 파라미터 업데이트의 불변성 딜레마
OCaml은 순수 함수 기반이라 MLinear 안의 행렬 데이터를 덧씌울 수 없습니다.
따라서 가중치를 뺴기 연산한 새로운 $ ext{new_W} = W - lr \cdot dW$ 모델 노드 자체를 아예 새롭게 통보하여 반환하는 형식으로 뼈대를 개조해야 합니다. (이 함수는 dx와 새로 업데이트된 Model 쌍을 반환해야 합니다!)
4. 모델 훈련 및 결과
모든 구현이 완벽하게 끝났다면 제공된 필기체(MNIST) 훈련 데이터셋과 테스트 셋을 돌려 정확도 테스트를 실행해 보실 수 있습니다! 이 과제에서 만든 신경망 엔진은 생각보다 정교해서 간단한 인식 작업을 훌륭히 수행합니다.
dune test
제출 안내
과제 폴더(전체 프로젝트)를 zip 파일로 압축하여 제출해 주시기 바랍니다.
또한, 터미널에서 dune test를 실행하여 모든 테스트가 통과한 결과 화면을 캡쳐하여 함께 첨부해 주세요.