CS231n (Lecture 1~6)
2020년 하반기 가짜연구소의 메인 스터디로 참여자로 스탠포드대학에서 발표한 CNN 강의영상을 듣고 자료를 정리 했습니다. 자료의 사진과 code는 모두 CS231n 강의자료를 참조하였습니다.
Last updated
2020년 하반기 가짜연구소의 메인 스터디로 참여자로 스탠포드대학에서 발표한 CNN 강의영상을 듣고 자료를 정리 했습니다. 자료의 사진과 code는 모두 CS231n 강의자료를 참조하였습니다.
Last updated
컴퓨터 과학의 연구 분야 중 인간이 시각적으로 하는일들을 대행하도록 시스템을 만드는것
2015년부터 2017년까지 CSICO에서 발표한 통계자료에 따르면 인터넷 트래픽 중 80%는 인터넷 비디오데이터였고, 인터넷의 데이터 대부분이 시각적인 자료였다. 이러한 시각적 자료 혹은 데이터를 암흑 물질(Dark Physics)라고 표현했는데, 시각 데이터를 이해하고 해석하기 어려우며 이를 해결할 수 있는 알고리즘이 개발의 필요성을 강조했다.
5억 4300만년 전 바다를 부유하며 그저 주변의 먹이만 먹는 단순한 생물들만 존재로 시작해, 1000만년동안 생물의 종이 폭발적으로 늘어나게 되었다. 진화생물학자에 의하면 이러한 현상을 Evolution’s Big Bang 이라고 부른다. (생물학적인 근거에 대해 소개하지만, 따로 소개하지 않겠다.)
현재 동물은 Vision을 가장 큰 감각 체계로 지니며, 인간의 대뇌 절반 가량의 뉴런이 시각처리에 관여한다.
1600년대 핀홀 카메라 이론 기반의 카메라인 Obscura가 발명되면서 인공적인 Vsion은 시작된다. 점차 카메라 기술이 발전하면서 카메라는 우리생활 주변 어디에나 볼 수 있고, 가장 많이 사용하는 센서로 사용된다.
Hubel과 Wiesel은 고양이 두뇌에 대한 실험결과를 근거 포유류의 시각처리방식에 대해 소개를 하였다.
고양이의 뇌에 전기적 신호를 보내 1차 시각 피질에서 다양한 종류의 세포가 있음을 알아내는데, 세포가 Edge에 반응하는 세포로 시각 처리가 단순한 구조로 시작하여 점점 복잡해지는 것을 발견했다.
이후 1960년대 Larry Roberts의 사물을 기하학적인 모양으로 단순화한 Block World 연구가 소개되었고, 1966년 MIT에서 'The Summer Vision Project' 가 진행된다.
1970년대 David Marr에 의해 Hierachicl Model이 제시되는데 지금의 컴퓨터 비전, 아키텍쳐 딥러닝 구와 유사하다. David는 우리의 눈에 인식된 이미지를 3D로 표현하려면 3단계의 과정을 거쳐야 한다고 주장했다.
1980년대 실제 세계를 단순화된 구조로 인식하기 어려우므로 객체 분할(segmentation)으로 변경되지만, 2001년 Paul Viola와 Michael Jones에 의해 실시간 얼굴인식 성공과 2006년 Fujifilm에서 실시간 얼굴인식 지원한 최초 디지털카메라 출시 등 다시 연구방향은 '객체인식'으로 바뀌게 된다.
ImageNet 프로젝트 소개와 다음 2가지의 목표를 둔다.
세상 모든 이미지 분류
기계학습의 Overfiting 문제 극복
그리고 2012년 ImageNet 국제대회 ILSVRC 개최에서 CNN(Convolutional Neural Network) 도입으로 기존 28.2%, 25%의 오류율을 16.4%로 오차율이 급격히 감소되었다. 따라서 C2S231n 수업에서는 CNN을 배우게 된다.
이미지를 분류하는 것으로, 이미지가 입력되면 시스템에서 미리 label해놓은 분류된 이미지 집합 중, 어디에 속할지 컴퓨터가 판단하는 것이다. 하지만 기계는 사람과 달리 정밀하게 분류하기 힘들다.
위 사진과 같이 기계는 고양이 사진을 입력받으면, RGB(Red, Blue, Green) 값을 기준으로 격자 모양의 숫자들을 나열하여 인식한다. 하지만 기계는 카메라 각도나 밝기, 객채의 행동 혹은 가려짐 등 여러차이로 인해 이미지의 픽셀 값이 달리 읽어 사물을 다르게 인식하는데, 이러한 기계를 잘 인식할 수있도록 알고리즘을 개발 시도 했으나, 다양한 객체들에게 유연하고 확장성 있는 알고리즘을 개발하는데 한계가 있다.
따라서 이 문제를 해결하기 위해 새롭게 등장한 방법이 데이터 중심 접근방법 (Data-Driven Approach) 이다.
객체의 특징을 규정하지 않고, 다양한 사진들과 label을 수집하고, 이를 이용해 모델을 학습하여 사진을 새롭게 분류하는 방식이다.
입력받은 데이터를 저장한 다음 새로운 입력 데이터가 들어오면, 기존 데이터에서 비교하여 가장 유사한 데이터를 찾아내는 방식이다.
강의에서는 CIFAR-10 (10가지 종류의 물체와 동물을 모은 사진 데이터 셋)데이터를 사용했다.
그렇다면 기계가 어떻게 이미지를 비교하고 입력과 비슷한 미지를 찾아낼까?
Distance Metric(Manhattan Distance를 사) 공식을 통사용하였다.
이 방법은 이미지를 Pixel-wise로 비교하는데, test 이미지의 픽셀값에서 train 이미지의 픽셀값의 차를 구하고 절대값을 취한다. 다음 각 픽셀의 값을 모두 더해 하나의 출력값으로 만든다.
하지만 이 방법의 단점은 모든 사진의 픽셀값의 계산하기 떄문에 예측 과정에서 소요되는 시간이 상당하다.이러한 비효율적인 문제를 해결하기 위해 보완된 방이 K-Nearest Neigbor (이다.
distance mertic를 이용해서 가까운 이웃을 k개만큼 찾고, 이웃간에 투표를 하여 득표수가 많이 얻은 label로 예측하는 방법이다. 하지만 가장 가까운 이웃이 존재하지 않으면 흰색으로 표기된다.
하지만 강의에서 KNN을 사용해 이미지를 분류한 결과를 보면 성능이 좋지 않았다.
잘 분류된 사진(초록색) 도 있지만 분류되지 못한 사진(빨간색)이 많았다. 지금까지는 픽셀 간 차이에 대한 절대값 합을 이용했다면, 다른 방법으로 Euclidean Distance (제곱 합의 제곱근)이 소개된다.
위 사진처럼 L1 Distance가 마름모 형태라면, L2 Distance는 원형의 형태로, 기하학적으로 구조 자체가 다르다. 또한 L1 Distance는 좌표계를 회전 시 거리값이 달라지지만 L2 Distance는 좌표의 영향을 받지 않는다. KNN을 사용하려면 학습 전 사전에 K와 거리척도인 “하이퍼 파라미터” 를 선택해야 한다.
하이퍼 파라미터를 선택하는 방법은 문제의존적?(problem- dependant) 이므로, 여러 시도를 한 다음 성능이 좋은것을 선택한다.
일반적으로 데이터를 Train, Validation, test로 3개로 나누어 학습하고 예측하는 방법과 Cross Vaildation(교차검증)이 있다. 교차검증은 작은 데이터셋일 경우 많이 사용하고 딥러닝에서는 많이 사용하진 않는다.
linear classification은 Neral Network(NN)과 Convolution Neral Network(CNN)의 기반 알고리즘이다. NN을 구축할 때 다양한 컴포넌트를 사용할 수 있는데, 이 컴포넌트들을 한데 모아서 CNN을 이루게 된다. 이 방법은 Nearest Neighbor보다 효율적이고 빠르게 계산한다.
위 고양이 사진(32x32x3)을 예시로 입력(X)을 받으면 , 가중치 파라미터(W)와 곱하여 카테고리 score 값(f(x,w))인 10을 만든다. score값이 높을수록 고양이일 확률이 높다.
사진에서는 나오지 않았지만 W*x 에 bias(편향값)을 더하는데, bias는 입력과는 직접적인 관계를 가지지 않으나 이미지 라벨의 불균형한 상태 보완하기 위해 사용된다.
위 사잔을 예시로, 입력으로 2*2 형태인 고양이 사진을 받으면, linear classfier는 4-dim 열 형태인 터로 펴지게 된다.
그리고 각각의 가중치(W)와 입력 이미지의값(X)들의 내적한 값(클래스 간 템플릿 유사도를 측정한 값)에 bias를 더하면 score 값이 구해진다.
이미지를 고차원 공간으로 보게되면 , Linear Classifie는 각 클래스를 구분해주는 선형 경계 역할을 하지만, 일차함수 직선으로 분류되지 않은, 즉 데이터의 분포에 따른 선형으로 분류할 수없은 데이터가 대부분(Multimodal problem)이다.
이러한 단점을 보완하기 위해 W 가중치 설정이 중요하다며 2장의 강의는 끝이나고 , W를 설정할 방법에 대해 예고편을 던진다.
3장 loss function 과 optimization에 대해 소개하기전, 간단히 2장에 대해 간단히 복습하는 시간을 가지게 됩니다.
2장에서는 조명,변형,은닉 등 다양한 이유로 이미지 분류가 힘든점과 cross validation, knn , linear classifier를 배웠습니다. 하지만 이미지를 분류 시 ,입력된 이미지에 가중치(w) 곱하고 score 점수로 분류를 했지 하나의 분류기를만으로 미지 분류가 어렵다는 내용이었.
이번 시간에는 이미지를 분류 시, 어떤 수식에 의해 출력된 score에 대해 불만족하는 정도를 정량화 시킬 수 있는 loss function 과 이 loss function에 대한 parameter 값 최소화 시킬 수 있는 optimization에 대해 알아보겠다.
SVM(support vector machine)은 기계 학습의 분야 중 하나로 패턴 인식, 자료 분석을 위한 지도 학습 모델이며, 주로 분류와 회귀 분석을 위해 사용한다.
SVM은 2,3차원 이상의 고차원인 초평면(hyperplane)에서 결정경계를 기준(Decision boundary)으로 데이터를 분류한다. 이떄 결정 경계와 인접한 데이터 포인트를 Support Vectors,이 서포트 벡터와 Decision boundary간의 거리를 Margin이라 한다. SVM은 허용 가능한 오류 범위 내에서 가능한 최대 마진을 만들어야 한다. 이러한 SVM은 다항 분류에서도 사용하는데 이를 multiclsss SVM이라고 하며, 여기서 사용되는 loss funtion이 hige loss이다.
위 사진과 같이 고양이, 자동차, 개구리 세개의 클래스를 분류하 트레이닝 셋이 있다고 가정했을때,
각 각 class 별 점수를 보면, 고양이 경우 class cat보다 car 점수가 높다. 즉 잘못분류함을 알 수 있다
SVM 함수을 이용해서 loss function이 어떻게 계산되는지 과정을 구체적으로 살펴보면 다음과 같다.
(Xi, Yi) : xi가 이미지, yi가 레이블
score벡터를 f(xi,w) ,
Sj는 잘못된 레이블의 스코어, Sy는 재대로된 레이블의 스코어
1은 safty margin : decision rule 이 최소한 1보다는 큰 값을 주도록 한게 아닐까 싶다...
잘못된 레이블 스코어에서 제대로 된 레이블간 스코어 차에 일을 더한값이 영보다 크면 그 값이 loss가 되고
0보다 작으면 0이 레이블이 된다는 의미한다.
첫번쨰 고양이 이미지를 예를들면 Sj (5.1)에서 Syi (3.2)를 뺴고 1를 더하면 2.9 값을 얻게된다. 그리고 0과 비교시 2.9가 크므로 최대값은 2.9를 얻게 다. 그다음 또 잘못된 레이블 스코어(frog 점수)에서 맞는 레이블 스코어간의 차를 구하고 1를 더하면 -3.9를 얻게되는데 0과 비교시 0이 더크므모 max값은 0이된다. 그리고 처음에 구한 2.9와 0을 더해 최종 Li값은 2.9가 된다.
이런식으로 나머지 두개의 사진도 같은 방법으로 구한다음, 각 Li값을 합산하여 class 수 만큼 나누면 최종적으로 5.27의 값을 얻게된다.
여기서 알게된 사실 트레이닝 데이터에 대해서 분류가 잘 되지 않으면 loss function은 높고, 분류가 잘 될 경우에는 loss function이 낮음을 알 수 있습니다.
그리고 강의에서는 5가지 질문을 하는데, 각 질문을 통해 얻게된 것은 다음과 같다.
SVM은 데이터에 둔감하고, score 값이 중요한게 아니라 정답 클래스가 다른 클래스보다 큰지 작은지 중요하다.
loss의 최소값은 0이고, 무한대까지 최대값을 가진다. 또한 loss는 class 갯수-1 만큼 나온다.
그리고 우리가 구한 Weight가 uique 값인지 물어보는데, weight는 train set에 맞춰져 있기에, test에서는 trainning set에서 구한 weight와 다를 수 있다.
우리가 구한 train이 파란색이라고 가정했을 때, 초록색 네모는예측하지 못한 상황이 나오게 되는데, 즉 trainning에 맞춰져 test를 못맞춰 정확도가 아지는것을 과적합(overfitting)이라고 한다.
이러한 train 데이터에 과적합되는 결과를 막기 위해 정규화 항(regularization)을 추가해 사용한다.
Regularization 은 이렇게 특정 가중치가 너무 과도하게 커지지 않도록(weight decay) 학습시 켜Generalization(일반화) 성능을 높이는데 도움을 준다. 그중에서도 가장 많이 사용되는 L2에 대해 설명하겠다.
L2 regularization을 진행하게 되면 가중치가 전반적으로 작고 고르게 분산된 형태로 진행되 과적합을 줄일 수 있고, test set에 대한 일반적인 성능을 향상시킬 수 있게 된다.
Multi class SVM이 score 값만 생각하여 분류했다면, softmax는 확률분포를 이용해 socre 자체에 의미를 부여 한다.
Softmax는 신경망 출력층에서 사용하는 활성함수로, 주로 분류문제에 사용된다.
구체적으로 점수 벡터를 클래스 별 확률로 변환하기 위해 흔히 사용하는 함수로 각 점수 벡터에 지수를 취한 후, 정규화 상수로 나누어 총 합이 1이 되도록 계산한다.
즉 입력받은 값을 출력으로 0~1사이의 값으로 모두 정규화하며 출력 값들의 총합은 항상 1이 되는 특성을 가진 함수이다.
예를들어 사진속 인물의 표정을 확률적으로 수치화한다고 했을때, 슬픔은 11%, 웃음은 29%, 화남은 60% 로 나타났다면 같이 확률적으로 화난 표정에 가깝다고 분류하는 것이다.
연산 과정은 주어진 스코어에 대해 exp 연산을 취해 값을 구하고, 그 값을 모두 더한 값을 해당 클래스 스코어에 나눠준다. 마지막으로 -log 연산을 취해 최종 확을 계산한다.
지수 함수를 사용하면 가중치를 더 커지게 하는 효과를 얻을 수 있고, -log를 사용한 이유는 x축을 확률, y축을 loss 라고 생각했을 확률이 1에 가까워질수록 loss가 0에 가까워지기 때문에 -log를 사용한.
또한 강의에서 min,max 값에 대해 묻는데, - log 그래프를 생각하면 최소는 이론적으로 0,최대값은 무한대다.
optimization은 loss를 최소화 시킬 수 있는 weight를 찾는 것이다.대표적인 방법으로 random search와 gradientdescent가 있다.
random search는 w의 위치값을 무작위로 포인트를 찾는 방법이지만 예측의 정확도가 15%~95%로 불안정하다. 따라서 절대로 사용해서는 않다.
실질적 전략방법인 경사하강법(gradientdescent)은 경사를 따라 내려가는 방법이다.
1차함수인 경우 아래 식과 같이 함수을 미분하여 구하는데, 이렇게 수치적으로 경사를 구하는 방법을 numerical gradient라고 한다.다차원에 경우에는 vector형태로 나타나게 된다.
위와 같이 현재 weight가 구성되어 있고, loss값이 1.25347을 나타내고 있을 때, gradient dW를 구하기위 해 바로 앞에 lim f(x+h)-f(x)/h 수식을 이용하면 다음과 같다.
h를 0.0001으로 미세하게 지정한 후f(x+h)의 loss를 구하면 1.2532가 나오고 이둘의 차를 0.0001로 나눈 경사값은 -2.5를 얻었다. 기울기가 음수라는건 downward 즉 기울기가 w가 늘어나면 loss에 음에영향 을 준다는걸 의미한다.
두번째 차원에서 -1.11에 h( 0.00001)를 더한 loss 값이 1.25353으로 loss값이 조금 증가했다. downward와 같은 방법으로 구하면 경사값이 0.6이 나온다.이처럼 기울기가 늘어나면 upward의 영향을 가지고 있다고 의미한다.
세번째 차원의 예시를 면 , 0.78에 h를 더한 loss 값이 현재 weight와 동일하다. loss의 변화가 없는것은 기울기가 없다는 것이다. 이처럼 계산을 통해 기울기를 구하는 것을 numerical gradient라 한다.
그런데 미분을 통해 얻은 값은 정확한 값이 아닌 근사값을 구한 것인데, 값이 정확하지 않고 weight가 무수히 많을 경우 평가를 하기가 어렵고 값을 구하기에도 느릴 것이다.
우리가 원하는 것은 w가 변할때 Loss가 얼마큼 변하는지 알아보는 것인데 이는 미분을 통해 쉽게 구할 수 있다.
미분은 뉴튼과 라이프니츠가 고안한 방법으로, 미분을 통해 얻는 방법을 analytic gradient라 한다.
실제로 미분식을 이용하면 다음과 같이 편미분값들을 구할 수 있다.
정리해서 말하자면 numerical은 근사치이고 느리지만 반면에 코드로 작성하기 쉽다.
반 analitic은 빠르고 정확한데 코드로 작성시 에러가 늘어날 경우가 많다.
실제로는 analitic gradient을 쓰면 되고 계산을 정확하게 이뤄냈는지 검토과정에서 numerical 방법을 활용하면 된다. 이렇게 확인하는 방법을 gradient check라 한다.
이렇게 Gradient Descent를 코드로 구현하면 lossfunction, data, weight을 전달해줘서 gradient를 구한다. 구한 gradient에 stepsize(learing rate), 알를 곱해줘서 그것을 기존 weight에 증감하여 Parameter를 업데이트한다. 그리고 gradient 값만큼 weight를 감소시켜 주기 위해 앞에 마이너스를 붙인다.
그래서 이렇게 orignal의 weignt가 주어졌을때 음의 gradient방향으로 업데이트 해가면서 최적화을 해나가는것이 gradient decent가 되겠다.
이렇게 앞에서 구한 방법을 full gradient descent라 하고, 현실적으로 많이 사용되는 방법은 mini-batch 방법이 되겠다.
미니 뱃치는 속도와 효율성을 높이는 방법으로 training set의 일부만 사용해서 gradient을 계산하고, parameter을 업데이트해주는데, 계속 또 다른 training set의 일부를 이용해 parameter을 업데이트 하는 방법을 계속해서 반복하는 과정이다. 일반적으로 mini-batch사이즈는 32/64/ 128개의 사이즈을 가지게 되고 alex net에서는 256개의 minibatch을 사용했다.
이렇게 minibatch의 대표적인 방법으로 Stochastic Gradient Descnet(SGD)가 있다. 그리고 파라미터를 업데이트를 하는 방법으로 Adam, Adagrad, RMSprop, momentom가 있다. 하지만 SGD도 다른 방법들과 비교했을 시, 속도가 느린점이 있다.
다음은 cnn을 하기전 일반적인 image classify을 어떻게 해왔는지 설명하겠다.
기존의 방식도 linearal classifier을 이용했지만 original image에다가 linear classify을 적용하지는 않았다. 단순 히스토그램이나 코드형태로 feature을 추출하고, 추출한 feature들을 concate하여 이어준다. 그 다음 linear clasifier에 적용했다. 이것이 일반적인 방법이었다.
직선만으로 linear하게 구분하지 못한 한계가 있으니, 극좌표로 바꾸니 linear하게 구분할 수 있었고, 이에 영감을 받아 추출한 방법이 color histogram이다. color histogram은 이미지 내의 컬러를 모두 픽셀로 파악하고, 그 컬러의 픽셀을 전체 파노라마에서 color bin이 몇개인지 갯수를 세어 feature를 추출하는 방식이다.
두번째 feature를 추출하는 방식은 Histogram of Oriented Gradients(HoG) 이다.
8*8 픽셀로 구성된 구역을 총 9가지의 엣지의 bin으로 나눠서 9가지의 bin에 몇개가 속하는는지, edge의 의존도을 추출해낸 것이다.
세번째 feature를 추출하는 방식은 Bag of Words가 있다. 이 방법은 연어처리에서 자주 사용되는 기법인데,
이미지의 여러 지점들을 보고 이 작은 지점의 patch를 frequency 혹은 color의 vector로 기술하게 된다.
그래서 이것을 사전화해 사전내에서 test할 이미지와 가장 유사한 feature vector을 찾는다. 찾는방법은 K-means를 사용하는데, 이 feature vector을 찾고 이을 concatenation해서 linear classify을 한 방법이 된다.
이처럼 기존의 방식은 임의적으로 feature extraction을 통해 이미지를 분류지만, 다음시간부터 배울 딥러닝은 function에 넣어 스스로 특징을 추출하는 방식이다.
이번 강의에서는 Nerual Network의 기형태와 Backpropagation에 대한 소개다.
앞서 지난시간에 배운 gradient를 계산 시, Numerical gradient로 초기계산하고, 실제 연산은 Analytic gradient 방법을 사용해 최종 파라미터를 확인했다. 이런 연산과정을 정리하면 위 Computational 그래프라 한다. 벡터 x와 가중치 연산을 통해 score을 계산한 후 Loss Fuction을 통해 Loss 값을 최소화할 수 있도록 조정하는데, overfitting을 방지하기 위해 정규화를 사용한다.
다음은 강의에 대한 핵심내용만을 정리하면 다음과 같다. f(x, y, z)를 계산하는 방법을 위의 자료와 같이 노드로 연결해 표현할 때 front propagation과 Back propagation 에 대한 개념은 다음과 같다.
x, y, z값이 주어지고, 왼쪽에서 오른쪽 노드로 건너가며 연산이 진행될 시, 최종 f값이 -12로 계산되는데 이렇게 연산하는 방법이다.
하지만 x, y, z가 f(x,y,z)에 어떠한 영향을 미치는지 알아보기 위해 backpropagation 연산을 활용한다.
표현그대로 거꾸로 연산 하는 방법이다.
X가 output인 f에 미치는 영향, y가 f에 미치는 영향, z가 미치는 영향을 생각해보자.
각각 편미분으로 표현하면 df/dx, df/dy,df/dz로 표현 할 수 있다.
q = x+y 이고 f = qz 라 주어지고 덧셈연산과 곱셈연산에 대해 미분 시 미분 값은 1이고, 곱셈연산에서는 서로의 값을 가진다.
최종 값 f에 영향을 미치는 정도를 파악하기위해 gradient 계산을 활용하여 구할 시 값이 1이다.
z가 f에 영향을 미치는 정도를 보자. f = qz , 곱셈형태이다. 즉 값은 q 값, 3이다.
q가 f에 영향을 미치는 값을 보면 당연히 z 값인 -4가 된다. 하지만 q와 z는 y와 직접적으로 연결되어 있지만 x,y는 그렇지 않다. 이때 Chain rule를 사용한다.
x -> q -> f 순서이 므로 x가 q에 미치는 영향 * q가 f에 미치는 영향을 계산해주면 된다. x + y 의 미분은 1로 구했다. 이 값을 local gradient라고 부른다.
y와 x 가 q 에 미치는 영향은 값이 1이다. 그래서 1*q의 값(-4)를 하면 -4 가 된다.
벡터 함수의 야코비 행렬은 해당 함수의 편도함수 행렬으로, local gradient * global gradient 연산을 할 때 필요한 매트릭스다.
Jacobian matrix크기는 4096 * 4096 으로 주어지면 minibatch 를 이용해 연산 시, 실용적이지 못하다. 따라서 연산하지 않고, 출력에 대한 x영향을 구할 때 max 연산을 통해 일부는 0으로 채운다.
지난시간 f = wx 단순한 1차원의 linear score 값을 구했는데, 중간에 hidden layer 가 추가 되었을시 , 3072의 데이터가 w1와 곱해지고 h노드(hidden layer)에 들어가고 다시 w2 가중치 연산을 통해 10개의 출력값을 나온다. 이처럼 앞으로 hidden 노드에 따라 더 많은 분류기를 생성할 수 있다.
이처럼 여러겹층의 선현분류기로 구성된 Nerual Network 활성함수(자료에서는 sigmoid 예제)를 사용해 0과 1의 사이 값으로 분류해 score를 표현한다. 이외에도 아래과 같이 다양한 활성함수를 이용해 분류를 한다.
이번시간에는 Convolutional Neral Networks(CNN)를 배운다.
CNN은 이미지,영상 인식등에서 많이 활용된다.
강의에서는 딥러닝 역사에 대해 소개하지만 중요치 않아 생략했다.
대략 간략히 소개하면 mark1 perceptron 기기는 weight를 조절해가며 학습한 단층 perceptron 방식이다.
이후 adaline/Madaline이 등장하는데 backpropagation 같이 동작하지만 수동방식이다. 이후 점차 발전해가면서 2006년 hinton 교수님에 의해 weight를 최소화 할 수 있는 RBM-initalized, fine tunning이 등장한다.그리고 2012년 image net에서 alex krizhevsky가 제시한 CNN이 등장하면서 급격히 딥러닝 기술이 성장한다.
기존의 Fully Connected Layer(FC Layer)가 입력이미지를 strech화 한다음, Wx 수식에 대입하고 학습하여 결과를 도출했다(activation) .
하지만 CNN은 기존이미지를 그대로두고, convolve filter를 이용해 입력 이미지의 특징을 추출해 가져온다.
이때 조건은 입력이미지의 depth와 filter의 depth가 같아야한다.
이 필터는 이미지를 돌아다니면서 이미지 정보를 수집하여 28x28x1 size의 activation map으로 보여준다.
이 필터들을 여러개 사용하면 층(layer)이 생기고, 와 같 각자 다른 activation map을이 형성다.
그런데 filter가 돌아다니며 이미지 정보를 수집할때, 알아야할 용어가 있다.
패딩은 CNN 연산을 수행하기 전, 입력데이터 주변을 특정값으로 채워 늘리는 것이다.
출력 데이터의 공간적 크기(Spatial)를 조절하기 위해 사용하는 패딩은 보통 hyper parameter로 zero-padding을 사용한다. 패딩을 사용하지 않으면 Conv layer가 이동할떄마다 가장자리의 정보가 사라지는 문제가 발생한다.
스트라이드는 출력 데이터 크기를 조절하기 위해 filter가 이동할 간격을 말한다.
예를들어 stride가 1이면 filter 간격이 한칸씩 이동된된다.
예를들어 7x7크기의 입력이 있다고 가정하고, 3x3 크기의 filter가 1칸씩 이동을 하면 5x5 크기의 출력이 나온다. 이런식으로 filter의 크와 stride를 조정하면 다음과 같이 식을 일반화 시킬 수 있다.
down sampling이라고 불리는 풀링은 합성곱 계층의 패딩과 스트라이드 같이 데이터의 공간적 크기를 축소하는데 사용한다. 풀링을 통해 모델의 전체 매개변수의 수를 대 줄일 수 있다.
방식은 Max-Pooling과 Average- Pooling이 있다. Max-Pooling은 해당영역에서 ouput이 최대값을 찾고 이외는 버리고, Average-Pooling은 해당영역의 평균값을 계산하는 방법이다. 이미지 인식 분야에서는 feature가 얼마나 활성화 됬는지 알고 싶기에? 주로 Max-Pooling을 사용한다.
이런식으로 CONV, RELU, Pooling을 통해 얻은 값들 FC Layer의 입력으로 사용되고, FC layer는 최 종적으로 결과를 정리해 그림과 같이 car로 예측한다.
이번강의에서부터 뉴럴네트워크에 대해 2번에 걸쳐 배우게 된다.
활성화 함수(activation functions)로 시작해 Data preprocessing(데이터 전처리), weight Initialization(가중 초기화) 순으로 배우는데 가중치 그초기화 방법 중에서 배치 정규화에 배우게 된다.
활성함수는 입력 값이 들어오면 cellbody의 f를 non -linear 하게 변환이 된다. 즉 입력값과 가중치가 곱해지고, 비선형 연산의 값으 나오게 된다.
활성화 함수는 종류에 따라 그 값의 형태도 다양하다.
이런 다양한 활성함수 중에서도 전적으로 sigmoid 함수를 많이 사용하는데, sigmoid는 넓은 범위의 숫자를 0과 1사이 확률 값으로 변환한다. 하지만 sigmoid는 몇가지 문제가 있어 더이상 사용하지 않는다.
0또는 1의 값으로 뉴런이 포화되어 gradient를 없앤다. (vanashing gradient)
자세히 얘기하면 입력값이 너무 작거나, 크면 미분한 값이 0에 가까운 가져 gradient 가 소멸하게 된다. back propagation을 이용하여 편미분할 때, dL/dw가 0이 되므로 w의 업데이트가 없어지는 (saturated regine)
2. sigmoid의 결과는 zero-centered가 아니다.
sigmoid 의 결과는 모두 0이상이기 때문에 0을 중심으로 이루어지지 않는다. 이러한 이유로 w가 양수 혹은 음의 값으로 같은 방향으로 움직여 zigzag path로 가다보니 결국 converzence가 매우 느려질 수 밖에 없다.
(부족한 설명 죄송...)
3. exp()함수가 연산으로 비싼함수라 성능에 저하를 갖게된다.
그러다보니 결국 sigmoid를 사용하지 않게 되었다.
두번째 함수는 tanh(x) 함수이다. hyperbolic tangent라 불리는 이 함수는 -1과 1사이 확률 형태로 squashe하다. 좋은점은 zero centered, 가운데가 0 값을 가지게 되는데, 여전히 x값이 매우 작거나 매우 크면 saturated가 발생한다. 즉 gradient 가 소멸하는 문제점이 다.
세번째는 Rectified Linear Unit(RelU)다. ReLU는 계산시 0또는 max값을 취하는 함수로, x가 양수인 지점에는 saturated 가 발생하지 않고 연산이 효율적이다. 또한 sigmoid나 tanh 함수에 비해 6배 빠른 성능을 가지고 있다.
하지만 ReLU도 몇가지 문제점이 있다.
여전히 zero- centered가 아니다.
x가 0보다 작으면 기울기가 0이므로, vanishing gradient 문제가 생긴다. 즉 이러한 문제 현상을 dead ReLU 현상이라 한다.
그래서 사람들은 deadReLU 현상을 방지하고자, RELU 뉴런 값을 초기화 할때, bias 값을 0.01로 설정한다. 이렇게 설정시 ReLU 뉴런이 양수로 출력해 업데이트한다. 하지만 호불호가 있는듯하다.
Kaming He가 주장한 LeakyRelU는 ReLU의 f(x)가 max(0.01x,x) 다. 즉 x가 0보다 작으면 기울기를 갖게 만들기 위해 0.01을 곱했다. 그래서 x의 값의 상관없이 saturated가 발생하지 않고 gradient가 죽지 않는다.
하지만 제대로 검증이 되지 않았다.
ReLU의 변형형태인 PReLU도 등장한다. PReLU는 f(x)의 max(αx, x) 형태로, 알파 값을 곱해 학습한다.
ELU는 x가 0보다 면 x 값을, 0보다 작으면 α(exp(x)-1) 값을 가진다. ReLU의 장점을 모두 가지고 있으면서, gradient 가 죽지 않고, zero mean 형태의 가까운 값을 가진다. 하지만 계산 무리가 있을 수 있다.
2013년 Ian Goodfellow가 발표한 Maxout 함수는 기존 활성함수와 달리 새로운 연산식으로 ReLU와 Leaky ReLU를 일반화한 방법이다. saturation이 발생하지 않으며, gradient가 죽지 않은 것이 큰 장점이지만, weight가 2개 가져 연산도 2배 이상 증가하는 단점이 있다.
그래서 정리하면, 특별한 경우가 발생하지 않는한 ReLU를 사용하고, 실험이 필요한 경우 Leaky ReLU, Maxout, ELU 를 사용하면 된다. 그리고 tanh,sigmoid를 사용하지 않는다.
머신러닝을 공부한 사람이라면 누구나 알테지만, 대표적으로 zero-mean 하게 만들고, normalize 정규화시키는 방법이 있다. 각각의 데이터에 대해 평균값을 빼고, 표준편차로 나눠주는 것이다. 이를통해 스케일을 맞춘다. 하지만 이미지 처리시 정규화를 하지 않는다. 정규화가 어떤 특정 범위에 속하도록 만드는 것인데, 이미 이미지는 0~255 특정 범위에 속해있어 굳이 할 필요가 없다.
이외에도 분산에 따른 차원을 감소시키는 PCA, whitening 있는데, 실제 이미지에서는 잘 사용하지 않는다. 그래서 정리하면, 이미지 데이터 처시 zero centered만 신경쓰면 된다.
가중치 초기화는 가장 중요한 방법으로, 가중치를 어떻게 초기에 정하느냐에 라 모델의 학습 성능이 좌지우지된다. 예를들어 모든 가중치를 0으로 설정 시, 모든 뉴런이 같은 연산을 수행해 출력도 같고, gradient도 같을 것이다. 이러한 문제를 Symmtric Breaking이라 한다.
그래서 가중치를 초기화하는 가장 기본적인 방법은 작은 random number를 사용한다. 즉 가우시안 정규분포 형태로 만드는 것이다. 이렇게 설정 시 네트워크가 작은 경우 문제가 생기지 않지만, 네트워크가 커질 시 문제가 생긴다. 그래서 모든 activation이 0이 되버린다.
반면 weight 값을 너무크게 잡으면, 일정시간이 지나고 Loss 값이 감소하지 않은 문제를 야기시킨다.
다음은 xavier initialization 방법이다. 이 방법은 노드 갯수를 정규화하는 것으로, 가우시안 분포로 뽑은 값을 입력의 수만큼 스케일링하는 방법이다. 즉 입출력 분산을 맞춰주는 것으로, input의 개수가 많아지면, 나눠주어 그만큼 값이 작아지게 되고, input의 개수가 작으면 weight가 커져 합리적으로 weight를 초기화하는 방법이다. 하이퍼 탄젠트에서는 잘 적용되지만, ReLU를 사용 시 적용이 되지 않은 문제가 있다.
ReLU를 사용시 출력의 절반이 gradient가 죽어, 분산이 반만 나와 분포가 줄어든다.
그래서 2015년에 Kaming He가 발표한 방법에서는 추가적으로 2를 나눠주는 방식을 사용하니, ReLU에서도 동작이 되는 을 확인했다.
배치 정규화는 vanishing gradient 문제를 방지하기 위해 전반적으로 학습과정을 안정시키는 방법이다.
activation 마다 입력에 대한 분포가 라져, 각 layer에 입력 분포를 가우시안 형태 분포로 만드는 것이다.
배치당 N개의 학습데이터와 D개의 원이 있다고 가정했을 때, 각 차원을 평균으로 구해주고, 정규화 한다.
그래서 saturation 문제가 발생하지 않도록 한다.
그래서 Fully connected -> Batch Normalization -> activation 순으로 반복한다.
그래서 배치정규화 과정은 mean을 구하고, varience를 구한뒤 , 정규화와 한 다음, scale과 shift를 한다. 결 결과적으로 gradient flow를 개선해주고, learning rate를 높여, 학습이 더 잘되게 도와준다. 초기화에 의존할 필요가 없는 이 가장 큰 장점이다. 또한 배치정규화를 사용 시, drop out을 잘 용하지 않게 된다.
주의점은 학습과 테스트 시 다르니 mean 과 varience를 기준으로 구한다.
학습과정은 다음과 같다.
Data preprocessing : 데이터 전처
Choose the architecture : hidden layer 구성하기
loss is reasonable :loss 값 확인
trainning 훈
training with regularization and learning rate :러닝 레이트 조절하며 학
하이퍼파라미터를 찾는 방법을 소개하겠다. Cross- validation은 trainng 데이터로 학습하고, validation set으로 평가하는 방법이다. Learning rate 는 gradient와 곱해져 선택범위를 logscale을 사용하는것이 좋다.
다음은 Grid Search와 Random Search에 대한 비교로 GridSearch는 하이퍼파라미터를 고정된 값과 일정 간격으로 샘플링하는 방법이고, Random Serach 는 말그대로 무작위로 더 좋은 값의 영역에 접근하는 방법이다. Random Search를 사용하면 important variable에서 더 다양한 값 샘플링 할 수 다.
학습하는 과정에서 loss curve 모니터링 하면 아래와 같이 다양한 형태를 갖게된다.
노란색 커브는 learning rate가 매우 높은데, 이는 loss가 발산했다. 반면 초록색 커브는 loss가 너무 낮은것이다. 이상적인 형태의 커브는 빨간색 커브다.
그리고 간혹 loss가 아래처럼 띄는 형태가 생기는 경우가 생기는데, 초기화 (initialization)문제이다.
Gradient backpropagation이 초기에 학습이 잘 되지 않다가 어느지점에 달아서 학습이 되는 경우가 있다.
이외에도 Train 정확성과 validation 정확성 간 gap이 커서는 안된다. gap이 큰 경우 overfitting 과적합 문제로 의심해야한다. gap이 없다면 과적합이 일어나지 않고, capacity을 높힐 수 있는 충분한 여유가 있다는 것을 의미한다.