Search
Duplicate

머신러닝 및 딥러닝 1/ Lecture 2. Linear & Softmax Classifiers

이미지를 받아서 결과를 내보내 주는 함수 f(x)에 대한 접근
이미지의 픽셀 정보에 대해 어떤 Weight를 줘서 계산을 하자는 접근
수식으로 표현하면 다음과 같이 표현 됨
W1,1x1,1+W1,2x1,2+...+Wm,nxm,nW_{1,1} x_{1,1} + W_{1,2} x_{1,2} + ... + W_{m,n} x_{m,n}
위 수식을 정리하면 다음과 같이 정의 됨. 입력 xx에 대해 가중치 WW를 적용하여 정답 YY를 계산 함.
y=f(x,W)y = f(x, W)
width 32, height 32, channel 3인 이미지에 대해 10개의 label을 사용한다면 y,x,Wy, x, W의 크기는 다음과 같이 계산 됨. 이때 XX는 계산하기 쉽게 1차원으로 변환한다.
y=f(x,W):10×1y = f(x, W): 10 \times 1
x:3072×1x: 3072 \times 1
W:10×3072W: 10 \times 3072
추가로 bias를 더해서 계산한다.
f(x,W)=Wx+bf(x, W) = Wx + b로 쓸 수도 있지만, bias는 상수이므로 아예 xx에 한 행, WW에 한 열을 추가해서 계산할 수 도 있음.
이렇게 하면 굳이 bias를 따로 추가하지 않고 WxWx로만 함수를 정의할 수 있는데, 다만 이러면 원래의 모습과 헷갈리므로 ‘를 추가해서 f(x,W)=Wxf(x, W) = W'x' 로 표기
bias를 따로 더하지 않고 행렬과 벡터에 추가하면 계산이 깔끔해지며, 나중에 Neural Network 구성할 때도 간편하다.
이렇게 정의하면 모든 학습 데이터를 저장할 필요 없이 WW만 저장해 두면 계산이 가능
또한 WW의 크기만큼만 계산이 되기 때문에 모든 데이터에 대해 계산하는 것에 비해 계산량도 줄어듬.
위 함수의 계산 예
이 함수에 의한 계산은 공간을 각 라벨 별로 선형으로 분할하고 입력이 어느 영역에 해당하는지를 계산하는 것이 됨.
학습된 WW를 다시 그림으로 그리면 위 이미지의 아래쪽 흐릿한 그림처럼 표현 됨.
어떤 것들은 실제 분류된 라벨과 비슷하게 보이는 반면, 어떤 것은 알아보기 어려움.
선형 함수를 이용해서 분류를 한 결과는 위 이미지와 같이 어떠한 값이 계산되는데, 이 값이 어떤 의미인지를 이해하기 어려움. 때문에 이것을 0-1사이의 확률값이 되도록 값을 조정해 줌.
결과값은 대단히 큰 값이 나올 수도 있고, 음수가 나올 수도 있기 때문에 Sigmoid 함수를 이용해서 0-1 사이의 값이 나오도록 함
그 각 항목들에 대해 시그모이드 함수를 적용한 것들을 클래스별로 모아서 최종적으로 클래스 별 확률을 계산하도록 한 것이 Softmax 함수
앞선 예에 소프트맥스 함수를 적용한 결과 예시.
왼쪽과 오른쪽은 0에 가깝고 가운데 클래스일 확률이 1에 가까운 값이 나오기 때문에 훨씬 이해하기 쉽다.
머신러닝은 Data-Driven 접근이며 WW는 다음과 같은 절차에 의해 찾는다.
1.
사람은 모델 형식만 설계한다.
2.
WW를 랜덤으로 초기화 한다.
3.
학습 데이터(xx)를 넣고 예측값(y^\hat{y})을 계산한다.
4.
예측값과 정답(y)y)의 차이를 비교하여 good/bad를 추정한다.
5.
그 차이가 줄어들도록 WW를 업데이트 한다.
6.
이 과정을 예측값이 정답과 같아질 때까지 반복한다.
예측과 정답를 비교하는 것을 Loss(손실) 함수를 통해 하며,
손실이 줄어들도록 WW를 업데이트 하는 것을 Optimization(최적화) 라고 한다.
Loss 함수란 현재 모델이 얼마나 잘하고 있는지를 수치화하는 함수이다.
Loss 함수는 정답과 예측치를 입력으로 받는다.
Discriminative Setting하는 경우 정답(yy)은 +1,1+1, -1로 정의 함.
따라서 예측(y^\hat{y})은 +1이 나오거나 -1이 나와야 함.
여기서 Margin-based loss는 예측과 정답을 곱해서 구한다.
그 곱이 양수가 나오면 예측과 정답이 같다는 의미이고, 음수이면 틀렸다는 의미가 된다.
손실을 계산하기 위해 위 결과를 이용해서 곱의 결과가 양수이면 Loss가 낮다고 (혹은 없다)고 정의하고, 음수이면 Loss가 높다고 정의한다.
손실 함수를 맞았으면 Loss를 0, 틀렸으면 Loss를 1로 주는 식으로 할 수 있다.
그러나 이 경우 0에서 미분이 안되기 때문에 문제가 된다. 그래서 몇가지 대체 함수를 사용한다.
손실 함수로 사용할 만한 것은 3가지가 있다.
log(1+eyy^)\log(1 + e^{-y\hat{y}})
eyy^e^{-y\hat{y}}
max{0,1yy^}\max \{0, 1 - y\hat{y} \}
함수는 1에서 미분이 안되는데 이 점은 결정적인 순간이 아니기 때문에 문제가 없다.
더불어 기울기가 일정하기 때문에 그냥 상수를 쓸 수 있다는 점에서 장점이 있다.
exponential loss는 위험도가 있다.
값이 기하급수적으로 증가하기 때문에, 레이블이 잘못된 경우 문제가 된다.
Hinge loss와 Log loss가 많이 쓰이는데 Hinge loss는 SVM이고, Log loss는 선형회귀이다.
실제 사용은 Discriminative 보다는 Probabilistic Setting을 더 많이 사용한다.
손실 함수를 Probabilistic Setting하는 경우 정답(yy)은 0,10, 1로 정의 함
예측(y^\hat{y})은 0-1 사이의 확률 값으로 나옴.
만일 클래스가 2개 이상이면 정답(yy)을 one-hot vector로 정의 함
예측(y^\hat{y})은 softmax를 씌워서 전체 합이 1이 되게 함
Probabilistic Setting에서 손실 함수는 Cross Entropy를 많이 사용한다.
일반적인 경우 위의 것을 사용하고 이진 문제인 경우 아래와 같이 할 수 있다.
정답이 one-hot vector로 주어지기 때문에 Cross Entropy의 경우 정답이 아닌 클래스는 0이 나온다. 때문에 정답인 클래스에 대해서만 계산이 이루어진다.
계산에 대해 log-\log를 씌우는데, 이것은 로그 함수의 모양 때문이다.
0-1 사이의 구간이 설정되고, 정답에 가까울 수록 loss가 작고, 0에 가까울 수록 loss가 크게 나온다.
KL Divergence라는 손실 함수도 있는데, 두 확률 분포의 거리를 계산하는 개념.
Optimization은 어떤 제약 조건 하에서 x,yx, y가 최대가 되도록 하는 값을 구하는 문제로 생각할 수 있음
Optimization을 구하기 위해 slope를 내려가는 방식으로 구한다.
이를 구하기 위해 비용 함수 JJ에 대해 gradient(미분값)를 구해서 파라미터를 업데이트 하는 방식으로 구한다.
Gradient Descent는 JJ에 대해 미분하고 α\alpha를 곱한 값을 기존 값에서 빼서 새로운 값을 구한다.
Gradient Descent는 몇 가지 문제가 있다.
local optima에 빠질 수 있음.
saddle point(말 안장 같은 생긴 지점. 한쪽 방향으로는 최고점인데, 다른 방향으로는 최저점이 됨)에서는 미분값이 0이 나오기 때문에 어느 방향으로도 움직일 수 없음.
미분이 불가능한 점에서는 사용이 불가능
local minimum에 가까워지면 느려짐
Gradient Descent를 개선한 Stochastic Gradient Descent(SGD)를 사용함.
데이터셋 전체에 대해서 계산하는게 아니라 32, 64, 128개 등 샘플링한 것에 대해 계산.
샘플링 갯수가 클수록 예측은 정확해지지만 계산이 느려짐, 작을수록 그 반대
커지면 커질 수록 조금 늘어나는 것에 대해 효과는 작아짐
전체 데이터에 대해 Gradient Descent를 구하면 Loss는 계속 줄어들게 되지만, Stochastic Gradient Descent를 구하면 Loss가 일시적으로 튀는 구간이 나올 수 있음.