cs [Lecture 12] Transformers
본문 바로가기
  • 매일 한걸음씩
  • 매일 한걸음씩
개발/UC Berkely CS182

[Lecture 12] Transformers

by 시몬쯔 2021. 6. 7.
728x90
반응형

Lecture 11에서는 어텐션 메커니즘을 이용하여 long term dependency를 어떻게 다루었는지에 대해 배웠다.

이번 강의에서는 이를 응용한 Transformer에 대해 배우는데 이는 근 몇년간 NLP분야에서 계속해서 SOTA 모델에 적용됐으며 비전쪽에서도 적용하는 추세다. 시작해보자!

 

https://www.youtube.com/watch?v=Oqf7uJdKbjs 

Part 1 : Is Attention All We Need?

 

지난 시간 마지막즈음 어텐션을 배우며 어텐션이 정말 RNN이나 다른 기존의 모델의 단점을 커버할정도로 대단하다는 것은 알았으니 자연스럽게 이러한 질문이 떠오를 것이다.

 

Q. 

만약 우리가 attention를 사용한다면 굳이 recurrent connections이 필요할까?

우리의 RNN을 purely attention-based 모델로 변환할 수 있을까?

어텐션이 매 시간 step에 접근이 가능할까?

 

 

<Self-Attention>

 

매 시간마다의 input이 들어가 key, query, value를 생성하는 모델을 생각해보자. 

 

아래의 모델을 보면 이는 recurrent model이 아니지만 여전히 weight($W$)는 공유하고 있다.

이 weight를 이용하여 값을 얻을 수 있다. 또한 key vector / query vector또한 얻을 수 있다.(key/query weight이용)

이렇게 나온 key, query, value를 이용하여 서로 dot product를 취한 후 softmax등의 함수를 취해 최종적으로 값을 구하게 된다. 이 값들을 weight로 value vector를 weighted sum하여 activation value $a_l$가 나오게 된다.

 

위의 복잡한 계산과정을 self-attention layer로 치환하게 되면 오른쪽과 같은 그림이 나온다.

 

 

Q. 이렇게 자기들끼리 dot product해서 weighted sum하는 것이 self-attention이라 하면 Transformers는 어떤식으로 진행될까?

 

👉🏻  이를 위해 몇가지 추가적인 요소들을 추가하여 한계점들을 처리해야한다.

 

1. Positional Encoding : 위치 정보를 줘서 sequence information의 부족함을 보강한다.

2. Multi-headed attention : 각 layer에서 여러 위치들을 querying 할 수 있게 한다.

3. Adding nonliearities : 지금까지 모든 연속적인 layer는 linear였다.(weighted sum, Matrix Multiplication 등이 였으므로) 이에 nonlinearities를 추가한다.

4. Masked decoding : 어떻게 미래에 attention lookups을 예방할 수 있을까?

 

 


 

Part 2 : Sequence Models with Self-Attention

 

앞 파트에서 나온 추가적인 요소들을 하나씩 살펴보자.

 

1. Positional Encoding

 

예를 들어, "he hit me with a pie"라는 문장이 있다면, 

기존의 naive self-attention은 순서에 상관없이 이런식으로 보게된다.

이러한 무질서한 순서는 사실 말이 안되거나 아예 문장의 뜻을 바꿔버리게 된다.

 

즉, 이러한 위치 정보는 문장의 뜻을 이해하는데에 중요한 역할을 하게 된다.

이러한 기존의 naive attention의 한계점을 극복하기 위해 위치 정보를 추가하게 된다.

 

가장 단순한 positional encoding은 그냥 인덱스를 값에 추가하는 것이다.

하지만 문장의 절대적인 위치보다 상대적인 위치가 더 중요하기에 이러한 방법은 그리 좋은 방법이 아니다. 

 

Q. 그럼 어떻게 상대적인 위치 정보를 넣어줄 수 있을까?

 

👉🏻 frequency-based representations을 사용하는 것이다.

 

 

사실 위와 같이 position을 sin/cos에 넣어서 encoding하는 방법 외에도 학습하여 사용하는 방법이 있다.

 

이 방법은 좀 더 유연하지만 encoding length를 직접 정해야 하기 때문에 복잡한 면이 있다.

 

Q. 그럼 위와 같은 방식으로 구한 positional encoding을 어떻게 사용해야할까?

 

👉🏻 직관적으로 생각나는 방법은 그냥 concat하는 방식이다.

더 많이 사용되는 방법은 값을 embedding을 한 후 positional encoding을 더하는 것이다.

 

 

2. Multi-headed attention

 

모델이 완전히 어텐션에 의존하고 있기에 1개 이상의 time step을 통합하기를 원할 것이다.

하지만 softmax때문에 하나의 값에 의해 좌우되기가 쉽다.

 

이를 해결하기 위해 multiple keys, queries and values를 각 time step에 사용하는 방법이 멀티헤드 어텐션이다.

 

아래의 그림에서 각 색마다 계산한 값을 각각 $a_{2,1}, a_{2,2}, a_{2,3}$이라 해보자. 다음에 나온 full attention vector는 이 값들을 concat해서 생성된다.

 

 

3. Adding Nonlinearities

 

앞서 본 Self-Attention은 linear하다. (softmax로 나온 weight제외)

계산과정을 보면 Linear한 연산인 행렬곱, weighted sum등이기 때문이다. 매 self-attention layer는 이전 layer의 linear transformation(with non-linear weights)

 

 

이를 대안하는 방법은 hidden layer를 추가하는 것이다.

 

 

 

4. Masked decoding

 

Naive Self-Attention의 문제는 step 1에서의 self-attention은 step 2&3의 값을 보는데 이는 또 step 2&3의 input을 베이스로 한다.

 

또한, 테스트 때에 (decoding 시에) step 2&3의 input은 step 1의 ouput을 기반으로 한다.

 

이를 위한 쉬운 방법으로는, key가 query보다 늦게오는 경우에는 dot product를 하지 않고 마이너스 무한대를 취한 것이다.(이를 softmax에 적용하면 0이 됨) + 실제 코드에서는 그냥 softmax때에 0으로 취하면 됨.

 

 

 

Transformer를 요약하자면 다음과 같다.

 

 


 

728x90
반응형

댓글