- 노란 글씨 : 이해 잘 안 됨
- 파란 글씨 : 이해 후 재서술
- 보라색 글씨 : 더 찾아볼만한 개념
개요
- CNN, Convolutional Neural Networks : 딥러닝에서 주로 이미지나 영상 데이터를 처리할 때 쓰이며, Convolution이라는 전처리 작업이 들어가는 Neural Network 모델.
- 왜 CNN을 사용할까? - DNN에 문제가 있었기 때문
DNN은 1차원 데이터만을 사용할 수 있다. 그러니 2차원 데이터를 DNN에 입력하려면 1차원으로 뭉개야 하고 그것으로 원본 데이터의 공간적, 지역적 정보가 손실된다. 그리고 추상화(abstractions, 다량의 데이터나 복잡한 자료들 속에서 핵심적인 내용 또는 기능을 요약하는 작업) 과정 없이 바로 연산하기 때문에 비효율적이다.
CNN은 2차원 데이터를 그대로 사용할 수 있다. 원본 데이터의 공간적, 지역적 정보를 보존한 채로 그 이미지의 특성을 층층이 쌓아간다. CNN은 전체보다는 부분, 그리고 부분에서도 각 픽셀 사이의 연관성을 알아낸다.
어떤 이미지로부터 필요한 정보를 알아낼 때(예: 이 사진이 새의 사진인가?), 반드시 이미지의 전체가 필요하지는 않다. 특징적인 일부분만 있으면 된다(예: 새의 부리). CNN이 이 특징 부분을 잘라주는 역할을 한다. 또한 특징 부분은 언제나 같은 위치에 있지는 않기 때문에 이미지의 부분부분을 잘 확인하는 게 전체를 보는 것보다 효율적이다.
원리
- 사전 개념 : 2차원 이미지는 픽셀 단위로 구성되어 있다. 가로 w, 세로 h인 이미지는 (w, h) 크기의 행렬로 나타낸다. 이 행렬을 CNN의 입력값으로 사용한다.
- 커널 : 이미지의 특징을 걸러내기 위한 필터. 입력 이미지와 마찬가지로 (n, m) 크기의 행렬이다. 이것으로 이미지를 창문 닦듯이 훑어가며 행렬 간의 내적 연산을 한다.
- 행렬 내적 : 같은 크기의 두 행렬을 놓고, 서로 같은 위치에 있는 요소끼리 곱해 모든 값을 더한다.
- 커널이 지나가고 나면 : 보통은 입력 이미지보다 작고 (1, 1)보다는 큰 커널을 사용할 테고, 그렇게 되면 커널이 지나간 후 나오는 결과 이미지는 원본보다 작아지는 것이 당연하다. (1, 1) 크기의 커널을 사용하면 이미지의 크기는 줄어들지 않을 테지만 특징을 추출하는 효과도 없다!
- 패딩 : 커널은 쓰고 싶지만 이미지의 크기는 줄이고 싶지 않을 수 있다. 그럴 때 사용하는 것이 패딩. 이미지의 주변에 0으로 채워진 테두리를 둘러 크기를 키워, 커널이 지나간 후 이미지가 줄어들어서 원래 크기가 되게 만든다.
- stride : 커널을 꼭 한 칸씩만 움직여야 한다는 법은 없다. 원한다면 두 칸 세 칸씩 움직여도 된다! 그 값을 지정하는 것이 stride. 이 값이 클수록 결과 이미지는 작아진다.
- order-3 tensor : 컬러 이미지는 R, G, B 세 가지 값으로 색이 나뉘기 때문에 3차원 행렬이 된다. 이런 모양을 order-3 tensor라고 부르는데 연산 방법은 2차원 행렬과 똑같다. 그러므로 결과 이미지는 마찬가지로 2차원 행렬이 된다.
구조
CNN은 모든 층과 노드가 연결되어 있던 DNN과는 구조가 좀 다르다. 근데 이 설명은 말로만 하면 어렵다. 자세한 설명은 아래 참고자료에서 찾자.
- 컨볼루션 층 : 이 층에서는 앞서 설명한 커널을 이용한다. 커널은 한 번에 여러 개 사용할 수 있다. 한 층에 커널이 3개 있다면 결과 이미지도 3개, 5개 있다면 결과도 5개 나온다. 이 결과에 활성화 함수를 적용해 다음 층으로 값을 넘긴다.
- 활성화 함수 : 요약하자면 선형 함수(linear function)인 컨볼루션에 비선형성(nonlinearity)을 추가하기 위해 사용한다고 한다. 내가 이해한 대로 다시 설명해보자. 우선 선형이라 함은 직선을 이른다. 수학에서 직선은 일차방정식이고, 일차방정식은 미분하면 상수가 된다. 오차 역전파는 미분이 기본인데 미분한 값이 상수가 되어버리면 입력값(x)과 출력값(y)의 관계성이 전혀 없으니 역전파의 의미가 없어진다. 참고한 글을 인용하자면 “입력 뉴런의 어떤 가중치가 더 나은 예측을 제공할 수 있는지 이해하는 것은 불가능합니다”라고 한다. 또한 이런 직선의 층이 이어져봐야 아무리 층이 많아도 결과적으로는 첫 번째 층의 선형 함수가 될 뿐이다. 그러니 (1) 오차 역전파를 수행하고, (2) 은닉층을 단순하게 만들지 않기 위해 비선형 활성화 함수가 필요하다.
- 풀링 층 : 풀링의 개념에 대해서는 지난 스터디에서 살펴본 바 있지만 다시 공부하자.
- 풀링 : 풀링은 이전 층인 컨볼루션 층에서 나온 결과 이미지의 크기를 줄이는 것이 목적이다. 이때 줄인다는 그 “크기”는 컨볼루션의 결과로 나온 이미지의 개수가 아니라 행렬의 가로 세로 크기이다. 내가 참고한 글에서는 상관관계가 낮은 부분을 지워서 이미지의 크기를 줄인다고 했다. 풀링은 대표적으로 최댓값 풀링과 평균값 풀링이 있다. 풀 사이즈(이미지를 얼마나 줄일지에 따라 다름)에 따라 나눠진 구역 안에서 최댓값만을 남기는지, 평균값을 남기는지의 차이이다.
- 필요한 만큼 컨볼루션+풀링 반복 : 과정을 거듭할수록 작고 두꺼운 데이터가 만들어진다. 행렬의 크기가 작고, 그 행렬들이 여러 개 겹쳐서 두꺼운 데이터라는 말이다.
- Flatten : 지금까지 만든 작고 두꺼운 이미지 데이터를 쭉 펼쳐 1차원 데이터로 만든다. 원본 이미지를 뭉개는 것과의 차이는, 원본 이미지는 아무 연산도 하지 않은 진짜 이미지 데이터였기 때문에 그걸 1차원으로 뭉개면 그나마 있던 특징도 다 흩어지지만, 컨볼루션 이후의 데이터는 이미지의 특징만을 모아놓은 데이터이기 때문에 형태를 바꾸어도 특징이 유지된다는 점이다. 그래서 1차원으로 바꿔도 된다.
- Dense 층과 softmax : 결과 출력을 위한 층이다. Dense 층은 하나 이상 쓰면 된다.
파라미터(Parameter)와 하이퍼파라미터(Hyper-parameter)
- 지난 스터디 복기 : 파라미터는 모델 내부에서 알아서 학습하고 설정하는 값, 내가 건드릴 수 없음. 하이퍼파라미터는 내가 사전에 정해줘야 하는 값, 모델이 건드릴 수 없으니 다른 알고리즘을 이용하거나 경험적으로 적당히 골라야 함.
- 학습 가능한 파라미터의 수
- 컨볼루션 : 커널 크기 × 커널 개수 (× 사용한 텐서 개수)
- 풀링 : 크기만 줄이기 때문에 파라미터 없음
- Dense : 이전 층의 데이터 크기에 비례함
- 결론 : 매우 많다.
- 하이퍼파라미터
- 컨볼루션 층 : 필터 개수와 크기, stride 값, 패딩 여부
- 풀링 : 풀링 방식 선택, 풀 크기, Pool stride 값(overlapping)
- Dense : 너비
- 활성함수 : ReLU, softmax, 시그모이드 등
- 오차함수 : 교차 엔트로피 계열, L1, L2
- optimizer : SGD, AdaGrad, RMSprop
- 랜덤 초기화 : Gaussian or uniform, Scaling