HAZEL

[ NLP : CH10. 기계 번역 ] seq2seq, attention , Input Feeding 본문

DATA ANALYSIS/NLP

[ NLP : CH10. 기계 번역 ] seq2seq, attention , Input Feeding

Rmsid01 2021. 2. 17. 22:58

※ 미완성 : 추가적으로 학습한 후, 다시 정리하기.


10장. 기계 번역 ( machine translation : MT ) 

10.1. 번역의 목표

: 문장이 주어졌을 때, 가능한 다른 언어의 번역 문장중 최대 확률을 갖는 문장을 찾아내는 것

10.1.1. 기계번역의 역사

1) 규칙 기반 기계 번역 ( RBMT )

: 인간이 언어를 학습하는 방식과 비슷한 전통적인 번역 방식임. 문장을 분석하고 규칙을 세워 번역하는 것

: 통계 기반에 비해 자연스러운 번역이 가능하지만, 모든 규칙을 만들어줘야하므로, 자원과 시간이 많이 소모됨. 

 

2) 통계 기반 번역 ( SMT ) 

: 대량의 양뱡향 코퍼스에서 통계를 얻어내 번역 시스템을 구성하는 것

 

3) 딥러닝 이전의 신경망 기계 번역  ( NMT )

: 인코더 - 디코더의 형태의 구조로 신경망을 이용하여 기계번역을 실시하였지만, 지금과 같은 성능은 아니었다.

 

4) 딥러닝 이후의 신경망 기계 번역 

: 딥러닝을 활용하면서, 매우 좋은 성능을 보여 대부분의 곳에서는 딥러닝을 이용한 신경망 기계 번역을 사용한다.

 

※ 신경망 기계 번역의 장점

a. end-to-end 모델 : 통계기반의 경우, 번역시스템이 여러 모듈로 되어있어 복잡하였으나, 딥러닝은 하나의 모델로 번역을 수행함으로 성능을 극대화했다.

b. 더 나은 언어 모델 :  신경망 언어 모델 ( NNLM ) 기반의 구조이므로, 통계 기반의 n-gram 방식보다 더 강하다. 따라서 희소성 문제가 해결되었으며, 자연스러운 번역 결과 문장의 생성에서 강점을 나타낸다. 

c. 훌륭한 문장 임베딩 : 문장을 차원 축소하여 임베딩 벡터로 만들어내는 능력이 탁월하다. 따라서 노이즈나 희소성 문제를 잘 대처할 수 있다. 

 

 

10.2. Seq2Seq ( Sequence-to-Sequence) 

: 입력된 시퀀스로부터 다른 도메인의 문장을 출력하는 모델 ex, 챗봇 (  입력 - 질문, 출력- 답 ) , 번역, 내용 요약 , STT(Speech to Text ). 번역기에 대표적으로 사용되는 모델

 

10.2.1. 구조

1) Seq2seq 모델을 활용하여 MLE 수행해 주어진 데이터를 잘 설명하는 파라미터 θ 찾는 것 

$$ \hat{\theta } = argmax_\theta P(Y|X;\theta) $$

$$ where = \left \{ x_1,x_2, .., x_n \right \}, Y = \left \{ y_1,y_2, .., y_m \right \} $$ 

 

2) P(Y|X;θ)를 최대로 하는 모델 파라미터를 찾는 작업. 파라미터에 대한 학습이 완료되면, 사후 확률을 최대로 하는 Y를 찾아야함.

$$  \hat{ Y } = argmax_{ Y\in y} P(Y|X;\theta) $$ 

 

=> 위의 과정을 위해서, seq2seq는 크게 3개의 서브 모듈 인코더 + 디코더 + 생성자 ( generator ) 로 구성됨 

 ※ 김기현의 자연어 책에서는 3개로 나뉜다고 했지만, 다른 자료들에서는 보통 인코더 + 디코더 ( 생성사 포함 ) 아키텍쳐로 설명한다. 

 

이미지 출처 : https://developpaper.com/using-seq2seq-to-realize-chinese-english-translation/

 

1] 인코더 : ' 어떤 시계열 데이터를 압축 ! 하여 벡터로 만든다 '

 

: 주어진 문장인 여러 개의 벡터를 입력으로 받아 문장을 함축하는 문장 임벡딩 벡터로 만들어 냄.

: 문장을 차원 축소하여 해당 도메인 잠재공간(latent space)의 어떤 하나의 점에 투영하는 작업

 

* 텍스트 분류 문제에서는 중립적인 단어까지 정보를 간직할 필요는 없지만, 기계번역을 위한 문장 임베딩 벡터를 생성하려면, 최대한 많은 정보를 간직해야한다. 

 

※ CONTEXT VECTOR

: 인코더에서 입력문장의 모든 단어를 순차적으로 입력을 받은 후에, 만들어진 하나의 벡터

: 결국, 인코더에서 마지막 RNN 셀의 은닉 상태 값을 말하는 것 = 고정 길이 벡터 

: 입력 문장의 모든 단어 토큰들의 정보를 요약해서 담고 있다. 

-> 입력 문장의 정보가 하나의 CONTEXT VECTOR로 압축되어 디코더로 전송한다.  

 

2] 디코더 : ' 압축된 벡터를 다른 시계열 데이터로 변환해준다 ' 

 

: 기본적으로 RNNLM의 연장선으로 조건부 신경망 언어모델 ( CNNLM : Conditional neural network language model )

: 인코더의 결과인 문장 임베딩 벡터와 이전 time-step까지 번역하여 생성한 단어들에 기반하여 현재 time-step 단어를 생성한다. 

: context vector를 받아서 번역된 단어를 한 개씩 순차적으로 출력한다. 

- 신경망 언어 모델과 같이 디코더 입력의 초기값으로 $ y_0 $ 에 BOS토큰( SOS )을 입력으로 준다. 

 

 교사 강요 ( Teacher forcing ) : Target word를 디코더의 다음 입력으로 넣어주는 기법

: seq2seq은 훈련과정과 테스트 과정의 작동 방식이 다르다. 

 1) 훈련과정 : 디코더에게 인코더가 보낸 컨텍스트 벡터와 실제 정답을 입력 받았을 때, 실제 정답을 알려주면서 훈련하는 것이다. 

 2) 테스트 과정 : 오직 context vector와 <sos> 만으로 다음에 올 단어를 예측하고, 그 단어를 다음 시점의 셀의 입력으로 넣는 행위를 반복한다. 

 

교사강요를 하는 이유는! 

훈련과정에서 다음 단어를 잘 예측한다면, 상관 없지만 이전 시점의 디코더 셀의 예측이 틀렸는데, 그것을 현재 시점의 디코더 입력을 사용하면, 예측이 잘못될 가능성이 커진다. 이것의 연쇄 작용으로 디코더 전체의 예측을 어렵게 하고 훈련 속도 저하의 원인이 된다. 따라서, 강제로 교육하는 방법을 사용하는 것이다! 

 

- 장점 : 학습이 빠르다. 

- 단점 : 노출 편향 문제 ( exposure bias problem ) :  추론 과정에서는 실제값을 제공할 수 없어, 자기 자신의 출력값을 기반으로만 예측을 이어가야한다.  즉, 학습과  테스트 단계 사이의 차이가 존재하여 모델의 안정성을 떨어뜨릴 수 있다. 

 

그러나, 이러한 문제가 생각만큼 큰 영향을 미치지 않는다는 연구 결과가 나와 있다고 한다.

(T. He, J. Zhang, Z. Zhou, and J. Glass. Quantifying Exposure Bias for Neural Language Generation (2019), arXiv.)

 

3] 생성자

* 김기현 자연어처리를 외의 다른 곳에서는 이 부분을 디코더와 함께 설명하고 있다. 

: 디코더에서 각 time-step별로 결과 백터 ${ h_t}^ { tgt} $ 를 받아 softmax를 계산하여 각 타깃 언어의 단어(어휘)별 확률값을 반환하는 것.  -> 이산확률 분포가 된다.

=  디코더의 각 시점에서 출력 벡터가 나오면, softmax 함수를 사용하여, 확률값을 반환 

- 문장의 길이가 |Y| = m일때 맨 마지막 반환되는 단어 $ y_m $ 은 EOS로 디코더 계산의 종료를 나타냄 

 

 

10.2.2. 한계점 

1) 장기 기억력

: 압축할 수 있는 정보에 한계가 있다보니, 문장이 길어질수록 압축 성능이 떨어짐

 

2) 구조 정보의 부재

: 딥러닝 자연어 처리는 단순히 시퀀스 데이터로 다루는 경향이 있는데, 다음 단계로 나아가려면 구조 정보도 필요할 것이라고 봄

 

3) 챗봇 또는 QA봇 

: 번역이나 요약 문제는 새롭게 추가 되는 정보가 거의 없어서 문제가 적지만, 새로운 지식 정보가 추가되는 챗봇과 같은 경우 더 발전된 구조가 필요함 

 

10.3. 어텐션  (  Attention  )  

: 입력문장에서 예측해야할 단어와 연관있는 단어에 가중치 ! attention ! 집중 !  해서 본다. 

 

10.3.0. 어텐션은 왜 필요한가?!

단순히  Seq2Seq 모델을 사용한다면, 하나의 고정된 크기의 벡터에 모든 정보를 압축하다 보니, 정보 손실이 발생한다.

왜냐하면, 인코더의 마지막 hidden state만 디코더에서 사용하기 때문이다. 이러한 문제를 해결하기 위해서, 마지막 hidden state 뿐만 아니라, 각 time-step 의 hidden state 도 사용하는 것이 attention 이다. 

 

10.3.1. 어텐션 

: attention은 쿼리와 비슷한 값을 가진 key를 찾아서 그 값(value) 를 얻는 과정이다. 

dic = { '형광펜' : 3 , '수첩' : 7 , '지우개' : 4 }

즉, 쿼리가 주어졌을 때, key값을 통해 value값에 접근 하는 것이다. 

코드로 표현하자면, 아래와 같다.

def key_value_fnc ( query ):
    weights = []
    
    for key in dic.keys():
        weights += [is_same(key, query)] 
        
    weight_sum = sum(weights) 

    for i , w in enumerate (weights):
        weights[i] = weights[i] / weight_sum
        
    answer = 0
    
    for weight, value in zip(weights, dic.values()):
        answer += weight * value
        
    return answer 

def is_same(key, query):
    if key == query :
        return 1.
    else :
        return .0
    
key_value_fnc('형광펜') # 3.0

어텐션이란 즉, query와 비슷한 key값을 찾아서 비슷한 정도에 따라 weight를 정하고, 각 key의 value값을 weight값 만큼 가져와서 모두 더하는 것을 의미한다! 

 

 

10.3.2. 어텐션이란, 기계번역에서의 어텐션

※ 앞으로 나올 모델은 seq2seq 에서 attention 을 추가한 모델을 설명한 것이다. 

- key , value = 인코더의 각 time-step 별 출력 ( 각 소스 언어의 단어 또는 문장, 의미 )

- query = 현재 time-step의 디코더 출력  ( 번역된 타깃 언어의 단어 또는 문장, 의미 ) 

-> attention을 계산 

 

: Attention-based seq2seq은 아래의 그림의 구조를 가진다. seq2seq에서는 단순하게 모든 인풋을 받아 context vector을 반환했다면, attention을 추가한 seq2seq은 디코더의 출력을 query로 하여, attetion의 가중치를 구한 값을 context vector로 만들어준다. 이것을 해당 time-step의 output과 concat한 다음, tanh를 취하고 softmax계산을 통해 최종 해당 time-step의 output을 만들어 주는 것이다.

 

이미지 출처 : https://www.researchgate.net/figure/An-attention-based-seq2seq-model_fig3_329464533

 

10.4. Input Feeding 

※ 앞으로 나올 모델은 seq2seq 에서 attention / input feeding 을 추가한 모델을 설명한 것이다. 

 

: Seq2seq 에 attention을 추가한 모델 구조에서 decoder 의 outputr과 attention의 결과 값을 concat하여, softmax를 취한다. 하지만, softmax과정에서 많은 정보가 손실되기 때문에, softmax 이전의 값도 다음 time-step에 넣어준다. 이 때, 임베딩 작업이 필요없기 때문에, RNN (모델 ) 전에 넣어준다. 

 

< 이미지 삽입 하기 > 

 

 

- 단점  : 훈련 속도 저하 

 : input feeding 을 사용하기 전에는 인코더 / 디코더 모두 모든 time-step에 대해서 한번에 연산이 가능 했다. 그러나, input feeding의 사용으로 디코더 RNN의 입력으로 이전 time-step의 결과 ( $ \tilde{h_{t-1}^{tgt}}  $ ) 가 필요하게 되어 각 time-step 별로 순차적으로 계싼해야한다.  하지만, 어차피 추론 단계에서는 순차적으로 수행해야하기 때문에, 추론 단계에서는 큰 차이는 없다. 

 

- 장점 : 성능 개선 

: basic seq2seq 에 비해서, attention 을 추가하고, input feeding 을 추가한 것이 BLEU SCORE 가 더 좋게 나왔다. 

 

 


** 본 게시글은 아래 자연어 책을 공부하면서 작성하였습니다.

출처 : 김기현의 자연어 처리 딥러닝 캠프 _ 파이 토치 편

** 책에서 간단하게 넘어간 내용은, 아래 글들을 참고하였습니다.

wikidocs.net/22893

m.blog.naver.com/sooftware/221790750668