구현시 자주 사용하는 라이브러리 - huggingface
HuggingFace는 매우 인기있는 Transformers 라이브러리를 구축하고 유지하는 회사입니다.
이 라이브러리를 통해 오늘날 사용 가능한 대부분의 크고 최첨단 transformer 모델을 사용하여 쉽게 시작할 수 있습니다.
트랜스포머는 RNN의 재귀적인 반복과는 달리, attention이라 불리우는 구조를 활용하는 시퀀스를 사용한다.
기계어 번역문제에 transformer가 어떻게 적용되었는지 설명하겠다.
이 방법론은 시퀀셜한 데이터를 처리하고 인코딩하는 방법이라 이미지분류, DALLI(OpenAi 문장이 주어지면 그에 맞는 이미지를 생성)등에 활용된다.
실습에서 transformer를 다룰 것이다.(Attention 구조)
1.그러면 n개의 단어가 어떻게 한번에 처리되나?
2.encoder와 decoder사이에 어떤정보를 주고받나?
3.decoder가 어떻게 generate 해야하는가?
-이 트랜스포머가 왜 잘되게 되는지 나타낸다.
입력으로 3개의 벡터가 들어간다고 한다.
하나의 벡터 X1이 Z1으로 넘어갈때 X1의 정보를 활용하는게 아니라, X2,X3 의 정보도 활용한다.
The animal didn't cross the street because it was too tired
기본적으로 3가지 벡터를 만들어 내는데
를 만들어 낸다.
이 3개의 벡터를 통해 X1이라 불리우는 임베딩 벡터라 불리우는걸 새로운 벡터로 바꿔줄 것이다.
각각의 단어마다 생성된 쿼리,키,밸류 벡터를 통해 Score 벡터를 계산해준다.
내가 인코딩을 하고자 하는 쿼리 벡터와 나머지 모든 n개의 키벡터를 구한다.
그 두개를 내적을 한다.
이 두벡터가 얼마나 align이 잘 되어있는지 의미.
I번째 단어가 n개의 단어와 얼마나 관련이 있는지를 확인한다.
내가 인코딩을 하고자 하는 쿼리 벡터와 나머지 벡터들의 key벡터들을 구하고 그 두개 사이를 내적을 한다.
내가 Thinking 의 단어를 인코딩할때 다른 단어와 어떻게 관계형성되나를 중점으로 봐야한다. (Thinking 을 잊으면 안됨)
임베딩 벡터가 주어지면 각 임베딩 벡터를 기준으로 쿼리,키,밸류를 만들고
그리고 나서 나오는 키벡터와 밸류벡터의 내적으로 score벡터를 만듦.
걔를 softmax 취한다음에
각각 단어에서 나오는 value벡터들의 weight들의 sum이 된다.
결국 value 벡터들의 weight를 구하는 과정이 normalize하고 softmax취하고 구해준다.
최종적으로 Thinking이라는 벡터에 Encoding된 벡터가 나오게 된다.
주의 : 쿼리와 키벡터는 크기가 같아야함.
하지만 value는 달라도 됨(weight sum을 하기만 하면됨)
최종적으로 나오는 Thinking에 인코딩된 벡터의 차원은 encoding벡터와 차원이 같다.
위 과정이 위 수식으로 한번에 요약 가능하다.
고려해야 될 것 :
트랜스포머 구조를 잘 생각해보면,
연속된 정보는 이 안에 포함되어 있지 않다.
A,B,C,D 를 넣거나 B,C,D를 넣거나, B,D,A 를 넣어도 인코딩 되는 값이 달라질 수가 없다.
order 에 인디펜던트하다.(독립적이다.)
어떤 단어가 먼저나왓고, 이런게 중요하지 않다. 이미지도 마찬가지.
그래서 position encoding이 필요하다.
특정 방법으로 벡터를 만들게 되고 각자 단어에 해당하는 값을 그대로 더해준다.
특정 값을 미리 만들어진걸 그대로 더해준다.
-> 왜 Transformer 구조는 인풋 오더에 독립적일지 생각해보자.
계속해서 feed-forward를 반복하고 인코딩된 벡터에 대해서 독립적으로 동작하는걸 반복하게 된다.
그림으로는 점선으로 표현되어있지만, 실제론 key와 value를 보내게 된다.
I번째 단어의 쿼리벡터와 나머지 단어의 key벡터를 구해서 attention을 만들고 value벡터를 weight sum을 하게 된다.
그렇기 때문에 input 에 해당하는 key,value벡터가 필요하다.
이 self-attention구조가 번역에서만 사용됐었는데
이미지도메인 관련해서도 사용되고 있다.
DALL-E Open AI 에서 나온 API도 Transformer 의 decoder만 활용을 했으며 16x16 정도 그리드를 나눠서 시퀀스에 집어넣고 새로운 문장이 주어졌을때 문장에 대한 이미지를 만들수 있는 방법론을 제안했다.
- MHA(multi-headed Attention) 을 앞으로 실제 실습코드에서 사용하게 될것이다.