brunch

RNN의 단점을 극복한 seq2seq

chatGPT를 위한 NLP 기초 : seq2seq

by 별똥별 shooting star


들어가며

다들 한 번쯤은 구글이나 네이버에서 제공하는 번역기를 사용한 적이 있을 것이다. 이러한 번역기는 자연어 처리를 구현을 할 수 있다. 하지만 기존의 RNN으로는 구현하지 못한다. 그래서 고안된 것이 오늘 배울 seq2seq이다. seq2seq는 기계 번역뿐만 아니라 음성인식, 챗봇, 소스코드를 기계어로 변환하는 등의 작업도 진행할 수 있다. 그 원리는 시계열 데이터를 또 다른 시계열 데이터로 변환하기 때문이다. 오늘은 이 seq2seq에 대해서 살펴보는 시간을 가지도록 하겠다.


1. seq2seq

image.png


출처 : 밑바닥부터 시작하는 딥러닝2

seq2seq는 위의 그림과 같이 두 개의 RNN을 연결하여 구성한다. 입력을 받는 RNN은 Encoder 출력을 하는 RNN을 Decoder라고 부른다. 동작하는 방법은 아주 간단하다. Encoder의 마지막 time step의 hidden state를 Decoder에 전달한다. 이를 컨텍스트 벡터라고 부른다. 그리고 Decoder는 컨텍스트 벡터를 자신의 초기 hidden state로 하고 출력 문장을 생성한다.


컨텍스트 벡터(context vector)란 Encoder은 입력 문장의 모든 단어들을 순차적으로 입력받고 모든 단어를 압축한 단 하나의 정보이다.



2. LSTM을 활용한 seq2seq

아이디어는 굉장히 좋지만 단순한 RNN으로는 성능이 좋은 seq2seq를 만들기 어렵다. 그 이유는 앞서 얘기 했듯이 장기 의존 관계를 잘 학습할 수 없다. 그래서 RNN보다는 개선된 LSTM을 통하여 seq2seq를 구현한다.

image.png

위의 그림을 살펴보면 Encoder와 Decoder에 Embedding Layer가 있다. 이 층에서는 다양한 Embedding 방법을 사용할 수 있는데 대표적인 방법은 Word2Vec이다.(조금 더 자세한 설명은 아래의 링크를 참조하기 바란다)


https://brunch.co.kr/@26dbf56c3e594db/23

https://brunch.co.kr/@26dbf56c3e594db/30


그리고 Encoder는 Embedding된 벡터를 LSTM을 통하여 Context Vector 값을 만들어 Decoder에 전달한다. Decoder는 Embedding 레이어를 거친 y값에 Concatnate 하여 다시금 LSTM 신경망을 거친다. 여기서 Encoder와 차이점이 있는데 LSTM을 거친 값이 최종 값이 아니라 Fully connected Layer와 Softmax를 통과하여 매 time step마다 생성하는 출력을 차례대로 나열하여 번역 결과를 얻는다.


Fully Connected Layer : 완전 연결 계층으로 한 층의 모든 뉴런이 다음 층의 모든 뉴런과 연결된 상태, 1차원 벡터로 변환된 레이어를 하나의 벡터로 연결

Softmax : 입력받은 값을 0~1사이의 값으로 정규화하여 출력한 값이다.

https://dsbook.tistory.com/59

https://wikidocs.net/35476



3. seq2seq의 한계와 Attention

하지만 LSTM으로 구현을 해도 seq2seq의 구조상 명확한 한계가 존재하는데 컨텍스트 벡터가 고정된 길이로 정보를 압축한다는 것이 손실을 야기하여 문장이 길어질수록 성능이 저하될 수밖에 없다. 그래서 고안된 기법이 어텐션 메커니즘이다. 이는 Encoder의 최종 time step의 hidden state 값만 사용하는 것이 아닌 모든 time step의 hidden state를 활용해 컨텍스트 벡터를 구축하여 기존 seq2seq의 한계를 극복한다.



마치며

다음 시간부터는 Attention에 대해서 살펴보도록 하겠다. Attention을 이해하고 나면 이를 통해서 자연어 처리의 꽃인 트랜스포머를 공부해 볼 수 있게 될 것이니 기대를 해도 좋을 것 같다.

keyword
매거진의 이전글LSTM : 게이트가 추가된 RNN