쫑쫑JJONG
끄적끄적 오후5시37분
쫑쫑JJONG
전체 방문자
오늘
어제
  • 분류 전체보기 (198)
    • Paper Reading (5)
    • Math (5)
    • Data Science (13)
      • SQL (12)
      • Data Analyst (1)
    • AI Track (32)
      • CV (21)
      • CV Remind (2)
      • NLP (1)
      • AI Basic (8)
    • Python (1)
      • Basic (8)
      • Application (5)
    • Robotics (31)
      • ROS (15)
      • Collabot_proj (16)
    • NaverBoost Camp 4기 (45)
      • 부스트일지 (13)
      • [P stage] Image Classificat.. (4)
      • [P stage] Object Detection (12)
      • [P stage] Semantic Segmenta.. (6)
      • [P stage] Final Project (5)
      • CV (1)
      • DL BASIC (4)
    • Excel (1)
    • Git (8)
      • Git (8)
    • Network (3)
      • 통신 (3)
    • 코테준비 (14)
      • Programmers (11)
      • 기타 (3)
    • 환경설정 (19)
    • etc (7)
      • 활동 (2)
      • TIP (3)
      • 잡동사니 (2)
    • 금융관련 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • 포트폴리오

인기 글

태그

  • 환경설정
  • Confusion Matrix
  • diffusion
  • transformer
  • Arduino
  • Monte Carlo Sampling
  • mmdetection
  • N
  • GIT
  • segmentation
  • CV
  • robotics
  • 이고잉
  • python
  • ros
  • Data Scraping
  • 논문분석
  • NLP
  • error
  • SQL
  • collabot

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
쫑쫑JJONG

끄적끄적 오후5시37분

Diffusion / Transformer 압축정리
AI Track/CV

Diffusion / Transformer 압축정리

2023. 7. 13. 13:29
728x90

관련 논문 :  Denoising Diffusion Probabilistic Models

https://arxiv.org/pdf/2006.11239.pdf

 

 

Diffusion 모델이란

데이터를 만들어내는 Deep generative model 중 하나

두가지 process를 사용

  • Forward Process (Diffusion Process)
    • data로부터 noise를 조금씩 더해가면서 data를 완전한 noise로 만드는 process
  • Reverse Process :
    • noise를 조금씩 복원해가면서 data를 만들어내는 것

 

 

Markov chain

어떤 상태에서 다른 상태로 넘어갈 때, 바로 전 단계의 상태에만 영향을 받는 확률

<문제점>

초기의 분포의 영향이 시간이 지남에 따라 점점 감소한다는 것과 Stationary distribution (고정분포)를 가진다는 것이다

 

 

Gaussian Noise

정규분포의 다른 말이 가우시안 분포

즉 이런식으로 Gaussian 분포에 따라 Noise를 추가하는 것이다

 

 

Forward Process

Forward Process는 Data(x0)부터 noise를 더해 가면서 최종 noise(xT)를 만드는 것이다

q 를 보면 바로 전 단계의 xt-1을 이용하여 정규분포를 사용하여서 만들어 내는 것을 볼 수 있다

위에 식에서 beta_t는 beta_1=10^{-4}에서 \beta_T=0.02까지 linear하게 증가하게 사전에 설정된다.

(이 값을 변수가 아닌 상수로 지정한 이유는 별로 그렇게 차이가 없다는 것을 발견해서 그렇다고 한다)

0.0001 에서 0.02 이므로 곱했을 때 둘다 값이 작아진다(signal 손상)

 

만약 T = 1000 이 되었을 때는 xT가 거의 Gaussian Distribution을 따르게 된다고 한다

\sqrt{1-\beta_t}로 scaling하는 이유는 variance를 unit으로 유지하기 위해서 이고

위에 같이 \sqrt{1-\beta_t}를 곱하고 나면 variance는 {1-\beta_t}가 되는데 이것이 beta_t와 더해지면서 unit variance가 된다

 

특징적인 것은 t에서의 xt 샘플링 할 수 있다는 것이다 (xt를 얻기 위해서 x0에서 부터 xt까지 구할 필요가 없다)

즉 t번에 sampling을 하지 않고 

어쩌피 계속 \sqrt{1-\beta_t} 와 {beta_t}가 곱해지는 꼴이니

위와 같이 나타낼 수 있다는 것이다

이러면 expectation을 구할 때 xt를 만들고 이에 대한 loss를 구한 다음 t에 대해 expectation을 구하는 식으로 학습할 수 있다

 

 

 

Reverse Process

Reverse Process p는 noise (XT)로 부터 Data(X0)를 복원하는 과정이다

이렇게 복원을 하는 과정은 random한 Noise로 부터 Data를 만들어 내는 Generative model이라 생각할 수 있으며

이를 위해서 모델링해야 하지만 이를 실제로 할 수는 없기 때문에 Approximation(근사화)을 진행한다

 

이때 사용하는 Approximation은 Gaussian Transition을 활용한 Markov Chain 형태를 가지는데

Noise의 분포는 다음과 같이 표준정규분포를 따르고 시작 지점인 p(xT)는 다음과 같다

위에 있는 식과 같이 Pθ는 바로 전  단계인 xt를 조건부로 하는 xt-1의 확률로 정의가 되고

이를 위해서 우리는 θ에서의 

평균 μθ 와 표준편차 Σθ 를 Parameter로 학습을 해나간다

 

다음과 같이 mean과 variance를 파라미터로 가지는 이유는 

이 둘이 Gaussian distribution의 parameter이고

Forward Process에서 각 Step 마다 아주 작은 노이즈를 추가하는 것이라면 충분히 Gaussian Distribution을 통해 표현될 수 있다고 가정하기 때문이다

 

 

Training

우리가 하고자 하는 것은 pθ의 parameter를 추정하는 것인데 이를 어떻게 학습시키는지에 대해 나와 있다

우리는 따지고 보면 noise으로 부터 실제 data 분포인 p(x0)를 찾아내는 것을 목적으로 하고 이것과의 Likelihood를 최대화하는 방식으로 학습을 진행하면 된다.

 

 

이에 따라 Diffusion model의 최종적인 training loss는 다음과 같은데

  • LT: p가 generate하는 noise xT와 q가 x0라는 데이터가 주어졌을 때 generate하는 noise xT간의 분포 차이
  • Lt−1: p와 q의 reverse / forward process의 분포 차이. 이들을 최대한 비슷한 방향으로 학습한다.  
  • L0: latent x1으로부터 data x0를 추정하는 likelihood. 이를 maximize하는 방향으로 학습한다

 

중간에 증명도 나오고 유도하는 방법도 나오지만 결국 중요한 것은

Diffusion model을 학습할 때의 training loss는 정규 분포 사이의 KL divergence 형태로 계산이 가능하다는 것이다

 

 

 

Transformer

관련 논문 : Attention is all you need https://arxiv.org/pdf/1706.03762.pdf

<Keypoint>

1. N개의 단어가 어떻게 한번에 처리가 되는지
2. Encoder와 Decoder 사이에 어떤 정보를 주고 받는지
3. Decoder가 어떻게 Generation 할 수 있는지
Transformer is the first sequence transduction model based entirely on attention.
  • Transformer는 Recursive (재귀적) 구조를 없앴다
  • Transformer에는 재귀적인 구조가 존재하지 않고 Attention 이라는 구조를 사용했다
  • Transformer는 Sequential한 데이터를 처리하고 encoding하는 방법이다 -> 그래서 번역 뿐만 아니라 이미지 분류, detection 등등 을 사용한다
  • Sequence to Sequence model

Core Idea : Self Attention & Encoder Decoder Attention

 

<구조>

1. Input Sequence 와 Output Sequence의 dimension(길이)는 다를 수 있다

2. 위 그림과 같이 동일한 구조를 가지지만 parameter가 다르게 학습되는 Encoder/ Decoder가 stack 되어 이루어져 있다

3. 위와 같은 구조를 가졌기에 N개에 단어에 대해 반복은 1번만 된다 

-> ex) RNN :  3단어가 들어가면 -> 3번 반복 , Transformer :  100단어가 들어가도 1번만 실행

-> 그래서 Attention is all you need 라는 말을 쓰지 않았을까 짐작해 본다

 

 

<Self Attention>

Input x1이 Self -Attention을 거쳐서 z1으로 나오게 되는데 이 과정에서

z1 은 x1 만 고려하여 만든 것이 아닌 x2, x3 도 같이 고려하여 만든 결과이다 (밑에 그림 참조)

이런 식으로 한 Word 끼리의 관계를 엮어서 하나의 출력을 만들어 주는 것이 Self- Attention 이다

 

<Self Attention 동작방법>

 

1. 먼저 단어마다 특정 숫자의 벡터로 표현을 해준다

여기서 단어를 어떻게 벡터로 바꾸냐는 질문에는 Word Embedding 이 있는데

이는 나중에 정리하고 일단 word를 숫자로 바꿨다고 생각하자

Reference : https://medium.com/deeper-learning/glossary-of-deep-learning-word-embedding-f90c3cec34ca

 

2. Self Attention을 통해 변환된 벡터를 단어마다 만들어 준다

 

위 설명을 보면 아래의 Self Attention은 dependency가 있지만 위에 Feed Forward는 그냥 하나만 고려한다

 

3. Self Attention에서 Score를 구한다

엄밀하게 이야기하면 2번과 3번의 순서가 바뀌었지만 가독성을 위해 이렇게 순서를 역순으로 설명하였다

 

먼저, 구하고자 하는 Score Vector에 대해 이해를 하자

The animal didn't cross the street because it was too tired  이라는 단어로 예시를 들어 보면

 

위 문장에 있는 it은 어떤 것 일까? 

As the model processes each word (each position in the input sequence), self attention allows it to look at other positions in the input sequence for clues that can help lead to a better encoding for this word.

우리는 이를 위해 독해를 하고 여러가지 생각을 거쳐서 The animal 이라고 말을 한다

이와 같이 AI도 어떠한 프로세스를 통해 관계성을 파악하여 가장 연관 있는 단어가 무엇인지 찾아낸다.

 

-> 좀 더 쉽게 설명을 하면 it 이라는 단어가 나왔다는 것은 앞에 사물이 나왔다는 것이라고 우리는 학습을 통해 말한다

이런 걸 관계성이라 말하고 Transformer는 이를 이용한다

 

즉, 위의 예시를 한국어로 번역을 해보자면

"동물은 거리를 건널 수 없을 것이다, 왜냐하면 ("그분" / "그것"  / "그녀" / "그들" / "그 동물")은 매우 피곤하기 때문이다"

중에 "그 동물"이라는 단어를 선택할 것이다

 

이를 구하기 위해서는 다음과 같은 단계를 거친다

 

3-1 각 단어마다 Queries, Keys, Values 값 구하기

 

예시로 "Thinking Machines"이라는 단어가 들어 왔다고 가정하자 

So for each word, we create a Query vector, a Key vector, and a Value vector. These vectors are created by multiplying the embedding by three matrices that we trained during the training process.

이 단어들을 x1, x2 라고 할 때 (이미 vector로 임베딩 되었다고 가정)

These vectors are created by multiplying the embedding by three matrices that we trained during the training process.

그러면 x1,x2 에 대해서 WQ, WK, WV를 곱해서

각각 Queries, Keys, Values Vector를 만든다

 

즉, 각각의 embedding된 단어마다 matrices를 곱하여서 Key, Query, Value vector를 만든다

 

3-2 각 단어마다 Score Vector 구하기

예시를 위해 위의 예시에서 Thinking 의 Score Vector를 구한다고 생각해보자

구하고자 하는 단어의 Queries에 대해

모든 단어의 (자기자신 포함) Keys 값을 내적한다

ex) q1 dot k1 = (10,1,3)(10,6,4) = 112

 

위의 과정에서 내적을 해야 하기 때문에 Queries vector 와 Keys vector의 차원은 같아야 한다

 

즉, 내가 encoding 하고자 하는 단어의 Queries 벡터와 나머지 모든 N에 대한 keys vector를 내적하여 각각 단어끼리의

유사도를 파악 한다 -> 이것이 Attention (특정 time step에 어떤 입력을 주의 깊게 볼지 결정)

 

4. Self Attention에서 Attention Weight를 구함

 

먼저 중간에 8 로 나누어 준 것은 Score 값이 너무 커지지 않게 하기 위해서 key vector의 dimension(hyperparameter)인 64의 제곱근 8을 나누어 준다 (정규화 느낌)

 

그 다음 Softmax를 통과 시켜 주면 이것이 Attention Weight이다

 

5. Attention Weight에 Value를 곱해서 Resulting Vector z를 만들어 준다

위에서 구한 Attention Weight는 스칼라 값이므로

여기에 각각의 단어의 Value를 곱해서 더해주면 최종 출력이 나온다

이러한 과정을 거치기 떄문에 최종 출력인 Encoding Vector는 Value vector와 동일한 차원을 가지게 된다

 

즉, Value Vector들의 weight를 구하는 방법이 ~ softmax까지 하여서 Attention Weight를 구하는 것이고

최종적으로 나오는 encoding vector는 value vector와 weighted Sum을 진행한 값이다

 

 

 

위에서 설명한 방법을 Matrix로 표현해보자

<Matrix Calculation of Self-Attention>

The first step is to calculate the Query, Key, and Value matrices. We do that by packing our embeddings into a matrix X, and multiplying it by the weight matrices we’ve trained (WQ, WK, WV).

위의 그림에서 X는 앞에서 예시를 들었던 "Thinking Machines"를 Matrix로 embedding 한 것이다

 

가로는 Embedding 할 때 정의하는 demension이고

세로는 단어의 개수 즉, 2 이다

 

그림과 같은 방법으로 Q K V를 구하고

다음 연산을 진행하면 z가 나오게 된다

 

굉장히 복잡해보이지만 Python을 통해 한 줄로 구현이 가능한 수식이다

Scores = Q.matmul(K.transpose(-2,-1)) / np.sqrt(d_K)

 

위에서 볼 수 있듯이  각각 단어들에 대해서 동일한 WQ, WK, WV를 통해서 Q,K,V를 만들어 낸다

 

지금 머리 속에 생각한 걱정

이러면 조금 성급한 일반화가 되지 않을까? 성능이 좋게 나올까? 라는 생각을 나도 했는데

조금 더 읽고 나서 이러한 걱정이 해결되었다

 

<MHA의 문제점과 해결방법>

 

 

 

8개의 Head를 썼다고 가정을 하고 설명하면

z가 총 8개 나오게 되는데

맨 처음 transformer의 구조를 살펴보면 Encoder가 다른 Encoder와 Stack되어 있고 같은 구조이다

즉, Enbedding Vector와 Encoding Vector의 차원이 동일해야 하지만 MHA에 경우 Encoding Vector가 8배 더 크다

 

이를 해결하기위해 추가적인 Matrix를 아래 그림과 같이 두어

Encoding Vector 와 Embedding Vector의 차원을 동일하게 만들어 주었다

 

 

<최종>

모든 걸 요약해보면 다음과 같다

위의 과정을 모두 거치면 문제가 없어 보이지만 이 또한 문제가 있다

 

<추가적인 문제점 해결 방법> : Positional Encoding

Transformer의 과정을 잘 살펴보면 각각 단어를 따로 따로 분리해서 계산을 진행하는 방식이므로

Sequential한 정보는 없어지게 된다

 

이를 해결하기 우해 Positional Encoding을 진행한다 (bias 처럼 계산)

If we assumed the embedding has a dimensionality of 4, the actual positional encodings would look like this:

Positional encoding을 구하는 방법은 Pre- defined도니 값을 가져와서 쓰면 된다

get_timing_signal_1d()

https://github.com/tensorflow/tensor2tensor/blob/23bd23b9830059fbc349381b70d9429b5c40a139/tensor2tensor/layers/common_attention.py

 

 

728x90
저작자표시 비영리 변경금지 (새창열림)

'AI Track > CV' 카테고리의 다른 글

[Generative AI] Diffusers를 이용한 Custom Diffusion  (0) 2023.07.14
[CV] Structural Similarity Index  (0) 2023.07.12
[Seg] Segmentation 모델(mmsegmentation) 준비  (0) 2023.06.27
Custom Diffusion 실습  (0) 2023.06.21
[Seg] Segmentation 모델(mmsegmentation) 준비  (0) 2023.06.21
    'AI Track/CV' 카테고리의 다른 글
    • [Generative AI] Diffusers를 이용한 Custom Diffusion
    • [CV] Structural Similarity Index
    • [Seg] Segmentation 모델(mmsegmentation) 준비
    • Custom Diffusion 실습
    쫑쫑JJONG
    쫑쫑JJONG
    connect : tmdwhd619@naver.com

    티스토리툴바