기존 글에도 정리를 해왔지만,
기술 면접 준비하면서 정리 했던 것들 몇 가지 보충해서 정리해봤다.
틀린 내용이 있을 수 있으니 의심하면서 보길...
Backpropagation 계산법 (이상한 곳에서는 간단한 계산 시킬 수도...)
로컬 그래디언트에 업스트림 그래디언트를 곱해줌으로써 구하는 것을 기본 원칙으로 계산 하면 된다
Regression vs. Classification
확률적인 관점에서 설명할 줄 알면 든든...
가정하는 분포가 뭔지 (이산? 연속? / 베르누이? 가우시안?)
가정 분포에 따라 Loss는 어떻게 달라지는지...
Sigmoid 쓰는 이유?
In order to map predicted value to probability
a는 sigmoid의 기울기를 결정, b는 중심 위치를 결정
Convariance vs. Correlation
두 변수가 서로 어떻게 관계를 가지는지를 보여주는 수치 Covariance
0이면 unrelated
+이면 same direction
-이면 opposite direction
Covariance의 nomalized version이 correlation으로
Covariance를 각 변수의 표준편차 곱으로 나눠주면 된다.
멀티 라벨 분류 문제에서 Micro/Macro - Precision/Recall/F-score?
micro는 클래스 구분 없이 글로벌하게 TP, TN, FP, FN를 구해서 계산
macro는 각 클래스별로 구한 뒤 평균
뉴럴넷 학습시 에러가 증가할 경우 뭘 의심 해야 하나?
- Gradient
- Feature Scaling / Data Shuffling
- Learning Rate
- 버그 ; ex) 값의 일부를 NaN으로 바꿔버리는 지점
Large Weight 은 Overfit의 가능성으로 이어진다
입력이 조금만 변해도 큰 웨잇에 의해 값의 변화 폭이 커질 테니까
이 때는 regularization을 이용해서 weight의 크기를 제한할 수 있어야 함.
BatchNorm 장점?
- 초기화 기법을 뭘 쓰든 상관 없이 잘 학습 될 여지
- fc layer 다음에, non-linear 전에 위치 시켜 사용
- activation을 가우시안 분포로 맞춰 줌 (but, 실제론 그렇지 않다는 논문도 있다. 아래 블로그 글 참고)
- 실제 장점은 error surface를 스무스하게 만들어주기 때문에 학습이 원활하고 빠르게...
- 주어진 배치 속에서 dim. 별로 normalization을 위한 평균/표준편차를 누적해 나가면서 계산
- 깊은 네트워크여도 Weight이 중첩 되면서 값이 커지는 것을 방지한다.
- grad 흐름 원활
- LR을 키울 수
- Regularization 효과도 있음
Batch size & Learning rate의 관계?
일반적으로는 배치가 커질 수록 LR을 크게 가져갈 수 있다.
배치가 커질 수록 error surface 상에서 내려가는 방향에 대해 좀 더 확신을 가질 수 있기 때문이다.
- LR을 고정하고 배치 사이즈를 키울 경우 LR을 줄이는 효과가 있음 + 학습은 더 빨라짐 (메모리만 넉넉하다면야...)
- 배치사이즈를 줄이면 일반화 효과는 커진다는 소리도 있다. "Revisiting Small Batch Training for Deep Neural Network"
왜 입력을 Normalize 해야할까?
입력을 노말라이즈 하지 않으면, 특정 피쳐와 관련된 웨잇의 그래디언트가 다른 피쳐와 연관된 웨잇의 그래디언트 보다 상대적으로 클 수가 있다. 이렇게 되면, 최적화시 그래디언트 방향이 스무스 하지 못해질 여지가 있고, 지그재그 패턴을 보일 수 있는데 이렇게 되면 수렴이 느려진다.
왜 BatchNorm에 의해 입력 분포가 비슷해지면 학습의 속도가 증가?
Internal Covariate Shift가 보정 되면서(? -> 실제론 그렇지 않다고 함), 달라지는 입력에 의해 Hidden Unit의 분포가 변하는 양이 감소한다. 예를 들어서, A 고양이 이미지를 학습하다가, 종이 다른 B 고양이 이미지가 입력 된다면 입력 분포가 갑자기 달라지기 때문에 hidden Unit도 거기에 대응해서 크게 변해야할 수 있지만, BatchNorm은 그럴 가능성을 줄여 준다. Hidden Unit이 적게 변하게 만들어 줌으로써 일반화 효과로도 이어질 수 있다.
여러 가지 초기화 방법들
- Bias 는 0으로 초기화 해도 상관 없음
(https://stackoverflow.com/questions/43498037/why-add-zero-bias-in-neural-networks) - Xavier 초기화
- 이전/다음 노드 개수에 의존
- np.random.randn(in, out) / np.sqrt(in) # 입력의 개수로 스케일링
- He 초기화
- ReLU에 좀 더 적합
- ReLU가 입력 분포의 절반은 날려버리니까
- np.random.randn(in, out) / np.sqrt(in/2) # 입력 절반이 날아가는 것 반영
여러 가지 Activation에 대해 살펴두기
- sigmoid 같은 경우 양 끝 단에서 saturation 문제가 발생 (기울기가 거의 0에 수렴 -> vanishing gradient 여지)
- tanh 도 saturation 문제는 있으나, zero centered 되어 있음
- ReLU = max(0, x) ; dead neuron의 여지
- Leaky ReLU = max(0.1x, x)
- PReLU = max(ax, x)
- 그 외, Swish등 요즘 다양한 것 나왔던데 추가로 살펴볼 것
Feature Trasnform
- 뉴럴넷의 레이어를 통과함에 따라 데이터의 분포가 주어진 태스크를 해결하기에 적합한 분포로 변해가는 것
- 중간에 Non-linear Activation을 통과하면서 Linear 하게 분류할 수 없는 입력 피쳐들이 분류가 용이하도록 분포에 변화가 생기는 것
왜 Activation이 필요할까?
리니어 + 리니어 + 리니어 레이어만 가지고 네트워크를 만들면
리니어 레이어 한 개 쓴 것보다 나아질 게 없다.
즉, 복잡한 패턴을 잡아낼 수가 없다. (capture non-linear relationship)
이 때, non-linear activation을 추가함으로써 입력 피쳐 공간을 구기거나 펼침이 가능해지고(non-linear feature transform), 결국 linearly seperable 한 피쳐를 얻어낼 수 있다.(분류 문제라면)
왜 입력의 범위가 zero-centered 되어야 좋은건지?
(시그모이드를 액티베이션으로 썼을 때를 가정)
시그모이드는 출력 값이 zero-centered가 아니다. 따라서, 그 출력 값이 항상 양수가 되버린다.
이 말은 모든 weight에 대한 그래디언트가 upstream gradient의 부호에 의해 결정 된다는 소리...
따라서 다음 레이어의 그래디언트의 부호에 따라 zig-zag path로 최적화 될 여지가 있다.
*뭔 소린가 싶다면 back-prop 계산 복습 해볼 것
ReLU는 zero-centered이긴 하지만 입력 분포의 절반은 버린다.
초기화를 잘못하거나 LR이 너무 높을 경우 Dead ReLU로 이어질 수 있다고 함.
'DL&ML > concept' 카테고리의 다른 글
ArcFace Loss (1) | 2021.04.25 |
---|---|
ReLU가 Non-linear인 이유? (0) | 2021.04.14 |
Seq2Seq & Beam Search (0) | 2021.04.14 |
Classification에서 CrossEntropy를 Loss 함수로 쓰는 이유? (0) | 2021.04.13 |
Posterior, Likelihood, Prior (0) | 2021.04.12 |