[CS231n] 강의10 Recurrent Neural Networks 리뷰
본 글은 2022년 4월에 강의한 스탠포드 대학의 Recurrent Neural Networks 2022년 강의를 듣고 정리한 내용입니다. 개인 공부 목적으로 작성되었으며, 설명이 맞지 않거나 글 오타가 있으면 알려주시길 바랍니다.
- 원본 링크 : cs231n.stanford.edu
- 한글 번역 링크 : aikorea.org - cs231n
- 강의 링크 : youtube - 2017 Spring (English)
- 슬라이드 링크 : Stanford CS231n 2017 Slides
Introduction to RNN
- 일반적으로 표준 신경망은 고정된 크기의 입력 벡터가 주어지면 은닉층(hidden layer)을 거쳐 고정된 크기의 출력 벡터를 생성한다.
- 이를 one-to-one 구조라 부르며, 바닐라 피드포워드 신경망(vanilla feedforward neural network)에 해당한다.
- 반면 순환 신경망(RNN; Recurrent Neural Network)은 시퀀스 데이터를 처리할 수 있도록 유연한 아키텍처 연결 방식을 제공한다.
- 은닉 상태(hidden state)에 피드백 루프(feedback loop)를 두어 이전 시점의 정보를 다음 시점으로 전달하며 학습한다.
- 즉, 시간 축(timestep)을 고려하는 순환 가중치가 추가된 구조이다.

이미지 출처: 1
- one-to-many : 이미지 캡셔닝(Image Captioning)이 대표적인 예이다.
- 고정 크기의 단일 이미지를 입력받아 해당 이미지의 내용을 서술하는 단어 시퀀스를 순차적으로 생성한다.
- 단일 이미지 $\rightarrow$ 단어 시퀀스(sequence of words)
- many-to-one : 동작 예측(Action Prediction), 텍스트 감정 분석(Sentiment Analysis)이 대표적인 예이다.
- 단일 이미지 대신 비디오 프레임 시퀀스를 입력받아 해당 비디오에서 수행된 동작 클래스를 출력한다.
- 비디오 프레임 시퀀스 $\rightarrow$ 동작 분류(action class)
- many-to-many : 비디오 캡셔닝(Video Captioning), 기계 번역(Machine Translation)이 대표적인 예이다.
- 비디오 프레임 시퀀스를 입력받아 설명 문장 시퀀스를 출력한다.
- 비디오 프레임 시퀀스 $\rightarrow$ 캡션 텍스트 시퀀스
- variation of many-to-many : 프레임 단위 비디오 분류(Video Classification per frame)가 대표적인 예이다.
- 매 timestep마다 동기적으로 출력을 생성한다.
Recurrent Neural Network

- RNN은 시퀀스가 처리될 때마다 갱신되는 내부 은닉 상태(internal hidden state)를 유지한다.
- 모든 단일 시점(timestep)에서 입력 벡터를 받아 재귀 함수를 통해 은닉 상태를 갱신한다.

- 위 그림은 RNN 모델을 시간 축에 따라 펼친(unroll) 형태를 나타낸 것이다.
- 각 timestep에서 RNN은 현재 입력 벡터 $x_t$와 이전 시점의 은닉 상태 $h_{t-1}$ 두 가지를 입력으로 받는다.
- 모든 RNN 블록은 동일한 파라미터를 공유하며, 매 timestep마다 입력 $x_t$와 이전 은닉 상태 $h_{t-1}$만 달라지는 동일한 연산 단위이다.

- 다음은 바닐라 RNN의 기본 점화식이다.
- $h_{t-1}$ : 이전 timestep $t-1$에서의 은닉 상태 벡터
- $x_t$ : 현재 timestep $t$에서의 입력 벡터
- $f_W$ : 가중치 파라미터 $W$를 갖는 고정된 상태 전이 함수
- 시퀀스의 길이에 관계없이 매 시간 단계마다 정확히 동일한 함수와 파라미터가 적용되므로 가변 길이 시퀀스를 일관되게 처리할 수 있다.
- $h_t$ : 갱신된 현재 timestep의 은닉 상태 벡터

- 위 그림은 앞서 소개한 기본 수식을 구체화한 행렬 연산 식이다.
- 매 timestep마다 이전 상태 $h_{t-1}$과 현재 입력 $x_t$를 입력받아 $\tanh$ 활성화 함수를 통해 현재 은닉 상태 $h_t$를 계산한다.
- $h_t = \tanh(W_{hh} h_{t-1} + W_{xh} x_t)$
- $W_{hh}$ : 이전 은닉 상태 $h_{t-1}$에 적용되는 상태 전이 가중치 행렬
- $W_{xh}$ : 현재 입력 벡터 $x_t$에 적용되는 입력 가중치 행렬

- $W_{hy}$ : 현재 은닉 상태 $h_t$로부터 출력 벡터 $y_t$를 생성하는 출력 가중치 행렬
- $\hat{y}t = W{hy} h_t$

- 이렇게 계산된 $h_t$는 다음 timestep의 입력으로 전달되어 은닉 상태를 순차적으로 갱신한다.

- 각 timestep마다 서로 다른 입력 $x_t$가 주입되지만, 가중치 행렬 $W$($W_{xh}, W_{hh}, W_{hy}$)는 전체 시퀀스에 걸쳐 동일하게 공유된다.
many-to-many

- many-to-many 모델에서는 매 timestep마다 예측값 $y_t$를 출력하고 각 시점의 손실 $L_1, L_2, \dots, L_T$를 계산한다.
- 시퀀스 전체에 대한 최종 손실 $L$은 각 개별 손실의 합($L = \sum_{t=1}^T L_t$)으로 정의된다.
- 모델 학습을 위한 역전파(Backpropagation Through Time, BPTT) 시 손실이 각 timestep마다 계산되므로, 각 시점에서 가중치 행렬 $W$에 대한 국소 기울기(local gradient)를 구한 뒤 전체 시점의 기울기를 합산하여 최종 그래디언트를 구한다2.
many-to-one

- many-to-one 구조에서는 전체 시퀀스를 순차적으로 처리한 뒤 마지막 timestep의 은닉 상태 $h_T$에 전체 입력 시퀀스의 누적 정보가 집약된다.
- 최종 은닉 상태 $h_T$로부터 최종 예측값(예: 감정 분류 클래스, 비디오 동작 레이블)을 1회 산출하고 손실을 역전파한다.
one-to-many

- one-to-many 구조에서는 고정 크기의 단일 입력(예: 이미지 특징 벡터)이 주어지고, 가변 길이의 출력 시퀀스를 생성한다.
- 이때 입력 벡터는 모델의 초기 은닉 상태(initial hidden state) $h_0$를 초기화하거나, 매 timestep마다 보조 입력으로 주입되어 시퀀스 단어를 하나씩 순차 생성한다.
sequence to sequence

- 시퀀스-투-시퀀스(Sequence-to-Sequence, Seq2Seq) 모델은 many-to-one 인코더와 one-to-many 디코더를 결합한 아키텍처이다.
- 인코더(encoder)는 가변 길이의 입력 문장을 순차적으로 읽어 들인 후, 마지막 은닉 상태에 전체 문장 정보를 압축하여 고정 크기의 컨텍스트 벡터(context vector)를 생성한다3.
- 이를 컨텍스트 벡터(context vector)라 부른다.
- 디코더는 컨텍스트 벡터를 받아 한 개씩 순차적으로 출력한다.
- 매 timestep마다 적절한 단어를 출력한다.
Example: character-level language model

- RNN의 작동 방식은 일련의 문자 시퀀스를 RNN에 입력으로 주고, 매 timestep마다 시퀀스의 다음 문자를 예측하도록 훈련하는 것이다.
- 학습 시퀀스로 “hello”가 주어지고 어휘 집합이 [‘h’, ‘e’, ‘l’, ‘o’] 4개 문자로 구성될 때:
- 입력층에서는 각 문자를 원-핫 인코딩 벡터로 변환하여 순차적으로 주입한다.
- 은닉층에서는 $h_t = \tanh(W_{hh} h_{t-1} + W_{xh} x_t)$ 점화식에 따라 이전 상태를 기억하며 계산한다.
- 출력층에서는 $\hat{y}t = W{hy} h_t$ 연산을 통해 다음 문자에 대한 로짓(score) 벡터를 산출한다.

- 테스트(추론) 단계에서는 시작 문자를 하나씩 모델에 입력한다.
- 예를 들어 ‘h’가 주어지면 출력층에서 다음 문자에 대한 어휘별 점수를 산출하고, 소프트맥스(softmax) 함수를 거쳐 확률 분포로 변환한 뒤 다음 문자를 샘플링하거나 결정한다.
Backpropagation through time

- 시간 역전파(BPTT; Backpropagation Through Time)는 전체 시퀀스에 걸쳐 순전파를 진행한 후, 마지막 시점부터 첫 시점까지 역방향으로 기울기를 역전파하는 방식이다.
- 그러나 시퀀스 길이가 길어질수록 전체 시퀀스의 은닉 상태를 메모리에 유지해야 하므로 메모리 사용량과 계산 비용이 비효율적으로 증가한다.

- 따라서 실제 학습에서는 전체 시퀀스 대신 일정 길이의 하위 시퀀스(chunk) 단위로 나누어 순전파와 역전파를 수행하는 절단된 시간 역전파(Truncated BPTT; Truncated Backpropagation Through Time) 를 적용한다4.
- 은닉 상태 $h$는 다음 청크로 계속 전달하되, 역전파 기울기는 현재 청크 블록 내에서만 계산하여 파라미터를 갱신한다.
Pros and Cons
- Pros
- 가변 길이의 시퀀스 입력을 유연하게 처리할 수 있다.
- 시점 $t$에서의 계산이 이전 여러 시점의 누적 정보를 반영할 수 있다.
- 입력 시퀀스 길이가 증가해도 모델의 파라미터 수(가중치 행렬 크기)는 증가하지 않는다.
- 매 timestep마다 동일한 가중치가 적용되므로 시간 축에 대한 매개변수 대칭성(symmetry)을 유지한다.
- Cons
- 순환 계산(recurrent computation)의 특성상 이전 은닉 상태에 순차적으로 의존하므로 GPU 병렬화가 어렵고 연산 속도가 느리다.
- 역전파 경로가 길어질수록 기울기가 소실되거나 폭발하여 초반 시점의 정보에 접근하기 어렵다.
Image Captioning

- 이미지 캡셔닝(Image Captioning)은 합성곱 신경망(CNN)과 순환 신경망(RNN)을 결합한 대표적인 멀티모달 모델이다.
- 입력은 단일 이미지가 들어가지만 출력은 자연어 단어 시퀀스가 생성된다.

- CNN 구조의 마지막 FC 분류 계층과 소프트맥스를 제거하고, 추출된 이미지 특징 벡터 $v$를 RNN의 입력으로 연결한다.
- $W_{ih} v$는 이미지의 고유 특징 정보이며, RNN 은닉 상태를 초기화하거나 각 스텝에 주입된다.

- 시작 토큰
<START>를 입력으로 주입하면 RNN이 첫 단어를 예측하고, 샘플링된 단어를 다음 스텝의 입력으로 전달하며 반복 생성한다. - 종료 토큰
<END>가 나오면 더 이상 단어를 생성하지 않고 캡션을 완성한다.
Multilayer RNNs

- 단일 계층 바닐라 RNN에 그치지 않고 은닉층을 수직으로 여러 개 쌓아 올리는 다층 순환 신경망(Multilayer RNNs) 구조를 사용할 수 있다.
- 아래 계층의 은닉 상태 시퀀스가 위 계층 RNN의 입력 시퀀스로 전달되며 더 풍부한 계층적 시퀀스 표현을 학습한다. 다만 시간 축으로 이미 깊은 구조이므로 대개 2~3개 계층 수준을 쌓는 것이 일반적이다.
한계 및 트레이드오프
- 기울기 소실 및 폭발 (Vanishing/Exploding Gradient): 바닐라 RNN은 역전파 시 시간 축을 따라 동일한 가중치 행렬 $W_{hh}$를 반복적으로 곱하므로, 최대 고유값의 크기에 따라 역전파 기울기가 지수적으로 소실되거나 폭발하여 장기 의존성(long-term dependency) 학습에 구조적 한계가 있다.
- 순차 연산 병목 및 병렬화 불가: 각 timestep의 은닉 상태 $h_t$ 계산이 직전 시점 $h_{t-1}$의 결과에 강하게 종속되므로, GPU 환경에서도 시퀀스 길이 방향(시간 축) 병렬 처리가 불가능하여 대용량 시퀀스 학습 및 추론 속도가 병목이 된다.
- 정보 병목 (Information Bottleneck): Seq2Seq 기본 구조에서는 가변 길이 입력 시퀀스의 모든 정보를 단일 고정 차원 컨텍스트 벡터 하나에 압축해야 하므로, 입력 문장이 길어질수록 초기 토큰의 세부 정보가 유실되는 정보 병목이 발생한다.
댓글남기기