

0 ~ 1 사이의 값을 갖는다.
문제점
x가 -10이나 10이 되면 gradient는 0이 되어버려 이 값이 backprop된다면 0이 전달되어 gradient가 사라진다.
만약 input x가 모두 양수라면, w에 대한 gradient는 모두 양수이거나 음수의 방향이다. 즉, 우리가 원하는 방향은 파란색 화살표이지만, 모든 w가 양수의 방향 또는 음수의 방향으로밖에 이동할 수 밖에 없기 때문에 최적의 w를 구하는데 더 오랜 시간이 걸린다.

문제점
기본적으로 ReLU는 gradient의 절반을 없앤다.
DATA CLOUD(training data)에 겹치지 않는 부분에서는 dead ReLU로, 업데이트 되지 않게 된다. 이는 초반 initialize에서 w가 너무 클 때, 또는 초기에는 적절했지만 learning rate가 너무 커서 w값이 날 뛸 때 주로 일어난다. 잘 학습시키더라도 기본적으로 10%~20%의 gradient는 죽게된다고한다.positive biases를 추가해 주는 경우가 있다. 업데이트 시에 active ReLU가 될 가능성을 조금이라도 더 높여주기 위함이다. 대부분은 zero-biases로 초기화한다.
기울기가 로, backprop하면서 학습되는 파라미터이다.

ReLU와 LeakyReLU의 좀 더 일반화된 형태로, saturation이 되지 는다 그러나 뉴런당 파라미터가 로 두배가 된다.
보통 ReLU를 사용한다.


PCA나 Whitening의 방식도 있지만 이미지에서는 굳이 낮은차원으로 projection시키지는 않는다. 그리고 Normalize도 굳이 할 필요 없다. 이미지를 다룰때는 zero-mean을 보통 사용한다.
모든 뉴런이 같은 일을 한다. 모든 뉴런이 죽어 업데이트가 되지 않는 것은 아니다. 가중치가 0이므로 모든 뉴런은 모두 다 같은 연산을 수행한다. 출력도 같고, gradient도 서로 같을 것이다.
인 gaussian
W = 0.01 * np.random.randn(D, H)
작은 네트워크라면 symmetry breaking에 충분하지만 deeper 네트워크에서는 문제가 생긴다.
deep network에서 초반에는 가우시안 분포가 잘 나타나지만, 가 너무 작은 값들이라서 를 곱할수록 출력 값이 급격히 줄어 std가 0이 되어버린다. 즉 모든 activation이 0이 된다.
W = np.random.randn(fan_in, fan_out) * 1.0
가중치가 큰 값을 가지므로, tanh의 출력은 saturate된다. 따라서 출력이 항상 1이거나 -1이 된다. 따라서 gradient는 모두 0이 되어 업데이트가 되지 않을 것이다. (Almost all neurons completely saturated, either -1 and 1. Gradients will be all zero)
W = np.random.randn(fan_in, fan_out) / np.sqrt(fan_in)
standard gaussian으로 뽑은 값을 입력의 수로 스케일링해주어 기본적으로 입/출력의 분산을 맞춰준다. 입력의 수가 많은 경우에는 작은 가중치, 입력의 수가 적은 경우에는 그 반대가 된다.
그러나 linear activation이 아니라 ReLU를 사용하면 출력의 절반이 0이 되어 출력의 분산을 반토막 낸다. 이때문에 값이 너무 작아진다.
이를 해결하기 위해
W = np.random.randn(fan_in, fan_out) / np.sqrt(fan_in / 2)
를 사용하여 좋은 결과를 내었다.
가중치를 잘 초기화하는 대신에 이 과정을 통해 모든 레이어가 Unit Gaussian이 되도록 한다.
N x D(차원) 에서 각 D(차원)마다의 평균과 분산을 계산하여 Normalize하는 방식으로 진행된다. 보통 FC-layer이나 Conv-layer 이후, 그리고 nonlinearity 이전에 사용된다.
CNN에서는 공간적인 구조를 학습하기를 원하기 때문에 activation map 하나당 하나의 평균과 분산을 갖도록 BN을 적용한다.
으로 Normalize를 하고, 다시 이 값을 BN전의 값으로 되돌리기 위해 아래와 같은 식을 사용한다. 는 스케일링, 는 이동을 담당한다.
Batch Normalization을 쓰면,
test time에서는 또 다시 mean / std를 계산하지 않고 training time에 running averages등으로 계산한 값을 사용한다.
https://eehoeskrap.tistory.com/430 여기에 자세히 설명되어있다.