Seq2seq
January 2022
개요
시퀀스-투-시퀀스(Sequence-to-Sequence, seq2seq)는 입력된 시퀀스로부터 다른 도메인의 시퀀스를 출력하는 다양한 분야에서 사용되는 모델입니다.
RNN을 입력 값을 벡터로 인코딩하는 인코더, 벡터를 출력 값으로 디코딩하는 디코더 형식으로 구성한 것을 의미하며
예를 들은 구조는 다음과 같습니다.
RNN
RNN은 신경망 cell이 히든 노드라는 걸 출력으로 내보내서 연결돼 순환구조를 이루는 인공신경망의 한 종류입니다.
흔히 시계열 데이터라고 불리는 음성, 문자 등 순차적으로 등장하는 데이터 처리에 적합한 모델입니다.
RNN의 기본 구조는 다음과 같습니다.
$tanh$는 비선형 함수로 활성함수로서 사용됩니다.
즉 현재 셀의 상태는 이전 셀의 상태에 영향을 받도록 만든 것입니다.
RNN 훈련
훈련은 보통의 신경망과 비슷하게 역전파를 이용합니다.
RNN에서는 BPTT(BackProgation Through Time)이라고도 합니다.
계산하는 동안 연결되지 않은 부분의 출력은 무시합니다.
기본 RNN의 문제
긴 텍스트로 RNN을 훈련하려면 많은 cell이 필요합니다.
많은 cell이 필요하다는 것은 매우 깊은 네트워크가 된다는 의미이고
심층 신경망처럼 기울기 소실(Gradient Vanishing), 기울기 폭주(Gradient Exploding) 문제가 발생합니다.
또한 cell을 거치면서 일부 정보가 소실되므로 긴 문장을 번역하다 앞 부분을 까먹게되버리는 단기기억 문제도 있습니다.
긴 시퀀스는 처리하기 힘들다는 거죠.
불안정한 기울기 문제 해결법
심층 신경망에서 사용했던 기법을 RNN에서 사용할 수 있습니다.
- 좋은 가중치 초기화
- 빠른 옵티마이저
- 드롭아웃
- 그레이디언트 클리핑(gradient clipping)
등이 있지만 수렴하지 않는 활성화 함수 ex) ReLU를 쓸 경우 기울기 폭주 문제가 발생할 수 있으니
수렴하는 활성화 함수 ex) tanh 를 사용하시길 바랍니다.
배치 정규화도 도움이 될 수 있지만 타임 스텝 사이가 아니라 수직 방향으로 순환층 사이에만 조금 도움되니 크게 기대할 수 없습니다.
이렇게 해결법도 다양하고 모델마다 다르니 잘 찾아보고 하나 씩 적용해봐야할 것 같습니다.
LSTM
LSTM은 RNN의 단기기억 문제를 해결하기 위해 제안되었습니다.
기본적으로 RNN과 하는 역할은 똑같지만 cell 내부의 구조가 다릅니다.
RNN과 다르게 상태가 2개로 나뉘는데 Hidden State를 단기 상태, Cell State를 장기 상태라고 생각할 수 있습니다.
GRU
LSTM의 간소화된 버전입니다.
LSTM, GRU 모두 RNN 보다는 긴 시퀀스를 처리할 수 있게 만들어주었지만
100 타임 스텝 이상의 시퀀스에서는 학습하는 데 어려움이 있습니다.
1D 합성곱층
CNN 처럼 RNN도 합성곱층을 두어 시퀀스를 일단 줄여서 처리하는 방식입니다.
생각보다 특히 오디오에서 효과적입니다.
양방향 RNN
기존 RNN은 현재와 과거만 보지만 양방향을 사용하여 미래도 볼 수 있게 만든 RNN입니다.
문제점은 역시 단기기억입니다.
어텐션 메커니즘
단기기억을 해결하기 위해 경로를 짧게 만드는 법을 고안했습니다.
인코더와 디코더 사이에 정렬 모델(어텐션 층)을 두어 출력과 hidden state를 입력 받아
어떤 단어에 집중해야할지 학습하게 만듭니다.