과제 7. TinyDL-F --- 함수형 미니 딥러닝 언어 완성하기

   

  • 제출기한 : 6월 22일 월요일 11:59pm
  • 주의: 채점은 스크립트로 자동으로 이루어지므로 디렉토리/파일 이름이 안내와 다르면 0점을 받을 수 있습니다.

제출 방법

아래 두 가지를 하나의 압축 파일(학번_hw7.zip)에 담아 Uclass 과제 게시판에 업로드해주세요.

  1. 프로젝트 디렉토리 — 학번을 이름으로 하는 프로젝트 디렉토리 (예: 202548015/)
    202548015
    ├── dune-project
    └── src
        ├── ast.ml
        ├── dune
        ├── interpreter.ml
        ├── lexer.mll
        ├── parser.mly
        ├── type.ml
        └── builtin.ml
    
  2. 실행 화면 캡처 — 학습 전/후 결과를 포함한 실행 화면, hw7_screenshot.png
    • 캡처 화면에는 아래 항목이 모두 보여야 합니다.
    • (a) forward 결과
    • (b) train 실행 후 손실(loss) 감소 로그
    • (c) shape mismatch 또는 type mismatch 오류 예시 1개

      코드 파일만 제출하거나 실행 화면이 누락된 경우 감점될 수 있습니다.

과제 진행 시 어려운 점이 있으면 온라인 강의실 게시판을 이용해 질문하세요. 게시판을 통해 하기 어려운 질문이라면 아래 TA 이메일을 통해 문의하시기 바랍니다.

  • TA 이메일: seongminkim16@gmail.com

   


이번 과제는 이번 학기의 최종 통합 과제(capstone assignment)입니다. 목표는 지금까지 구현한 함수형 언어를 기반으로, 인공지능 개발에 사용할 수 있는 작은 DSL(Domain-Specific Language)인 TinyDL-F를 완성하는 것입니다.

TinyDL-F는 다음의 파이프라인을 가져야 합니다.

  1. 어휘 분석기(Lexer): 소스 코드 -> 토큰(token)
  2. 구문 분석기(Parser): 토큰 -> 추상 구문 트리(AST)
  3. 타입 체커(Type Checker): AST 정적 타입 검사(static type checking)
  4. 인터프리터(Interpreter): 실행(run) 및 학습(train)

   

TinyDL-F 목표

TinyDL-F는 “작지만 실제로 학습이 되는” 언어여야 합니다. 완성된 인터프리터에서 학생은 아래와 같은 프로그램을 실행할 수 있어야 합니다.

let m = seq (linear 2 4) (linear 4 1) in
let x = tensor [1.0; 0.5] in
let y = tensor [1.0] in
let pred_before = forward m x in
let m2 = train m x y 100 0.01 in
let pred_after = forward m2 x in
(pred_before, pred_after)

위 예시에서 학습 전/후의 예측 값이 달라지고, 손실(loss)이 감소하는 것이 보여야 합니다.

   

1. 확장할 문법 (Grammar)

기존 hw6 문법에 아래 요소를 추가하세요.

prog ::= e

e ::= ...
    | f
    | tensor [float_list]
    | linear e e
    | relu
    | seq e e
    | forward e e
    | mse e e
    | train e e e e e

f ::= <floating-point number>
float_list ::= f | f ; float_list

권장 사항:

  • relu는 값(value)으로 취급되는 내장 모델(builtin model)로 구현해도 됩니다.
  • train은 단순 SGD(stochastic gradient descent) 기반으로 구현하세요.
  • parser 충돌(conflict)을 피하기 위해 함수 호출(application) 우선순위를 명확히 정의하세요.

   

2. 타입 시스템 (Type System)

기존 타입에 아래 타입을 추가하세요.

t ::= int
    | bool
    | float
    | tensor[n]
    | model[a,b]
    | t -> t

필수 타입 규칙:

  • tensor [v1; ...; vn] : tensor[n]
  • linear i o : model[i,o]
  • relu : model[n,n] (필요하다면 타입 변수로 일반화 가능)
  • seq m1 m2m1 : model[a,b] 그리고 m2 : model[b,c]일 때 model[a,c]
  • forward m xm : model[a,b], x : tensor[a]일 때 tensor[b]
  • mse p ypy shape이 같을 때 float
  • train m x y epoch lrm과 동일 타입 반환

필수 오류 처리:

  • shape mismatch
  • 타입 불일치(type mismatch)
  • 학습 하이퍼파라미터의 잘못된 타입 (예: epoch이 int가 아닌 경우)

   

3. 동적 의미 (Operational Semantics)

다음 값(value)들을 지원하세요.

v ::= Int i
    | Bool b
    | Float f
    | Tensor [f1; ...; fn]
    | Model ...
    | Closure ...

필수 동작:

  • forward는 주어진 모델과 입력 텐서로 추론(inference)을 수행
  • mse는 평균 제곱 오차(mean squared error)를 계산
  • train은 지정한 epoch 횟수만큼 모델 파라미터를 업데이트

최소 구현 조건:

  • 1층 선형 모델(linear regression) 학습 가능
  • 2층 MLP(선형 + 선형) 학습 가능
  • 학습 로그에서 loss 감소가 관찰 가능

권장 구현:

  • train은 매 epoch마다 loss 출력
  • 0으로 나누기, 빈 텐서 등 예외 처리

   

4. 구현 범위 (수정 가능한 파일)

다음 파일들은 수정 가능합니다.

  • lexer.mll
  • parser.mly
  • ast.ml
  • type.ml
  • interpreter.ml
  • builtin.ml (신규 생성 가능)

그 외 파일은 수정하지 않는 것을 권장합니다.

   

5. 필수 테스트 (Required Tests)

최소 10개 이상의 테스트 케이스를 작성하세요.

필수 포함 테스트:

  1. tensor 리터럴 파싱/타입 검사
  2. linear/seq/forward 정상 동작
  3. mse 계산 정확성
  4. train 후 loss 감소 확인
  5. shape mismatch 오류
  6. type mismatch 오류
  7. 잘못된 학습 인자 오류

예시:

(* 정상 동작 *)
let m = linear 2 1 in
let x = tensor [1.0; 2.0] in
forward m x

(* shape mismatch *)
let m = linear 3 1 in
let x = tensor [1.0; 2.0] in
forward m x

   

6. 채점 기준

  • 문법/파서 구현 완성도: 20점
  • 타입 시스템 정확성(특히 shape 체크): 25점
  • 인터프리터 동작(forward, mse, train): 30점
  • 테스트 품질(정상/오류 케이스): 15점
  • 코드 가독성 및 문서화: 10점

총점: 100점

   

7. 참고 및 힌트

  • 이번 과제는 “완전한 딥러닝 프레임워크” 구현이 목표가 아닙니다.
  • 핵심은 언어 구현 관점에서 AI 도메인 기능을 담아내는 것입니다.
  • 먼저 타입/shape 규칙을 명확히 정리한 뒤 인터프리터를 구현하면 디버깅이 훨씬 쉬워집니다.
  • linear를 먼저 완성한 다음 seq, 마지막으로 train을 붙이는 순서를 추천합니다.

   

8. 보너스 (선택)

아래 항목은 보너스 점수 대상입니다.

  • sigmoid 또는 tanh 추가
  • mini-batch 학습 지원
  • 조기 종료(early stopping)
  • 학습 로그를 표 형태로 출력

(보너스는 최대 10점 이내에서 반영)