저번 문서에서는 sequential data를 처리하는데 최적화 되어 있는 RNN, LSTM, GRU 모델을 살펴보았다. 이번에는 다양한 sequential modeling 방법을 알아볼 것이다.
1. Sequential Modeling
인간이 만들어 내는 대부분의 데이터는 sequential data이며 sequential data를 이용해 정보처리를 하면 다음과 같은 세가지 모델이 기본이 될 것이다.
next step prediction은 주식 값 예측, classfication은 텍스트 데이터로 긍정적인 감정인지 부정적인 감정인지 레이블을 다는 것, sequence를 받아서 sequence를 만들어내는 sequence generation이 있다. 이 중 요즘에 가장 많이 사용되는 것은 sequence generation이다. Sequence generation에는 기계번역, 음성 인식, 이미지 캡셔닝 등이 있다.
바로 앞 문서에서 synched many to many 구조를 기반으로 RNN을 설명했지만 다양한 형태가 존재한다. 하지만 문제는 지금까지 설명한 RNN, LSTM, GRU 모델은 다 synched many to many 구조로만 동작할 수 있다는 것이다. 따라서 다른 구조들을 다 synched many to many 구조로 변형해서 처리해야 한다.
따라서 이제부터 one to many, many to one, many to many 구조를 어떻게 LSTM, GRU로 처리 할 것인지 공부하겠다.
2. Synced Many to Many
Synced Many to Many는 training data가 n개 있는 것이라고 보면 된다. 입력, 출력, 입력, 출력 순서로 학습이 이루진다.
학습방법은 원래 나와야 하는 값인 $y_{i}$과 모델에서 나온 예측된 값인 $o_{i}$ 과의 차이를 계산해서 summation 한것을 total error 라고 정의하여 학습한다. 여기서는 MSE loss를 사용했지만 cross entropy loss를 사용해도 된다.
학습을 진행할 때는 미분을 해야 하는데 Synced Many to Many는 hidden layer가 여러개 있는 MLP라고 할 수 있다. 물론 중간에서 입력이 계속 들어가고 중간에서 출력이 계속 나오지면 별로 다를 것이 없다. MLP를 학습할 때는 layer 단위로 학습을 했는데 마찬가지로 아래 그림처럼 $W$는 $h$를 거치는 함수라고 생각하여 역전파를 하면 된다.
하지만 여기서 $\frac{\partial h_{i}}{\partial w}$는 바로 연결되는 함수지만 $\frac{\partial E}{\partial h_{i}}$는 바로 연결되지 않기 때문에 구하기가 어렵다. $h_{3}$ 기준으로 생각을 해보자.
$h_{3}$가 $E$까지 가는 경로는 $o_{3}$를 거치는 길과 $h_{4}$거치는 길 두가지가 있다. Recursive하게 $h_{4}$는 $o_{4}$를 거치는 길과 $h_{5}$거치는 길 두 가지가 있다. 이렇게 recursive한 형식으로 미분할 수 있다.
3. One to Many
One to many는 입력이 1개 출력이 여러개인 구조이다.
그럼 어떻게 이것을 Synced Many to Many 구조로 변경할 수 있을까. 입력이 없다는 뜻을 가진 입력을 넣으면 될 것이다. 하지만 이렇게는 잘 안하고 다음처럼 $y_{i}$라는 가상의 입력을 넣어준다.
왜 $y_{i}$를 넣어줄까.
우리가 그림 하나를 주고 첫 번째 단어를 맞추라고 하면 NN은 이를 못맞출 것이다. 따라서 우리는 다음 입력으로 첫 번째 단어를 힌트를 주면서 두 번째 단어를 맞추라고 한다. NN은 또 못 맞출 것이다. 그러면 다시 다음 입력으로 두 번째 단어를 힌트를 주면서 세 번째 단어를 맞추라고 한다. 즉, training 할 때는 우리가 정답을 알고 있으니깐 정답을 하나씩 친절하게 알려주어 $x y_{1} y_{2} y_{3}...y_{n-1}\rightarrow y_{1} y_{2} y_{3}...y_{n}$ 처럼 many to many 구조가 되는 것이다.
학습은 many to many 구조와 같은 방식으로 이루어진다.
그럼 이제 문제는 테스트할 때인데 training 할 때는 정답을 알고 있기 때문에 NN에게 가상의 입력으로 정답을 주었다. 하지만 test 할 때는 우리가 실제 y값을 모른다. Test시에는 첫 번째 정답을 맞출 것이다 그렇게 학습을 시켰으니깐. 그러면 간단하게 정답 대신에 출력값 $o_{1}$을 그 다음 단계의 입력으로 주면 된다. 왜냐면 $o_{1}$은 $y_{1}$과 아주 유사한 값을 가질 것이기 때문이다.
하지만 점점 뒤로 갈수로 정답률이 떨어지는 문제가 있다. 예를 들어 첫번째 출력은 정답과 99% 일치한다라고 하고 이것이 두번째 입력으로 들어가면 그 때 나온 출력값이 정답일 확률은 98%가 될것이고, 같은 방식으로 그 다음 출력값이 정답일 확률은 97%가 되고 그 다음은 더 떨어지게 된다. 이게 caption generation이 긴 문장을 만들 때는 어려운 이유이다.
One to many의 예시이다.
4. Many to One
Many to One은 입력은 여러개인데 출력이 하나인 경우이다.
이 구조는 중간 단계에서 출력이 안나오게 할 수는 없다. 그림에서는 그리지 않았지만 중간단계의 출력이 존재한다는 말이다. 그 중간단계의 출력들을 무시하고 우리는 마지막의 출력값만 가져다가 쓰게다는 것이다. 그래서 training을 위해서 구조를 크게 바꿀 필요가 없다. 무시한다는 말은 그냥 error 함수를 잡을 때 마지막 것만 신경쓰도록 하면 된다.
따라서 error는 $o$에 대한 함수가 되고 학습은 synched many to many와 유사하게 진행하면 된다.
5. Many to Many
Many to Many는 입력과 출력값이 모두 여러개인 구조이다.
이 구조를 두개로 나누어 보면 앞 부부은 many to one 그리고 뒷 부분은 one to many 구조가 sequential 하게 연결되어 있다고 할 수 있다.
앞 부분에서는 입력들이 들어가서 벡터로 나온다. hidden layer의 출력값이기 때문에. 그 벡터값은 전체의 입력을 대표하는 어떤 값이라고 할 수 있다. 다시 뒷 부분은 이 전체의 입력을 대표하는 벡터값을 입력으로 하여 풀어내고 있다. 따라서
지금 말 한것이
Training은 다음과 같이 진행한다.
Test는 다음과 같이 진행한다.
Many to Many의 예시인 word embedding이다. Encoder에서 나온 값인 $h_{8}$를 decoder의 입력으로 사용한다.
6. Handling words
Caption generation이나 machine translation에서 입력인 단어로 들어가는 데 단어들을 어떻게 입력으로 집어넣는지 알아본다.
단어를 처리하는 것은 간단하다. 첫 번째는 전처리가 필요하다. 나타나는 단어들의 unique word를 찾고 그 단어배열에 대한 ont-hot encoding을 한다.
이렇게 enconding을 하고 나서 입력으로 주는데 embedding layer를 추가하여 one-hot vector와 fully connected를 구성한다. 그 이유는 one-hot encoding의 차원은 단어의 개수만큼 되어 엄청나게 큰 배열일텐데 embedding layer로 작은 차원으로 줄여준다. Embedding layer는 그냥 hidden layer 라고 보면 된다.
그러면 이 embedding layer는 누가 학습시킬까. RNN을 학습시킬때 같이 시키면 된다. 내가 원하는 출력이 나오도록 하는 embedding을 만들어내는 것이다.
출력을 할때는 softmax를 사용하기 때문에 softmax중에서 가장 큰 값을 골라 그에 해당하는 단어를 선택하면 된다.
정리하면 단어는 nominal value이기 때문에 one-hot encoding을 사용하면 된다. 입력으로 줄 때는 embedding layer를 추가하여 원하는 차원으로 줄인다. 출력은 softmax로 나오는데 이를 one-hot encoding으로 출력하여 결과값을 얻는다.
이번 문서에서는 다양한 sequence modeling 구조를 살펴보았다. 다음에는 RNN의 attention model을 공부해 볼 것이다.