Share           Pin It

가을입니다. 메밀꽃이 폈다는 소식을 들은 것이 엊그제 같은데 벌써 억새가 지천이고 한라산도 붉은 옷으로 갈아입고 (사실은 벌써 낙엽이 지기 시작했으니 '옷을 벗고'가 더 적합한 표현일 듯 하지만) 있습니다. 2017년도 이젠 두달이 남았습니다. 년초에는 이번 가을 쯤에 판교로 이주할 수도 있겠다는 생각을 가졌는데 어쩌다 보니 벌써 가을이 끝나갑니다. 결론적으로 올해의 끝까지는 제주에 머무르는 것이 거의 확정입니다. 역으로 말하면 내년 봄에는 제주를 떠날 가능성이 더 커졌다는 의미입니다. 시간이 더 명확해질수록 더 간절해집니다. 제주를 떠나더라도 (실제는 어떻게 될지 모르겠으나) 그렇게 그립지는 않겠지만, 만약 직접 가보지 않은 곳이 나중에 TV나 뉴스에 소개된다면 못 가봤던 것이 아쉽기는 할 것입니다. 포항에서 10여년을 살았는데 (그때도 나름 변명이 있었지만) 근처 경주도 제대로 돌아다니지 못한 것이 제주로 이주한 후에 아쉬웠는데, 또 그런 일이 반복되는 것이 싫습니다. 그래서 남은 몇 달동안 그런 아쉬움을 남기지 않기 위해서 마지막으로 못 가본 곳들을 더 적극적으로 찾아서 돌아볼 생각입니다. 하지만 말은 이렇게 하지만 결국 생활은 이전과 크게 바뀌지 않을 듯...ㅎㅎ

9월과 10월 동안의 오늘의 사진을 모았습니다.

일몰 사진을 찍기 위해서 일찍부터 기다렸지만 막상 일몰 시간이 다 됐을 때 낮은 구름이 쫙 깔려서 실패한 날... (북동쪽 해안도로)

함덕 서우봉에 코스모스 밭이 있다는 걸 너무 늦게 알고 급하게 찾아간 날.

오라 메밀밭... 메밀꽃이 피기 시작할 무렵이라서 덜 하얗지만...

평화로에서 본 일몰

애월 항목유적지 코스모스 밭에 핀 해바라기

서광리에 오픈한 신화테마파크... 애니메이션을 주제로 한 곳.

추석 연휴 전날에 찾아간 보롬왓 메밀밭

1100고지의 한라부추

고향 다녀온 후 아쉽게 일몰은 놓쳤지만, 석양의 고기잡이 배의 불및이 억새에 맺힌 것은 놓치지 않았다.

효리네민박 때문에 오랜만에 찾은 신창해안도로의 바다.

날이 좋아서 오후 반차를 내고 찾아간 용담해안도로의 빛내림

밧돌오름에서 본 안돌오름

억새에 갇힌 태양 vs 태양을 잡은 억새

아직 제주 단풍은 살짝 이르지만 계곡마다 이미 가을이 떨어져 쌓였다.



11월과 12월 그리고 눈 내린 겨울이 기다려진다.

=== Also in...

F: https://www.facebook.com/unexperienced

신고

댓글을 달아 주세요

Share           Pin It

데이터 분석 및 알고리즘 개발을 업으로 하면서 딥러닝 Deep learning은 늘 관심의 대상이었다. 하지만 알고리즘을 실제 구현해보거나 여러 라이브러리를 이용해서 실제 문제에 적용하는 것을 시도하지 않았기에 그런 의미에서 딥러닝에 문외한이라 할 수도 있다. 그럼에도 -- 빅데이터 기술을 어느 순간부터 결국 업에 적용했던 때와 같이 -- 딥러닝 기술도 언젠가는 내가 담당하는 업에 적용해야할 때가 올 것을 알았기에 알고리즘의 기본 지식을 공부하거나 딥러닝 발전의 주요 논문을 빼놓지는 않고 찾아보곤 했다. 딥러닝의 가능성이 일반에 알려지기 시작한 2013년도부터 계속 지켜봐왔기에 딥러닝 전문가는 아니지만 딥러닝의 발전 과정을 어느 정도 꿰뚫고 있다고 생각하기에 어떤 기술들이 현재의 딥러닝을 가능케했는지를 정리해보는 것이 의미가 있을 듯해서 글을 적는다. 일단 MLP 이전의 내용은 생략한다. 그리고 어플리케이션 특화된 기술 -- 예를 들어, Translation의 랭귀지 모델 등 -- 도 생략한다. 

0. 컴퓨팅 파워 (하드웨어)
아래에 여러 알고리즘이나 트릭을 소개하겠지만, 실제 딥러닝을 가능케했던 것은 결국 컴퓨팅 파워의 기하급수적인 증가에 있다고 본다. GPU/TPU로 대변되는 하드웨어의 발전뿐만 아니라, 딥러닝 시대 이전 시대인 빅데이터를 가능케한 그리고/그래서 현재 딥러닝에 무한한 떡밥을 제공하는 클라우드, 즉 값싼 스토리지의 대중화가 결국 딥러닝을 꽃피웠다고 생각한다. 아래에 소개할 다양한 알고리즘이나 대중화된 오픈소스/라이브러리 등의 소프트웨어 이전에 하드웨어 기술을 빼놓고 딥러닝의 성공을 얘기하는 것은 있을 수 없는 일이다.

1. Pre-taining
90년대 말이나 2000년대 초에 나온 오래된 Neural Network 책을 보면 히든 레이어의 수를 늘리면 더 강력해질 거라는 얘기는 계속 해왔다. 하지만 실제 또는 토이 문제를 해결하는 뉴럴넷은 히든레이어가 겨우 1개, 많아봤자 2개를 넘지 않았다. 데이터의 부재와 하드웨어 성능에도 문제가 있었지만 3개 이상의 히든레이어를 가진 네트워크를 제대로 학습시키는 것이 만만치가 않았다. 이론상으로는 완벽해도, 랜덤에서 시작해서 복잡한 네트워크를 최적화시키는 것이 만만치가 않다. 그렇게 뉴럴넷이 잊혀졌지만 프리트레이닝 방식으로 뉴럴넷을 초기화하는 방법이 소개되면서 딥러닝이라는 시대의 조류를 만들어냈다. (데이터와 하드웨어의 발전과 더해서) 대표적으로 정답세트가 필요없는 auto-encoder 방식이 도입되고, RBM이나 DBN을 이론적으로 풀어내면서 뉴럴넷 학습/최적화가 쉬워졌다. 임의의 초기화가 아니라 어느 정도 길들여진 초기화를 통해서 네트워크의 최적화가 엄청 빠르고 쉬워졌다.

2. ReLU (Recified Linear Unit)
전통적인 뉴럴넷은 히든레이어의 액티베이션을 위해서 주로 sigmoid나 tanh 함수를 사용했다. 수학적으로 좋은 성질 (미분 가능)을 갖고 있기 때문이다. 하지만 레이어의 개수가 증가함에 따라서 최종 아웃풋에서 발생한 loss를 앞쪽으로 제대로 전달하지 못하는 gradient vanishing 현상이 발생했다. 네트워크 구조는 엄청 딥하게 만들어놨지만 backprogation에서 가중치의 변동은 최종 1~2개의 레이어에서만 일어나고 앞쪽 레이어는 실질적으로 무용지물이 되는 현상이다. 이를 위해서 마이너스 영역은 0으로, 포지티브 영역은 y=x로 액티베이션하는 ReLU를 적용하면서 이 문제를 해결했다. 최근에는 마이너스 영역으로 무조건 0으로 치환하는 것도 바람직하지 않아서 y = -ax (a << 1.0)하는 것이 낫다는 연구도 있었고, 더 최근에는 y = x * sigmoid(x)로 바꾸면 더 낫다는 논문도 나왔다. (Step 함수의 수학적 불완전성을 보완한 것이 sigmoid 함수이듯이 같은 식으로 ReLU의 미분가능 버전으로 바뀐 것이 x * sigmoid(x)다. continuous & smooth --> 미분가능)

3. Batch Normalization/Re-normalization
뉴럴넷/딥러닝의 성능은 최적화에 좌우된다. 데이터와 알고리즘의 차원이 큰 경우에 최적화는 매우 불안정하다. 그래서 다양한 regularization 방식이 소개됐다. 가장 쉬운 방식으로 가중치의 절대값의 합을 최소화하는 L1이나 제곱의 합을 최소화하는 L2 regularization을 사용한다. 회귀모델에서는 잘 잘동하는데 딥러닝 구조에서는 이 또한 복잡하다. 그래서 초기 딥러닝에서 네트워크를 안정적으로 학습시키기 위해서 drop-out이라는 방식을 이용했다. 즉, 전체 네트워크에서 임의의 일부 노드를 의도적으로 비활성화시켜도 전체 성능이 떨어지지 않게 만드는 방식이다. 그런데 이 방식은 학습속도를 기하급수적으로 늦춘다는 치명적인 단점이 있다. 그러던 중, 히든 레이어의 액티베이션값을 노말라이제이션을 하면 드랑아웃 등의 별도의 레귤라이제이션없이 모델을 안정적으로 학습시킬 수 있다는 실험 결과가 있었고, 현재의 대부분의 네트워크에 이 기법이 기본적으로 적용돼있다. (더 최근에는 작은 규모 또는 non-iid 미니배치에서도 잘 작동하도록 개선한 re-normalization이 소개됨) 딥러닝/뉴럴넷의 기초가 되는 회귀분석 regression에서 모든 독립/종속변수는 Normal 분포를 따른다는 기본 가정이 있는데 (<-- 매우 중요한 속성임), 히든레이어를 노말라이제션하면서 모델을 안정시켜주는 것 같다.
** 사견을 더 하자면 (주제 넘은 얘기지만), 처음 딥러닝을 공부하는 분들은 인터넷에 올라온 동영상 강의 몇 개만 보고 예제 코드 구현/실행해보는 것만으로 마스터할 수 있다고 생각하는 듯한데, 우선 기초적인 것부터 차근차근 공부했으면 합니다. 미적분, 확통, 응선대, 최적화부터 다 공부하라는 것은 아니지만, 적어도 linear regression정도는 마스터하고 딥러닝을 논했으면 합니다. (딥러닝의 첫 강의가 대부분 회귀분석이기는 하지만...) 가끔 커뮤니티에 올라오는 질문을 보고 있자면 이건 딥러닝을 배우겠다는 건지 아니면 그냥 숟가락을 떠서 입에 넣어달라는 건지...

4. LSTM와 ResNet
현재 딥러닝은 데이터의 디멘젼이 무척 큰 (때론 가변적인) 문제에 잘 적용되고 있다. 그런 문제로 자연어/문자열과 이미지 처리가 있다. 처음에는 문자열 데이터에 RNN을 적용하고 이미지 데이터에 CNN을 적용해서 문제를 해결했다. 하지만 문자열이 길어지거나 레이어가 깊어지면서 약점이 발견됐고, 이를 해결하기 위해서 LSTM과 ResNet이 소개됐고 현재는 거의 기본 방식으로 인식된다. (LSTM과 ResNet은 제대로 공부한 것이 아니어서 더 길게 설명하면 틀린 설명만 추가할 듯합니다.ㅠㅠ 알파고 제로 논문에서 ResNet을 사용한 걸 보고 이 글을 적기 시작했는데 역설적이게도 ResNet에 대해서 제일 모름.) 오리지널 인풋이나 이전 과정의 중간결과물을 재활용(?)해서 네트워크를 개선하는 것이 전혀 새로운 아이디어는 아니지만, LSTM과 ResNet은 이 방식으로 딥러닝의 성능 향상 및 여러 애플리케이션에서 성과를 내고 있다.

이상의 알고리즘이나 방법론은 딥러닝을 안정적으로 최적화시키거나 실제 문제에 더 적합한 구조를 만드는 것들에 관한 것인데, 다음은 딥러닝의 대중화에 기여한 것들에 관한 것이다.

5. Word2Vec W2V은 구조가 매우 단순해서 실제 딥러닝과는 거리가 멀지만, (특히) 일반 개발자들 중에서 딥러닝을 처음 접했던 분들이 처음/쉽게 접하면서 딥러닝의 세계로 이끌었다고 해도 관언이 아니다. 몇 년 전에 딥러닝을 한다는 개발자를 만나면 대부분 그저 W2V으로 어떤 문제를 풀고 있는 경우가 많았다. 형태상으로 유사하지만 W2V은 엄밀히 말해서 딥러닝은 아니다. W2V은 잘 알려졌듯이 데이터를 임베딩하는 방식이다. 고차원의 데이터, sparse한 데이터, 또는 비정형 특히 비수치 데이터를 정형의 수치 벡터로 바꿔주는 것을 임베딩이라고 이해하면 된다. 경우에 따라서 효과적인 데이터 차원 축소 방식을 제공하기도 한다. 그리고 이런 임베딩을 통해서 얻어진 수치벡터가 딥러닝의 인풋으로 활용되기 때문에 딥러닝과 무관하다고 말하기도 어렵다. 이후에 Glove 등의 다른 임베딩 방식의 발견에도 기여했다.

6. TensorFlow 2013년에 텐서플로우가 있었다면 제가 직접 다양한 딥러닝 알고리즘을 구현해서 여러 문제에 적용하는 것을 꾸준히 했을 거라는 생각이 든다. 개발에 익숙치 않은 개발자(??)에게 딥러닝의 모든 알고리즘을 직접 구현한다거나 일부 공개된 라이브러리를 제대로 활용하는 것이 쉬운 일이 아니다. 그래서 구현해서 적용해보는 건 포기하고, 그냥 이 동네에 기웃거리면서 어떻게 발전되는지만 지켜보고 있ㄴ...(ㅠㅠ) 텐서플로우 이전에도 Caffe나 Teano, Torch 등의 오픈 딥러닝 라이브러리가 있었지만 이 분야에 익숙한 전문가들을 위한 전유물이었다. 하지만 구글에서 텐서플로우를 오픈하면서 딥러닝이 좀더 일반인(?)에게로 저변이 확대됐다. 결과적으로 인공지능 (딥러닝)이 많은 부분에서 이젠 엔지니어링 분야로 넘어왔다고 봅니다.
(여담) 구글에 텐서플로우를 공개한 것은 하둡이나 하이브 등의 빅데이터 표준에서 밀렸던 과거가 있었기에 가능했다. 실제 맵리듀스나 빅테이블 등의 많은 빅데이터 개념들이 구글에서 나왔지만 그걸 모방한 하둡이 실질적인 표준이 됐다. 씨는 구글이 뿌렸지만 열매는 다른 기업들이 따먹은 것과 같았는데, 같은 실수를 인공지능 분야에서도 반복하지 않기 위해서 텐서플로우를 공개했고, 현재로써는 대중화에 성공했다고 본다.
추가 (2017.10.31) 갑자기 아이디어가 떠올라서 Python + Keras로 텐플을 이용중이다. 케라스 시퀀스 모델에 위에 설명한 개념들을 기계적으로 추가해서 Run하면 그만이다. 속도는 구조와 데이터가 커서 느리지만, 오늘 딥러닝을 처음 접한 사람도 바로 따라할 수 있다. 엔지니어링의 승리다.

7. Reinforcement Learning과 GAN 현재 가장 핫한 분야는 강화학습과 GAN일 거다. 인공지능 기술을 진짜 인공지능이 되도록 만들어주는 기술이라해도 과언이 아니다. 인공지능을 지능이라 부르기 위해서는 알고리즘이 ‘스스로 적응’할 수 있어야할텐데, 강화학습과 GAN이 가능하게 해주고 있다고 본다. 개인 소견으로 딥러닝이 인공지능의 끝은 아니라고 생각하지만, 어쨌든 현재로썬 강화학습과 GAN의 등장으로 딥러닝이 진짜 인공지능답게 만들어지고 있다고 본다.
(여담) 보통 강화학습을 supuervised와 unsupervised와 별개의 새로운 카테고리에 넣어서 설명하는데, 저의 개인적 의견은 강화학습을 supervised 하위에 넣는 게 맞다고 본다. 처음부터 결과를 알고 있는 supervised와는 달리 결과에 따른 리워드 (win/lose, 점수)가 나중에 평가된다는 점이 다소 다르지만 리워드 자체는 일종의 슈퍼바이저라고 보는 게 맞을 듯하다는 생각에서다. (사견이니 무시해도 된다.)

개발자들이 딥러닝을 쉽게 접급하게 해준 것은 Word2Vec, 일반인들이 딥러닝/AI에 관심을 갖게 만든 것은 강화학습을 이용한 AlphaGo (Atari가 먼저지만, 임팩트 면에서), 일반인들이 (그나마) 쉽게 딥러닝을 공부하고 다룰 수 있게 해준 것은 TensorFlow, 우리 실생활의 문제들에 딥러닝이 적용될 수 있게 해준 것은 LSTM (ResNet은 정확도를 높인..), 그리고 딥러닝을 더욱 인공지능처럼 만든 것은 강화학습과 GAN. ... 일런 것을 가능케해준 여러 지속적인 개선들... 뉴턴은 거인의 어깨 위에 섰기 때문에 조금 더 멀리 볼 수 있었다고 말했지만, 거인은 난쟁이들이 쌓아놓은 무수한 모래 성이 있었기에 그 위에 설 수 있었던 것 같다. 최근 10년, 대부분은 최근 3~4년 내에 일어난 사건들... 빠르다. (물론 LSTM과 같이 20년 전에 제안돼서 지금 꽃을 피우는 기술도 있다.)

설명이 부족하거나 일부 틀린 내용이 있을 수도 있습니다. 좀더 면밀히 공부해서 제대로 수정/보강하도록 노력하겠습니다.

이걸 그냥 적당히 슬라이드로 만들어서 전문가인양 모르는 사람들한테 약이나 팔고 다닐까? 하지만 어려운 기술에 대한 연성의 (쉬운이 아닌) 자료는 아무에게도 도움이 되지 않는다는 걸 깨달았습니다. 일부 약장수를 제외하곤...

** 딥러닝이 지금 인공지능을 이끌고 있지만, 인공지능의 미래가 딥러닝에 있다고는 생각지 않습니다.

=== Also in...

F: https://www.facebook.com/unexperienced

신고

댓글을 달아 주세요

꾸준함이 무기다.

Gos&Op 2017.10.12 18:31 |
Share           Pin It

사내 게시판에 적었던 글을 그냥 가져옵니다. 수정도 귀찮아..ㅠㅠ


===

Young man, in mathematics you don't understand things. You just get used to them.
- John von Neumann


야공만에서 폰 노이만이 '수학은 이해하는 것이 아니라 익숙해지는 것이다'라고 말했다는 것을 보고 찾아본 원문입니다. 수학 뿐만이 아니라 여러 방면에서 (매너리즘에는 빠지지 않고) 익숙해지는 것은 우리 삶에 필요한 덕목입니다. 익숙해지기 위해서는 꾸준해야 합니다.


어려운 논문을 읽다 보면 처음에는 잘 읽히지 않지만, 여러 번 반복해서 읽으면 눈에 들어오기 시작합니다. 어떤 면에서는 이해했을 수도 있지만, 그냥 익숙해졌을 수도 있습니다. 복잡한 수식을 증명하거나 유도 과정을 풀이하지 않고 마치 단어를 외우듯이 그냥 그대로 받아들이고 넘어갑니다. 딥러닝을 처음 접할 때 소개되는 다양한 수식들이 처음에는 와닿지 않습니다. 동영상 강의를 듣거나 풀이집을 여러 번 반복해도 볼/읽을 때만 '아하'하다가도 시간이 좀 지나면 수식의 전개 과정을 여전히 이해하지 못합니다. 하지만 비슷한 논문을 반복해서 계속 읽다보면 비슷한 패턴이 보이고 복잡하게 도출된 수식 그 자체를 그냥 하나의 지식 체계로 받아들이면 이후에 다른 논문을 읽을 때 편하게 느껴집니다.


수학만의 이야기는 아닙니다. 개발언어에서 새로운 프레임워크가 나왔을 때 처음에는 적용하기 어렵지만 예제를 반복하고 때론 패턴을 그대로 적용하다 보면 어느 순간 그게 어떻게 작동하는지는 몰라도 제대로 작동한다는 것을 알기에 그냥 적용합니다. 말콤 그래드웰이 말한 '1만시간의 법칙'이라는 것이 있습니다. 물론 후속 연구들에서 천부적인 재능이 매우 중요하다는 것을 반복해서 얘기하고 있지만, 천재가 아니더라도 웬만한 작업은 계속 반복하다 보면 익숙해집니다. 아무리 길치더라도 새로운 길에서 헤매지 매일 다니는 똑같은 길에서 헷갈리지 않습니다. (물론, 살짝만 바꿔도 다시 길을 잃을 가능성은...) 앞서 말했지만 익숙해진다는 것은 반복의 결과이고, 반복은 다시 말해서 꾸준함을 뜻합니다. 삶의 여러 방면에서 꾸준함은 참 중요한 덕목입니다.


요즘 늘 후회합니다. 딥러닝이 처음 알려지기 시작할 때부터 꾸준히 공부했더라면 지금쯤 나도 AI 전문가라는 타이틀을 달고 있지는 않았을까? 학생 때부터, 아니 입사 후부터 꾸준히 개발언어와 프레임워크에 조금씩이라도 더 친숙하고 개발에 꾸준히 참여했더라면 지금 느끼는 부족함을 덜 느끼지 않았을까? (... 그랬다면 여기서 지금 이런 글을 적고 있지 않을....) 배에 쌓이는 인덕을 보면서 꾸준히 운동을 했더라면...


발전/진보의 과정에는 소위 말하는 퀀텀점프 또는 혁명적인 발전도 있지만 일상의 꾸준한 개선도 있습니다. 파괴적 혁신이라는 말에 속아서 일상의 개선보다는 특별한 혁신의 과정에 더 관심을 갖겠지만, 많은 혁신들이 일상의 개선 위에서 생겨납니다. 물론 혁신에서의 단절은 개선으로 설명하기 어렵지만... 지금 각광받고 있는 많은 기술들이 초기에는 왜면을 받았지만 그걸 믿고 꾸준히 연구하고 개선했던 사람들이 있었기에 가능했고, 그런 사람들이 지금은 대가라는 칭호를 받습니다. 딥러닝에서 힌튼같은...


꾸준함의 적은 게으름입니다. 그리고 제대로 되겠어라는 (소멸적) 의심입니다.

===

귀찮아서 수정없이 그냥 복붙했는데, 부연설명이 필요할 듯... 하지만 귀찮으니...


=== Also in...

F: https://www.facebook.com/unexperienced

신고

댓글을 달아 주세요