[일상] SGD하게 산에서 내려온 이야기

magnussapiens·2022년 11월 6일
0

mumbling

목록 보기
1/1

velog 를 구글에 검색해보면 가장 먼저 보이는 소개 글이 '개발자들을 위한 블로그' 다. 개발자를 위한 플랫폼이지만 에세이를 쓰지 말란 말은 없었네요. 하지만 기술 개발 이야기가 가득한 이 곳에 에세이를 쓰는게 맞나 싶어 고민하던 찰나, '굉장히 잘 연결시킬 수 있는' 일이 있어 글을 적어보았습니다.


주말 등산을 시작하고 3주차, 아직 등산의 필수 요소들을 몸에 완전히 습관들이지 못했습니다. 커피와 물통을 꼭 챙겨야 하고, 손수건도 있으면 좋겠더라고요. 그 중 제일 중요한 건 '핸드폰 완충' 이라는 사실을 오늘에서야 깨달았습니다.

등산로 입구에 도착하고 나서 핸드폰을 보니, 배터리가 22% 밖에 남아있지 않았습니다. 올라가는 길에 음악도 들어야 하고, 정상에서 사진도 찍어야 했는데 말이에요. 다행히 이번에 올라간 아차산-용마산 코스는 너무나 많은 사람들이 다니고 있고, 그 능선도 가파르지 않아 둘레길도 설치되어있긴 했어요. 그래서 22%도 충분할거라 생각했습니다. 올라가면서 여러 사진과 영상을 마음 놓고 찍어댔습니다. 정상에 도착해서는 카메라 거치대에 놓고 서울 시내를 배경으로 사진도 찍었습니다. 한참 찍고 나서 핸드폰을 보니 14%로 줄어들어있었고, 배터리 표시에 빨간 불이 뜬 것도 보았습니다.

산에서 내려가는 속도보다 핸드폰 배터리가 닳는 속도가 더 빠르다고 느껴졌습니다. 아차산-용마산 코스의 특성 상, 너무나 많은 갈래길이 있고 여차 하면 구리까지도 갈 수 있는 수준이었거든요. 너무 늦게 내려간다면 핸드폰 배터리가 없어 집에가기 어려워 보였습니다. 산등성이 위에서 '내가 지금 어디에 있고', '언제 내려갈 것인지'를 잘 정해서 내려가는 길을 택해야 하는 상황이 계속되었습니다. 어쩔 수 없이 지도를 보다보니 7%까지 배터리가 떨어지기까지 했습니다. 이러다간 집에 갈 버스를 탈 수 없을정도, 저는 과감하게 핸드폰을 비행기 모드로 두고 주변 상황에 의지하며 하산하기로 결심했습니다.

문제는 길을 모른다는 것이었어요. 이 즈음에서 용마산역으로 내려가야 하는데, 길이 너무 많아 선택하기 어려웠거든요. 결국 가장 '가파른 길'을 선택해서 내려가기로 했습니다. gradient 가 큰 길을 선택하기로 한 거죠. 내려가다보면 또 다른 갈랫길이 등장했는데, 그때 마다 여러 길 중 가장 가파른 길을 골랐습니다. 이러다 local minium 에 빠지는건 아닐까 싶어 겁도 났어요. 몇번 gradient 가 큰 길을 선택하다 보니 사람들이 잘 다니지 않은 길을 제가 걷고 있었습니다. 사람들이 다니지 않는다고, (등산로 true, 등산로 pred 간의 ) Loss 가 너무 크다고 되돌아갈 수도 없었던 것도 맞습니다. 핸드폰 배터리가 더 떨어지기 전에 global minium이자 가장 낮은 곳인 '등산로 초입'으로 돌아가야했기 때문에 말입니다. 여러 길을 왔다갔다 하며 둘러보기엔 힘이 꽤 빠진 상태였습니다. 확률적으로 가장 가파르게 낮은 곳을 반복적으로 선택했어야 했습니다.

sdg 하산 방식이 맞았다고 느꼈던 건 제일 마지막 global minimum에 도착했을 때였습니다. 산 초입, 어떤 데크가 마련되어있는 그 곳 말이에요. 가보신 분들은 이미 아시겠죠. 그 곳에서 핸드폰 배터리를 살펴보니 5%나 남아있더라고요. sgd 한 방식으로 여러 선택을 했을 때, 최저점을 만날 수 있다는 내용을 몸소 실천할 수 있었던 아주 재미있던 등산이었습니다.

제게 도움을 준 '확률적 경사하강법' 에 대해 조금 더 알아보려고 합니다.

< Stochastic Gradient Descent>

  1. Batch gradient descent
    전체 데이터를 다 사용하는 그라디언트 계산은 아래 공식과 같이 진행됩니다.
    θ=θηθJ(θ)θ = θ - η⋅∇_θJ(θ)
for i in range(epochs):
	params_grad = evaluate_gradient(loss_function, data, params)
    params = params - learning_rate * params_grad
  1. Stochastic gradient descent
    여기에 '확률적' 이라는 말이 붙으면서, 일부 데이터만 활용하여 gradient를 계산하는 방식을 확인할 수 있습니다.
    θ=θηθJ(θ;x(i);y(i))θ = θ - η⋅∇_θJ(θ;x^{(i)};y^{(i)})
for i in range(epochs):
	np.random.shuffle(data)
    for example in data:
    params_grad = evaluate_gradient(loss_function, example, params)
    params = params - learning_rate * params_grad
  • 전체 데이터batch가 아니라, 일부 데이터의 모음을 mini-batch로 만들어 사용하는 방법을 의미합니다.
  • 전체 데이터를 다 사용할 경우, 1개의 step 을 위해 전체 데이터 계산이 필요합니다. 그러나 mini-batch에 적용할 경우, 계산 속도가 더 빠르기 때문에 같은 시간에 더 많은 step 을 나아갈 수 있습니다.
  • 게다가 local minimum에 빠지지 않고, global minimum에 수렴할 가능성이 더 높습니다.

참고자료 : https://ruder.io/optimizing-gradient-descent/

0개의 댓글