ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [09.08] NLP - ⭐️ Sequence To Sequence with "Attention"
    네이버 부스트캠프 AI Tech 2기 2021. 9. 14. 14:50
    반응형

    Seq2Seq with Attention

    이 구조는 앞에 배운 여러 모델링 가운데, Many-To-Many 형태이다. 즉, 입력이 시퀀스이고 출력도 시퀀스이다. 입력을 모두 읽고 출력을 생성 혹은 예측을 하게 된다.

    아래 구조에서 입력 문장을 읽어 들이는 부분을 Encoder라고 하고, 출력을 생성하는 부분을 Decoder라고 불린다. 서로 파라미터를 공유하는 것이 아니라는 것이 특징이다.

    Encoder 내부를 살펴보면 내부 Cell 형태는 LSTM 구조를 채용한 것을 알 수 있다. 이렇게 Encoder에서 진행된 마지막에 있는 ht 즉, hidden state vector는 Decoder 의 처음 State에 들어가는 h0 역할을 하게 된다.

    Decoder에 시작 토큰은 라는 토큰을 집어넣음으로 써 시작이 되는데, 이는 토큰이라고 실제론 사용한다. 그러면 첫번째 단어를 예측하게 된다. 그러면 언제까지 단어를 생성할까? 는 마지막에 특수문자인 토큰이 나올때 까지 Decoder에서 단어들을 생성하게 된다.

    이런 Seq2Seq 모델에 추가적인 모듈로 "Attention"을 활용할 수 있다. "Attention" 메커니즘이 나오기 이전 어떤 문제가 있었을까? → 하나의 문장을 다른 언어의 문장으로 번역하는 형태의 Task가 있다고 하자. 우리는 주어를 번역할때, 맨 앞에 있는 Encoder의 토큰의 정보를 Deocder에서 적용이 되어야할텐데, 문장이 길어지면 그 정보가 유실된다. 물론 LSTM을 사용해서 Long Term Dependency를 해결했다 할지라도 어느정도 한계는 존재한다. 그래서 차선택으로 입력 문장의 순서를 뒤집어서 Encoder 문장의 초반 정보가 더 많이 들어가도록 하는 시도도 있었다.

    아이디어 : Attention은 Encoder 부분에 있는 각각의 Step에서의 hidden state vector를 가져가서 Decoder에서 전체를 다 활용하려는 것이다. 그리고 Decoder에서 각 Step에서 단어를 생성할 때, 그때 필요한 hidden state vector를 사용해서 예측에 적용하는 것이다.

    동작 과정

    다음 Task는 프랑스어 문장을 영어로 번역하는 예시이다. RNN 모듈로 Encoder단을 이루고, hidden state vector는 4차원이다. 각각이 h1, h2, h3, h4이다. 마지막에 나오는 hidden state vector가 Decoder에 들어가고 토큰을 입력으로 Decoder가 시작이 된다.

    이때 Decoder에서 나온 첫번째 hidden state vector를 가지고 다음 Step에서 사용하지만, 추가적으로 Encoder에서 어떤 hidden state vector를 사용할지 선별하는 작업을 거친다. → 이는 Decoder의 hidden state vector가 Encoder들의 hidden state vector들과 각각 내적을 수행하고 이 값들을 "Attention Score"라고 하고 이들을 가지고 확률값을 계산할 수 있는 입력으로 주어지고 확률이 계산이 된다. 그러면, 각각의 확률 값들이 Encoder의 각각의 hidden state vector의 부여되는 가중치로 사용이 되고 지금 4개의 h1, h2, h3, h4들을 가지고 가중 평균을 구할 수 있고 이를 통해 최종적인 Encoding Vector를 구할 수 있게된다.(Attention Output, Context Vector라고 불리기도 한다.)

    Attention 모듈은 그래서 하나의 Decoder의 hidden state vector와 Encoder의 hidden state vector 집합이 입력으로 들어간다. 최종적으로 이 Context Vector와 함께 Decoder의 hidden state vector가 Concate이 되어서 최종적인 y(pred)를 구하게 된다.

    학습과 추론

    학습과 추론(테스트)에서 Decoder의 Input은 다르다. 우선, 학습할시는 Decoder에 들어가는 문장과 단어들은 Ground Truth 값들이다. 설사 다른 값으로 각각의 Cell에서 예측하더라고 다음 Step으로 주는 것이 아니라 Ground Truth 값으로 계산이 된다.(Teacher Forcing) 반대로 추론(테스트)에서는 Ground Truth값이 주어지는 것이 아니라 각각의 Cell에서 예측한 단어(토큰)들을 가지고 다음 Step에서의 입력으로 넣는다. (Teacher Focing X)

    이 둘을 적절히 결합한 학습 방식도 존재한다. 처음에는 Teacher Focing으로 배치를 구성해서 학습하다가 어느정도 성능이 나온다면 Teacher Focing을 사용하지 않고 학습을 변화시켜준다.

    Attention 메커니즘

    Attention Score를 구할때, Decoder의 hidden state vector와 각각의 Encoder hidden state vector들을 내적을 통해서 계산을 하면, 유사도를 파악할 수 있는데 이 내적말고도 다양한 방식으로 유사도를 구하는 메커니즘들이 존재한다.

    ht는 Decoder에서 주어지는 hidden state vector이고, hs는 Encoder 에서 주어지는 hidden state vector집합이다. 일반적으로 흔히 아는 단순 내적으로 계산하는 방식과 내적 사이에 W라는 가중치 행렬을 두어 차원의 계산을 좀 더 진화적으로 계산할 수도 있고, 두 Vector를 연결해서 W 행렬을 곱한 Neural Network와 비슷한 동작 구조를 가지는 형태, 여기서 va라는 벡터는 Row vector로 Scalar 값을 구하기 위해서 사용한다. 그래서 Attention Score를 계산할때, Wa라는 가중치도 최적화 해야하는, Trainable 한 파라미터가 포함된 모듈로 바뀐 것이다.

    정리

    풀어서 이야기하면, Attention이라는 것들 통해 기계 번역(Machine Translation) 성능을 향상했고, 멀리 있는 정보가 끝까지 전달되지 않는 bottleneck 문제들을 해결했다고 한다. 또한 학습에 관점에서 Grandient Vanishing을 해결했는데, 음 원래는 Backpropagation을 진행할때, 뒤에서 앞으로 순차적으로 진행되어야하는 긴 과정을 Attention이라는 모듈이 짧게(short cut)으로 연결되어 있기 때문에 이를 활용해서 Backpropagation이 진행된다. 마지막으로 이런 Attentoin 패턴들을 활용해서 각각 어떤 단어들에 집중했는지 알 수 있는 것처럼 해석 가능성을 제공해준다.

    반응형
Designed by Tistory.