드디어 강의의 절반을 넘었다. 하지만 아직 갈 길이 멀다. 이번 강의는 컴퓨터 비전에 관한 내용인 것 같다. 고작 1년 전만 해도 컴퓨터 비전이 뭔지 몰랐을 정도로 머신 러닝이랑 동떨어져 있던 사람인데 어쩌저찌 여기까지 왔다.
1. Edge Detection
이름만 들었을 때는 무슨 에지 케이스 관련 알고리즘인 줄 알았는데 그게 아니라 이미지에 수직, 수평선들을 검출해내는 알고리즘이었다. 여기서 convolution이라는 연산이 사용된다. 수학적으로는 별표(*)가 국룰이라는데 코드 상에서는 이미 곱하기로 사용하고 있어서 추가적인 함수를 통해서 convolution 연산을 사용해야 한다. 텐서 플로우, 케라스 등에 이런 연산 함수들이 있다. 가운데의 3x3 행렬을 필터나 커널이라고 하는데 강의에서는 필터라는 용어를 사용한다.
저 필터를 학습 가능한 파라미터로 사용하는 것이 컴퓨터 비전에서 가장 강력한 아이디어라고 한다. 이번 주 후반부에는 이 필터를 학습시키기 위해서는 back propagation은 어떻게 진행되는지를 배운다.
2. Padding
위와 같이 필터를 사용해서 convolution 연산을 하게 되면 결과로 나오는 행렬은 이전보다 작아진다. 그리고 테두리에 있는 픽셀들은 안쪽에 있는 픽셀에 비해서 적게 사용되는 현상도 발생한다. 이를 해결하기 위해서 패딩이라는 방법을 사용한다. 말 그대로 원래 행렬에 0을 둘러서 행렬을 더 크게 만드는 방법이다. 이를 사용하면 결과가 이전보다 작아지는 현상을 방지할 수 있다.
이쯤 되면 대충 convolution 연산을 하게 되면 행렬의 사이즈가 얼마나 변할지 감이 온다. 그리고 그냥 패딩을 하지 않는 convolution 연산은 valid convolution이라고 하고 원래의 크기를 맞춰주는 연산은 same convolution이라고 한다. 보통 필터의 차원이 홀수로 사용하기 때문에 same convolution 할 때 패딩 크기에 대한 문제는 거의 없다.
3. Strided Convolution
이건 convolution 연산을 할 때 필터를 한 번에 얼마나 이동하는지와 관련 있다. 지금까지는 필터를 한 칸씩 움직였다. 하지만 만약 s 값이 2라면 두 칸씩 움직이게 된다. 밑의 그림처럼 결과가 나오게 된다.
4. Convolutions Over Volume
지금까지는 이미지가 gray scale이었다. 하지만 RGB로 표현하게 되면 행렬이 1장에서 3장이 된다. 위에서 사용한 크기라면 6x6x3가 되겠지. 그래서 필터도 한 번에 3장씩 3x3x3으로 쓴다. 이때의 3장을 강의에서는 3개의 채널이라고 표현한다. 깊이라고 하는 경우도 있다던데 이건 신경망의 깊이와 단어가 겹쳐서 채널이라고 한다. 그리고 convolution 연산을 하게 되면 결과는 1장짜리로 나온다. 만약에 여러 특성을 파악하고 싶어서 필터를 여러 개 쓴다면 결과는 여러 장 나올 수도 있다.
이제 부피가 있는 이미지에 대한 convolution 연산이 뭔지 알게 됐으니 CNN의 레이어 구성이 어떻게 이뤄지는지 알 수 있다. 대충 이런 느낌이다.
새로운 용어가 많이 등장했으니 정리가 필요하다. 조금 많지만 다 이미 한 내용이고 이전 강의에서 사용했던 notation들이랑 비슷한 부분이 많다. 그래서 찬찬히 살펴보면 다 무슨 뜻인지 알 수 있다. 만약 레이어 하나의 파라미터가 몇 개냐고 물어본다면 우선 하나의 필터를 구성하는 파라미터의 개수에 bias를 포함하고 총 필터 개수를 곱하면 된다. 다른 방법으로는 그림의 맨 마지막 두 줄을 더 하면 된다. 다른 변수들은 행렬의 차원을 나타내지만 이 녀석들은 그냥 곱하기 연산이라고 이해하면 된다.
강의에서 예시로 든 간단한 CNN 예시는 다음과 같다. 마지막에 결괏값에 로지스틱이나 소프트맥스를 취하면서 최종 결과를 내게 된다. 앤드류 응 교수님은 점점 한 채널 당 크기가 줄어들게 되고 채널의 개수가 늘어나는 경향이 있다고 언급하셨다. 채널 크기는 그렇다 치고 채널 개수는 필터의 개수에 따라 달라지는데 아마 필터를 점점 더 많이 사용하기 때문이지 않을까 싶다.
4. Pooling
채널의 크기를 줄이기 위해서 convolution 연산 말고도 pooling이라는 연산도 사용된다. 그리고 pooling에는 max와 average가 있다. 직관적으로 이해하면 어떤 영역에 내가 원하는 특성이 있는지 검사해주는 방법이다. 만약 있다면 9처럼 값이 커질 것이고 없다면 2처럼 그냥 작은 값에서 머무르겠지. 보통 max를 사용하고 아주 깊은 신경망에서는 average를 사용하기도 한다고 한다. 그리고 pooling은 채널의 개수가 유지된다.
그리고 보통 pooling에는 패딩을 사용하지 않는다. 하지만 f와 s는 있기 때문에 convolution 연산이랑 똑같이 행렬의 크기가 변한다. 대신 f와 s는 모두 하이퍼 파라미터이므로 pooling은 back propagtion으로 학습되지 않는다.
그래서 convolution과 pooling은 어떻게 사용하는 걸까 하는 의문이 든다. 강의에서는 정확히 LeNet-5는 아니지만 비슷한 놈을 예시로 든다. 그리고 이 모델은 둘을 한 번씩 번갈아 가면서 사용한다. 점점 결과 값에 가까워질수록 채널의 크기는 감소하고 채널의 개수는 늘어난다. 그래서 activation shape가 각 레이어마다 변하면서 activation size는 감소하는데 이는 너무 빠르게 감소하면 좋지 않다고 한다. 그리고 파라미터의 개수는 convolution에서는 상대적으로 파라미터가 많이 필요하지 않기 때문에 대부분 fully connected 레이어에 몰려있다.
5. CNN
마지막으로 CNN의 장점을 요약하자면 첫 번째로 parameter sharing, 두 번째로 sparsity of connections가 있다. 전자는 그냥 무지 성 fully connected 방법보다 파라미터를 훨씬 많이 줄일 수 있다는 점이다. 파라미터는 필터에만 있기 때문이다. 그래서 큰 이미지를 다루더라도 무식하게 파라미터 개수가 커지지 않는다. 그리고 후자는 어떤 값이 도출되기 위해서는 필터에만 영향을 받기 때문에 저 멀리 있는 값의 영향을 받지 않는다는 점이다. 고양이의 수염을 검출해내고 싶은데 이미지의 양극단을 확인할 필요는 없다. 확실히 이런 부분들은 이미지를 다루는데 큰 도움이 될 것 같다.
그래서 학습은 어떻게 시키는지 궁금했는데, 아마 딱히 새로운 방법이 있는 것은 아닌 것 같았다. 결국엔 필터도 파라미터의 집합이므로 gradient 값을 구하고 이걸 사용해서 값을 업데이트한다.
* Courera의 Deep Learning Sepcialization 강의를 수강하는데 도움이 되고자 작성한 요약문입니다. 틀린 내용 있다면 정정해주시면 감사하겠습니다.