순환 신경망(RNN)은 시계열 데이터나 텍스트 데이터처럼 순차적인 입력 데이터를 처리를 위해 설계된 신경망이다.
RNN과 같이 순차적으로 계산되는 구조는 시간 순서로 풀어내서 하나의 계산 그래프로 표현할 수 있는데, 이를 Unfolding이라고 한다.
예를 들어, 다음과 같이 Unfolding을 수행할 수 있다.
RNN의 경우, 현재 Time-step에서의 입력 신호 를 포함하여 현재 상태를 갱신해야 하므로, 수식은 다음과 같이 표현된다.
RNN에 자주 사용되는 설계 패턴은 다음과 같다.
각 Time-step마다 출력을 생성하고, 은닉 유닛 간 순환 연결을 형성 (대표적인 방식)
각 Time-step마다 출력을 생성하고, 현재 시간 단계의 출력은 다음 단계의 은닉 유닛으로 순환 연결
은닉 유닛 간 순환 연결하고, 전체 시퀀스에 대해 단일 출력을 생성
RNN에서의 순전파(Forward propagation)는 다음과 같이 정의된다.
.
RNN에서 출력은 여러 시간 단계에 존재하기 때문에, 모든 시간 단계에서의 출력에 대한 손실을 역전파해야 한다.
이를 BPTT(Backpropagation through time)이라고 하며, 모든 시간 단계에 대한 손실을 계산해야 하기 때문에 계산량이 많다.
Deep RNN은 일반적인 RNN을 더 깊이 쌓아 올린 구조로, 더 복잡한 패턴을 학습하기 위해 여러 층의 은닉층을 두는 네트워크이다.
Seq2Seq 아키텍처는 입력 시퀀스와 출력 시퀀스의 길이가 다른 문제를 처리할 때 주로 활용된다. 예를 들면, 기계 번역, 질문과 응답과 같은 작업이 이에 해당한다.
우리가 RNN에 어떠한 컨텍스트를 집어넣은 경우, Seq2Seq 아키텍처는 다음 과정으로 출력 시퀀스를 생성한다.
1) Encoder는 입력 컨텍스트를 요약하여 문맥 벡터 를 구성
2) Decoder는 이 문맥 벡터 를 복원하여 새로운 시퀀스(출력 시퀀스)를 생성
일반적인 RNN은 이전 상태의 정보를 순차적으로 입력받기 때문에 입력 시퀀스가 길어질수록 과거의 정보가 희석된다. 이를 장기 의존성 문제라고 한다.
이러한 장기 의존성 문제를 해결하기 위해 장단기 메모리(LSTM)라는 신경망이 설계되었다.
LSTM은 셀 상태(Cell state)를 두어 중요한 정보를 장기간 유지할 수 있도록 한다. 이러한 셀 상태는 자기 연결(Self-connection)을 구성하며, 여러가지 게이트에 의해 셀 상태가 결정된다.
망각 게이트(Forget gate) : 이전의 정보 중 무엇을 잊을지 결정하는 역할을 한다.
1로 설정될 경우, 이전 정보를 완전히 유지한다.
0으로 설정될 경우, 이전 정보를 완전히 잊는다.
0과 1사이의 어떤 값이라면, 일부는 잊고 일부는 기억한다.
입력 게이트(Input gate) : 새로운 정보 중에서 무엇을 받아들일지 결정한다.
: Input gate
: Input
출력 게이트(Output gate) : 업데이트된 컨텍스트를 히든 노드로 전달한다.
LSTM의 셀 상태는 입력 및 망각 게이트의 조합을 통해 결정되며, 장기 메모리는 셀 상태(Cell State)에 저장된다.