티스토리 뷰

 

 

이번 글에서는 시퀀스를 인풋으로 받아 시퀀스를 아웃풋으로 리턴하는 아키텍처인 Seq2Seq에 대해 알아보겠습니다.

 

Seq2Seq

 

영어 문장을 한국어로 번역하는 모델은 어떻게 만들 수 있을까요?

 

Seq2Seq모델에서는 Source 문장인 영어 문장을 인코딩하고 Target 문장인 한국어로 디코딩하게 됩니다.

 

쉽게 말해, 인풋으로 들어온 문장의 정보를 잘 모델링하여 hidden vector에 담아내고 이 의미에 기반해 토큰을 하나씩 꺼내면 됩니다.

 


Encoding 원본의 의미를 잘 담은 벡터를 생성 ▶▶▶ Decoding  부합하는 단어를 하나씩 추출


 

 

✅ 2개의 RNN을 인코더-디코더 구조로 사용하는 구조

아래와 같은 2개의 RNN을 사용해 활용합니다.

(💡 두 개의 RNN을 사용하는 이유는?
     원본 문장을 인코딩할 때 사용되는 파라미터와 디코딩에 사용되는 파라미터가 다르기 때문입니다.)

 

(예시)

I'm / on /  the / subway / now ▶ 난 / 이제 / 지하철 / 안 / 이야

Seq2Seq 구조

 

Encoder RNN

   - 원본 문장의 정보를 인코딩하는 인코더

   - 원본 문장(인풋)의 문맥(의미)을 잘 담은 hidden state(vector)를 만들고
     Decoder RNN의 초기 hidden state로 전달합니다.

 

Decoder RNN

   - 원본의 의미에 맞는 토큰을 추출하는 디코더

   - 인코딩 된 hidden state의 정보와 디코더 RNN의 인풋의 정보를 처리하여
     해당 타임스텝의 토큰을 예측합니다. 

     (💡 예측 : RNN 유닛이 리턴한 hidden state를 통해 타겟 언어의 단어사전 크기에 해당하는 확률값 벡터를 만드는 것
                  이렇게 하면 확률값이 가장 큰 인덱스에 해당하는 토큰이 해당 타임스텝의 예측치가 됩니다.)

 

   - [디코더 RNN의 기본 순서]

     (1) 먼저 첫 번째 타임 스텝에서 인풋으로 문장의 시작을 알리는 스페셜 토큰(예. <sos>)을 입력받습니다.

     (2) 인코더 RNN이 넘겨준 정보(hidden state)를 가공하여 첫 번째 토큰을 디코딩

     (3) 두 번째 타임 스텝에서는 이전 타임 스텝에서 디코딩된 토큰을 인풋으로 받아
          hidden state를 가공
하여 두 번째 토큰을 디코딩

     (4) (...(3) 순차적으로 계속 반복...)

     (5) 번역을 완료하면 <eos> (end of sentence)에 해당하는 스페셜 코튼을 디코딩

 

 Input Feeding : 이전 타임 스텝에서 번역한 단어(아웃풋)를 현재 타임 스텝의 인풋으로 받아 토큰을 생성합니다.

   [인풋] 이전 타임스텝에 디코딩된 단어

   [아웃풋] 타겟 단어의 단어사전 개수 차원으로 매핑 됨

 

Seq2Seq 학습방법

  - 두 개의 RNN을 사용한 Seq2Seq모델은 하나의 시스템으로서, 작동합니다.

  - 인코더 임베딩부터 디코더 아웃풋레이어까지 End-to-End back-propagation을 수행하며
    파라미터들이 업데이트됩니다.

  - Loss : 디코더 RNN이 각각의 타임 스텝에서 예측한 확률 분포에 대해
              'sparse_cross_entropy_loss'를 계산한 것을 모두 합하여 계산합니다.

 

(예시)

I'm / on /  the / subway / now ▶ 난 / 이제 / 지하철 / 안 / 이야

  

Seq2Seq 모델이 잘 학습될 수 있도록 도와주는 '선생님 알고리즘'

 

 

Teacher Forcing

  - (배경) : 잘못 디코딩된 토큰을 Input Feeding을 통해 다음 스텝에 넘겨주면, 모델은 이상한 답을 내 놓게 됩니다
                 그래서 모델을 학습시키는 동안에 모델이 학습을 좀 더 쉽게 할 수 있도록 도와주는 기능이 필요합니다.

 

(예시)

"나는 수국을 보러 가고 싶어" 영어로 번역할 때,
▶ '수국'이라는 단어가 뭔지 모를 때, 옆에 있던 선생님이 <hydrangea> 라는 힌트를 줍니다.

▶<I> <want> <to> <go> <see> <the> <hydrangea> 문장 완성

▶<수국> = <hydrangea> 라고 번역할 수 있다는 것을 학습

 

  -  학습을 안정적으로 하기 위해 디코딩 타임스텝에서 실제 정답을 알려주는 "선생님"이 필요합니다.

  -  Input Feeding에 실제 정답(Ground Truth) 토큰을 인풋으로 주어 학습을 도와줍니다.

 

 

Seq2Seq 활용예시

(1) 대화 : 이전 발화 텍스트 → 현재 발화 텍스트

(2) 요약 : 긴 원본 텍스트 → 짧은 요약문

(3) 기계 번역 :  원본 언어 텍스트 → 번역 언어 텍스트

(4) 코드 생성 : 코드를 설명하는 자연어 문장 → 파이썬 구문