
앞으로 강의는 NN(Neural Networks)의 학습에 대해 진행된다.
layer에서 입력값이 들어오면 (FC 또는 CNN에) 가중치와 곱해 활성화 함수(= 비선형 연산)을 거친다.
입력 받은 값을 [0, 1] 범위의 값으로 변환해 출력해준다.
입력 : 매우 큰 값 → 출력 : 1에 가까운 값
입력 : 매우 작은 값 → 출력 : 0에 가까운 값
0 근처 구간(rigime)을 보면 선형 함수 같아 보이는 linear regime이 있다.
Sigmoid와 유사해보이지만 출력값의 범위가 [-1, 1]이다.
: 출력값이 0 중심이다(zero-centered).
하지만 여전히 Sigmoid의 1번 문제(saturated)는 해결하지 못한다.
입력 : 음수 → 출력 : 0
입력 : 양수 → 출력 : 입력값
음수 영역의 기울기를 죽이지 않고 약간의 음수 기울기를 주는 방식
기울기가 α라는 파라미터에 의해 결정되는데, α는 backpro으로 학슺시키는 파라미터로 만들어진다.
음수 영역에서 출력값이 0이 아니다.
→ 입력값이 음수일 때도 saturation 되지 않고 기울기가 0으로 죽는 일이 발생하지 않는다.
= Dead ReLU 발생 X
ReLU와 Leaky ReLU의 중간 단계
앞에서 본 활성화 함수들과 달리 특정한 기본 형식이 정해지지 않고 두 선형 함수 중 최댓값을 선택하는 방식이다.
선형 함수 중 최댓값을 선택하기 때문에 Maxout도 선형이라 saturation 되지 않고 기울기가 0으로 없어지는 일이 발생하지 않는다.
뉴런당 파라미터의 수가 두 배가 되어 과 를 지니고 있어야 한다.
다양한 활성화 함수 중 ReLU가 실제로는 가장 많이 쓰이는데 이때 학습률(Learning rate)을 잘 결정해야 한다.
Sigmoid는 가장 오래되었고 LU 계열이 잘 작동하기 때문에 굳이 추천하지 않는다.
가장 대표적인 데이터 전처리 과정은 아래와 같다.step 1. 입력된 데이터를 zero-mean으로 만든다.
step 2. 표준 편차를 사용해 normalization한다.
- normalization을 해야 하는 이유
모든 차원이 동일한 범위 안에 있도록 만들어 전부 동등한 기여(contribute)를 하게 만들기 위해서
+) 이미지 전처리가 Sigmoid에서의 문제를 해결하기에는 충분하지 않다.
Sigmoid에서는 zero-mean이 필요한데, 데이터 전처리는 첫번째 레이어에서만 Sigmoid의 zero-mean 문제를 해결할 수 있음
NN을 수행할 때, 가중치가 업데이트 되면서 학습을 하게 된다. 초기 가중치가 있을 것이고, 기울기를 계산해서 가중치 값은 업데이트될 것이다.
A. 입력되는 값에 상관없이 모두 같은 값을 출력하게 된다.
기울기도 같아지기 때문에 모든 가중치가 똑같은 값으로 업데이트 된다.
→ 뉴런이 죽는다 / 업데이트가 없다 (X)
뉴런이 같은 일을 하게 된다 / 모두 동일한 작업을 한다 (O)
뉴런들이 서로 다르게 생기길 원하기 때문에 가중치를 랜덤하게 초기화시켜 대칭이 되는 것을 피해야 한다.(Symmetry breaking)
: 가중치 W의 초기값을 표준정규분포에서 샘플링한 후, 좀 더 작은 값을 위해 스케일링하여 모든 가중치를 임의의 값으로 초기화하는 방식
간단한 네트워크에서는 괜찮디만 더 깊은 네트워크에서는 문제가 생길 수 있다.
All the activations become zero
가중치 W의 값이 너무 작기 때문에 출력 값도 급격히 줄어 결국 0이 된다. 활성화 함수의 결과도 0이 되고, 이를 이용해 역방향 계산을 하게 되면 기울기도 매우 작아져 업데이트가 잘 일어나지 않게 된다.
출력값이 매우 커지면서 포화(saturated)되어 tanh에서처럼 모든 기울기가 0이 되고 가중치가 업데이트 되지 않는 문제 발생한다.
W = np.random.rand(fan_in, fan_out) / np.sqrt(fan_in)
표준정규분포에서 뽑은 값을 입력의 수로 스케일링해주는 방식
→ 입력과 출력의 분산을 맞춰준다.
입력 : 적다 → 더 큰 가중치가 필요함. 작은 입력의 수가 가중치와 곱해지기 때문에 가중치가 더 커야지만 출력의 분산만큼 큰 값을 얻을 수 있음
입력 : 많다 → 더 작은 가중치가 필요함.
이는 Linear Activation에 있다는 가정 하에 잘 작동하기 때문에 비선형인 ReLU를 쓰면 잘 작동하지 않는다.
ReLU에서 잘 작동하도록 하기 위해서는 추가적으로 2를 더 나눠주면 된다.
W = np.random.rand(fan_in, fan_out) / np.sqrt(fan_in / 2)
ReLU는 출력의 절반을 죽이고 매번 0으로 만들기 때문에 출력의 분산을 반으로 줄여버린다
→ 뉴런들 중 절반이 없어진다는 사실을 고려함
가중치 초기화 대신 현재 batch에서의 평균과 분산을 이용해서 훈련 시작 시 batch normalization을 설정한다.
→ 모든 Layer에서 정규 분포를 따르도록 만들어준다.
들어오는 모든 미니 배치에 대해 이 작업을 수행한다.
step 1. 입력으로 주어진 mini-batch의 평균 계산
step 2. 분산 계산
step 3. 평균과 분산으로 정규화
step 4. 추가 스케일링 & 이동
이렇게 완성된 batch norm을 활성화 함수를 거치기 전에 ConV층과 FC층 뒤에 넣어준다.
→ 층마다 batch norm을 넣어 normalization 진행batch norm : tanh로 가는 입력값들을 tnah함수의 linear한 부분(기울기가 존재하는 범위)으로 범위를 변환한다.
입력값들의 범위를 normalize해주어서 Saturation을 어느 정도 조절해준다.
Batch Normalization을 통해 기울기의 흐름에 좋은 영향을 준다. 학습률(learning rate)의 범위를 더욱 확장시킬 수 있고, 많은 다양한 initialization을 유도할 수 있어 initialization의 의존성을 줄일 수 있게 된다.
step 1. Data Preprocessing
step 2. Choose Network Architecture (loss 함수 지정, regularization)
step 3. Train (train set에서 소량만 가져와 과적합이 되어 학습이 잘되는 것을 확인 → 전체 데이터 학습 & Loss 확인하면서 Learning Rate 조정)
: 훈련 세트(training set)에서 훈련한 다음, 검증 세트(validation set)에서 이 하이퍼파라미터가 얼마나 잘 작동하는지 평가하는 것
: 하이퍼 파라미터들의 값들을 조합을 고정시켜서 좋은 조합을 뽑는 방식
Random Search 방식이 더 좋다
Grid 방식은 일정한 간격으로 조합을 찾기 때문에 그림대로 찾아 나가지만, Random 방식은 무작위로 살펴 나감
변수들 사이에서도 중요도가 있을텐데 Random 방식은 이를 무시한 채로 search한다.