-
Notifications
You must be signed in to change notification settings - Fork 0
CapsNet
Dynamic Routing Between Capsules을 살펴보면서 이해한 내용들을 정리했습니다.
캡슐이란 뭘까? 그리고 그 사이의 다이나믹 라우팅은 뭘까? 이 질문에 답을 하기 위해서는 캡슐이란 개념이 왜 나왔고 이것이 무엇을 대체할 수 있는건지 알아야 한다.
뉴럴네트워크는 인간의 뇌의 뉴런들이 얼기설기 복잡하게 모여서 네트워크를 이루고 있는 모습을 말하고 이 개념을 차용한게 딥러닝의 뉴럴네트워크(NN)이다. 여기서 어떻게 뉴럴네트워크를 쌓았는지에 따라 DNN(Deep NN), CNN(Convolutional NN), RNN(Recurrent NN)... 이 등장하게 된다.
하지만 이런 뉴럴네트워크를 만드는 최소한의 구성요소인 뉴런은 아래와 같이 매우 간단하고 네트워크 역시 간단하다.
neuron = y = w * x + b (w = weight, b = bias)
neuron_output = f(sum(neurons_input)))
캡슐은 이런 단방향성 네트워크 구성의 한계성을 이야기하고 있다. 일례로 CNN에서 input 정보들에 convolution filter로 projection하여 새로운 layer를 만드는데 이것은 단순히 정보들을 다른 관점(filter)에서 새롭게 정의할 뿐 새롭게 만들어진 정보들의 관계의 정의에는 적합하지 않다. 예로 (ab)와 (ba)의 차이가 불분명하다는 것이고 우리는 더 복잡한 수식 계산으로 이들의 관계를 정리할 수 있는데 그 때 필요한 것이 캡슐이다. 또한 캡슐은 복잡한 구조를 선택하여 기존의 뉴런에서 하나의 정보를 가질 수 없었다면 하나의 캡슐 안에 다양한 정보(property)를 간직할 수 있도록 하여 고차원적인 정보들의 관계들을 정리 할 수 있게 된다.
Paper.2에서는 그런 캡슐을 어떻게 구현할 것 인가에 대한 이야기와 간단한 예시를 볼 수 있는데 예시에서는 vector 개념을 사용해서 기존의 관계의 연관성(기존의 scalar값)은 vector의 length로 direction으로 관계의 방향으로 정리했다.

캡슐에서 non-linearity를 얻기 위해 벡터의 방향은 바꾸지 않으면서 normalize 효과를 얻는 squash function을 사용한다.
아래가 squash이고 결과로 특정 개체의 존재 확률을 얻을 수 있다.
캡슐 네트워크 간의 캡슐 상태를 업데이트 해주는 과정을 말한다. 캡슐은 전파과정에서 low level의 entity로 high level의 entity가 구성되는데 이 때 low level의 entity는 자신의 특징에 적합한 high level entity로 route가 되고 이 과정에서 dynamic routing 알고리즘을 사용해 최적의 해를 찾는다.
알고리즘의 pseudo-code가 아래에 있다.
여러 capsule의 결과를 정리하기 위해서 각각의 capsule에 대해서 아래의 수식으로 margin loss을 얻어내고
Total Loss는 모든 digit capsule의 margin loss를 합하여 얻어낸다. 과정은 마지막 digit layer의 특정 class를 의미하는 capsule의 vector 크기로 정의하는데 정답이 아닌 class의 capsule에 대해서도 lambda 값의 가중치를 두어 loss를 반영하도록 하였다. 아래는 그 공식이다.
CNN의 단점은 명확하고 단점들을 개선하는 방법으로 capsule 개념이 필요한 타당성은 맞다. 그리고 간단한 구현으로 capsule로 이루어진 layer가 CNN에서 얻지 못한 성능을 얻었다는 사실도 맞다. 다만, capsule idea가 아직까지 CNN에 한정되어 검증되었다는 점, 그 결과가 비약적으로 좋진 않았다는 점, 필요로하는 비용이 너무 크다는 점들이 굳이 이걸 써야할까라는 의문이 들게 한다. 그래도 이런 새로운 접근 아이디어가 계속해서 연구되어 일반적인 실험에도 사용될 수 있는 물건이 되었으면 한다.

