이번 글은 다음 링크를 참고로 작성되었습니다.
http://sanghyukchun.github.io/75
http://cs231n.github.io/convolutional-networks
이제 본론으로 들어가서 알파고의 convolutional neural network에 관해 설명 드리겠습니다. 지난번에도 말씀드렸지만, 오래 전에 전공했던 터라 잘못된 부분이 있을 수 있으니 지적 부탁드립니다.
신호처리, 특히 영상처리(image processing)을 공부해보신 분들은 영상필터라는 용어에 익숙하실 것입니다. 영상필터를 간단히 설명하면 이런 것입니다.
위의 그림은 레나 라고 하는, 이미지 처리분야에서 제일 유명한 아가씨의 사진에 필터를 적용한 결과를 보여줍니다. (레나는 유명한 분이고 이분에 대해서 더 설명해드리고 싶지만 다른 이야기이므로 다른 기회에 설명해드리겠습니다. 참고로 전신샷이 더욱 매력적인 분입니다.)
그림에서 보여지듯이, 출력영상의 각각의 픽셀값은 입력영상에서 대응되는 픽셀 위치 주변에 kernel이라는 필터를 적용하여 계산한 값이 됩니다. 즉 output image에서 동그라미가 쳐진 4라는 값은 input image에서 동그라미가 쳐진 2라는 픽셀값과 그 주위 픽셀값 8개에 대하여 다음 연산을 통해 나온 값입니다. (input image에서 화살표에 가려진 픽셀의 숫자는 2입니다)
1/9 * 2 + 1/9 * 2 + 1/9 * 4 +
1/9 * 2 + 1/9 * 2 + 1/9 * 5 +
1/9 * 5 + 1/9 * 5 + 1/9 * 5 = 4
다 쓰고 나니 위의 이미지에도 같은 수식이 있어서 기분이 상했네요. 어쨌든 이 필터는 특정 위치의 출력픽셀 값을 대응하는 위치의 입력픽셀 값 및 그 주변 8개의 값들의 평균값으로 만듭니다. 이는 마치 포토샵의 블러(blur) 효과처럼 영상이 흐릿해진 효과를 냅니다. 영상 처리 필터는 이외에도 여러 가지가 있습니다.
위와 같이 어떤 kernel(필터)를 택하느냐에 따라서 입력영상에 대한 여러 가지 출력영상이 나올 수 있으며, 이런 처리를 함으로써 입력영상의 특징을 더 잘 포착하거나, 입력영상에 대한 잡음을 제거하는 것이 가능합니다.
인공 신경망을 이용하여 영상인식을 하고자 할 때 어떤 영상필터를 사용하여 특징을 잡아내는 것이 좋을까요? 어떤 영상필터가 가장 효과적일지 결정하는 것은 쉬운 문제가 아닐 것입니다. 그렇다면 차라리 인공 신경망이 어떤 필터를 사용할지 결정하도록 하는게 하는 것은 어떨까요. 이것이 바로 convolutional neural network의 아이디어입니다.
위의 그림에서는 지금까지와는 방향이 반대로 x가 입력단, s가 출력단입니다. 오른쪽 신경망에서 모든 입력단계의 노드들이 출력단계의 노드들과 연결되어 있는 것에 비해, 왼쪽 신경망에서는 각각의 출력노드들이 특정 입력노드들 하고만 연결되어 있는 것을 볼 수 있습니다. 즉 s1은 x1, x2와, s2는 x1, x2, x3와, s3는 x2, x3, x4와, s5는 x4, x5와 연결되어 있습니다. 각각의 출력 노드들은 대응되는 입력노드 및 주변 2개 노드들의 값을 이용하여 계산되는 것입니다. 단, s1와 s5는 가장자리이므로 두 개의 입력값을 갖습니다. 그리고 각각의 연결선에서의 계수값들은 아래와 같이 서로 연관되어 있습니다.
x1과 s2사이 계수 = x2와 s3사이 계수 = x3와 s4사이 계수 = x4와 s5사이 계수
x2와 s2사이 계수 = x3와 s3사이 계수 = x4와 s4사이 계수 = x5와 x5사이 계수
x2와 s1사이 계수 = x3와 s2사이 계수 = x4와 s3사이 계수 = x5와 s4사이 계수
이와 같은 상황을 일반화해서 그려보면 위의 그림이 나옵니다. 위의 그림에서 색이 같은 선은 같은 계수값을 가지는 연결을 의미합니다. 이렇게 각 노드 사이의 연결이 제한되어 있고, 또 연결들끼리 계수값을 공유하게 되어있는 특징을 sparse weight, tied weight 라고 합니다. 이는 convolutional neural network의 중요한 요소들이며 complexity를 줄여서 overfitting을 방지하는 역할을 합니다.
이렇게 만들어진 인공신경망을 잘 음미해보면, 영상신호에 필터를 적용하는 것과 크게 다르지 않음을 알 수 있습니다. 아래의 그림은 영상인식에 이러한 구조를 적용한 것을 보여줍니다.
먼저 Y채널(밝기정보) 추출, contrast normalization된 32x32 이미지가 5x5 필터 8개(필터값들이 숫자 대신 밝기값으로 표현되어 있습니다.)에 의해 8개의 특징 이미지를 형성하는 것을 볼 수 있습니다. 자세히 보면 필터를 거치고 난 이미지, 즉 인공 신경망의 두번째 layer의 노드값에서도 원래 이미지의 특징들을 엿볼 수 있습니다. 물론 저 필터들은 인공신경망의 계수값들로, training에 의해 자동으로 생성되었을 것입니다.
자, 이제 드디어 알파고의 convolutional neural network 구조입니다. 논문에서는 19x19개(바둑판의 착수점 개수)의 바이너리 정보를 하나의 plane이라고 표현하는데, 입력층은 이러한 plane 48개로 구성됩니다. 왜 48개인지는 지난번에 설명 드린 표를 다시 한번 보는 것이 이해가 빠를 것입니다.
이러한 19x19 바이너리 plane 48개에 5x5 필터를 적용하여 두 번째 layer가 생성됩니다. 이때 두 번째 layer의 plane 수는 192개로 늘어나는데, 이는 아마도 입력 plane 하나당 4개, 총 192개의 필터를 적용한 것으로 생각됩니다. (48*4 = 192) (참고로 논문에서 필터의 수를 128, 192, 256, 384개로 테스트해 보았을 때 192개인 경우가 가장 성능이 좋았다고 합니다. 128처럼 48의 배수가 아닌 경우는 어떻게 했는지 잘 모르겠네요. 중요하다고 생각되는 plane과 그렇지 않은 plane을 필터 개수에서 차별을 두는 식이 아니었을까 합니다.) 그 다음 layer 부터는 3x3 필터를 적용하여 해당 layer 다음 layer의 노드들을 형성하게 됩니다. 당연히 이러한 필터들은 training에 의해 구해진 인공신경망 계수값들로 구성되어 있습니다. 정책망의 마지막 layer에서는 1x1 필터 한 개와 활성함수를 거쳐서 착수점 전체에 대한 확률분포가 출력되고, 가치망에서는 fully-connected된 256개의 노드를 거치고 활성함수를 지나서 하나의 값이 나오게 됩니다. 사실 정책망의 마지막 layer는 어떤 구조인지 잘 모르겠습니다. 그 전 layer에서 19x19 plane이 192개 존재할텐데, 여기에 1x1 필터 한 개를 적용해서 19x19 plane 1개가 나오는 상황이 잘 이해가 안가네요. 혹시 이해하신 분 있으면 설명 부탁드립니다.
위의 그림은 출력단의 특정 위치의 값이 그 전 단계의 어느 노드들에 의해 정해지는지를 시각적으로 보여줍니다. 12번째 layer의 가장 좌측 최상단 모서리 자리를 편의상 (1,1)이라고 부를 때, (1,1)의 값은 11번째 layer의 (1,1), (1,2), (2,1), (2,2) 노드값에 필터를 적용하여 결정됩니다. 3x3 필터가 적용되므로 그 전 layer의 노드값 9개로 구성되어야 하지만, 모서리 자리이므로 부족한 부분은 0으로 설정되어 계산됩니다. (zero padding) 11번째 layer의 (2,2) 위치의 값은 10번째 layer의 (1,1), (1,2), (1,3), (2,1), (2,2), (2,3), (3,1), (3,2), (3,3) 위치의 노드값에 필터를 적용하여 결정됩니다. 이렇게 반복하여 입력단까지 가 보면, 가장 좌측 최상단 위치에 돌을 놓을 확률에 대한 계산은 입력단에서 좌측 상단 13x13 영역의 정보에 의해 결정됨을 알 수 있습니다. 반대로 입력단의 가장 좌측 최상단 위치의 정보가 출력단에서 얼마나 많은 영역의 확률에 영향을 미치는지도 그려보면 좌측 상단 13x13 영역임을 알 수 있습니다. 또한 바둑판의 중앙 부위는 필터에 의해 상하좌우로 영향이 확장되어 가므로, 중앙 부위 입력단은 출력 전체에 영향을 주고 중앙 부위 출력단은 입력 전체에서 영향을 받을 것으로 생각됩니다.
알파고의 convolutional neural network 설명은 여기까지입니다. 다음 글에서는 알파고가 사고한다고 간주할 수 있는지, 제가 느낀 바를 정리해보도록 하겠습니다. –꼐속