seq2seq(Sequence to Sequence)

2021. 8. 4. 02:14IT Study/Ai

지금까지 우리는 단어의 분산표현과 언어모델들을 공부하였다. 특히 전 장에서 LSTM의 구조를 배웠다.

 

 

이제 이 언어모델을 실제 활용 하여 AI에게 새로운 문장을 만들게 할 수 있게되었다. 그리고 언어모델의 구조를 응용하여 챗봇이나 번역시스템등 여러가지 활용이 가능하다는 것을 이번에 알게 되었다.

 

 

이번 장에서 포스팅 할 내용은 Encoder와 Decoder의 구조와 그 2개를 결합해 seq2seq 즉 시계열 데이터를 시계열 데이터로 변환하는 작업을 진행 해 볼 것이다.

 

 


seq2seq의 전체모습

 

 

 

위 사진이 seq2seq의 전체적인 모습이다. 현재 모델의 목적은 번역이다. 구조안에 들어있는 요소들은 다 저번에 포스팅 했던 것들이라 충분히 알고있으리라 생각한다. 그렇다면 문제는 이러한 결합구조가 어떤 의미를 띄고 있느냐가 가장 중요한 것일 것이다. 

 

 

먼저 설명하자면 파란색 형광펜 앞쪽이 Encoder영역이고 뒤쪽이 Decoder영역이다.

 

 


Encoder

 

이 Encoder영역의 입력값과 출력값부터 보자.

 

먼저 이 Encoder영역의 입력값은 시계열 데이터이다. 이 시계열 데이터는 Embedding영역을 지나 LSTM으로 입력이 된다.  하지만 이 시계열 데이터는 지금까지와 본 것들과 다르게 단어의index가 아니라 문자열 그 자체이다. Embedding계층의 역할은 입력된 단어의 index를 통해 본인이 가지고 있는 가중치에서 해당되는 행을 뽑아서 전달해주는 것이였다. 그렇기에 이 시계열 데이터를 사용하기 위해는 문자열 -> index -> embedding을 거쳐야 하는 것이다. 

이 문자열 -> index의 역할이 char_to_id 기능으로써 seq2seq의 경우 Embedding계층에 추가되는 역할이다.

 

 

또한 이 문자열이 입력되는 경우는 한가지더 고려해야 하는데 바로 time_size즉 시계열의 크기이다. 위의 예시는 "나 는 고양이 로소 이다"이다. 이 경우에는 시계열의 크기가 5인 입력값을 가지고있다. 하지만 번역의 경우 이 한문장만 번역기능을 지원하지 않는다. "나 는 사람 이다"같은 크기가 4인 시계열 데이터도 처리 할줄 알아야한다. 하지만 이렇게 시계열 데이터가 변하게 되면 미니배치 처리를 할때 작업이 꼬이게되어 제대로 기능하지 않을 수 있다. 

 

// 실제로 지금까지한 LSTMLM같은 미니배치는 고정길이 시계열 기반으로 만들어졌음 600개의 단어가 입력이 들어오면 5개씩 끊을지 7개씩 끊을지 직접 설정해줬었음 예를들어 i am a cat and you are person so i can't understand your language. 이라는 15의 크기의 데이터가 있다하면 지금까지한 미니배치는 3개씩 끊는다 했을 때

 i am a  ,    cat and you ,   are person so  ,   i can't understand ,    your language. 으로 끊어져서 학습이 됬다. 이렇게 고정길이 시계열데이터를 전제로 미니배치 알고리즘이 만들어졌기 때문에 위의 같은 가변길이 데이터 같은 경우에는 미니배치가 잘이뤄지지 않을 수가 있다.

미니배치의 알고리즘은 직접 코드를 해석해보는 것을 추천한다. 

 

그렇기에 이 문제의 해결책중 하나는 padding이라는 기법이다. 패딩이라는 기법은 데이터의 크기를 고정해 놓고 만약 입력데이터가 그 크기보다 작다면 빈부분을 특정값으로 채워주는 것이다. 이 특정값은 상황에 따라 달라질 수 있다. 

만약 앞의 경우 "나 는 사람 이다."같은 경우에 "나 는 고양이 로소 이다."의 크기를 맞춰주기 위해 뒷부분 같은 곳에 "나 는 사람 이다.<특수기호>"같이 추가해 줄 수 있는 것이다.

 

 

이제 출력값을 보자. 이전에 봐왔던 LSTMLM같은 구조하고는 명확한 차이가 한 가지 있다. 바로 은닉 상태인 h가 위로 향하는 출력은 버려지게 되고 다음 시계열로 가는 값만 사용된다. 그리고 끝에는 마지막 시계열의 h만 Decoder로 넘어가게 된다. 그 외에는 별다른 차이점은 없다. 가중치의 형상도 같다. 

 

 

한가지 그냥 짚고 넘어갈 점은 역전파 정도인데 Decoder에서 기울기가 넘어오면 그걸 받아 저장하고 그대로 lstm과 embedding역전파를 진행하면 끝이다. 

 

 


Decoder

 

 

Decoder는 설명해야할 요소가 조금 많다. 총 두가지를 생각해야하는데 하나는 일반적인 학습의 경우이고 또 하나는 문자열을 생성하는 기능의 경우이다.

 

 

앞에서 설명했던 것 처럼 입력과 출력값을 고려하는게 우선적이지만 Decoder의 경우는 좀 다르다. 왜냐하면 학습의 경우에는 인풋값이 이미 제작이 된 시계열 데이터를 사용하는 반면 학습의 경우에는 순차적으로 인풋값을 하나하나 만들어내며 입력을 해 나가기 때문이다. 이 인풋값을 만든다는 내용은 밑에 후술하겠다.

 

 

먼저 학습의 경우를 살펴보자 먼저 Encoder에서 벡터화 되어진 은닉상태가 넘어 올 것이다. 이 값은 학습이 진행되면서 목적에 따라 그에 맞는 값으로 채워질 것이다. 예를들어 번역의 경우에는 Encoder에서 입력된 내용들과 번역에 필요한 여러 논리가 따라 올 것이다.

 

그렇게 되면 이제 학습을 진행하기 위해서 인풋값과 정답레이블을 마련하고 그에맞게 넣어주면 학습이 완료된다. 하지만 여기서 학습이되는 실질적인 내용은 Encoder에서 넘어온 h의 값 해석과 순차적인 결과값을 알맞게 내주는 정도라고 필자는 생각하고 있다. 

 

 

한가지더 헷갈릴 수 있는 점이 Decoder에는 존재하는데 모델을 쌓아논 탑 1개의 입력값과 출력값의 대응이다. 위의 모델을 살펴보면 <eos>를 넣으면 I가 출력이 되고 i를 넣으면 am이 출력 되는 것을 볼 수가있다. LSTM을 충분히 이해했다면 이 결과값은 어렵지 않게 이해가 될 것이다. 왜나하면 이 구조 자체가 입력단어가 들어오면 그다음 나올 단어의 확률들을 계산해 주기 때문이다.

*<eos> = 특수문자 = 구분자 = 시작/종료신호

그렇다면 만약 학습을 진행하기 위해 정답레이블의 위치를 설정한다 하자. 그러면 예를들어 <eos>의 입력값의 대한 정답레이블은 무엇이 되겠는가? 답은 당연히 그러면 I가 될 것이다. 이런식으로 정답레이블의 입력은 인풋보다 한칸씩 앞으로 땡겨져 들어가게 된다.

 

 

역시 오차의 역전파를 설명 안할 수는 없는데 이 역시 다른 모델과 같이 softmaxwithLoss에서 오차값이 나오면 affine 역전파 lstm역전파 embedding역전파를 진행 해주면 된다. 여기서 한가지 유의해야 할점은 Encoder에도 순전파 때 온 h의 역전파를 넘겨주기위해 lstm계층에서나온 dh를 따로 저장해 return해줘야 한다. 실제 학습 할 떄는 Decoder의 역전파를 Encoder의 역전파 인수로 넣어주면 끝이다.

 

 

두번 째경우로는 시계열데이터의 생성 부분에 있다. 만약 나 는 고양이 로소 이다. 라는 인풋값이 들어왔다면 우리가 궁극적으로 원하는 것은 출력값으로  i am a cat이 나오는 것이다. 이것은 지금까지 했던 신경망에서 predict의 부분이며 Decoder 모델탑 하나하나의 출력값을 오차의 역전파로만 사용하는게 아니라 순차적으로 전층의 출력값이 인풋값으로 이동, 출력값이 인풋값으로 이동의 일련의 행동을 종료신호가 나올 때까지 진행 하는 것이다. 

 

 

위 사진은 기본적인 LSTMLM의 모습이다. 우리가 맨처음 Decoder에게 <eos>값을 주게 되면 이 값이 은닉 상태인 h와 Decoder내부에 가중치에 영향을 받아 출력값으로 하나의 단어를 내놓게 된다. 위 사진 같은경우에는 i를 넣고 say가 출력이 됬다(say라는 단어가 sampling 됬다.). Decoder의 시계열데이터 생성 과정은 이 출력값을 다음 입력값으로 넣어주고 그 입력값이 출력값을 내면 또 그 값을 다음 입력값으로 넣어주는 작업을 반복하는 것이다. 이 행동을 size를 정해줘서 직접 크기를 지정해 반복횟수를 지정하거나 종료신호 구분자를 이용해서 멈추기도 한다.

 

 

이 과정에서 softmax를 이용한 출력값에 확률적 단어 선택을 사용하는 분야가 있고 argmax를 이용한 결정적 단어를 선택하는 분야가 있다. 번역의 경우에는 "i"에 해당하는 "나"가 1:1대응이면서 다른 경우는 인정하지 않는 경우이기 때문에 시계열 데이터 생성과정에서는 Softmax가 아닌 argmax알고리즘을 사용하게 된다.

 

*argmax : affine계층에서 넘어온 값들중에 가장 점수가 큰값의 Id를 반환하는 알고리즘 -> softmax의 정규화를 하지않아도 대소관계는 변하지 않기 때문에 상관없음

 

 

참고로 이 작업들을 진행할 때  Lstm의 reset_state 즉 기억셀의 초기화의 유무는 반드시 고려해야 한다.

'IT Study > Ai' 카테고리의 다른 글

Attention(어텐션)  (0) 2021.08.17
Seq2Seq 개선 (Reverse, Peeky, Attention-어텐션)  (0) 2021.08.14
LSTM(Long Short-Term Memory)  (0) 2021.07.30
RNNLM(RNN Language Model)  (0) 2021.07.28
RNN, Truncated BPTT, Time RNN  (0) 2021.07.27