습관을 애정한다

4. Introduction to Neural Networks

by 습관중독

복습: 1) computational graph => f = Wx + regularization
2) CNN 사용 필터: activation map, optimization
3) SGD

이번 장 학습내용
1.
활성화 함수(activation functions)
2. 데이터 전처리(
data preprocessing)
3. weight initialization
4.
배치 정규화(Batch Normalization, BN)
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
1. 활성화 함수(activation functions)
A. 개념: Activation Functionf = Wx에 대해서 앞에서 input값이 들어오면 이 값을 다음 노드로 보낼 때 값을 어떻게 보낼지를 정해줍니다. 보통 활성화 함수는 non-linear한 함수를 사용합니다.(inputlinear한 값이 들어오지만 이걸 통과하면 non-linear한 값이 나오게 되죠).

B. 기능:
활성화 함수(activation function)의 역할은 말 그대로 활성화시켜주는 것입니다. 어떤 값이 들어오면 이 값들을 어떻게 활성화 시킬 것인지를 정하는 것입니다. 이 값이 이제 다음 layer로 전달되는 것이죠. 그래서 활성화 함수의 종류에 따라 그 값의 형태도 다양합니다.

C. 종류
1) sigmoid 함수: 과거에 많이 사용 + 단순한 단일, 이진분류 등=아직도 많이 사용 BUT 최종 출력에서만 사용+중간의 hidden layer에서는 사용하지 않죠. 그 이유는 3가지.
a. gradient vanishing: backpropagation할수록 기울기 소실
b. zero-centered 문제: zero-centered가 안되면 조그만 변화에도 크게 변화해서 안좋음.
c. exp 연산의 값이 매우 비싼 어려운 연산이라 대체 필요.

2) 하이퍼볼릭 탄젠트(tanh): Sigmoid를 조금 바꾼 것. Zero centered. but 기울기 소실문제와 exp연산 문제
3) ReLU(Rectified Linear Unit): 대중적 activation function. ReLU는 0이하인 애들은 전부 0으로 그리고 그 이상인 값들은 그 값대로 내보내줍니다. 그래서 f(x) = max(0,x)의 식을 가지고 있죠. 매우 단순하지만 잘 동작하는 활성화함수입니다.
문제: i) 일단 0 이하 값들은 전부 버리게 되죠. ii) zero centered가 되어 있지 않습니다.
4) Leaky ReLU: 많이 사용. 0 이하의 값을 0.01x값을 줘서 작은 값이라도 주게 하는 것이죠.
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
2. 데이터 전처리(
data preprocessing)
A. 데이터 전처리는 zero-centered, normalized 많이 사용
B. Zero-centered
C. normalized
1) 특정 범위 안에 이 값들을 모아놓는 것. 표준편차를 나눠줍니다. (다른 방식도 있음)
2) 이미지에서는 사용하지 않음. 왜냐하면 이미지는 0~255라는 이미 값이 정해져있죠? 그렇기 때문에 굳이 normalized를 하지 않는다고 합니다. 대신 zero-centered를 하죠.
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
3. weight initialization
A. 최근에 정말 핫한 영역: weight값이 어떻게 초기화 되냐에 따라서 모델 학습이 잘 되냐 안되냐가 결정

B. 방법
1) 만약 W가 0이면 어떻게 될까요? Gradient vanishing이 발생하겠죠??
a. 바로 랜덤의 작은 값들을 넣는 것: 0.01 * np.random.randn(D,H)를 통해 랜덤으로 값을 넣어줍니다. 그리고 생각보다 잘 됩니다. 하지만 네트워크가 깊어질수록 이게 문제가 되죠. 레이어가 깊어질수록 값들이 전부 날라갑니다. 이건 왜 그러냐면요 tanh 그림을 보면 기울기가 0인지점이 날라가죠? 그래서 기울기가 0이 안되는 지점 (가운데 지점)만 살아남는 것.
b. 값을 크게 하면 어떻게 될까? W값이 너무 크기 때문에 오벼슈팅이 일어나게 됩니다. 그래서 -1과 1에 포화되어집니다. 가운데 지점이 아닌 사이드 부분에 값이 치우치게 됩니다. 그래서 좋은 weight값을 주기 위해서 Xavier initalization을 사용하게 됩니다.
c. Xavier initalization: 노드의 개수(fan_in)을 normalized하자는 것입니다. 큰거는 큰걸로 나눠주고 작은거는 작은값으로 나눠주는 것이죠. 즉, input의 개수가 많아지면 나눠주기 때문에 값이 작아지고 input의 개수가 적으면 weight값이 커지는 이렇게 합리적으로 weight를 초기화 합니다. 하이퍼볼릭 탄젠트에서는 잘 적용이 되는데 한 가지 문제는 ReLU에 적용이 잘 안된다는 것입니다. 그래서 2015년에 카이밍 he가 2를 나눠주는 방식을 적용했더니 잘 동작하더라 라고 발표를 하게 됩니다. 그래서 relu에서는 2를 나눠주어 진행합니다.

C. 이 weight initialization 분야는 지금도 매우 활발하게 연구가 진행되고 있는 분야. 근데 우리가 굳이 weight initalization을 안해도 되는 방법이 있는데요. 그게 바로 Batch Normalization입니다.
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
4.
배치 정규화(Batch Normalization, BN)
A. 개념: 기본적으로 Gradient Vanishing이 나오지 않도록 하는 아이디어입니다. 앞서서 우리는 이 문제를 activation function의 변화로 해결하려고 했습니다. 근데 BN은 이것이 아니라 training하는 과정 자체를 전체적으로 안정화시켜 주는 것.
internal covariance shift를 방지하는 건데요. 이게 뭐냐면 network각 층이나 activation 마다 input의 distribution이 달라지는 것입니다. 이걸 막기 위해서 각 층의 input distribution을 평균0, 표준편차1인 분포로 만들어버리는 것. 보통 우리는 input을 한 번에 처리하지 않고 batch 별로 처리합니다. 그래서 이 그림에서 처럼 N x D의 input이 들어오죠. 이 batch가 들어오면 이걸 nomalize한다는 것입니다.
일반적으로 activation전에 잘 분포되도록 한 다음에 activation을 진행할 수 있도록 해줍니다. 그래서 FC -> BN -> activation 으로 들어가게 되죠. 여기서도 이렇게 BN을 하면 unit gaussian이 되는데 이게 적합하냐? 안하냐? 를 고민해야 합니다. 이런 판단히 필요하죠.
BN에서는 이 판단 조차도 학습에 의해 가능하다라라고 말합니다. 처음에 normalize를 하고 두 번째에서 정규화 된 것을 조정할 수 있도록 기회를 주는데 감마랑 이런 값들이 있는데 감마는 노멀라이즈 스케일링 값 등입니다. 그래서 y(k)에다가 위의 x식과 감마 등의 식을 대입하면 상쇄가 되기 때문에 BN을 undo할지 do할지 판단합니다. B는 쉬프트하는 값입니다. 이 감마와 B도 학습을 통해서 값을 찾게 되는 것이죠. 즉 학습을 통해서 BN을 어느정도로 할 것이냐를 결정합니다.

그래서 실제 값은 이렇게 과정을 거칩니다. mean값을 구하고 variance값을 구한 다음(보통 분산은 얼마나 퍼져있나? 라는 지표죠) normalize를 합니다. 그리고 scale은 어느 정도 퍼지게 해주는지 정하는 것이고 shift는 이동성입니다. 앞서 설명드린대로 이 scale과 shift는 학습을 통해서 값을 찾습니다

보통 BN을 하면 Dropout을 안써도 된다고 합니다. 그 이유가 무엇일까요? Dropout은 랜덤하게 값을 꺼줍니다. BN도 마찬가지이죠. 배치마다 값이 조금씩 다르게 들어가고 값이 계속 바뀌게 되니까 노이즈가 적어지게 된다고 합니다. 즉, 계속 바뀌면서 이럴떄 해보고 저럴떄 해보니까 그런건가봐요… 잘은 모르게네요. 근데 아무튼 BN을 쓰면 dropout을 안써도 됩니다. 실제로 BN이 더 잘나올 때가 많습니다.

B. learning process
먼저 처음은 전처리입니다. 아까 말씀 드렸듯이 보통 이미지 인식에서는 zero-centered를 합니다. Normalized는 잘 하지 않습니다. 왜냐하면 이미 값이 0~255값을 가지고 있으니까요

그런 다음 이제 아키텍처를 선택합니다. Hidden layer를 어떻게 구성할 것인지 등을 선택하는 것이죠. 물론 선택해서 진행했다고 한들 바로 잘 나오지는 않을꺼지만 보통 이렇게 대충 사이즈를 잡아놓고 진행합니다.

그리고 이렇게 레이어를 구상했으면 loss값이 잘 나오는지 확인합니다.
여기서 하는 방식은 앞서 3강에서 소개드렸던 sanity check입니다. softmax에서는 loss가 –log(x)였죠? 근데 규제값을 0으로 줘버리면 –log(1/c)가 나옵니다. 그 값이 2.3인거죠

그리고 규제값을 살짝 올렸을 때 loss가 증가된 것을 볼 수 있습니다. 이렇게 우리의 layer가 동작하는지 확인하는 것이 sanity check입니다. 그 다음 훈련을 시켜보는데요. 바로 모든 데이터를 넣지 않고 작은 데이터 셋을 먼저 넣습니다.
데이터 수가 작기 때문에 거의 100% overfitting이 나옵니다. 그래서 train accuracy가 100%가 나오죠! 이게 overfitting이 제대로 되고 있으면 모델이 동작한다는 것을 의미합니다. 자 이제 regularization값과 learning rate값을 찾아봅니다. 적절한 값들을 넣어줘서 차근히 찾아보는데요.

 

 

'스탠포드 CS231n: CNN강의 정리' 카테고리의 다른 글

6. Training Neural Networks I  (0) 2020.11.28
5. Convolutional Neural Networks  (0) 2020.11.21
3. Loss Function and Optimization  (0) 2020.11.07
2. Image Classification  (0) 2020.10.17
1. CNN 소개 발표자료  (0) 2020.10.09

블로그의 정보

습관을 애정한다

습관중독

활동하기