
1957년, Frank Rosenblatt에 의해 Mark1 Perceptron 기계가 개발되면서 최초로 퍼셉트론 알고리즘이 구현되었다. 이를 통해 가중치 W를 업데이트하는 update rule이 발생하였다.
1960년, Widrow와 Hoff에 의해 다중 퍼셉트론 네트워크인 Adaline/Madaline이 발명되었다.
1986년, Backpropagation이 처음 도입되었고 이를 통해 연쇄 규칙을 통한 가중치 업데이트 방식을 사용해 신경망을 학습하기 시작하였다.
2006년, 심층 신경망을 효과적으로 훈련시킬 수 있음을 보여주었다. 역전파가 수행 가능하도록 RBM을 이용해 신중하게 초기화하였고 은닉층에서 가중치가 학습되었다. 각 레이어를 반복적으로 훈련하여 초기화된 가중치를 얻기 때문에 모든 은닉층을 얻은 다음 이를 사용해 전체 신경망을 초기화하고 그 이후에 backpropagation을 수행하거나 미세 조정을 하였다.
2012년, 광범위하게 신경망이 사용되기 시작하였고 이때부터 CNN이 널리 사용되기 시작하였다. 음성 인식, 음향 모델링 등에도 사용되었고 이미지 인식에서는 AlexNet이 나타나기도 하였다.
1959년, Hubel과 Wiesel은 시각 피질의 뉴런이 어떻게 작동하는지 연구하였고 아래의 결과를 관찰하였다.
1. 피질에는 지형적 매핑이 있다. => 특정 뉴런이 특정 방향에 반응한다.
2. 뉴런들이 계층적 구조를 가진다.
=> Retinal ganglion cell을 통해 시각정보를 받아들임 -> simple cell에서 빛의 방향에 반응을 보임 -> complex cell에서 빛과 움직임에 반응을 보임 -> hypercomplex cell에서 모서리와 얼룩 등에 반응함
1980년, 위의 결과를 컴퓨터로 구현하면서 'Neocognitron'이라는 첫번째 네트워크 구조가 나타났다. 이것은 simple cell과 complex cell을 반복적으로 쌓아가는 샌드위치 구조였지만 backpropagation은 할 수 없었다.
1998년, Gradient-based learning이 글자 인식에 적용되었고 우편번호의 숫자를 인식하는 용도로 사용되었다. Neocognitron과 달리 backpropagation이 가능했다.
2012년, CNN의 현대화된 모습인 AlexNet이 나타났다. 대규모의 데이터를 활용하였고 1998년에 나온 모델과 비교했을 때, 더 규모가 크고 깊어졌다. 가중치 초기화와 batch normalization을 하였다.
Classification(이미지 분류), Retrieval(이미지 검색), Detection(탐지), Segmentation(세분화), 얼굴 인식, 포즈 인식, 게임 플레이, 의료 이미지의 해석 및 진단, 은하 분류, 거리 표지판 인식, 고래 인식 등에 사용된다.
이미지 분류뿐만 아니라 Image caption(이미지가 주어지면 이미지에 있는 내용에 대한 문장 설명을 작성하려고 함), Style transfer(특정 화풍으로 그림을 그려줌)에도 사용된다.
Fully Connected Layer(FC layer) : 입력 이미지를 늘려서 1차원 벡터로 만들어 가중치 W와 내적을 계산해 1개의 결과값을 activation layer에 출력한다.
ex) 32x32x3 image -> 3072x1 vector
Convolution Layer : 기존의 공간 구조를 유지하고자 한다. 입력 이미지의 구조를 유지하면서 입력 이미지 위에 filter를 슬라이딩하여 모든 공간 위치에서 내적을 계산(convolve)하고 1개의 결과값을 출력한다.
filter : 항상 입력 이미지의 전체 깊이를 확장한다. filter의 크기는 임의로 정할 수 있지만 depth는 입력 이미지의 depth와 항상 같아야 한다.
Convolution layer에 filter를 convolve하면 1개의 숫자가 나오는데 이때 결과값은 (전치된 W)*x + b를 통해 얻을 수 있다.
activation map : Convolution layer의 좌측 상단부터 우측 하단까지 filter를 이동해가면서 모든 위치에서 내적을 계산한 후 이 결과값들의 모임
이때 filter는 중앙에 위치하기 때문에 상하좌우가 비게 되어 32x32 크기의 입력 이미지에서 크기가 줄어든 28x28크기의 activation map을 얻게 된다.
각 filter에서는 1개의 특징을 얻을 수 있기 때문에 CNN에서는 여러 개의 filter를 사용해 이미지로부터 filter 개수 만큼의 activation map과 특징을 얻을 수 있다. 이때 activation map의 depth는 filter의 개수와 같다.




filter의 크기대로 stride(보폭)만큼 이동한다.
입력 이미지에 딱 맞게 슬라이딩할 수 있는 보폭이 아닌 경우, 정보의 일부가 누락된 불균형한 정보를 가진 activation map을 얻게 된다. 이를 해결하기 위해 Zero Padding을 사용한다.
Zero Padding : 입력 이미지의 바깥에 0으로 이루어진 여백을 덧붙여준다. filter를 거쳐도 입력의 크기가 유지되어 결과적으로 출력의 크기를 입력의 크기와 같게 유지할 수 있다. Zero Padding을 이용하면 입력 이미지의 모서리 정보까지도 출력 이미지에 잘 전달할 수 있다.
convolution layer를 거치면서 이미지의 크기가 줄어들면 여러 층을 통과할 때 더 이상 convolve할 수 없다. 따라서 zero padding으로 입력 이미지와 출력 이미지의 크기를 같게 유지해 convolution layer를 통과시키고 나중에 pooling에서 이미지의 크기를 줄여준다.
=> N : 입력 이미지의 크기, F : filter의 크기, stride : 보폭의 크기, P : padding 값이라 할 때, activation 값 = (N+2*P-F)/stride + 1


=> CNN에서 필요한 하이퍼파라미터는 filter의 수 K(일반적으로 32, 64, 128, 512와 같은 2의 제곱수), filter의 크기 F, 보폭의 크기 S, zero padding의 수 P이다.
1) 1959년 Hubel과 Wiesel의 연구에서 뉴런이 계층적 구조를 가진다는 것을 발견했다.
CNN은 filter가 여러 개일 때, 이미지의 특징을 단순한 것부터 복잡한 것까지 계층적으로 학습하는데 이것은 생물학적 뉴런과 CNN이 유사한 특징을 가졌다는 것을 보여준다.

2) Convolution Layer는 1구역은 1노드가 담당하는 local connectivity를 가진 뉴런과 같다.
activation map은 뉴런의 출력이고 각각이 입력 이미지의 국소적인 부분과 연결된다. filter는 receptive field of each neuron(각 뉴런의 수용체)와 같은데, 특정 부분만 처리하고 이것이 여러 개가 모여서 전체 이미지를 보게 되는 것과 유사하다.
=> 입력 이미지에 대해 각각 1번씩 연산을하고 결과적으로 filter의 개수만큼 연산하게 된다.
입력 이미지가 들어오면 Convolution Layer에 활성화 함수인 ReLu함수를 쌓고 Pooling Layer(activation map의 크기를 줄여주는 역할)를 쌓아준다. 이 방식을 여러 번 반복한 후, 마지막에 FC layer를 쌓아 입력 이미지를 클래스별로 분류한다. 결과적으로 이미지가 어떤 것인지 하나의 값으로 분류된다.
=> CNN은 Convolution Layer, Pooling Layer, FC Layer가 모여 만들어진다.
Pooling Layer : downsampling으로, representation(표현)의 크기를 줄여 관리하기 쉽게 만들어준다. 각 activation map에 독립적으로 작용하는데 공간의 크기(차원)은 줄여주지만 depth는 줄이지 못한다.
필터의 크기와 보폭을 정해 downsampling하는데, 가장 많이 사용되는 것은 Max Pooling 방식으로 각 필터 안에 있는 숫자 중 가장 큰 값을 뽑아 출력한다.