ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Attention Mechanism(어텐션 메커니즘) 요약 설명, 조사
    프로젝트/NLP Core 2019. 4. 28. 00:11

    -Attention Mechanism

    1. 참고 링크

    1. Attention
    2. https://wikidocs.net/22893
    3. 어텐션 메커니즘과 transfomer
    4. Attention is all you need
    5. NLP with attention
    6. Attention? Attention
    7. The Illustrated Transformer
    8. Bert

    2. 설명

    1. -특정 벡터에 집중하여 성능을 높이는 기법으로 아래의 문제점을 해결

    2. -기존 RNN으로 seq2seq을 풀 때 문제점

      1. 첫째, 하나의 고정된 크기의 벡터에 모든 정보를 압축하려고 하니까 정보 손실이 발생한다.
      2. 둘째, RNN의 고질적인 문제인 기울기 소실(Vanishing Gradient) 문제가 존재한다.
    3. -핵심 아이디어

      1. I love you -> 나는 너를 사랑해 로 번역할 때, 인코더가 love로 만든 벡터가 디코더가 사랑해를 예측할 때 쓰는 벡터와 유사할 것이다. 즉, 사랑해를 예측할 때 love 벡터를 더 집중적으로 보는 것이다.
    4. -Seq2Seq에서의 Attention

      1. 디코더의 특정 time-step의 output이 인코더의 모든 time-step의 output 중 어떤 time-step과 가장 유사한가
    5. -Bi-LSTM에서의 Attention

      1. LSTM을 거친 모든 outputs(contextual matrix)과 LSTM의 최종 state(query)간의 Attention을 본다
      2. LSTM hidden cell의 마지막 Hidden State가 어떤 time에 영향을 많이 받았는가
    6. -Self-Attention

      1. 한 단어가 한 문장 안에서 어디에 집중하는지 계산한다.
      2. 단어를 Embedding한 vector, X를 통해 query, key, value vectors를 만들어낸다.
      3. Attention(Q,K,V)=softmax(QKT√dk)V
      4. query가 각각의 key에 어느정도 attention을 둬야하는지 계산한다.
      5. key와 value는 attention이 이루어지는 위치에 상관없이 같은 값을 가진다.
      6. query와 key에 대한 dot-product를 계산하면 각각의 query와 key 사이의 유사도를 구할 수 있다.
      7. 이 후 softmax를 거친 값을 value에 곱해줄 때, query와 유사한 value일수록, 즉 중요한 value일수록 더 높은 값을 가지게 된다.
      8. q1 = x1 * Wq, k1 = x1 * Wk, v1 = x1 * Wv 이다.


    7. -Multi-Head Attention

      1. 동일한 query, key, value에 각기 다른 weight matrix W를 곱해 여러번 수행하는것
      2. 각각의 Attention Head 결과를 모두 합한뒤 가중치 Wo을 곱한다. 차원을 줄여준다.(vector 크기 조정)
        (3칸 벡터의 크기는 64, 4칸 512입니. 댓글 감사합니다!)
    8. -Positional Encoding

      1. Transformer는 Recurrence도 아니고 Convolution도 아니므로 Position 정보를 추가해줘야 한다.
      2. Encoder와 Decoder의 input은 Positional Encoding + Word Embedding한 결과이다.
    9. -Masked Attention

      # Since attention_mask is 1.0 for positions we want to attend and 0.0 for
      # masked positions, this operation will create a tensor which is 0.0 for
      # positions we want to attend and -10000.0 for masked positions.
      adder = (1.0 - tf.cast(attention_mask, tf.float32)) * -10000.0
      1. 위는 Bert에서의 예시인데, Zero Padding에 대해서는 마스킹하여 어텐션하지 못하게 한다.
    10. -전체 과정

    댓글 2

    • 지나가던사람 2019.06.07 21:02

      각각의 Attention Head 결과를 모두 합한뒤 가중치 Wo을 곱하여 차원을 줄여준다.(vector 크기 조정)라고 쓰셨는데 차원은 전혀 안 줄어들지 않나요? 어텐션 헤드를 연결(concatenate)한 행렬은 결국 maxlen x (dk * head수)이기 때문에 결국 maxlen x dmodel과 같을거고 가중치 Wo를 곱하기 전에 이미 크기 자체는 인코더의 초기 입력이랑 똑같을 것 같습니다. 가중치 Wo를 곱하기 전이나 후나 행렬 크기는 안 바뀔 것 같은데요. 논문 기준으로 말하면 head라는건 원래 512를 8개로 나눠서 64의 크기를 가지는데 64를 8개 붙인거나 512개 1개짜리나 결국 똑같은 크기가 될 것 같아서 말이죠. 제가 틀렸다면 의견부탁드립니다 ^^

      • ComEng 2019.06.08 22:24 신고

        앗 다시 확인해보니 차원축소는 아니고 단순 가중치를 곱하는 내용이네요.
        공부하며 작성하느라 부족한 부분이 많네요 ㅠㅠ
        알려주셔서 감사합니다!

Designed by Tistory.