2017년 12월 18일 월요일

RL Summary

RL 학습할 net(RNN or DNN)이 있다고 가정하자. net 출력은 $prob$ (부류별) 값으로, action 부류별 분포가 혼합된 multi-nomial $prob$이다. Monte Carlo 샘플링으로 부류정보와 $prob$ 얻고, 부류 정보(action)는 제어 대상 system에 가해서 reward 얻는다.

reward 값으로부터 학습할 net loss를 구성하면,

$loss = -\sum( \log{p_i} * (r_i-baseline) )$

이다. $r$은 최신값에 가중된(그리고 정규화된) 보상 값이다. 또,

$baseline = \begin{cases}
                0, reinforce(정규화\ 시^{각주1})\\
                Moving\ average\ of\ r_i, reinforce(정규화\ 않을\ 시)\\
                V, Actor\ Critic(V는\ 가치망\ 출력)\\
                \end{cases}$

이다. RL이 적용된 사례를 보면 다음과 같다.

(예 1) Cartpole 문제 상태 입력은 state 요소간 상관성 없음 (요소간 독립적). 따라서 RL net은 rnn대신 dnn 사용
(예 2) NAS 경우, RL net 출력을 이용하여 구성하는 reward 시스템(DNN Archtecture)은 전후 상관성(Layer 연결로 이전 값이 다음 값에 영향 줌) 존재. RL net은 RNN을 사용하며, LSTMCell 출력을 다음 셀 입력으로 넣는 과정으로 구성.

(예 3) ENAS 경우
RNN 출력값 샘플링 -> 샘플링 다수(여러 DNN 사례 생성) -> 여러 DNN 구성 -> 최적 오차 net 선택 -> 선택  net 오래 학습 -> reward -> RNN 학습.

ENAS 출력은 2255/3355/4455/5555/6655이다.
2255는 2,2,5,5개 출력을 가지는 LSTMCell 4개: 2(DNN Micro-Cell 두 개 입력 중 어디 선택할지 onehot vec 표현), 5(연산자 5개 중 어떤 선택할지).
LSTMCell 출력은 [(None,32),(None,32),(None,32)] 3개 요소, 첫번째는 reshape((None,1,32)으로) 해서 다음 LSTMCell 입력으로 사용하고 상단부 dense넷 입력으로도 사용.
나머지 2개는 다음 LSTMCell 용 state 입력으로 사용(cell, hidden).
2255 네 개 중 마지막 출력은 3355 네 개 셀 첫 입력으로 사용.

3355는 3,3,5,5개 출력을 가지는 LSTM셀 4개: 3(세개 입력중 어디 선택할지), 5( " )
...



(각주1) 정규화는 저장된 보상값 $r$ 리스트 평균을 구해 빼고 분산을 나눈다.

2017년 11월 2일 목요일

Actor-Critic

상태 $s$를 받아 action $a$를 출력하는 신경망(deep neural network, 인자 $\theta$로 표현)이 하나 있다.

$p(a|s; \theta)$

여기서 $p$는 파라메터 $\theta$로 표현되는 망의 출력 값이고, 상태 $s$를 입력받아 계산된 action 확률값이다.
만일 action 라벨이 있다면 교사학습이 되고 cross-entropy식은

$loss = -\log {p(a|s)*y}$

이다. $loss$를 줄이도록 학습을 진행하면 된다. 이 때 $p$는 prediction값이고 $y$는 교사값이다.


그런데 강화학습(RL)에서는 입력 $s$에 대해 어떤 action이 유리한지를 표현하는 $y$가 직접 주어지지 않는다.

강화학습에서 망의 학습 방법을 살펴 보자.
$p(a|s; \theta)$에 임의 상태 $s$를 입력하여 얻은 action 중에서 하나($a_s$라 하자)를 택한다.
이 값을 제어 대상인 환경 $env$에 작용시켜 응답을 얻는다. 이 응답을 미래보상의 근사치 계산을 위해 이용한다.

($p(a|s)$는 정책(policy)이라 부른다. 주어진 상태에서 어떤 행동을 택할지에 대해 각각 행동에 분배한 확률이다.)


환경 $env$에 $a_s$를 가하면,

$s', r, d, = env.step(a_s)$

이고 출력은 다음상태 $s'$, 즉각보상 $r$ 등이다.

만일 우리가 큐함수 $Q(s,a)^{각주1}$를 가지고 있다면 현재 상태 $s$에 대해 어떤 action이 좋은지 Q값에서 직접 얻을 수 있다. 그러나 $Q(s,a)$는 최적 미래 보상을 나타내는 일종의 매직함수이므로 직접 구하기 어렵다.
Q를 구하기 어렵기 때문에 근사화 하기 위해 가치망 $V$를 이용한다. $V(s)$로 각 스텝(state)에서 얼마나 행동이 좋은지 판단한다.

따라서 최적 미래 보상(reward)인 교사치 $y$는

$y = Q(s,a) = r + V(s')$

이고, 이 식이 Bellman 방정식이다.
(DQN에서는 $V(s')$ 대신에 max $Q(s',:)$를 이용했었고 $r$+max $Q(s',:)$를 best action으로 사용하였다.)

이상에서 $p(a|s; \theta)$는 정책망(policy net)이고 $V(s)$는 가치망(value net)이다.


정리하면, 정책 근사는 정책망 $p(a|s; \theta)$로 하였고, Q함수를 표현하기 위해 망이 하나 더 필요한데 이를 위해 가치망이 사용된다. 가치망은 정책 근사망인 $p$를 평가한다.
따라서, 이를 actor-critic이라고 부른다. actor는 정책 발전의 역할, critic은 정책 평가의 역할을 맡는다. 2개 망 동시 학습이 필요하다. 정책망의 경우 교사치

$loss = -\log {p(a_s|s; \theta)*[y-V(s)]}$

를 gradient descent로 학습하면 된다. 수렴은 policy gradient에 기반하며 다음을 참고한다. $y$에서 $V(s)$를 뻼은 학습 시 variance를 줄인다.
여기서 $p(a_s|s)$는 정책망 $\theta$에 $s$를 입력하여 출력으로 나온 여러 action 중에서 $a_s$에 대응하는 확률 값이다.

가치망의 학습은

$loss=(y-V(s))^2$

을 직접 줄이도록 진행된다.


참고 문헌
[1] Naver D2
[2] DennyBritz github


(각주 1) $Q(s,a)$ 함수는 Quality 함수라 하고, 상태 $s$에 대해 어떤 action $a$를 선택할지를 미리 Lookup table로써 만들어 놓은 것이다. $s$나 $a$ 공간을 이산화 했을 때, 개수가 몇 개 안되면 생성 가능 하지만 상태공간이 커지면 만들기 어려워 진다.



2017년 10월 19일 목요일

DQN

DQN(Deep Q-Network)은 딥 신경망(DNN)을 이용하는 강화학습(Reinforcement Learning)의 일종이다.

환경 $env$를 제어하는 강화학습에서 action $a$에 대한 확률을 결정하는 Q(Quality) 함수는 $Q(s,a)$로 주어진다. 상태 $s$에 대해 적절한 행동 $a$를 결정하는 정책이 들어 있다.

적절하다는 것은 주어진 환경 $env$의 현재 상태 $s$에서 action $a$를 선택했을 때 다음 단계에서 끝 단계 작업(episode) 종결 시까지 얻을 수 있는 보상 합의 최대값을 줄 수 있다는 것이다. 이런 Q함수는 이상적이지만 실제로 존재할 수 없는 일종의 매직 함수이다.

DNN은 $Q(s,a)$ 함수를 근사한다. Q는 주어진 상태 $s$를 입력 받아 여러 액션 중 하나의 $a$를 줄 수 있어야 한다. Q를 근사하는 DNN은 입력 $s$를 취해 여러 $a$에 대한 확률값 출력을 제공 한다.



매직 함수인 Q를 실제 계산하기 위해서는 현 상태 s에서 작업 종결 끝까지 반복 수행하면서 단계별 보상을 더해서 구한다. 그러나 이는 불가능하므로, 근사적으로 구하는 방법을 취한다.

이 과정은 다음과 같다.
현 상태 $s$에서 제어 대상 환경 $env$에 어떤 action을 가하고, 어떤 reward가 발생하는지 본다. 이 reward를 이용하여 Q를 갱신하고, 변경된 상태를 다시 갱신된 Q에 넣어 추출한 $a$를 $env$에 가하고 어떤 reward가 발생하는지를 살펴보고 Q를 또 갱신한다. 이러한 과정을 수없이 반복하다보면 초기에는 매직 Q와 멀었던 Q 함수가 점점 이상적인 Q에 가까와 지게 된다.

정리를 해보면 DQN의 요소에는

1. $Q(s,a)$를 표현하는 DNN이 있고
2. 액션 $a$를 가해 상태를 $s$에서 $s'$로 바꿀 환경 $env$가 존재한다.

환경 $env$는 현재 상태 $s$에서 액션 $a$를 가할 경우, 상태를 $s'$로 바꾸고, 보상 값을 리턴한다.

$s', r, d = env.step(a)$

의 형태인데, $a$를 입력으로 받아 $s$는 $s'$가 되고, 보상 $r$과 현재 episode 종결여부 $d$를 리턴한다.




통상 DNN의 학습을 위해서는 predict와 label이 필요하며 두 값의 차이가 loss이고 DNN은 loss를 최소화 하도록 내부 파라메터들을 갱신하게 된다.

predict와 label을 정의하기 위해 $env$에 가해지는 한 단계만의 액션을 생각해 보자.
현 단계 $Q(s,a)$를 표현하는 DNN이 있다. 먼저 $env$를 한 단계 전진 시키기 위해서는 $env$에 가할 $a$가 필요하다.

(1) $a$를 구하기 위해 현 상태 $s$를 DNN에 입력하여 DNN이 주는 최적의 $a$를 택한다. 이 $a$는 갱신전 DNN(즉, Q)이 주는 $a$이다.
(2) $a$를 $env$에 가해 $s', r, d$를 얻는다. 이 때, 새로 생성된 $s'$를 이용한다. DNN에 넣어 새로운 $Q(s', :)$를 만들어 낼 수 있다.

벨만 방정식 (Bellman equation)은 갱신된 Q값이 근사적으로 다음과 같음을 보여준다.

$Q(s,a) = r + max Q(s', :)$

갱신된 Q값은 $env$에 $a$를 가해 얻은 보상 $r$에다 새 상태 $s'$에 대한 Q값 중 최대값의 합으로 주어진다.

여기까지 계산하면 이전의 Q와 갱신된 Q가 얻어진다.

predict는 현재 Q(즉 현재의 DNN)에서 $s$를 넣어 나오는 $a$를 취하고, label은 Bellman식을 통해 계산된 값을 취한다.
그런데, Bellman식은 초기 Q에 $a$를 가해 만든 새로운 Q값이므로 해당되는 그 $a$의 값에 대해서만 갱신된 값이다.

즉, $a$의 액션 공간이 0~2까지로 3개라고 하면 초기 $Q(s)=DNN(s)=a[0:3]$이고, $env$에 가해준 $a$가 $a[1]$이었다면,
label역할을 하는 갱신 $a$는 3개 값 중, $a[0], a[2]$는 같고, $a[1]$만 달라진,
{ $a[0],\ r+maxQ(s', :),\ a[2]$ }이다.

따라서

predict = {$a[0], a[1], a[2]$}
label = {$a[0], r+maxQ(s', :), a[2]$}

이다.



2017년 1월 24일 화요일

분류 오차에 Cross entropy를 사용하는 이유

신경망 분류 오차를 줄이기 위한 최적화는 Net 출력 결과와 사용자 Label 정보 차이를 Error 정의한 후, 값을 줄이도록 Net 파라메터를 바꾸어 나가는 것이다

오차로는 분류 오차(classification error) 평균제곱 오차(MSE: mean square error) 일반적으로 생각할 있는 것들이다.
하지만 이들 보다 평균 Cross Entropy 오차(ACE: Averaged cross entropy error)를 빈번하게 사용하며 이유가 있다


적절히 학습된 Net 2개 있다고 하자. 부류(class) A, B, C 3개라고 했   두 넷이 주는 결과는 아래와 같다고 가정한다.


첫번째 넷이 주는 계산 결과:
계산결과         | 라벨(A/B/C)           | correct?
-----------------------------------------------
0.3  0.3  0.4  | 0  0  1 (A)          | yes
0.3  0.4  0.3  | 0  1  0 (B)          | yes
0.1  0.2  0.7  | 1  0  0 (C)          | no
분류 오차(classification error)를 계산해 보면 사용된 3개 샘플 중에 1개가 라벨과 일치하지 않으므로 1/3=0.33이다. 또한 분류 정확도(classification accuracy)는 2/3=0.67이다. 계산 결과를 보면 첫 샘플 2개는 겨우 맞추었고 세번째 샘플은 완전히 틀렸다.




두번째 넷이 주는 계산 결과:

계산결과         | 라벨(A/B/C)           | correct?
-----------------------------------------------
0.1  0.2  0.7  | 0  0  1 (A)          | yes
0.1  0.7  0.2  | 0  1  0 (B)          | yes
0.3  0.4  0.3  | 1  0  0 (C)          | no
첫번째 Net과 마찬가지로 분류 오차는 0.33이고, 분류 정확도는 0.67이다. 그러나 첫 두 샘플은 위 Net 보다 좀 더 확실히 맞추었고 세번째 샘플은 아깝게 틀렸다. 


위 두 Net을 비교하면서 분류 오차를 살펴 보면, 단순 분류 오차 계산은 틀린 개수에 대한 결과만 줄 뿐 라벨과 비교하여 얼마나 많이 틀렸는지, 얼마나 정확하게 맞았는지 그 정도에 대한 값을 제공하지 않는다. 



이와 비교하여 Cross entropy 오차를 계산해 보자. Cross entropy error의 정의

$-\sum_{i} y_i log(y_i^\prime)$

와 같다. $y_i$는 라벨값으로 one-hot vector로 주어지고, $y_i^\prime$는 넷 계산결과이다. 
첫번째 넷, 첫번째 샘플에 대해 계산해 보면 다음과 같다. 


-( (ln(0.3)*0) + (ln(0.3)*0) + (ln(0.4)*1) ) = -ln(0.4)


나머지 두 샘플 모두에 대해 계산하고 평균하면       


-(ln(0.4) + ln(0.4) + ln(0.1)) / 3 = 1.38

이다. 두번쨰 넷에 대해 평균 cross entropy를 계산하면


-(ln(0.7) + ln(0.7) + ln(0.3)) / 3 = 0.64

가 된다. 두 넷의 결과를 비교해 보면 두번째 넷이 오차가 더 작음을 알 수 있다. 즉, 넷이 주는 분류 오차에 정확도가 고려되어 최적화 관점에서 어떤 넷이 더 잘 학습되었는지를 알 수 있다. 수식에서 $log$ 연산자가 그 역할을 한다. 



다음으로 평균 제곱오차에 대해 살펴 보자. 
첫번째 넷, 첫번째 샘플에 대해 제곱오차를 살펴보면


(0.3 - 0)^2 + (0.3 - 0)^2 + (0.4 - 1)^2 = 0.09 + 0.09 + 0.36 = 0.54


이고 나머지 두개의 샘플에 대해 계산하고 평균한 제곱오차를 계산하면 다음과 같다. 
(0.54 + 0.54 + 1.34) / 3 = 0.81

첫 두 샘플은 맞은 것이고 세번째는 틀린 것이다. 제곱오차 크기는 세번째가 가장 크다.


두번쨰 넷에 대해서도 유사하게 계산하면
(0.14 + 0.14 + 0.74) / 3 = 0.34
이다. 


두 넷에 대한 계산 결과에서 보듯이 MSE는 틀린 샘플에 대해 더 집중하는 특성을 가진다. 맞은 것과 틀린 것에 똑같이 집중해야 하는데 그렇지 않아 오차 정의로는 적절하지 않다.



학습 과정 동안 나타나는 평균 제곱 오차(MSE)와 교차 엔트로피 오차(ACE)를 비교해 보자.
역 전파 학습 중에 목표 값(label)에 따라 출력 노드 값을 1.0 또는 0.0으로 설정하려고 한다.

이 때, MSE를 사용하면 가중치 계산에서 기울기 값에 (output) * (1 - output)이라는 조정 요소가 포함된다. 계산 된 출력이 0.0 또는 1.0에 가깝거나 가까워짐에 따라 (output) * (1 - output)의 값은 점점 작아진다.
예를 들어 output = 0.6이라면 (output) * (1 - output) = 0.24이지만 출력이 0.95이면 (output) * (1 - output) = 0.0475이다. 조정 요소가 점점 작아지면서 가중치 변화도 점점 작아지고 학습 진행이 멈출 수 있다.

그러나 ACE를 사용하면 (output) * (1 - output) 항이 사라진다. 따라서 가중치 변화는 점점 작아지거나 하지 않으므로 학습이 멈추거나 하지 않는다.
(위 경우는 노드 Activation을 softmax로 했을 경우이다.)



참고 문헌
[1] J. M. McCaffrey의 블로그












2016년 9월 13일 화요일

ResNet

딥 네트웍의 층이 깊어지면 추상화 능력이 높아져 표현 능력이 커지고, 비선형성이 높아지므로 더 복잡한 문제를 수용할 수 있다.  그러나 깊은 넷을 학습하는 것은 gradient vanishing/expoding문제로 인해 더 어렵게 된다.



깊은 층을 가지는 네트웍을 학습하기 위해 ReLU, Dropout, Normalized initialization, Intermediate layer normalization, Batch normalization 등의 다양한 기술이 개발되어 왔다. 이러한 기술들을 통해 딥넷의 층의 수를 높이면 일정 수의 깊이까지는 인식률이 증가한다
상기한 그림을 보면 최근 10년의 연구결과는 DNN 깊이의 증가에 따라 오차률이 점차 개선됨을 보여 준다


그러나 CIFAR-10 문제의 학습 오차에서 보듯이 기존 넷(plain net)의 경우 깊이를 단순히 증가만 시키니 학습 오차가 오히려 더 증가하였다. 그림에서 20개의 레이어를 가진 넷보다 56개의 레이어를 가진 넷의 오차가 더 크게 나타난다.  


깊이의 한계가 깨진 것은 ILSVRC'2015에서이다. DNN 깊이 증가의 혁신이 일어나는데 ResNet이 그 주인공이다. 직전의  22개의 층을 가진 GoogLe넷에 비해 획기적으로 증가된 152개의 층을 가지고 있으며 2015년 영상 분류, 물체 감지, 객체 분할 등의 벤치마크 분야에서 가장 높은 성능을 보여주었다.





ResNet 이해의 핵심은 identity 매핑이다. 위 그림에서 좌측은 2014년의 VGG넷이고 우측은 VGG넷을 일부 변경한 더 깊은 넷이다. VGG넷은 2014년에 기존 분류기 중에서 최고의 성능을 낸 것으로 알려져 있다.
두 넷을 비교할 때 파란색의 추가 블럭(extra layers)들을 주목하자. 만일 이 블럭들이 입력에 대해 입력과 동일한 출력을 줄 수 있다면 VGG넷에 아무 영향을 주는일 없이 추가 할 수 있다. 즉, 입출력이 같다면 추가하여도 빼버려도 무관할 것이다. 입출력이 동일하므로 이 블럭들은 identity 매핑을 하는 유닛이고 얼마든지 층들을 쌓아서 깊은 층을 가진 넷을 구성할 수 있다.

또 다른 면에서 생각해 보면, 유닛이 추가되기 전의 VGG넷이 최적이라고 가정하자. 이때 추가된 유닛이 최적으로 학습 되었다면, 전체 VGG넷은 유닛 추가 전의 최적 성능을 내어야 하고, 추가 유닛은 identity 매핑을 하여야 한다.  


그런데 개별 유닛을 살펴보면 아래 그림과 같다. 두 세개의 학습 층과 ReLU 활성부를 가지고 있다. 즉,여러개의 비선형 층들이 쌓여 있으며 이러한 복합층들로는 입출력이 같은 identity 매핑을 만들기가 어렵다.


이 유닛을 identity 매핑으로 만들기 위해 유닛의 구조를 약간 바꾼다.


skip 메카니즘이라고 부르며 층을 건너 뛰어 입력을 바로 출력부로 연결한다. 이렇게 유닛을 구성하게 되면 입력은 그대로 출력으로 나가게 되므로 identity 매핑이 만들어지고 중간에 거치는 층들은 웨이트 값들이 0이나 0근처의 값을 가져도 될 것이다. 즉, 어떤 맵핑을 만들기 보다는 잔차(Residual)나 변동(perturbation)을 검출하기 적절한 내부 유닛으로 바뀌게 된다. 

Residual block

Resnet은 연산량과 파라메터의 수를 줄이기 위해 bottleneck 블럭을 사용하는데 아래 그림과 같다.


좌측의 원형 residual block을 수정한 것이 우측의 bottleneck block이다. bottleneck 블럭은 가운데에만 파라메터가 몰려있어 이름이 이렇게 붙여졌다. 이 블럭은 더 많은 맵 수를 유지하면서도 내부 파라메터의 수는 더 작다. 파라메터 수를 계산해 보면, 좌측은

$3\times3\times64\times64+3\times3\times64\times64=73,728$

개가 되고, 우측은 

$1\times1\times256\times64+3\times3\times64\times64+1\times1\times256\times64=69,632$

개이다. 즉, 특징 맵의 수는 더 많이 유지하면서도 파라메터 수는 비슷하거나 더 작다. 여기서 1x1 convnet연산이 맵의 수를 바꾸기 위해 사용되었다.



ResNet(Residual Net)은 Residual block을 여러개 반복적으로 쌓아 많은 수의 층을 가진 넷으로 구성한다. 층의 수가 많으므로 비선형성이 높아 Alexnet이나 VGG에서 사용하는 FCL(fully connected layer)을 가지지 않는다. 1x1 conv층은 FCL과 같고 이러한 FCL이 block마다 있으므로 따로 FCL이 필요하지 않기도 하다.
FCL 대신에 ResNet에서는 Average pooling을 사용하는데 AP은 맵별로 값의 평균을 구하고 이 평균값들의 벡터를 특징값으로 사용한다. 예를 들면, ResNet의 말단에서 <mini-batch, 512,4,4>의 맵이 AP되면 <mini-batch,512,1,1>이 된다.
보통 기존 넷 내부의 파라메터들은 FCL에 몰려 있는데 이 부분이 없으므로 층의 깊이에 비해 파라메터의 수가 많지 않다. 따라서 런타임에서는 ResNet의 실행 속도는 VGG등과 비슷하거나 오히려 빠르다. 





(Ref.) 
[1] Kaiming He. et. al., Deep residual learning for image recognition, 2015.
[2] Kaiming He. et. al., Identity mapping in deep residual networks, eccv'2016.
[3] Kaiming He. et. al., ResNet presentation



















2016년 9월 11일 일요일

Batch Normalization

Batch Normalization은 딥러닝 네트웍의 학습에서 gradient vanishing과 exploding을 회피하기 위한 방법 중의 하나이다.

딥러닝 알고리즘은 층이 깊어질수록 표현 능력과 추상화 레벨이 높아지는 것으로 알려져 있다. 그러나 층이 깊어질 때 출력단의 Loss값의 gradient가 내부로 도달하지 않고 소멸해버리는 현상으로 학습에 한계가 있었다. 이러한 문제점을 해결하고 깊은 층을 가지는 넷을 설계하기 위해, ReLU 활성함수, Dropout, 학습 샘플 초기화 전략, Learning rate 조절 등의 여러가지 방법이 개발되어 왔다.

딥러닝 구조의 내재적 불안정성은 Internal Covariance Shift 현상에 의한 것으로 BN 논문의 저자는 주장한다. 이것은 넷 각 층의 입력 값의 분포(variance)가 일관성없이 계속해서 달라지는 현상을 말한다.
레이어 입력값 분포의 변화가 발생하면 입력을 받아들이는 레이어는 새로운 분포에 계속해서 적응해야 한다. 레이어의 입력 값은 이전의 모든 레이어 파라메터에 의해 영향을 받고, 네트웍 파라메터의 작은 변화는 네트웍이 깊어질 때 증폭되고 학습의 복잡성은 증가한다.

이에 대한 해결책으로 각 층의 입력값의 평균을 구해 제거하고 분산으로 값들을 나누어 표준편차를 1로 만드는 것을 생각할 수 있다.
그러나 이 방법은 역행렬의 요구 등으로 계산량이 많은 점과 $f=Wx+b$의 연산에서 오프셋 $b$의 영향이 소거되는 등의 문제로 적용이 어렵다.

또한 층의 입력 값을 정규화를 통해 평균 0, 분산 1로 고정시키는 것은 Activation 함수의 가장 중요한 역할인 비선형성을 없애 버릴 수 있다. 즉, 넷은 비선형성을 가지고 있어야 복잡한 함수를 표현할 수 있는데 이 능력이 사라질 수 있다.  예를 들면, sigmoid 활성함수의 입력 값이 평균 0, 분산 1이라면 입력 값의 범위는 -1~+1이 되고, 이 범위의 sigmoid 함수 값은 0.5를 중심으로 0.2~0.7사이의 거의 직선인 선형 영역이다.
이 점을 보완하기 위해 정규화된 값에 scale 팩터($\gamma$)와 shift 팩터($\beta$)을 도입하고 정규화된 값에 곱하고 더해준다. 두 인자는 오차 역전파 과정에서 학습해 준다. 이를 통해 활성함수로 들어가는 값의 범위를 바꾸어줌에 의해 비선형성을 부여할 수 있다.


$BN(x_i)=\gamma(\frac{x_i-\mu_B}{\sqrt{\sigma^2_B+\epsilon}})+\beta$

BN의 적용 방식은 현재 입력되는 학습 샘플의 mini-batch에 대해 특징 맵 별로 정규화를 수행한다. 이 값에 scale과 shift팩터를 곱하고 더해 적용하게 된다. 따라서, 맵 별 파라메터는 2개이다.
예를 들면, 어떤 중간층에서 BN유닛의 입력이 (mini-batch,128, 32, 32)였다면 (mini-batchx32x32)의 데이터에 대해 mean($\mu_B$)과 vari($\sigma_B$)를 구해 정규화를 수행한 후 scale, shift팩터를 위 식처럼 적용한다. 인자 수는  맵이 128개이므로 256개이다.


(Ref.)
[1] Batch Normalization: Accelerating deep network training by reducing internal covariance shift, ICML2015.
[2] Batch Normalization의 설명 및 구현
[3] Understanding the backward pass through BN Layer


2016년 8월 6일 토요일

선형 분류기

정의

하나의 층(layer) 만을 가진 분류기이다. 층의 수를 셀 때 입력층은 제외하므로 입력층 하나와 출력층 하나만을 가진 신경망이며 딥 신경망의 가장 기본적인 형태이다. 선형분류기의 학습에 필요한 수식과 용어들을 살펴보자.  

score 함수: 입력 데이터를 부류별 득점(스코어) 값으로 바꾸는 함수
loss 함수: 스코어 값과 참 값(ground true)이 얼마나 일치하는지를 수치화한 함수

선형분류기의 연산은 다음 수식을 통해 수행된다.

$f(x_i, W, b) =  W x_i + b$
여기서 $f$는 score 함수이고 $x$는 입력, $(W, b)$는 분류기의 파라메터 값이다. Loss 함수는 스코어 함수를 이용하여 구성된다. 



Loss 함수

SVM loss와 cross entropy(softmax) loss 두가지에 대해 살펴본다. Loss는 손실이니 손실이 작아지도록 분류기를 설계해야 한다. 

(1) SVM Loss


Multiclass SVM

기계학습에서 소개되는 기존의 전통적 SVM(support vector machine) 마진을 최대화하는 이진 분류기(binary classifier) 얻는 것이었다. 
여기서는 다 부류를 분류하는 경우에 어떻게 SVM으로 비용(penalty)을 정의하는지에 대해 살펴본다. 

어떤 입력이 들어가 선형분류기를 통과해서 클래스당 스코어 값을 얻었다고 하자. 이 때 SVM Loss는 부류별 출력 값 중 입력이 속해야 하는 정 부류(correct class) 스코어가  부 부류(incorrect class) 스코어보다 어떤 마진이상  값을 가지도록 하는 Loss이다.
스코어 값 차이가 마진보다 크면 SVM 로스는 0, 그렇지 않으면 차이 값에 의한 Loss가 나타난다.

$L_i = \sum_{j\neq y_i} \max(0, s_j - s_{y_i} + \Delta)$,  where $s_j = f(x_i, W)_j$.

여기서 $s_j$는 입력 $x_i$가 선형분류기 $f$를 통과해서 얻어진 부류 $j$에 대한 score 값을 나타낸다. $s_{y_i}$는 정 부류에 대한 스코어 값이다.


(예제
만일 3개의 부류(즉, 출력 클래스)를 가지고 있고, 어떤 입력 데이터에 대해 스코어 $s=[13, -7, 11]$ 나왔다고 하자, 첫번째 클래스가 true 클래스라고 가정하고, 마진 값은 10이라 가정한다. 위 수식에 넣어서 계산하면,

$L_i=max(0,-7-13+10)+max(0,11-13+10)$.

수식의 두 항중에서 첫번째 항은 0이다. 13> -7이고 10이상의 차이가 난다. 두번째 항은 13>11이지만 2밖에 차이가 안나고, 8 값이 나온다. 즉, 정 부류의 스코어 13은 부 부류의 스코어 11과의 마진이 10이 될 만큼 충분하지 않아 loss 8이 생기고, 전체 로스도 8이

Regularization


분류기가 같은 Loss 값을 주었다고 해도 이 Loss를 결정하는 파라메터 $(W, b)$는 유일하지 않을 수 있다. 이 문제를 해결하고 분류기의 일반화 능력을 높이기 위해  Loss 값에 Regularization이라 불리는 두번째 항을 추가한다
$R(W)$는 weigts 행렬의 각 요소 값들의 절대치 합(L1 penalty), 또는 제곱 합(L2 penalty)으로 요소값이 커지는 것을 억제한다.

$L =  \underbrace{ \frac{1}{N} \sum_i L_i }_\text{data loss} + \underbrace{ \lambda R(W) }_\text{regularization loss} \\\\$


Regularization항은 일반화 능력을 높이고 $w$값의 확산을 유도한다.

(예제)
입력이 $x=[1,1,1,1]$이다. 선택 가능한 가중치에 $w_1=[1,0,0,0]$과 $w_2=[0.25,0.25,0.25,0.25]$가 있다면 둘 중 어떤 것을 선택할지에 대해 살펴본다. 두 가중치에 대한 선형 분류기 연산은

$w_1^Tx = w_2^Tx = 1$

로 둘 다 1이다. 따라서 위의 식 $L$에 대입해 보면  가중치 벡터는 같은 값의 data Loss(첫번째 항의 값)을 준다. 그러나 두 번째 항을 살펴보면, $w_1$ L2 penalty 1이고, $w_2$는 0.25이다. 따라서 더 작은 $w_2$ 선호된다

$w_2$는 $w_1$보다 크기가  작고 값이  퍼져(diffuse)있다. 이것은 입력 $x$의 4개 값 중의 특정 부분에 집중하는 보다는 모든 입력요소가 골고루 기여하게 하고, 이것은 일반화 능력의 상승과 과적합(overfitting) 감소로 나타난다


(2) Cross-entropy Loss


Softmax classifier


SVM 로스 외에 보편적인 Loss 중의 하나인 cross entropy 로스를 사용하는 softmax 분류기를 살펴 본다. data loss항은 다음과 같다. 

$L_i = -\log\left(\frac{e^{f_{y_i}}}{ \sum_j e^{f_j} }\right) $


cross-entropy는 정보 이론(information theory)에서 왔는데 참 분포 $p$ 추정 분포 $q$ 사이의 cross-entropy[2] 

$H(p,q) = - \sum_x p(x) \log q(x)$

처럼 정의된다. 두 확률 분포의 겹칩의 정도를 표현하는 식이다. 
따라서 softmax 비교하여 $q = e^{f_{y_i}} / \sum_j e^{f_j}$이고, $p=[0,…,1,…0]$라면(, one-hot 벡터처럼 정확한 부류 하나만 1이고 나머지는 0인 경우) 식은 같다.
두 식의 모양은 동일하며 softmax 분류기는 cross-entropy loss 분류기로 불린다. 



수치적 안정성

지수 값을 가진 $exp$ 함수는 값이 아주 크고, 값의 나누기는 수치적 불안정성을 야기한다. 
이를 해결하기 위해 

$C=-\max_j{f_j}$

되도록 선정된 $C$값을 분자/분모에 곱하여 해결한다($exp$ 지수 값이 0근처로 shift 된다). 

$\frac{e^{f_{y_i}}}{\sum_j e^{f_j}}$ $= \frac{Ce^{f_{y_i}}}{C\sum_j e^{f_j}}$$= \frac{e^{f_{y_i} + \log C}}{\sum_j e^{f_j + \log C}}$



softmax 확률값

확률값이 confidence 의미하는 것은 아니다. 만일 regularization $\lambda$ 증가시키면 $w$ 값이 퍼지고 이에 따라 클래스의 스코어 값이 퍼지도록 변화된다. 따라서 스코어의 ordering 중요하지 절대 값은 변화 가능하다.



References

[1] cs231n linear classification
[2] 오일석, 패턴인식, 부록, 교보문고