Notice
Recent Posts
Recent Comments
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags
more
Archives
Today
Total
관리 메뉴

No Limitation

[논문 리뷰] Sequence to Sequence Learning with Neural Networks 본문

논문 리뷰

[논문 리뷰] Sequence to Sequence Learning with Neural Networks

yesungcho 2022. 2. 2. 18:44

 

강의 참고용

https://www.youtube.com/watch?v=4DzKM0vgG1Y

강의는 동빈나님의 강의를 참고하였습니다.

seq2seq는 말 그대로 sequence to sequence, 즉 한 나라의 언어로 된 시퀀스를 다른 나라의 언어 시퀀스로 번역하는 작업을 수행하는 방법이다. 즉, 번역을 하는 데에 최적화된 알고리즘이고 Transformer가 등장한 2017년 이전까지는 sota를 기록했던 알고리즘이다.

 

하나의 시퀀스는 여러 토큰으로 구성된 하나의 문장으로 간주할 수 있고 이러한 문장을 구성하는 요소들이 연속적으로 들어가 번역이 이루어지는데 내부적으로는 LSTM으로 구성이 되어 동작하게 된다.

 

내부적으로는 2개의 깊은 LSTM 신경망으로 구성이 되어 있는데 하나는 Encoder로, 즉 번역을 수행할 시퀀스를 하나의 fixed된 크기의 context vector로 나타내는 역할을 하고 다른 하나는 Decoder로, context vector를 읽어 번역을 수행하는 Decoder로서의 역할을 수행한다.

 

특별히 LSTM을 사용한 이유는 입력과 출력 사이의 시차가 존재하기 때문에 이러한 과업에 있어 적합한 기능을 수행하기 때문에 LSTM을 사용하였다고 한다. (제가 번역을 잘 했는지 모르겠네요)

원문:

The LSTM’s ability to successfully learn on data with long range temporal dependencies makes it a natural choice for this application due to the considerable time lag between the inputs and their corresponding outputs

 

하지만 이러한 seq2seq의 단점은 바로 fixed dimensionality라고 한다. 즉 context vector의 크기가 고정되어 있는데, 이 고정된 벡터에서 문맥의 특징을 반영해야 하므로 이 부분에 제한이 있어 번역에 제한이 있기 때문에, 이러한 부분을 개선한 모델이 transformer다.

 

그래서 transformer는 이러한 입력 시퀀스 전체에서 정보를 추출하는 방향으로 기존 seq2seq가 갖는 단점을 커버하였다.

 

동빈나님의 영상에서 간단하게 다룬 언어 모델(Language Model)을 간략하게 정리하고자 한다.

우선, 하나의 문장은 여러 개의 단어들로 구성이 됨을 알 수 있다.

그리고 이러한 문장에 확률을 부여하는 방법으로 동작하게 되는데, 예를 들어

‘한동대’라는 단어 다음에 등장하는 단어들로는

다음과 같은

‘한동대학교’

‘한동대학교 도서관’

‘한동대 lms’ ..

등과 같은 단어들이 등장할 확률이 높아 다음과 같은 단어를 추천하는 것을 알 수 있다.

 

 

이를 조금 더 수학적으로 접근하면

하나의 시퀀스(문장)을 W라고 하고 이를 구성하는 단어 하나하나를 w라고 하면

하나의 문장이 등장할 확률은 각 단어들이 등장할 확률들의 결합과 같다는 것을 알 수 있다.

즉,

“나는 커피가 좋다”라는 문장이 등장할 확률은

“나는” 이 등장할 확률, “커피가”가 등장할 확률, “좋다”가 등장할 확률을 결합한 것과 같은 것이다.

 

즉, 이를 수식으로 표현하면

즉,

으로 표현할 수 있는 것이다.

 

이를 기반으로 전통적인 통계 모델은 ‘단순 출현 빈도’를 바탕으로 확률 값을 계산하는 방식으로 동작하였다.

 

예를 들면

‘나는 치킨이’라는 문장 다음에 ‘좋다’라는 단어가 등장할 확률은 단순하게 전체 문장 데이터에서 ‘나는 치킨이’를 포함하는 문장의 빈도 대비 ‘나는 치킨이 좋다’를 포함하는 문장의 빈도를 계산하여 나누는 방식으로 계산하였다.

 

하지만 딱 보이다시피 이러한 방법은 많은 문제를 내포하게 된다.

우선 모든 확률 값을 계산하기 위해서는 매우 방대한 데이터가 필요한데 현실적으로 어렵다.

또한 매우 긴 문장의 경우 처리하기 어려운 문제가 존재한다.

P( 나는 정말 어제 머리가 너무 아파서 똥을 쌌다 ) ?

막 이런 문장이 있다 해보자.

 

그래서 보통 이런 경우 인접한 단어들만 확인하는 n-gram방법을 사용하게 된다.

 

그러면 이러한 전통적인 통계 방법에서 딥러닝이 적용되면서는 어떠한 움직임이 나타나게 될까?

 

RNN 기반의 메커니즘은 어떻게 동작하는지 확인해보자

본 논문에 나와 있는 부분을 참고해보면

초기 RNN 기반의 번역 메커니즘은 input size와 ouput size가 동일한 것을 가정하였다.

(x1,x2,...,xt)가 input이면 (y1,y2,...yt)가 output이라고 볼 수 있는 것이다.

 

다음 그림을 보자

hidden state는 이전까지 입력되었던 정보를 나타낸다. 우선 초기 hidden state인 h0는 0으로 초기화한 hidden state로 가정한다. 이 다음 처음 토큰인 ‘나는’이라는 입력이 들어오면 ‘나는’이라는 입력 데이터 정보를 가지게 되는 h1 hidden state가 구축이 된다. 다음으로 이 h1을 기반으로 1차 번역이 이루어 지고 ‘I’ 이 hidden state가 다음 stage로 넘어간 다음 ‘치킨이’라는 토큰이 입력되면서 “나는 치킨이”라는 정보를 담고 있는 h2 hidden state가 구축이 된다. 이러한 방법을 통해 번역이 수행된다.

 

하지만 현실적으로 input과 output 사이즈를 동일하게 함으로서 번역에 제한이 있고 또한

영어와 한국어의 경우 목적어와 서술어의 순서 차이도 문제가 되기 때문에 정확하게 사용되기는 어려운 한계가 존재하였다.

 

“그래서” 본 논문은 저렇게 하나의 토큰 별 output을 도출하는 방법이 아닌 전체 시퀀스에 대한 입력 값을 받아 context vector를 만든 다음에 decoding을 해주는 방법으로 접근을 시도했다고 볼 수 있다.

 

그리고 조금 더 긴 문장에 dependency가 강한 LSTM을 사용하였다.

동빈나 님의 강의자료

여기서 인코더의 경우는 마지막 hidden state를 context vector로 사용하고 ( 마지막 ht가 앞선 문맥에 대한 정보를 가지고 있기 때문이다. ) 인코더와 디코더는 다른 가중치 값을 가지게 된다.

 

다음 그림을 보자

다음 문장에서 우선

x의 경우 입력 단어

h의 경우, hidden state 즉, 현재까지 입력받은 정보에 대한 벡터값

s의 경우 현재까지 출력한 정보에 대한 벡터값

y의 경우 최종 출력 단어

를 의미한다.

 

다음으로 단어가 입력되면 ‘임베딩’을 거쳐주는데 이는 단어를 더미 코딩할 때 차원이 매우 커지는 것을 방지하여 차원이 작은 데이터로 표현해주는 작업을 거친다.

 

위 인코딩 작업의 경우 h0부터 h4까지 입력값이 들어올 때마다 hidden state를 업데이트해주고 과정이 끝난 마지막 h4의 hidden state 값을 context vector로 사용하게 된다.

 

다음으로 번역이 수행되는 언어인 영어에서도 마찬가지로 단어를 입력받고 context vector의 단어들을 디코더에 넣어준 다음 hidden state인 s를 구성하고 마지막으로 linear layer를 가지고 output을 도출한다.

 

또한 일반적으로 인코더에는 start of sequence (sos)를 의미하는 토큰과 end of sequence (eos)를 의미하는 토큰을 같이 넣어준다.

 

따라서 seq2seq의 경우 다음 공식에 따라 동작하게 된다.

미리 구축된 context vector를 ‘v’라고 할 때,

초기 y1은 v의 정보를 기반으로 도출이 되고 ( 이 때 문맥 정보를 갖는 hidden state s1이 만들어지고 )

y2는 s1과 v의 정보를 기반으로 도출이 되고

이러한 방법으로 yt가 <eos>가 될 때까지 동작하게 된다.