이미지 분류를 위한 합성곱 신경망 개념 잡고가기

합성곱 신경망 자세히 알아보기

보통 딥러닝에서 이미지를 분류한다고 했을 때 합성곱 신경망을 이용하게 됩니다. 이때 사용하는 합성곱 신경망에 대해서 자세하게 알아보려고 합니다. 이 글 하나로는 충분하지 않을 수 있지만 시작합니다. 합성곱 신경망은 완전 연결 신경망에 비해서 가중치가 훨씬 작지만 이미지 분류 문제에 더 적합하고 최적화가 되어있습니다. 합성곱, 풀링 연산, 합성곱 신경망의 구조, 케라스를 이용하는 방법 순서로 진행을 해보도록 하겠습니다. 먼저 합성곱 연산입니다. 이것을 알려면 교차 상관 연산에 대한 지식이 필요합니다. 먼저 합성곱은 두 개의 함수에 입혀서 새로운 함수를 만들어내는 수학 연산자라고 생각하시면 되겠습니다. 사실 관련된 이미지가 있으면 이해가 편하지만 지금은 글로만 진행하도록 하겠습니다. 먼저 배열 하나를 떠올려 보시기 바랍니다. 엑스 배열과 더블유 배열이 있을 때, 두 개의 배열 중에서 원소수가 제일 적게 분포한 배열 더블유의 원소 순서를 뒤집는 연산을 수행한다고 생각하시기 바랍니다. 뒤집는 연산은 reverse 연산이라고 보통 알고 계실 겁니다. 뒤집으셨나요? 그다음은 뒤집은 배열을 엑스 배열의 왼쪽 끝에 같이 맞닿게 해 주시기 바랍니다. 그리고 각 원소끼리 곱셈을 해서 더해주면 됩니다. 이때 1대 1로 대응되지 않는 것은 무시하시고 대응이 되는 수만 곱셈에 포함시키면 됩니다. 다음으로는 뒤집었던 더블유 배열을 오른쪽으로 한 칸 이동시켜 보시기 바랍니다. 이후에 각 배열의 원소끼리 곱하고 더해보시기 바랍니다. 그런 식으로 반복하면 아까는 대응이 되지 않았던 것들까지 곱셈이 전부 되면서 값이 나오게 됩니다. 즉 9개의 원소를 가진 엑스 배열과 4개의 원소를 가진 더블유를 곱한다고 했을 경우에 대응되는 수를 곱하면서 옆으로 이동시키며 계산하므로 총 6개의 값이 나오게 됩니다. 혹시 눈치를 채셨나요? 이게 바로 합성곱의 전부랍니다. 그렇게 어려운 개념은 아닌데요? 그러면 이제 합성곱을 구현을 해보면서 실습을 해보시면 되는 데 사용하는 프로그래밍 언어는 파이썬으로 하며 넘 파이 라이브러리를 사용해서 아까 설명했던 더블유와 엑스 배열을 만드시면 됩니다. 그리고 뒤집기의 경우 넘 파이에서 flip() 함수를 사용하면 되므로 참고하세요. 또는 파이썬의 기본 연산자인 슬라이스 연산을 통해서도 가능합니다. 이후 반복문을 돌면서 하나씩 이동하며 점곱을 수행하면 완성입니다. 또 다른 방법은 싸이 파이 라이브러리를 사용하는 것입니다. 싸이 파이는 합성곱에 사용하는 convolve() 함수를 제공하고 있습니다. 이 함수를 사용하면 간단하게 합성곱의 값을 구할 수 있습니다. 그런데 사실 합성곱 신경망에서 합성곱을 쓰지 않아요. 많은 라이브러리들은 합성곱을 쓰는 것이 아니라 그저 교차 상관을 적용하고 있습니다. 그래서 아까 교차 상관 또한 알고 있어야 한다고 말씀을 드린 것이었습니다. 교차 상관은 합성곱이랑 매우 비슷합니다. 하지만 배열을 reverse 하지 않는다는 점이 차이점입니다. 그냥 원본 배열을 곱하는 것이죠. 싸이 파이에서는 correlate() 함수를 이용하면 쉽게 사용이 가능합니다. 그렇다면 왜 합성곱 신경망이라고 하면서 합성곱을 쓰지 않고 라이브러리들은 왜 교차 상관을 사용하는 것일까요? 왜냐하면 딥러닝 모델을 훈련시킬 때 가중치 배열을 초기화하는 과정에 있습니다. 모델을 훈련하는 과정을 간단하게 설명드리도록 하겠습니다. 먼저 훈련 전에 가중치들은 무작위로 세팅됩니다. 그리고 모든 데이터에 대해서 정방향과 역방향 계산을 통해서 가중치를 업데이트시킵니다. 이때 업데이트하는 것을 우리는 학습이라고 부르는 것입니다. 모든 모델이 훈련하기 전에 이러한 과정을 거치게 됩니다. 그렇기 때문에 합성곱 신경망에서도 해당이 되는 문제입니다. 좀 전에 설명드린 한 칸씩 이동시키는 배열이 즉 여기서 가중치 역할을 하는 것입니다. 무작위로 초기화되기 때문에 뒤집어서 사용하거나 안 뒤집거나 상관이 없는 일입니다. 하지만 현재는 관습적으로 합성곱이 아닌 교차 상관이 사용되는 것이라도 합성곱 신경망이라고 부르고 있으니 이점을 꼭 염두에 두시고 사용하시는 것이 좋습니다. 다음은 패딩과 스트라이드에 대해서 알아보도록 하겠습니다. 패딩은 많이 들어보신 분이 계실 겁니다. html에서도 사용되는 용어이기도 하죠. 말 그대로 빈 공간을 주는 작업을 말하는데, 여기서는 배열의 양 끝에 비어있는 원소를 추가하는 것입니다. 다음은 스트라이드입니다. 스트라이드는 한 칸씩 이동시키는 배열의 간격을 조절하는 것을 말합니다. 말 그대로 한 칸씩 이동을 할 건지 두 칸씩 이동을 할 건지 정하는 것이라고 생각하면 됩니다. 패딩과 스트라이드가 어떻게 적용되는지 따라서 밸리드 패팅, 풀 패딩, 세임 패딩 등으로 각각 다르게 불리고 있습니다. 먼저 밸리드 패딩입니다. 밸리드 패딩은 원본 배열이 가지고 있는 원소가 합성곱 연산에 사용되는 기여도가 각기 다릅니다. 벨 리드 패딩은 기본적으로 원본 배열에 패딩을 넣지 않고 배열을 이동시키면서 끝까지 갈 때까지 교차 상관 연산을 수행합니다. 그러므로 나오는 결과는 원본 배열보다 항상 작은 배열이 나오게 됩니다. 원래는 모든 배열의 연산이 한 번씩 참여를 하지만 가운데 있는 원소 같은 경우에는 4번의 연산에 참여를 하게 됩니다. 즉 양 끝에 있는 배열 원소의 참여도가 낮아지게 되는 것이죠. 그래서 모두 동일한 참여를 갖도록 하는 방법이 등장합니다. 이 방법에 대해서는 다음 포스팅에서 이어서 진행하도록 하겠습니다. 감사합니다.

Leave a Comment