이전에 자연어처리 카테고리에서 Transformer 모델에 대하여 한번 설명했었는데, CV 강의를 들으면서 한번 더 나와서 다시 정리해보도록 하겠다.
0. 배경
Transformer:NLP에서 생기는 문제점을 해결하기 위해 고안된 모델로, 기존 모델들이 sequence data를 처리할 때 데이터를 순차적으로 처리하면서 발생하는 정보손실 즉 `Long-term dependency`를 해결하기 위함.
또한 Next token을 예측할 때 sequence 내의 다른 위치에 있는 정보들과의 상관관계도 매우 중요하고 이를 반영하는 것은 `attention`이다.
즉, Transformer은 Long-term dependency를 해결하고 attention을 도입한 모델이다.
CNN의 한계점
Computer Vision task에서도 NLP와 같은 문제가 발생했다. 용어가 살짝 다른데 `Long-range dependency`: 멀리 떨어진 두 물체에 대한 context를 학습하기가 힘들고, `Attention`: 이미지 내의 여러 객체들에 대한 상관관계를 알 수 없었다.
동일한 문제에 대한 해결책으로 Vision Transformer인 `ViT`가 등장하였다
1. Transformer
1-1. Tokenization+Embedding
특정 문장이 입력되었을 때 이것을 기계가 이해할 수 있도록 변환해줘야한다.
이 때 문장을 토큰 단위로 먼저 변환을 해주는데 이 때의 Token은 단어, 구두점 등의 의미있는 단위를 나타낸다. 또한 문장의 시작이나 끝을 나타내는 [CLS], [SEP]라는 token을 추가해준다. 즉 하나의 문장을 각 토큰 단위로 나누어준다음 해당 토큰들을 매핑해주는 것이다.
1-2. Positional Encoding
이러한 word embedding은 각 토큰을 반영하는 것이고 위치를 반영하지 않는다. 기존의 LSTM, RNN등은 문장을 Sequence하게 입력받기 때문에 따로 위치정보를 반영해줄 필요가 없었지만, Transformer은 모든 문장의 토큰이 한번에들어가기 때문에 위치정보를 따로 포함시켜줘야한다.
이 Positional Encoding값을 기존의 단어 임베딩값에 더해주면되고, 이 positional encoding은 시퀀스 길이나 input에 관계없이 동일한 식별자를 가져야한다고 한다. 왜냐면 각 문장마다 해당 위치를 나타내는 값이 다르면 동일한 위치를 의미할 수 없기 때문이다. 또한 이 값은 위치정보를 나타내주기는 하지만 기존 단어의 의미를 완전히 없애면 안되기 때문에 작게 설정해줘야 한다. 일반적으로 이러한 positional embedding값은 sin함수와 cosine함수를 이용하여 결정하는데 최근에는 이 임베딩값들도 학습을 통해 찾도록 해주고 있다.
여기 링크에 해당 Positional Encoding에 대하여 아주 이해가 가기 쉽게 정리된 글이 있어서 가져와봤다.
1-3. Self Attention
우선 self attention을 간단하게 말하면 한 문장 내에서 단어들의 관계,attention을 계산하는 것이다.
앞서 단어의 embedding과 positional encoding된 값들이 합쳐져서 들어온 Input embedding은 query, key, value로 mapping된다. `Query`: Attention을 확인하고 싶은 단어 / `Key`: Input embedding의 모든 단어 / `Value`:Input embedding이 갖고 있는 정보를 의미한다.
우선 입력으로 들어오는 Input embedding은 서로 다른 3개의 Linear Layer을 각각 거쳐서 Query, Key, Value를 나타낸다.
다음으로 query와 key행렬을 내적하여 Attention Score을 얻는다. 이 Attention score은 행렬간의 유사도, 즉 query와 key의 유사도를 나타낸다.
이렇게 구해진 attention score을 scaling(key 벡터의 차원의 제곱근으로 나누어주고, softmax를 취함)하여 계산하게 된다. 즉 attention score은 0~1사이의 값으로 계산된다.
$$ Attention(Q, K, V) = softmax({QK^T\over{\sqrt{d_k}}})V $$
이 때 위에서는 단순하게 표현을 했지만,실제 논문에서는 multi-head attention이라는 것을 이용하는데 이러한 self attention을 병렬로 h번 학습시키는 과정을 말한다.
이 multi-head라는 구조를 사용함으로써 여러부분에 동시에 attention을 가하는데 이는 각 head가 다른 특징 다른 타입의 attention을 계산하도록 한다. 즉 입력 토큰 간의 더 복잡한, 다양한 관계를 다루도록 한다.
이처럼 위의 각 query,key,value의 가중치 행렬은 모두 다르다.
이렇게 구해진 attention score을 value에 곱함으로써 각각의 key가 가진 정보를 통합하면된다.
이 multi head attention에 관련한 내용도 윗 블로거 분의 글에 자세하게 설명되어 있어서 다시 링크를 남긴다.
1-4. Feed forward
Attention이 반영된 embedding과 반영되기 전 embedding을 더하는 skip connection 과정이 들어가고 이것을 정규화한다음, 이후 sequece context가 반영된 embedding을 fc layer에 통과시킨다. 이러한 과정을 feed forward라고 부르며 Multi head attention과 feed forward를 합하여 transformer의 encoder라고 정의한다.
'ML & DL > Computer vision' 카테고리의 다른 글
Stable diffusion webui Error (0) | 2024.07.29 |
---|---|
ViT: Vision Transformer (0) | 2024.02.26 |
Computer vision Metric (0) | 2024.02.23 |
FCN: Fully Convolutional Network (0) | 2024.02.02 |
Semantic segmentation 방식 (0) | 2024.02.02 |