이전 장에서는 당연하 듯 진행했지만 사전에 정해진 분포에 따라 parameter initialization을 실행했다. 이것에 대해 자세히 살펴보도록 한다. 또한 activation function에 따른 여러 initialization 형태들도 살펴본다.
여러개의 layer가 있는 deep network의 gradient 연산을 수식화하면 다음과 같다.
여기서 numerical underflow문제가 발생할 수 있음을 확인해야 한다. numerical underflow란 너무 많은 확률값들을 곱할 때 생긱는 문제로 이는 그 연산값을 표현하기 어렵다는 문제뿐만 아니라 gradient 연산 자체를 불안정하게 만든다. 불안정한 optimization algorithm은 두가지 문제를 낳을 수 있는데 파라미터를 업데이트 하는 과정에서 exploding gradient,vanishing gradient problem이 생길 수 있다. 파라미터 업데이트 연산이 매 연산마다 너무 크거나 너무 작아서 생긱는 문제이다.
1. Vanishing Gradient
gradient 값이 매우 작아지는 경우부터 생각해보자. activation function이 각각의 layer의 linear operation을 수행하면서 그리고 이 때 어떤 activation function을 선택해서 이런 문제가 생기는지를 살펴봐야한다.
이 문제가 발생하는 대표적인 activation function이 Sigmoid function이다. 직접 확인해보자.
%matplotlib inline
import torch
from d2l import torch as d2l
x = torch.arange(-8.0, 8.0, 0.1, requires_grad=True)
y = torch.sigmoid(x)
y.backward(torch.ones_like(x))
d2l.plot(x.detach().numpy(), [y.detach().numpy(), x.grad.numpy()],
legend=['sigmoid', 'gradient'], figsize=(4.5, 2.5))
그래프에서 확인할 수 있듯, input값이 작거나 클 때 모두 gradient값이 0에 가깝다. 이것이 vanishing gradient problem으로 이런 문제가 발생하면 당연히 training은 제대로 이뤄질 수 없다.
이러한 이유로 activation function으로 sigmoid가 아닌 ReLU가 더 안정적이기에 더 자주 사용된다.
2. Exploding Gradient
vanishing과 반대로 gradient값이 매우 커지는 경우이다. 100개의 가우시안 행렬을 initial metrix와 곱해준다면 matrix product는 explode할 것이고 이 경우에도 마찬가지로 training이 이뤄질 수 없다.
M = torch.normal(0, 1, size=(4,4))
print('a single matrix \n',M)
for i in range(100):
M = torch.mm(M,torch.normal(0, 1, size=(4, 4)))
print('after multiplying 100 matrices\n', M)
3. Breaking Symmetry
위에서 언급하지 않았지만 symmetry input이 있는 경우에도 문제가 발생한다.
한개의 hidden layer와 두개의 unit을 가진 MLP를 생각해보면 symmetry가 내제되어 있는 경우 W(1)에 대해 첫번째 층에서 연산을 하고 그 output에 대해 다시 연산을 하는 결과값들이 모두 동일하게 된다. 이렇게 되면 update되는 것이 전혀 없는 것이다. forward, backward propagation을 진행하면 계속 같은 값을 가진다. 따라서 random initialization이 중요해지는 것이다.
이 문제는 minibathc stochastic gradient descent도 해결하지 못하며 dropout regularization을 통해 해결할 수 있다.
4. Parameter Initialization
위에서 언급한 세가지 문제를 마주하지 않을려면 initialization 방식을 신중히 골라야 한다. 이전 장에서 그랬듯, initialization의 default 는 normal distribution이다. 다음은 그 방식들 중 xavier intializiation이다.
다음을 통해 initialization을 살펴보자.
여기서 output Oi의 분산값이 1이 아니라면 그 분산값은 고정되지 않는다. 따라서 다음의 가정이 필요하다.
layer의 output 갯수도 일정해야함을 확인하자.
그래서 다시 xavier로 말하자면 xavier distribution은 평균이 0이고 분산으로 위 값을 가지는 분포이다. 이런 이유로 xavier initialization은 어떤 output의 분산도 input의 갯수에 영향을 받지 않으며 어떤 gradient 분산도 output의 갯수에 의해 영향을 받지 않는다. 이 때문에 매우 안정된 training을 가능하게 하여 현재 거의 대부분의 경우에 사용되는 initialization 방식이다.
'Basic Deep Learning > Dive into Deep Learning 리뷰' 카테고리의 다른 글
[D2L] 6. CNN (0) | 2022.07.25 |
---|---|
[D2L] 11.1 Optimization and Deep Learning (0) | 2022.07.13 |
[D2L] 4.7 Forward, Backward Propagation & Computational Graph (0) | 2022.07.11 |
[D2L] 4.6 Dropout (0) | 2022.07.11 |
[D2L] 4.5 Weight Decay (0) | 2022.07.11 |