킹머핀의 제작 일지
다층신경망과 CNN 본문
강의 들으면서 정리하는 거라 내용이 완전하지 않음.
이전까지 배웠던 신경망 알고리즘에서, 다차원 방정식의 미지수(x)들은 서로 독립적이라는 전제에서 계산했다. 즉 (w_1x_1 + w_2x_2)나 (w_2x_2 + w_1x_1)나 똑같다. 하지만 영상의 경우 시각적 배열, 즉 미지수의 위치가 중요하기 때문에 독립적일 수 없다. 그래서 주변의 정보를 포함하는 인코딩 방식이 필요하다. 예를 들어 특정 데이터(미지수)는 이를 둘러쌓는 8개의 정보를 포함하는 것이다.
어떻게 포함하는가? 각 미지수의 양옆의 미지수까지 방정식(샘플)에 포함하는 방식이 있는데, 이건 신경망 크기가 제곱으로 커져서 비효율적일 뿐더러 필요한 데이터의 양도 많아진다. 그렇다면 주변 정보를 이렇게 무식하게 포함하지 말고, 일부나 모두를 더해서 평균으로 만드는 것은 어떨까?
예를 들어 한 픽셀에 대해 주변 밝기를 포함한 평균을 계산하면, 같은 밝기의 다른 픽셀과 구분할 수 있을 것이다. 또, 좌우 또는 위아래 픽셀의 차를 구하는 방법도 있다. 만약 윗픽셀에서 아랫픽셀을 뺐을 때 결과가 양수이면 윗픽셀이 아랫픽셀보다 밝다는 뜻.
이러한 인코딩 방식 중에 2D 컨볼루션 필터(마스크)가 있다. 각 픽셀에 가중치(w)를 곱하는 것이다. 물론 행렬 계산으로 통해서. 위의 방법 중 전자의 경우, 필요한 각 미지수에 그 수만큼 미리 나눗셈을 계산한다. 후자의 경우, 위아래 또는 좌우 픽셀에 -1과 1을 곱하고 나머지는 0을 곱하는 것. 후자는 '엣지 컨볼루션 필터'라고 말한다.
이러한 컨볼루션 필터는 당연히도 영상의 시각적 특징에 따라 잘 설계해야 하는데, 기하학적 변화에도 잘 대응할 수 있어야 한다. 이렇게 모든 경우에 대비하려면 필터 수가 많아지고, 그럼 또 계산량이 겁나 많아진다. 그럼 또 어떻게 하라고?
영상의 모든 경우에 대비하는 필터를 전부 만들고, 이 Full-rank Filters를 컨볼루션(합성곱) 신경망(CNN, 다층)으로 적은 수의 적절한 필터, Approximating Separable Filters를 생성한다. (예전에는 이걸 수작업으로 했다고 한다) 즉 영상으로부터 공간적인 특징을 학습하는 것이다.
컨볼루션 신경망은 세 계층이 있다.
1. 컨볼루션 신경망 계층
영상의 모든 경우에 대비하는 컨볼루션 필터 학습. 은닉층에 순서대로 Low-level, Mid-level, High-level 필터를 넣고, 기하학적 변화(Low)부터 영상의 다양한 부분에 대한 특징(Mid), 영상 전체의 특징(High, 학습 목표)를 학습한다.
그런데 가장자리의 픽셀은 중앙 픽셀보다 주변 정보가 부족하다. 그래서 필터를 거치면 출력 영상의 크기가 (필터의 크기에 따라)작아진다. 그래서 가장자리 배열을 0으로 (여러 번) 감싸는 제로 패딩이 필요하다.
필터 계산 시 다음 픽셀의 간격을 정하는 것을 스트라이드라고 한다. 일반적으론 1이지만 이 때 출력 영상의 크기가 더 작아진다.
1, 2번 계층은 순서대로 반복할 수 있다. 반복한 횟수를 곱한 만큼 필터의 개수가 많아진다.
2. 풀링 계층
단순히 이미지 크기를 축소한다. 대략적인 특징만 남길 수 있고, 계산량도 대폭 줄며 과적합을 방지할 수도 있다.
방정식의 개수(샘플 수)가 미지수보다 적으면, 명확한(수학적인) 가설이 너무 많아서 의미가 없고 머신 러닝 불가.
방정식의 개수(샘플 수)가 미지수보다 많거나 같으면, 명확한(수학적인) 가설이 없음.
하나로 축소되는 각 여러 픽셀은 평균으로 남기거나 맨 왼쪽 위의 픽셀만 남기는 등의 방법이 있지만, 일반적으로 여러 픽셀 중 최대 값만 남기는 '최대 풀링'이나 '평균 풀링'을 사용한다.
이 과정을 '특징 축소'라고 말한다.
3. 다층신경망 계층
1, 2번 계층을 거쳐 특징을 추출한 각 데이터(영상)에 대한 모든 필터를 1차원 형태(벡터)로 변환(Flatten)해서 모두 연결하고(그래서 동물의 시각 정보 체계를 모방하지 않았다고 말할 수 있다), 기존에 만든 다층신경망의 입력층에서 사용한다. 출력층에서 이미지가 분류된다.
(교수님이 1, 2번 계층을 미리 다 끝낸 뒤에 다층신경망에 적용하는 게 아니라 각 은닉층마다 이 과정을 거친다고 하셨는데, 둘이 뭐가 다른거지?)
CNN은 특정 단어가 어떤 단어와 관련이 있는지를 알아내는 Text classification에도 사용하고, 알파고가 어떤 바둑돌이 놓였는지, 놓이지 않았는지 구분하기 위해서도 사용했다고 한다.
'엔트리 > 심화' 카테고리의 다른 글
MacOS) 에서 아나콘다를 사용하지 마세요 (0) | 2021.03.24 |
---|---|
코랩) Flask 로컬 서버 접속하는 법 (0) | 2021.03.13 |
단층신경망에서 다층신경망으로 (0) | 2020.10.25 |
인공신경망과 경사하강법 그리고 직선의 방정식 (0) | 2020.10.17 |
머신 러닝과 파이선 (0) | 2020.10.13 |