참고 자료들: 


뉴럴 network를 학습하는 방법으로 쓰이는 backpropagation algorithm을알아보자.


주어진 input layer로부터 각 neurun의 parameter(weight, bias)에 의해 연산 결과(\$z_i^l\$)를 activation function (ex: sigmoid, ReLU)을 통과시킨 후 (\$a_i^l = \sigma (z_i^l)\$ )
다음 layer로 넘기는 식으로 forward propagation을 수행하여, 최종 output의 결과를 얻는다.

각 뉴런의 parameter를 학습하는 것은,
보통 parameter의 initial 값 (ex: random)을 준 후, gradient descent 과정을 통해 training data의 cost function C를 줄이는 방향으로 학습하게 된다.
(cost function은 non-convex이므로 gradient descent 방식으로 parameter를 학습한다.)
Gradient descent는 cost function에 대한 parameter들(\$w^l_{ij}, b^l_j\$) 의 편미분값을 이전 parameter값에서 iterative하게 빼준다.
Gradient descent update 식은 다음과 같다.

$$w_{ij}^{(l)} = w_{ij}^{(l)} - \alpha \frac{\partial}{\partial w_{ij}^{(l)}} J(w,b)$$

$$b_{i}^{(l)} = b_{i}^{(l)} - \alpha \frac{\partial}{\partial b_{i}^{(l)}} J(w,b)$$

효율적으로 partial derivative를 계산하는 backpropagation 방법을 소개한다.
*Error term delta의 정의
$$\delta^{(L)}_i= \frac{\partial}{\partial z^{(L)}_i} \frac{1}{2} \left\|y - a^{(L)}_i\right\|^2 = - (y_i - a^{(L)}_i) \cdot f'(z^{(L)}_i)$$

1. feedforward로 각 뉴런의 activation 값을 계산
2. output layer의 error (\$\delta^L\$)를 계산한다.
3. L-1, L-2 레이어로 넘기면서 error \$\delta^{L-1}_i\$ ,...를 계산한다.
\$\delta^l = ({w^l}^T \delta^{l+1})*f'(z^l)\$
4. delta를 이용한 partial derivative 식.
\$\delta_w^l J(w;x,y) = \delta^{l+1} a^l \$


큰 그림으로 보면,


위 그림과 같이  \$w^2_{21}\$ 의 값이 \$\Delta w^2_{21}\$ 만큼 변할 때, layer 2 의 1번째 뉴런의 activation은 \$\Delta a^2_1\$만큼 변하고, 이 변화는 최종 layer까지 전해져 cost를 \$\Delta C\$만큼 변화시킨다.
이는 cost C에 대해 어떤 parameter \$w^l_{jk}\$ 로 미분한 값은 아래 식과 같이 chain rule로 표현될 수 있는 것을 의미하며,
중간에 존재하는 \$\partial a^l/ \partial a^{l-1}\$ 의 의미는 layer의 edge 사이에 곱해지는 weight를 의미한다.
다시 말해보면 3번 step에서 layer 사이의 weight matrix w를 에러 \$\delta^{l+1}\$ 곱하여 전해지는 것은 이러한 chain rule의 의미와 같다고 볼 수 있다. 





Posted by 헬벨

크롬 플러그인 adblock을 설치하고 (https://www.getadblock.com/)

옵션 - 사용자 필터 - 차단 필터에 

http://ams.rmcnmv.naver.com/ 

를 추가하면 끝.


'일상 > 그외' 카테고리의 다른 글

[스포있음] 레옹을 다시봤다.  (3) 2015.12.25
네이버 동영상 광고 생략  (2) 2015.11.25
ALL YOUR BAYES ARE BELONG TO US  (0) 2014.07.02
Coupon Collector’s Problem  (2) 2013.11.14
Posted by 헬벨
ICCV 2015에 발표될 논문으로 caltech pedestrian benchmark 성능을 11%대까지 끌어올림.
전체적인 컨셉:
Adaboost와 같이 boosting 기반으로 weak learner를 cascading할 때 'classifier accuracy' vs 'computation complexity'의 trade-off를 최적화하는 framework를 제안.

<Adaboost>
weak learner f_i 들로 구성된 predictor F에 iterative하게 new weak learner g를 추가하기 위한 일련의 과정들..
(수식 설명은 패스)
epsilon을 이용한 미분식이 명확하게 이해가 되지 않는다.
weak classifier는 feature의 binary decision을 이용한다.

<Complexity-aware cascading>
각 weak learner의 time Complexity를 의미하는 complexity risk term이 추가된다.


Complexity risk term에는 Omega function이 존재한다.
단일 feature를 사용하여 boosting을 하는 경우, 이 Omega function은 step 순서에 상관없이 constant한 값을 갖게 된다. 
논문에서는 여러 feature들 (ACF, HOG, SS, CB, LDA, CNN 논문참고)을 사용하기 때문에,
Classifier의 miss-classification에 의한 risk와 시간이 오래걸리는 feature가 갖는 time complexity risk의 합 (전체 Loss)을 최소화하는 방향으로 weak learner를 선택하게 된다.
즉 complexity 를 고려하지 않는 경우에 비해, 시간이 오래걸리는 feature는 가벼운 feature에 비해 cascade의 뒷단에 위치하게 된다. 

<성능>
단일 feature 대상으로 boosting을 할 경우 complexity term이 의미가 없어지므로 기존 boosting과 차이가 없음.
multi feature로 제안된 방법을 수행할 경우: 수행속도와 detection 성능의 향상을 보임. 하지만 state-of-the-art 보다는 낮은 성능
Large-CNN 모델에의 적용: Large-CNN에의 적용이란, 제안된 방법으로 detect해낸 pedestrain candidate들을 VGGnet 같은 framework의 input으로 넣고 최종 결과를 얻는 것을 의미한다.
즉 R-CNN에서의 region proposal부분을 complexity aware boosting으로 구하겠다는 것이다. 
이렇게 하면 성능이 11%대로 양자쩜프가 일어난다. -0-

<결론>
complexity term을 정의하고 boosting optimization 에 넣은 부분은 참신함.
miss rate 11% 대의 성능이 나오려면, 결국 R-CNN과 같이 Deep learning framework를 사용해야 한다.




Posted by 헬벨
ICCV 2015에 발표될 논문으로 benchmark 성능을 큰 폭으로 향상시킨 논문.
특히 part based detector를 학습시켰다길래 흥미를 갖고 읽어봄.




목적: 보행자 탐지 (pedestrian detection)
특징: Deep learning 이용 (CNN), occlusion handling에 중점을 둠.

기존 연구와의 차별점: 
1) 기존 part-based 연구 (DPM등) 에 비해 단순한 configuration (썩 공감이 되지는 않음).  또한 part annotation이 필요없는 part-based detector 라는 장점이 있음.
2) 기존 occlusion handling 하는 논문과 달리 occlusion pattern을 pre-define하지 않음. extensive part pool로부터 자동 생성한다. 
3) 기존 deep model (중 occlusion을 다루는 연구들) 은 최상위 layer에서 occlusion을 학습하기 때문에 제대로 occlusion 과 visibility가 학습되지 않는다.


<Training Part Detector>
사람 모델을 6 by 3의 cell로 구성하며, part detector의 최소 2 by 2 부터 6 by 3 까지 45개의 part pool을 생성한다. (위 그림 참고)


학습으로는 caltech pedestrian dataset을 사용.
사람 영역을 나타내는 human bounding box 뿐만 아니라, 
보이는 영역을 의미하는 visible region의 bounding box 도 annotation된 정보로 사용한다. (dataset에서 제공되는지는 잘모름)

이를 이용하여 45개의 part detector를 학습하는 방법은 간단하다.
(위 그림 참고)
1) Part patch들을 mining하는 방법
Training data의 ground truth human patch 중, part template에 해당하는 영역(패치)을 positive sample로 사용. 
당연히 grount truth의 visible region이 part template 영역을 포함하고 있어야 한다.
Negative sample은 LDCF[[각주:1]] 라는 성능이 좋은 channel filter 기반으로 탐지된 false positive들을 사용한다. (분석: 자연스럽게 hard negative mining 의 효과를 얻을 수 있다.)

2) Part detector 학습
그 유명한 R-CNN[[각주:2]] framework를 사용.
Pre-training: (i) no pre-training, (ii) use full images, (iii) use cropped images 의 세 가지 방법으로 수행 하고 비교. 당연히 (iii)의 방법이 가장 좋은 성능.
Fine-tuning: R-CNN의 n(=1000) class의 output을 내는 마지막 layer를 2 class (0=not human, 1=human)의 classifier로 바꾼 후 재학습.

이 방법으로 45개의 R-CNN 기반의 part detector가 생성된다. 

3) IOU를 높이기 위한 shifting handling.. 은 생략..



<학습된 45개의 part detector로 최종 결과를 내려면?>
논문에서는 complementarity 라고 최종 과정을 언급함. (각 part detector들의 결합? 이라는 의미?)
//part detector의 outputs (45개) 위에 SVM 과 같은 classifier 를 스택하여 final decision을 찾는 방법을 사용하지 않고, 
45개의 part detector의 complementarity 를 학습하기 위해 45 detector scores 를 입력으로 하는 linear SVM을 학습하고,
SVM weights의 top 6 weight 를 갖는 part detector를 선별하여 (아래 그림 참고)

이 파트들의 ensemble SVM으로 학습하여 최종 결과를 낸다고 한다. 
허나 이부분이 clear하게 설명되어있지 않음. ensemble classifier인 bagging이나 boosting을 의미하는 것 같지는 않음.

실험 결과부분에서, 6개 part detector의 simple combining에 비해 학습된 complementarity를 이용한 것이 성능이 좋다고 표현한 것으로 보아
추측하건데, complementarity는 linear SVM의 weight를 의미하며, complementarity를 고려한 combination은 weighted sum이 아닐까 생각해본다..


<내 결론>
큰 성능의 향상 가져옴. 
기술적으로는 wow 할만큼 새로운 것은 없는 듯.
코드가 공개되면 학습된 모델을 part detector로 사용하여 crowded scene에서 적용해보는 것이 목표.










  1. http://vision.ucsd.edu/~pdollar/files/papers/NamNIPS14ldcf.pdf [본문으로]
  2. http://arxiv.org/abs/1311.2524 [본문으로]
Posted by 헬벨