<aside> 💡 아래의 계산하는 코드는 (무엇보다 간결함을 위해) R로 작성되었으나, Python으로도 쉽게 구현할 수 있습니다! R이 시각화가 훨씬 (제 기준으로는) 쉽고 좀 더 전문적인 룩(look)이 난달까요...☺️
</aside>
Python 기반의 Jupyter Notebook은 아래 Google Colab에서 확인할 수 있습니다! 직접 본인의 Drive로 옮겨서 실험해보세요! Python 과정의 해설은 추가적인 포스트에 달아놓겠습니다.
우선 예시로 사용될 데이터를 만들어보겠습니다. 더 복잡한 데이터도 충분히 만들어서 시험해보면, 과연 딥러닝이 어떻게 학습하는 지를 쉽게 이해할 수 있을 것입니다! 다만 본 글은 다양한 강의 자료에서 봐왔던 Stochastic Gradient Descent 알고리즘을 설명하는 자료를 재현하는 데에 목적이 있으므로, 간단한 이차함수 형태의 데이터를 만들어봤습니다! 정확하게는 parameter space를 시각화하여, 전체의 그라디언트 평균을 향하는 batch gradient descent (GD)에 비해 랜덤으로 추출된 표본을 사용하여 파라미터를 갱신하는 mini-batch gradient descent (SGD)가 왜 우수한지를 살펴보도록 하겠습니다.
우선 $x$ 값을 벡터로 생성해 이에 대한 $y$ 값을 계산해줍니다. 더 예측불가능한 노이즈를 넣기 위해, $y=ax^2 + bx + c$의 계수(coefficent)들 $a, b, c$ 역시도 정규분포에서 추출하였습니다.
### Data Creation ###
a <- rnorm(100, mean = 3, sd = 0.5)
b <- rnorm(100, mean = 10, sd = 1)
c <- rnorm(100, mean = -2, sd = 2)
x <- runif(100, min = -5, max = 3)
y <- a * x ** 2 + b * x + c
plot(x, y)
실제 참값은 $a = 3, b = 10, c= -2$인데, 파라미터 예측값 $a^$와 $b^$에 대해 참값을 중심으로 격자를 생성하여 에러를 계산해보도록 하겠습니다. Error는 RMSE(rooted mean squared error)를 사용했습니다. (수학에서 위첨자 $^*$ 기호는 optimal을 의미합니다.)
### curve ###
a_pred <- seq(2.5, 3.5, length.out = 40)
b_pred <- seq(9, 11, length.out = 40)
c_pred <- -2
errors <- matrix(rep(0, length(a_pred) * length(b_pred)), nrow = length(a_pred))
for (i in 1:length(a_pred)) {
for (j in 1:length(b_pred)) {
y_pred <- a_pred[i] * x ** 2 + b_pred[j] * x + c_pred
error <- (y - y_pred) ** 2
errors[i, j] <- sqrt(mean(error))
}
}
각 파라미터 값들에 대해서 error 값을 계산한 결과를 3d plot으로 나타낸 결과입니다. 시각화에는 R의 plotly
패키지를 이용하였습니다. x축, y축이 각각 파라미터 $a^, b^$를 의미하고, 높이인 z축이 해당 파라미터 조합에서의 에러를 의미합니다. (x축과 y축의 label은 설정하지 않아서, 축에 있는 값은 자료의 index에 해당합니다.)
# install.packages("plotly")
library(plotly)
fig <- plot_ly(showscale = FALSE)
fig <- fig %>% add_surface(z = ~errors, opacity = 1)
fig
랜덤으로 생성한 자료이기 때문에 매번 조금씩 차이가 발생할 수 있지만, 가운데에 위치한 파라미터 조합일 때, 즉 $a^=3, b^=10$ 인근에 위치할 때 에러가 최소화되는 것을 확인할 수 있습니다.
미니 배치(Mini-batch)를 이용하여 학습을 진행할 경우, 매번 파라미터 갱신은 데이터의 부분집합으로 진행하게 됩니다. 총 100개의 데이터를 생성했기 때문에, 25개씩 데이터를 이용하여 각각의 parameter space에 대한 error를 구해서 나타내면 아래와 같습니다. 우선 전반적인 error의 수준(평균 혹은 최소)도 차이가 발생할 뿐만 아니라, 곡면의 모양 역시도 차이가 있다는 것을 볼 수 있습니다.