Fully Connected Neural Network(FC) : 노드와 노드 간의 연결이 모두 이루어진 것
Activation Function : sigmoid나 hyper-tangent와 같은 비선형 포화 함수(non-linear saturating function)를 사용하게 되면, 입력의 절대 값이 작은 일부 구간을 제외하면 미분 값이 0 근처로 가기 때문에 역전파(backpropagation)를 통한 학습이 어려워지거나 느려지게 됨.
이 문제의 해결책:
- ReLU: 간접적인 회피로 문제가 완화되긴했으나, 망이 깊어지면 여전히 문제.(dropout, regularization은 본질적인 해결책이 아님.)
- Residual Network & Batch Normalization(BN) (2015): 획기적인 방법으로 이에 대한 설명은 하단 참고.
Batch Normalization(BN) & Residual Network:
- GPU의 사용으로 32~256 size의 mini batch SGD(stochastic gradient descent) 사용. 이는 효율적, but hyper-parameter의 설정에 신경을 많이 써야 함(특히 초기값과 learning rate). 망이 깊어지면 이전 layer에서의 파라미터 변화가 증폭되어 큰 영향("Covariate Shift").
- 이 증폭되는 현상을 방지하는 수단: batch normalization, whitening(정규화(평균:0, 분산:1)).
- 단순하게 whitening만 시켜 loss(cost function)이 변하지 않게 되면, 특정 변수가 계속 커지는 현상 발생.
- 따라서 BN(batch normalization)으로 평균분산을 조정하는 과정을 network에 포함시켜 training시에 같이 조절함.
신경망에 포함되기에 back-propagation(chain rule 적용)을 통해 학습 가능.
- BN이 whitening과 다른 부분은 평균 분산을 구한 후 정규화시키고 다시 scale(weight)과 shift(bias) 연산을 위해 변수를 추가됨. 또 정규화시켰던 부분을 원래대로 돌리는 identity mapping도 가능하고, 학습을 통해 scale(weight)과 shift(bias)변수를 최적화할 수 있기 때문에 단순 정규화 보다 강력. BN은 보통 DNN구조의 non-linear 활성 함수 앞쪽에 배치됨.
- + 학습시에 mini-batch 마다 scale(weight)과 shift(bias) 변수를 구하고, 그 값을 저장 후 평균으로 사용.
- normalization은 원래 training 전체 집합에 대하여 실시할 때 최고의 효과를 거둘 수 있겠지만, mini-batch SGD방식을 사용하게 되면 파라미터의 update가 mini-batch 단위로 일어나므로 mini-batch단위로 BN을 실시. mini batch 집합의 선정은 가급적이면 correlation이 적어 mini-batch가 전체 집합을 대표하는 것이라고 생각해도 무방.
위의 방법은 BN을 fc(Fully Connected Neural Network)에 적용하는 방법이며, CNN에 적용하는 방법은 아래와 같다.
convolution layer의 shared weight와 sliding window방식을 적용할 때는 출력 feature map의 모든 픽셀에 대하여 동일한 연산을 수행. BN을 적용할 때는 mini-batch에 있는 모든 activation 뿐만 아니라 위치까지 고려해야 하기에
z = g(BN(Wu+b)) (g: activation, BN: batch normalization, W: weight, u: input, b: bias)
BN은 각각의 Wu+b에 독립적 적용 후 activation function! 이때 mini-batch의 크기는 m이라고 하면 출력 feature map의 크기(p*q)에 해당하는 sliding window를 움직이면서 연산으로 하므로 mini-batch크기가 사실상 m*p*q로 커진 것으로 간주하고 평균 분산을 구함. 따라서 scale(weight)과 shift(bias)가 fc처럼 activation마다 붙는 것이 아닌 featuremap에 대하여 학습을 통해 결정됨.
NN의 가장 기본 구조(x : 입력값, y : 출력값출력 값) : y = w1 * x1 + w2 * x2 (원점을 항상 지남) 그렇다면 w(가중치)를 어떻게 정하지? supervised learning(training data를 수집하고 집어넣은 후 임의의 값을 대입하면 결과 도출! 원하는 결과와의 error가 줄어드는 방향으로 w를 갱신(gradient descent)) -> 실제 신경망에서는 입력 값에 1을 추가하여 w3라는 값을 더해줌. (모든 경계 표현 가능))
Back-Propagation Network(BPN) : 일반적인 deep 구조인 hidden layer가 더 들어간 것! 각각의 출력 값에 따른 error값을 가지고 back방향으로 전달하면서 weight(w)를 수정
- CNN Learning parameter num: Input Channels Num x Filter Height x Filter Width x Output Channels Num
- CNN convolution layer output data size:
- OutputHeight = (InputHeight + 2*(PaddingSize) - FilterHeight)/Stride + 1
- OutputWidth = (InputWidth + 2*(PaddingSize) - FilterWidth)/Stride + 1
- CNN pooling layer output data size:
- OutputHeight = InputHeight / PoolingSize
- OutputWidth = InputWidth / PoolingSize
# 참고 :
- "Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift"
- http://taewan.kim/post/cnn/