머신러닝 / 딥러닝 소개 및 기본 이론
머신러닝 관련해서는 3년 전 쯤 이전 블로그( https://onikaze.tistory.com )에서 다룬 바 있었습니다.
아마 그 때는 머신러닝에 대해서 그냥 혼자서 독학을 해볼까 정도의 수준에서 연구를 진행했었던 것 같습니다.
그리고 시간이 흘러서 작년(2019년) 10월쯤부터 다시 머신러닝쪽을 공부하고 이를 AWS 및 Google Cloud에서 예제 코드를 가지고 구현도 해봤었고, 회사에서도 이제는 AI 관련 분야로 확장할까라는 생각도 하게 되어 다시 머신러닝 분야를 접하게 되었습니다.
하지만 역시나 머신러닝을 현업에 활용하기 위해서는 체계부터 이론을 확실하게 알아두지 않으면 안된다는 사실도 알게 되었습니다.
그냥 혼자서 공부할 때는 이런 것도 해 보면 어떨까 싶은 생각에 가볍게 공부했지만, 이제는 회사 업무와의 연관성도 고려해서 단순한 공부 수준이 아니라 이제는 산출물까지도 무언가를 만들어야 하는 그런 상황이 된 것이죠.
어떻게 보면 동기부여는 확실한 셈이죠.
3년 전에 머신러닝을 독학할 때에도 대세로 떠오르기 시작했는데 현재는 더더욱 대세가 되었고, 이제는 거기에 국한되지 않고 딥러닝을 중심으로 학습해야 할 필요성을 느끼게 됩니다. 이에 따라 이 블로그에서는 딥러닝과 관련된 자료를 정리해서 올려볼까 합니다.
아직까지는 딥러닝 관련하여 어떠한 산출물을 만든 것도 없고, 전문가도 아닌 것도 사실입니다. 다만 전문가가 되기 위한 준비를 현재 꾸준히 진행 중이며, 제가 학습한 것을 정리하기에는 블로그만한 공간도 없다고 생각합니다. 그래야 제 스스로 하나라도 더 정리할 수 있고 알아갈 수 있기 때문입니다.
만약 나중에 제 블로그에 놀러와서 이 글을 보게 된다면 같이 정리하는 차원에서 봤으면 좋겠습니다.
모든 내용을 다 다루지는 않겠습니다. 저 또한 책과 선임 분들께서 제공하신 자료를 중심으로 보면서 정리할 뿐이고, 저작권 관련 문제도 있기 때문에 모든 내용을 다루긴 어렵겠죠. 그리고 사람들이 필요로 하는 내용이 무엇일까. 어떤 것을 알아야하는가. 핵심 위주로 짚어서 설명하는 것처럼 깔끔한 것도 없겠죠. 그래서 그런 범주로 봐 주시면 될 것 같습니다.
기본적인 자료는 프랑소와 솔레가 저술한 ‘케라스 창시자에게 배우는 딥러닝(길벗)’ 서적의 내용을 토대로 따왔으며, 제가 직접 그린 이미지도 있지만 책의 이미지도 일부 따왔음을 먼저 알려드립니다.
머신러닝 기본 개념
일반적인 프로그램은 아시다시피 아래와 같은 구조입니다.
하지만 머신러닝, 딥러닝과 같은 프로그램은 기존의 구조와는 다른 형태입니다.
원래는 입력 데이터를 가지고 일정 규칙에 따라 프로그램을 실행하여 결과를 도출하는 것이 일반적인 프로그램인 반면, 머신러닝은 입력 데이터와 출력 데이터는 이미 정해져 있고, 그것이 어떤 규칙을 가지는 지를 정하는 형태로 되어 있습니다.
그런데 그 규칙을 어떻게 알아낼 수 있을까요. 간단합니다.
자꾸 학습시키고 훈련을 시켜서 알아내도록 하는 것입니다. 그것이 바로 머신러닝의 기본 패러다임으로 볼 수 있습니다.
여기서 또 한가지. 왜 예전에는 이런걸 안하다가 최근 10년 사이에 하는 것일까요.
그것 또한 간단합니다. 전통적인 프로그램은 입력과 규칙만 가지고 출력만 하면 거기서 끝나는 반면, 머신러닝은 입력과 출력을 가지고 규칙을 찾아내기 때문에 그 규칙을 찾아내는 시간이 오래 걸립니다. 그렇다면 시간을 단축시키기 위해서는 그만큼 성능이 좋아야 되겠죠.
요즘 시대 잘 아시죠. H/W의 기술이 좋아졌습니다. PC의 속도도 빨라졌고요. 규칙을 찾아내기 위한 시간이 줄어들었다는 뜻입니다. 그러다 보니 기술의 발달로 연구가 활발해지기 시작하고, 사람들이 새로운 알고리즘을 개발하면서 S/W의 속도도 더불어 개선되어가고 있습니다. 즉 예전같으면 못 했던 것을 이제는 할 수 있다는 뜻입니다.
머신러닝 자체는 매우 유의미한 기술임은 분명합니다. 기존의 프로그램이 무에서 유를 창출하는 것이라면, 머신러닝은 이미 가지고 있는 유에서 또 다른 유를 창조하는 것입니다. 머신러닝이 떠오르기 전에 떠올랐던 기술이 무엇이였죠. 빅데이터(Big Data)였죠. 이미 많이 있는 데이터를 가지고 어떻게 분석할 것인가. 어떤 유의미한 결과를 만들어낼 것인가. 그리고 그것을 가지고 어떻게 될 것인지를 예측할 것인가. 그 모든 것이 바로 머신러닝 기술이라고 볼 수 있습니다.
그렇다면 학습은 어떻게 할까요.
입력과 출력 데이터는 이미 있습니다. 하지만 처음부터 그것을 막 연결하고 그런다고 정확한 데이터는 안나오겠죠. 하지만 그렇다고 연결을 하지 않을 수는 없습니다. 그럼 어떻게 연결할까요. 일단 입력과 출력의 연관관계가 될 만한 규칙을 임의로 만듭니다.
그래서 임의로 만든 규칙이 맞는 지를 또 다른 데이터를 넣어서 검증합니다. 만약에 맞다면 정확한거고, 틀리다면 규칙을 바꾸겠죠.
자. 아래와 같이 1과 10이 들어갔습니다. 이 둘 사이엔 어떤 관계가 있을까요.
일반적으로는 1+9=10, 즉 x+9의 규칙이 있을 것이라고 생각합니다. 물론 x*10이 될 수도 있겠죠. 하지만 여기서는 x+9라고 가정해 봅니다.
그런데 2하고 12가 들어가니까 안맞죠? 그러면 어떻게 할까요. 규칙을 바꿔야겠죠.
이런 식으로 말이죠.
그리고 3하고 14가 들어가니까 저 식이 맞게 들어갔네요. 그렇다면 유의미한 규칙이라고 볼 수 있곘죠.
물론 머신러닝은 위와 같이 단순하지는 않습니다. 훨씬 복잡하죠. 다만 이러한 유의미한 규칙을 찾아내는 과정을 거치게 됩니다.
머신러닝에서는 이러한 임의의 규칙을 가설(Hypothesis)라고 하고, 가설이 올바른지를 검증하고 틀리면 또 다른 가설을 제시하는 과정을 거칩니다. 그것이 바로 학습입니다.
딥러닝 기본 개념
그렇다면 딥러닝은 무엇일까요. 간단히 보면 머신러닝의 한 영역입니다.
일반적으로 딥러닝이라고 하면 이미지(Image)와 관련된 머신러닝 기술이라고들 합니다. 사실 맞는 말이긴 합니다. 저 또한 그렇게 알고 있었고요.
하지만 딥러닝이 꼭 이미지나 동영상을 위한 것만은 아닙니다. 딥러닝 기술 자체는 층(Layer)을 바탕으로 입력하여 데이터를 도출해 내는 기술을 뜻합니다.
7이라는 이미지가 있습니다. 근데 저게 진짜 숫자 ‘7’이라는걸 어떻게 찾아낼까요. 저것을 찾기 위해서 Layer를 사용해서 일정 방식에 따라 이미지를 다른 형태로 변환합니다. 자꾸 변환하고 그러다 보면 결국 숫자 7이라는 결론을 다다르게 합니다.
하지만 여기서 중요한 것은 바로 ‘일정 방식’입니다. 어떻게 변환하느냐. 그리고 그 값이 정확하냐.
거기서 사용되는 것이 가중치(Weight)입니다. 특정 가중치 값을 가설 값으로 넣어서 변환하고 그렇게 해서 제대로 된 결과를 도출하면 성공이고. 실패하면 가중치 값을 또 바꾸고. 그런 개념이죠.
지금 사진은 그리기 귀찮아서 그냥 사진 찍고 올렸습니다. 저작권 문제로 출처도 아예 사진에 박았고요.
전체적으로 보면 느낌이 좀 올 것입니다. 머신러닝에서 제시한 프로세스하고는 약간 다르다는 사실을 말이죠.
- 머신러닝은 전체적으로 입력과 출력이 들어가서 규칙을 만들어내는 반면
- 딥러닝은 입력이 들어가고 거기에 가중치라는 값이 들어간 규칙을 넣습니다.
- 그렇게 해서 예상 출력(Y’), 즉 예측이라는 것이 나오고 실제 출력(Y)과 비교를 합니다.
- 맞으면 좋고 틀리면 얼만큼 틀렸는가의 차이. 즉 손실 함수(Loss Function)을 사용해서 손실 점수를 구합니다.
- 그런 다음에 가중치 값을 조정합니다.
- 어떻게? Optimizer를 사용해서 조정합니다.
- Optimizer는 역전파(Backpropagation) 알고리즘을 사용하며, 손실 점수를 토대로 가중치 값을 업데이트합니다.
- 그러고 다시 학습 시작.
이것이 바로 딥러닝의 전체 프로세스입니다.
개념 설명은 여기까지로 하겠습니다. 이제 하나씩 파고 들면서 자료를 정리하도록 해 보죠.