Google ML Bootcamp 2022/Coursera mission

Improving Deep Neural Networks - 3 week

피준 2022. 7. 15. 03:06

Tuning Process

지금까지 이런저런 하이퍼 파라미터들을 배웠다

어떻게 하이퍼 파라미터들을 튜닝하는지 알아보자

학습에 영향을 많이 주는 하이퍼 파라미터는 학습률(알파)이다

다음으로  모멘텀(베타), 배치 사이즈, 히든 유닛 수 세 가지

마지막으로 레이어 수, learning rate decay 친구들을 조절한다고 한다

아담 알고리즘은 주로 전에 둔 값을 그대로 사용한다(앤드류 응 교수님의 의견이라 한다)

조절할 하이퍼 파라미터를 격자에 랜덤으로 쌍을 잡고 반복하여 시도한다

어느 하이퍼 파라미터 영향이 클지 모르기에 랜덤으로 찍는 게 좋다고 한다

최적을 찾기 위해, 잘 되는 범위에서 랜덤으로 쌍 찾기를 반복할 수도 있다

Using an Appropriate Scale to pick Hyperparameters

히든 유닛 수 \(n^{[l]}\)을 50에서 100 사이에서 찾기, 레이어 수 2에서 5 사이에 찾기는 그냥 균등 랜덤을 해도 딱히 문제가 없어 보인다

그러나 \(\alpha \)를 0.0001에서 1 사이에서 찾는 경우를 보자

0.1에서 1 사이를 90%가 차지하고, 0.0001에서 0.1은 10%만 값이 존재할 것이다

선형 척도 대신 로그를 처리해서, 랜덤을 찍는 게 더 적절해 보인다

베타를 0.9에서 0.999 구간에서 찾는 경우를 보다

0.9에서 0.99에 대부분의 값이 있기에 이 또한 로그를 취해 주면 될 것 같다

 1-\(\beta\)를 로그를 활용하여 구해 주면 된다

베타가 1에 가까워질수록 민감도가 확확 커지므로 선형적으로 랜덤을 해주면 안 된다

scale 정하기가 중요하다는 것만 기억하자

Hyperparameters Tuning in Practice: Pandas vs. Caviar

와오 글쓰다 날라가서 다시 정리한다는 사실이 날 너무 슬프게 만든다
서로 다른 분야라도 도움될 내용이 있을 수 있다
예를 들어 컴퓨터 비전의 컴브넷, 레스넷은 음성에서도 잘 작동한다
 
하이퍼 파라미터는 데이터의 추가와 같은 이슈 때문에 지속적으로 업데이트 해주어야 한다
업데이트에는 크게 두 가지 판다와 캐비어에 빗댄 방법이 있다
먼퍼 baby sitting one model, 판다에 비유한 방법이다
값을 지속적으로 조정하며 비용을 살펴본다

컴퓨터 자원이 부족하거나, 모델을 한 번에 많이 학습시킬 수 없을 때 사용한다
하나의 모델의 성능을 계속 지켜보며 하이퍼 파라미터를 수정한다

또, Training many models in parallel, 캐비어에 비유한 방법이다

여러 모델을 동시에 진행한다

컴퓨터 자원이 충분해 여러 모델을 한 번에 학습시킬 수 있을 때 사용한다

보통 많은 데이터를 사용하기에 판다 방식을 사용한다

Normalizing Activations in a Network

로지스틱 회귀를 하면 학습 속도가 빨라진다는 걸 배웠다
NN에서도 마찬가지로 \(w^{[3]}, b^{[3]}\)을 구하기 위해 \(A^{[2]}\)를 정규화하면 속도가 빨라진다
실제로는 활성 함수를 적용시키기 전인 \(z^{[2]}\)를 보통 정규화시킨다 

\(z_{norm}^{(i)} = {z^{(i)}+\mu\over \sqrt{\sigma^2 +\epsilon}}\)

그런데 이렇게 정규화를 시키면 평균은 0, 분산은 1인 동일한 분포로 만들어진다

그렇기에 아래와 같은 처리를 해준다

\(\tilde{z}^{(i)}=\gamma z^{(i)}_{norm} +\beta\)

평균이 베타, 분산이 감마로 만들어 준다

이때 감마와 베타는 학습 가능한 하이퍼 파라미터이다

w, b 찾듯이 이런저런 학습법을 사용하여 업데이트해줘야 한다

Fitting Batch Norm into a Neural Network

배치 정규화는 활성화 함수 사용 전에 해주면 된다

텐서 플로우와 같은 프레임워크에는 사실 이미 구현이 되어있다

사실 정규화 과정에서 더해주는 b는 의미가 없기에 0으로 만들거나 없애도 된다 (베타가 b를 대신한다)

아래와 같은 수도 코드를 사용한다

for t in 1~ num of mini batches
    compute forward prop on \(X^{{t}}\) (use BN to replace \(z^{[l]}\) to \(\tilde{z}^{[l]}\))
    use backprop to compute \( dw^{[l]},d\beta ^{[l]},d\gamma ^{[l]}\)
    #GD
    update parameters (w,\(\beta , \gamma\))

경사 하강법 대신 모멘텀, Rmsprop, Adam 등을 사용해도 된다

Why does Batch Norm work?

그래서 배치 노름이 왜 잘 작동할까

먼저 0~1로 scale을 비슷하게 잡아 주기에 속도가 빨라진다

베타, 감마를 이용하는데 왜 0~1로 스케일이 비슷한 거지?

또한 깊은 층의 가중치가 앞선 층의 가중치 영향을 덜 받게 된다

아래 예시를 보며 알아보자

고양이 판별 모델을 예시로 보자

검정고양이 이미지만 사용하여 모델을 학습시키고, 다양한 색의 고양이 test set에서 적용시켜보자

아마도 잘 작동하지 않을 것 같다

데이터 분포가 변화하는 것을 공변량 변화량이라고 부른다

X, Y 간의 대응을 학습시키며 X의 분포가 변한다면, 다시 학습시켜야 한다는 것이다

레이어 l을 학습시키는 과정에서 \(a^{[l-1]}\)은 당연히 항상 변할 것이다

즉 공변량 변화의 문제가 발생한다

배치 노름을 적용하면 은닉 단위 값의 평균과 분산을 조정해, 영향을 줄여준다

 

또 배치 노름은 정규화 역할도 한다

정규화는 각각 미니 배치에서 적용되기에 전체와 약간 노이즈가 생긴다

즉 드롭아웃처럼 정규화를 줄 수 있다

그런데 정규화 효과가 막 크지는 않기에 다른 드롭아웃이랑 같이 써도 된다

Batch Norm at Test Time

테스트하며 미니 배치 하나가 아닌 데이터를 하나하나 보며 처리해야 한다

학습에 사용된 값들의 지수 가중 평균을 이용하여 해결한다

나중에 코드를 보며 알아보자

 

 

Softmax Regression

0,1 분류가 아닌 여러 가지로 클래스로 분류해야 할 경우는 어떻게 해야 할까

클래스의 수는 \(C\)로 0 ~ \(C\) - 1의 값을 가진다

\(n^{[L]}\)은 \(C\)로 각각이 될 확률을 가지는 (c,1) shape 배열이다

당연히 확률이니 sum 하면 1이 되어야 한다

아래의 활성 함수를 이용한다

\(i = e^{(z^{[L]})}\) (C,1)
\(a^{[L]}={e^{(z^{[L]})}\over \sigma_{i=1}^{C} t_i}\)

Training a Softmax Classifier

1,0,0로 변환하는 hard max 가 아니라 확률로 나타내기에 soft max이다
로스 함수가 어떻게 생긴지 보자
\(\mathcal{L}(\hat{y},y)= -\sum_{j=1}^{C} y_j log\hat{y}_j\)

손실 함수는 sum 하면 되니 넘기자

Deep Learning Frameworks

모든 것을 직접 처음부터 구현할 필요는 없다

다른 누가 이미 프레임 워크로 잘 구현해 뒀다

프레임 워크 종류가 많기에 잘 고르자

  • 프로그래밍이 쉽다(development & deployment)
  • 빠르게 돌아간다
  • 오픈 소스이다

TensorFlow

많은 프레임워크 중 하나인 텐서 플로우에 대해 알아봤다

파이팅~~