본문 바로가기
BOOSTCAMP AI TECH/4주차_자연어 처리

[BOOSTCAMP AI TECH] 18일차_Seq2Seq with attention, BLEU

by 이민우 2021. 2. 17.
728x90
반응형
  • 강의 목록

- Sequence to Sequence with Attention

- Beam Search and BLEU


  • 요약

강의

Seq2Seq 모델을 구현하기 위해 인코더와 디코더, 그리고 attention 모델에 대해 학습했다.

그리고 모델의 평가 지표인 BELU에 대해 학습했다.

 

피어세션

어제 학습한 내용을 복습하는 시간을 가졌다.


  • 학습정리

Seq2Seq Model

  • RNN의 구조 중 many-to-many 형태에 속한다. (입출력이 모두 시퀀스)
  • many-to-many 중 모든 입력을 읽은 후 하나씩 출력을 하는 모델
  • 인코더와 디코더로 구성되어 있다.
  • 인코더 : 입력문장을 순차적으로 읽어들이는 RNN 모델
  • 디코더 : 출력문장을 순차적으로 생성하는 RNN 모델
  • 인코더와 디코더는 서로의 파라미터를 공유하지 않는다. (별개의 RNN 모델로, 연결되지 않는다.)
  • 중간의 Thought vectorHidden state vector인(H0) 디코더의 첫 번째 타임스탭을 생성한다.
  • H0은 인코더에서 수집한 정보들을 담아두었다가, 이를 바탕으로 디코더가 순차적으로 대응하는 단어들을 예측한다.

 


 

Seq2Seq with Attention

  • 추가적인 모듈로써 어텐션을 활용할 수 있다.
  • 기존 RNN은 구조상 히든 스테이트 벡터의 차원이 정해져있어, 입력 문장의 길이에 관계 없이 고정된 차원 안에 모든 시퀀스 정보를 압축하여 저장해야 했다. 이로 인해 앞에서 나타난 정보들을 잘 저장하지 못하는 현상이 발생했다.
예를 들어 I go home 문장을 번역하는 경우, 주어를 먼저 번역해야 하는데 주어의 특성 상 가장 먼저 나와 정보가 유실될 수 있다. 이로 인해 번역문의 품질이 낮아질 수 있다.
이에 대한 차선책으로 입력 문장을 거꾸로 뒤집어 home go I 를 넣어 문장의 초반 단어들이 잘 생성될 수 있도록 하기도 했다.

 

  • 추가적인 Attention 세팅을 사용하게 되면, 디코더는 h(0)에만 의존하는 것이 아니라, 입력 문장의 각 단어들을 순차적으로 인코딩하며 나온 인코딩 스테이트 벡터를 활용해 각 타임스탭에서 단어를 생성할 때 필요한 인코딩 스테이트 벡터를 선별적으로 활용하게 된다.

 

 

동작 과정

  1. 첫 디코더는 <SOS>와 h(0)을 입력으로 받아 첫 번째 디코더의 히든 스테이트 벡터를 출력한다.
  2. 출력한 디코더의 히든 스테이트 벡터가 인코더 히든 스테이트 벡터 각각과 내적 연산을 수행한다.
  3. 내적으로 계산된 값에 따라 유사도를 계산하고 softmax를 통해 확률을 구하고, 이를 기반으로 필요한 인코딩 스테이트 벡터 (컨텍스트 벡터)를 선별해 이를 통해 어텐션 모듈을 정의하고, 인코더 히든 스테이트 벡터들과 디코더 히든 스테이트 벡터를 입력으로 받아 다음에 나올 단어를 예측한다.

*softmax의 결과로 합이 1인 가중치의 집합을 attention vector라고 부른다.

*디코더 히든 스테이트 벡터를 만드는 디코더 RNN은 output 단어를 예측하는 것과 필요한 정보를 선택하는 두 가지 역할을 맡는다.

*역전파의 과정에서 보면 최종 출력 (the)는 Decoder RNN과, Attention 모델, Encoder RNN으로 동시에 전개하며 학습한다.

 

 

Teacher Forcing

  • 다음 입력값으로 주어져야 하는 값이 정해져있는데, 이전 모델이 다른 출력값을 출력하면 원하는 문장이 나오지 않는다.
 ex) 입력 : 식사는 / 예상 : 식사는 맛있게 하셨습니까? / 출력 : 식사는 잘 모르겠어요.
  • 이런 상황에 사용한다.
  • 예측된 값이 아닌, 원래 예측되어야 하는 값을 출력으로 간주해 다음 입력에 넣어준다.
  • 학습을 더 빠르고 용이하게 진행되도록 도와주지만, 아무래도 실사용에서는 사용이 불가능하기 때문에 학습 단계와 차이가 발생한다.
  • 이러한 문제를 노출 편향 문제라 한다.
  • 노출 편향 문제를 방지하기 위해서 과도하게 사용하지 않고 적절하게 사용해야 하는데, 그 예시로 초반에만 사용하고 어느정도 학습이 진행되었으면 더 이상 사용하지 않는 방법이 있다.

*다만 노출 편향 문제는 모델 자체에 큰 영향을 미치지 않음이 확인되었다.

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

 

 

Various Attention Mechanisms

좌 : Bahdanau Attention 우 : Luong Attention
차례대로 일반 어텐션, Luong 어텐션, Bahdanau 어텐션 / h(t) : 디코더의 히든 스테이트 벡터 / h(s) : 인코더의 워드별 히든 스테이트 벡터

1) Luong Attention

  • hidden state의 내적 사이에 가중치 행렬 W(a)를 곱해준 것.
  • 행렬의 각 index끼리의 계산에 가중치를 부여한 것이다.

 

2) Bahdanau Attention

  • Concat으로 통합한 다음 MLP(완전 연결 레이어)를 만들어서 유사도를 구하는 것.

*Luong Attention은 Bahdanau Attention에 비해 디코더의 Hidden state vector를 구하는 방식이 간소화되었고, 결과적으로 어텐션 모듈의 계산이 간소화되었다.

 

Attention의 장단점

  • 디코더가 매 타임 스텝마다 입력 시퀀스의 특정 정보를 사용함으로 성능이 향상되었다.
  • 인코더의 마지막 출력값만을 사용해서 번역을 수행해야 해서 긴 문장에 대해 번역이 잘 되지 않는 BottleNeck Problem을 해결했다.
  • 경사도 감소 문제를 해결했다.
  • 어텐션 분포를 조사하면 디코더가 무엇에 초점을 맞추었는지 확인할 수 있어 해석 가능성이 준재한다. 또한 내부적인 어텐션 모듈도 스스로 학습해 언제 어떤 단어를 학습해야 하는지 알 수 있게 해준다.

 

 


 Greedy Decoding

  • Seq2Seq 모델 중 자연어 생성 모델.
  • 매 타임스텝마다 가장 높은 확률을 가지는 단어 하나만을 선택해서 디코딩을 진행한다.
  • 이를 Greedy decoding이라고 부른다.
  • 즉, 전체적인 확률 분포를 보는 것이 아닌, 현재 타임 스텝을 기준으로 가장 좋아보이는 확률을 그 때 그 때 선택한다.
  • 그런데 Greedy decoding은 잘못 예측해도 다시 이전으로 돌아갈 수 없어 중간에 잘못 예측하면 그대로 잘못된 단어들이 연속으로 출력된다.

 

 

Exhausive search

입력 문장 : x / 출력 문장 : y

  • 가장 높은 확률을 가지는 전체 출력 문장 y를 출력하는 것을 최선의 방법이라 생각하고 학습.
  • 첫 단어가 나머지 모든 단어들을 결정하므로 첫 단어의 선택이 가장 중요하다.
  • 어떤 타임스텝 t까지의 가능한 모든 경우를 따질 때, 각 타임 스텝마다 고를 수 있는 단어의 수는 vocab_size (V)이고, V^t 의 가능한 종류를 전부 계산해야 한다.
  • 그런데 이러한 방법은 너무 많은 시간과 계산량이 필요하다.

 

 

Beam Search

k : beam size (5~10 generally)

  • Greedy Decoding과 Exhausive search의 중간에 있는 차선책으로써의 접근법
  • 디코더의 매 타임 스텝마다 미리 정의해놓은 k개의 가능한 경우의 수를 계속 유지하며 그 경우의 수만 계산한다.
  • 그리고 최종적으로 나온 k개의 후보 중 가장 확률이 높은 것을 선택하는 방식
  • 확률값들을 전부 더한 후 로그를 씌운다.
  • 매 타임 스텝마다 k개의 후보를 선정하고 가장 확률이 높은 것을 선택한다.
  • Bean search는 반드시 최적의 솔루션을 찾을 수 있는 것은 아니다.
  • 다만 Exhaustive search에 비해 훨씬 효율적이다.

 

 

과정

https://web.stanford.edu/class/cs224n/slides/cs224n-2019-lecture08-nmt.pdf

  • k개 만큼 확률값이 가장 높은 단어들을 선택하며 전개한다.

 

  • Greedy 디코딩은 모델이 <END> 토큰을 해당 타임스텝에서의 예측 단어로 예측했을 때이다.
  • Beam Search는 서로 다른 경로가 존재하기에 각각의 경로는 다른 시점에서 <END>토큰을 사용하게 된다. 경로 내에서 <END> 호출시 해당 경로는 종료되고 임시 저장 공간에 저장을 한다. 그리고 나머지 경로들은 <END> 토큰 발생 시까지 계속해서 학습을 진행한다.
  • 주로 Beam Search는 개발자가 정한 타임 스텝의 최대값까지 디코딩을 진행한다. 혹은 임시 저장 공간에 저장된 경로(문장)들이 미리 정한 n개 만큼이 되면 학습을 종료한다.

 

  • 모든 과정이 완료되면 완성된 문장들의 리스트들에 대해 가장 높은 점수를 갖는 하나의 값을 선출한다.
  • 그런데 모든 문장들이 다 같은 길이를 가진 것이 아닌데, 상대적으로 짧은 문장들이 점수가 더 높다.
  • 단어들이 생성될 때마다 기존의 값에 (-) 값을 더해주기 때문.
  • 그렇기에 공평한 비교를 위해 각 문장들의 길이를 정규화 시켜줄 필요가 있다.

Normalize by length

 

 


 

Precision and Recall

  • 자연어 생성 모델에서 생성 모델의 품질(정확도)를 평가하는 척도
  • 앞서 배운 Seq2Seq with attention을 통해 타겟 문장을 생성하는 경우, 모델을 학습하는 데 사용하는 objective function으로써 정답 단어에 부여된 확률값이 최대한 커지도록 학습을 진행 학습 종료 후에는 정확도 평가를 위해 test data에 대해 각 단어별 softmax 값을 계산하거나 분류 정확도를 계산
  • 그러나 이 경우에는 특정 타임 스텝에서 특정 그라운드트루스 단어가 나와야 하는 가정 하에 평가를 진행하는데, 전체적으로 봤을 때 하나의 단어를 빼먹거나 추가해서, 맞는 문장임에도 틀린 문장으로 식별하는 경우가 많다.
  • 고정된 위치에서는 고정된 단어 중 하나만 나와야 한다는 인식 때문.

 

  • 그래서 전체적인 차원에서 평가를 진행해야 할 필요가 있다.
  • 그리고 그 방법에는 precision, recall 이 있다.

  • precision (정밀도)는 (맞은 단어의 갯수 / 예측한 문장의 길이) 로 계산된다.
  • recall (재현율)은 (맞은 단어의 갯수 / 실제 문장의 길이) 로 계산된다.
  • precision예측된 결과에 대해 실질적으로 느끼는 정확도로 이해할 수 있다.
  • ex) 정보 검색에서 키워드로 검색했을 때의 정확도. 검색 결과가 나의 의도에 부합했는가?
  • recall 얼마나 대상을 빠트리지 않았는지.
  •  ex) 정보 검색에서 키워드로 검색했을 때 노출이 되지 않은 문서들 중 내가 정말 필요했던 문서가 있는가?
  •  ex) 스타크래프트의 recall처럼 내가 소환해야 하는 것들을 얼마나 잘 소환했는가?

 

  • 두 정확도가 서로 다른 기준을 가지고 있다. 그래서 두 기준을 하나의 값으로 통합해야 하는데, 산술 평균 ( (a+b)/2 ), 기하 평균 ( (a*b)^1/2 ), 조화 평균 ( 1/ ((1/a + 1/b) / 2))이 있다.
  • 그런데 값을 보면 산술 평균, 기하 평균, 조화 평균 순으로 크기가 작아진다. 즉, 조화 평균이 작은 값에 더 가까운 쪽으로 내분점을 구해주는 방식이다. 즉 더 작은 값에 더 많은 가중치 부여한다.
  • 그래서 작은 값에 조금 더 치중을 해서 계산을 하고자 조화 평균을 선택했고, 이를 F-measure 라고 한다.

*작은 값에 더 많은 가중치를 부여한 이유?

 위의 경우 예측값이 'Half' 로 끝나면, precision은 1이 된고 recall 은 0.1이 된다.

 이렇게 누가봐도 잘못 예측한 문장을 산술 평균은 0.55라는 무난한 수치를 기록한다.

 이런 점을 바로잡고자 작은 값에 더 많은 가중치를 부여한 조화 평균을 사용한다.

 조화 평균 사용시 값은 0.1818...

 

  • 하지만 이는 순서를 전혀 고려하지 않아 정확한 정확도는 아니다.

틀린 문장에 대해 100%의 정확도를 부여

 

 

BiLingual Evaluation Understudy (BLEU)

  • 전체적인 문장이 아닌, 개별 단어 레벨에서의 공통된 단어가 나왔는지에 대한 것 뿐 아니라, N-gram이라 불리는 연속된 n개의 단어들을 봤을 때의 문구가 정확하게 나왔는지를 확인한다.
  • precision만을 고려한다. (recall은 무시)
  • 1~4개의 연속된 단어들의 일치도를 개별적으로 검사한 후 통합해(곱셈) 기하 평균을 낸다.
  • 산술 평균보다 더 낮은 값에 많은 가중치를 부여하겠다는 의도.
  • 조화 평균은 낮은 값에 지나치게 큰 가중치를 주기에, 적당한 가중치를 주기 위해 기하 평균 사용.
  • 추가로 Brevity Penalty를 부여한다.
  • Brevity Penalty는 (예측 단어 / 정상 단어) 로, 짧은 문장에 대해 짧아진 비율만큼 정확도 예측 값을 낮춰주기 위함.
  • 또한 recall의 최대 값으로써 작용한다. : 원하는 문장 중 얼마나 제대로 된 단어들을 추출했는지 고려

 

 


  • 피어세션 회의 내용

학습

RNN

  • 이전 시점들의 값들을 받아 가중치 함수를 곱해줌으로써 새로운 출력을 만드는 모델
  • 다양한 시퀀스 데이터에 대해 유연한 딥러닝 모델

 

RNN의 종류

  • one-to-one : 하나의 입력 - 하나의 출력
  • one-to-many : 하나의 입력 - 시퀀스 출력
  • many-to-one : 입력이 각 타임스텝별로 들어가고 출력이 마지막에 하나 나오는 것
  • many-to-many : 입력과 출력이 모두 시퀀스 타입인 것.

 

RNN의 한계

  • 역전파를 진행할 동안 동일한 매트릭스를 매 Time step마다 곱하기 때문에 그 수치가 매우 커지거나 매우 작아짐으로써 경사도가 폭주하거나 손실되는 문제가 존재한다.

 

LSTM

  • RNN의 문제인 경사도 감소 및 폭주 문제를 해결하고 타임 스텝이 먼 경우데오 필요한 정보를 효과적으로 처리하고 학습할 수 있게 개선한 모델
  • cell state : 학습 과정에서 얻은 모든 정보
  • hidden state : 필요한 정보만을 필터링한 정보

 

GRU

  • LSTM의 모델 구조를 경량화 하여 적은 메모리를 사용하며 빠른 계산이 가능하도록 한 모델.
  • C(t)와 h(t)를 일원화해 h(t)만 사용한다.

 

 

LSTM과 GRU의 역전파

  • cell state vector의 업데이트 과정을 곱셈에서 덧셈으로 변경했다.
  • 경사도 손실, 폭주 문제를 해결했다.
  • Long term dependency 문제를 해결했다.

 

 

논의

(조교님 답변)

임베딩 레이어와 LSTM을 함께 학습시키는 것이 가능한가?

  • 같이 학습을 시켜도 성능에 영향이 없는 것은 아닐 것이나, 그렇게 해도 무방하다. 잘 학습된 임베딩 모듈을 가져와 사용하는 것도 하나의 방법이고, 그렇게 접근한 논문들도 많다. 하지만 방법의 차이일 뿐 함께 학습을 진행해도 크게 상관은 없다.

 

 

향후 일정

  • 파이썬 머신러닝 완벽 가이드 학습이 끝남으로써 피어 세션 시간이 남기 시작했다. 이에 남는 시간을 효율적으로 사용하기 위한 방법을 논의할 예정.

  • 해야할 일

추가학습 : wikidocs.net/22893


 

728x90
반응형