자세히 보기

Martin Heller
Contributing Writer

좀더 깊이 있게 살펴보는 딥러닝의 ‘의미’와 ‘활용법’

인공지능(AI)과 머신러닝, 특히 딥러닝은 아마 2016년 가장 성공적이었던 기술 주제라 표현할 수 있을 것이다. 딥러닝의 '의미'와 이를 직접 활용하는 '방법'에 대해 알아본다.

관심 있게 지켜봤던 이라면 아마 감지했을 것이다. 2016년 가을, 개별 단어의 뜻을 모호하게 연결시킨 번역 결과물만 내놓던 구글 번역(Google Translate)이 갑자기 세련되면서도 조리 있는 문장으로 구성된 번역 결과물을 제시하기 시작했다. 모든 언어에 해당되는 이야기는 아니지만, 최소한 영어-불어, 영어-중국어, 영어-일본어 등에서의 번역이 크게 개선됐다.

이렇게 품질이 개선된 것은 9개월에 걸친 협력 때문이었다. 구글 브레인(Google Brain)과 구글 번역 측은 구글 텐서플로우(TensorFlow) 프레임워크를 활용해 이 같은 성과물을 달성했다. 단어 임베딩과 딥러닝으로 교육한 신경망을 적용했던 것이다.

마법 같은 일이 일어난 것일까? 전혀 그렇지 않다. 쉬운 일이 아니었다. 개선 프로젝트에 참여한 연구원들은 네트워크를 교육하기 위해 방대한 번역 자료를 활용해야 했다. 그들은 또 교육을 위해서는 수 천 개의 GPU가 필요하고, 교육 시킨 신경망에서 대규모로 번역을 실행시키려면 TPU(Tensor Processing Unit)이라는 새로운 ‘칩’을 만들어야 한다는 사실을 깨닫기도 했다. 시스템이 사람 번역가처럼 능력을 발휘하도록 훈련시키는 과정에서, 수 백 차례 네트워크를 쇄신하는 업무를 진행하기도 했다.

그렇다면 구글 정도의 ‘규모’를 갖추고 있어야 딥러닝을 활용할 수 있을까? 그렇지 않다. 클라우드 덕분이다. 다수의 CPU 코어와 RAM으로 중무장한 클라우드 VM과 콘테이너 인스턴스를 실행시킬 수 있는 것은 물론, 수많은 GPU도 클라우드에서 활용할 수 있다. 딥러닝 소프트웨어 포함하고 있는 선탑재 이미지도 마찬가지다.

기존의 프로그래밍
딥러닝의 작동 원리를 알려면, 기존 프로그램과 방식이 크게 다른 머신러닝과 신경망(신경 네트워크)를 이해해야 한다. 기존 프로그래밍의 경우, 컴퓨터가 실행시킬 특정 명령을 쓴다. C 프로그래밍 언어의 ‘Hello, World’ 프로그램을 예로 들어보자.

/* Hello World program */
#include <stdio.h>
main()
{
printf(“Hello, World”);
}

컴파일링하면, 이 프로그램은 단 한 가지 일을 한다. 표준 아웃풋 포트에 ‘Hello, World’라는 스트링을 출력한다. 실행될 때마다 매번 프로그래머가 명령한 이 일만 한다.

다음으로는 동일한 인풋으로 다양한 아웃풋을 만드는 프로그래밍 방법이 궁금할지 모르겠다. 이를테면 게임 캐릭터가 용에 도끼를 휘두르는 동작이 이에 해당된다. 이를 위해서는 난수 생성기, 생성기가 생성한 수를 기준으로 여러 동작을 수행하는 프로그램이 필요하다.

BOOL Swing_ax_at_dragon()
{
BOOL retval = rand()>SOME_THRESHOLD;
if (retval)
printf(“Your ax hits. Dragon dies.”);
else
printf(“Your ax misses. Dragon spits flames.”);
return retval;
}

다시 말해, 기존 프로그래밍의 경우 동일한 동작이 아닌 통계적으로 다양한 동작을 원한다면 ‘변수’를 프로그래밍 해야 한다. 머신러닝은 바로 이 개념을 바꿔 놓았다.

머신러닝
머신러닝(ML)에서 핵심적인 업무는, 동일한 인풋들로부터 미래의 아웃풋을 도출하는 프레딕터(Predictor)를 만드는 것이다. 이 업무는 역사적 데이터를 가지고 프레딕터를 통계적으로 교육시킴으로써 이뤄진다.

예상 값이 ‘실수(Real Number)’라면, “화요일 오후 MSFT 주식 가격은 얼마일까?” 같은 회기(regression) 문제에 해당한다. 과거의 MSFT 주식 거래 역사값, 관련 주식, 뉴스, 주가와 상관관계가 있는 각종 경제 데이터를 교육에 이용하게 된다.

‘예’나 ‘아니오’ 대답을 예상하는 경우라면, “화요일 오후 MSFT 주가는 현재 대비 상승 또는 하락할까?”라는 2진법 질문에 해당된다. 회귀 문제처럼 수 많은 데이터를 적용할 수 있지만, 프레딕터 최적화에 쓰는 것과는 다른 알고리즘이 사용된다.

2가지 이상을 예측해야 하는 경우도 있다. “MSFT 주식에 대해 할 수 있는 최고의 선택은 무엇일까? 팔까? 살까? 보유할까?”와 같은 질문이다. 앞에서와 마찬가지로 수 많은 데이터를 적용할 수 있지만, 알고리즘이 다르다.

일반적으로 ML에서 가장 먼저 준비해야 하는 것은 역사적 데이터다(저자의 애저 ML 튜토리얼 참고). 그리고 데이터를 무작위로 2 그룹으로 분리한다. 각각 ‘교육’과 ‘테스팅’이라는 그룹이다. 교육 데이터 처리에는 알려진 목표 값을 이용한다. 그렇지만 테스팅 데이터 처리에는 다른 데이터로 목표 값을 예상한 후, 예상치와 목표치를 비교해 오류율을 계산한다.

마이크로소프트의 머신러닝 알고리즘 치트 시트(Machine Learning Algorithm Cheat Sheet)는 알고리즘 선택에 도움을 주는 자료다. 특히 애저 ML이나 기타 범용 ML 라이브러리, 서비스를 이용하고 있다면 유용하다. 앞서 언급한 주식 시장 데이터에서 회귀 문제에는 디시전 포레스트(Decision Forest, 정확성과 빠른 교육이 장점)가, 2가지 분류에는 로지스틱 리그레션(Logistic Regression, 빠른 교육과 선형 모델)이, 여러 가지 분류에는 디시전 정글(Decision Jungle, 정확성과 작은 메모리 크기)이 각각 적합할 수 있다.

그렇지만 최고의 알고리즘을 찾을 수 있는 유일한 방법은 모두 시험해보는 것이다. 참고로 Spark.ML 등 몇몇 ML 패키지와 서비스는 알고리즘을 비교, 최고를 선택하는데 유용한 가이드를 제시하고 있다.

한편 신경망(neural networks)은 위에서 설명한 예측 질문 3종 모두에 이용될 수 있는 옵션이다. 신경망은 또 정확성이 높고, 교육 시간이 길다는 특징을 지닌다. 이 외에 신경망만의 특성은 무엇이 있는지 이어서 살펴본다.

신경망
신경망 개념의 ‘뿌리’는 1940년대까지 거슬러 올라간다. 서로 연결된 한계 스위치(threshold switches)로 인공 신경 네트워크를 구축하면 동물의 두뇌와 신경 시스템(망막 포함)과 유사한 방식으로 패턴을 학습할 수 있다는 개념이다.

학습이 일어나는 원리는 기본적으로 두 개의 신경(neurons)이 동시에 활성화되는 될 때 이들 사이의 연합이 강화되는 것이다. 현대적인 신경망 소프트웨어의 경우, BP(back propagation of error, backprop)라는 규칙을 이용해 연합의 가중치를 높인다.

그렇다면 어떤 방법으로 신경을 모델화할까? 각각의 신경은 연결된 신경의 아웃풋을 가중치를 곁들여 변환시키는 ‘전파 함수’(Propagation Function)를 갖고 있다. 전파 함수의 아웃풋이 활성 함수(Activation function)로 전달되고, 인풋이 기준치를 초과할 때 폭발(Fire)을 한다.

1940년대와 50년대 인공 신경에는 단계 활성화 함수(Step Activation Function)가 이용됐다. 이를 퍼셉트론(Perceptrons)이라고 부른다. 현대적인 신경망은 퍼셉트론을 참조하기는 하지만, 실제로는 로지스틱이나 시그모이드 함수, 하이퍼볼릭 탄젠트, ReLU(Rectified Linear Unit) 등과 같은 스무스 활성 함수(Smooth Activation Function)를 갖고 있다. 통상적으로 빠른 융합을 위한 최선의 선택은 ReLU이지만, 이는 학습율이 너무 높게 설정되면, 교육하는 동안 신경이 ‘죽는’ 문제가 발생하는 문제를 가지고 있다.

활성 함수의 아웃풋은 추가적인 구체화(additional shaping)를 위해 아웃풋 함수로 전달될 수 있다. 그러나 아웃풋 함수가 ID(Identity) 함수인 경우가 종종 있다. 이는 활성 함수의 아웃풋이 다운스트림 연결된 신경으로 전달된다는 의미다.

신경에 대해 알았으니, 범용적인 신경망 토폴로지를 배울 차례다. 피드포워드(Fee-forward) 네트워크에서 신경은 여러 분리된 계층으로 분화된다. 인풋 계층 1개, 숨겨진 처리 계층 N개, 아웃풋 계층 1개이다. 각 계층의 아웃풋은 그 다음 계층으로만 이동한다.

연결이 짧은 피드포워드 네트워크의 경우, 일부 연결은 1개 이상의 계층을 넘어 이동할 수도 있다. 순환 신경망(Recurrent Neural Network)의 경우, 신경은 다음 계층을 통해 간접적으로, 또는 직접적으로 스스로에 영향을 주게 된다.

감독 아래 진행되는 신경망 학습(Supervised learning of a neural network )은 다른 머신러닝과 동일하게 수행된다. 네트워크에 교육 데이터 그룹을 제시하고, 네트워크 아웃풋과 원하는 아웃풋을 비교하며, 오류 벡터를 생성하고, 오류 벡터로 네트워크를 수정하는 식이다. 교정을 적용하기에 앞서 함께 실행되는 교육 데이터 집단들은 에포크(Epochs)라고 불린다.

좀더 상세한 정보를 원하는 사람을 위해 설명하자면, BP(Back Propagation)는 모델의 바이어스 및 가중치 대비 오류(또는 비용) 함수 기울기(Gradient)를 이용해 올바른 방향을 발견해 오류를 최소화 한다. 2가지가 수정에 적용된다. 최적화 알고리즘과 학습율 변수이다. 통상 융합을 보증하고, ReLU 신경이 죽는 문제를 피할 수 있을 정도로 작아야 한다.

신경망 최적화 작업은 흔히 BP를 유도하기 위해 특정 형태의 기울기 하강(gradient descent) 알고리즘을 이용한다. 선택한 미니배치(Stochastic Gradient Descent)에 무작위로 최적화되고, 기울기에 모멘텀 수정을 적용하는 등의 국소 최저치(local minima)를 방지하는데 도움을 주는 메카니즘도 도출한다. 일부 최적화 알고리즘은 기울기 히스토리(AdaGrad, RMSProp, Adam)를 조사하는 방식으로 모델 파라미터 학습율에 적용하기도 한다.

모든 머신러닝의 경우 별개의 테스트 데이터 세트에 신경망 예측치를 비교 확인해야 한다. 이렇게 하지 않을 경우, 종합적인 예측치가 될 학습 대신 인풋만 기억하는 신경망이 만들어질 위험성이 존재하기 때문이다.

딥러닝
이제 머신러닝과 신경망에 대해 알아봤다. 그러나 지금까지 살펴본 것은 딥러닝 알고리즘 특성의 일부에 불과하다.

많이 사용되는 딥러닝 알고리즘은 DNN(Deep Neural Networks)이다. 서로 교차하는 선형, 비선형 처리 단위들로 구성된 수 많은 계층에 기반을 두고 있으며, 대형 알고리즘과 수 많은 교육 데이터로 교육을 시키는 신경망이다. 딥 신경망에는 숨겨진 계층이 10-20개까지도 존재할 수 있지만, 통상의 신경망에는 2-3개만 존재한다.

네트워크 계층이 많을수록, 인식할 수 있는 특징이 증가한다. 불행히도 네트워크의 계층이 더 많을 수록 계산에 더 많은 시간이 필요하고, 교육도 어려워진다.

RDF(Random Decision Forests)라는 딥러닝 알고리즘도 있다. 앞에서와 마찬가지로 수 많은 계층으로 구성되어 있다. 그러나 RDF는 신경 대신 의사결정 나무(디시전 트리)와 개별 트리 예측치의 통계 평균 아웃풋으로 구성되어 있다. RDF는 무작위성을 갖고 있다. 개별 트리에 부트스트랩 애그리게이션(Bagging)을 이용하고, 무작위로 기능들을 가져온다.

딥러닝이 동작하는 원리를 이해하기란 쉬운 일이 아니다. 이를 이해하는 사람이 전혀 없다고 주장하는 것은 아니다. 예를 들어, 이를 주제로 한 논문들이 있다. 하지만 그 원리와 최상의 구성 방법에 대한 합의가 아직 형성돼 있지 않다는 점은 분명히 말할 수 있다.

딥 신경망을 이용해 새로운 구글 번역을 탄생시킨 구글 브레인 연구원들도 알고리즘의 작동 원리를 몰랐었다. 몇 주 동안 반복해 테스트를 해서 네트워크를 개선시켰다. 때때로 막다른 길에 도달하거나, 후퇴를 해야 하는 경우도 있었다. 뉴욕 타임즈는 “어느 날 갑자기, 모델 하나가 아무 이유 없이 문장의 모든 숫자를 가져와 버리기 시작하기도 했다”라고 전한다. .

딥러닝의 접근법은 아주 많다. 그러나 아직까지 완벽한 방법은 단 하나도 없다. 활용처에 따라 더 나은 전략, 더 나쁜 전략이 있을 뿐이다.

딥러닝 전략과 전술, 활용처
딥러닝 애플리케이션의 사례 중 하나로 이미지 인식을 살펴보자. 생명체는 시각 피질로 이미지를 처리한다. 이에 이미지를 인식하는 신경망 모델로 시각 피질의 구조를 적용한 연구원들이 많다. 1950년대부터 생물학적 연구가 시작됐다.

시각 신경망 분야의 돌파구적 연구는 얀 르천(Yann LeChun)이 1998년 발표한 ‘LeNet-5’이다. 32×32 픽셀 이미지로 디지털화된 손으로 쓴 숫자를 인식하는 7 계층(Level)의 CNN(convolutional neural network)이었다. 이후 신경망이 더 우수한 화질의 이미지를 분석하기 위해서는 더 많은 신경과 더 많은 계층이 필요했다.

그로부터 CNN 및 다른 딥 신경망을 개발할 수 있는 패키지가 출현해 확산되기 시작했다. Caffe, Microsoft Cognitive Toolkit, MXNet, Neon, TensorFlow, Theano, Torch가 여기에 해당된다.

CNN은 통상 컨벌루셔널(convolutional), 풀링, RelU, 완전히 연결된 로스 계층(Loss Layers)을 이용해 시각 피질을 시뮬레이션 한다. 컨벌루셔널 계층은 일반적으로 작은 지역들이 수많이 겹쳐져 구성되어 있다. 풀링 계층은 비선형다운 샘플링을 실행한다. 앞서 설명한 ReLU 계층은 비포화 활성 함수인 ‘f(x) = max(0,x)’를 적용한다. 완전히 연결된 계층에서 신경은 앞서 계층의 모든 활동에 완전히 연결된다. 로스 계층은 네트워크 교육이 어떻게 예측된 라벨과 실제 라벨의 차이를 발생시키는지 계산한다. 분류에는 소프트맥스(Softmax)나 크로스-엔트로피(Cross-Entropy) 로스를, 회귀에는 유클리디안(Euclidean) 로스를 이용한다.

CNN은 이미지 인식 외에도 자연어 처리, 의약품 발견, 바둑 게임 등에도 적용되고 있다.

자연어 처리(NLP ; Natural Language Processing)는 딥러닝이 적용되는 또 다른 중요 분야다. 여기에는 기계 번역뿐 아니라, 자동 요약, 상호 참조 해결, 담론 분석, 형태 분류, 개체명 인식, 자연어 생성, 자연어 이해, 스피치 일부 태깅, 감성 분석, 스피치 인식 등이 해당된다.

CNN 외에도 LSTM(Long Short Term Memory) 모델이 포함된 RNN(Recurrent Neural Networks)로 NLP를 처리하는 경우가 많다. 앞서 언급했지만 순환 신경망 (Recurrent Neural Network)의 경우, 신경은 다음 계층을 통해 간접적으로, 또는 직접적으로 스스로에 영향을 준다.

다시 말해 RNN에 루프가 존재할 수 있다. 이는 시퀀스를 처리할 때 일부 정보 히스토리를 지속시킬 수 있는 기능을 준다. 언어에는 시퀀스가 있어야 한다. LSTM은 특히 장점이 많은 RNN이다. 더 강력한 업데이트, 더 정교한 반복 모듈 구조를 갖고 있기 때문이다.

딥러닝 실행
당연한 말이지만 딥 CNN과 LSTM의 교육에는 아주 높은 컴퓨팅 성능이 요구된다. 구글 브레인 팀은 구글 번역의 새 AI를 교육하기 위해 수천 개의 GPU를 필요로 했다. 참고로 교육 작업에서 GPU 1개에서 3시간은 CPU에서의 30 시간 분량에 해당한다. GPU 종류도 중요하다. 대부분의 딥러닝 패키지에서는 모델을 실행시키기에 충분한 메모리가 장착된 1개 이상의 CUDA 호환 엔비디아 GPU가 필요하다.

이러한 사실은 사용자가 클라우드를 선택하게 하는 요인일 수 있다. 이 글을 쓰는 시점에서는 AWS, 애저, 블루믹스 모두 GPU 인스턴스를 제공하고 있다. 구글 또한 2017년부터 이를 지원할 예정이다.

현재 가장 규모가 큰 클라우드 GPU 인스턴스 가격은 시간 당 14달러이다. 더 저렴한 솔루션들도 다수 존재한다. 1개 GPU로 구성된 AWS 인스턴스 가격은 시간 당 1달러 미만이다. 마이크로소프트의 애저 배치 십야드(Azure Batch Shipyard)와 회사의 딥러닝 레시피는 시간당 90센트에 소형 NC6 인스턴스를 활용해 연산 풀에서 트레이닝을 진행할 수 있게 해준다.

물론 고가의 GPU를 보유하지 않고도 학습 목적의 딥러닝 패키지를 사용자 컴퓨터 설치할 수 있다. 그러나 대규모로 모델을 교육시켜야 하는 때가 오면, 아마 보유 하드웨어가 제약이 되는 상황을 원하지 않게 될 것이다.

좀더 깊은 딥러닝 정보를 원한다면
여러 딥러닝 패키지 중 하나를 그저 설치함으로써 딥러닝에 대해 좀더 자세히 알 수 있다. 여러 샘플을 시도해보고 튜토리얼을 읽는 것만으로도 도움이 된다. 좀더 깊이 있는 정보를 원한다면 다음의 자료들을 참고해보라:

– Neural Networks and Deep Learning, by Michael Nielsen
– A Brief Introduction to Neural Networks, by David Kriesel
– Deep Learning, by Yoshua Bengio, Ian Goodfellow, and Aaron Courville
– A Course in Machine Learning, by Hal Daumé III
– The TensorFlow Playground, by Daniel Smilkov and Shan Carter
– Stanford CS class CS231n: Convolutional Neural Networks for Visual Recognition

* Martin Heller는 인포월드 기고 에디터이자 리뷰어로, 웹 및 윈도우 프로그래밍 컨설턴트 경력을 가지고 있다. 또 데이터베이스, 소프트웨어, 웹사이트 개발자로 근무한 바 있다. 최근에는 알파 소프트웨어 기술 및 교육 부사장과 Tubifi CEO 및 회장직을 역임했다.dl-ciokorea@foundryco.com

Martin Heller

Martin Heller is a contributing writer at InfoWorld. Formerly a web and Windows programming consultant, he developed databases, software, and websites from his office in Andover, Massachusetts, from 1986 to 2010. From 2010 to August of 2012, Martin was vice president of technology and education at Alpha Software. From March 2013 to January 2014, he was chairman of Tubifi, maker of a cloud-based video editor, having previously served as CEO.

Martin is the author or co-author of nearly a dozen PC software packages and half a dozen Web applications. He is also the author of several books on Windows programming. As a consultant, Martin has worked with companies of all sizes to design, develop, improve, and/or debug Windows, web, and database applications, and has performed strategic business consulting for high-tech corporations ranging from tiny to Fortune 100 and from local to multinational.

Martin’s specialties include programming languages C++, Python, C#, JavaScript, and SQL, and databases PostgreSQL, MySQL, Microsoft SQL Server, Oracle Database, Google Cloud Spanner, CockroachDB, MongoDB, Cassandra, and Couchbase. He writes about software development, data management, analytics, AI, and machine learning, contributing technology analyses, explainers, how-to articles, and hands-on reviews of software development tools, data platforms, AI models, machine learning libraries, and much more.

이 저자의 추가 콘텐츠