발제를 위해 만들었던 ppt를 이용해 CNN에 대해 정리해보고자 한다
자료는 앤드류응 교수님의 CNN 강의를 참고했다.
Computer Vision and Deep learning
본격적인 내용에 들어가기에 앞서서 이제 이 CNN 이 어떻게 등장하게 되었는지 , 간단히 컴퓨터 비전을 통해서 한번 살펴보자. 이 컴퓨터 비전은 말그대로 컴퓨터가 사진이나 영상을 즉 이 미지 이용을 해서 하는 모든 것들을 일컫는 말이고 최근 딥러닝의 발전 영역에 있어서 가장 두각 을 나타내는 그러한 분야 중에 하나다.
이 컴퓨터 비전은 이제 얼굴인식이나 예술 등 분야를 가리지않고 다양한 곳에서 응용이 되고 있는데,
대표적으로 주로 다루는 문제 세가지를 살펴보자.
- 첫 번째로 어떤 사진이 들어왔을 때 여기서는 고양이 사진을 예시로 들었는데 이러한 고양이 사진이 들어왔을 때 컴퓨터가 이 사진이 고양이인지 아닌지를 분류해내는 이미지 분류 문제가 있다.
- 다음으로 최근 자율주행 자동차와 같은 곳에 쓰이는 Object detection 즉 객체 인식 문제.
- 마지막으로 다음과 같이 두 가지의 그림을 이용을 해서 새로운 스타일을 만들어 내는 Neural Style Transfer 문제같은 것들이 있다.
그런데 이 컴퓨터 비전 문제의 가장 큰 장애물 중 하나는 입력이 매우 커질 수 있다는 것이다.
예를 들어 위와 같이 64 x 64 x 3 의 이미지가 있다면 입력값 x 는 12288 의 크기를 가지게 되는데, 이것은 굉장히 작은 사진이기 때문에 큰 문제가 되지는 않지만 만약 아래와 같이 다루게 되는 이미지가 더 큰 이미지가 된다면 즉 예를 들어 1000x 1000 x 3 의 크기라면 입력 크기 x 가 3 백만이 라는 매우 큰 수가 되고 여기 들어가는 x 는 3 백만의 차원을 가지게 된다.
이때, 첫번 째 히든 레이어에 서는 1000 개정도의 hidden unit 이 있을 수 있고 전체의 가중치 를 w1 이라고 한다면 이 w 행렬은 1000 x 3 백만이 되어서 삼십억개의 파라미터를 가지게 된다.
=> 이것은 아주 큰 수이기 때문에 계산 속도나 메모리 혹은 오버피팅 같은 부분에 있어서도 큰 장애물이 될 수 있습니다. 오늘 살펴볼 CNN 은 이러한 이미지의 크기에 대해서 고민하지 않아도 되는데, 이제 그 메 커니즘이 어떻게 이루어지는데 한번 살펴보자.
Convolution Operation
우선 cnn은 컴퓨터가 이미지를 받아들이고 해석하는 과정을 인간이 이미지를 받아들이고 해석하는 과정에서 아이디어를 얻어서 구축한 인공 신경망 구조다. 따라서 인간의 대뇌 시각피질 에서 이루어지는 것과 같이 신경망의 하위층에서는 Edge와 같은 비교적 간단한 것들을 감지를 하게 되고 점점 신경망 상위 층으로 갈수록 high level의 feature들을 인식해 나가게 된다. 그리고 이러한 과정을 이제 convolution이라는 메커니즘으로 구현을 해나가게 된다.
즉, 앞에서 언급했듯이 이제 컴퓨터에 어떤 input image가 들어오게 되고 이것을 인식을 할 때 가장 처음으로 하는 일이 바로 Edge를 인식하는 일이되고, 그림과 같이 수직, 수평의 Edge들을 찾는 것부터 시작을 하게 된다.
Filter
이러한 Edge를 찾아내는 역할을 하는게 바로 Filter이다. (Filter는 kernel이라고 불리기도 하는데 일단 여기서는 filter라는 단어를 사용) 이제 이 filter가 어떻게 엣지를 감지를 해내냐 하면은 바로 convolution operation 즉 합성곱 연산을 수행함으로써 엣지들을 찾아내게 된다. 예시를 통해서 이 과정이 어떻게 이루어지는지 살펴보자. 우선 이미지의 왼쪽에 위치한 6x6의 이미지가 input이미지로 이때 이미지는 gray scale이라고 가정을 해서 rgb값은 1이 된다. 이때 이 input이미지의 vertical edge즉 수직 엣지를 찾아내주는 필터가 가운데에 보이는 이 3x3 크기의 필터다. 이제 이 3x3 filter가 input image와 합성곱 연산을 수행하면서 4x4 크기의 out put이미지를 내게 되는데요 이 합성곱 연산은 다음과 같이 이루어 진다.
우선 이 필터의 첫번째 위치는 다음과 같이 위치하게 된다. 이렇게 필터가 적용되었다면, 이제 필터와 해당 필터에 해당하는 만큼의 input이미지의 원소들 각각을 곱해준뒤 모두 더해주게 되고, 따라서 3X1, 1X1,2X1~ 2x-1 까지의 값들을 모두 더하고 그 값이 바로 output 이미지의 첫번째 원소가 된다.
이제 다음과 같이 필터를 한칸 옆으로 옮기게 되고 같은 과정을 반복해 주면 output image에서 두번째 원소는 이렇게 -4가 되고 이런식으로 같은 방법으로 필터를 한칸씩 옮기며 반복해서 계산을 해준다.
이렇게 필터가 수평으로 움직이다가 마지막까지 이동했다면, 이제 한칸 아래로 내려가 계산을 다시 수행하게 된다.
이렇게 filter가 가장 아래의 마지막까지 움직여서 output이미지의 원소를 모두 채워주게 되고 이 값이 바로 output image가 된다. 이때 우리는 vertical edge를 감지해내는 필터를 이용했기 때문에 output image는 input image의 수직 엣지라는 특성을 추출한 이미지가 된다.
좀 더 직관적으로 이 수직 엣지를 찾아낸다는 것이 어떤 의미인지 예시를 통해서 살펴보도록 하자.
이번에 input이미지는 외쪽에 보이는 6x6의 이미지이고 만약 사진으로 생각한다면, 왼쪽의 10은 더 밝은 픽셀이고 오른쪽은 어두운 픽셀이다. 또한 눈으로 보기에도 이 이미지는 확실히 가운데에 분명한 세로 경계선이 생기는 것을 확인할 수 있다. 그래서 바로 이 이미지에 바로 전에 살펴봤던 vertical edge를 검출해내는 필터를 적용을 해보자. 이 3x3 필터는 전과 마찬가지로 위에 보이는 것처럼 1과 0, -1로 이루어질 것이고 이 필터를 적용해 합성곱 연산을 수행한 결과는 오른쪽과 같은 이미지가 나오게 된다. 그래서 이 오른쪽의 행렬을 이미지로 나타내면 행렬 아래의 이미지이다.
밝은 영역이 가운데에 있고, 이부분은 6x6 이미지의 세로 경계선에 해당하는 부분이 된다. 비록 크기가 잘 안맞고 검출된 경계선이 조금은 두껍지만, 지금은 괴장히 작은 이미지를 예로 하고 있기 때문이고 아마 몇천 x 몇천 이미지를 사용하게 되면, 꽤나 정교하게 수직 경계선을 찾아낼 수 있게 되는 것이다. 만약 input이미지에서 밝은 부분과 어두운 부분이 바뀌게 되면, 두번째 예시와 같이 output 또한 픽셀의 밝기가 변화하게 된다
이외에도 수평 엣지를 찾아내는 horizontal 필터, 그림에는 넣지 않았지만 대각선 방향의 경계 검출에 강한 소벨 필터 등 윤곽선 탐지를 위해 사람들이 연구한 여러가지의 필터들이 존재한다. Horizontal이라고 쓰여진 필터는 바로 수평 경계를 찾아내는 horizontal filter 가 된다.
방금 살펴본 것과 같이 다양한 필터들이 존재하지만, 우리는 어떤 이미지가 주어졌을 때, 그 이미지에서 윤곽선을 검출하기 위해서 filter를 직접 설정해줄 필요는 없다. 우리는 이 filter의 원소 여기서는 3x3 필터이기 때문에 총 9개의 원소를 파라미터로 설정을 해준 뒤 backpropagation을 이용해서 스스로 학습해 나가면서 최적의 filter를 찾아 나가도록 하면 된다!!
Padding
이렇게 방금 살펴본 filter를 적용을 해서 convolution 연산을 통해 어떤 feature를 추출을 하는 과정을 살펴봤는데, 단순히 이렇게 filter로 convolution을 하는 과정에서는 몇가지 문제가 발생을 한다.
어떤 문제냐면, 위의 예시를 보면 input image가 4x4의 크기인데, 이 이미지를 3x3의 크기를 가진filter를 이용해 convolution을 진행해주게 되면, output의 크기는 input의 크기 n=4, filter의 크기f=3으로 아래의 공식을 통해 2x2크기가 되는데 이것은 원래 input보다 size가 축소가 된 크기가 된다.
또한 convolution 연산 특성상, 가장자리에 위치한 pixel들은 output의 원소를 계산할 때 덜사용되기 때문에, 가장자리의 정보가 손실된다는 문제점이 있다.
이러한 문제점을 해결하기 위해 사용하는 것이 바로 padding이다. 패딩이란, 합성곱 연산을 수행하기 전에 입력데이터 즉 이미지의 주변을 (주로 0을 많이 사용하는데) 특정값으로 채우는 기법이다. 위에 보이는 예시가 바로 padding을 1로 했을 때의 input이미지로, 기존에 4x4였던 input size가 이렇게 주위에 한겹의 padding을 해줌으로써 6x6의 크기로 바뀌게 되고, 이때p=1이라는 값을 아래 공식에 넣어주게 되면 4 + 2 – 3 +1로 output이 기존 input크기와 동일한4x4가 되는 것을 볼 수가 있다. 이때 output과 input의 크기를 같게해주는 p는 n+2p-f+1 = n 이라는 공식을 통해 (f-1)/2라는 값이 된다.
다음으로 살펴볼 용어는 stride다. 지금까지는 filter를 input image에 적용할 때 한 칸씩 옆으로 이동을 하면서, output의 값을 계산을 해주었는데, stride는 바로 이 filter가 한번 움직일 때 얼만큼 움직일 것인가를 정해주는 값이 된다.
즉 예를 들어서 위의 예시에서는 stride 값을 2로 설정을 해주었는데 그 뜻은 여기서 filter가 시작을 해서 계산을 한 뒤에, filter가 다음과 같이 두칸씩 움직여서 다음 원소를 계산하게 된다는 뜻이 된다. 따라서 OUTPUT이미지의 크기를 구하는 수식에 이제 stride 값인 s값까지 추가되어서 다음과 같이 n + 2p –f / s +1의 크기를 가지게 된다 !
Summary of convolutions
그래서 지금까지 나온 용어들을 정리해보면 nxn의 image에 p만큼의 padding을 해주고 fxf 크기의 filter를 이용해서 s만큼의 stride를 통해 output이미지의 크기를 계산해주면 다음과 같은 공식이 나오게 된다.
Convolutions over volumes
이렇게 지금까지는 gray scale의 이미지를 이용한다고 가정해서 2d이미지에서의 합성곱방식을 살펴봤는데, 이번에는 3d 즉 입체형에서의 합성곱에 대해서 한번 살펴보자. 2d와 크게다르지는 않기 때문에 간단히 예제를 살펴보고 넘어 가면 된다.
우선 입력 데이터가 다음과 같이6x6x3의 RGB 이미지로 여기서 3은 세개의 색상 채널에 해당하게 되고, 이제 이걸 3개의 6X6이미지 더미라고 볼 수도 있다. 이때 차례대로 앞의 6을 높이, 뒤의 6을 넓이, 마지막 3은 채널의수라고 하며 이런 3D 이미지의 다른 특성들을 알아보려면, 이전의 3X3 필터(2d) 대신 3D 필터를사용해야 한다. 따라서 이번에는 필터가 3X3X3의 크기를 가질 것이고 필터 자신도 빨, 초, 파에 해당하는 세개의 층을 가지게 된다. 마찬가지로 필터도 높이와 넓이와 채널의 수를 가지게 되는데, 이때 중요한 것이 input 이미지의 채널수가 필터의 채널 수와 일치해야 한다는 것이다.
이제 이 3D 필터를 이용해서 Convolution을 진행하게 되는데, 이때 이 세개의 행렬을 쌓은 것같이 생긴 필터를 단순화 시켜서 삼차원의 정육면체로 나타낼 수 있다. 이 정육면체를 2d와 마찬가지로 왼쪽 위에서부터 위치하게 만들어주고 빨간색, 초록색, 파란색 채널에 해당하는 각각의수를 즉 3x3x3 필터의 27개의 원소들과 input이미지의 해당 부분 27개 원소들을 다 곱해서 더해주는 convolution을 진행해주고 그 값이 output image의 첫번째 원소의 값이 된다.
이런 식으로 2dconvolution과 마찬가지로, 한칸 씩 옆으로 이동하며 전체 convolution을 진행해주게 된다. 그렇게 되면 최종적으로는 채널이 3개인 필터와 인풋이미지를 사용했지만 output은 4x4의 2d의결과 이미지를 얻게 된다. 또한 이런 filter를 이용할 때, 빨간색 채널의 윤곽선을 검출할 때 이 첫번째 필터를 앞에서 봤던 horizontal이나 vertical 필터로 이용을 하고, 뒤의 필터들의 원소들을 모두 0으로 해주면 우리는 빨간색 채널의 윤곽선을 검출해볼 수 있다. 또는 만약 세로 윤곽선이 어떤 색이던지 관계 없다면, 필터의 세 채널 모두 같은 윤곽선 검출 필터를 넣어주면 된다.
그런데 이때 우리가 만약 세로 윤곽선만 찾고 싶은 것이 아니라 세로와 가로 윤곽선 모두 또는, 45도 혹은 70도 기울어진 윤곽선을 찾고싶을 수도 있는데, 다시 말해서 여러 개의 feature들을 동시에 추출하고 싶을 수 있다. 그럴 때는 이제 filter를 여러 개 이용을 하게 되는데, 즉 여기서는 예를 들어 노란색 필터가 vertical edge 주황색 필터가 horizontal edge를 감지하는 필터라고 하면, 이렇게 각각의 노란색 주황색 필터와 input image를 convolution을 해주고 그렇게 해서 나온 이 4x4의 output image들에서 첫번째이 output을 앞쪽에 두고, 두번째 필터의 결과를 그 뒤에 놓는다. 그래서 두개를 쌓게 되면 최종적으로 4x4x2 크기의 결과를 얻게 된다.
따라서 정리를 해보면, 우리가 n x n x nc 크기의 input image를 이용을 하고(이때 nc는 채널의 수를 의미) 그리고 filter는 nc와 동일한 크기의 채널의 수를 사용해야하기 때문에 filter의 크기는 f x f x nc가 될거고, 이때 그러한 크기의 필터를 nc 프라임개 만큼 사용을 하게 되면 다음과 같이 output의 크기는 (n-f+1) x (n – f +1) x n c 프라임이 된다. (이때 가정은 padding이0이고 stride가 1) 또한 용어에 대해 짚고 넘어가자면 여기서 채널의수는 마지막 크기를 나타내고 3d 입체형의 깊이 즉 depth라고 불리기도 한다. (그러나 신경망의깊이 때문에 혼돈이 발생할 수 있기 때문에 여기서는 채널이라고 언급)
One layer of a convolutional Network
그러면 이제 이렇게 방금 살펴봤던 3d convolution의 예시를 통해서 합성곱 신경망의 한 계층을 구성해보자!!
일단 우리가 3d convolution을 할 때 각 필터마다 다음과 같이 4x4의 이미지가 output으로 나왔는데, 이제 이것을 합성곱 신경망 계층으로 만들기 위해서는 각각에 편향을 더해주어야 한다. 편향은 실수여야하고 (파이썬 브로드 캐스팅을 통해서) 이제 각 16개의 요소에 동일한 수를 더해주고 여기에 이제 Activation 함수중에 여기서는 예를들어 이제 ReLU함수를 적용해주면 보는 것과 같이 4x4의 결과가 나오게 된다.
아래것도 마찬가지로 편향을 더하고activation함수를 거치면 또다른 4x4 결과가 나오게 되고 이것들을 쌓으면 4x4x2의 결과가 된다.따라서 이렇게 input 6x6x3에서 4x4x2로 변환된 계산이 바로 합성곱 신경망의 한계층이 되는 것이다. 이것을 만약 이제 합성곱이 아닌 전에 살펴보셨을 표준 신경망의 한계층으로 연결시키는것으로 생각하기 위해서는 이제 여기있는 input image 즉 x가 a[0]가 되는 것이고 이 a[0]에 곱해지는 weight인 w[1]의 역할을 하는게 바로 filter가 된다. 따라서 a[0]곱하기 w[1] 플러스 편향을 한게 이제 z[1]이 되는것이고 이 z[1]에 relu함수를 씌운 것이 바로 신경망의 다음층인4x4x2의 a[1]이 된다. 즉 a[0]가 a[1]이 되는 이 과정이 합성곱 신경망의 한계층을 형성하게 되는 것이다.
여기서는 두개의 필터가 있기 때문에 두개의 속성을 지니고 있지만, 만약 총10개의 필터를 가지고 있었다면, 4x4x10 크기의 결과행렬이 나올 것이다. 그리고 그때의parameter의 개수를 생각해보면 우선 3x3x3의 필터이기 때문에 27개의 파라미터를 가지고 있는데 거기에 편향을 하나 추가해줘서 총 28개의 파라미터를 가진 것이 되고, 이런 필터가 총 10개있는 거니까 파라미터는 총 280개가 된다. 즉 입력이미지의 크기가 어떻게 되던지 변수의 수는 필터의 수에 따라 고정이 되어있는 것을 알 수 있고, 아주 큰 이미지라도 적은 수의 파라미터로여러가지 속성들을 검출할 수 있게 되는 것이다.
CNN example
이제 그럼 합성곱 신경망의 단일 합성곱 층의 구성요소를 이용해서 한번 심층 합성곱 신경망의흐름을 한번 살펴보자. 여기 []꺽쇠안에 들어가는 수는 layer를 의미를 하며 보는 것과 같이 높이와 너비가 39, 채널의수가 3인 input이미지가 들어왔다. 이때 3x3x3의 필터 10개를 stride=0으로padding=0으로 convolution을 거치면 다음과 같이 높이와 너비가 37이고 채널의 수가 10인output이 나오게 되고, 이런식으로 3번의 convolution을 거치면 높이와 너비가 7이고 채널수가40인 output이 되는데, 특징을 살펴보면 신경망이 깊어질수록 높이와 너비가 비슷하게 유지되다가 깊어질수록 줄어들고 대신 채널의 수는 늘어나게 되는 것을 볼 수 있다.
이때 각 채널은서로 다른 특징 즉 feature들을 적절히 추출하도록 학습이 되기 때문에 다양한 특징들을 적절히조합해서 분류를 수행하게 된다. 이렇게 7x7x40의 결과를 최종적으로 하나의 벡터로 펼쳐주게되고 softmax와 같은 함수에 넣어 예측을 하게 된다.
여기에 전형적인 cnn의 형태는 이런 합성곱 신경망에 풀링층이 추가된 형태인데 이제 풀링층이 무엇인지 살펴보자.
Pooling
지금까지 살펴본 합성곱 층 외에도 합성곱 신경망은 풀링층이라는 것을 사용해서 표현 크기를 줄임으로써 계산 속소를 높이고 특성을 훨씬 잘 검출해낼수가 있다. 우선 풀링의 예를 살펴보고그 이유를 살펴보면, 첫번째로 위쪽의 max pooling이라는 친구를 구현한 것을 살펴보자.
방법은아주아주 간단한데 4x4의 입력을 여러 구간으로 나누어준뒤 각각의 출력은 해당 색의 구간에서최대값이 되는 방식이다. 즉 여기서는 f=2, s=2인 필터를 적용한 것과 같은데, 따라서 이 첫번째 네칸에서는 가장큰값인 9가 첫번째 원소가 되고, 다음 네칸에서는 2가 되고 이런식으로 가는 과정이바로 max pooling의 과정이다. 이때 이 max pooling의 hyper parameter는 f=2, s=2가 된다.
이게 최대 풀링의 흥미로운 점인데 f와 s가 이렇게 고정된 값이라서 학습할 수 있는 변수가 없다는 것이다. 주로 f=2, s=2가 자주 사용이 되는데, 이러한 풀링은 높이와 너비를 절반 정도만큼줄어들게 하는 효과가 있고, 아까 필터는 6x6x3을 3x3x3필터를 이용해서 콘벌루션을 하면 4x4의결과가 나왔는데 풀링은 output과 input의 채널 수가 변화하지 않는다는 특징이 있다.
이런 최대풀링을 사람들이 사용하는 주된이유는 이제 많은 실험들 속에서 성능이 좋기 때문인데,아직 아무도 그 이유를 완전히 알지는 못한다고 한다.
CNN
이렇게 해서 합성곱 신경망을 구성하는 대부분의 구성요소를 살펴봤다. 그림을 통해 살펴보면 이렇게 합성곱 신경망의 분야에서는 풀링 층에서 학습해야할 변수가 없기 때문에 합성곱 층과, 풀링층을하나의 층으로 보는 관습이 있다. 여기보이는 것처럼 신경망의 흔한 패턴은 convolution layer뒤에 풀링 층에 있고 또 몇 개의 합성곱 층 뒤에 풀링층이 있고 마지막에는 몇 개의 완전 연결층과 소프트맥스가 있는 형태이다. 이때 신경망의 대부분의 파라미터는 fully connected layer즉 완전 연결층에 있게 된다.
대표적인 CNN
지금까지 CNN 네트워크가 어떻게 계산되고 구성되는지 살펴봤는데, 이러한 CNN 구조를 이용해 지금까지 제안된 CNN 네트워크의 구성은 매우 다양하다. 이번에는 그 중에서도 특히 중요한 네트워크 두개를 소개해보려고 한다.
우선 하나는 CNN의 원조인 LeNet이다. 이 LeNet은손글씨 숫자를 인식하는 네트워크로, 1998년에 제안이 되었다. 여기 보이는 그림에서처럼 합성곱 계층과 단순히 원소를 줄여주는 역할을 하는 서브 샘프링 계층을 반복적으로 사용하고 마지막으로 완전연결계층을 거치면서 결과를 출력한다. 이 LeNet은 현재의 cnn과 비교하면 몇가지면에서 차이가 있는데 우선 활성화 함수다. LeNet은 활성화함수에 시그모이드 함수를 사용하는데 반해, 현재는 주로 ReLU를 이용한다. 또한 LeNET은 서브샘플링을 해서 중간 데이터의 크기를 줄이지만 현재는 오늘 살펴본 MAX POOLING이 주류다.
다음으로 2012년에 발표된 알렉스 넷인데, 이 알렉스 넷은 딥러닝 열풍을 일으키는 데 큰역할을 했다. 그림을 보시면 그 구성은 기본적으로 LeNET과 크게 다르지 않다. 하지만활성화 함수로 relu를 이용한다는 점, LRN이라 Local Response Normalization 즉 국소적 정규화라는 것을 실시하는 계층을 이용한다는점, 드롭아웃을 사용한다는 점에서 LEnet과 다른점들을 가지고 있다.
하지만 네트워크 구성면에서는 크게 달라지지 않았는데, 이를 둘러싼 환경과 컴퓨터 기술이 큰 진보를 이루게 되었다는 것이 이 딥러닝 발전에 큰 영향을 주었다고 할 수 있다. 즉 대량의 데이터를 얻을 수 있게 되었고, 병렬계산에 특화된 GPU가 보급되면서 연산의 속도가빨라졌기 때문에 이렇게 딥러닝 발전의 큰 원동력이 될 수 있었던 것이라고 사람들은 말한다.
이렇게 CNN에 대해서 살펴봤는데, 이 합성곱 계층, 풀링계층은 다소 복잡할 수 있지만 한번 이해하고 나면 어떻게 쓰느냐는 문제만 남기 때문에 차근차근 살펴보면 좋을 것같다. 또한 이 CNN은 이미지를 다루는 분야에서는 거의 예외 없이 쓰이기 때문에 코드를 통해서 복습도 진행하면 좋을 것 같다.
'AI' 카테고리의 다른 글
[RNN/LSTM/GRU] Recurrent Neural Network 순환신경망 (0) | 2021.11.10 |
---|---|
[정보이론] Entropy, Cross Entropy, KL-divergence 이해하기 (0) | 2021.04.19 |