etc/구글 머신러닝 부트캠프

[DSL] Improving Deep Neural Networks Week 3 : Hyperparameter Tuning, Batch Normalization and Programming Frameworks

uyt8989 2022. 7. 3. 13:35

Week1에서는 dW, db를 구하는 과정에서 최적화, Week 2에서는 그 이후의 gradient descent에서 최적화하는 방법에 대해 배웠다. Week 3에서는 또 다른 최적화 기법을 배운다.

 

1. Hyperparameter Tuning

머신 러닝에는 많은 하이퍼 파라미터가 있다. 그리고 개발자는 좋은 결과를 내도록 이 변수들을 결정한다. 우선, 앤드류 응 교수님은 학습률이 가장 중요한 하이퍼 파라미터라고 생각하시더라. 아직 내가 이 분야에서 너무 쪼렙이라 의견을 가질 만큼의 지식이 쌓이지 않아서 나는 잘 모르겠지만, 다른 전문가들은 다르게 생각하는 경우도 있는 것 같다.

그럼 얘네들을 어떻게 결정할까? 딱히 왕도는 없는 것 같다. 해봐야 안다는 마인드로 일단 해본다. 조정할 하이퍼 파라미터를 결정하고 무작위로 값을 여러 개 선정한다. 그리고 성능을 평가한 다음에 가장 좋은 성능을 보였던 조합 근처에서 또다시 무작위로 값을 선정한다. 이 과정을 coarse to fine이라고 한다. 

 

그래도 하이퍼 파라미터 별로 값을 선정할 때 어느 정도의 범위는 정해두고 뽑는다. 그래도 너무 무지성으로 하면 안 되고, 조심해야 하는 문제가 있긴 있다. 범위가 2와 5 사이라면 범위 내에서 균등하게 뽑아도 큰 지장이 없을 것이다. 하지만 0.0001과 1 사이에서 값을 선정하는 경우에는 조금 생각을 더 해봐야 한다. 그래서 이런 경우엔 log-scale을 사용하는 게 좋다. -4와 0 사이에서 값을 선정하고 10의 제곱 형태로 만들어주면 된다. 이렇게 해야 의미 있게 하이퍼 파라미터를 결정할 수 있다. (그림에는 0.001이라고 잘못 적어놨다...)

실제 하이퍼 파라미터 튜닝은 두 가지 방식으로 할 수 있다. 첫 번째는 pandas, 두 번째는 cavior. 전자는 하나의 모델을 유심히 지켜보면서 튜닝하는 방식이다. 후자는 여러 모델을 병렬적으로 학습시키는 방식이다. 자원만 충분하다면 후자가 좋겠지만, 그렇지 못하다면 전자의 방식으로 모델을 튜닝해야 한다.

 

2. Batch Normalization

학습 속도를 향상하는 최적화 알고리즘으로 batch normalization이라는 기법이 있다. Week 1에서 입력 데이터를 normalizing 하는 방법에 대해서 잠깐 소개하고 넘어갔었는데, batch normalizing은 이를 확장해서 activation을 normalizing 하는 방법이다. a를 normalizing 하는 방법과 z를 normalizing 하는 방법, 총 두 가지가 있는데 강의에서는 후자로 설명을 진행했다. 우선은 activation function의 입력의 분포를 맞춰주는 알고리즘이라고 생각하자. 그리고 이 방법에 gamma와 beta라는 매개변수가 추가로 쓰이는데, 이전에 gradient descent optimization에서 쓰인 beta랑은 다른 beta임을 염두에 두자. 

새로 생긴 매개변수들도 학습이 가능하다. 그리고 이전에 사용하던 b는 beta의 등장으로 유명무실해졌기 때문에 없어도 된다. 그래서 W, gamma, beta 이렇게 총 세 개의 매개변수를 사용한다. 이 알고리즘은 mini-batch 알고리즘에 바로 적용이 가능하다.  또한, 다른 최적화 알고리즘인  gradient descent with moment, RMSpropp, Adam 모두 같이 사용할 수 있다. 강의에서는 gamma와 beta의 gradient를 어떻게 구하는지에 대한 설명은 전혀 없었다. 그저 "텐서 플로우에서는 코드 한 줄로 구현이 가능합니다"하고 지나갔다. 아직은 갈 길이 멀어 집요하게 파고들기는 좀 부담스럽지만, 언제 가는 이 놈을 어떻게 계산하는지 알아내리라.

Batch normalization은 covariane shift 문제를 해결해준다. 이는 데이터의 분포가 다를 때 발생할 수 있는 문제다. 대신 각 mini-batch마다 새로 평균과 분산을 계산하기 때문에 z에 약간의 노이즈가 발생한다. 이 노이즈는 dropout과 비슷한 효과를 내주기 때문에 약간의 regularization의 효과가 있을 수도 있다. 그리고 mini-batch의 크기가 커지면, 노이즈가 감소하기 때문에 이 효과도 감소한다. 하지만 regularization을 하겠다고 batch normalization을 적용하는 건 좀 그렇고, 학습 속도를 높기 위해서 사용하는 것이 좋다.

 

그럼 이제 test time에도 batch normalization을 적용해보자. 이때도 normalization을 적용해야 할 텐데 그때의 평균과 분산은 어디서 구해야 할까? 테스트 데이터의 평균과 분산을 구하는 건 불가능하다. 그래서 각 mini-batch에서의 평균과 분산으로 지수 가중 평균을 구해서 사용한다. 그런데 이 부분도 "딥러닝 프레임워크에서는 잘 작동하도록 평균과 분산을 구해줍니다"라고 설명하고 넘어가서 지수 가중 평균에 대한 설명이 부족하다고 느꼈다.

 

추가)

Batch normalization으로 vanishing/exploding gradient 문제도 해결할 수 있다. 애초에 이걸 해결하려고 나온 알고리즘인듯?

2. Softmax Regression

Softmax regression은 이진 분류 모형이었던 logistic regression을 조금 더 확장한 모형이다. 이전에는 어떤 것이 맞다, 아니다만 출력할 수 있었다면, 이제는 C개의 분류 중에 가장 확률이 높은 분류를 찾는다. 그래서 출력층의 노드는 반드시 C 개여야 한다. 그리고 새로운 activation function을 사용해야 하는데, 이전과 큰 차이점이라면 입력과 출력이 모두 벡터라는 점이다. 시그모이드 같은 경우엔 입력과 출력이 모두 실수다. 물론 벡터화해서 사용했기 때문에 벡터에 시그모이드 함수를 적용하기는 했지만, 본질은 실수-실수였다. 하지만 이번엔 출력을 normalizing 하기 때문에 벡터가 입력된다. 그리고 마지막에 벡터 중 가장 큰 값을 1로 하고 나머지는 모두 0으로 만든 hardmax라는 것을 만들어 낸다.

그럼 얘는 어떤 방식으로 학습될까? 우선 이전에 사용했던 loss function과는 비슷한 듯 조금 다르다. 그리고 Y의 차원이 (1, m)이 아니라는 점을 주의하자.

이제 softmax의 forward propagation과 cost function에 대해 배웠다. 그다음엔 back propagtion을 시작하기 위해서 dz 값을 찾아야 한다. 이전과 같은 방법으로 계산하면 되겠지만, 강의에선 이 과정을 생략했다. 그래서 혼자 미분해보려고 했는데, 마음처럼 쉽게 되지 않아서 결국 검색해봤다. notation은 조금 차이가 있지만 가장 이해하기 좋았던 사이트다. 아무튼 결론은 dz^[L] = yhat - y로 똑같이 나온다. 대신 글자가 조금 작게 되어 있어서 확대해서 봐야 했다...ㅋㅋㅋ

 

Back-propagation with Cross-Entropy and Softmax | ML-DAWN

What will you learn? This post is also available to you in this video, should you be interested

www.mldawn.com

 

3. Introduction to Programming Frameworks

 

마지막은 여러 프레임워크 종류에 대해서 잠깐 언급하고, 텐서 플로우를 어떻게 사용하는지에 대한 강의였다. 이런 테크닉적인 부분은 강의를 듣는 것만으로는 절대 익힐 수 없다고 생각한다. 내 손으로 실제 코딩을 해봐야 알 수 있고, 심지어 여러 번 키보드를 두들겨봐야 그제야 감이 잡히기 시작한다. 당연히 이런 코드가 밑단에서 어떻게 움직이는지에 대해서 알려면 이론적인 지식이 바탕이 되어야 한다. 그래서 그런 지식을 쌓고자 이 강의를 듣는 중이다.

 

Week 3는 batch normalization에서 약간 정신을 놓을 뻔했다. 예전에는 새벽에 공부하면 집중이 잘 됐는데, 요새는 새벽에 자꾸 집중력이 흐려진다. 날 밝을 때 더 열심히 해야겠다.

 

 

* Courera의 Deep Learning Sepcialization 강의를 수강하는데 도움이 되고자 작성한 요약문입니다. 틀린 내용 있다면 정정해주시면 감사하겠습니다.