반응형

 

 

Attention is all you need 알수 있다 싶이 Attention 이 중요하다.

Transformer  은 Attention 을 이용한 기법이다.

 

2021년 기준으로 최신 고성능 모델들은 Transformer 아케텍처를 기반으로 하고 있다 

GPT: Transformer의 decoder 아키텍처를 활용

BERT : Transformer의 encoder 아키텍처를 활용

 

Attention 기법으로 하는게 훨씬 더 좋았다.

Attention 기법으로 고성능 

 

기존 Seq2Seq 모델들의 한계점 :

context vector v에 소스 문장의 정보를 압축합니다, 

 병목이 발생하여 성능 하락의 원인이 됩니다.

context vector  고정된 크기 

 

단어 들로 구성된 sequence 들어왔을 때 -> contect vector를  -> 출력 문장의 다른 한쪽의 sequence를 만든다.

영어 출력 문장이 나온다.

매번 단어 이력할 때 마다 hidden state값을 갱신하는것을 볼 수 있다. 

단어를 입력 할때마다 단어를 받아서 hidden state를 새롭게 갱신한다. 

hidden state 이전 까지 입력 데이터 정보가 있다. 

마지막 단어가 들어왓을 때 hidden state는 모든 문장의 정보를 가지고 있어서 하나의 context vector로 사용할 수 있다.

decoder부분은 contect vector 로 시작해서 출력을 수행하는 decoder 부분은 매번 출력 단어가 들어올때마다 context vector로 출발해서  hidden state 를 같이 입력해서 갱신하고 eos 나올 때 까지 반복 한다.

 

다양한 문장에 대해서 고정된 크기를 가지는 것은 병목현상이 일어나는 원인 일 수 도 있다 .

 

조금 개선 부분 : 

디코더가 context vector를 매번 참고할 수 도 있습니다. 

  다만 여전히 소스 문장을 하나의 벡터에 압축해야 합니다.

context vector 를 매번 decode에서 RNN CELL에 매번 참조하도록 만들어서  조금 더 성능을 개선 가능하다.

정보가 손실 되는 정보를 적게 할 수 있다 .

 

하지만 CONTEXT vector에 압축해야 하기 떄문에 여전히 병목 현상이 생긴다. 성능이 저한된다.

 

해결방안 : 

decoder에서는 하나의 문맥마다 있는 것이 아니라 소스 문장에서의 출력 전부를 입력  (gpu 는 많은 메모리와 빠른 병렬 처리를 지원한다.)

 

seq2seq with attention

seq2seq 모델에  attention 매커니즘을 사용

  디코더는 인코더의 모든 출력을 참고 

단어가 출력되서 hidden state값을 가진다 . 

출력 단어를 전체 소스 문장을 반영하겠다.

context vector와 모든 hidden state값을 반응해서

가중치와 hidden state값을 곱해서 중요한것을 고려해서 한다. 

하나의 weighted sum vector를 구해서 하는것이다. 

 

attention : 기법을 출력 과정을 구하는 과정 

energy  :  매번 모든 decoder가 출력단어를 만들때마다 모든 j(인코더의 모든 출력 들)를 고려한다.

   이전에 출력한 정보와 encoder의 모든 값을 비교해서 에너지 값을 구할 수 있다.

가중치  :  energy softmax 확률적으로 어떤 값이 중요한지  어떤 값과 연관성이 있는지 

가중치가 반영된 encoder의 값과 더해서 해주는 것이다.

Softmax해서 비율값을 구할 수 있다.

비율 만큼 x값을 곱한 것을 

Hidden state값을 전부 반영해서 다음 출력값을 예측 

=>  energy 값은 소스 문장에서 나왔던 모든 출력값중에서 어떤 값과 가장 연관성이 있는지에 대해서 수치를 구하는 것이고 

그 값들을 softmax에 넣어서 상대적인 확률 값을 구한것이 가중치라고 할 수 있다. 가중치를 각각의 소스 문장의 hidden state와 곱해줘서  더 해준값을 실제로 decoded의 입력으로 해준다. 

Attention 추가 적인 장점: 시각화 (가중치. 를 사용해 각 출력이 어떤 정보를 참고 했는지 알 수 있다.

밝은 것 : 확률값이 높다.

어떤 요소가 어떤 초점. 을 두었는지 

 

Transformer

rnn이나 cnn 을 전혀 필요로 하지 않습니다.

 

모든 문장을 넣어주서 순서를 주기 어렵습니다. 

대신 Positional Encoding을 사용합니다. 

Positional Encoding을 사용해서 순서를 준다.

BERT 와 같은 향상된 네트워크에서도 채택되고 있습니다.

인코더와 디코더로 구성됩니다.

  ATTENTION 과정을 여러 레이어에서 반복하도록 만든다. N번 만큼 

 

단어를 넣기 위해서는 보통 임베딩 과정을 한다.

입력 차원 단어 one hot encoding 을 하면 차원 많이 찾지해서 -> embedding으로 continous한 

단어가 Input Embedding Matrix로 만들어진다. 

Matrix은 단어의 개수만큼 생긴다. 

데이터가 담긴 배열로 된다.

원본에는. 512로 한다. 바꿀 수도 있다.

 

Seq2seq 와 같은 Rnn기반의 모델을 사용한다고 하면 사용하는 것 만으로 각각의 단어가 순서에 맞게 들어가기 때문에 자동으로 각각의 hidden state값을 순서 정보를 가지게된다. 

Rnn을 사용하지 않으면 위치 정보를 포함하고 있는 임베딩 사용 필요 : Positional Encoding

Input embedding matrix와 같은 크기로 Positional Encoding을 element-wise더해줌으로써 각각의 단어가 어떤 순서로 존재하는 것을 알려준다.

입력 받은 값은 실제 단어와 위치 그런 입력을 받아서 각각의 단어를 수행하고 encoder파트에서   수행하는 것은 self-attention 이라고 한다.

Self - attention : 각각의 단어가 서로에게 어떤 연관성을 가지고 있는 지를 가지고 수행한다 . => encoder 파트  

임베딩이 끝난 이후에 어텐션을 진행 

Attention 은 문맥에 대해서 잘 학습하도록 만드는 것이다.

 

성능 향상을 위해. 잔여 학습(Residual learning)을 사용

이미지 분류에서 resenet과 같은 것이 사용되고 있는 기법 으로 어떤 값을 layer를 거쳐서 반복적으로 갱신하는 것이 아니라 특정 layer를 건너 띄어서 그대로 복사하는 것이다. 

Residual connetion: 특정 layer 를 건너 띄어서 입력할 수 있도록 해주는 것 해줌으로써 기존 정보 를 입력 받으면서 추가적으로 잔여된 부분만 학습하기 떄문에 학습 난이도가 낮고 초기에 모델 수렴 속도가 높게 되고 더욱더 global optimal 찾게 되고 residual learning 을 사용할때 속도가 높아진다.

 

Encoder :

embeding  positional Encoding

attention

residual learning + norm

feed forward layer : 노드 간의 연결이 순환을 형성하지 "않는 " 인공신경망이다.. (위키백과)

residual learning + norm 

결과값이 나온다.

 

각 레이어는 서로 다른 파라미터를 가집니다. 

중첩해서 사용가능 

 

입력과 출력의 dimension은 동일하다.

 

입력값 들어온다음 여러개 encoder layer를 반복해서 가장 마지막에 인코더에서 나오게 된 출력값은 decoder로 들어간다.

Decoder의 입력에게 어떤 단어가 중요한지 초점을 알려주기 위한것이다. 

Decoder도 여러개 layer로 구성이 되고 마지막에 나오게 된것이 번역 결과 

Layer 1의 입력값은 encoder에서 마지막으로 출력한 값을 받는다.( 기본 transformer 아키텍처 )

Decoder 도 각 단어를 받아서 상대적인 위치를 알려주기 위해 Positional Encoding을 사용 

하나의 decoder에서는 두개의 attention을 이용 :

1 번쨰  Multi-head attention 은 encoder와 같은 self-attention으로 각각의 단어가 서로와 서로에게 떠한 가중치를 구하도록 만들어서 출력하게 되는 값을 학습해서 전반적으로 만들어서 하게 된것이다. 

2번째  Multi-head attention 은 encoder에 대한 정보를 attention 할 수있도록 만든다.각각의 출력 단어가. Encoder의 출력정보를 받아와서 사용하도록 만든다.소스 문장에서와 어떤 문장의 연관성이 있는지 

 

Transformer는 마지막 인코더 레이어의 출력이 모든 디코더 레이어에 입력됩니다.

Encoder = decoder동일하게 보통 맞춰준다.

 

RNN 을 사용하지 않으며 인코더와 디코더를 다수 사용한다는 점 이 특징입니다.

 

기본적으로 RNN을 사용할 떄는 고정된 크기를 사용하고 입력 단어의 개수만큼 ENCODER를 거쳐서 HIDDEN STATE를 만들었다고 하면 

TRANSFORMER는 입력 단어 전체가 하나로 쭉 연결되어서 한번에 입력이 되고 한번에 ATTENTION 값을 구한다. 위치에 대한 정보를 한꺼번에 해서 병렬 적으로 

계산 복잡도가 낮게 한다.

Decoder를 여러번 사용해서 eos가 나올때 까지 디코더를 이용 

 

Multi -head attention : 여러개 head를 가진다 .

Scaled Dot -Product attention : 

query  : 물어보는 것 attention mechanism의 간단히 설명하면 단어간의 어떤 연과성을 가지는지 를 구한다. 물어보는 주체 

key  : 물어보는 대상 

value 

I am a teacher에서 

I가 얼마나 연관성이 있는지 를 알려면 

Query : I

Key :  i am a teacherr 각각의 단어  가중치 값을 구하지고 하면 

value 값 

물어보는 주체 ( q)와 각가의 단어 (k) 들어오고 행렬곱을 수행한 뒤에 간단하게 scaling을 해주고 mask를 씌운후 softmax를 하고 각각의 key중에 어떤 연관성을 가지는 지 비율을 구하고 확률값과 value를 곱해서 가중치가적용된 attention value를 구할 수 있다. 

 

H개의 value key query 를 구할 수 있다 . Linear를 행렬 곱해서 h (서로 다른 헤드 끼리 value key쌍을 구해서 돌려준다.)

Dimension이 줄어지지 않도록 한다.

 

각각의 단어를 출력하기 위해서 encoder한테 물어보는것이다 . Key value

decoder에서는 query가 되고 

 

h개는 attention 을 수행하기 위한 각각 다른 feature들을 구하기 위해서 

 

동작 원리 : 

attention 을 위해 쿼리 , 키 , 값마다 만들 필요가 있습니다.

단어 4차원 

head 2개 가정 

query 와 key 각각 곱해서 attention energy 값을 곱해서  / scaling 으로 나누고 가중치 곱하기 * value

더해서 attention 값이 나오고 weighted sum

마스크 행렬 (mask matrix)를 이용해 특정 단어는 무사힐 수 있도록 합니다. 

곱해줘서 어떤한 단어는 참고하지 않도록 만들어줄 수 있다. 

예: I라는 단어는 love you를 attentin 하지 않도록 무시한다면 attention energies에서 가능한 음수 무한의 값을 넣어주면 softmax함수의 출력이 0%에 가까워지도록 합니다. 고려하지 않도록 한다 .

각 head마다 query key value를 넣어서 수행한 값들을 나열하게 되면 입력과 같은 dimension으로 된다.

 

차원이 동일하게 된다. 

 

multi -head attention 인데 사용하는 위치에 따라서  세가지 종류의 attention 레이어 :

encoder self- attention :

   각각의 단어가 서로 에게 어떤 연관성을 가지는지 attention 을 통해서 구해도록 만들고

  전체 문장에 대한 presention을 만든다는 것이 특징이고 

masked decoder self-attention:

   각각의 출력단어를 모든 단어와 연결하지 않고 앞쪽에 등장했던 단어들만 참고 

   나는 축구를 했다 에서 축구를 할때 "했다"를 연결하면 일종의 cheating처럼

   단어는 앞쪽의 단어만 하고 

encoder - decoder attention : query 가 decoder에 있고 각각의 key 와 value은 encoder

 I like you -> 난 너를 좋아해 

 어떤 정보에 대해 더 많은 가중치를 주는 지 구할 수 있어야 한다.

 decoder의 query 값이 encoder의 key value값이 참조한다고 해서

 

self-attention 은 인코더와 디코더 모두에서 사용됩니다 

매번 입력 문장에서 각 단어가 다른 어떤 단어와 연관성이 높은지 계산 할 수 있습니다.

트리 구조로 각각의 단어들이 어떤 연관성을 가지는지 

 

encoder part에서 입력값이 들어와서 위치에 대한 정보를 반영해준 첫번째 layer에 넣어주고 

encoder 는 n번 만큼 중첩이 되고 마지막 layer의 값을 decoder에 넣어주고 decoder도 n번 만큼 중첩이 되고 

가장 마지막에 나온 layer를 linear와 softmax를 취해서 각각의 출력 단어를 만들어 낼 수 있는 것이다. 

 

positional encoding:  주기함수 활용

각 단어의 상대적인 위치 정보를 네트워크에게 입력합니다.

 

 

 

 

https://www.youtube.com/watch?v=AA621UofTUA&t=6s

 

반응형

+ Recent posts