AI · Deep Learning · Computer Vision · 판별형 모델
OUTTA Basic — RNN과 Seq2Seq에서 시간축 따라가기
2026-08-01 · 수정 2026-08-01 · Hyeongrok Ryu
Hidden state, sequence shape, train-test divergence와 Seq2Seq teacher forcing을 저장된 RNN 곡선으로 다시 정리했다.
- 유형 / 난이도
- study-note · intermediate
- Tools
- Python, PyTorch, Matplotlib
이 글에서 순서대로 다시 확인하는 학습 포인트입니다.
이 글에서 순서대로 다시 확인하는 학습 포인트입니다.
이 글에서 순서대로 다시 확인하는 학습 포인트입니다.
이 글에서 순서대로 다시 확인하는 학습 포인트입니다.
Hidden state 식으로 시작
먼저 RNN이 무엇인지 이전 정보를 무조건 기억하는 모델이라고 쓰지 않고, 직전 hidden state와 현재 입력을 같은 cell에 넣는 반복식으로 정리했다. 38쪽 RNN 모듈에서 펼친 시간축 그림을 보면서 parameter는 timestep마다 새로 생기는 것이 아니라 공유된다는 점을 다시 적었다.
hₜ = tanh(Wₓxₜ + Wₕhₜ₋₁ + b), oₜ = Wₒhₜ + c
Batch와 time 축
Notebook에서 가장 먼저 확인한 것은 (batch, time, feature)였다. batch_first=True가 아니면 앞의 두 축 순서가 바뀐다. 마지막 timestep만 쓸지, 모든 timestep 출력을 decoder에 넘길지도 task에 따라 달라진다.
문장 분류라면 padding을 loss에 포함하지 않도록 length나 mask가 필요하다. hidden state shape도 layer 수와 양방향 여부를 포함해 (layers * directions, batch, hidden)으로 확인했다.
Train과 test의 분리
당시 RNN Notebook에 저장된 그래프에서는 train accuracy가 거의 1.0까지 올라가지만 test accuracy는 0.5 부근에 머문다. epoch를 더 돌리면 좋아질 것이라고 생각했지만, 두 곡선 간격이 계속 벌어지는 모습은 memorization에 가깝다.

sequence length, split 방식, class balance, hidden size, dropout을 함께 확인해야 했다. 특히 같은 원문에서 잘라낸 인접 window가 train과 test에 나뉘면 비슷한 sequence가 양쪽에 들어갈 수 있다.
서로 다른 학습곡선 읽기
다른 Notebook 출력에서는 loss 감소와 accuracy 상승이 함께 나타났다. 또 짧은 series에서는 값이 한 번 반등한 뒤 감소했고, 다른 실험은 loss가 꾸준히 낮아졌다. 한 곡선의 축 범위나 timestep 수를 확인하지 않고 서로 직접 비교하면 안 된다는 점을 배웠다.




Encoder와 decoder 연결
Seq2Seq에서는 encoder가 입력 sequence를 읽고 decoder가 <bos>부터 다음 token을 한 단계씩 만든다. 이 부분은 처음에 encoder의 모든 출력과 마지막 hidden state를 혼동했다. attention이 없는 기본 구조에서는 마지막 hidden state가 decoder 초기 상태로 전달되고, teacher forcing을 쓰면 정답 token을 다음 입력으로 넣는다.
L = −Σₜ log p(yₜ | y before t, x)
Packed shape 없는 최소 예
embedded = embedding(token_ids) # (batch, time, dim)
encoder_output, hidden = encoder(embedded)
decoder_input = bos_tokens
logits = []
for target_step in range(target_length):
step_vector = embedding(decoder_input).unsqueeze(1)
step_output, hidden = decoder(step_vector, hidden)
step_logits = projection(step_output[:, 0])
logits.append(step_logits)
decoder_input = target[:, target_step] # teacher forcing
logits = torch.stack(logits, dim=1) # (batch, time, vocab)
이전·다음 글
사용한 자료
- RNN — course-pdf; recurrence, hidden state, Seq2Seq