본문 바로가기

Programming Project/CS294-158

[한글-2-a] CS294-158 Deep Unsupervised Learning Spring 2019


투명한 기부를 하고싶다면 이 링크로 와보세요! 🥰 (클릭!)

바이낸스(₿) 수수료 평생 20% 할인받는 링크로 가입하기! 🔥 (클릭!)

* 티스토리 에디터가 바뀌었는데, 훨씬 깔끔하고 보기 좋네요!

* 다만, 이전 글들과 비교해서 포멧이 조금씩 다를 것 같아요!

 

이번 강의는 

위와 같은 3 파트로 이루어져 있다.

 

우선 지난 시간에 했던 강의내용에 이어서 Autoregressive models에 대해 다루어 보겠다.

 

 

 

지난 시간에 공부했던 PixelCNN에 대해서 기억하는가?

 

이 모델은 이미지에서 잘 동작하도록 설계된 모델이다.

 

autoregressive model은 우선 variables의 순서를 질의(query)로 선택하고, (위의 경우에는 image안의 pixel들이 될 것이다)

그 이전 variables를 통해서 새로운 한개의 variable을 예측한다.

즉 P( x | 이전 x들 ) 과 같은 형태를 예측한다고 보면 우리에게 익숙한 모양이 될 것이다.

 

pixel cnn은 이전 pixel(variable)을 cnn을 통해 입력받고 그 결과로 새로운 픽셀을 아웃풋으로 내보내준다.

이미지 데이터는 cnn에서 잘 동작하기 때문에, 이는 굉장히 좋은 시도라고 할 수 있다.

 

그치만 receptive field를 살펴보면 이 해당 cnn 필터는 blind spot을 가지고 있다는 점을 알 수 있다.

그리고 사진 크기가 늘어날수록 blind spot이 늘어나는 문제가 심각해진다.

 

autoregressive model은 모든 이전 pixel을 기준으로 삼아야 하므로, 이 모델은 그 관점에서 weak하다.

 

 

그리고 위의 것을 해결하기 위해서 두 인풋을 받는 cnn 기반 모델을 만들어서 아웃풋을 생성해냈다.

 

그 외에도, U-Net등의 여러 추가적인 멋진 구조들을 통해서 CNN기반으로 발전시킨 여러 모델들이 존재한다.

 

 

다음으로 소개할 방법은 굉장히 기발한 방법이다.

 

Masked attention 이라는 방법인데,

 

우선 Attention은 뉴럴 넷 구조적으로 각 output 하나하나가 모든 input을 볼 수 있게 만든 구조이다.

 

즉 이전 문제로 돌아가서 생각 해 보자면, 각 픽셀이 unlimited receptive field를 가지게 된다고 볼 수 있다.

 

Masked attention을 적용하는데에 있어서 유일한 문제는 굉장히 느리다는 것 뿐이다.

 

이 때 각 아웃풋이 모든 인풋을 참조하는건 multilayer perceptron(linear layer) 이랑 같지 않은가 생각할 수 있지만, number of parameter이 계속 데이터가 증가함에 따라서 바뀌기 때문에 해당 방식은 쓸 수 없다.

 

Attention을 적용하여 좋은 점은, 파라미터의 수가 상수라는 점이다. (데이터의 수에 따라 가변적으로 쓸 수 있다)

그리고 각 픽셀에 대한 연산이 PixelCNN처럼 parallel하게 진행될 수 있다는 점이다. (RNN에서는 그럴 수 없는데 CNN에서는 여전히 가능)

 

 

위 슬라이드에서 설명하는 내용의 중점은 value를 적용함에 있어서 query와의 dot product 연산을 softmax한 값을 attention 가중치로 사용한다는 것인데, 위 슬라이드만 가지고 Attention을 설명하기는 힘드니, 링크를 첨부하겠다.

 

1. 기본

https://dalpo0814.tistory.com/45

2. Attention is all you need 논문 설명 (Scaled Dot-product Attention과 멀티 해드 어텐션에 대한 내용 나옴)

https://pozalabs.github.io/transformer/

 

Attention 값 자체를 어떻게 계산하는지는 위 링크를 참조하는게 좋을 것 같고

위 링크에서도 나와있지만,  Attention 값이란 해당 값을 얼만큼의 가중치로 참조할 것인지에 대한 값이다.

 

이를테면, 계산된 아웃풋이 (2,3,4,5)라는 벡터로 나왔을 때 이 벡터의 중요도를 결정하는 새로운 attention 벡터를 만든다. (0.2,0.3,0.4,0.1)이라고 하자. 그러면 결과적으로 나오는 아웃풋은 (0.4,0.9,1.6,0.5)가 된다.

 

 

위 식에서 볼 수 있듯, 우리는 모든 값을 참조해서 아웃풋을 내놓고 있다.  unlimited receptive field 말이다.

 

우리는 각 input 픽셀로부터 쿼리(query), 키(key), 벨류(value)를 만들어낸다.

그리고 모든 input픽셀은 여기에서 나온 쿼리로 다른 모든 픽셀들을 쿼리한다. (위의 식 처럼)

이 부분이 parralize from every pixel이다.

 

이제 위 그림을 보자.

위 그림은 receptive field에 관한 그림인데, 윗 줄이 output이고 아랫쪽이 input이라면

convolution 과 self-attention의 입력은 위 그림과 같다.

self-attention은 모든 pixel과 dot-product을 하기 때문에 모든 곳을 참조한다는 식의 그림이다.

 

다만 위와 같은 경우에는 내가 지금 어느 위치에서 입력을 읽어들이는지에 대한 특별한 정보가 없다면 항상 같은 output만을 내뱉게 된다 (즉, CNN필터는 지역적으로 입력을 받아서 자연스럽게 지역적인 output을 뱉었는데 반면에 모든 입력을 받는다면 지역적인 output을 내는것이 힘들다는 이야기이다.) 

 

그렇기 때문에 우리는 추가적인 channel을 만들어서 입력으로 넣어준다. (예를들어 x 와 y를 넣을 2 체널을 추가해서 넣어준다던가) 이 방법을 통해 우리는 문제를 해결할 수 있다. (또 다른 방법으로 해결도 가능한데 아래에서 나중에 소개하도록 하겠다. )

 

Masked Attention은 위의 식 중 분자의 일부분을 0으로 바꾸는 것이다. (masking하는 것이다)

 

Attention은 모든 픽셀을 입력으로 받는다는 것을 알고있을 것이다. 그렇다면 autoregressive model에서는 이전 input을 입력으로 받고 현재를 output으로 내보내며 미래는 input으로 받지 않아야 하는데, 이것을 masking으로 해결한다.

 

지금 내가 내보내고자 하는 output이 i번째라면 i+1 ... n 까지의 모든 입력을 0으로 masking한다.

 

그러기 위해서 우리가 할 일은, 저 q*k 부분을 -∞으로 만드는 것이다. e^(-inf)의 경우 0과 가까워지니까 말이다.

 

Attention과 함께라면 위와같은 순서로 픽셀을 만들수도 있다. (PixelCNN으로는 하기 힘든 일이다)

 

PixelSNAIL의 도식화 슬라이드

결국 위의 알고리즘들 중에서 이미지를 위한 model중 가장 잘 동작한 것은 PixelCNN block + attention을 쌓은 것이었다.

 

 

위 그림은 Gradient가 어떻게 흐르는지에 대한 시각화 자료이다. 진한 부분을 참조하여 현재의 gradient가 만들어졌다는 의미이다. PixelSNAIL의 경우 (위의 방법을 적용한 모델이다) 모든 범위로부터 gradient가 발생한다는 것을 알 수 있다.

 

 

 

 

글의 내용이 길어지는 것 같아 이번 글 부터는 a b c를 기점으로 세개로 나누어서 작성하도록 하겠다