brunch

You can make anything
by writing

C.S.Lewis

by Chris송호연 Jun 13. 2017

컨볼루션(Convolution) 이해하기

Understanding Convolutions - Chris Olah

이 글은 colah.github.io 의 블로그의 글을 저작자 Chris Olah의 허락을 받고 번역한 글입니다. 의 블로그의 글을 저작자 Chris Olah의 허락을 받고 번역한 글입니다.


http://colah.github.io/posts/2014-07-Understanding-Convolutions/



이전 포스트에서는 중요한 수학을 언급하지 않고 CNN에 대한 이해를 구축했습니다. 그러나 더 나아가서, 우리는 컨볼루션을 이해할 필요가 있습니다.


우리가 단지 CNN을 이해하기 원한다면 컨볼루션을 대략 이해하는 것으로 충분할 것입니다. 그러나 이 시리즈의 목적은 우리를 CNN의 개척자로 데리고 새로운 선택을 모색하는 것입니다. 그렇게하기 위해, 우리는 컨볼루션을 매우 깊이 이해할 필요가있을 것입니다.


고맙게도, 몇 가지 예를 들어보면 컨볼루션은 꽤 간단하게 이해할 수 있는 아이디어입니다.


떨어 뜨린 공의 교훈

어떤 높이에서 땅에 공을 떨어 뜨리는 것을 상상해보십시오.이 공은 오직 한 차원의 움직임만을 가지고 있습니다. 당신이 그것을 떨어 뜨렸을 때 공이 멀리 떨어졌을 때 그 공이 착륙 한 지점에서 다시 떨어 뜨릴 가능성은 얼마나 될까요?


이 내용을 좀 작게 나눠보겠습니다. 첫 번째 낙하 후, 확률 f (a)로 출발점으로부터 떨어진 단위를 착륙시킵니다. 여기서 f는 확률 분포입니다.


이제 첫 번째 낙하 이후, 우리는 공을 위로 가져 와서 처음으로 상륙 한 지점 위의 다른 높이에서 떨어 뜨립니다. 새로운 시작점에서 공을 떨어뜨려 b만큼 더 움직이는 확률은  g (b)입니다. 여기서 g는 다른 높이에서 떨어지면 다른 확률 분포가 될 수 있습니다.


첫 번째 낙하의 결과를 수정하여 공이 거리 a를 가졌음을 알게되면, 공이 총 거리 c가 가기 위해 두 번째 낙하에서 이동 한 거리도 a + b = c  인 경우에 b로 고정됩니다. 그래서이 사건의 확률은 간단하게 f (a) ⋅ g (b) 입니다.


특정한 이산적인 예를 들어 이것에 대해 생각해 봅시다. 우리는 총 거리 c가 3이되기를 원합니다. 처음으로 굴리는 경우 a = 2, 총 거리 a + b = 3에 도달하기 위해 두 번째로 b = 1을 굴려야합니다 . 확률은 f (2) ⋅ g (1)입니다.


그러나 이것이 우리가 총 거리 3에 도달 할 수있는 유일한 방법은 아닙니다. 공은 처음으로 1 만큼 굴릴 수 있고, 두번째로는 2만큼 굴릴 수 있습니다. 혹은 처음으로 0만큼 움직이고 두번째 3만큼 움직입니다. 그들이 더해서 3이 되는 한, 그것은 어떤 a와 b라도 갈 수 있습니다.



확률은 각각 f (1) ⋅g (2) 와 f (0) ⋅g (3) 입니다.


c의 총 거리에 도달하는 공의 총 확률을 찾기 위해 c에 도달 할 수있는 유일한 방법은 고려할 수 없습니다. 대신 c를 두 방울 a와 b로 나누고 각 방도의 확률을 합산하는 모든 가능한 방법을 고려합니다.



우리는 이미 a + b = c의 각 경우에 대한 확률은 간단히 f (a) ⋅g (b)라고 알고있습니다. 따라서, 모든 해를 a + b = c로 요약하면 총 우도는 다음과 같이 나타낼 수 있습니다.



우리는 컨볼루션을하고 있습니다. 특히, c로 표기된 f와 g의 컨볼루션은 다음과 같이 정의됩니다.



b = c-a를 대입하면 다음과 같이됩니다.



이것은 convolution의 표준 정의 2입니다.


좀 더 구체적으로하기 위해 공이 착륙 할 수있는 위치에 대해 생각할 수 있습니다. 첫 번째 낙하 후, 중간 위치 a에 확률 f (a) 로 상륙합니다. 그것이 a에 도착하면 c 위치에 착륙하는 확률 g (c-a) 를가집니다.


컨볼루션(convolution)을 얻기 위해 모든 중간 위치를 고려합니다.



컨볼루션 시각화하기

하나의 컨벌루션에 대해 더 쉽게 생각하게 해주는 유용한 트릭이 있습니다.

첫째, 관찰. 공이 그것이 시작된 곳으로부터 특정 거리 x에 떨어질 확률을  f (x)라고 가정하십시오. 그 후, 착륙 지점으로부터 거리 x를 시작할 가능성은 f (-x)입니다.



공이 두 번째 드롭 이후 위치 c에있는 것을 알면 이전 위치가 a 였을 확률은 얼마입니까?

따라서 이전 위치가 a 일 확률은 g (- (a-c)) = g (c-a) 입니다.

이제 각각의 중간 위치가 마지막으로 c에 도달하는 공에 기여할 확률을 고려하십시오. 볼을 중간 위치 a에 놓는 첫 번째 낙하 확률은 f (a) 입니다. 우리가 c에 도착하면 그것이 a에 있었을 확률은 g (c-a) 임을 알 수 있습니다.


우리는 a들을 합하여 컨볼루션을 얻습니다.


이 방법의 장점은 단일 그림에서 값 c로 컽볼루션 평가를 시각화 할 수 있다는 것입니다. 아래쪽 반을 이동하면 c의 다른 값에서 컨볼루션을 평가할 수 있습니다. 이것은 우리가 컨볼루션 전체를 이해할 수 있게 해줍니다.

예를 들어 분포가 일치 할 때 정점을 볼 수 있습니다.


분포 사이의 교차점이 작아짐에 따라 축소됩니다.


분포 사이의 교차점이 작아짐에 따라 축소됩니다.

애니메이션에서이 트릭을 사용하면 컨볼루션을 시각적으로 이해할 수 있습니다.

아래에서는 두 개의 상자 함수의 컨볼루션을 시각화 할 수 있습니다.


위키 백과


이러한 관점으로 무장 한 것은 많은 일이보다 직관적이되었습니다.


비 확률의 예를 생각해 봅시다. 컨볼루션은 오디오 조작에 사용되기도합니다. 예를 들어, 두 개의 스파이크가있는 함수를 사용할 수 있지만 다른 모든 곳에서는 0을 사용하여 에코를 만듭니다. Double-Spiked 기능이 슬라이드되면서 한 스파이크가 먼저 특정 시점에 도달하여 해당 신호를 출력 사운드에 추가하고 나중에 또 다른 스파이크가 발생하여 두 번째 지연 복사본이 추가됩니다.


높은 차원의 컨볼루션

컨볼루션은 매우 일반적인 아이디어입니다. 또한 더 많은 차원에서 사용할 수 있습니다.

떨어지는 공의 예를 다시 생각해 봅시다. 이제는 그것이 떨어질 때, 그것은 1 차원뿐만 아니라 2 차원에서의 위치 이동입니다.



컨볼루션은 방금 전의 예와 같습니다.

단, a, b 및 c는 벡터입니다. 더 명백하게하기 위해,


또는 표준 정의에서 :

1 차원 컨볼루션과 마찬가지로, 2 차원 컨볼루션을 다른 함수 위에 슬라이딩하여 곱하고 더하는 것으로 생각할 수 있습니다.


하나의 일반적인 응용 프로그램은 이미지 처리입니다. 우리는 이미지를 2 차원 함수로 생각할 수 있습니다. 많은 중요한 이미지 변환은 "커널"이라는 매우 작은 로컬 함수로 이미지 함수를 컨볼빙하는 컨볼루션입니다.



River Trail 문서에서

커널은 이미지의 모든 위치로 미끄러지고 새로운 픽셀을 부유하는 픽셀의 가중 합계로 계산합니다.

예를 들어 3x3 픽셀 상자를 평균하여 이미지를 흐리게 처리 할 수 있습니다. 이를 위해 커널은 상자 안의 각 픽셀에 대해 1/9 값을 취합니다.


Gimp 문서에서 파생됩니다.

또한 인접한 두 픽셀에서 -1 및 1 값을 취하여 가장자리를 감지 할 수 있습니다. 즉, 인접한 두 픽셀을 뺍니다. 나란히있는 픽셀이 비슷한 경우 이것이 대략 0입니다. 그러나 가장자리에서 인접한 픽셀은 가장자리에 수직 인 방향에서 매우 다릅니다.


Gimp 문서에서 파생됩니다.

Gimp 문서에는 다른 많은 예가 있습니다.


컨볼루션 뉴럴 네트워크(Convolutional Neural Networks)

그렇다면 컨볼루션은 CNN와 어떤 관련이 있습니까?

이전 게시물에서 논의한 것처럼 입력 {xn} 과 출력 {yn} 을 가진 1 차원 컨볼 루션 레이어를 고려하십시오.



우리가 관찰 한 바와 같이, 산출물을 투입 요소로 기술 할 수있습니다.


일반적으로 AA는 다중 뉴런이됩니다. 그러나 그것이 잠깐 동안 하나의 뉴런이라고 가정합니다.

신경망의 전형적인 뉴런은 다음과 같이 설명됩니다 :



여기서 x0, x1 ...은 입력입니다. 가중치 w0, w1, ...은 뉴런이 입력에 어떻게 연결되는지 설명합니다. 음의 가중치는 입력이 뉴런이 발사하는 것을 억제하는 반면 긍정적 인 가중치는 입력을 격려 함을 의미합니다. 가중치는 뉴런의 핵심이며, 그 행동을 제어합니다 . 여러 뉴런이 동일하다는 것은 가중치가 같다고 말하는 것과 같습니다.


이 뉴런의 배선은 모든 가중치와 어떤 것이 동일한지를 설명하고, 컨볼루션이 우리를 위해 처리 할 것입니다.


전형적으로, 우리는 개별적으로가 아니라 한 번에 한 레이어의 모든 뉴런을 기술합니다. 트릭은 가중치 행렬을 갖는 것입니다. W :


예를 들면 다음과 같습니다.


행렬의 각 행은 뉴런과 입력을 연결하는 가중치를 설명합니다.

컨볼 루션 계층으로 돌아 가면 같은 뉴런의 복사본이 여러 개 있기 때문에 많은 가중치가 여러 위치에 나타납니다.



이것들은 아래 방정식에 해당합니다 :



따라서 일반적으로 가중치 행렬은 모든 입력을 서로 다른 가중치를 가진 모든 뉴런에 연결합니다.



위의 것과 같은 컨볼루션 레이어의 행렬은 상당히 다르게 보입니다. 동일한 가중치가 여러 위치에 나타납니다. 그리고 뉴런은 많은 가능한 입력에 연결되지 않기 때문에 많은 제로가 있습니다.


위의 행렬에 곱하는 것은 [... 0, w1, w0,0 ...] 와 컨볼루션하는 것과 같습니다. 다른 위치로 미끄러지는 함수는 그 위치에 뉴런을 갖는 것에 해당합니다.

2 차원 컨볼 루션 레이어는 어떻습니까?


2 차원 컨볼루션 층의 배선은 2 차원 컨볼루션에 대응합니다.

위의 이미지에서 가장자리를 감지하기 위해 컨볼루션을 사용하는 예를 생각해보십시오. 커널을 슬라이드하고 모든 패치에 적용합니다. 이와 같이 컨볼 루션 레이어는 이미지의 모든 패치에 뉴런을 적용합니다.


결론

우리는 이 본문에서 많은 수학적 접근법을 도입했지만, 우리가 배운 것이 무엇인지 분명하지 않을 수 있습니다. 컨볼루션은 분명히 확률 이론과 컴퓨터 그래픽에서 유용한 도구이지만 컨볼루션 측면에서 컨볼루션 신경망을 표현할 때 무엇을 얻을 수 있습니까?


첫 번째 장점은 우리가 네트워크의 배선을 설명하는 데 매우 강력한 언어를 사용한다는 것입니다. 지금까지 다루어 왔던 예제는이 이점이 명확 해 지도록 충분히 복잡하지는 않았지만 컨볼루션은 우리에게 엄청난 양의 불쾌한 서적을 없애줍니다.


두 번째로, 컨볼루션에는 상당한 구현 이점이 있습니다. 많은 라이브러리가 매우 효율적인 컨볼루션 루틴을 제공합니다. 또한, 컨볼 루션은 오히려 깊은 수학적 통찰력을 사용하여 O (n^2)  연산 인 것처럼 보이지만 O (nlog (n)) 구현을 생성하는 것이 가능합니다. 우리는 미래의 게시물에서 훨씬 더 자세하게 논의 할 것입니다.

실제로 GPU에 대한 고효율 병렬 컨볼 루션 구현은 컴퓨터 비전의 최근 발전에 필수적이었습니다.


이 시리즈의 다음 게시물

이 게시물은 CNN과 그 일반화에 대한 시리즈의 일부입니다. 처음 두 게시물은 깊은 학습에 익숙한 사람들을 대상으로 검토되며 이후에는 모든 사람들이 관심을 가져야합니다. 업데이트를 받으려면 RSS 피드를 구독하십시오!


아래 또는 옆에 의견을 말하십시오. 풀 요청은 github에서 만들 수 있습니다.


감사 인사

나는 컨볼루션에 대한 광범위한 토론과이 글 작성에 도움을 주신 Eliana Lorch에게 매우 감사드립니다.

마이클 닐슨 (Michael Nielsen)과 다리오 아 모디 (Dario Amodei)도 그들의 의견과 지원에 감사드립니다.


브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari