Encoder-decoder architecture Overview
인코더-디코더 아키텍처 역할
- 인코더-디코더 아키텍처는 시퀀스 to 시퀀스 아키텍처
- 예를 들어
- "The cat ate the mouse" 라는 영어 문장과 같이 연속적인 단어를 입력값으로 받아
- 다른 언어(여기서는 프랑스어)로 번역된 결과를 내놓는 것
- 인코더-디코더 아키텍처는 시퀀스들을 사용하고 시퀀스들을 분리하는 기계이다.
- 다른 입력 예로
- 프롬프트를 형성하는 연속적인 단어들이 LLM에 전송되며
- 결과는 이 프롬프트에 대한 LLM의 응답값
인코더-디코더 아키텍처 작동원리
- 통상적으로, 인코더-디코더 아키텍처는 2개의 스테이지를 갖는다.
- 인코더 스테이지: 입력 문장의 벡터 표현(vector representation)을 생성
- 디코더 스테이지: 시퀀스 출력을 생성
- 인코더 및 디코더 모두 상이한 내부 아키텍처로 구현될 수 있다.
- 내부 메커니즘은 반복 신경망(recurrent neural network)일 수 있고, 초강력 언어 모델의 경우와 같이 더 복잡한 트랜스포머 블록일 수 있다.
- 반복 신경망 인코더는 입력 시퀀스의 각 토큰을 한 번에 하나씩 가져가고 이 토큰에 해당하는 상태(state)를 생성한다.
- 이 토큰에 해당하는 상태는 다음 토큰과 함께 그 다음 인코딩 단계에서 입력으로 사용되며, 새로운 상태를 생성한다.
- 모든 입력 토큰을 RNN(Recurrent Neural Network)에 사용하고 나면 전체 입력 문장을 나타내는 벡터를 출력한다.
- 디코더는 인코더 단계에서 출력한 벡터를 가지고 출력 문장을 생성한다.
- RNN 디코더의 경우 출력된 토큰을 하나씩 디코딩하며, 이때 현재 상태(state)와 이전까지 디코딩된 결과를 사용한다.
- RNN 디코더는 위 작업을 단계적으로 수행한다.
인코더-디코더 아키텍처 훈련방법
- 인코더-디코더 아키텍처 아키텍처의 경우 일반적인 예측 모델(predictive model)들보다 복잡하다
- 먼저 인코더-디코더를 훈련시키기 위해 입력과 출력 텍스트 모음(collection)이 필요하다.
- 번역의 경우 이는 문장 쌍(sentence pair)으로 소스 언어의 문장과 번역된 문장이다.
- 소스 언어의 문장을 인코더에 넣고 디코더가 생성한 것과 실제 번역 사이의 오류를 비교하는 것만으로는 부족하다
- 디코더의 각 단계별로 이전 단계에서 디코딩한 결과가 아닌 사전에 준비한 정확한 결과를 주어야 한다.
- 이는 정확한 이전 토큰으로부터 다음 토큰을 생성하도록 강제하기 때문에 교사 강제(teacher forcing)라 불린다.
- 또 다른 미묘한 점은 디코더가 각 단계에서 각 토큰이 다음에 나올 확률만을 생성한다는 것이다.
- 이러한 확률을 사용하려면 단어를 선택해야 하며, 이에 대한 접근법은 여러 가지가 있다.
- greedy search: 가장 높은 확률을 가진 토큰을 생성하는 것, 가장 간단한다
- beam search: 개별 단어보다는 문장 청크의 확률을 평가하기 위해 디코더에 의해 생성된 확률을 사용, 더 나은 결과를 낸다.
인코더-디코더 아키텍처 사용
- 인코더 단계의 벡터와 함께 슬라이드에서의 'Go'와 같이 특별한 토큰을 디코더에 공급한다. 'Go'는 디코더가 첫 번째 단어를 생성하도록 한다.
- 우선, 시작 토큰은 임베딩 레이어(embedding layer)를 이용한 벡터로 표현될 필요가 있다.
- 그런 다음, 반복 계층(recurrent layer)은 인코더에 의해 생성된 이전 상태를 새로운 상태로 업데이트할 것이다.
- 이 상태는 단어 확률(word probabilities)을 생성하기 위해 다운 소프트맥스 계층(down softmax layer)으로 전달될 것이다.
- 단어는 그리디 검색으로 최고 확률 단어를 취하거나, 빔 검색으로 최고 확률 청크를 취함으로써 생성된다.
- 위에서 설명한 과정을 모든 토큰에 적용한다.