드디어 Convolution Neural Network 까지 왔다.
정말 많이들어본 녀석 중 하나지만 대충 이미지 좋다는 정도만 알고있었다.
정확히 어떤 기능을 하는지, 무엇이 현재 이 분야의 이슈인지 빨리 알아봐야 할 것이다.
수많은 논문중에 눈이 가는 제목 2개를 뽑아 조금 훑어봤는데 꽤나 흥미로운 것 같다.
- Zhijian Liu et al., "Point-Voxel CNN for Efficient 3D Deep Learning" CVPR '19
- Yue Wang et al., "Dynamic Graph CNN for Learning on Point Clouds" CVPR '19
이미지를 컴퓨터로 인식할 수 있을까. 물론 있다. 내가 잘모를 뿐. 아무튼 기본적인 아이디어는 이런 내용인 것 같다. 우리가 이미지를 네트워크로 학습시킬 때 각각의 픽셀을 네트워크의 인풋으로 넣어준다고 가정하자.
픽셀 단위로 학습을 진행한다면, 위와 같이 같은 A글자더라도 왼쪽으로 이동한다거나 회전된다거나 할 경우, 인식하는데 문제가 발생할 것이라는 것을 직관적으로 이해할 수 있다. 더군다나 이미지라는 것은 관측자(카메라)의 위치, 각도, 조도 등 많은 요인에 의해 영향을 받기 때문에 좀더 안정적이고 효율적인 방안이 필요하다. 그렇기 때문에 나온것이 CNN이라는 것이다. 그러면 CNN은 뭐가 어떻게 더 좋은 것일까. Convolution Layer일단 Convolution 이란 연산을 지칭하는 단어인데, 수학적으로 정확한 정의는 모르지만 적어도 우리가 다루려고 하는 것은 행렬조각과 Kernel이라 불리는 작은 행렬의 원소간 곱셈의 총합을 구하는 것이다.
위와 같이 이미지에 필터를 슬라이딩 시키면서 연산을 진행한다. 연산을 진행하고 결과로 나온 행렬을 feature map이라 부른다. 이때 궁금한 것은 filter 역시 학습을 통해 구해지는 것일까? 레이어마다 나오는 feature의 개수, 즉 네트워크 구조는 그냥 때려 맞추는 것일까? 아니면 합리적 결정, 혹은 학습을 통해 결정될까. 넘나 어렵다. Pooling Layer이렇게 결과로 나온 Feature map은 다시 Pooling Layer를 거치는데 Pooling은 또 뭘까. 찾아보니 네트워크를 학습할때 parameter가 많으면 over-fitting이 발생할 확률이 높다고한다. 이를 방지하는 것이 Pooling Layer라고 한다. Pooling 연산? 작업? 은 2개가 존재하는데 Max Pooling과 Avg Pooling이다.
그림과 같이 연산 자체는 굉장히 간단하다. 연산이 중요한 것이 아니고 데이터의 사이즈를 줄여 over-fitting을 방지하는 것 같은데 해당 내용은 over-fitting이 무엇인지 좀더 알아보면 좀더 명확히 이해할 수 있지 않을까. CNN 구조결국 CNN이란 위에서 언급된 Convolution layer와 Pooling layer들이 반복되고 마지막에 Fully connected layer가 붙은 형태를 띈다. 네트워크마다 어떤 이유로 차이가 있을텐데 이것들은 나중에 알아보도록 하자.
대충 이런 내용들을 훑어봤는데 역시 디테일을 이해하기 위해선 실습이 필요하지 않을까. 사실 얼마전에 Anaconda 설치했는데 뭔가 익숙하지 않아서... Matlab 예제로 mnist를 해볼지, python으로 해볼지 고민해봐야겠다.

댓글 없음:
댓글 쓰기