강의자료 · 인공지능응용

13주차 · 긴 글을 나누어 다음 문자 예측하기

실습 전에

01 긴 데이터를 학습하는 방법

긴 글 전체를 한 번에 처리하기 어렵다면, 일부 구간씩 읽고 다음 문자를 예측하는 연습을 어떻게 구성할 수 있을까요?

설명
  • 연속된 Window를 Input으로 사용
  • 각 위치의 다음 문자를 Target으로 지정. 예: abcd → bcde

02 필요한 정보를 기억하기

문장 앞부분의 정보가 한참 뒤의 예측에 필요할 수 있습니다. 이전 정보를 계속 바꾸기만 한다면 어떤 문제가 생길까요?

설명
  • 정보를 유지하거나 갱신하는 정도를 조절
  • 같은 데이터·조건에서 성능과 비용 비교. 복잡한 구조가 항상 우수한 것은 아님

실습

1. 긴 글에서 짧은 학습 예제 만들기

  1. 첫 예제 셀에서 hello!를 길이 3·Stride 2로 자른 두 Input·Target 쌍을 출력하세요. 각 쌍의 Input과 Target을 위아래 두 행으로 놓고 같은 열에서 한 글자 차이가 나는지 대조하세요.
  2. 긴 글을 처리하는 데이터 셀의 첫 두 Input·Target 쌍에도 같은 표시를 하세요. 두 예제의 시작 위치가 몇 글자씩 이동하는지 적으세요.
  3. X.shape와 Y.shape의 각 축에 Window 수 NN, 길이 SS, 문자 표현 크기 EE를 대응시키세요.

2. RNN·LSTM·GRU 비교

  1. 모델 학습 셀을 실행하세요. RNN·LSTM·GRU별 마지막 Loss·Training Accuracy·첫 Window의 예측 문자열을 한 표로 적으세요. 사용한 데이터·epoch·Learning Rate는 세 모델에서 동일하게 둡니다.
  2. State 출력 셀을 실행하고, 모델별 output·h_n·c_n의 shape를 표로 적으세요. 반환하지 않는 State는 ‘없음’으로 표시하세요.
  3. output의 Sequence 축과 h_n의 마지막 시점 표현을 구분해 설명하고, LSTM이 추가로 반환하는 c_n의 역할을 적으세요.

제출·저장

코드, 실제 Output·그래프, 직접 작성한 해석을 포함하세요. 제출은 KLAS를 이용하며 기한은 학기 일정과 최신 공지를 확인합니다.

파일명: 이름_학번_13주차.ipynb.

실행 환경을 다시 시작하고 전체 코드를 위에서부터 실행한 뒤 저장하세요.

선택 실습

문자별 Logits와 Target을 펼치는 축이 맞지 않는 경우

  1. LSTM 학습까지 마친 뒤, 노트북 맨 아래에 Code Cell을 추가하고 다음 코드를 실행하세요.
    with torch.no_grad():
        debug_logits = results['LSTM'][0](X)
    debug_flat_logits = debug_logits.reshape(-1, debug_logits.shape[-1])
    print("Logits:", debug_logits.shape, "flattened:", debug_flat_logits.shape)
    for debug_target in [Y, Y.reshape(-1)]:
        print("Target:", debug_target.shape)
        try:
            print("Loss:", F.cross_entropy(debug_flat_logits, debug_target).item())
        except (RuntimeError, ValueError) as error:
            print(type(error).__name__, str(error))
  2. Text Cell에 두 Target shape와 실행 성공 여부를 표로 적으세요. 펼친 Logits의 한 행이 무엇을 예측하며, 그 행에 대응하는 Target을 어느 축 순서로 나열해야 하는지 설명하세요.