해당 포스팅은 네이버 부스트캠프 AI Tech 학습 정리 자료임을 알려드립니다.
1. 강의 정리
최성준 교수님 - Optimization
1) 소개
최적화에서는 많은 용어들이 나오게 되는 데 이 용어들을 잘 정리해두지 않으면 뒤로 가면서 오해가 생길 수 있습니다. 다른 연구자들과 이야기할 때 큰 문제가 생길 수 있습니다.
2) Optimization 용어 이해
Generalization이 좋다는 것은 무엇을 뜻하게 될까요? 우선 그 의미를 알아보기 전에 학습에 관한 이야기를 해보고자 합니다. Training Error는 Iteration에 따라 줄어들게 되지만 Test Error는 Iteration이 무조건 증가한다고 계속 감소하지는 않습니다. Generalization Gap은 바로 여기서의 Test Error와 Training Error의 차이를 말하게 됩니다. 그렇다면 네트워크의 성능이 학습 데이터와 비슷하게 나올 것이라는 것을 보장해주는 것입니다. 하지만, Generalization은 네트워크의 성능이 좋다는 것을 보장해주지는 않습니다. 이 말은 Generalization Gap이 적다는 것을 의미하기 때문에 Training Error가 높다면 이 네트워크는 좋은 성능을 가지지 않게 됩니다.
Over-fitting은 학습데이터에 대해서는 잘 동작하지만, 새로운 데이터에 대해서는 잘 동작하지 않는 경우를 말합니다. Under-fitting은 학습을 적게 시키거나 층이 낮아서 발생하는 현상으로 Training data에 대해서도 잘 동작하지 않는 경우입니다. 여기서 말하고 있는 것은 굉장히 이론적인 이야기입니다. 사실상 training data가 우리가 학습하고자 하는 목적에서 나온 데이터라고 가정하고 있는 것일 뿐이지, 실제로는 Over-fitting처럼 많이 변하는 것이 target일 수도 있습니다.
일반적으로 training data와 validation data를 나눠준다. 학습 데이터로 학습시킨 모델이 validation을 기준으로 얼마나 잘되는지 보는 것이다. 그렇다면 training과 validation은 어떻게 나누는 것이 좋을까? 이것에 대한 고민으로 나오게 된 것이 Cross validation입니다. Cross validation은 k-fold라고 부르기도 하는데 학습 데이터를 k개로 파티셔닝을 하고 k-1개로 학습시킨 뒤 나머지 1개로 검증하는 과정을 k번 거치게 됩니다. 일반적으로 어떤 경우에 사용하게 될까요? Neural network에는 하이퍼 파라미터가 많이 존재합니다. 여기서의 하이퍼 파라미터는 사용자가 결정하는 파라미터들을 말합니다. 예를 들면, lr, loss-function 등을 말합니다. cross-validation을 통해서 최적의 하이퍼 파라미터 셋을 찾고 이것을 고정한 다음 모든 데이터를 활용해서 모델 학습을 시킵니다. 여기서 반드시 기억해야 할 것은 test data는 어떤 경우에서도 활용해서는 안됩니다.
Bias-variance는 Under-fitting과 Over-fitting과 관련이 있습니다. Variance가 낮다는 것은 비슷한 입력이 들어와도 비슷한 결과를 내줍니다. bias는 True target과 얼마나 가까운가를 나타내는 것입니다. bias-variance tradeoff는 굉장히 유명한 이론입니다. 우리 학습 데이터에 노이즈가 들어 있다고 가정했을 때, 우리가 최소화하고자 하는 cost는 bias의 제곱과 variance, 노이즈의 합으로 표현하게 됩니다. 이 말은 한쪽의 값이 커지게 되면 다른 한쪽의 값은 자연스럽게 작아지게 된다는 것을 의미하며 이 과정에서 tradeoff가 발생하게 됩니다.
Bootstrapping은 통계학에서 많이 활용되는 것 입니다. 학습 데이터의 일부를 활용해서 여러 개의 모델을 만들어서 하나의 입력에 대해 각각의 모델들의 예측값이 얼마나 일치하는 지를 보고자 하는 방법입니다.
Bagging은 boostrapping처럼 다양한 모델을 만들어서 모델들의 예측값을 평균을 내는 방법입니다. 이는 앙상블 방법이라고 부르기도 합니다. boosting은 모델 하나를 만든 다음에 training data에 대해서 예측해보고 잘 예측하지 않는 부분에 대해서 또 다른 모델을 만들어서 모델들을 합치는 방법입니다.
3) Gradient Descent Methods
Gradient descent 방법은 Stochastic gradient descent, Mini-batch gradient descent, Batch gradient descent로 나눌 수 있습니다. Stochastic gradient descent는 1개의 샘플로만 그레디언트를 구하고 업데이트하는 방식입니다. Mini-batch gradient descent는 미니 배치의 샘플로 그레디언트를 구하고 업데이트하는 방식입니다. Batch gradient descent는 모든 데이터를 사용해서 그레디언트를 구하고 평균으로 업데이트하는 방식입니다. 보통 미니 배치 그레디언트를 많이 활용합니다. Batch-size는 별로 중요하지 않은 파라미터라고 생각할 수도 있지만 굉장히 중요한 파라미터입니다. 큰 배치 사이즈를 사용하게 되면 sharp minimizer에 도달하게 되고, 작은 배치 사이즈를 사용하게 되면 flat minimizer에 도달하게 됩니다. 일반적으로 flat minimizer에 도달하는 것이 좋습니다. 그 이유는 Train에서의 Sharp Minimum이 Test에서는 값이 크게 차이가 날 수 있기 때문입니다. 반면, flat minimum은 Test값이 엄청 크게 차이가 나지는 않기 때문에 더 좋다고 합니다.
4) 다양한 Gradient Descent Methods
gradient descent는 Learning rate를 적절히 잡는 것이 어렵습니다. 이를 좀 더 빠르게 근사할 수 있도록 발전시키는 방법이 Momentum입니다. 한번 흘러간 방향을 어느 정도 유지할 수 있는 효과가 있습니다. Momentum과 비슷하지만 조금은 다른 방법인 Nesterov Accelerated Gradient는 Lookahead gradient를 계산하게 됩니다. 원래 Momentum에서는 현재 주어진 파라미터에서 그레디언트를 계산해서 넣어주는데 Nesterov Accelerated Gradient에서는 한 번 이동해 보고 그레디언트를 계산해보고 넣어주는 것입니다. 이것을 사용해주면 함수의 봉우리에 빠르게 수렴하는 효과를 가지게 됩니다. 아래의 그림은 모멘트를 구하는 방식의 차이를 비교해 놓은 것입니다.
Adagrad는 지금까지 많이 변한 파라미터는 조금만 변하게 해주고, 조금 변한 파라미터는 많이 변하도록 해주는 방법입니다. 이것의 가장 큰 문제는 $G_{t}$가 제곱이기 때문에 계속 커지는 현상이 발생합니다. 이것 때문에 학습이 멈춰지는 현상이 종종 발생하게 됩니다. 이를 해결하는 방법이 Adadelta입니다. Adadelta는 window에 개수에 따라서 가지고 있어야 하는 정보의 양이 많아지게 됩니다. 또한 이 방법은 learning rate가 없어서 많이 활용되지는 않습니다. RMSprop은 Adadelta에서 좀 더 보완해서 step size를 넣습니다. 가장 일반적으로 잘되는 것은 Adam입니다. Adam은 momentum과 adaptive learning rate 접근법을 결합해서 만들어 낸 것입니다.
5) Regularization
Generalization을 잘하고 싶은 것의 연장선입니다. 학습이 train에만 잘되도록 하는 것이 아니라 일반적인 테스트 데이터에 대해서도 잘되도록 규제를 걸어주는 것이 목적입니다.
Early Stopping은 validation error가 줄어들다가 커지는 시점에 멈추도록 하는 방법입니다.
Parameter norm penalty는 Neural Network 파라미터가 너무 커지지 않도록 하는 방법입니다.
Data augmentation은 굉장히 중요한 방법입니다. 그 이유는 데이터가 적을 때에는 딥러닝이 아무리 잘되어도 전통적인 방법들을 이길 수가 없었습니다. 그래도 데이터셋이 어느 정도 커지게 되면 Neural Network는 많은 데이터를 표현할 능력이 됩니다. 하지만 데이터는 한정적이라는 것이 가장 큰 문제입니다. 이를 해결하기 위한 방법이 바로 Data augmentation 방법입니다. 하지만, MNIST같이 변화를 줬을 때 라벨이 변경되서는 안 됩니다.
Noise robustness는 Noise를 input과 weight에 넣어주는 방법입니다.
Label smoothing은 Data augmentation과 굉장히 비슷한 방법이지만 차이점을 이야기하면 데이터 두 개를 섞어주는 것입니다. decision boundary를 부드럽게 만들어주는 효과가 있습니다.
Dropout은 일부의 neuron들을 0으로 바꿔줘서 좀 더 모델이 robust 한 feature들을 잡을 수 있습니다.
Batch normalization을 활용하게 되면 깊게 쌓인 레이어에 대해서 성능이 좋아지는 현상을 확인할 수 있습니다.
5) 코딩 실습
Adam은 Momentum과 adaptive learning rate를 합친 것으로 빠른 시간에 쉽게 근사하는 것을 볼 수 있습니다. SGD와 Momentum 중에는 Momentum이 조금 더 빠르게 근사해가는 것을 확인할 수 있었습니다. Momentum은 이전의 그레디언트를 활용한다는 차이가 있습니다. 이를 이용해서 Momentum이 조금 더 빠르게 근사하게 됩니다. SGD는 충분한 이터레이션이 있어야 근사되기 때문에 시간이 많이 소요되게 됩니다. 이를 이용해서 얻은 결과는 가장 먼저 Adam을 사용해보자! 하지만, 무조건 Adam이 좋은 결과를 내지는 않습니다. 그렇지만 시간이 부족하다면 Adam을 활용하는 것을 권장합니다.
임성빈 교수님 - CNN 첫걸음
1) Convolution 연산 이해하기
MLP(다층 신경망)는 각 뉴런들이 선형 모델과 활성함수로 모두 연결된(fully connected) 구조입니다. MLP에서는 많은 parameter 값들이 필요했습니다. 하지만, convolution 연산은 커널(kernel)을 입력 벡터 상에서 움직이면서 선형 모델과 합성함수가 적용되는 구조입니다. 커널을 사용한 방법도 선형 변환에 속하게 됩니다. 커널 사이즈가 공통적으로 사용되기 때문에 파라미터의 개수를 줄일 수 있습니다. convolution 연산의 수학적인 의미는 신호(signal)를 커널을 이용해 국소적으로 증폭 또는 감소시켜서 정보를 추출 또는 필터링하는 것입니다.
$$continuous \, [ f * g](x) = \int_{\mathbb{R}^{d}}f(z)g(x+z)dz = \int_{\mathbb{R}^{d}}f(x+z)g(z)dz = [g * f](x)$$
$$ discrete \, [f *g](i) = \sum_{a \in \mathbb{Z}^{d}}f(a)g(i+a) = \sum_{a \in \mathbb{Z}^{d}}f(i+a)g(a) = [g*f](i)$$
CNN에서 사용하는 연산은 사실 convolution이 아니고 cross-correlation이라고 부릅니다. 커널은 정의역 내에서 움직여도 변하지 않고(translation invariant) 주어진 신호에 국소적(local)으로 적용합니다. Convolution 연산은 1차원뿐만 아니라 다양한 차원에서 계산이 가능합니다. 차원이 커지더라도 커널은 위치에 따라 바뀌지 않는다는 것만 기억하면 됩니다.
2) 2차원 Convolution 연산 이해하기
2D-Conv 연산은 커널을 입력 벡터 상에서 움직이면서 선형 모델과 합성함수가 적용되는 구조입니다. 특히, 2D-Conv 연산은 영상처리에서 활용됩니다. 커널이 입력 행렬을 돌아다니면서 element-wise 방법으로 성분곱을 해준 값들의 합으로 결과를 출력해줍니다. 입력 크기를 $(H, W)$, 커널 크기를 $(K_{H},K_{W})$. 출력 크기 $(O_{H},O_{W})$라 하면 출력 크기는 다음과 같이 계산하게 됩니다.
$$O_{H} = H - K_{H} + 1, O_{W} = W - K_{W} + 1 $$
실제로 이미지 분류를 하게 될 때에는 채널이 여러 개인 2차원 입력을 받게 되는 데 2차원 Convolution을 채널 개수만큼 적용한다고 생각하면 됩니다. 3차원부터는 행렬이 아니라 텐서라고 부르게 됩니다. 이 때, 채널이 여러 개인 경우 커널의 채널 수와 입력의 채널 수가 같아야 합니다.
3) Convolution 연산의 역전파 이해하기
Convolution 연산은 커널이 모든 입력 데이터에 공통으로 적용되기 때문에 역전파를 계산할 때도 convolution 연산이 나오게 됩니다. 예를 들어, 입력 벡터인 $x = [x_{1}, x_{2}, x_{3}, x_{4}, x_{5}], kernel = [w_{1}, w_{2}, w_{3}]$이라고 해봤을 때, 출력인 $O_{i} = \sum_{j} w_{j}x_{i+j-1}$로 표현할 수 있습니다. 그렇게 구해진 출력 벡터는 역전파를 위해 상위 레이어를 통해 그레디언트 값인 $\delta = [\delta_{1}, \delta_{2}, \delta_{3}]$를 받게 됩니다. 그럼 이것을 활용해서 입력 벡터의 그레디언트와 커널의 그레디언트를 구해보고자 합니다. 입력 벡터 중 $x_{3}$값을 구해보려고 합니다. $x_{3}$은 $\delta_{1}w_{3} + \delta_{2}w_{2} + \delta_{3}w_{1}$로 표현할 수 있는 데, 이것은 $x_{3}$이 각각 kernel 값을 통해서 곱해진 대로 역전파가 되게 됩니다. $O_{1} = x_{1}w_{1}+x_{2}w_{2}+x_{3}w_{3}$으로 만들어질 때, $x_{3}$은 $w_{3}$과 곱해졌기에 역전파로 $\delta_{1}w_{3}$이 항으로 들어오게 되는 것입니다. 이러한 방식으로 $x$에 대한 역전파가 진행됩니다. 커널도 마찬가지로 곱해져서 들어간 출력 벡터의 그레디언트와 입력 벡터의 항의 곱으로 만들어지게 됩니다. 수학식으로 표현해보면,$\frac{\partial L}{\partial w_{i}} = \sum_{j}\delta_{j}x_{i+j-1}$로 표현할 수 있습니다.
2. 피어 세션 정리
수업시간 내용 질문
1. Class 내부의 init함수에서 super에는 왜 클래스명이 있나요?
-
이것은 파이썬 2에서 적용되던 문법이었으나 현재 파이썬 3에서도 쓸 수는 있음.
2. Zero_grad의 역할은 무엇인가요?
-
전에 있던 gradient를 제거하기 위해서 있는 코드로 예상합니다.
3. 이상치에 대한 처리는 보통 어떻게 하나요?
-
이상치는 보통 상자 그림과 같은 방식으로 처리할 수도 있지만, 데이터의 도메인에 따라 다르다고 생각이 듭니다. 도메인 전문가의 도움이 필요하다고 생각이 들지만 추가적으로 조교님을 통해 답을 얻을 수 있었으면 좋겠습니다.
4. k-fold
-
K-fold를 사용할 때, 구분된 train/validation으로 최적해를 구하는 하이퍼 파라미터 셋을 찾습니다. 최적의 하이퍼 파라미터를 구했다면, 이를 고정해서 전체의 데이터(train/validation)를 모두 포함해서 training 합니다.
-
K-fold를 사용할 때, 하이퍼 파라미터 셋을 구할 때 k번의 데이터셋에 적용하여 결과들을 종합하여 하이퍼 파라미터를 평가하게 됩니다.
5. 인과관계 vs 상관관계
-
상관관계 : A가 발생할 때, B가 발생한다.(A와 B의 인과성 없음)
-
인과관계 : A가 원인이 되어 B가 발생한다.(A와 B의 인과성이 있음)
예시) 열을 가하면 물이 끓는다.
-
조건부 확률 : A가 일어났을 때, B가 일어날 확률
예시) 주사위를 두 번 던질 때, 처음에 1이 나왔을 때 두 번째에서 홀수가 나올 확률(앞에 사건이 뒤에 사건에 영향을 미치지 않음)
-
인과관계가 존재하면 그 관계는 상관관계가 존재하지만 상관관계가 있다고 해서 인과관계가 있는 것은 아니다.