Eli의 여백

바쁜 나날들 사이에서 생각났던 이런저런 것들을 적어봅니다.

프로그래밍

MATLAB으로 머신러닝 입문(?)

Eli♪ 2019. 12. 13. 06:01

최근에 인공지능이 아주 폭발적으로 크고 있고, 최소한 앞으로도 그게 지속될 것이라는 것은 누구나 아는 사실이다. 현재 나의 연구분야는 아직 인공지능이 깊이 들어와 있지 않다. 이게 오히려 기회가 되지 않을까? 하면서 머신러닝과 딥러닝 쪽을 이전부터 기웃거리고 있긴 한데, 어떻게 써먹어야 할지는 대충 감이 오는데 현재 상황상 일단 눈앞에 놓인 학위 연구 같은 것들 때문에 실천은 못하고 있는 중이다.

딥러닝으로 구현한 프로그램들이 그동안 상상도 못했던 것들을 만들어내는 것이 현실이고, 나도 시대에 뒤쳐지지 않기 위해 흥미롭기도 한 머신러닝을 몇 년 전부터 깔짝대고 있다. 그동안은 정말로 관심은 많이 갔지만 대중 매체에는 맨날 보면 뉴럴넷 그림 같은 거 박아놓고 중간과정은 싸그리 생략하고 놀라 자빠질만한 결과들만 적어놓으니 뭐 어떻게 하는 건지 모르겠고, 논문들을 보면 맨날 뭐 새로운 방법을 개발했다 이러면서 뭔가 그래프를 보여주고 알고리즘이라고 영어로 된 표 같은 게 한두 개 나오고 갑자기 최종 결과물이 딱 나와있고 내가 그쪽 전공자도 아니다 보니 뭔 말인지 알 수가 없어서 구현도 해볼 수가 없었다.

각종 매체에 맨날 보이는 그 그림[1] 과 논문을 보면 나오는 알 수 없는 말들..[2]

그러던 와중에 며칠전부터 인터넷 창에 띄워놨던 MATLAB gradient descent를 검색해서 보던 페이지가 있었고, 코드를 보니까 너무 어이없이 짧았다. 뭐야 이 정도면 나도 하겠는데?라는 생각이 들었다. 그리고 또 다른 블로그를 들어갔는데 이 사람은 코드를 거의 뭐 C처럼 짜 놨다. 충분히 더 MATLAB처럼 짤 수 있을 것 같았다.

기왕이면 최신꺼 써보자 하면서 gradient descent 종류를 검색해보다가 인상 깊은 그림이 들어있는 페이지를 발견했다.

다양한 gradient descent method. 출처: 김범수님 블로그

방법이 정말 많네? 뭐가 제일 좋지?라고 생각해서 또 찾아봤더니 Adam이 제일 좋다는 것 같았다. 그래서 나도 MATLAB으로 Adam이란걸 해보려고 김범수 님 블로그에 있는 식을 참고해서 짜 봤다. loss function은 처음에 띄워놨던 MATLAB file exchange의 함수( x1.^2 + x1.*x2 + 3*x2.^2 )를 썼다. 그런데 자꾸 그냥 stochastic gradient descent (SGD)가 Adam보다 빨리 수렴하는 게 아닌가? 그래서 기울기를 엄청나게 줄여봤다. 그랬더니 이번에는 수렴점에 가기 위해 한도 끝도 없이 돌기 시작했다. 출발점을 원점 근처에 놓으니 드디어 Adam이 수렴하긴 했으나 무려 200번 넘게 iteration을 돌았다.

평평한 지점에서 출발했을 때 Adam이 먼저 수렴한 결과.

이건 아닌거같아서 인터넷을 더 찾다가 Adam 말고최신 트렌드는 Momentum이라는 얘기를 하는 페이지를 찾았다. 그래서 Momentum도 넣어봤다. 그랬더니 경사가 급한 출발점에서는 momentum이 가장 빨랐다.

Momentum이 가장 빨리 수렴한 결과. 시작점=(-4.8,-4.1), leaning rate =0.01
Momentum이 290번만에 수렴함

그럼에도 불구하고 약간 뱅뱅 도는 경향이 있어서 learning rate를 늘려봤다. 그랬더니 더 돌아버렸다. 그리고 GD가 먼저 수렴했다.

leaning rate를 0.1로 늘렸을 때
이번엔 GD가 먼저 수렴했다.

이게 뭐지? 각 method마다 leaning rate가 다른가? 하고 찾아보니까 한 블로그에서 그래 보이는 결과를 찾았다.

learning rate에 따른 수렴시간

Adam은 learning rate가 0.001~0.01 정도에서 가장 좋고 GD는 0.1 정도에서 가장 좋다고 쓰여있다. 위의 내용으로 조합해봤을 때 기존의 뉴럴 넷들에서 Adam이 뛰어났던 이유는 출발점 근처에서 엄청 기울기가 작은 함수라서 그런 게 아닐까 라고 추측했다.

내 분야에서는 뭐 이럴 일은 없기 때문에 Momentum을 쓰는 것으로...

 

구현에 사용했던 MATLAB 코드는 Github 페이지에 업로드하였다. 위의 과정들을 거치면서 코드가 덕지덕지 됐는데 다듬기 귀찮아서 돌기만 하는 상태로 업로드한다.

'프로그래밍' 카테고리의 다른 글

manifest v3 Chrome extension에서 service worker와 indexedDB를 올바르게 사용하기  (0) 2022.02.16
MATLAB으로 웹캠 OCR 하기  (2) 2020.01.03
GitLab 설정  (0) 2018.04.07
BMS구동기 v0.4  (4) 2016.02.13
BMS구동기 v0.3  (1) 2016.01.24