- 제출기한 : 6월 22일 월요일 11:59pm
- 주의: 채점은 스크립트로 자동으로 이루어지므로 디렉토리/파일 이름이 안내와 다르면 0점을 받을 수 있습니다.
제출 방법
아래 두 가지를 하나의 압축 파일(학번_hw7.zip)에 담아 Uclass 과제 게시판에 업로드해주세요.
- 프로젝트 디렉토리 — 학번을 이름으로 하는 프로젝트 디렉토리 (예:
202548015/)202548015 ├── dune-project └── src ├── ast.ml ├── dune ├── interpreter.ml ├── lexer.mll ├── parser.mly ├── type.ml └── builtin.ml - 실행 화면 캡처 — 학습 전/후 결과를 포함한 실행 화면,
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는 다음의 파이프라인을 가져야 합니다.
- 어휘 분석기(Lexer): 소스 코드 -> 토큰(token)
- 구문 분석기(Parser): 토큰 -> 추상 구문 트리(AST)
- 타입 체커(Type Checker): AST 정적 타입 검사(static type checking)
- 인터프리터(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 m2는m1 : model[a,b]그리고m2 : model[b,c]일 때model[a,c]forward m x는m : model[a,b],x : tensor[a]일 때tensor[b]mse p y는p와yshape이 같을 때floattrain m x y epoch lr는m과 동일 타입 반환
필수 오류 처리:
- 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.mllparser.mlyast.mltype.mlinterpreter.mlbuiltin.ml(신규 생성 가능)
그 외 파일은 수정하지 않는 것을 권장합니다.
5. 필수 테스트 (Required Tests)
최소 10개 이상의 테스트 케이스를 작성하세요.
필수 포함 테스트:
tensor리터럴 파싱/타입 검사linear/seq/forward정상 동작mse계산 정확성train후 loss 감소 확인- shape mismatch 오류
- type mismatch 오류
- 잘못된 학습 인자 오류
예시:
(* 정상 동작 *)
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점 이내에서 반영)