brunch

컨볼루션(Convolution) 이해하기

Understanding Convolutions - Chris Olah

by Chris송호연

이 글은 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는 다른 높이에서 떨어지면 다른 확률 분포가 될 수 있습니다.


ProbConv-fagb.png

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


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


ProbConv-split-21.png

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


ProbConv-splits-12-03.png


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


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


스크린샷 2017-06-22 오후 6.46.38.png


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


스크린샷 2017-06-22 오후 6.46.41.png


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


스크린샷 2017-06-22 오후 6.46.44.png


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


스크린샷 2017-06-22 오후 6.46.47.png


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


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


ProbConv-OnePath.png

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

ProbConv-SumPaths.png



컨볼루션 시각화하기

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

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


ProbConv-Reverse.png


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

ProbConv-BackProb.png

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

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

ProbConv-Intermediate.png


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


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

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


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


ProbConv-Intermediate-Align.png

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

ProbConv-Intermediate-Sep.png

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

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


Wiki-BoxConvAnim.gif

위키 백과


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


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


높은 차원의 컨볼루션

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

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



ProbConv-TwoDim.png

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

스크린샷 2017-06-13 오후 10.18.18.png

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

스크린샷 2017-06-13 오후 10.18.22.png


또는 표준 정의에서 :

스크린샷 2017-06-13 오후 10.18.25.png

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


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



RiverTrain-ImageConvDiagram.png

River Trail 문서에서

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

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


Gimp-Blur.png

Gimp 문서에서 파생됩니다.

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


Gimp-Edge.png

Gimp 문서에서 파생됩니다.

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


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

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

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


Conv-9-Conv2-XY.png


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

스크린샷 2017-06-22 오후 6.47.57.png


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

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


스크린샷 2017-06-22 오후 6.48.00.png


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


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


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

스크린샷 2017-06-22 오후 6.48.03.png


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

스크린샷 2017-06-22 오후 6.48.05.png


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

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


Conv-9-Conv2-XY-W.png


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


스크린샷 2017-06-22 오후 6.48.08.png


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


스크린샷 2017-06-13 오후 10.23.41.png


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

스크린샷 2017-06-13 오후 10.23.46.png


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

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


Conv2-5x5-Conv2-XY.png

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

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


결론

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


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


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

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


이 시리즈의 다음 게시물

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


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


감사 인사

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

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


keyword
작가의 이전글Conv Net: 모듈 방식의 관점