dukim's blog

[WK06-Day027][21.09.08.Wed] Seq2seq with Attention, Beam Search and BLEU Score 본문

Boostcamp AI Tech 2th

[WK06-Day027][21.09.08.Wed] Seq2seq with Attention, Beam Search and BLEU Score

eliza.dukim 2021. 9. 9. 15:48

Intro

  • Beam Search와 BLEU는 취약 파트라 집중해서 학습

학습 내용

1. Seq2Seq with Attention

Seq2Seq Model

  • Many to Many RNN: 단어의 시퀀스를 입력받아 단어의 시퀀스를 출력하는 구조
  • 인코더와 디코더로 구성됨
    image
  • 출처

Seq2Seq Model with Attention

  • Seq2Seq model의 문제점

    • 인코더의 입력 시퀀스 전체 정보를 하나의 hidden state vector에 압축하여 디코더에 전달해야함
    • LSTM에서 Long-term dependency를 해결했어도, 초반 타임 스텝의 정보는 변질되거나 소실될 수 있다.
    • 따라서 이에 대한 차선책으로 입력 문장의 순서를 뒤집어 인코더에 넣는 테크닉도 제안된 바 있다.
      image
  • 위 문제를 해결하기 위해 Attention 기법 제안

    • 인코더의 입력 문장에서 주어졌던 각각의 타임 스텝의 hidden state 벡터 $h_1, ..., h_m$ 을 전체적으로 디코더에 제공해주고, 디코더는 현재 스텝의 단어 생성에 필요한 인코더 hidden state vector를 선별적으로 가져와 예측에 도움을 주는 형태로 활용
      image
    • 출처
  • Seq2Seq with Attention

    • 디코더의 hidden state vector는 output layer의 입력으로 사용됨과 동시에 인코더 입력 시퀀스의 각 단어 벡터 중 어떤 단어를 중점적으로 가져와야할지를 가중치를 결정하는 역할
      image

    • 출처:

    • 학습 방식

      • Training time 땐 디코더의 입력으로 Ground Truth를 넣어주는 Teacher Forcing 방식으로 학습(빠른 학습. 실상황과 괴리)
      • Test time 땐 매 스텝에서 예측한 값을 다음 스텝의 입력으로 사용
      • 초반엔 Teacher Forcing으로 학습, 후반엔 모델의 예측값을 입력으로 사용하는 식으로 점점 변화시켜주는 방식도 존재함
    • Notation

      • $h_t$ : timestep $t$에서의 디코더의 hidden state vector
      • $\overline{h_s}$ : 인코더의 각 단어의 hidden state vector(다른 곳에서는 $s_1, ..., s_m$로 표현하기도 함, 여기서 m은 인코더 시퀀스의 최대 길이)
      • $e$ : Attention score
      • $c$ : Context vector, $\overline{h_s}$에 $e$를 적용해 가중합한 벡터
    • Attention score를 구하는 다양한 방식
      image

      • Basic dot-product attention

        • attention score를 구하는 것에 대한 parameter 없이 단순 내적
      • Multiplicative attention(Luong et al., 2015)

        • 두 벡터간의 내적 중간에 학습 가능한 parameter를 두어 내적되는 두 벡터의 각 원소 조합별 가중치를 학습하는 방식
        • 일반화된 dot product, attention module의 유사도를 설정해주는 학습 가능한 parameter
          image
      • Additive attention(Bahdanau et al., 2015)

        • 2 layer NN으로 attention score 계산
        • $W_a$: 첫번째 레이어의 선형변환
        • $v_a$ : 두번째 레이어의 선형변환, 이 때 벡터에서 스칼라로 만들어야하기 때문에 이 레이어는 벡터
          image
      • 출처:

Attention의 장점

  • NMT(Neural Machine Translation) 성능을 비약적으로 향상 시킴
    • 인코더의 정보 가운데 중점적으로 사용할 정보를 선택할 수 있게 함
  • Seq2Seq의 bottleneck 문제를 해결함
    • 인코더의 마지막 hidden state를 사용하지 않고, 매 time step에서 인코더의 모든 time step에 대해 직접 접근 가능
    • 긴 문장에 대한 번역 성능도 향상됨(Long-term dependency 문제도 해결)
  • Gradient Vanishing 문제 해결
    image
    • 기존 Seq2Seq은 Back propagation시 붉은색 라인으로만 gradient가 흐르기 때문에 timestep이 길어지면서 인코더까지 gradient가 전달되기 어려움
    • 그러나 Attention을 이용할 경우 초록색 라인의 gradient가 흐르는 경로가 더 생겨서 timestep과는 상관없이 인코더까지 gradient가 흐르므로 gradient가 크게 소실되지 않고 전달될 수 있음
  • 해석의 용이성
    • Attention의 패턴을 조사하여 모델이 디코더에서 각 단어 예측시 인코더의 어떤 단어를 집중했는지 파악할 수 있음
      image

2. Beam Search

  • 생성모델에서 test time에서 보다 더 좋은 생성 결과를 얻도록 하는 기법

Greedy Decoding & Exhaustive Search

  • test time에서 매 time step마다 가장 높은 확률을 지니는 단어를 선택
  • 그러나 중간에 생성이 잘못된 경우엔 이후에 생성되는 문장을 되돌릴 수 없음
  • 또한 매 순간에서의 확률이 최대인 단어를 선택하는 것이 전체 문장의 확률이 최대가 됨을 보장할 수 없음
    image
  • 따라서 최적해(문장의 발생확률 $P(y|x)$가 최대가 되는 문장 $y$)를 얻기 위해서는 가능한 모든 문장의 경우를 계산해 보아야하나 전체 vocab size를 $V$, 문장 길이를 $t$라 할 때 $O(V^t)$의 복잡도가 소요되어 현실적으로 이는 불가능함

Beam Search

  • 위 두 방법의 중간지점

  • 핵심 아이디어: 디코더의 매 스텝마다 생성확률이 가장 높은 $k$개의 가능한 후보 문장을 유지하면서 마지막 스텝에서 이 중 최대 확률을 갖는 후보를 선택

  • hypothesis $y$ : k개 경우에 해당하는 문장 후보

  • Beam size : k(보통 5 ~ 10)

  • 전역 최적해를 보장하지는 않지만 exhaustive search보다는 효율적인 방법

    Beam Search: Example

  • 아래 링크의 p32-44 참고

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

Beam Search: Stopping Criterion

  • Greedy Decoding에서는 토큰을 만나면 종료
  • Beam Search Decoding에서는 각 hypothesis에서 토큰을 만나는 timestep이 다 다르기 때문에, 토큰을 만난 hypothesis는 별도의 저장공간에 저장하고, 나머지 hypothesis에 대해서 계속해서 탐색을 수행
  • 미리 정한 최대 timestep $T$까지만 탐색을 수행하거나,
  • 미리 정한 $n$개의 완료된 hyphothesis의 개수에 도달했을 때 탐색을 종료함

Beam Search: Finishing Up

  • 완료된 hyphothesis의 목록 가운데 가장 높은 스코어를 가진 것을 선택할 때, 긴 문장일 수록 스코어가 작아지는 문제점 발생(단어가 순차적으로 생성되면서 점점 더 많은 사건들의 동시사건확률로 표현되는데 이를 표현하는 확률값은 계속 작아지게됨)
  • 따라서 위 문제를 보정하기 위해서 최종 스코어를 각각의 timestep의 길이로 나누어 normalize함
    image

3. BLEU Score

  • 생성 모델의 품질 및 결과의 정확도를 평가하는 척도

Precision & Recall

  • NLG를 통해 target 문장을 생성하는 경우에 모델을 test할 때, 각 timestep별 모델의 softmax loss를 계산하거나 아니면 각 단어의 분류 정확도를 계산할 수 있다.

  • 그러나 이 경우에는 특정 timestep에서 특정 ground truth가 나와야하는 가정에서 평가를 진행하게 되면 생성 단어가 하나씩 밀리는 등의 문제가 발생할 때 모델의 성능을 제대로 평가할 수 없다.

  • e.g.
    생성한 문장 : I love you
    Ground Truth : Oh I love you -> score : 0

  • 따라서 생성한 문장을 평가할 적절한 방법이 필요하기 위해 2가지의 평가방법을 생각해볼 수 있다.

  • Precision : 예측된 결과가 노출되었을 때 실질적으로 느끼는 정확도(e.g. 검색의 결과 중에 의도에 맞는 결과가 얼마나 포함되어있는지)

  • Recall : 검색 시스템에서 사용자의 요청에 해당하는 전체 정보 가운데 실제로 사용제시된 것의 비율

  • F-measure : 서로 다른 기준으로 계산된 두 가지의 정확도의 값을 종합해 하나의 값으로 표현

    • 기하평균: 두 수의 곱에 루트를 취한 값
    • 조화평균: 역수의 산술 평균의 역수
    • 산술 >= 기하 >= 조화 평균 순
    • 조화평균은 보다 작은 값에 가중치를 부여하는 형태로 평균을 구함
    • F-measure는 조화평균을 사용
  • 문제점: 그러나 순서가 바뀌어도 GT의 모든 단어를 포함하면 높은 점수를 냄

BLEU Score

  • 위 단점을 보완하기 위해 사용되는 평가방법
  • BiLingual Evaluation Understudy
  • 개별 단어 수준에서 GT와 overlap 수준을 따지는 것에서 더 나아가 연속된 N개 단어에 대해서 얼마나 겹치는지를 평가
  • 기본적으로 Precision만을 고려함
    • Recall을 제외한 이유
      • G.T.를 빠짐없이 생성하는 것을 중시하기보단 번역된 결과를 보고 체감할 수 있는 정확도만을 고려해도 되기 때문
      • 생성된 문장 가운데 틀린 부분이 있으면 의미가 확연히 달라지므로
      • e.g. 영어 -> 한글 번역 모델에서
        • I love this movie very much -> 나는 이 영화를 (정말) 많이 사랑한다.
          • very에 해당하는 (정말)을 생성하지 않아도 문제 없음
        • I love this movie very much -> 나는 이 노래를 정말 많이 사랑한다.
          • 영화 가 아닌 노래로 잘못 번역한 경우 의미 자체가 달라져 잘못된 번역이 됨
  • 1 ~ 4 - gram 각각의 Precision을 계산한 후, 이 넷의 기하평균을 구함
  • 이때 Brevity Penalty를 주어 레퍼런스 문장(GT)보다 짧은 문장을 생성한 경우에는 짧아진 길이만큼 Precision 값을 낮춰줌
  • 또한 이 값은 Recall의 최대값을 말함. GT와 같거나 긴 길이의 문장이 생성된 경우 100%의 recall을 기대할 수 있는 상황이므로, 값이 1이 됨

피어세션

  • 멘토링때 읽을 논문 수정, Transformer 계열의 기본 논문들(Transformer, BERT, MT-DNN, BART, 등)을 읽기로 함
  • RNN, LSTM, GRU에 대한 학습 내용 공유
  • Further Questions에 대한 토론

학습 회고

  • 어느정도 안다고 생각했는데, 다시 돌아보니 모르는 내용이 투성이다. 명훈님이 말씀해주신 RNN/LSTM/GRU 구조를 변형시키지 않고 Vanishing Gradient를 완화시키는 방법들은 처음 들어봐서 시간 날 때 해당 파트를 읽어볼 필요가 있다.
Comments