Today I Run
[GoogleStudyJam] Encoder-Decoder Architecture
조핑구
2024. 5. 9. 15:00
- Encoder-Decoder 아키텍쳐는 두 단계로 진행된다.
- 입력 문장의 vector 표현을 생성하는 encodeing stage. RNN 인코더는 입력 시퀀스의 각 토큰을 한 번에 하나만 처리하고 이전에 수집 된 토큰의 상태를 포함시켜 이 토큰의 상태를 생성한다. 이후 이 상태는 다음 인코딩 단계에서 다음 토큰과 함께 다음 상태를 생성하는 입력으로 사용됩니다. 순환신경망에 모든 입력 토큰이 수집된 후에는 전체 입력 문장을 나타내는 vector를 생성한다.
- 내부의 다양한 아키텍쳐로 구현된 seq output을 생성하는 decoding stage. 아키텍처는 RNN 또는 최신의 초강력 언어보델처럼 보다 복잡한 Transformer 블록 형태일 수도 있다. 디코더는 입력 문장의 벡터 표현을 가져와 해당 표현에서 출력 문장을 생성한다. RNN 디코더의 경우에는 현재 상태와 지금까지 디코딩 된 결과를 사용해 토큰을 순차적으로 처리하면서 출력을 디코딩한다.
- 훈련 방법
- 모델을 학습시키려면 데이터 세트가 필요한데 데이터 세트는 모델이 모방했으면 하는 입력/출력 쌍의 집합이다. 이 데이터 세트를 모델에 피드하면 모델은 데이터 세트의 특정 입력에 대해 생성되는 오차를 기반으로 학습 중에 가중치를 수정한다. 기본적으로 이 오차는 특정 입력 시퀀스에 대해 신경망이 생성하는 결과와 데이터 세트에 존재하는 정답 출력 시퀀스 사이에 발생하는 차이이다.
- 인코더-디코더 아키텍처는 일반적인 예측 모델보다는 좀 더 복잡하다. 일단 입력과 출력이 모두 필요하다. 번역의 경우 Source 언어와 그것이 번역된 다른 언어가 필요하다. 인코더에 출발어 문장을 피드한 다음 디코더가 생성하는 결과와 실제 번역 사이에 오차를 계산해야 한다. 학습 단계에서는 디코더에도 자체 입력이 필요하다. 디코더가 지금까지 생성한 결과가 아닌 이전에 번역된 올바른 토큰을 디코더에 입력하여 다음 토큰을 생성하도록 해야 한다. 이 학습방법을 teacher forcing 이라고 한다. (번역된 결과가 아니라 올바른 번역의 토큰을 주입시켜서 가르치는것으로 이해됨)
- 하나는 인코더에 피드할 원래 문장이고 다른 하나는 디코더에 주입할, 왼쪽으로 옮긴 원래 문장이다. 또 다른 주의점은 디코더가 각 단계에서 생성하는 것은 단어의 각 토큰이 다음 토큰이 될 확률뿐이라는 사실이다. 사용자는 이 확률을 사용하여 단어를 선택해야 한다. 그리디 탐색이 가장 단순한 방법이다. 'beam 탐색'은 더 나은 결과를 생성하는 더 우수한 방법입니다. 이 경우에는 디코더에서 생성된 확률을 사용하여 개별 단어가 아닌 문장 덩어리의 확률을 평가한다. 또한 각 단계에서 가장 확률이 높게 생성된 덩어리를 유지한다.
- serving
- 학습 후 서빙 단계에는 번역이나 프롬프트에 대한 응답을 새로 생성하도록 지시할 수 있다. 시작할 때 디코더에 프롬프트의 인코더 표현을 피드하면서 'Go'와 같은 특수 토큰을 함께 사용하면 된다. 그러면 디코더가 첫 번째 단어를 생성한다.
- 우선, 시작 토큰은 임베딩 레이어를 사용하여 벡터로 표현되어야 한다. 그런 다음 반복 레이어가 인코더에서 생성한 이전 상태를 새로운 상태로 업데이트한다. 이 상태는 밀집 softmax 레이어로 전달되어 단어의 확률을 생성한다. 끝으로, 그리디 탐색 또는 빔 탐색으로 가장 확률이 높은 토큰 또는 덩어리를 선택하여 단어가 생성된다. 이 시점에서 같은 절차를 반복해 두 번째와 세 번째 단어를 생성하고 모두 완료될 때까지 계속 반복한다.
무난히통과 😎
설명도 듣고 실습도 해서 조금 이해가 됐다. 되게 신기했다. 사람이 하는 번역과 비슷하게 진행되는 느낌이었다. 단어를 앞으로는 파파고를 쓸 때 오늘 공부한 것들이 생각날 것 같다.