728x90

  합성곱 신경망을 이용하여 제안 영역을 구하는 방법을 Faster R-CNN이라고 부릅니다. 왜냐면 Fast R-cnn보다 더 빠르거든요. 아이디어는 선택적 탐색이라는 휴리스틱 방법 대신 합성곱 신경망으로 제안 영역을 예측하거든요. 동작 과정은 아까 본 fast r-cnn이랑 비슷한데, 백본 신경망 뒤에 제안 영역 신경망 region proposal network RPN라는 작은 신경망이 추가되어 제안 영역들을 예측합니다.

 

 파이프라인이 있는데 입력 이미지가 있으면 백본 신경망을 통과해서 이미지 특징들을 구하고 이 이미지 레벨 특징을 왼쪽의 제안 영역 신경망에 넣어 제안 영역들을 구해내고 나머지는 fast r-cnn과 동일 합니다. 이미지 특징을 미분 가능하도록 잘라내기 위해서 제안 영역들을 구할 것이고, 각 제안 영역마다 분류를 하고, 바운딩 박스 변환을 수행하겠습니다.

 

 여기서 새로운 부분은 영역 제안 신경망 뿐인데, 그러면 우리는 어떻게 하면 합성곱 신경망으로 제안 영역을 뽑아낼 수 있을까요??

 

 

  이걸 이해하기 위해서 제안 영역 신경망 아키텍처에 대해서 조금 깊게 살펴봅시다. 이 신경망은 백본 신경망의 영향을 받는데요. 입력 이미지를 백본 신경망에다가 넣어 512 x 20 x 15차원의 이미지 특징을 구하겠습니다. 여기서 아이디어는 백본 신경망으로 얻은 이미지 특징은 입력 이미지의 특징과 일치하고 있습니다.

 

 여기서 우리가 해볼수 있는건 이 합성곱 특징 맵의 각 지점에서 앵커 박스라고 하는 고정된 크기와 고정된 종횡비를 가지는 바운딩 박스가 있다고 해봅시다. 이 앵커박스를 슬라이드 시키면서, 백본 신경망으로부터 얻은 이미지 특징 지도의 모든 위치에 존재한다고 할께요. 

 

 

 

 우리가 할 일은 작은 합성곱 신경망을  이 앵커박스가 객체를 가지고있는지 객체가 없는지 학습시키겠습니다. 이그러면 이 문제는 이진 분류 문제가 되어 각 제안 영역들/앵커 박스들이 양의 스코어를 가지는지, 음의 스코어를 가지는 지에 대한 출력을 받겠습니다. 

 

 이 이미지 레벨 특징에서 한 점에 대한 앵커 박스 하나가 있으면, 또 다른 합성곱 레이어로 양 혹은 음에 대한 스코어를 얻을수가 있는데, 1 x 1 합성곱 레이어로 해당 앵커에 객체가 있는지 없는지에 대한 스코어를 얻을수 있겠습니다. 그리고 이 두 카테고리를 소프트맥스 비용으로 학습할수가 있어요.

 

 이 앵커 박스로는 이미지에 있는 물체에 잘 맞추지 못할수도 있는데, 트릭 으로

 

  앵커 박스의 스코어 뿐만 아니라, 합성곱 특징맵에서 각 위치에대한 박스 변환도 출력으로 얻어내어 기존의 앵커박스를 변환시켜 실제 제안 영역으로 바꾸겠습니다. 위 슬라이드에서 앵커박스는 녹색인데 실제 제안 영역 박스는 노란색이 되겠습니다. 이 박스 변환은 이전에 본 방법대로 회귀 비용을 사용해서 학습할수가 있습니다.

 

 이건 그렇게 복잡하지는 않으며, 또다른 합성곱 레이어로 박스 변환에 대한 값들을 얻어내었습니다. 합성곱 특징 맵에서 한 지점에 대한 고정된 크기를 갖는 하나의 앵커박스를 사용하는것 만으로는 우리가 인식하고자하는 모든 객체들을 찾아내기는 부족합니다. 

 

 

 그래서 실제로 사용할때는 일반적으로 합성곱 특징맵의 모든 지점에다가 k가지의 다른 크기와 종횡비를 갖는 앵커 박스들을 사용합니다. 질문이 들어왔는데 앵커가 물체인지 여부는 k나 2k개가 될수 있는데 어떻게 구현하느냐에 달린것이며 원래 논문에서는 2k을 가지며,

 

 양과 음의 스코어를 출력하고 소프트맥스 비용을 사용했었는데 이와 동일하게  단일 스코어를 출력으로 받는데 큰 양의 값은 긍정, 큰 음의 값은 부정 그리고 로지스틱 비용을 사용해도 됩니다. 둘다 동일하며 뭘 사용해도 사용해도 중요하지는 않아요.

 

 대부분 구현의 경우 한 앵커당 양의 스코어와 음의 스코어를 받아 스프트맥스 비용을 사용하나 로지스틱 회귀를 사용해도 문제 없겠습니다.

 

 그래서 해결 방법은 모든 지점에서 서로 다른 크기와 종횡비를 가지는  k 앵커를 사용하면 되겠으며 이는 하이퍼 파라미터가 되겠습니다. 얼마나 많은 앵커를 사용할지 어떤 스케일과 크기를 지정할지 모두가 객체 탐지에서 하이퍼 파라미터입니다.

 

 이건 faster r-cnn에 대해서 전체를 정리한 것인데, 4개의 학습해야할 서로다른 비용들을 가지고 있습니다. 영역 제안 신경망은 2개의 비용을 가지는데, 분류 비용의 경우 앵커 박스가 객체인지 객체가 아닌지를 찾고, 회귀 비용은 영역 제안 신경망이 기존의 앵커 위치에서 실제 제안 영역 위치로의 변환 값을 출력합니다. 

 

 이제 fast r-cnn의 나머지 내용들을 가지고, 영역제안 신경망으로부터 얻은 각 제안 영역에다가 영역 단위 신경망을 돌려서 두 개의 비용을 또 얻습니다. 하나는 객체 분류 비용으로 객체가 무슨 카테고리에 속하는지 혹은 배경인지에 대한 것이며, 최종 물체 회귀 비용은 다시 영역 제안 신경망으로부터 얻은 제안 영역을 최종 출력 박스로 회귀하겠습니다. 

 

 이 내용들이 많고 지저분 하기는 하지만 더 자세히 얘기할 시간은 없구 물체 탐지는 실제로 동작하기 까지 꽤 복잡한 주제가 되겠습니다.

 이걸 다하면 faster r-cnn은 정말로 정말로 빠릅니다. 왜냐면 우리는 cpu를 이용한 영역 제안으로 인한 병목 현상을 제거하였고, 대신 제안 영역들을 이미지 특징과 아주 작은 합성곱 신경망으로 구하였거든요.  그래서 아주 빠르며, 실시간으로 돌릴수가 있습니다. 그래서 gpu로 돌리는 faster r-cnn는 fast r-cnn보다 10배나 빨라요. spp-net에 대해서 이야기할 시간은 없는데, 이건 빠르지만 다르게 동작하는 방법입다.  

 

 

 

 

좋아요 faster r-cnn은 종종 two-stage object detector 두 단계로 이루어진 객체 검출기라고도 합니다. 이 방법은 두 단계로 이루어져있는데, 첫 번째 단계는 파란색 부분으로 전체 이미지를  신경망으로 돌려서 합성곱 특징을 구하고, 이걸 영역 제안 신경망에 돌려서 제안 영역들을 얻어냅니다. 두번째 단계는 영역 별 연산을 수행하고, 각 영역별로 최종 분류 스코어랑 회귀 파라미터를 얻어냅니다.

 

 

그런데 질문이 있습니다. 우리가 정말로 두번째 단계가 필요한건가요? 즉 첫번쨰 단계만으로 모든걸 할수없느냐인데, 즉 시스템을 더 간소화해서 더 빠르게 만들자말입니다. 왜냐면 우리는 이렇게 영역별로 나눠서 계산을 할 필요가 없거든요.

 

 

 이 개념이 실제로 가능합니다. 단일 단계 객체 탐지라는 방법이 있는데, faster r-cnn의 rpn 처럼 보는것이나  앵커박스로 객체인지 아닌지 분간하는게 아니라 물체 카테고리 중 어떤거인지 바로 분류 결정을 내립니다. 우리가 c 개체 카테고리를 분류하고자 한다면, 이제 앵커의 출력은 20 x 15 공간 크기에다가 각 위치마다 k개의 앵커 박스와 바로 c개의 카테고리와 배경을 포함해서 c + 1개의 스코어를 얻습니다.

 

 이 과정을 합성곱 레이어로 한번에 할 수 있어요. 그렇게 되면 기존의 rpn에서 이진/두 클래스 비용을 사용했던것 대신에 완전한 분류 비용을 사용하고, 앵커당 박스 변환 값들을 얻을 수가 있겠습니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

300x250
728x90

  척도에 대해서 이제 정리하고 다시 객체 탐지 방법으로 돌아갑시다. R-CNN은 영역 기반 합성곱 신경망으로 객체를 잘 탐지합니다.

 

 

 

 

 

하지만 이 모델은 매우 느린 문제를 가지고 있는데, 선택적 탐색 방법으로 얻은 각 제안 영역들에 대해서 합성곱 신경망을 통한 연산을 하기 때문입니다. 선택적 탐색 방법은 2000개의 제안 영역들을 만든데 이미지로부터 객체 검출시 2000개의 순전파 연산을 해야되다보니 꽤 계산비용이 크며 매번 이미지들을 실시간으로 돌리기는 어렵겠습니다.

 

 

 

 그래서 이 과정을 더 빠르게 만들어야하는데, 사람들이 사용하는 이 과정을 더 빠르게 만든 방법으로 합성곱 신경망을 돌리고 나서 워핑을 합니다. 그렇게 함으로서 서로 다른 영역들 간에 많은 계산량을 공유할수 있게 되요(?) 

 어떻게 이계 동작할까요. 일단 R-CNN을 느린 R-CNN이라고 부르고 있습니다.

 

 

 

 

 

 이를 대신하는 방법을 Fast R-CNN이라 불러요. Fast R-CNN은 기본적으로 slow r-cnn과 동일하나    합성곱 연산과 영역 변환의 순서를 뒤바꿉니다. 

 

 

 

 

 입력 이미지를 가지고 와서 이 고해상도 이미지를 단일 합성곱 신경망으로 돌립니다. 이 신경망은 완전 연결신경망없이 전체가 합성곱 레이어로 이루어집니다. 그 출력 결과는 합성곱 특징 맵이 나오겠습니다. 이 이미지를 돌리는 모델을 백본  신경망이라 부릅니다. 이건 alexnet이나 vgg, resnet 등 사용하고 싶은걸 쓰면 되요.  

 

 

 

 그 다음에는 선택적 탐색같은 영역 제안 방법을 돌릴수가 있는데, 입력 이미지의 픽셀을 잘라내기보다는 

 제안 영역들을  합성곱 특징 맵에다가 사영시켜, 입력 이미지가 아닌 이 특징 맵으로부터 잘라내겠습니다.  정리하자면 합성곱 백본 신경망으로 부터 얻은 특징 맵을 잘라낸다고 생각하면 되겠습니다. 

 

 그러고나서 각 영역들마다 가벼운 신경망을 돌리고  

 

 

 

 

출력으로 각 영역별로 분류 스코어랑  바운딩 박스 회귀  변환값들을 얻겠습니다. 

 

 

 

 이 과정은 아주 빠른데 대부분의 계산 과정은 백본 네트워크에서 일어나기 때문이며, 각 영역마다 돌아가는 신경망은 아주 작고 가볍다보니 빠르게 돌아갑니다.

 

  그래서 alexnet을 백본 신경망으로 활용한 fast r-cnn 모델의 경우 벡본은  알렉스넷의 합성곱 레이어 전체가 되겠고, 각 영역 신경망은 마지막 두 완전 연결 레이어가 되겠습니다.  이 방법은 영역이 많더라도잘 동작하겠습니다.  

 

 

 

 잔류 신경망을 사용하는 경우에는 마지막 합성곱 연산 단계를 각 영역들을 연산하는데 사용하고, 나머지 단계들이 백본으로 사용되겠습니다. 백본 신경망에서 제안 영역들간의 연산량을 공유함으로서 계산량을 줄이겠습니다. 

 

 

 그러면 여기서 특징을 잘라낸다는게 어떤 의미는 무엇일까요? 백본 신경망의 가중치들을 잘 역전파 시키기 위해서는 이 특징들을 미분 가능하도록 잘라내어야 합니다. 

 

 

 

 특징을 미분 가능하도록 잘라내는 방법은  ROI(Region Of Interest) Pool이라고 부르는 연산자를 사용하면 되겠습니다. 여기에 이런 입력이미지와 입력 이미지에 대한 제안 영역이 주어지면

 

벡본 신경망을 돌려서 위와 같은 합성곱 연산을 통해 이미지 특징을 얻겠습니다. 데이터 형태를 정리하자면 입력 이미지는 rgb채널과 공간 크기로 640 x 480을 가지고 있으며,  합성곱 특징은 512차원에 20 x 15의 공간적 크기를 가지겠습니다.

 

  이 신경망은 완전히 합성곱 연산으로만 이루어져있기때문에 이 합성곱 특징 지도는 입력 이미지의 각 점들에 대응한다고 할 수 있겠습니다.  우리가 할 일은 이 제안 영역을 특징 맵에다가 사영시키겠습니다.  이 다음으로는 이 특징들을 스냅(딸각 맞출수가)시킬수가 있는데,  사영한 뒤에 제안 영역이 합성곱 그리드에 완전히 일치하지 않거든요

 

 그래서 합성곱 지도 격자에 맞추도록 스냅을 시키고,  

 

2 x 2 풀링을 할 수 있도록 2 x 2 하부 영역으로 나누겠습니다.  그래서 제안 영역을 대략적으로  가능한 2 x 2의 하부 영역으로 나눈다음에 

 이 하부 영역들에 대해서 최대 풀링을 하겠습니다. 여기서 파란색 영역은 512 x 2 x 2가 되고,  최대 풀링을해서  출력 결과는 단일 512차원의 벡터가 되겠습니다.  녹색 영역의 경우 512 x 3 x 2 크기고,  출력 결과는 512차원의 벡터가 되겠습니다. 이 의미는 입력 제안 영역이 다른 크기를 가지고 있더라도  RoI Pool 여산자의 출력은 항상 고정된 크기를 가지며, 이것을  영역별 연산을 수행하는 이후 합성곱 레이어에  전달되서 동작하겠습니다.

 

 다시 역전파의 경우에도 일반적인 최대 풀링의  역전파가 적용되겠습니다. 영역 특징에 대해서 업스트림 그라디언트를 받으면  해당하는 이미지 특징의 영역으로 전파됩니다.   그리고 우리가 아주 많은 영역을 가지는 배치로 학습을 할때, 대부분의 이미지 특징의  그라디언트들을 얻을수가 있겠습니다. 

 

 

  여기서 약간의 문제가 있는데,  스냅할때 약간의 비정합 문제로 녹색 영역 파란 영역이 다른 사이즈를 가질 수도 있어요.

 

 

 

 

 

 사람들이 사용하는 조금 더 복잡한 버전으로  roi align이 있는데,  아주 자세한 내용을 다루기는 싫지만  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

이  방법은 스냅하는 대신에 잘 정합 할 수 있도록 양선형 보간법을 사용합니다.  roi align은  쉬우며 

 

  입력 특징과 출력 특징 간에 더 나은 정합 결과를 만들어 낼수가 있겠습니다.

 

 

이번에는 fast r-cnn과 slow r-cnn을 한번 살펴보겠습니다. 이들 사이의 차이는 합성곱 연산과 크롭 그리고 워핑의 순서를 바꾼것인데요. fast r-cnn은 제안 영역들의 연산을 공유/한번에 하기 때문에 빠르며 fast r-cnn이 얼마나 빠르냐면 

 

 

 

 한번 훈련 시간과 추론 시간을 비교해볼수가 있겠습니다. r-cnn을 학습하는 경우에는 84시간이 걸렸습니다. 당연히 몇년 전이고 옛날 gpu를 사용했기 때문인데 faster r-cnn을 같은 gpu 환경에서 한 경우에 훈련하는데 10배 정도 빨라졌습니다.

 

 추론 시간의 경우 fast r-cnn은 r-cnn보다 다양한 이미지 영역들을 한번에 계산하기 때문에 훨씬 빨라졌습니다. 여기서 흥미로운 부분은 

 

 

 

 fast r-cnn은 대부분 시간을 제안 영역을 계산하는데 소모합니다. 제안 영역은 선택적 탐색이라고 부르는 경험적/휴리스틱 알고리즘을 사용하기 때문인데 이 알고리즘이 cpu에서 동작하기 때문입니다.  그래서 이 fast r-cnn을 보면 동작 시간의 90%가 이 제안 영역을 계산하는데 사용하고 있어요.

 

 

 여기서 경험적 알고리즘으로 제안 영역을 구하는 대신 이걸 합성곱 신경망으로 대체해서 구하면 더 효율적이게 되겠죠. 그러면 이 객체 인식 시스템을 훨씬 개선할수 있겠습니다.

300x250
728x90

 객체 탐지 문제에서 발생하는 또 다른 문제로는 같은 객체의 영역을 겹쳐서 나타내는 박스의 셋이 출력되는 경우가 있습니다.  이건 실제 객체 탐지 결과가 아니라 슬라이드의 예시인데 이 두 강아지 예시에서 객체 탐지기는 객체 하나당 박스 하나가 아니라 객체를 포함시키는 여러개의 상자를 출력하는데 이런 상황에서 주의해야 합니다.

 

 이 박스 겹침 문제를 해결하기 위해서는 객체 검출 시스템으로부터 얻은 이 상자들에다가 후처리 과정을 하면 되는데, 비최대 억제 non max suppresion NMS라고 부르는 알고리즘을 사용합니다. 이 비최대 억제를 구현하는 수 많은 방법들이 있긴 한데, 가장 간단한 방법은 탐욕 알고리즘입니다. 객체 검출기로 얻은 출력들을 모두 박스 들이며, 각 박스들은 카테고리에 해당하는 확률을 가지고 있습니다. 여기에 4개의 박스가 있는데, 각 상자들은 서로 다른 분류 스코어를 만들고 있어요. 

 

 여기서 비최대 억제를 위한 탐욕 알고리즘은 우선 가장 높은 스코어를 갖는 박스를 선택하는데 여기서 파란색 상자가 가장 큰 스코어를 가지고  있고, 이 파란 상자와 다른 상자들의 IoU를 계산합니다.

 

 거기다가 0.7 보다 큰 경우로 임계화를 하면 검출기로 구한 두 상자의 IoU가 이 임계치보다 큰 경우 서로 다른 객체를 감싸고 있는것이 아니라 동일한 물체를 겹쳐지게 탐지한다고 볼 수 있겠습니다. 그러고 나서 작은 박스를 제거 시키면 됩니다.

 

 이 예시에서는 파란색 박스와 주황색 박스의 IoU가 0.78이며 스코어가 낮은 오랜지색 박스를 제거하겠습니다. 오렌지 박스를 제거한 다음에 다시 스탭 1로 가서 다음 가장 큰 스코어를 갖는 박스를 찾는데 여기서 보라색 박스의 확률이 0.75이고, 다시 가장 큰 박스와 나머지 박스들의 IoU를 계산하는데 여기서 작은 박스는  노란색 박스 하나 뿐이며 노란 박스와 보라 박스의 IoU가 0.74이니 

 

 

 노란색 박스를 제거해서, 객체 검출기의 최종 결과는 파란 박스와 보라 박스가 되며 겹치는 부분없이 잘 분리가 되었습니다.  

 

 

 

 이 알고리즘은 꽤 합리적으로 보으로보이며, 기본적인 객체 탐지기들은 대부분 이런 비최대 억제 알고리즘과 같은 방법으로 겹치는 부분들을 제거 합니다. 하지만 비 최대 억제는 문제점을 가지고 있는데, 이미지에 서로 겹치는 부분이 많은 객체가 포함되는 경우에 어려움을 겪습니다. 

 

 지금 당장은 컴퓨터 비전 커뮤니티에서 좋은 방법은 없습니다. 위와 같이 아주 많은 군중 사진처럼 박스가 많이 겹치는 사진에서는 아주 가까운 박스 끼리 구분 시키기가 매우어려우며 객체 탐지 분야의 도전 과제가 되겠습니다. 

 

  또 다뤄야될 주제로는 지금까지 각각의 박스를 비교하기 위해서 IoU 척도를 사용하였습니다. 하지만 객체 탐지기가 테스트셋으로 얼마나 잘 동작하는지 전체적으로 평가하는 척도가 필요해요. 이미지 분류의 경우 간단했는데, 테스트 셋의 예측 결과가 실제 라벨과  비교해서 정확도를 구했으면 됬거든요. 그래서 이미지 분류 문제는 계산하기 간편한 정확도를 이용해서 어떤 모델이 더 좋은지 비교할 수 있었죠.

 

 

 하지만 객체 탐지 문제에서는 꽤 복잡합니다. 여기서 테스트 셋에 대한 모델의 성능을 정량화할필요가 있는데, 검출은 훨씬 복잡한 작업이며 불행히도 검출 결과를 비교하기 위한 척도는 지저분 합니다.

 

  하지만 기본적으로는 우린 주어진 데이터셋으로 객체 탐지기를 학습시키고,  이게 얼마나 객체를 탐지를 잘하는지를 나타내는 수를 구해야하는데 우리가 할일은 Mean Average Precision MAP라는 척도를 계산하겠습니다. 이 척도는 객체 탐지기를 비교하기 위한 표준 척도가 되겠습니다.

 

 가장 먼저  학습한 객체 검출기를 테스트셋으로 돌리고, 비최대 억제로 겹치는 검출 영역을 제거한뒤  박스들이 남을탠데 이 박스는 각각의 카테고리에 대한 스코어를 가지고 있을겁니다. 그리고 각 카테고리별로 개별적으로  평균 정밀도 average precision라고 부르는 수를 계싼하겠습습니다.  이 값은 한 카테고리에대해서 스코어가 전반적으로 얼마나 되는지를 알려줘요, 

 

 여러분들이 평균 정밀도라고 하는 척도와 친숙하다면, 이건 정밀도, 재현율 곡선 아래 영역의 넓이와 동일합니다. 이개념과 친숙하지않으면 조금더 자세히 들어가볼게요. 우리가 다루고자 하는 카테고리가 있으면, 테스트 셋으로 검출한 결과를 정렬시키겠습니다. 이 과정은 카테고리별로 개별적으로 진행해요.  

 

 여기에  파란색 박스는 검출기로 얻은 강아지 카테고리들의 스코어 확률로 가장큰건 0.99, 두번째로 큰건 p(dog) = 0.95, 쭉 값니다.  그다음에는 주황색 박스는 테스트셋의 실제 강아지 영역을 나타내겠습니다.  

 

 

 스코어에 따라 정렬한 검출 영역과 실제 영역과 IoU가 0.5 이상으로 임계화가 되면 매칭을 하겠습니다. p(dog) = 0.99인 경우, 실제로 그 이미지의 어느 groud truth dog 박스와 매치가 된다고 가정해서, 참 긍정으로 판별하겠습니다. 

 

 

 

 그렇게 올바르게 검출을 하면, 정밀도 재현율 곡선에서 한 점의 위치를 계산 할수가 있겠습니다. 아직 우리는 가장 높은 스코어를 가진 박스의 경우 만을 고려하였습니다. 정밀도 precision은  검출 결과가 실제로 참인 경우일 비율이고, 재현율  recall은  전체 ground truth 중에서 실제로 맞을 비율이 되겠습니다. 

 

 이 경우에는 가장 높은 스코어를 가지는 경우를 다루다보니 정밀도는 100%이고, 재현율은 세 그라운드 트루스 중 하나를 찾아내었기 때문이 1/3이 되겠습니다. 이렇게 해서 정밀도 재현율 그래프에서 한 점을 구해내었습니다.

 

 이 과정을 다음 검출 박스에 대해서 반복하는데, 두 번째로 가장 큰 스코어를 갖는 강아지 영역은 또 다른 그라운드 트루스 박스와 매치가 된다고 가정하면 2개의 참 긍정 검출 결과를 찾아내었습니다. 세 그라운트 트루스 영역 중에서 2개를 찾아내었으므로 재현율은 2/3이 되겠습니다.

 세 번째후보 영역을 거짓 긍정이라 한다면, 이미지 상에서 매치되는 그라운드 트루스 영역이 없을 것이고 새로운 정밀도 재현율 곡선 상의 점이 계산되겠습니다.

   다음의 경우도 거짓 긍정이라면 재현율은 그대로이나 정밀도가 더 떨어지게되고 

  마지막 영역이 참 긍정인 경우, 마지막 그라운드 트루스와 매치가 되어  정밀도는 5개의 검출 결과 중에서 3개를 참 긍정이므로 3/5가 되며, 재현율은 실제 그라운드 트루스를 다 찾아내었으므로 1이 되겠습니다.

 

 이 재현율 정밀도 곡선을 채워서 아래 넓이를 계산하면 0 ~ 1사이의 값이 나올건데 0이면 성능이 나쁜것이고, 1이라면 좋다고 할 수 있으며 이 값을 해당 카테고리의 평균 정밀도 average precision이라고 합니다. 이 객체 탐지 결과의 경우 강아지 평균 정밀도는 0.86이 되겠습니다. 

 

 

  ap 수가 무엇을 나타내냐면, 한번 1.0을 받으려면 어떻게 해야하는지 생각해보면 좋은데  ap 1.0을 얻으려면 거짓 긍정이 나오기전에 모든 참 긍정이 매치가 되겠습니다. 그래서 ap 1.0은 우리의 모델로 구한 검출 결과가 모든 참 긍정이며, 중복된 검출이나 거짓 긍정이 없다고 볼수 있겠습니다. 그리고 모든 영역들이 실제 그라운드 트루스 영역과 적어도 0.5 iou이상으로 매치되고 있습니다. 

 

 하지만 실제로 ap 1.0은 아주 얻기 힘들어요. 이 ap 척도를 사용하는 이유는 다은 응용 분야에서 얼마나 많이 올바른 영역을 찾아낼지 놓여낼지 트레이드 오프를 하길 원할수 있는데, 자율 주행차 같은 분야에서는  다른 차를 놓치지 않는게 매우 중요하다보니 아무것도 놓치기 싫을거고  모든 검출 결과가 올바르길 원할겁니다. 

 

  그래서 다양한 사용 경우에 따라서 서로다른 임계치와 정밀도와 재현율 사이에 트레이드 오프가 필요하지만, 이 평균 정밀도 척도를 계산하면 이건 정밀도와 재현율 사이에 가능한 모든 트레이드 오프 관계를 정리하다보니 사람들이 객체 탐지기를 평가하는데 자주 사용합니다

 

 그래서 실제 사용시에는  모든 객체 카테고리에 대해서 계산해서 평균 정밀도를 구하고 모든 카테고리에 대한 평균 정밀도의 평균을  구할수가 있겠습니다.  하지만 이게 잘못 될수도 있는데, 이  평균 정밀도의 평균을 계산할때 박스의 위치 추정이 잘되는지 고려하지 않고 검출된 박스와 그라운드 트루스와 iou만 보고 매칭하기 때문입니다. 그래서 실제로 정밀하게 검출했는지를 알수 없습니다. 

 

 

 실제 사용시에는 이 전체 과정을 다른 iou 임계치로 돌려볼수가 있고, 이렇게 다양한 임계치 값에 대한 mAP 값을 얻을수가 있습니다. 이 과정은 객체 검출기를 평가하기에는 매우 복잡하지만 사람들이 실제로 사용하는 만큼 유용한 방법이고, 여러분들이 객체 검출에 관한 논문을 읽어볼때마다 mAP수치들을 볼수 있을거에요. 

 

300x250
728x90

 지금까지 다뤄온 컴퓨터 비전 문제는 기본적으로 이미지 분류 문제들을 위로 다뤄봤다. 단일 이미지를 합성곱 모델에다가 넣어서 이미지의 카테고리 라벨을 얻었다. 고양인지, 강아지인지, 차인지 등 이와 같이 단일 카테고리 라벨을 얻었다. 이 작업은 수많은 응용분야에서 유용하며, 딥러닝 파이프라인 전체를 어떻게 만들고 학습해나가는지에도 좋았다. 하지만 이미지 분류 문제는 컴퓨터 비전에서 다루는 수많은 작업들중 하나일 뿐이다.

 

 여기에 컴퓨터 비전에서 일하는 사람들이 다루는 작업들을 계층적으로 정리한건데 이미지와 객체를 다양한 방식으로 식별하려고 하고 있다. 이번과 다음 강의에서는 이미지 상 객체의 공간적 존재 여부를 식별하는 다양한 방법들을 살펴볼것이고, 고전적인 이미지 분류 문제처럼 각 이미지의 픽셀별로 카테고리 라벨을 붙이는게 아니라 주어진 이미지에 대한 카테고리 라벨을 구해보겠다. 

 

 다른 컴퓨터 비전 작업으로 하나의 카테고리 라벨을 주는게 아니라 이미지의 여러 다른 부분에 다른 카테고리를 주고싶을 수도 있다. 이번과 다음 강의에서 이러한 작업들에 대해서 다룰것이고, 이번 시간에는 객체 탐지라고 하는 작업에 대해서 다뤄볼 것이고 컴퓨터 비전의 수 많은 응용분야에서 핵심이기도 하다.

 

 객체 탐지란 입력 이미지를 주었을때 출력으로 검출한 객체들을 가지는 작업이 되겠다. 검출한 객체들은 여러가지들을 출력하는데 그 중 하나는 그 검출된 객체의 카테고리이고, 다른 하나는 바운딩 박스로 이미지 상에 공간 어디에 위치하는지에 대한 정보가 되겠다. 이 바운딩 박스는 4개의 수로 이뤄져있는데 박스의 중앙점 x, y와 폭과 높이 w, h가 있다.

 

 모델이 회전된 바운딩 박스를 만들어 낼수도 있긴하지만 일반적인 객체 탐지 작업의 경우 그러지 않고, 축과 나란한 박스를 만들어 내므로 위의 4개의 실수로 정의할수 있겠다. 이 작업은 이미지 분류와 비교해보면 바뀐게 별로 없어보이지만 얼마나 어려울까? 여기서 우리가 할일은 이 박스와 카테고리 라벨만 구하면 되지만 이건 아주 어려운 작업이다.

 

 객체 검출에서 우리가 다뤄야 할 문제들 중 하나는 다중 출력을 내야하는 것인데, 이미지 분류의 경우 하나의 이미지에 대해서 하나의 분류 결과를 냈으면 되었지만 이미지에서 검출된 객체 전체의 분류 결과를 만들어 내야 한다. 그래서 모델을 만들때 고정된 크기의 출력이 아닌 가변 크기의 출력을 내도록 하여야 하므로 어려운 일이 되겠다.

 

  또 다른 문제로 각 객체들은 두 출력 값을 가지고 있는데 하나는 카테고리 라벨과 다른 하나는 바운딩 박스가 있다. 그래서 바운딩 박스를 구할수 있도록 하는 과정이 필요하다. 객체 탐지의 다른 문제는 계산 비용 문제로 상대적으로 고해상도 이미지에서의 처리가 필요하다. 대부분 이미지 분류의 경우 저 해상도 이미지로도 충분하였지만 객체 탐지의 경우 이미지안에 있는 여러 객체들을 식별해야하므로, 객체를 탐지할 만큼 충분한 이미지의 공간적 크기(해상도)가 필요하다. 객체 탐지 모델의 구체적인 예시로 이미지 해상도는 800 x 600정도로 이미지 분류에서 사용했던것보다 크다. 그래서 학습에 오랜 시간이 걸리고, 계산 비용으로 인해 객체 탐지가 훨씬 어렵게 되겠다.

 

 하지만 객체 탐지는 매우 유용한 문제로 우리가 만들고자 하는 많은 시스템에서 사용될수가 있겠다.  예시로 자율주행 차가 있겠고, 자율 주행차의 비전 시스템을 만든다면 차 주위에 무엇이 있는지 알아야할것이고 이게 매우 중요한 문제다보니 이미지로 단일 카테고리만 필요한게 아니라 전체 객체들을 구하여야 하겠다. 기본적으로 이미지 분류 다음에는 객체 탐지가 컴퓨터 비전 분야에서 두번째로 핵심적인 문제라고 할수 있겠다.

 

 이미지의 여러 객체가 아니라 단일 객체를 찾는 경우로 조금 단순하게 살펴봅시다. 단일 이미지를 탐지하는 경우 단순하게 할수가 있습니다. 왼쪽 이미지가 있고, 알렉스넷이라던가 선호하는 신경망 아키텍처에 넣으면 이미지의 벡터 표현 결과가 나오겠습니다. 

 

 벡터를 가지고 나뭇가지 형태로 분기해서 할수 있는 일을 보면 하나의 가지로 내려가면 이미지 분류에 사용할수도 있는데, 이건 이전에 살펴봣던 이미지 분류 작업과 동일하다고 할수 있으며 카테고리별 스코어를 구하고 소프트맥스 로스로 올바른 카테고리를 구합니다.

 

 

 또 다른 가지로 내려가서 두번째 가지에서는 똑같이 이미지의 벡터 표현 결과가 들어가지만 4개의 출력을 갖는 완전 연결 계층을 가진다. 이 4개의 수는 바운딩 박스의 좌표계값들로 이 값들은 L2같은 회귀 비용을 사용해서 학습할수가 있겠고, 실제 바운딩 박스의 좌표계값과 예측한 바운딩 박스의 좌표계값의 차이로 학습 시킬수가 있다.

 

 이제 문제는 두개의 비용 함수를 사용한다는 점인데, 이렇게 된 이유는 우리가 두 개의 모델이 두개를 예측하도록 하였기 때문인데 하나는 라벨 카테고리와 다른 하나는 바운딩 박스의 위치가 되겠다.  이 두개를 합친 비용함수를 구할수도 있지만 그라디언트 하강을 계산하기 위해선 단일한 스칼라 비용값이 나와야 한다. 하지만 우리는 여러개의 로스를 처리하는 방법을 모르고 있다.

 

  이 문제를 극복하기 위해서 서로 다른 비용들을 가중합하여 최종 비용을 구하면 되겠다. 비용의 가중합을 구하는 이유는 소프트 맥스 비용과 L2 회귀 비용 사이의 중요도를 서로 압도하지 않도록 미세 조정할 필요가 있기 때문이다.  이 다중 비용 함수를 사용하는 아이디어는 하나의 신경망이 여러개를 학습을 해야하는 경우 사용한다.

 

 그래서 하나의 비용 함수뿐만이 아니라 다른 예측할 비용함수를 추가하고 이들을 가중합을 구함으로서 신경망이 다중 출력 결과를 학습할수 있도록 만들수가 있다. 이러한 일반적인 구조를 다중 작업 비용 함수라 부른다. 신경망이 다른 작업들을 한번에 학습할수 있고, 끝에 단일한 비용 함수로 만들어내기 때문이다.

 

  이걸 실제로 쓰기 위해선 이 백본 합성곱 신경망을 이미지넷 분류셋으로 선학습한 후에 네트워크 전체를 다중 비용 위치 추정 문제로 미세조정을 할수가 있겠다. 객체 탐색에 있어서 바보같은 방법인데, 직관적이며 완전 연결신경망을 끝내다가 붙여 박스 좌표계값들을 추정해낸다.  이 상대적으로 간단한 방법은 꽤 잘 동작하지만 이미지에서 하나의 객체만 탐지하는 경우에만 사용 가능하다.

 

 

 하지만 실제 이미지에서는 탐지할 객체가 여러개이므로 일반적인 용도로 사용하는데는 적합하지 않습니다.

 

 일반적인 경우 이미지들은 탐지해야할 다양한 개수의 객체들을 가지고 있습니다. 이 고양이 이미지의 경우 한 객체만 탐지해서 고양이의 바운딩 박스에 대한 4개의 수를 추정해내면 되지만. 중간의 이미지는 3개의 객체를 탐지해야하는데 2 강아지랑 1고양이로 3 x 4 = 12개의 수를 추정해내야되요. (슬라이드는 버그)

 

 맨 아래의 사진에는 귀여운 오리들이 엄마 오리들을 따라가고 있는데 아주 많은 오리들이 있죠. 셀수도 없고 아무튼 아주 많습니다. 하지만 우리가 만든 신경망은 이 모든 오리들을 다 탐지해낼수 있어야 합니다. 이 경우에는 아주 많은 수의 결과를 구해내야 합니다.  그래서 우리 모델이 다양한 개수의 객체들을 출력 해낼수 있는 메커니즘이 필요합니다.

 

 그래서 이걸 할수 있는 상대적으로 쉬운 방법으로 슬라이딩 윈도우를 이용한 객체 탐지 방법이 있습니다. 여기에 개념을 볼수 있는데 합성곱 신경망으로 분류 작업을 할건데, 이 합성곱 신경망은 입력 이미지의 윈도우/서브리전을 분류를 합니다. c개의 카테고리로 분류하는 경우 c + 1개의 출력을 할수가 있는데 여기서 추가되는 1개의 경우는 배경을 의미하며 이미지 탐지 문제를 이미지 분류 문제로 만들기 위함입니다.

 

 이 합성곱 신경망을 이미지의 수많은 영역들에 적용해서 서 강아지인지 고양이인지 혹은 아무것도 없으면 배경으로 분류해냅니다. 이 슬라이딩 윈도우 합성곱 신경망 객체 검출기를 파란색 영역에다가 사용해보면 아무런 객체가 없으니 이 이영역은 배경으로 분류하겠습니다. 

 

 이 영역을 슬라이드시키고, 이 영역은 강아지를 잘 감싸고 있으므로 강아지가 있다고 할수 있겠습니다. 

 

 

 여기에는 강아지가 

 여기에는 고양이가 있다고 할수 있겠죠. 그래서 이런 객체 검출기를가지고 다양한 영역들에 슬라이드 시키기고 각 영역을 합성곱 신경망에 넣어 객체인지 배경인지 알수있겠습니다. 이건 꽤 간단한 방법이지만 문제가 있습니다.

 H x W 크기의 이미지에 바운딩 박스가 몇개가 존재할수 있을까요? 

 바운딩 박스의 크기가 h x w라고 할때, (W - w + 1) * (H - h + 1)개의 가능한 x, y의 위치 경우의 수가 있으며

 

 고정된 크기의 박스가 아니라 모든 가능한 크기를 고려했을때 이와 같은 이차식같은 형태의 가능한 경우의 수들이 존재합니다.

이게 얼마나 나쁘냐면 800 x 600 크기의 이미지가 있으면 ~58M개의 박스가 존재할수 있으며, 집약된 슬라이딩 윈도우 방식은 실제로 사용할수가 없겠습니다. 그래서 다른 객체 검출 방식이 필요해요.

 

 

 영역 제안 이라고 하는 방법이 있습니다. 가능한 모든 영역에 대해서 객체 검출기로 평가할수없다보니, 이미지에서 후부 영역들을 만들어내는 알고리즘을 사용할수 있는데, 후보 영역들은 상대적으로 작은 서브리전이지만 이미지에서 객체를 높은 확률을 가지고 있습니다. 

 

 몇년전에 수 많은 논문에서 이런 후보 영역들을 만들어내는 메커니즘이 소개되었는데 이들을 영역 제안 resion proposal이라고 부릅니다. 이게 어떻게 동작하는지 깊이 들어가지는 않을건데 결국에 이 방식들이 신경망으로 대체되었기 때문입니다. 

 

 이런 초기 영역 제안 방식은 입력 이미지에다가 이미지 프로세싱을 수행했다고 할수 있는데, 이미지에 블롭같은 영역이나 에지 영역이나 다른 로레벨 이미지 프로세싱 기법으로 객체를 높은 확률로 가졌을만한 영역들을 찾아내었습니다.

 

 이런 방법들중에서 가장 유명한것 중하나로 선택적 탐색 selective search가 있습니다.  이 알고리즘은 cpu로도 돌릴수 있는데 이미지당 2000개의 리전을 몇초만에 알려줍니다. 이 2000개의 제안 영역들은 우리가 높은 확률로 있다고 보고 주의를 기울일만한 객체들을 가지고 있어요. 이러한 영역 제안 방법은 심층 신경망을 이용해서 실제 사용가능한 객체 검출기로 직관적으로 학습시킬수가 있습니다.

 

 

 

 매우 유명한 논문으로 RCNN이 있습니다. 여기서 R은 region based를 뜻하며 이 논문은 Region based CNN이라고 부릅니다. 이 논문은 2014년도에 나온 매우 영향력이 컸던 논문이라고 할수 있겠습니다. 하지만 이 방법은 꽤 이해하기 쉽게 동작해요 우리할 일은 일단 이 입력 이미지를

 

 

 선택적 탐색과 같은 영역 제안 방법을 돌리는데, 선택적 탐색법은 2000개의 후보 제안 영역들을 줍니다. 2000개는 많으니 여기선 3개만 표시하겠습니다.

 

 

 각 후보 영역들은 서로 다른 크기나 비를 가지고 있을것이고 각 제안 영역들을 224 x 224의 고정 크기로 변환시키겠습니다. 

 

 각 후보 영역들을 독립적으로 합성곱 신경망에다가 돌리고,

 

 

 

그러면 각 합성곱 신경망은 분류 스코어를 출력하겠습니. 이 c + 1개의 분류 스코어가 이게 배경인지 혹은 배경이 아니고 무엇인지 알려주겠습니다.  여기서 문제가 있는데, 이 선택적 탐색으로 얻은 제안 영역들이 실제로 우리가 탐지하고자 하는것과 일치하지 않을수가 있습니다. 왜냐면 여기서 구하는 전체 바운딩 박스들을 구하는 메커니즘은 블랙박스인 선택적 탐색 방법을 사용하기 때문에 박스를 구하는데 있어서 학습 과정이 존재하지 않습니다.

 

 이 문제를 극복하기 위해서 멀티태스크 비용같은 방법을 사용해서 cnn이 추가 정보를 내도록 변경시켜, 예측한 바운딩 박스가 실제 우리가 원하는 박스를 출력하도록 변환을 추가하겠습니다. 

 

  여기서 짚고 넘어가고 싶은 부분은 바운딩 박스 회귀는 우리가 처음에 얻은게 아니라 입력으로 주어진 제안 영역을 변경시켜 얻은 것입니다. 제안 영역들도 좋긴 하지만 더 물체를 잘 찾아내서 개선할 수 있도록 할것이고, 바운딩 박스는 4개의 수로 모수화 할수 있다보니 구한 바운딩 박스와의 차이(transform/delta)도 4개의 수로 정리할수 있겠습니다.

 

 

 바운딩 박스 변환의 다양한 모수화 방법이 있는데, 가장 흔하게 사용되는건 우측에 있는게 있겠습니다. 제안 영역이 주어지면, 이 제안 영역인 px, py, ph, pw를 가지고 있고, 이걸 4개의 수 tx, ty, th, tw로 변환시키고, 최종 결과 output box는 주어진 제안 영역에다가 변환 값을 반영하여 구하겠습니다. 

 

 여기서 있는 모수값들은 박스 크기에 비례하여 평행이동시키며, 로그 공간상에서 크기 조정을 하겠습니다. 제안 영역의 폭과 높이의 스케일을 조정시킬것인데, cnn에 넣기 전의 입력 영역으로 다시 되돌려 주기 위함입니다. 

 지금까지 본 내용들이 우리가 처음으로본 합성곱 신경망을 이용한 객체 탐지기가 되겠습니다. 이제 테스트 타임의 파이프라인을 살펴보면 이렇게 생겼는데, 싱글 RGB 이미지를 선택적 탐색같은 영역 제안 방법을 돌려서 2000개 정도의 제안 영역들을 구합니다. 

 

 각 제안 영역들을 구하면 고정된 크기로 224 x 224로 변환하고 독립적으로 합성곱 신경망으로 돌려서 카테고리를 구합니다. 거기다가 BBox 변환으로 기존의 제안 영역의 좌표를 고쳐줍시다. 

 

 이제 테스트 타임에는 어플리케이션에 쓸수 있도록 유한개의 셋을 구하면 되겠는데, 여기서 다양한 방법들이 있겠지만 우리가 사용한 어플리케이션에 따라서 고르면 되겠습니다. 여기서 사용해볼수 있는 방법으로 전체 영역들의 예측 스코어로 박스 셋을 구하고 싶을수도 있을텐데 한가지 방법은 이미지당 10개의 객체들을 구하길 원한다면 카테고리가 무엇인지 신경쓰지말고, 백그라운드 스코어로 임계화를하는데 배경 스코어가 가장 낮은 10개를 최종 예측 결과로 사용하면 됩니다.

 

 다른 방법으로 카테고리별 임계치를 설정하는 방법도 있는데 분류신경망은 배경 뿐만이 아니라 전체 카테고리 스코어도 출력을 하기 때문이며, 또 다른 옵션으로 특정한 임계치를 넘는 카테고리의 박스를 최종 결과셋으로 출력해도 되겠습니다.

 

 여기서 사용하는 합성곱 신경망은 모두 같은 가중치를 공유하고 있으며, 제안 영역들에 적용됩니다. 만약 이 합성곱 신경망들이 가중치를 공유하지 않으면 잘 동작하지 않을수가 있는데, 이미지마다 서로 다른 개수의 제안 영역들을 가질수 있고, 이미지당 2000개의 고정된 개수의 제안 영역들을 가진다고해도 개별적으로 다 돌리기 어렵기 때문입니다. 

 

 

 그래서 지금까지 이미지를 입력으로 주고 바운딩 박스 셋을 출력으로 하는 실용적인 알고리즘에 대해서 살펴보았는데, 우리가 구한 박스들이 실제로 우리가 구해야 하는 박스와 비슷한지 다른 사람의 것과 성능이 더 나아졌는지 비교할수 있도록 평가할 필요가 있습니다.

 

 

 

  그걸 하기 위해선 두 바운딩 박스를 비교하는 메커니즘이 필요합니다. 위와 같은 귀여운 강아지 이미지가 있으면 그린 박스는 시스템이 실제 구해야하는 박스고, 우리의 알고리즘이 구한 박스는 블루 박스가 되겠습니다. 그리고 이들을 파란 상자가 녹색 상자랑 잘 맞는지 비교를 할 방법이 필요합니다.

 

 일반적으로 두 바운딩 박스를 비교하기 위해서 사용하는 방법은 Intersection over Union IoU라는 척도가 있습니다. 이걸 다른 상황에서는 jaccard similarity/index라고도 합니다. 하지만 객체 탐지에선 IoU라고 부릅니다. 이 값은 두 바운딩 박스의 비슷한 정도를 나타내는데, 두 박스의 겹치는 부분 intersection(주황)과 두 박스를 합한 영역 union(보라)의 비율로 계산합니다. 

 

 이 예시에서 IoU는 0.54가 되는데 항상 0과 1사이의 값이되며, 두 박스가 완전히 일치하는 경우 이 비율은 1이 되고, 완전히 겹치는 부분이 없으면 0이 되겠습니다. 일반적으로 IoU는 0과 1사이로 두 박스가 더 잘 매치될수록 더 큰 수가 나옵니다. 

 

 IoU가 0.5보다 크다면 그래도 두 바운딩 박스가 잘 매치되고 있구나라고 볼수 있는데, 0.54면 완벽하지는 않지만 객체의 중요한 부분을 잘 찾았다고 볼수 있겠습니ㅏㄷ. 

 

 

0.7은 아주 잘찾은것이며, 약간 에러는 있지만 물체 위치를 잘 추정해내었다고 볼수 있습니다.

 

 

0.9 이상인 경우 거의 완벽하다고 할수 있겠습니다.  iou라는 척도는 두 바운딩 박스를 비교하는 다양한 상황에서 사용하고 있습니다.

 

 

 

 

 

300x250
728x90

 신경망이 무엇을 찾고 있는지 이해하기위해서 우리가 사용해볼수 있는 또 다른 방법으로는 신경망의 가중치가 아닌 신경망의 중간 활성값을 시각화해보는 방법입니다. 이전에 합성곱 신경망을 공부했던걸 떠올려보면, 신경망의 각 계층에서는 활성값을 계산하며 마무리합니다.

 

 한번 알렉스넷의 5번째 합성곱 계층 예를 들면, 여기서 13 x 13 크기의 128채널의 값을 계산하는데, 이는 알렉스넷의 5번째 합성곱 계층에서 128개의 필터가 있고, 각 필터들은 13 x 13 그리드 형태의 값들을 가지게 됩니다. 여기서 우리가 해볼수 있는건 13 x 13 크기의 활성값들을 흑백 이미지로 시각화해볼수 있어요. 

 

 여기서의 개념은 필터의 값이 0에 가깝고, 렐루 함수를 통과시키면, 대부분의 값들이 0이 될겁니다. 하지만 특징 맵이 0이 아니라면, 입력 이미지가 들어오면 서로 다른 합성곱 필터들이 입력 이미지의 어떤 특징에 반응을하는지 이해할수 있습니다.

 

  여기서 진행한 시각화결과를 보면 128개의 합성곱 필터의 활성 결과들을 볼수 있는데, 필려의 출력 중 하나로 녹색 부분을 골라 봅시다. 왼편에 원본 이미지와 아래에 시각화결과가 있어요. 그러면 13 x 13 그리드의 영역들에서 이 필터가 입력 이미지의 사람 얼굴 부분을 따라 활성된것을 볼 수 있습니다. 이는 신경망 한 레이어의 한 필터가 정확하다고 하기는 힘들지만 사람의 얼굴 혹은 사람의 피부톤에 반응한게 되겠습니다.

 

 서로 다른 이미지에 대해서 여러 레이어의 활성 결과들을 이용해서 서로 다른 필터가 무엇에 반응하는지 이해할수 있겠습니다.

 

(질문) 필터들의 활성 결과가 왜 대부분이 검은색일까요?

 

 저의 생각에는 렐루 비선형 함수 때문입니다. 랠루 함수를 다시 떠올려보면 음수 값이 들어오는경우 0이 나오게 되고, 양수만 남게 됩니다. 그렇다보니 많은 값들이 0이 되고, 0이 아닌 부분들은 꽤 중요하다고 볼수 있겠습니다. 또 이건 시각화의 산물이라고도 할수 있는데, 신경망이 0 ~ 무한대의 실수 값을 출력하는데, 시각화할때 0에서 255로 줄여내기 때문입니다. 그래서 출력을 어떻게 줄여나갈지에 따라서 이미지의 전반적인 밝기에 영향을 줄 수 있어요.

 

 임의의 이미지나 임의의 필터를 보는게 아닌 다른 해볼수 있는 방법으로는 최대 활성 패치 Maximally Activating Patches로 이건 신경망에서 최대로 활성화하는 패치를 말합니다. 

 

이전 슬라이드에서 우리는 신경망 한 계층의 이 필터가 얼굴에 반응하는걸 배웠습니다. 그래서 우리가 전체 테스트셋에 대해서 가설 검정을 하고싶을때 우리가 해볼수 있는건, 

 

 

  전체 훈련셋을 가지고 와서, 전체 훈련셋과 테스트셋을 신경망에다가 돌리는데, 레이어와 필터를 골라 그 레이어에서의 필터의 값을 저장합니다. 우리는 이미 합성곱 신경망에서 특징 그리드의 각 원소들은 입력 이미지의 유한한 크기의 패치와 대응되는걸 알고 있어요. 3  x 3 합성곱 계층의 경우 입력 이미지의 3 x 3 크기의 덩어리로 계산하고, 여기다가 3 x 3 합성곱 층을 쌓으면, 입력 이미지의 5 x 5 크기의 부분의 영향을 받아요.

 

 그래서 우리가 해볼건 레이어와 필터를 선택하고, 전체 훈련/테스트셋을 돌려보고, 테스트셋 이미지의 패치중에서 우리가 선택한 필터에 가장 크게 반응하는 패치들을 찾아냅니다. 그리고 이것들을 기록하면됩니다.

 

 오른쪽에 시각화한 결과물들이 있는데, 위의 그리드는 신경망의 한 레이어에 들어온 입력들을 보 여기서 각 행은 그 레이어에 있는 한 필터에 대응하는 것들이며, 한 행의 각 컬럼 요소들은 이미 학습된 신경망의 선택된 레이어와 필터에 아주 아주 크게 반응하는 훈련 이미지의 패치입니다. 

 

 그래서 이들은 신경망에서 선택된 뉴런을 최대로 활성화하는 테스트 셋 이미지들의 패치들이기도해요. 최대 활성 패치를 시각화함으로서 뉴런들이 무엇을 찾는짖 이해할수 있습니다. 예를들면 맨 위에있는 행을보면 강아지의 코처럼 생긴것들이 있는데,  그러면 이건 강아지의 코를 찾는 뉴런이라고 할수 있겠습니다.

 

 위 그리드의 4~6번째 행은 모두 영어 단어나 텍스트 패치로, 이 텍스트들은 전면과 후면이 다른 색상과 다른 방향을 가지고 있어요. 즉, 심층 신경망에서 선택된 이 필터는 서로다른 색상과 방향을 가진 텍스트를 찾는걸 알수 있겠습니다.

 

 아래의 그리드에서도 같으나 더 깊은 레이어에서 동작하는 실험을 해보았습니다. 신경망의 더 깊은 계층에서 실험을 하다보니 각 뉴런의 값은 입력 이미지의 더 큰 패치로 구한다(입력으로 부터 멀수록 수용장은 커지므로). 그래서 심층 레이어에서의 최대 활성 패치는 더 커지게 되겠다.

 

 아래 그리드에서 두번째 행을보면 모든 최대 활성 패치들은 사람 얼굴인데, 이 얼굴들이 다른 피부색상, 다른 위치에 있다. 하지만 깊은 곳에있는 한 뉴런 혹은 한 필터가 학습한 결과 어떻게든 사람 얼굴을 인식하게 되었습니다.

 

 최대 활성 패치 기법으로 신경망의 중간 계층에서 어떻게 인식되는지 이해하기위한 또 다른 방법을 얻을수가 있는데, 신경망이 무엇을 계산하는지 이해히기 위해 해볼수 있는 다른 방법으로 입력 이미지의 어떤 픽셀들이 분류 문제에 중요한것인가를 찾는방법이 있습니다.

 

 여기서 우리가 해보려는건 왼쪽에 코끼리의 이미지가 있고, 이 코끼리 이미지가 학습된 신경망에서 올바르게 코끼리로 분류되었다고 가정합시다.  이제 우리가 알고자하는건 입력 이미지의 어떤 픽셀들이 신경망이 코끼리로 분류하는걸로 결정을 내리는데 중요한가가 되겠습니다.

 

 그래서 우리가 해볼수 있는 방법은 코끼리 이미지를 준비해서 이미지의 일부 픽셀을 회색 사각형이나 혹은 균일한 색상으로 바꾸고, 이 마스크 처리 된 이미지를 신경망에다가 돌려보면 됩니다. 그렇게 하면 신경망이 마스크화된 이미지를 무엇으로 분류하기를 원하는지에 대해 갱신된 스코어를 얻을수가 있습니다.  이 사각 마스크를 다른 위치로 이동시키면서 이 과정을 반복할수 있고, 서로 다른 마스크 이미지들을 신경망에 돌리겠습니다.

 

 

 모든 위치의 경우로 마스크를 이동시키면서 이 과정을 반복하면 각 지점에서 코끼리의 확률을 계산해내고, 이걸 saliency map으로 만들어낼수 있습니다. 이건 어떤 픽셀이 분류에서 중요한지를 알려줘요. 오른쪽에 이 이미지가 있는데, 입력 이미지의 모든 지점에다가 마스크를 넣어보고 마스크된 이미지를 신경망에 돌린 결과를 코끼리일 확률에 대한 히트맵으로 만들었습니다.

 

 여기서 알수 있는점은 코끼리부분에다가 마스크를 한경우 코끼리로 예측할 확률이 떨어지는걸 볼수 있으며, 이는 신경망이 분류 결정을 할때 이미지의 올바른 부분을 보았다고 할수 있겠습니다.

 

 이러한 실험을 다른 두 이미지로 반복해보았습니다. 위의 스쿠너(범선)이미지인데 배가 있는 부분에 마스크를하면 신경망이 스쿠너 클래스로 분류할 확률이 아주 떨어지는걸 볼 수 있고, 하늘에다가 마스크를 한 경우에는 크게 중요하지 않다보니 신경망이 크게 신경쓰지 않으며 여전히 스쿠너로 올바르게 분류할수 있습니다.

 

  이러한 방식은 우리가 신경망이 어떻게 동작하는지 이해하고자 할때, 어떤것들이 중간 특징들을 활성시키는지 보는것대신 입력 이미지를 단순히 변형시키고, 입력이미지의 어떤 부분이 신경망이 올바르게 분류하는데 사용하는지 볼수 있었습니다.

 

 여기서 놀라운 점은 신경망은 이미지의 어떤 부분이 물체인지 혹은 배경인지 알 필요가 없는것이며, 신경망이 단지 모든 스쿠너들이 특정 색상의 물위에 항상 있다면 배를 자체를 보지 않고 물의 색상만을 보고 스쿠너로 분류할수도 있습니다.

 

 만약 우리가 가진 데이터셋이 신경망이 치팅할수 있는것이라면, 신경망이 이미지의 엉뚱한 부분을보고 올바른 정답을 말할수 있는 데이터셋이라면 신경망은 쉽게 치팅하도록 학습을 할 것이고, 이러한 경우 시각화 할 시 신경망이 치팅을 하는지 그렇지 않고 이미지의 올바른 부분을 보고 결정을 하는지를 알수 있겠습니다. 

 

(질의응답) 이건 나쁜 방법.

 saliency map을 마스킹으로 구하는것은 가능한 모든 위치에다가 마스크를 놓고 계산을돌려야하다보니 계산 비용이 아주 큰 문제가 있음.

 

 다른 방법으로 역전파를 이용해서 saliency map을 구할수 있습니다. 입력으로 귀여운 강아지 임지를 준비하고, 신경망으로 돌려 강아지일 확률을 계산하겠습니다.

 그리고 역전파를 하는동안 강아지일 스코어와 입력 픽셀들 사이의 그라디언트를 계산할 수 있는데, 이는 입력 이미지의 모든 픽셀들이 약간 변할때 신경망의 맨끝에서 강아지 분류 스코어에 얼마나 영향을 미치는지 알려준다. 이건 적대적 예시로서 생성하는데 사용할수 있는 이미지의 그라디언트로, 이 예시의 경우 유령같은 그라디언트 이미지를 시각화해서 볼수 있으며, 각 픽셀은 강아지 스코어에 대한 각 픽셀들의 그라디언트가 되겠다. 

 

  이 그림을 보면 강아지의 윤곽선 같은게 보이고, 분류 스코어에 영향을주는 픽셀들은 주로 강아지 안에 있는걸 알수 있겠다. 강아지 밖에 있는 픽셀이 변하더라도 분류 스코어는 크게 변하지는 않겠다. 이런 방법을 통해서 신경망이 이미지의 올바른 부분을 보고있는걸 알수 있다.

 

 강아지 이미지 말고도 다른 이미지에다가도 적용하여 다른 이미지에서 어떤 픽셀들을 신경망이 중요하게보는지에 대한 saliency map을 얻을수도 있습니다. 이 예시들에서 짚고 넘어가고 싶은 부분은 이 논문에서 소개된 이 기술은 대부분의 실제 예시에서는 좋은 결과가 나오지 못하고 있습니다. 그래서 과제를 하면서 생각보다 좋지 못한 결과가 나와서 놀랄수도 있어요.

 

 이건 버그가 있는게 아니라 논문 저자가 예시를 신중하게 골른것이고, 하지만 여전히 신경망이 무엇을 학습하는지 이해하는데 꽤 좋은 방법이라 생각합니다.

 

 saliency map을 잘 동작하도록 하기위한 방법으로 이미지에 있는 물체를 어떠한 지도없이 분리시키는것인데요. 여기에 메뚜기 이미지가 있는데 이걸 신경망에다가 넣고, 신경망은 이미지가 메뚜기로 분류할거에요.

 

 이제 우리가 할일은 입력이미지로부터 메뚜기 이미지 부분 픽셀들을 구하는것인데, 우리가 해볼수 있는 일은 saliency map를 사용해보면 됩니다.  신경망으로 계산하여 saliency map을 구하고, 영상 처리 기술(위 슬라이드에서는 grabcut 사용)을 적용합니다. 그러고 나서 다시 이미지 분류로 학습된 신경망을 객체 카테고리에 해당하는 입력 이미지의 색션으로 분할하는 용도로 사용합니다.

 

 제가 아까 이야기했지만 여기서 고른 예시들은 잘 동작하지만 이 기술은 일반적인 경우에는 잘 동작하지 않을수 있습니다. 하지만 각 픽셀에 대한 그라디언트 정보를 계산하는 이 방법, 이미지에서 픽셀의 변화가 얼마나 최종 스코어에 영향을 주는지 계산하는 것은 신경망이 어떻게 동작하는지 이해하는데 매우 유용하다고 할수 있겠습니다.

 

 

  이번에 살펴볼 방법은 이미지의 픽셀이 최종 클래스 스코어 어떤 영향을 미치는가가 아니라 신경망 안에 있는 중간 특징들이 무엇을 찾고 있는지에 대한 질문으로 되돌아가서 봅시다. 이 질문에 대한 대답으로 우리는 그라디언트 정보를 사용할수가 있어요.

 

 여기에 우리가 해볼수 있는것으로 신경망의 어느 레이어를 선정하고, 어떤 필터를 골라봅시다. 여기서 할일은  훈련 이미지나 테스트 이미지를 신경망에다가 넣어서 돌리면서 역전파를 하겠습니다. 그런 다음에 입력 이미지의 어느 픽셀이 최종 클래스 스코어에 영향을 주었느냐가 아니라 어느 중간 뉴런 값이 영향을 주었느냐를 보겠습니다.

 

 제가 입력 이미지의 픽셀들을 바꾼다면 중간에 있는 뉴런들의 값이 올라갈거나 내려가게 되겠죠. 

 

(질문) saliency map은 훈련전의것인가요? 훈련 후의 것인가요?

 saliency map을 훈련 전에 구해보면 아주 좋지않은 결과가 나옵니다. 합성곱 구조는 계산 과정에 있어서 강한 규제 효과를 가지다보니 학습 전이라해도 saliency map을 구하면, 여러분들이 훈련 전에 시각화하더라도 좋은 결과를 얻기는 힘들고 아마 랜덤한 결과가 나오겠습니다.

 

  그래서 이렇게 그라디언트 정보를 사용해서 중간에 있는 특징이 무엇을 찾는지 이해하는 것과 같은 아이디어를 사용해서, 코끼리 입력 이미지를 신경망에 넣어 중간 레이어까지 돌림으로서 최종 스코어까지 역전파하는게 아니라 이 중간 뉴런의 값에 대한 역전파가 어떤 입력 이미지의 픽셀이 이 중간 출력 뉴런에 가장 영향을 주는지 알려줍니다.

 

   일반적인 역전파 방법으로 구한 중간 특징에 대한 결과가 좋지 않게 나오다보니, 연구자들이 guided back propagation이란 방법을 사용하였습니다. 이게 왜 동작하는지 완전히 이해할수는 없지만 좋은 결과가 나옵니다.

 

 이 guided back propagation이라는 개념은 우리가 알다시피 순전파를 할때 0이하의 값은 모두 0으로 설정되고, relu를 역전파로 통과 시 순전파 때 0이 되었던 위치들이 마스크처럼 적용되서 업스트림 그라디언트로부터 온 값들이 0이 됩니다. 업스트림 그라디언트에 (0마스크를) 적용한게 relu함수의 일반적인 역전파가 되겠습니다.

 

 이번에는 guided backpropagation에서는 relu 함수를 역전파로 통과시에 거기다가 음수의 업스트림 그라디언트에다가도 마스크처리를 합니다. 다시말하면 relu 함수를 역전파할때 해당하는 모든 업스트림 그라디언트의 값은 0이 되고, 거기다가 음수인 업스트림 그라디언트도 0이 되요. 즉, 추가적인 마스킹으로 모든 음의 업스트림 그라디언트도 제거하는게 되겠습니다. 저도 이런 방식으로 이미지를 시각화하는데 역전파를 사용할때 더 좋은 결과가 나오는지 모르겠습니다.

 

 아무튼 이런 guided back propagation을 이미지에 적용하면, 뉴런 값에 변화를 주는 이미지의 픽셀들을 잡아낼수 있다. 왼쪽 그림이 최대 활성 패치들이면, 우측에 있는 것들이 guided back propagation을 적용해서 이 패치의 어떤 픽셀들이 뉴런에 영향을 주는지 찾아낸 결과이다. 맨 윗 행의 결과들을 보면 이 뉴런들이 강아지의 코나 눈을 찾고 있는걸 알수 있고, guided backpropagation의 결과를 보면 이러한 것들이 뉴런 값에 큰 영향을 주는걸 확인할 수 있다. 

 더 깊은 신경망 레이어의 최대 활성 패치들을 구해서 또 적용시켜보면 비슷한 결과를 얻을수가 있다. 이전에 사람 얼굴을 찾았던 뉴런을 봤었는데, 사람 얼굴의 픽셀을 위주로 보는것을 확인할수 있다. 이 방법은 테스트셋의 이미지나 패치에 한정해서 본 것이고 더 나아가서 

 

 guided back propagation으로 테스트셋 이미지에다가 이미지의 어떤 픽셀이 뉴런 값에 영향을 주는지 찾아내었는데, 테스트 이미지셋만 보지말고 모든 가능한 이미지들 중에서 어떤게 이미지가 최대로 뉴런 값을 찾아내는지 볼수 있습니다. 그래서 뉴런의 값을 최대화 시키는 syntetic image를 생성해보겠습니다.

 

 이걸 이미지 픽셀들에 대해서 경사 상승으로 만들어 낼 수가 있는데, 위 슬라이드의  I*가 특정 뉴런을 최대화 시키도록 생성한 이미지이고, f(I)는 이미지가 주어질때 특정 뉴런의 값, R(I)는 생성한 이미지가 자연스럽게 하기 위한 규제자가 됩니다. 이 식은 신경망 가중치를 학습할때 본것과 비슷한데, 여기서 하고자 하는건 가중치를 갱신하는게 아니라 중간에 있는 특징 중 하나를 최대로 활성 시키는 이미지를 구하는게 되겠습니다. 이 이미지는 경사 상승 알고리즘을 통해서 구할수 있는데 이미지를 그라디언트 정보로 조금씩 바꿔가면 되요.

 

 이걸 하기 위해서 우선 0이미지나 랜덤 노이즈로 초기화하고, 이 이미지를 신경망에다가 돌린뒤 선택한 뉴런의 값을 구합니다. 그리고 역전파를 통해서 이미지의 어떤 픽셀들이 뉴런값을 변화시키는지 찾아내요. 이미지를 약간 갱신시키고, 이 과정을 반복함으러서 선택한 뉴런이 큰값을 갖도록 영향을 주는 인공 이미지가 만들어집니다.

 

 

 

 

300x250
728x90

 이번 14번째 강의에서는 합성곱 신경망 내부에서 시각화 하는 기술에 대해서 살펴보고, 이것들을 이해하여봅시다. 이번 강의 제목은 약간 의미가 잘못된 부분이 있는데, 오늘 다루고자 하는 두 주제는 하나는 신경망 안을 드려다 보는 기술로 데이터가 어떻게 학습되는지를 이해하는 것이고, 두 번째로는 신경망을 시각화하고 이해하는 다양한 기술들인 deep dream과 style transfer에 대해서 살펴보겠다.

 

 

 지난 강의에서는 어텐션에 대해서 다뤄보면셔, 어떻게 어텐션 메커니즘이 순환 신경망 모델에다가 추가시켜 매 타임스탭마다 입력의 다른 부분에 집중을 시키는지와 어텐션이라는 개념을 신경망 모델에서 레이어로 사용할수 있도록 일반화 시켜보았다. 그리고 새로운 레이어로 셀프 어텐션 레이어를 만들고, 이걸 트랜스포머라고 부르는 새 신경망 모델을 만드는데 사용하였다. 이 모델은 입력을 처리하는데 어텐션만 사용한다.

 

 우리는 그 동안 다양한 종류의 데이터들을 처리하는 신경망 모델을 만드는 방법에 대해서 배워왔습니다. 그래서 이미지를 처리하는 합성곱 신경망 모델을 어떻게 만드는지 알고있고, 순환 신경망 모델로 시퀀스를 처리할수 있는데다가 트랜스포머로 시퀀스나 데이터셋을 처리할수 있겠습니다.

 

 수업끝나고 많은 학생들이 물어보거나 이번 강의 내내, 시각 인식 작업에서 신경망 모델이 무엇을 학습했다고 우리가 어떻게 말할수 있는지에 대한 질문이 자주 있습니다. 이런 커다란 합성곱 신경망이 있고, 이 모델을 큰 데이터셋으로 학습시키면, 신경망 내부에 있는 특징들을 무엇을 찾고 있을까요?

 

 우리가 신경망 내부를 들여다보고, 서로다른 특징들이 서로다른 레이어들이 보고 있는 것을 얻어낸다면, 신경망 모델이 어떻게 실패하게 되는지 아니면 어떻게 동작하는지 아니면 어떡게 동작이 안되는지에 대해서 이해할수 있을거에요. 그래서 우린 사람들이 이런 깊은 신경망의 안을 들여다보기위해서 사용하는 방법들에 대해서 다뤄보고, 모델 내부에서 어떻게 돌아가는지 이해해봅시다.

 

 우선 말하자면 이들은 경험적으로 찾아낸 방법같은 것이지 내부에서 어떻게 돌아가는지 알아내는 아주 좋은 이론적인 방법은 아직 없습니다. 하지만 경험을 통해서 얻은 여러가지 방법들로 레이어가 어떻게 반응하는지에 대해 더 알수 있겠습니다.

 

 그런 방법들 중 하나는 신경망의 첫번째 레이어를 시각화하는 것입니다. 선형 분류기를 다시 떠올려보면, 선형 분류기는 각 클래스당 한 탬플릿으로 탬플릿들의 집합을 학습하는 개념이었는데, 선형 분류기로 각 클래스당 스코어 계산을 템플릿과 입력 이미지의 내적으로 간편하게 구하였습니다.

 

 이를 일반화 시키고, 신경망 그러니까 합성곱 신경망에다가 적용시켰습니다. (선형 분류기를 합성곱 신경망에다가 적용시킨) 이 개념이 순방향 연산과정에서 하는 템플릿 매칭입니다. 그래서 합성곱 신경망의 가장 첫번째 레이어에서는 여러 필터들을 학습시키는데, 이 필터들은 입력 이미지를 쭉 슬라이팅 시켜서 학습합니다. 필터는 입력 이미지의 모든 지점과 학습된 필터의 각 지점을 같이 내적 연산을 합니다.

 

 이 탬플릿 매칭 개념으로 학습하고 나면, 합성곱 신경망의 첫번째 레이어의 필터들을 rgb 이미지처럼 시각화함으로서 시각화를 할수있겠습니다. 이미지와 필터를 내적한다는 개념으로 필터를 이미지 처럼 시각화 할때, 그 필터를 시각화한 이미지는 그 필터랑 가장 강한 반응을 하겠습니다. 그래서 이런 필터들을 시각화해서, 신경망의 첫번째 레이어가 어떤 것을 찾는지 어느정도 이해할수 있겠습니다.

 

 지금 보는 슬라이드에서는 이미지분류를 위한 이미지넷 데이터셋으로 네 합성곱 신경망 모델을 선 학습 한 것에서 첫번째 합성곱 필터를 시각화 한 결과를 볼수 있겠습니다. 여기서 알아차릴수 있는 부분은 이런 신경망 아키텍처들이, 알렉스넷, resnet, densenet로 아키텍처는 꽤 다르지만, 첫번째 레이어에서 학습한 필터들은 아주 비슷하게 생긴걸 볼수 있습니다.

 

 또, 이런 필터들을 보면, 다른 방향의 에지를 찾는 에지 방향 필터도 있고, 반대되는 색상을 가지는 필터도 많이 있는걸 볼수 있습니다. 한번 이전에 봤던 humble and weasel의 포유류 시각 시스템 실험을 떠올려보면, 포유류의 시각 시스템은 시각장에서 우리가 보고 있는것에 대한 방향 에지를 찾는 셀을 가지고 있는데, 이는 합성곱 신경망 첫번째 레이어가 학습한 필터들과 비슷하다고 볼수 있고, 그래서 합성곱 신경망의 첫번째 레이어는 여러 종류의 방향 에지나 여러 종류의 색상들을 찾아내는거라고 이해할수 있겠습니다. 

 

 이 기법을 합성곱 신경망의 높은 레이어에다가 적용해도 되겠습니다. 하지만 정보가 그렇게 많진 않아요. 이 슬라이드를 보면 cfar 분류 데이터셋을 학습한 3층 합성곱 신경망의 가중치를 그냥 시각화 한걸 볼수 있는데, 첫번째 레이어를 시각화하면 이전 슬라이드에서 봤던게 나오지만 나머지 두 레이어를 시각화를 한 결과 이미지 여러 덩어리들이 나오게 됩니다.

 

 이는 이 작은 신경망 모델의 첫번째 레이어가 7 x 7 크기의 필터 16개를 가진다고하면, 두번째 레이어는 16개의 채널을 입력으로받아 20개의 필터로 만들다보니 출력한 20개의 합성곱 필터들은 16개의 입력 필터로 부터 구하지만, 16채널의 이미지는 채널수 때문에 RGB 이미지로 시각화하는데 좋지는 않아요.

 

 그래서 대신 출력된 각 20개의 필터 각각의 16개 필터들은 7 x 7 크기의 흑백 이미지로 시각화 시킬수 있습니다. 슬라이드에서 처럼 보기에는 불편할수 있지만 조금 더 고차원 합성곱 필터에서 공간적 구조를 조금 더 볼수 있겠습니다. 여기서 블롭 패턴이나 에지같은걸 찾을수도 있지만 RGB공간 상에서는 더이상 에지나 블롭을 찾을수는 없고, 이건 이전 합성곱 레이어로부터 생성된 특징 공간 상에서 블롭과 에지를 찾는 과정이라 할수 있겠습니다.

 

 이런 시각화 방법을 이용해서 고차 합성곱 필터가 어떻게 돌아가고 있는지 볼수는 있겠으나 이 필터들이 무엇을 찾는중인지 명확하게 이해하기는 어렵겠습니다. 그래서 합성곱 신경망의 다른 레이어에서 어떻게 되어가고 있는지 이해하려면 다른 방법들을 사용해야 해요.

 

 신경망을 이해하기위한 다른 방법중 하나는 중간 합성곱 레이어들을 무시하고, 마지막 완전 연결 계층에서 어떤 일이 일어나는지 살펴보는 방법이 있습니다. 알렉스넷을 떠올려보면, FC7 layer는 4096개의 특징들을 가지고 있어 이걸로 마지막 선형 변환을 해서 이미지넷 데이터셋에대한 1000개의 클래스들의 스코어를 구할수가 있습니다.

 

 여기서 우리가 해볼수 있는 일은 4096차원의 벡터로 표현되는걸서  이해하려고 하면되는데, 우리는 이미 학습된 알렉스넷이 어떤일을 하는지 알아내기 위한 방법은 입력 이미지를 4096차원의 벡터로 바꾸고, 선형 분류기를 적용하면 되는걸 알고있으니 이 과정에서 시각화를 통해 4096벡터에서 어떤 일이 일어나는지 이해할수 있겠습니다.

 

 그래서 정리하자면 훈련된 알렉스넷 모델 같은걸 준비해서, 이미지 테스트셋을 돌려 각 이미지에 대한 특징 벡터들을 계산하고 모은 다음에 다양한 기법들로 시각화 해볼수 있어요.

 

 

 우리가 해볼수 있는 간단한 방법으로 4096차원의 벡터에다가 최근접이웃을 적용해보는게 있습니다. 이전에 했던 두번째 과제에서 로 픽셀 데이터에 최근접 이웃 탐색을 사용했었는데, 왼쪽 그림이 픽셀 값을 이용한 최근점 탐색을한 예시에요. 그러면 실제 비슷한 클래스나 의미를 가진 무언가를 찾기 보다는 비슷한 픽셀들을 가진 이미지를 찾아냅니다.

 

  이번에는 이미지의 로 픽셀에다가 최근접 이웃을 적용하는게 아니라 알렉스넷으로 구한 4096차원의 벡터로 최근점 이웃 탐색을 하는것인데, 이 특징 공간에서 가장 가까운 이미지가 무엇인지 찾아낼수가 있어요. 중간에 있는 그림들이 이 최종 차원 벡터에다가 최근접 이웃으로 찾아낸 이미지 예시들입니다.

 

 이 예시의 두번째 줄에서 코끼리를 최근접 이웃 방법으로 구한 이미지들을 볼수 있어요. 하지만 탐색된 코끼리 이미지의 픽셀들은 매우 다를수 있어요. 왼쪽 면에 있는 코끼리 이미지를 사용해서 검색을 사용해보면, 이 이미지는 왼쪽에 회색 블롭 같은 형태를 가지고

 

...

 

(질문) 최근접 이웃을 이용해 어떻게 이미지를 탐색합니까?

 

 쿼리 이미지를 이미 학습된 알렉스 넷 분류기에 넣어서 4096차원의 벡터를 추출시키는데, 전체 테스트셋에 대해서 이 벡터들을 구한다음, 이 특징 벡터들을 L2 거리를 이용한 최근접 이웃 방법으로 탐색을 수행합니다. 이전에 본 방법들은 이 방법을 쓴건 아니지만 이렇게 구한 특징 공간으로 어떤 이미지인지 알수 있었습니다.

 

 

 

  특징 공간 상에서 어떤 일이 일어나는지 파악하기 위한 또 다른 방법으로 차원 축소 Dimensionality Reduction 알고리즘을 사용할수 있습니다. 여러분들이 알다시피 4096차원 벡터는 상당히 큰 차원이다보니 우리는 3차원 공간에서 살고있어 사람으로서 4096차원 특징 공간을 이해하기는 어렵겠습니다.

 

 우리가 해볼수 있는건 어떤 차원 축소 알고리즘을 사용해서 4096차원의 벡터를 우리가 이해할수 있는 2 혹은 3차원으로 축소시킬수가 있습니다. 다른 머신러닝 수업에서 봤을수도 있는데, 가장 간단한 알고리즘으로 주성분 분석 Principal Component Analysis가 있습니다. 이 방법은 선형 차원 축소 알고리즘으로 고차 특징 공간의 구조를 보존하길 원할때, 이 고차 벡터를 2차원으로 선형적으로 사영하는 차원 축소 알고리즘이라 할수 있습니다. 여러분이 차원 축소 알고리즘을 훈련 혹은 테스트셋으로 구한 4096차원의 벡터에 적용해서 2차원 공간 상에서 벡터를 시각화 할수 있습니디.

 

 딥러닝 논문에서 자주 나오는 유명한 차원 축소 알고리즘으로 t-SNE가 있습니다. 이 방법은 확률적으로 t분포를 따르는 이웃 임베딩을 구하는데(?) 자세한 사항은 넘어가고, 비선형 차원 축소 알고리즘으로 고차원의 벡터 집합을 입력으로 받아 가능한 기존의 구조를 유지하면서 2차원으로 사영시킵니다. 

 

 (중앙에 있는)이 시각화 결과는 10개의 mnist 숫자를 인식하도록 CNN 분류기를 학습했고, 분류기의 마지막 완전 연결 계층로부터 테스트셋 전체 이미지를 돌려 벡터들을 얻었습니다. 이 벡터는 4096차원인데, 테스트셋 각 이미지의 이 벡터를 t-sne 차원 축소 알고리즘을 적용해서 고차원의 임베딩 공간의 것을 2차원으로 축소시켜 테스트셋을 2차원 공간의 한 점으로 사영시켜 시각화하였습니다.

 

 다시 정리하면 이미지로부터 벡터를 계산한후 차원 축소 알고리즘으로 2차원 공간상에서의 위치를 구하였고, 이 그림에 있는 모든 각 점들은 2차원 공간에서의 숫자들의 위치이며, CNN이 학습한 전반적인 구조를 시각화 한 결과가 되겠습니다.

 

 여기서 놀라운 점은 10개의 숫자를 분류하였는데, 이 특징 공간 상에서 클러스터가 10개의 숫자에 맞게 10개로 나눠지는 경향이 나타납니다. 신경망을 학습시켜 얻은 특징 공간은 클래스를 인코딩 한것이지, 로 픽셀값이 아닙니다. 

 

  이런 비슷한 알고리즘을 숫자 인식 문제 말고 이미지 분류 문제에서도 적용할수 있습니다. 이미 비슷한 일들을 이미 해왔는데, 우선 이미지넷을 학습한 알렉스넷을 가지고와서, 테스트셋의 각 이미지의 4096차원 벡터를 추출해 냅시다. 그 다음 차원 축소 알고리즘을 적용하여 4096차원에서 2차원으로 가능한 구조를 보존하면서 줄입니다. 그러면 2차원 공간 상의 모든 점으로 사영되고, 이 2차원 공간상 점의 위치에다가 이미지를 시각화해봅시다.

 

 온라인에서 고해상도 버전도 볼수 있습니다. 일단 왼편의 것을 보면 이 이미지를 확대해보면 시멘틱 카테고리에따라 서로 다른영역들을 볼수 있습니다. 왼쪽이미지의 왼쪽 아래 코너를 확대해서 보면 여러가지 꽃을 볼수 있고, 오른쪽으로 평행하게 이동하면 강아지들이 있고, 오른쪽 위 코너로가면 파랗고 하얀것들을 볼수 있는데, 여기에는 배나 하늘 이미지 같은것들이 나옵니다.

 

  이런 시각화 방법으로 신경망이 어떻게 학습하였는지 이 공간상에서 시각적으로 볼수 있겠고, 학습된 특징 공간 상에서 어떤 종류의 이미지들이 서로서로 가까운지 볼수 있었습니다.

 

 이 방법을 해본 덕분에 신경망의 마지막 계층으로부터 벡터를 추출하고, 다른 종류의 연산을 해보는 방법을 고려해볼수도 있겠고, 신경망의 마지막 계층이 학습해낸 특징 공간을 다른 방법으로도 이해할수 있겠습니다.

 

 

 

 

300x250
728x90

 이렇게 하기 위해서는 트랜스포머라고 부르는 새로운 종류의 블록을 만들면 됩니다. 이 트랜스 포머 블록에서 셀프 어텐션을 사용하는데, 동작하는 과정을 보자면 우선 입력 시퀀스로 벡터 x1에서 x4까지 받습니다.

 

 이 전체 벡터에 대해 멀티 해드 셀프 어텐션을 동작시키고, 셀프 어텐션 연산 후에 각 출력은 각 입력과 시퀀스의 다른 원소들 사이의 상호작용으로 구해지게 됩니다. 

 

 셀프 어텐션 후에는 잔류 커낵션/스킵 커낵션을 시키고,

 

 그 뒤에는 레이어 정규화 층을 추가하겠습니다. 이 방법은 심층 신경망에서 정규화 하는 기법 중 하나로 최저과 과정을 도우며, 합성곱 신경망에서는 주로 배치 정규화가 사용되고, 시퀀스 모델의 경우 레이어 정규화가 유용하게 사용됩니다.

 

 레이어 정규화에 대해서 흥미로운 점은 셀프 어텐션의 출력으로 벡터들의 집합이 만들어지는데, 레이어 정규화는 벡터들 사이에 상호작용이나 어떤 연산없이, 셀프 어텐션의 출력 벡터들이 각각 독립적으로 정규화가 되어 벡터들간의 어떤 작용이 존재하지가 않습니다.

 

 레이어 정규화를 한 후에는 순방향으로 다층 퍼샙트론 연산을 하겠습니다. 다른 말로 완전 연결 신경망이라고도 부르는데, 레이어 정규화의 출력은 벡터들의 집합으로 이들을 완전 연결 신경망에 전달하여, 이들을 각 시퀀스별로 독립적으로 연산하겠습니다.

 

 그 다음에는 다층 퍼샙트론 연산들에 대해서 별도의 잔류 커낵션을 추가하고,

 

 

 또 다른 레이어 정규화 계층을 추가 하겠습니다.

 

 

 이들을 한 블록에다가 모은걸 트랜스포머 블록이라 합니다. 이 블록은  벡터 시퀀스를 처리하는 큰 규모의 모델을 만드는데 사용할수 있겠습니다.

 

 이 트랜스포머 블록의 입력으로 벡터 x의 집합이고, 출력은 벡터 y들의 집합으로 입력 벡터와 개수와 출력 백터의 개수는 동일합니다. 하지만 출력 벡터는 다른 차원수를 가질거에요. 이러한 벡터의 차원은 모델 내부에서 바꿀수 있겠습니다.

 

  이 셀프 어텐션/트랜스포머 블록의 흥미로운점은 셀프 어텐션 부분에서만 벡터들간의 상호작용이 일어난다는 점인데, 레이어 정규화와 다층 퍼샙트론에서는 각 벡터들이 독립적으로 연산되기 때문입니다. 이 블록의 이러한 장점 덕분에 트랜스포머 블록은 매우 병렬화 하기 좋고, GPU 하드웨어에서 다루기가 좋아 학습하기에 매우 좋습니다.

 

 그러면 이제 트렌스포머 블록의 시퀀스로 사용해서 트랜스 포머 블록을 만들어봅시다. 트랜스포머 모델을 만들려면 하이퍼 파라미터들을 선전하여야 합니다.

 

 하나는 모델의 깊이로 블록의 갯수인데, "Attention is all you need" 논문에 있었던 블록의 개수는 12개를 사용하였고, 각 플록의 쿼리 차원을 512차원으로 지정하였고, 6개의 멀티 해드 어텐션 레이어를 사용하였습니다. 여기서 멀티 해드 어텐션은 셀프 어텐션 연산에서 수행되요.

 

 이 트랜스포머 아키텍처를 "Imagenet moment for natural language procesing"이라고 부르며, 자연어 처리에서 매우 유용하게 사용되고 있습니다. 여러분도 알다시피 컴퓨터 비전에서 이미지냇으로 선학습 시키고, 특정 작업 용도로 미세 조정하는게 흔하다 시피, 트렌스포머 모델도 수 많은 시퀀스 예측이나 자연어 작업에서 비슷한 효과를 보입니다.

 

 지금 보는 이 내용들은 아주 최근 연구 결과들로, 작년에 있었던 논문에서는 아주 큰 트랜스포머 모델을 인터넷에서 아주 많은 양의 텍스트를 다운받아 다음에 올 단어를 예측하거나 다른 자연어 처리 모델 동작을 할수 있도록 선학습을 시킬수 있고, 기계 번역이나 언어 모델링 혹은 언어 생성이나 질의응답 등 어떤 작업을 하던간에 자연어 처리와 관련된 어느 작업이든 미세조정을 할수 있습니다.

 

 몇 강의 전에 이미지넷 대회에서 이런 전이학습 트랜드가 나타났던처럼 작년(이 강의 발표 기준 2018년같음)부터 트렌스포머 모델을 이용해서 비슷한일이 벌어지고 있습니다.

 

 최근 큰 인공지능 연구소에서 훨씬 큰 트랜스 포머 모델을 만들려고 연구중이며, 기본적인 모델로 2017년 "attention all you need" 어텐션 논문에 나온 transformer base과 transfomer large 모델이 있습니다. large 모델은 213만개 학습가능한 파라미터를 가지고 있어, 8개의 GPU로 학습하는데 3.5일이 걸렸다고 합니다.

 

 다음 논문은 BERT라고 하는 모델로 선학습하고, 미세조정 과정을 거친 모델로 340백만개의 학습가능한 파라미터를 가지며 더 커지고, 13GB의 텍스트로 학습하였습니다. 텍스트 자체는 작지만, 13GB의 텍스트는 아주 큰 데이터이고, 논문에서 훈련 시간이나 하드웨어를 설명을 찾을수가 없었습니다.

 

 구글의 다른 그룹과 페이스 북에서 만든 모델로 XLNet-Large와 RoBERTa가 있는데, 이 모델들은 100GB 이상의 데이터를 학습하였으나 빠르게 학습하였습니다. 구글의 모델은 512TPU 디바이스-v3로 2.5일간 학습하였고, 페이스북의 모델은 1024개의 GPU로 하루를 학습시켰습니다.

 

 Open AI에서 그동안의 한계를 뛰어넘은 모델을 발표했는데, 자체 생성한 40GB 텍스트로 15억개의 학습한 파라미터를 가진 트랜스포머 모델을 학습하였습니다. 모델 자체는 동일하나, 다른 부분은 더 많은 레이어와 각 셀프 어텐션 레이어에서 더 많은 쿼리 차원을 가지고, 더 많은 셀프 어텐션 레이어를 사용한다는 점입니다. 모델 자체는 근본적으로 동일하고, Open AI에서 가지고 있는 이 모델을 GPT2라고 합니다.

 

 

300x250
728x90

 

 셀프 어텐션 레이어는 신경망에서 사용할수 있는 새로운 종류의 레이어로, 셀프 어텐션 레이어를 사용한 합성곱 신경망을 만든 예시를 살펴보자.

 

 이 합성곱 신경망은 귀여운 고양이 이미지를 입력으로 받아 합성곱 레이어들의 출력으로 어떤 벡터의 그리드 c x h x w, 가로 h, 세로 w, 채널 수가 c인 출력을 만들어낸다. 

 

 그러면 이제 세개의 1 x 1 합성곱 연산을해서 특징 그리드들을 쿼리들의 그리드, 키의 그리드, 값의 그리드들로 변환하자. 각 1 x 1 합성곱 연산들은 학습 과정으로 얻은 고유의 가중치와 편향값을 가지고 있어, 병렬로 분할시킨다.

 

 이제 쿼리와 키를 내적 한 뒤 소프트 맥스 함수를 적용하여 어텐션 가중치를 구할건데, 이 결과는 입력 이미지에서 한 지점이 주어질때 이에 대해 다른 모든 지점들은 얼마나 주의를 기울여야 하는 정도를 나타낸다. 그렇다보니 크기가 (h x w) x (h x w)의 아주 큰 어텐션 가중치 행렬이 만들어진다.

 

 이 어텐션 가중치를 값 벡터들과 선형 결합을 시키겠다. 이 선형 결합으로 새로운 특징 벡터의 그리드를 만들어 내고, 그 출력 그리드의 모든 위치들은 입력 그리드의 모든 위치에의해 정해진다/영향을 받겠다. 이 과정은 기존의 합성곱과 상당히 다른 연산과정이라 할수 있겠다.

 

 실제 사용시에 종종 사람들은 이 어텐션 연산을 마친 후에 추가적인 1 x 1 합성곱 연산을 하기도 하고, 

 

이 셀프 어텐션 연산 전체 주위로 잔류 연결/스킵 커넥션을 추가하는 경우도 많습니다. 그래서 이런 요소들을 한데 합쳐서 새로운 셀프 어텐션 모듈을 만들어서 신경망에다가 넣어서 사용할수 있고, 이렇게 만든 신경망은 합성곱 연산 뿐만 아니라 더 셀프 어텐션을 할수 있겠습니다.

 

  여기서 기본적으로 다뤄보면 좋은 것으로 신경망에서 벡터의 시퀀스를 처리하는데 사용할수 있는 방법으로 3가지가 있습니다. 가장 흔한 방법은 이전 강의에서 다루었던 순환 신경망이 있는데, 입력 벡터들의 시퀀스 x가 주어지면, 출력 벡터 y의 시퀀스를 만들어 내었습니다.

 

 LSTM과 같은 순환 신경망을 사용할때 좋은점은 아주 긴 시퀀스를 다루는데 좋은것으로, 아주 긴 시퀀스에서도 정보를 잘 전달할수 있습니다. 특히 RNN 레이어의 최종 출력 혹은 최종 은닉 상태 y_t는 전체 입력 시퀀스로 구하게 되요. 단일 rnn 레이어는 전체 입력 시퀀스를 요약한 것이라고 볼수 있겠습니다.

 

 하지만 RNN은 몇가지 문제점을 가지고 있는데, 이들을 은닉 상태 1을 계산한다음 2를 계산하고, 3을 계산하고, 4를 계산하는 데이터에 순차적으로 의존적이라 병렬화 시키기가 어렵습니다.

 

 이전에 gpu 강의를 다시 떠올려보면, 아주 큰 신경망을 만들때 GPU의 방대한 병렬 연산의 이점을 가질수면 좋겠지만 RNN은 그런 하드웨어로 병렬 연산을 하는데 좋지 않아 큰 RNN 모델을 만드는데 문제가 있습니다. 

 

 또 다른 시퀀스를 처리하는 방법으로 일차원 합성곱 연산이 있습니다. 일차원 합성곱 연산을 입력 시퀀스에 대해서 슬라이드 시켜, 출력 시퀀스의 각 지점들은 입력 시퀀스의 세 이웃으로 구할수 있겠습니다.

 

 컨볼루션을 이용하여 시퀀스를 처리하는 신경망의 경우, RNN이 순차 의존성을 가지넋과는 달리 시퀀스의 각 출력 원소들이 독립적으로 계산되다보니 매우 병렬화하기 좋은 점을 가지고 있습니다. 

 

 하지만 합성곱 연산을 이용한경우 단점은 매우 긴 시퀀스를 잘 처리하지 못한다는 점인데, 출력을 전체 시퀀스로 구하고자 하는경우, 단일 합성곱 레이어로는 구할수 없으며 시퀀스의 모든 지점을 보기 위해서 아주 많은 레이어를 쌓아야 합니다. 그런 이유로 합성곱으로 시퀀스를 처리하기는 어려우나, 병렬화하기 좋다는 장점이 있습니다.

 

 이번에 다뤄볼 방법으로 셀프 어텐션이 있습니다. 이 방법은 앞서 본 결점들을 극복한 시퀀스나 벡터의 집합을 처리할수 있는 새로운 메커니즘으로, 셀프 어텐션은 주어진 벡터의 집합으로 각 벡터와 다른 모든 벡터들을 비교하다보니 긴 시퀀스를 잘 처리할수 있습니다. RNN과 비슷하게 단일 셀프 어텐션 레이어는 각 출력들은 각 입력에 영향을 받겠습니다.

 

 뿐만아니라 셀프 어텐션은 합성곱 연산과 같이 매우 병렬화 하기 좋다는 장점을 가지고 있습니다. 몇  슬라이드 전에 본 셀프 어텐션 구현 과정을 보면, 셀프 어텐션은 크지만 몇개의 행렬 곱 연산에다가 소프트 맥스 같은게 추가되다보니 아주아주 병렬화 하기가 좋으며, GPU에서 연산시키기에 적합하다고 할수 있겠습니다.

 

 셀프 어텐션은 합성곱과 순환 신경망의 단점을 극복하여 시퀀스나 집합을 처리할수있는 대안 메커니즘으로 사용되고 있습니다. 하지만 단점으로는 아주 많은 메모리 공간을 사용한다는 점이나 시간이 갈수록 GPU 메모리 공간이 더 커지고 있으므로 이런 문제는 무시해도 되겠습니다.

 

  여러분들이 신경망으로 시퀀스를 처리하다가 어떤 문제를 만날떄, rnn, 컨볼루션, 셀프 어텐션중에서 어떤걸 사용하느게 좋을까요? 몇년 전에 있었던 한 유명한 논문으로 "Attention is all you need"가 있으며, 셀프 어텐션 만으로도 시퀀스를 처리하는 신경망을 만들수가 있겠습니다.

 

300x250
728x90

 

 

 이번에 다뤄볼 것은 어텐션 레이어의 특별한 케이스로 셀프 어텐션 계층이 있습니다. 셀프 어텐션 계층은 입력 벡터 집합 하나만을 사용하는 것인데, 우리가 할일은 각각의 입력 벡터 셋에 있는 각각의 입력 벡터를 다른 입력 벡터와 비교하겠습니다. 이걸 위해서 우리가 할 작업은 또 다른 학습 가능한 가중치 행렬을 추가하는것인데,

 

 쿼리 벡터들을 입력으로 사용하는것이아니라, 쿼리 벡터들을 입력 벡터들을 변환시켜 추정해냅니다. 그다음에는 이전에 본것과 동일하게 동작합니다. 이 과정이 어떻게 동작하는지 그림으로 보자면 오른쪽에 입력 벡터 x1, x2, x3의 집합을 입력으로 받습니다.

 

 이번에는 각 입력 벡터를 쿼리 행렬과 곱하여 쿼리 벡터로 변환시키겠습니다.

 

 

 그러고나서 비슷하게 입력 벡터를 키 행렬을 사용해서 키 벡터로 바꾸고,

 

 각 키 벡터와 각 쿼리 벡터 사이의 배정 스코어를 계산할수가 있겠습니다. 이 배정 스코어는 입력 시퀀스 x의 각 입력끼리의 쌍간의 유사도라고 할수 있겠습니다.

 

 이제 이전과 똑같이 소프트맥스 함수를 사용해서 각 컬럼방향으로 확률 분포를 구해내고,

 

 

 입력 벡터들을 값 벡터로 변환시키겠습니다.

 

 그러고나서 값 벡터와 가중화된 유사도를 구하고, 출력 벡터 y 집합을 만들어내겠습니다. 이 과정이 전반적인 메커니즘이라고 할수 있겠습니다.

 

 지금까지 한것들 전체가 새로운 종류의 신경망 레이어라고 할수 있는데, 벡터 집합을 입력으로 받아 벡터 집합을 출력하는데다가, 내부적으로 하는 일은 입력에서의 한 벡터를 다른 각 벡터들과 비교하게되며 신경망은 스스로 어떤 비선형 함수를 사용할지 결정합니다.

 

 셀프 어텐션 레이어의 놀라운 점은 우리가 입력 벡터의 순서를 바꾼 경우에 볼수 있는데, 입력 벡터를 같은 것들을 가지고 있으나 1, 2, 3 순서가 아니라 3, 1, 2로 하는경우 어떤 일이 일어날까요.

 

 

그렇더라도 동일한 키 벡터들과 동일한 쿼리 벡터들을 구할수 있겠습니다. 키 벡터와 쿼리 벡터는 서로 서로 영향을 주지 않기 때문입니다. 다만 정확하게 같은 키 벡터와 쿼리 벡터를 구할수 있지만 입력 벡터의 순서대로 뒤바뀌겠습니다.

 

 다음으로 뒤바뀐 벡터들 사이의 유사도 스코어들을 계산할때, 모든 유사도 스코어는 동일하지만 행과 열이 바뀌었기때문에 이 행렬 자체도 뒤바뀌어 있겠습니다. 하지만 값 자체는 동일해요. 

 

 이전과 비슷하게 어텐션 가중치를 계산할수 있겠고, 값 자체는 동일하나 여전히 뒤바뀌어 있겠다.

 값 벡터들 자체도 동일하나 뒤바뀌어있고,

 출력 벡터도 동일하지만 뒤바뀌어있다.

 

 이 현상이 무엇을 의미하냐면 기술적으로 이야기하면 셀프 어텐션 계층, 셀프 어텐션 연산은 동등 치환 permutation equivalent(동일하나 순서를 바꾼다?? 정도로 이해)이며, 이 동등 치환이라는 것은 우리가 입력 벡터 x를 치환 연산 s를 적용한 다음에 출력을 계산한 것 f(s(x))과 치환/변환?하지않은 입력으로 결과를 구한뒤 치환시킨것 s(f(x))이 동일하다는 의미가 되겠습니다.

 

 그리고 셀프 어텐션 레이어를 다른 방향으로 고민해보자면, 이 셀프 어텐션 레이어는 입력의 순서를 신경쓰지 않습니다. 순서를 고려하지 않는 다는 점에서 새로운 종류의 신경망 계층이기도 하며, 벡터의 집합만을 가지고 연산하겠습니다.

 

 셀프 어텐션 레이어가 하는건 여러 벡터들 x을 가지고 각 벡터들 q, k을 서로 서로 비교해서 새로운 벡터 집합 y을 구하는 일을 하겠습니다.

 

그래서 이 레이어는 입력 벡터를 처리할때 그 벡터들의 순서가 어떻게 되는지 잘 모르겠습니다. 하지만 벡터들의 순서를 알아야하는 경우도 있을거에요 예를 들자면 번역이나 캡셔닝 작업같은 경우에는 시퀀스를 생성하고, <end> 토큰으로 마무리 합니다.

 

 이와 같은 어떤 작업들의 경우 모델이 벡터가 어느 위치에 있는지 아는게 중요한 경우도 있습니다. 하지만 셀프 어텐션 레이어는 동등 치환이다보니, 어떤 벡터가 첫번째인지 어느것이 맨마지막인지 알 방법이 없습니다. 

 

 

 그렇지만 각 입력 벡터에 위치 인코딩을 함으로서 위치 이동에대한 민감도를 절반정도 복원시킬수가 있습니다. 이걸 구현하는 다양한 방법들이 있는데 이들 중 한 방법은 룩업 테이블을 학습하는 방법입니다.

 

 이 신경망에다가 학습가능항 가중치 행렬을 추가시키는것인데, 벡터 하나로 첫번째 위치를 학습하고, 다른 한 벡터로 두번쨰 위치를 학습하고, 다른 벡터로 세번쨰 위치를 학습하겠다. 그러고나서 신경망 순전파 연산을 수행할때에는 첫번째 벡터 아래에다가 학습한 위치 벡터를 붙이고, 두번째 입력 벡터  신경망 순전파를할때, 첫번째 벡터 아래에 학습된 위치 벡터를 붙이고, 두번째 위치 벡터를 붙이고 그런식으로 가겠다.

 

 이렇게 함으로서 모델은 시퀀스의 파트들이 시작부분인지, 끝부분인지 구분할수 있게 되었으며 이것을 위치 인코딩 positional encoding이라고 부르며, 이것들이 가끔 셀프 어텐션 모델에서 사용되는걸 볼수 있겠다.

 

 

 다른 셀프 어텐션 레이어의 변형으로 마스크 셀프 어텐션 레이어라고 부르는 방법이 있는데,

 

 이 방법을 정리하자면 어떤 작업들을 할때 모델이 이전의 정보만 사용하기를 원할때, 순환 신경망은 은닉 상태가 진행하도록 설계된다는점을 떠올려보면 언어 모델 같은걸 모델링할시, 이전의 모든 토큰이 주어질때 다음 토큰을 추정할겁니다.

 

 디폴트 셀프 어텐션 레이어를 사용하면 모든 출력 벡터를 만드는 과정에서 모든 벡터를 사용하게 될건데, 언어 모델 같은 종류의 작업에서는 잘 동작하지 않게 될겁니다. 하지만 이문제는 어텐션 매트릭스에 어떤 구조를 추가해서 고칠수가 있습니다.

 

 예를들어 모델이 과거 정보만 사용하도록 강제로 만들려면, 이 추정 행렬 e에서 집중하지 않아야하는 모든 위치에다가 -무한대를 넣으면 됩니다. 그래서 이 예시에서 첫번째 입력과 q1에 대한 출력 벡터를 만든다고할때, 첫번째 출력은 첫번째 입력으로만 구하면되겠습니다.

 

 그래서 이런 과정을 행렬에다가 음의 무한대를 넣어서 할수 있고, 소프트맥스 함수로 계산하면 -무한대는 어텐션 가중치로 0의 값을 들을 가지게 되겠습니다. 이런 구조를 마스크화된 셀프 어텐션 레이어라고 부르며, 출력을 생성할때 입력 일부만 보도록 마스크시켜주는 역활을 하기 때문입니다.

 

 이 구조가 언어 모델 작업과 같이 모델이 이전 단어들만 사용해서 다음 단어를 추정해야하는 언어 모델 작업과 같은곳에서 자주 사용됩니다.

 

  이러한 셀프어텐션 레이어의 또 다른 버전으로 멀티 해드 셀프 어텐션이 있습니다. 이 방법은 해드의 개수 h를 지정하고, 셀프 어텐션 레이어를 병렬로 독립적으로 동작시킬건데 여기다가 입력 벡터를 분할해서 주는데, 입력 벡터 x가 d 차원이라면 각 입력 벡터들을 동일한 h개의 덩어리로 분할시켜주겠습니다.

 

 이 각각의 입력 벡터 덩어리들을 병렬화된 셀프 어텐션에다가 각각 넣어주고, 각 하부 셀프 어텐션레이어는 각 입력에대해서 각 출력들을 만들어낼것이고, 이러한 멀티해드 셀프 어텐션 레이어로부터 최종 출력을 얻기위해서 이 각 출력들은 연결시키겠습니다.

 

 이 멀티해드 셀프어텐션 레이어는 실제로도 자주 사용되고 있으며, 여기서 기본적으로 두 하이퍼파라미터를 가지는데 하나는 쿼리 벡터의 차원과 우리가 추정하고자하는 출력 y의 최종 차원가 있겠습니다. 이번에 이 모델에서 내부적으로 우리가 지정해주어야하는 두 하이퍼 파라미터로 하나는 내부 키 벡터 Dq의 차원과 다른 하나는 해드 h의 갯수가 되겠습니다.

 

 이 값 둘다 실제 셀프 어텐션 레이어들을 사용하는걸 볼때 볼수 있으며, 사람들이 각 레이어의 전반적인 폭지정해둔것을 볼수 있는데 이건 쿼리벡터 Dq의 차원이며, 셀프 어텐션 레이어의 해드 갯수 h를 지정한것을 볼수 있겠습니다.

 

 

300x250
728x90

 지금까지 어텐션 메커니즘으로 다양한 작업들에 사용한 경우들을 알아보았습니다. 하지만 최근 몇 년간 연구에서 어떤 일들이 있었을까요? 많은 작업에서 유용해보이다보니 이 메커니즘을 다양한 타입의 문제에서 적용시키기위해서 추상화하고 일반화시키고 싶을수 있겠습니다.

 

 이 어텐션 매커니즘의 개념들로부터 시작해서 이전에 이미지 캡셔닝과 기계 번역에서 사용했었는데,이 개념들을 일반화하여 순환 신경망이나 다른 만든 신경망에다가 범용 목적의 계층으로서 넣어 사용할수있겠습니다. 

 

 우리가 보아온 어텐션 매커니즘을 재정립하기위한 방법은 쿼리 벡터 q와 (출력의 매 타임 스탭마다 은닉 상태 벡터로 구한)이전 어텐션을 입력으로하고, 거기다가 어텐드를 하고자하는 은닉 벡터를 구하는데 필요한 입력 백터의 컬랙션 x을 사용합니다. 또, 유사도 함수 f_att를 사용해서 쿼리 벡터와 입력 벡터로 된 데이터베이스에서 각각의 것들을 비교하게 되요.

 

 아래의 내용이 우리가 여러번 보아온 어텐션 메커니즘의 계산 과정인데, 이 연산에서 유사도 함수 f_att로 쿼리 벡터와 각 입력 벡터 사이의 유사도 벡터들을 만들어내요. 이 값들은 정규화되지않은 유사도 스코어다보니 소프트맥스 함수를 사용해서 각 입력 벡터 x에 대한 확률 분포로 정규화 시키겠습니다. 출력은 단일 벡터 y로 입력 벡터 x들의 가중화된 선형 결합으로 구합니다.

 

 일반화를 위한 첫번째 과정으로 유사도 함수 similarity functino을 바꿔봅시자. 이전에 만든 유사도 함수 f_att는 초기 어텐션 논문에서 사용되었던 것인데, 유사도 함수에서 사용되는 벡터들간의 점곱 dot product로 더 효율적으로 구할수 있다는것이 밝혀졌습니다.

 

 이 방식으로 간소화 시키겠습니다. 이렇게함으로서 신경망의 유사도들을 일일이 계산하기보다는 모든 유사도를 행렬 곱의 형태로 더 효율적으로 계산 할수 있겠습니다.

 

 조금더 자세히 들어보자면 사람들은 그냥 점 곱 연산을 사용하기보다는 유사도 스코어를 계산하는데 조정된 점곱 연산 scaled dot product라고 부르는 방법을 사용합니다. 

 

 이 방법은 쿼리 벡터 q와 입력 벡터들중 하나인 x_i로 유사도 스코어를 구할때, q와 x_i를 점곱해주고 이 결과를 sqrt(D_q)로 나누어줍니다. 여기서 D_q는 쿼리벡터의 차원이 되겠습니다.

 

 이 연산을 하는 이유를 정리하자면 우리는 구한 유사도 스코어를 소프트맥스 함수에다가 적용시킬건데, 소프트 맥스 함수에 들어오는 입력이 너무 크다면 그라디언트 소멸 문제가 생기게 됩니다. 한번 어텐션 가중치 e_i가 다른것들보다 훨씬 크다면, 하나만 아주 큰 소프트 맥스 확률 분포가 나올것이고 모든 지점의 그라디언트가 0에 가까워지게 만들어 학습을 어렵게 할겁니다.

 

 또 다른 문제로는 아주 고차원 벡터를 다루는 경우에 접 곱을 구하면 크기도 아주 커지게 되겠습니다. 두 벡터 a, b의 접곱을 계산하는 구체적인 예시를 보면 둘다 같은 차원 d인데, 이 두 벡터의 점 곱은 두 벡터 크기를 곱한것에다가 두 벡터 사이 각도에 대한 코사인를 곱해주면 되겠습니다.

 

 한번 우리가 두 상수 벡터를 가지고 있다고 하고, 두 벡터 중 하나의 크기 magnitude는 그 벡터의 차원의 제곱근으로 조정시키겠습니다. 이는 우리가 아주 긴 차원의 신경망을 다룬다고할때, 아주 긴 차원 벡터를 가지고 점곱을하게될것이고, 그러면 아주 큰 값이 나오게 될것입니다.

 

 그래서 이를 상쇄하기위해서 점곱에다가 차원의 제곱근으로 나누어주어, 점곱 결과는 차원의 크기에 따라 조정되겠습니다. 이렇게 하면 소프트맥스 함수를 통과한 후에도 더 나은 그라디언트를 가지게 됩니다.

 

  다음 일반화 방안으로 다중 쿼리 벡터를 사용하겠습니다. 지금까지 본 것들은 디코더의 각 타임 스탭마다 하나의 쿼리 벡터를 가지고 사용하였습니다. 쿼리 하나를 가지고, 입력 벡터들 전체에 대한 확률 분포를 생성하는데 사용했어요. 

 

 이제는 이 어텐션이라는 개념을 여러 쿼리 벡터의 집합을 가지고 일반화를 시켜봅시다. 입력으로 쿼리 벡터 집합 q와 입력 벡터의 집합 x를 가지고 있고, 각 쿼리벡터로 전체 입력벡터 각각에 대한 확률 분포를 생성해낸다고 합시다. 그러면 이들 끼리의 유사도를 다 계산할수 있을거에요.

 

 우리는 각 쿼리벡터와 각 입력 벡터 사이의 유사도를 계산해야하는데, 조정된 점곱 연산으로 유사도 함수를 사용하여 단일 행렬곱 연산으로 전체 유사도 스코어들을 동시에 계산할수가 있겠습니다. 여기서 기억하고 있어야될것은 우리는 각 쿼리 벡터에대한 입력 벡터들의 확률 분포를 계산해야하는데, 출력된 어텐션 스코어의 (쿼리 벡터에 대한) 한 0차원에다가 소프트 맥스 함수를 적용시켜서 구할수가 있어요.

 

  출력 벡터를 생성시키기 위해선, 이전에는 하나의 출력벡터를 구했지만 지금은 쿼리 벡터 집합을 가지고 하다보니 각 쿼리 벡터에 대한 각 출력을 만들어야 되겠습니다. 쿼리 q_i에 대한 출력 백터는모든 입력 백터의 가중화된 결합으로 구할수가 있는데, 여기서 쿼리벡터로 추정한 확률 분포로 가중을 주었습니다.

 

 이러한 연산을 행렬 형태로 다룰수가 있는데, 추정한 어텐션 가중치 A와 입력 벡터들 X 사이의 하나의 행렬곱 연산으로 이 모든 선형 결합을 동시에 계산할수가 있습니다.

 

 다음 일반화 방안은 입력 벡터를 사용하는 방법에 관한것인데, 이 슬라이드를 보면 입력 벡터들을 두가지 방향으로 사용하고 있습니다. 하나는 입력 벡터들을 각 쿼리 벡터와 함께 어텐션 가중치를 계산하는데 사용해요. 그 다음으로는 입력 벡터들을 다시 출력을 계산하는데 사용하고 있습니다.

 

 

 이들은 실제로는 우리에게 필요한 서로 다른 두 함수(유사도 계산 함수와 출력 벡터 계산 함수)라고 할수 있어요. 그래서 입력 벡터를 키 벡터와 입력 벡터로 나눌수가 있는데, 우리가 하고자하는건 입력으로 그대로 쿼리 벡터 집합 q와 입력 벡터 집합 x를 가지고는 있으나, 입력 벡터들을 그대로 서로 다른 두 함수안에서 사용하는게 아니라

 

 학습가능한 키 행렬 W_k와 학습 가능한 값 행렬 W_v를 사용해서 입력 벡터를 키 벡터의 집합과 값 벡터의 집합으로 변환 시킬수가 있겠습니다. 이제 이 두 키 벡터들과 값 벡터들을 이 어텐션 계층의 연선에서 서로 다른 두 용도로 사용하면 됩니다.

 

 이제 우리가 할일은 유사도 스코어를 계산하는데 각각의 쿼리 벡터와 각 키 벡터를 계산하면 되고, 출력 스코어를 계산할 시에 출력들은 가중화된 값 벡터, 그러니까 값 벡터들을 추정한 유사도 스코어로 가중화한 것으로 구할수가 있겠습니다. 

 

 이걸 정리하자면 이 과정을 통해서 모델은 입력 데이터를 어떻게 사용할지 더 유연하게 고려할수 있게 됩니다. 왜냐면 쿼리 벡터는 모델에게 전달하는 내가 찾고싶다고 알려주는 것인데, 이미 알고있는것과 다른 정보를 다시 돌려받을 필요가 있어요.

 

 이 과정은 구글에서 검색하는 과정과 비슷하다고 할 수 있는데, "how tall is the empire state building", "엠파이어 스테이트 빌딩이 얼마나 높은가요?"라는 쿼리/질문을 하면, 구글은 이 쿼리랑 수 많은 웹 패이지들을 비교하고, 여러 웹 페이지를 전달해줄거에요.

 

 하지만 쿼리 자체는 이미 알고 있으니 우리가 쿼리랑 웹 페이지가 얼마나 잘 일치하는지 관심 가질 필요는 없고, 그보다는 찾은 데이터가 쿼리와 연관된 것인지 알고싶을 겁니다. 그래서 웹 검색 어플리케이션에서 "엠파이어 스테이스 빌딩이 얼마나 높은가요"라는 쿼리로 검색하면, 우리 원하는 데이터는 쿼리로 얻은 텍스트에 있는 몇 미터나 되는지에 대한 데이터들 일거에요.

 

 그래서 명확하게 하자면 키 벡터와 값 벡터로 나눔으로서 모델이 입력을 두가지 방법으로 사용할수 있도록 더 유연하게 만들겠습니다.

 

 이건 꽤 복잡한 연산인데, 이 슬라이드로 이 연산과정을 시각화 시켜 보겠습니다. 바닥에 쿼리 벡터 집합으로 q1에서 q4까지 있고, 왼편에 입력 벡터의 집합으로 x1에서 x3까지 있습니다.

 

 

 첫번째로 할 일은 각 입력 벡터들을 키 행렬과 연산을하여 각 입력에 대한 키 벡터들을 만들어 냅시다. 

 

 이제 이 키 벡터를 각각의 쿼리 벡터와 비교를 하여 정규화되지 않은 유사도 스코어의 행렬을 만들수가 있어요. 이 유사도 행렬의 각 원소들은 키 벡터 하나와 쿼리 벡터 하나 사이의 조정된 점곱 연산한 값이 되겠습니다.

 

  다음으로 할 일은 이 어텐션 스코어는 정규화되지 않았다보니 각 쿼리 벡터에 대해서 확률 분포로 만들어내겠습니다. 소프트 멕스 연산을 이 배정 행렬 E의 수직 차원으로 수행함으로서, 배정 스코어 A를 구하였습니다. 여기서 소프트 맥스 함수를 수직 방향으로 하다보니 배정 행렬의 각 컬럼은 입력 x1, x2, x3에대한 확률 분포가 되겠습니다.

 

다음으로 할일은 지금까지 배정 스코어를 구하는 과정을 거쳤고, 이제 출력을 계산하기 위해서는 입력 벡터들을 값 벡터로 변환을 시켜야 합니다. 각 입력 벡터를 보라색 상자의 값 벡터 v1, v2, v3으로 만들겠습니다.

 

   그러고나서는 배정 스코어를 이용하여 값 벡터들을 가중화 선형 결합을 하겠습니다. 예를 들자면 V1을 행방향으로도 곱하고, 열방향으로도 곱하고 합 연산을 합니다. 이 말을 정리하자면 V1은 A11과 곱하고, V2는 A12와 곱하고, V3은 A13과 곱한뒤 합을하여 위로보내게 됩니다.

 

 각 값 벡터들은 해당하는 열 값과 곱하고, 이들을 합을 해서 올림으로서 각 쿼리벡터 q에 대한 출력 벡터 y를 만들어내게 됩니다.  이러한 출력 벡터 y는 가중화된 값 벡터들의 선형 결합니고, 가중의 정도는 키 벡터와 쿼리 벡터 사이의 점곱으로 계산하였습니다.

 

 이게 어텐션 레이어이고, 신경망에 삽입할수 있는 가장 일반적인 형태가 되겠습니다. 이건 우리가 두 데이터셋을 가진 경우, 하나는 쿼리로 보고, 다른 하나는 입력으로 보면, 이 어텐션 계층에 입력으로 사용하여 쿼리와 입력간의 결합 함으로서 계산할 수 있겠습니다.

 

 

 

300x250

+ Recent posts