과제 4: 정적 차원 검사기 (Static Shape Checker)
파이토치(PyTorch)나 텐서플로우를 쓰면서 가장 많이 마주치게 되는 치명적인 에러가 무엇일까요? 바로 텐서끼리 곱하려는데 차원이 맞지 않아 프로그램이 그 즉시 터져버리는 Shape Mismatch (차원/형태 불일치) 에러 입니다.
딥러닝 프레임워크들은 이 에러를 “런타임(Runtime, 코드 실행 도중)”에 잡아냅니다. 학습을 몇 시간 동안 잘 돌리다가 갑자기 에러가 나서 뻗어버리면 크나큰 코스트 낭비가 아닐 수 없습니다.
이번 과제의 목표는 런타임이 무너지기 전에, 코드를 분석하고 행렬의 크기를 미리 유추하여 수식적 오류를 전부 선제 차단해버리는 정적 차원 검사기 (Static Shape/Type Checker)를 우리의 프로그래밍 언어 안에 탑재하는 것입니다!
1. 정적 타입 체킹 (Static Type Checking) 과 환경 (Environment)
타입 시스템이란 언어가 올바르게 돌아간다는 것을 보장하는 강력한 수학적 증명 덩어리입니다. 코드를 실행하지 않고서, 앞선 파서(Parser)가 만들어준 구문 트리(AST)를 가로지르기만 하며 변수들에 어떤 타입이 찰흙처럼 붙는지 확인합니다.
A. 타입 식별자 (Type Identifiers)
이번 텐서랭 엔진에서는 일반 변수들의 타입 뿐만 아니라 모델 가중치의 Input/Output 차원까지 타입 레벨에서 들고 다닙니다.
TyModel (in_dim, out_dim) : 입력 차원이 in_dim이고, 출력 차원이 out_dim인 인공신경망 계층의 타입!
B. 환경(Environment)의 역할
OCaml에서 변수와 그 타입 매핑 상태를 저장하기 위해 (string * typ) list 형태의 환경 변수를 끌고 다닙니다. 지역변수(let m = ... in)를 만날 때마다 환경에 리스트를 추가하고, 변수를 사용해야 할 때마다 환경에서 뽑아옵니다.
이렇게 하면 재귀 함수 호출 시 기존 변수 오염 없이 안전하게 새로운 스코프 지역 변성을 보장할 수 있습니다.
2. 점검해야 하는 딥러닝 연결(Dimension Validation) 이슈들
src/type.ml 파일을 열어 typecheck 함수의 비어있는 분기(match e with)들을 모두 채우세요.
A. 순차 모델 (Seq, Sequential Layer)
두 신경망 계층 $M_1, M_2$을 이어붙이는(Sequential) 모델입니다.
앞 계층 $M_1$의 출력(Output)과 뒷 계층 $M_2$의 입력(Input) 차원 크기가 한 치의 오차도 없이 동일해야만 무사히 붙일 수 있습니다!
이 조건이 어긋날 경우 과감하게 failwith "Shape mismatch in Seq" 예외를 던져 코드를 컴파일 단계에서 블락(Block)시키세요.
B. 순전파 함수 (Forward Pass)
어떤 데이터 텐서 X를 모델 M에 통과시키는 forward 명령의 타입 제재입니다.
당연히 텐서 X의 크기(TyTensor)가 모델 M의 입력 차원과 반드시 같아야 합니다. 다르면 연산을 실행조차 하지 말아야 합니다.
C. 훈련 블럭 (Train Loop)
최종 훈련 루프 노드는 무려 5개의 파라미터(m_expr, x_expr, y_expr, epoch, lr)를 받습니다!
x (훈련 데이터 텐서)의 크기가 m의 입력 크기와 같고,
y (정답 레이블 텐서)의 크기가 m의 출력 크기와 동일한지, 그리고 epoch는 자연수인지 철저하게 검증해야 합니다.
3. 테스트!
아래 명령어를 통해 차원/타입 오류가 적중하는지 확인하세요:
dune test
제출 안내
과제 폴더(전체 프로젝트)를 zip 파일로 압축하여 제출해 주시기 바랍니다.
또한, 터미널에서 dune test를 실행하여 모든 테스트가 통과한 결과 화면을 캡쳐하여 함께 첨부해 주세요.