Batch normalization 이란

 - 각 층의 입력값의 평균을 0,  표준편차를 1로 만드는 것 (정규화, 입력 분포의 균일화)

 - 학습 속도가 개선 (학습률을 높게 설정할 수 있기 때문)

 - 가중치 초기값 선택의 의존성이 적어짐 (학습을 할 때마다 출력값을 정규화하기 때문)

 - 과적합(overfitting) 위험을 줄일 수 있음

 - 테스트시에는 학습 동안 저장된 이동 평균값들로 Normalize

 

Batch normalization tips

 

1) Use With Different Network Types

 It can be used with most network types,

   such as Multilayer Perceptrons, Convolutional Neural Networks and Recurrent Neural Networks.

 

2) Probably Use Before the Activation

It may be more appropriate to use batch normalization after the activation function


3) Use Large Learning Rates

Using batch normalization makes the network more stable during training.

This may require the use of much larger than normal learning rates,

that in turn may further speed up the learning process.

 

4) Alternate to Data Preparation

If the mean and standard deviations calculated for each input feature are calculated

   over the mini-batch instead of over the entire training dataset, then the batch size must be sufficiently

   representative of the range of each variable.

1. 6살 아이에게 처음으로 '고양이'를 가르쳐 준다고 상상해보자.

2. 색이 까만 고양이, 귀가 접힌 고양이, 뚱뚱한 고양이 등 다양한 형태/종류의 고양이를 보여주면서 이들 모두 '고양이'라고 알려줘보자.

3.  네 발로 걷고, 인간과 친숙하며 몸이 털로 덮힌 강아지들을 보여주며 이들은 고양이가 아니고 강아지라고 알려주자.

 

4. 자 이제 새로운 고양이/강아지 사진들을 보여주면서 고양이인지 강아지 인지 구분하도록 해보자.

처음에는 틀릴 수도 있다. 틀리면 틀렸다고 알려주고 다른 사진을 계속 보여주면서 테스트를 해보자.

 5. 어느정도 지나면 아이는 고양이와 강아지를 구분해낼 것이다.

 

 6. 여러가지 고양이 사진을 접하면서 눈을 관찰한 고양이의 특징을 뇌에 각인 시킨 것이다.

 7. 자 이제 컴퓨터에게 고양이를 가르쳐 보자 (컴퓨터로 고양이를 구분해내는 모델을 만들어 보자)

 

 8.  초기의 컴퓨터 이미지 인식 모델은 물체(object)의 형태(Shape)를 인지하고 구분해내는 방식으로 설계되었다. 

즉 "귀가 쫑긋 솟아 있으며 몸이 길쭉하고 꼬리가 있는 형태라면 '고양이'다" 라고 말이다.

9. 하지만 아래에 이미지 속에 있는 고양이는? 

고양이 형태를 모델링한 것과 일치하지 않으므로 고양이로 구분해내지 못했을 것이다.

10. 반면, 충분히 학습한 아이는 고양이를 구분 해냈을 것이다. (아이에게 고양이를 학습시킬 때 다양한 모습의 고양이를 보여주었다는 전제) 아이는 단순히 고양이를 형태로만 구분하는 것이 아니기 때문이다. 

 

11. 이러한 인간의 학습 방식에 착안하여 '머신 러닝' 모델이 등장하게 된다. 

즉, 일일이 컴퓨터에게 구분 기준을 알고리즘으로 만들어서 알려주는 것이 아니라, 고양이(사진)이 '고양이' 인 이유를 스스로 학습하게 끔 한 것이다.

 

12. 여기서 학습이라는 것은 마치 인간이 시각 정보를 뇌에 각인 시키는 것 처럼 컴퓨터에도 뉴런으로 이루어진 '뇌' 구조(Neural network)를 만들어서 시각 정보를 이 네트워크에 저장하는 것을 말한다. 

 

13. 또한 고양이를 반복해서 보여줄때마다 이 네트워크에 저장된 정보들이 올바르게 동작하게끔 업데이트를 해준다.

마치 아이에게 반복해서 고양이를 보여주는 것처럼 말이다.

 

14. 어느정도 숙련이 되면 아이가 고양이를 정확하게 구분해내는 것처럼 컴퓨터의 네트워크 또한 어느 시점부터는 업데이트가 거의 일어나지 않으며, 고양이를 대부분 구분해내는 것을 확인할 수 있다. 

 

15. 아래 그림은 학습이 끝난 네트워크에서, 각 노드(Neuron)들이 고양이의 특징 정보들을 담고 있는 것을 보여주는 것이다. 

16. 이 네트워크를 수억개의 결합으로 확장하여 방대한 학습을 시켜주면 아래와 같은 결과를 보여주기도 한다.

마치 아이가 사진에서 고양이를 보고 가리키는 것에서 사진을 보고 상황을 표현해주는 것처럼 말이다.

 

17. 물론 에러를 내포하고 있다. 이 모델은 칫솔을 학습시키지 않은 모델이다. 이처럼 세상에는 학습시켜야 할 대상들이 훨씬 더 많으며 이것을 감당하기에는 컴퓨터의 성능은 따라오지 못한다.

18. 또한 인간이 가진 '추론'을 학습시키는 것도 남은 과제이다. 

 

19. 학습된 사물을 인식하고 구분해내는 것은 인간보다 빠르게 할 수 있는 수준까지 왔지만 이것이 여전히 인식기술이 10세 수준에 불과하다고 하는 이유이다.

==========================================================================

 

[영상 인식을 활용한 어플리케이션들]

 

object detection
Image captioning

 

[컴퓨터가 본 이미지 데이터]

- Digtal data

- 2D data

- Correlation

 

[ImageNet Challenge]

 

[Object detection in real-time]

본 포스팅에서는 머신러닝 손실함수의 최적화 알고리즘인 '경사하강법'에 대해 알아보겠습니다.

 

1. 손실함수의 최적화 

경사 하강법(Gradient Descent Algorithm)

└ Cost 를 최소화 시키는 Parameter를 찾는 최적화 알고리즘입니다.

 함수의 기울기(Gradient)를 구하여 기울기가 낮은 쪽으로 계속 이동시켜서 극값(minimum) 이를 때까지 반복 수행하여 구할 수 있습니다.

 

그림1

앞선 포스팅에서 알아본 MSE(mean square error) 손실 함수는 그림1과 같이 convex function인 2차함수로 나타낼 수 있습니다.

새로운 가중치 (W')는 이전 가중치(W)에서 손실함수의 가중치에 대한 미분값에 상수(ρ)를 곱한 값의 합으로 업데이트 됩니다.

 

상수(ρ)는 Learning rater라고 하며, 계산한 기울기를 얼만큼 반영할 것인가를 결정하는 factor라고 할 수 있습니다.

예를들어 이전 기울기가 0.5, 손실 함수의 기울기가 0.3 일때,

ρ가 0.1일 경우에는 새로운 가중치가  0.5 - (0.1)(0.3) = 0.47

ρ가 0.9일 경우에는 새로운 가중치가  0.5 - (0.9)(0.3) = 0.23 

이 됩니다.

ρ 값이 커질수록 업데이트 속도가 빠르고, 값이 작을수록 느리게 업데이트 된다고 할 수 있습니다.

ρ 값이 크다고 무조건 유리하지 않은 이유는, minimum 값에 수렴하지 않고 특정 구간에서 발산할 위험이 있기 때문입니다

 

반복은 min값을 threshold로 지정하여 도달할때까지 반복할 수도 있고, iteration 횟수를 지정하여 특정 횟수만큼 가중치 업데이트를 할 수도 있습니다. 

 

SGD가 GD와 구분되는 내용은 손실함수를 계산할때 사용되는 batch 크기 입니다. GD는 전체 data에 대해 손실함수를 계산하는 반면 SGD는 random하게 특정 batch를 선별하여 손실함수를 계산합니다. 따라서, SGD는 GD에 비해 계산량이 훨씬 줄어드는 반면 기울기가 bias되어 나타나므로 기울기가 급격하게 업데이트 된다는 특징이 있습니다.

 

Convex function, GD는 손실함수가 볼록함수(convex function)으로 최소값을 갖는다는 전제를 갖고 수행됩니다. 따라서 실제 손실함수가 울퉁불퉁한 형태의 함수인 경우, 실제 최소값이 아니라 특정 구간에 수렴되어 버리는 local minima 문제가 나타날 수 있습니다.

 

2. Gradient Descent algorithm의 응용

 

그림2

[1]. Stocastic Gradient descent algorithm

배치 단위로 손실함수의 gradient를 계산하여 업데이트 하는 것을 말합니다. 

때문에 계산량이 대폭 줄어든다는 이점이 있으며, 기울기가 급격하게 변하는 특징을 갖습니다.

 

[2]. Momentum

이전 기울기의 모멘텀(v) 반영하므로, 기울기의 움직임이 둔화(그림2의 [2]) 되는 것을 확인 할 수 있습니다.

[3]. Adagrad

이전 기울기를 제곱하여 계속 더하(h)므로, 학습이 진행될수록 갱신강도가 약해지는 특징이 있습니다.

rmsprop과 조합하여 단순 누적이 이나라, 이전 값과 현재값이 일정 비율로 누적되도록 하기도 합니다.

 

[4]. Adam

 

        Momentum + Adagrad

 

모멘텀과 Adagard의 특징을 조합한 방법으로, 이전 기울기의 모멘텀 반영하는 동시에 점차 갱신속도를 adaptive하게 조절하는 특징을 갖습니다.

 

 

이상으로 경사하강법 (gradient descent algorithm)에 대한 포스팅을 마치겠습니다.

다음 포스팅에서는 back propagation의 업데이트 원리에 대해 알아보겠습니다.

이번 포스팅에서는

머신러닝으로 선형 회귀 문제를 푸는 과정에 대해 설명해보겠습니다.

 

그림1

 

그림1에서 좌측의 표가 주어진 데이터라고 생각을 해 봅시다.

앞서 머신러닝은 "데이터를 가장 잘 설명하는 모델(함수)을 찾는 것"이라고 정리했습니다.

이 정리를 선형 회귀 문제에 적용시켜 보면, 

X데이터와 Y데이터 간 관계를 정의할 수 있는 선형 함수

즉, 그림1의 우측 그래프에서 빨간 직선 (Y = aX + b)을 구하는 것이라고 할 수 있습니다.

따라서 이 함수의 기울기(a)와 절편(b)를 구하는 문제가 되는 것입니다.

 

그림2

 

함수(H)의 정보에 대해 아는 것이 없으므로

먼저 이 함수의 기울기가 -1, 가중치가 100이라고 가정해봅시다.

그러면 함수는 H(x) = -X + 100 꼴(그림2 그래프) 이 되고,

각 X입력에 대해 예측값을 계산해 볼수 있습니다.(그림2 테이블)

 

그림3

 

이때, 함수의 예측값(Prediction)과 실제 Y값(Truth)의 차이를 Loss라고 정의하며,

이 Loss의 크기를 통해 가정한 함수가 실제 데이터와

얼마나 괴리가 있는지파악 할 수 있습니다. (그림3)

즉, Loss가 클수록 실제 데이터 분포와 차이가 심한 것이다 라고 생각할 수 있습니다. 

 

모든 X값에 대해 Loss를 계산하고 값을 제곱하여 평균하여 전체 데이터에 대한

Mean Square Error Loss를 계산합니다.

 

그림4

 

이 Loss값이 클수록 가중치 (a, b)를 크게 변화시키고,

작으면 작게 변화시키는 방식으로 Loss가 작은 값으로 수렴할 때까지

이 과정을 반복 해나가는 것입니다.

함수의 기울기가 -2, 절편이 1이 되었을 때,

데이터를 매우 가깝에 추종하는 것을 볼 수 있습니다. (그림4)

 

그리고 이 과정을 '학습'이라고 합니다.

 

그림5

 

마지막으로, 찾아낸 함수 H(x) = -2x-1

학습 데이터가 아닌 테스트 데이터 "35"를 입력으로 주었을 때,

주어진 데이터들과 유사항 경향성을 갖는 

적절한 기대값을 구할 수 있게 됩니다. 

 

다음 포스팅에서는 가중치를 업데이트 하는 방법인

경사하강법(Gradient Descent Algorithm)과 응용 알고리즘들에 대해 

포스팅 하겠습니다.

+ Recent posts