Sequence to Sequence 이해
1. Sequence to Sequence
기존 RNN 모델은 정적 매핑(선형 회귀, 분류)을 벗어나는 문제를 해결할 수 없다. 시퀀스(입력 문자열)의 맥락, 구조 의존성을 고려하고, 아래 예시 처럼 입력과 출력의 형태가 다른 문제를 해결하기위해 Seq2Seq(Sequence to Sequence)구조가 사용된다.
- 번역: Hello, world! → 세상아, 안녕!(같은 의미를 가진 단어의 순서가 다름)
- 긴 문장 → 짤은문장 요약
흔히 Seq2Seq 를 설명할 때 볼 수 있는 그림이다. 이를 이해해보자.
1.1 Encoder
- 매 시점(단계)마다 현 시점의 임베딩 벡터와 이전 시점의 은닉 상태(Hidden State: 현재까지의 문맥을 압축한 벡터)를 인코더 모델에 입력하고 새로운 은닉 상태를 출력
- 위 과정을 반복하여 문백 벡터(최종 은닉 상태)를 디코더에 전달
- $x_t$
- $t$ 시점에 인코더에 입력되는 토큰의 임베딩 벡터
- $h_t$
- 인코더 t 시점의 은닉 상태: 인코더에 $h_{t-1}$과 $x_1$을 입력했을 때 출력되는 벡터이며, $h_0\,…\,h_{t-1}$가 누적된 누적벡터
- $h_0$: 입력 시퀀스를 처리하기 전에 설정되는 초기 은닉 상태, 영백터나 훈련 가능한 파라미터로 초기화
- $h_T$: 인코더의 최종 은닉 상태, 즉 문맥벡터
1.2 Decoder
- 처음에는 인코더로부터 전달받은 문맥 벡터로 은닉상태를 초기화하고 임베딩된 시작 토큰과 함께 디코더 모델에 입력, 다음부터는 이전 시점의 토큰을 임베딩하여 이전 시점의 은닉 상태와 입력, 로짓 출력
- 종료 토큰이 출력될 때 까지의 모든 디코더 출력이 최종 결과
- $y_t$
- $\hat{h}_{t-1}$와 $y_{t-1}$를 입력한 디코더의 출력
- t 시점의 디코더 은닉상태를 선형 변환(로짓 계산)한 벡터
- $y_t$의 확률 분포를 구하여(Softmax 사용) 가장 높은 확률을 가진 토큰 선택
- $\hat{h}_t$
- 디코더 t 시점의 은닉상태: 디코더에 $\hat{h}_{t-1}$과 $y_i$를 입력했을 때 생성되는 벡터이며, $h_0\,…\,h_{T},\,\hat{h}_1\,…\,\hat{h}_{t-1}$가 누적된 누적벡터
- $\hat{h}_0 = h_T$
$y_t$는 단어 집합에 대한 로짓이며 디코더의 파라미터는 단어 집합을 반영한다.
2. 예시
영어를 한글로 번역하는 Seq2Seq모델로 “Hello, world!”를 “세계야, 안녕!”으로 변환
- 원문 토크나이징
- 토크나이저로 정수(토큰 ID) 매핑
- “Hello, world!” → [”Hello”, “,”, “world”, “!”] → [12, 15, 22, 50] *예시를 위한 임의 수치
- 임베딩
- 각 입력 토큰을 임베딩 레이어를 통해 고정 길이 벡터로 변환
- [12, 15, 22, 50]→ [[0.225, 0.241, …], [0.345, -0.211, …], [0.563, 0.248, …], [-0.369, 0.488, …] ] *예시를 위한 임의 수치
- 인코딩
- 입력 임베딩을 순차적으로 처리, 각 시점의 은닉 상태 계산
- 최종 문맥 벡터 생성
- 디코딩
- 은닉 상태를 인코더의 최종 문맥 벡터로 초기화
- 첫 “세계야” 토큰 생성
- 시작 토큰의 임베딩 벡터와 1.단계의 은닉 상태를 디코더에 입력
- 은닉 상태 갱신
- 출력 로짓 계산(가중치X은닉 상태+편향 = 로짓)
- 확률 분포 계산(Softmax(출력 로짓))
- 가장 확률이 높은 단어 토큰 선택(”세계야”의 토큰ID)
- 토큰 ID를 문자열로 변환(”세계야”)
- “,”, “안녕”, “!”, 종료 토큰 생성
- 이전 시점의 토큰ID를 임베딩 벡터와 이전 시점의 은닉 상태를 디코더에 입력
- 은닉 상태 갱신
- 출력로짓계산→확률분포계산→토큰 선택→문자열 변환
- 종료 토큰 생성까지 반복
Leave a comment