'최적화'에 해당되는 글 2건

  1. 2014.12.19 초보자가 딥러닝 접근하기
  2. 2013.11.13 빈곤의 최적화, aka 꼼수
Share           Pin It
요즘 IT 쪽에서 가장 뜨거운 이슈 중에 하나는 분명 딥러닝 Deep Learning 일 듯하다. 마치 몇 년 전에 빅데이터 Big Data 기술들이 처음 소개되고 성공 스토리들이 언론에 회자되던 때를 회상하게 만든다. 그러나 일반인들에게 딥러닝이 빅데이터만큼 쉽게 받아들려지고 확대될 수는 없을 것같다. 그 이유는 분명하다. 어렵기 때문이다. 물론 다양한 오픈소스가 만들어지고 최적화된 방법론이 소개되겠지만, 그걸로는 충분치가 않다. 소수의 선택된 자들 외에는 딥러닝은 그저 그림의 떡이다. 어렵기 때문이다. 빅데이터는 단편적인 기본 지식만 있어도 (실제 적용까지는 힘들더라도) 현상을 이해하기에 충분하지만, 딥러닝은 언론이나 컨퍼런스에 소개되는 내용만으로 이해하기란 거의 불가능하다.

최근에 몇 편의 논문이나 동영상 강의 자료를 탐독하면서 딥러닝이 어렵다는 것을 재확인했고, 그 어려움의 실체에 대해서 감을 조금 잡았다. 그래서 이 글을 적는다. 제목에 초보자라고 적었지만, 생판 초보자를 의미하지는 않는다. 아래에 제시된 분야 중에서 일부 분야에 조금 익숙한 또는 일부 분야에 덜 익숙한 사람을 초보자라고 부르겠다. 그렇지 않은 사람들은 이 글을 스킵할 것을 조언한다.

만약 딥러닝을 공부하고 개발하고 실무에 적용해야 하는 상황에 닥쳤다면 가장 현실적인 조언은 "피할 수 있으면 피하라. 만약 피할 수 없으면 포기하라"다. 때로는 딥러닝이 기존의 여러 AI 알고리즘보다 더 나은 성능을 보여주기도 하고 또는 사람들의 labor-intensive한 노력없이 괜찮을 성능을 보여주기 때문에 지금 딥러닝에 열광하는 것이다. 혹시 다른 대안 (딥러닝보다는 성능이 조금 떨어지거나 충분한 인력이 투입되어 노하우가 녹아있는 알고리즘이나 시스템)이 존재한다면, 굳이 딥러닝을 시도할 필요가 없다. 물론 더 큰 조직이나 더 똑똑한 무리들이 딥러닝으로 치고 나가면 미래에 격차가 더 벌어질 가능성도 충분하지만, 지금 조직에서 단지 몇 명이 딥러닝을 공부해서 적용한다고 해서 그들을 따라잡을 가능성은 크지가 않다. 너무 절망적인가? 그렇다면 나의 의도가 충분히 충족됐다고 본다.

언론에서 얘기하는 것 때문에 딥러닝에 관심을 가져서 구글로 Deep learning으로 검색해서 임의로 논문 한편을 골라서 읽어본다면 분명 처음에는 쉽게 이해하기 어려울 것이다. 초보자를 위해서 처음부터 끝까지 쉽고 상세하게 적은 그런 리뷰 논문이 아니라, 최근 어떤 분야에서 딥러닝으로 괄목할만한 성과를 이뤄냈다는 식의 10장 짜리 논문을 한 번에 이해하는 사람은 거의 없을 것같다. 최근 몇 편의 논문을 읽으면서 생각하기로 크게 두가지 이유 때문인 것같다. 첫번째는 뉴럴 네트워크 (보통 Neural Network, 즉 NN으로 표기하지만, 정식 명칭은 인공신경망 즉 Aritificial NN (ANN)이다)에 대한 이해가 부족하기 때문이고, 두번째는 딥러닝이 적용된 애플리케이션 분야에 대한 지식 부족 때문이다. 굳이 하나 더 추가하자면 대부분의 논문이나 강의가 영어로 돼있다는 점도 크게 작용한다.

일반인들이 ANN에 대한 기초 지식없이 단순히 딥러닝이 ANN을 확장했다고만 언급하고 그것을 모델링하고 최적화하기 위해서 사용된 방법을 간략히 소개만 하고 넘어가면 당연히 그 논문을 제대로 이해할 길이 없다. 그런데 ANN을 제대로 이해하기 위해서는 인체 내에서 벌어지는 뇌의 활동을 먼저 이해해야 하고, 그걸 실행가능한 형태의 (그래피컬) 모델을 그려낼 수 있어야 하고, 정보 전달 메커니즘인 로지스틱 회귀분석 (선형 회귀분석과 액티베이션)에 대한 이해가 필요하고, 가장 중요하게도 각종 파라메터를 최적화하는 방식을 이해해야지 딥러닝의 가장 기초인 MLP (Multi-Layer Perceptron)을 겨우 이해할 수 있다.

뇌과학자가 아닌 이상 뇌에서 의사결정을 위해서 뉴런들이 시그널을 전파하고 합쳐지고 리즈닝하는 것을 정확히 이해할 수 없다. 더욱이 뇌에 대해서 밝혀진 것은 여전히 극소수에 불과하다. 그런 후에 뉴런들 간의 인터렉션을 MLP든 아니면 다른 형태의 Network로 적절히 모델링해야 한다. 머신 러닝에서 가장 간단한 알고리즘이지만 선형회귀나 로직스틱회귀도 전공자가 아니면 외계어다. 본인도 최근에서야 ANN에서 사용되는 W 행열과 B(bias) 벡터, 그리고 sigmoid 액티베이션 함수가 선형회귀/로지스틱회귀 모델임을 자각했다. 그런데 ANN은 많은 수의 회귀모델의 앙상블 Ensemble이고, 딥러닝은 그런 ANN 및 다른 네트워크 아키텍쳐의 앙상블이다. 여기까지는 그래도 조금의 뇌지식이나 확률 지식만 가져도 개념적으로 쉽게 이해가 된다. 그러나 마지막으로 W와 B 등의 파라메터를 최적화하는 Back-propagation을 이해하려면 미적분에서부터 시작해서 네트워크 토폴로지에 따른 다양한 object 및 loss function을 정의하고,그에 따른 Gradient 기반의 최적화 방법을 이해해야 한다. 개념적으로는 쉽지만 수식이 좀 복잡해져서 포기하게될 가능성이 높다. 이정도의 최소한의 지식이 있으면 이제 가장 간단한 형태의 MLP ANN을 이해했다고 볼 수 있다. (구현 이슈도 있지만)

그리고 다른 글에서도 적었지만 딥러닝이 단순히 MLP에서 히든 레이어의 개수를 늘리거나 히든 노드의 개수를 늘리는 것이 아니다. 개념적으로는 그렇지만 더 다양한 형태의 아키텍쳐와 모델들이 합쳐져야 제대로된 딥러닝이 만들어진다. 예를들어, 주어진 데이터나 문제에 따라서 RBM이나 Belief network에 대한 이해가 필요하고, auto-encoder나 sparse coding 등도 이해할 필요가 있고, CNN (Convolution)이나 RNN (Recursive), Multi-moidal/tasking 등의 다양한 형태의 네트워크나 조합에 대한 이해가 필요하다.

ANN에 대해서 충분한 지식이 있는 이들도 딥러닝을 쉽게 이해하기 어려운 다른 이유는 딥러닝이 적용된 분야의 특수성 때문으로 생각한다. 현재까지 딥러닝이 가장 효과를 보여주는 분야는 일반적으로 AI에서 패턴인식 Pattern Recognition으로 알져진 분야다. 패턴인식은 단순히 매트릭스 형태의 수치데이터를 가공하는 데이터마이닝과는 차원이 다르다. 딥러닝의 초기에는 음성인식에서 두각을 나타냈고, 그 후에 자연어처리 NLP, 그리고 이미지처리 등에서 효과를 보여주고 있다. 그런데 이런 음성, NLP, 그리고 이미지/동영상 분야는 나름의 도메인 지식이 필요하고, 딥러닝 이전부터 활발히 연구됐던 다양한 알고리즘들이 존재한다. 그런데 딥러닝을 다룬 한편의 논문에서는 이런 응용분야의 백그라운드 지식에 대한 장황한 설명없이 단지 어떤 문제(예를들어, POS 태깅)에 딥러닝을 적용해서 기존에 가장 우수한 성능을 보여줬던 어떤 알고리즘보다 더 나은 성능을 보여줬다라고 결론을 내린다. 도메인 지식이 없는 사람에게 딥러닝 논문은 참 난관이다.

이런 저런 모든 배경 지식을 습득했다고 하더라도 문제는 이걸 구현하는 것도 이슈다. 물론 요즘은 다양한 오픈소스가 존재하기 때문에 그걸 이용할 수도 있다. 그러나 자신의 문제에 맞게 그런 오픈소스를 최적화하는 방법도 만만치가 않다. 많은 배경지식에 더해서 각 분야에 대한 많은 경험과 노가다가 있어야지 딥러닝을 제대로 활용할 수가 있다. 노가다에 대한 충분한 준비가 된 자라면 딥러닝에 도전하기 바란다.

길게 엄살을 적어놨지만, 앞으로 딥러닝에 더 관심을 가지고 다양한 분야에서 좋은 성과를 내기 위해서 딥러닝에 대한 더 깊은 이해가 필요하고, 그리기 위해서 필요한 기초 지식 트리를 설명하기 위해서 글을 적는다. 계속 공부하고 테스트해보면서 더 깊은 내용은 다음 기회에...

이전 글에서도 짧게 적었지만, 아무리 딥러닝이 어렵더라도 마치 많은 양의 데이터로 기계를 학습시키듯이 다양한 딥러닝 관련 글과 논문을 꾸준히 읽고 고민하다 보면 마치 ANN의 노드들 사이에 연결이 생기고 파라메터가 최적화되듯이 딥러닝에 대한 이해도 조금씩 누적되어 마스터하는 날이 올 수도 있다. 당장 어렵더라도 포기하지 말고 꾸준히 스스로를 학습시키기 바란다.

여담으로 딥러닝에 GPU가 좋은 컴퓨터가 필요하다고 하는데, 이는 네트워크의 파라메터를 최적화하기 위해서 크고 많은 수의 매트릭스/벡터 연산이 필요하기 때문이다. 즉, 이미지 시각화를 위해서 매트릭스 연산에 최적화된 GPU가 CPU보다는 딥러닝의 연산에 더 적합하다는 얘기다. 최근 비트코인을 채굴하기 위해서도 GPU가 많이 필요하다는 얘기를 들었는데, 비트코인 채굴을 위한 계산도 많은 수의 매트릭스 연산 때문인 듯하다.
 
P.S., NIPS 2014에 다녀온 후배의 후기를 봐도 현재 딥러닝이 얼마나 핫한 이슈인지를 알 수가 있습니다. (링크. 2014 NIPS 후기)

==
페이스북 페이지: https://www.facebook.com/unexperienced


댓글을 달아 주세요

Share           Pin It

아침에 급하게 페이스북에 적은 글에 설명/내용을 추가합니다.

너무나 긴 시간동안 사람들은 빈곤에 적응해왔다. 어쩌면 인간의 역사란 빈곤의 역사였다. 최근에 그런 빈곤 상태가 일시에 (일부에게는 또는 특정 분야에서는) 해갈되었지만, 여전히 많은 부분에서 빈곤 상태에 있다. 앨빈 토플러는 그의 책 '부의 미래'에서 현대 사회의 변혁의 동인으로 3A, 즉 자동화 Automation 아시아 Asia 그리고 풍요/과잉 Abundance를 들었지만, 여전히 사람들은 빈곤에 더 익숙하다. 그래서 빈공의 경계를 넘은 분야에서는 풍요에 제대로 적응을 못하는 경우도 발생하고 있다. 빈곤에 적응했다는 것은 주어진 환경에서 최적화되어있거나 그런 솔루션을 자연스레 찾으려 한다는 것이다.

간혹 TV를 보면 '입금되면 바로 갑니다'라는 연예인들의 우스게 소리나 '받은만큼만 일한다'라는 직장인들의 애환도 결국 빈곤에의 최적화 결과의 좋은 예다. 오랜 시간동안 학습된 결과로 인간은 새로운 환경을 개척 Exploration 하는 것보다는 주어진 환경에서 최적화, 효율화 Exploitation 하는 것에 자연스레 반응한다.

회사에서의 많은 것들도 이런 빈곤 최적화의 규칙을 따르는 것같다. 서버 공간이 부족하면 새로운 서버를 확충하는 것보다, 그 공간 내에서 최적화시키고 조금이라도 불필요하거나 오래된 데이터는 미련없이 버리게 된다. 그렇게 하는 것이 low-cost 리더십이라고 장려하기까지 한다. 프로그램/알고리즘을 구현하면서 속도가 느리다 싶으면 데이터 사이즈를 줄이거나 복잡하지만 더 나은 알고리즘보다는 열등하지만 빠르게 결과를 내는 것을 취하게 된다. 업무 환경에서도 직원들은 지원의 빈곤에 적응해서 그 틀 안에서 최선의 결과를 내려고 아등바등한다. 새로운 세상이 있다는 것을 전혀 인식하지도 못한 채로... 어떠한 경우든 최적화는 여전히 유효하다. 서버의 용량과 속도가 개선되었다고 해서 최적화 코드가 불필요한 것이 아니다. 그러나 최적화가 최우선일 수도 없다.

아침에 프로젝트 내용을 공유하는 시간이 있었다. 현재 처한 가장 큰 문제로 서버 및 스토리지가 부족하다는 실무자의 의견이 나왔다. 그것을 해결해줄 수 있는 사람은 바로 그 문제에 대한 즉답을 하지 않은채로, 서버 말고 다른 문제는 없었어요?라고 둘러 묻는다. 일단 서버/스토리지부터 확보한 다음에 다른 문제에 접근하는 것이 맞을 듯했는데도...

좋은 것을 얻고 싶으면 좋은 환경을 마련해주는 것이 우선이다. 물론 좋은 환경이 항상 좋은 결과를 보장하지는 않는다. 그러나 가능한 환경의 제약은 제거한 후에 죽이 되든 밥이 되든 일을 시작해야 한다. 좋은 것을 가져본 경험이 없기에, 또 그 환경에서 노동자/프로그래머들은 야근을 하고 머리를 쥐어짠다. 좋은 환경에서 좋은 결과가 당장 나오지 않았다면, 그 환경에 적응해서 더 나은 상상력을 발휘할 시간적 여유를 줘야 한다.

맞는 얘긴지는 모르겠지만, 구글에 엔지니어가 입사하면 처음부터 테스트 서버 수백/수천대를 사용할 수 있는 권한을 준다고 한다. 그런 환경에서 만들어졌던 것이 대용량 분산 처리 시스템이었고, 최근에는 딥러닝 Deep Learning이라는 AI에서는 거의 버려졌다고 생각했던 ANN이 되살아났다. 아마존의 추천시스템이 제대로 작동할 수 있었던 이유도 그런 환경적인 뒷받침이 있었기 때문이라 생각한다. 서버 10대, 20대를 추가하는 것에도 벌벌 떠는 환경에서 새로운 혁신적인 기술을 꿈꾸는 것은 어불성설이다. 풍요의 시대로 접어들었다고 말하지만, 우리의 인식은 전혀 풍요에 적응할 준비가 되어있지 않다. 그저 빈곤에 익숙해져서 그 속에서 최적화라는 꼼수에 능해지고 있다.

아침에 페이스북에 글을 적을 때는 굉장히 영감이 있었는데, 하루를 보내고 나니 그때의 감정이 많이 희석되어 버렸다. 그래도 사실이 바뀐 것은 아니다.

---

글을 공개한 이후에 생각난 것이 있어서 추가합니다. 제가 처음 디카를 구입한 것은 2000년도였고, 당시로는 꽤 큰 화소인 300만 화소인 소니 505V였습니다. 당시에는 메모리 가격이 비싸서 처음에 64메가 메모리스틱을 구입했습니다. (나중에 2003년도에 128메가를 추가로 구입) 카메라의 성능은 300만화소였지만, 풀사이즈로 찍으면 100장정도 밖에 못 찍기 때문에 대부분의 사진은 그것보다 작은 사이즈로 찍었습니다. 같은 이유로 같은 장소/사물을 여러 번 찍을 수 없었기 때문에 한번 찍은 사진을 어떻게든 살려볼려고 포토샵을 공부했던 기억이 있습니다. 그런데 지금 사용하는 캐논 5DMk3에는 이런십육기가 CF메모리와 같은 사이즈의 SD메모리가 꽂혀있습니다. 그래서 총 32기가를 사용중입니다. 시중에는 그냥 32기가나 64기가 메모리도 큰 비용없이 쉽게 구입할 수 있습니다. (10여년 사이에 용량이 1000가 커졌습니다.) 요즘에는 (RAW파일로는 사진을 찍지 않지만) 그냥 가장  2300만 풀사이즈로만 사진을 찍고, 또 같은 장소/사물을 여러 장 찍습니다. 한번에 수십, 수백장의 사진을 찍고 그 중에서 가장 잘 나오면 몇 장의 사진만 간단한 리터칭 (contrast 조절 및 프레임 조정)해서 웹에 올립니다. 카메라/메모리의 관점에서 본 빈곤의 시대와 풍요의 시대의 대비입니다. 요즘에도 2000년대 초반처럼 사진을 찍고 리터칭하고 있다면 어땠을까?라는 생각이 문득 납니다.

페이스북 페이지: https://www.facebook.com/unexperienced

댓글을 달아 주세요