오랜만에 오유들어왔는데, 아이디를 잃어버렸네요ㅠㅠ. 그냥 저도 관심이 많고 많은 사람들이 관심이 많을 딥 러닝 이야기를 해볼려고 합니다. 모든 걸 설명할 수는 없고, 지도 학습, 인공 신경망 정도는 읽어보시고 오시면 좋을꺼 같네요.
1. 딥 러닝이 왜 인기인가?
단순하게 다른 알고리즘보다 인식 성능이 좋습니다.(더 정확하게 특정한 도메인에서 다른 알고리즘들을 따돌렸기 때문입니다. 예를 들어 비전, 음성 인식 분야, 번역). 대신 속도가 느리거나 데이터가 많이 필요로 합니다. 몇몇 제약 사항들 때문에 항상 만능은 아닙니다. 그리고 너무 어려운 문제에서도 당연히 잘 안 됩니다.
2. 딥 러닝이란 무엇인가?
단순히 딥 러닝이라고 하면 이미 아는 사람들끼리 통하는 말인거고, 더 정확하게는 깊은 구조를 가진 인공 신경망 기술이라고 하는게 더 정확합니다. 딥 러닝이라고 특별한 기술이 들어가지 않습니다. 일종의 트릭이라고 불린 만 한게 추가됐을 뿐이지. 대부분의 이론적 기반은 인공 신경망을 벗어나지 않습니다. 이론적 토대는 이미 몇 십년전에 완성되어 있다고 보는게 많습니다.
3-1. 인공 신경망은 이미 있었는데, 왜 이제야 딥 러닝을 하는 이유는?(이유)
기존의 인공 신경망 기술은 크게 2가지 문제점을 가집니다.
1> vanishing gradient 문제
2> over-fitting 문제
각각 설명 드리면
1> 지금에 와서야 층을 많이 쌓으면 성능이 좋아진다고 알고 있는 거지. 기존의 인공 신경망 기술에서는 3층 이상을 쌓는 행위 자체가 오히려 알고리즘의 성능을 떨어뜨렸습니다. 그 원인으로 vanishing gradient 문제입니다. 이건 뭐냐하면 인공 신경망을 학습할 때 back-propagation을 사용합니다.(별로 복잡한 방법은 아닙니다. 찾아보시면 금방 이해되실 껍니다.) 그런데 이게 한두 층일 때는 작동을 아주 잘하지만 층이 많아 지면 에러를 입력층로 전파할 때, error에 의한 gradient 자체가 소실되는 현상이 일어납니다. 그러니 층이 많아져도 정작 학습하는 층이 몇 층이 안 되게 됩니다.
2>
인공 신경망의 고질적인 문제인데, 보통 학습 알고리즘을 테스트할 때, 학습용 데이터와 검증용 데이터를 분리시킵니다. 이렇게 분리시키는 이유는 학습용 데이터만 너무 학습이 잘 되고, 일반화된 규칙을 못 찾을 수 있기 때문입니다. 그렇게 되면 검증용 데이터에 대한 성능치는 낮게 나올 껍니다. 그런데 인공 신경망은 보통 학습 데이터에만 fitting이 잘 되는 문제인 overfitting이 자주 일어납니다.
3-2. 인공 신경망은 이미 있었는데, 왜 이제야 딥 러닝을 하는 이유는?(해결)
1> 2006년에 한 가지 기묘한 해결법이 나옵니다. 원래 인공 신경망은 초기 가중치를 가집니다. 이 가중치가 중요하다는 건 알려져 왔지만, 데이터에 기반한 초기 가중치 설정을 한 뒤 back-propagation을 하는 시도를 했고 엄청나게 좋은 성능치가 나오게 됩니다. 얇은 구조가 아닌 깊은 구조에서 말이죠. 이 시도는 그 유명한 hinton 교수에 의해 이루어집니다.
이 시도의 의의를 지금의 시점에서 이야기해드리면 저 방식은 이제 사용하지 않습니다. 대단히 귀찮거든요. 대신 저 시도를 통해 우리는 한 가지를 알아낼 수 있습니다. 깊은 구조를 가진 인공 신경망 기술도 충분히 학습이 가능하고, 오히려 기존의 알고리즘보다 성능이 더 높을 수 있다. 딥 러닝이 탄생하는 순간이네요! 요즘은 CNN(convolutional neural network), relu, Dropout 같은 간편한 방법으로 저 vanishing 문제를 해결합니다. 이런 간편한 방법을 적용하면서 여러 competition에서 좋은 성능을 내던 때가 2012년 쯤 일껍니다.
2>
vanishing 문제가 해결되었다고 해서 overfitting이 해결된거는 아니죠. 하지만 이 문제는 알고리즘적으로 해결되지는 않았지만, 대신 환경적으로 어느 정도 해결이 되었습니다. over-fitting 문제를 설명드릴 때 학습 데이터와 검증용 데이터를 설명드렸습니다. 이 때 학습용 데이터의 크기가 정말 엄청나게 크다면 어떻게 될까요? 원래 overfitting을 특정 분포의 데이터에 편중되게 학습이 되기 때문에 문제가 되는 겁니다. 하지만 학습 데이터 자체가 이미 커버린다면 편중되게 학습된다는 것 자체의 의미가 사라집니다. 그런데 지금이야 인공지능이다 4차 산업이다 뭐다 하지만 이 전의 한 가지 트렌드가 있었습니다. 빅 데이터이죠. 이미 몇 십년 전과 다르게 데이터를 처리하는 프레임워크의 발전과 접근성이 엄청나게 늘어났습니다. 지금이 딥러닝에서 사용할 데이터에 접근하기 매우 좋은 시기가 된 것이죠.
4. 딥러닝 한번 공부해보고 싶은데 어떻게?
1. 기본 지식을 익힌다.(인공 신경망, 기계 학습 기초 이론) PPT자료들을 구글같은데서라도 찾아보시면 좋을거 같습니다.
2. 쓸데없을 수도 있지만, 패턴 인식 책에서 인공 신경망 챕터의 연습 문제 정도는 풀어 볼 것을 추천 드립니다.(어차피 이 이후로 이런 건 안합니다.) 그리고 선형 회귀에서 최소 자승법 정도를 이해할 것을 추천드립니다. 머신 러닝의 기본은 수치 최적화라고 생각합니다.
3. 한가지 라이브러리를 선택합니다.(저는 python + tensorflow 조합을 추천드립니다.)
4. 코딩의 hello world처럼 하는게 MNIST 데이터셋 예제입니다. 이 데이터 셋에 대해서
1> single-layer
2> multi-layer
3> convolutional neural network
순으로 구현해 보는걸 추천드립니다.(텐서플로우 예제 :https://tensorflow.blog/2016/04/28/first-contact-with-tensorflow/)
5. 그 다음 공부는?
여기 단계부터는 전부 세분화되어 들어갑니다. 머신 러닝의 분야는 생각보다 많습니다. 그 방법에 맞는 접근법이 존재합니다. 예를 들어 CNN의 경우는 이미지에 특화된 방식입니다. 시계열 데이터라면 rnn(recurrent neural network)을 사용할 겁니다. 알파고 같은 알고리즘을 풀기 위해서 강화학습을 위한 알고리즘나 mcts같은 아예 다른 기법도 알아야 됩니다. 먼저 분야를 정하고 어떻게 돌아가는지 탐색부터 하시면서 하면 좋을꺼 같습니다. 구글 신은 알고 계십니다. 문제는 옳은 질문이죠
# 추신
저의 설명이 부정확할 수도 부족할 수도 있습니다. 댓글 달아주시면 감사하겠습니다.