[ 이론 ]
optimization에 대해 이전 장에서도 사용은 하였지만 구체적으로 파헤쳐보지 않았다.
이후 CNN, RNN에 대해 더 공부해보기 전에 optimization algorithm들에 대해 자세히 알아보고 넘어갈려고 한다.
optimization의 장점은 이전 장에서도 확인했지만 완벽하지 않고 여러 문제점을 가진다. 이번 장에서는 그 문제점으로는 어떤 것이 있는지 확인해보고자 한다.
optimization에 대해 간단히 복습해보면 정의된 loss function의 loss를 minization 하는 과정에서 optimization이 사용된다.
하지만 여기서 분명히 해야 하는 것은
goal of optimization = minimize the objective = reduce training error
goal of deep learning = finding a suitable model = reduce generalizing error 이라는 것이고 optimization 과정에서 overfitting에 주의해야하는 것은 별도의 문제라는 점이다.
이것을 확인하기 위해, empirical risk와 risk를 구분한다.
empirical risk = average loss on training dataset
risk = expected loss on the entire population dataset
예시로 함수를 정의해보고 확인해보자.
# risk function
def f(x):
return x * torch.cos(np.pi * x)
# empirical risk function
def g(x):
return f(x) + 0.2 * torch.cos(5 * np.pi * x)
def annotate(text, xy, xytext):
d2l.plt.gca().annotate(text, xy=xy, xytext=xytext,
arrowprops=dict(arrowstyle='->'))
x = torch.arange(0.5, 1.5, 0.01)
d2l.set_figsize((4.5, 2.5))
d2l.plot(x, [f(x), g(x)], 'x', 'risk')
annotate('min of\nempirical risk', (1.0, -1.2), (0.5, -1.1))
annotate('min of risk', (1.1, -1.05), (0.95, -0.5))
위와 같이 loss function이 최소화되는 지점에서 차이가 발생한다.
optimization에서 여러 문제가 발생할 수 있다고 하였는데 local minima, saddle point, vanishing gradients 이렇게 세가지 문제가 있다.
local minima
전체 objective function에서 minimum point가 global minimum이고 인접한 point들 사이에서 minimum이 local minimum이다. objective funtion에서 global minimum을 찾는 것이 당연한 목표이지만 local minimun에서 그 step이 멈출 수 있다.
x = torch.arange(-1.0, 2.0, 0.01)
d2l.plot(x, [f(x), ], 'x', 'f(x)')
annotate('local minimum', (-0.3, -0.25), (-0.77, -1.0))
annotate('global minimum', (1.1, -0.95), (0.6, 0.8))
그래서 local minimum에서 멈추지 않을려면 일정한 noise를 더해줄 필요가 있는데 이는 기존에 minibatch stochastic gradient를 통해 어느 정도 해결되는 문제이다.
Saddle point
saddle point는 local이나 global minimum이 아닌데도 gradient가 vanish하는 지점이다.
x^3 함수를 생각해보면 일차미분, 이차미분에서 x=0인 지점에서 모두 미분값이 vanish하게 되는데 이로 인해 optimzation step이 멈추게 되는 것이다. 그림으로 살펴보자.
x = torch.arange(-2.0, 2.0, 0.01)
d2l.plot(x, [x**3], 'x', 'f(x)')
annotate('saddle point', (0, -0.2), (-0.52, -5.0))
saddle point를 더 확연히 보여줄 수 있는 함수로 3차원에서 표현해보면 다음과 같다.
# f(x) = x**2 - y**2
x, y = torch.meshgrid(
torch.linspace(-1.0, 1.0, 101), torch.linspace(-1.0, 1.0, 101))
z = x**2 - y**2
ax = d2l.plt.figure().add_subplot(111, projection='3d')
ax.plot_wireframe(x, y, z, **{'rstride': 10, 'cstride': 10})
ax.plot([0], [0], [0], 'rx')
ticks = [-1, 0, 1]
d2l.plt.xticks(ticks)
d2l.plt.yticks(ticks)
ax.set_zticks(ticks)
d2l.plt.xlabel('x')
d2l.plt.ylabel('y');
위 function에 대해 k차원의 백테가 input으로 주어지고 그 output이 scalar일 경우 그 Hessian matrix가 k개의 eigen values를 가진다는 Hessian matrix 성질로 자세히 살펴보면 다음과 같다.
- When the eigenvalues of the function’s Hessian matrix at the zero-gradient position are all positive, we have a local minimum for the function.
- When the eigenvalues of the function’s Hessian matrix at the zero-gradient position are all negative, we have a local maximum for the function.
- When the eigenvalues of the function’s Hessian matrix at the zero-gradient position are negative and positive, we have a saddle point for the function.
특히 고차원의 input의 경우 최소 몇개 이상의 eigenvalues들이 음의 값을 가질 확률이 높은데 이는 saddle point를 더욱 local minimum스럽게 보여지게 된다. 하지만 이는 극단적인 경우로 대부분의 딥러닝 연산에서 위의 문제가 발생하는 경우는 흔치 않다.
Vanishing Grdients
위 두 문제와 달리 vanishing gradient의 경우 흔히 발생하는 문제이다.
activation function에 대해 다뤘던 이전 장을 생각해보면, tanh function에서도 이 문제가 생길 수 있다.
x = torch.arange(-2.0, 5.0, 0.01)
d2l.plot(x, [torch.tanh(x)], 'x', 'f(x)')
annotate('vanishing gradient', (4, 1), (2, 0.0))
x가 4인 지점을 보면 그 미분값은 거의 0에 수렵하고 이는 이후 optimization step이 더 나아갈 수 없는 이유이다.
세가지 문제점에 대해 살펴보았는데 이후에서는 이 문제젬에 대해 어떻게 다뤄야할지 더 공부해보겠다.
'Basic Deep Learning > Dive into Deep Learning 리뷰' 카테고리의 다른 글
[D2L] 7.1 Modern CNN (0) | 2022.07.26 |
---|---|
[D2L] 6. CNN (0) | 2022.07.25 |
[D2L] 4.8 Numerical Stability and Initialization (0) | 2022.07.11 |
[D2L] 4.7 Forward, Backward Propagation & Computational Graph (0) | 2022.07.11 |
[D2L] 4.6 Dropout (0) | 2022.07.11 |