- 제출기한 : 5월 25일 일요일 11:59pm
- 주의: 채점은 스크립트로 자동으로 이루어지기에 폴더 이름이 잘못되면 0점을 받게 됩니다.
제출 방법
아래 두 가지를 하나의 압축 파일(학번_hw5.zip)에 담아 Uclass 과제 게시판에 업로드해주세요.
- 프로젝트 디렉토리 — 학번을 이름으로 하는 프로젝트 디렉토리 (예:
202448015/) - 실행 화면 캡처 —
dune test실행 결과 화면,hw5_screenshot.png- 캡처 화면에는 모든 테스트 케이스의 통과 결과가 모두 보여야 합니다.
코드 파일만 제출하거나 실행 화면이 누락된 경우 감점될 수 있습니다.
- 캡처 화면에는 모든 테스트 케이스의 통과 결과가 모두 보여야 합니다.
과제 진행 시 어려운 점이 있으면 온라인 강의실 게시판을 이용해 질문하세요. 게시판을 통해 하기 어려운 질문이라면 아래 TA 이메일을 통해 문의하시기 바랍니다.
- TA 이메일: seongminkim16@gmail.com
과제 소개
파이토치(PyTorch)나 텐서플로우를 쓰면서 가장 많이 마주치게 되는 치명적인 에러가 무엇일까요? 바로 텐서끼리 곱하려는데 차원이 맞지 않아 프로그램이 그 즉시 터져버리는 Shape Mismatch (차원/형태 불일치) 에러 입니다.
딥러닝 프레임워크들은 이 에러를 “런타임(Runtime, 코드 실행 도중)”에 잡아냅니다. 학습을 몇 시간 동안 잘 돌리다가 갑자기 에러가 나서 뻗어버리면 크나큰 코스트 낭비가 아닐 수 없습니다.
이번 과제의 목표는 런타임이 무너지기 전에, 코드를 분석하고 행렬의 크기를 미리 유추하여 수식적 오류를 전부 선제 차단해버리는 정적 차원 검사기 (Static Shape/Type Checker)를 우리의 프로그래밍 언어 안에 탑재하는 것입니다!
정적 타입 체킹 (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)를 만날 때마다 환경에 리스트를 추가하고, 변수를 사용해야 할 때마다 환경에서 뽑아옵니다.
이렇게 하면 재귀 함수 호출 시 기존 변수 오염 없이 안전하게 새로운 스코프 지역 변성을 보장할 수 있습니다.
점검해야 하는 딥러닝 연결(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는 자연수인지 철저하게 검증해야 합니다.
예제 프로그램
아래의 TensorLang 코드는 타입 검사를 통과해야 하는 올바른 프로그램의 예시입니다.
let m = seq (linear 2 4) (seq relu (linear 4 1)) in
let x = tensor [1.0; 0.5] in
let y = tensor [1.0] in
forward m x
테스트 및 실행
구현을 마쳤다면, 터미널(Terminal)에서 아래 커맨드를 입력하여 코드의 정합성을 확인합니다.
dune test