NN과 CNN의 역사가 간단하게 나왔고 CNN은 무적이야! 라는 설명이 앞 15분간 진행되었음
Convolution Layer
Convolution Layer는 기존의 구조를 보존하는 점에서 단순한 Dot Product인 Fully Connected Layer와 다르다. FC Layer는 전체 이미지를 한차원으로 쭉 펼쳤지만 얘는 그렇지 않음.
가중치 의 역할을 하는 Filter가 이미지를 "Slide Over" 하면서 내적을 계산하게 된다 (굉장히 시적인 표현인듯... ㅋ)
여기서 내적이 Convolution인데, 내가 아는 Convolution 연산과 달라서 찾아보니, 의미만 따온거라고한다 (읭?)
2차원을 쭉 펼쳐서 내적 하는 것을 Convolution이라고 하나보다.
자세하게 이해해보자.
Filter는 원본 이미지와 같은 Depth와 작은 크기를 가졌음. (이미지가 32 32 3 이라면 필터는 5 5 3 같은 식)
Filter가 위 그림처럼 한 공간을 잡고 Convolution을 수행해서(찢어서 내적하고) 저장한 다음 이동한다. 이를 계속 반복하다보면 Convolution의 결과로만 이루어진 Matrix가 나올텐데, 이를 Activation Map이라 한다.
하나의 층은 여러개의 Filter로 이루어져 있고, 이를 모아서 Activation Maps를 만들어 출력한다. 이렇게 만들어진 다른 Activation Maps는, 또 다른 Activation Function이나 Convolutional Layer의 입력값이 된다.
상위층에서 깊게 들어갈 수록 더 세세한 특성들을 파악하게 된다.
각 Neuron(Filter)에 있는 값은 저렇게 생겨먹어야 최댓값을 갖는다는 것을 시각화 한것이라고 한다.
Convolution Layer를 쓰는 이유는?
FC Layer에 비해 적은 수의 Parameter를 쓸 수 있다는 장점이 있다. 따라서 Data가 적어도 유의미한 결과를 뽑아낼 수 있다는 장점이 있다.
반대로, 데이터의 수가 많으면 굳이 Convolution Layer를 쓸 이유가 없기 때문에 요새 가장 빠른 NN은 CNN이 아니다.
Spartial Layer
7*7 이미지에 3*3 필터가 있다고 하면, 첫번째 이미지 처럼 계산하고 한칸 움직이고, 계산하고 한칸 움직이고 이런 식
그럼 결국 5*5 의 Activation Map이 되는것을 어렵지 않게 알 수 있다.
만약 2칸씩 움직인다면? 3*3의 Activation Map이 만들어 질 것이다. 이렇게 움직이는 칸의 칸수를 Stride라고 한다.
로 출력되는 Activation Map의 크기를 구할 수 있다. (은 차원, 는 필터의 크기)
Zero-Pad
위와 같이 계산하면 두가지 문제가 생긴다.
1.
Activation Map의 출력물은 원래 이미지와 차원이 달라지게 된다.
2.
모서리의 이미지의 경우 값이 잘 파악되지 않는다.
이를 해결하기 위한 방식 중 하나가 Zero-Pad 방식이고, 단순하게 말 그대로 테두리에 0을 때려박는 것이다.
Filter의 크기에 따라서 테두리의 두께는 달라질 수 있다. 3*3의 경우 한줄이 맞겠지만 5*5는 두줄이고 뭐 그런식..
1 * 1 Convolution Layer
전체 Depth에 대해서 내적을 하는 것과 같다. 데이터의 크기를 줄여서 연산 속도를 단축 할 수 있다.
서로 다른 Depth에 위치한 친구들에 대해 같은 가중치를 이용해서 곱한다는 의미가 있다.
Fully Connected Layer로 학습한다고 하면 ( 56 * 56 * 64 + 1 ) * 32 만큼 계산해야 하지만 CONV를 쓰면 (64 + 1) * 32만큼만 계산하면 됨.
Brain/Neuron View of CONV Layer
뇌 얘기만 나오면 항상 당황스럽다
1.
5 * 5 Filter 라는 소리는 한 뉴런의 Receptive Field가 5 * 5 라고 할 수 있다. Receptive Field라는 것은 한 뉴런이 수용할 수 있는 이미지의 크기를 말한다.
2.
만약 필터가 5개라면 5개의 뉴런이 같은 이미지를 대상으로 서로 다른 5개의 특징을 추출한다고 볼 수 있음
Pooling Layer
Representation을 작게 만들어주는 층이다.
이렇게 하는 이유는 Parameter의 수가 줄어들기 때문과 Invariance를 얻기 때문이다.
Invariance를 얻는다는 것은 Feature가 Transformation되더라도 해당 Feature의 특징이 유지된다는 것이다.
Pooling Layer가 하는 일은 Downsampling과 같다. 224 224 64의 이미지가 있다면 112 112 64로 다운샘플링 하는 것 (Depth는 보존한다.)
Max Pooling
Filter에서 최댓값 하나를 골라서 그것을 대푯값으로 하는 방식이다.
Fully Connected Layer
CNN의 마지막에 FC Layer가 있는데 최종 출력된 Conv Layher의 출력값을 펼쳐서 Fully Connected Layer에넣는다.