자바를 활용한 딥러닝 - 맛보기

Page 1

자바 개발자를 위한 실용적인 딥러닝 신경망 구축 가이드 D e e p

딥러닝 입문부터 DL4J를 이용한 신경망 구현과 스파크·하둡 연동까지

L e a r n i n g

행하는 실용적인 방법과 전략을 알려준다. 이론과 실습 모두 깊이 있게 다뤄 딥러닝 관련 전문 지식이 없는 입문자도 이 책을 읽고 나면 딥러닝 신경망을 구축할 수 있다.

•머신러닝·딥러닝 개념에 대한 전반적인 소개 •신경망 기본 원리를 토대로 발전한 심층 신경망 이해 •합성곱 신경망, 순환 신경망 등 주요 심층 신경망 구조 •문제에 적합한 특정 심층 신경망 매핑 방법 •일반적인 신경망 및 특정 심층 신경망 구조 튜닝 •DL4J의 워크플로 도구인 DataVec을 활용한 데이터 유형별 벡터화 기법

Deep Learning

설명한다. 특히 DL4J 라이브러리로 스파크 및 하둡에서 심층 신경망 구조를 학습하고 딥러닝 워크플로를 실

자바를 활용한 딥러닝

이 책의 전반부에서는 이론을, 후반부에서는 튜닝, 병렬화, 벡터화, 파이프라인 구축 등 딥러닝 실무의 핵심을

•스파크 및 하둡에서 DL4J 사용 방법

“개발자가 실무에서 딥러닝을 시작하는 데 알아야 할 모든 것이 담겨 있다.” 그랜트 잉거솔, 루시드웍스 CTO

Deep Learning 자바를 활용한 딥러닝

김홍진, 박다희, 배철민 옮김

자바 8 인 액션

핸즈온 머신러닝

밑바닥부터 시작하는 딥러닝

조시 패터슨, 애덤 깁슨 지음

관련 도서

딥러닝 / 자바

93000

9 791162 241066

ISBN 979-11-6224-106-6

정가 38,000원

조시 패터슨, 애덤 깁슨 지음 김홍진, 박다희, 배철민 옮김


| 표지 설명 |

표지 그림은 온열대성 바다에서 서식하는 심해어인 산갈치(학명 : Regalecus

glesne )다. 길고 가느다란 몸을 지니고 있으며 길이가 11미터까지 자라는 세계 에서 가장 큰 경골어다. 산갈치는 단독 생활을 하며 주로 중심해수층(200 ~1,000m 깊이)에서 많은 시 간을 보내고 아프거나 다쳤을 때만 수면으로 이동한다. 동물성 플랑크톤뿐만 아니라 작은 물고기, 해파리, 오징어를 주로 잡아먹는 육식 동물이다. 산갈치는 맛이 없어서 어부들이 잡지 않는다. 사람들은 대개 해변에서 죽었거나 죽어가는 산갈치를 발견하게 된다. 크기와 모양 때문에 바다뱀 전설의 기원으로 여겨지기도 한다. 산갈치의 전체 개체 수는 알려지지 않았지만 아직까지 환경에 영향을 받는다는 보고는 없다. 표지 이미지는 『브로크하우스 백과사전』에서 가져왔다.

자바를 활용한 딥러닝 딥러닝 입문부터 DL4J를 이용한 신경망 구현과 스파크·하둡 연동까지 초판 1쇄 발행 2018년 9월 1일 지은이 조시 패터슨, 애덤 깁슨 / 옮긴이 김홍진, 박다희, 배철민 / 펴낸이 김태헌 펴낸곳 한빛미디어 (주) / 주소 서울시 서대문구 연희로2길 62 한빛미디어(주) IT출판사업부 전화 02 – 325 – 5544 / 팩스 02 – 336 – 7124 등록 1999년 6월 24일 제 25100 – 2017–  000058호 / ISBN 979  – 11 –  6224 –  106 – 6

93000

총괄 전태호 / 책임편집 김창수 / 기획 최현우 / 교정·조판 김철수 디자인 표지 신종식 내지 김연정 영업 김형진, 김진불, 조유미 / 마케팅 송경석 / 제작 박성우, 김정우 이 책에 대한 의견이나 오탈자 및 잘못된 내용에 대한 수정 정보는 한빛미디어(주)의 홈페이지나 아래 이메일로 알려주십시오. 잘못된 책은 구입하신 서점에서 교환해드립니다. 책값은 뒤표지에 표시되어 있습니다. 한빛미디어 홈페이지 www.hanbit.co.kr / 이메일 ask@hanbit.co.kr © 2018 Hanbit Media Inc.

Authorized Korean translation of the English edition of Deep Learning, ISBN 9781491914250 © 2017 Josh Patterson and Adam Gibson

This translation is published and sold by permission of O’Reilly Media, Inc., which owns or controls all rights to publish and sell the same. 이 책의 저작권은 오라일리와 한빛미디어 (주)에 있습니다. 저작권법에 의해 보호를 받는 저작물이므로 무단전재와 복제를 금합니다.

지금 하지 않으면 할 수 없는 일이 있습니다. 책으로 펴내고 싶은 아이디어나 원고를 메일 ( writer@hanbit.co.kr ) 로 보내주세요. 한빛미디어(주)는 여러분의 소중한 경험과 지식을 기다리고 있습니다.


Deep Learning 자바를 활용한 딥러닝


지은이 소개

지은이

조시 패터슨 Josh Patterson

현재 스카이마인드의 기술 분야 책임자다. 그전에는 빅데이터/머신러닝/딥러닝 분야 컨설팅을 했다. 클라우데라의 수석 솔루션 아키텍트로 근무했고 테네시강 유역 개발공사에서 머신러닝/ 분산 시스템 엔지니어로 일하며 openPDC 프로젝트의 지능형 전력망 시스템(스마트 그리드 smart grid

)에 하둡을 도입했다. 테네시 대학교에서 tinyOS 기반 그물형 네트워크와 사회성곤충

최적화 알고리즘 연구로 컴퓨터 공학 석사학위를 취득했다. 소프트웨어 개발 분야에서 17년 이상 근무했으며 DL4J, 아파치 머하웃, 메트로놈 Metronome, IterativeReduce, openPDC, 제 이모티프 JMotif 와 같은 오픈소스 공간에 매우 적극적으로 참여한다.

지은이

애덤 깁슨 Adam Gibson

샌프란시스코에서 활동하는 딥러닝 전문가로 포춘 500대 기업, 헤지 펀드, 광고회사 및 스타 트업 지원 회사와 함께 머신러닝 프로젝트를 수행하고 있다. 회사가 실시간 빅데이터를 처리하 고 분석할 수 있게 해주는 분야에서 매우 뛰어난 실적을 냈다. 13살 때부터 컴퓨터를 사랑했으 며 http://deeplearning4j.orj를 통해 오픈소스 커뮤니티에 적극적으로 참여한다.

4


옮긴이 소개

옮긴이

김홍진

audiosignal@gmail.com

한양대학교에서 컴퓨터 공학을 전공하고 어쩌다 보니 데이터 마이닝까지 전공하며 이 세계에 발을 들였다. 추천 시스템, BI 시스템 등 데이터를 활용한 시스템 개발에 참여하면서 데이터 활 용 기술을 이해하고 효율적으로 사용하는 것이 중요하다고 생각하게 되었다. 현재는 SK플래닛 에서 데이터 과학자로 근무하며 데이터를 통합하고 데이터 사용 환경을 구축하는 업무를 진행 하고 있다.

옮긴이

박다희

dalee.ni.2013@gmail.com

어느 분야에서나 쓸모 있지 않을까 하는 생각에 데이터 마이닝을 전공하고 SK플래닛에서 데이 터 과학자로 근무하였다. 기술뿐만 아니라 비즈니스와 통계에 대한 깊은 이해도 필수적이라는 생각으로 균형 있는 발전을 위해 고민과 노력을 하고 있다.

옮긴이

배철민

phone.cheolmin@gmail.com

컴퓨터 공학을 전공하고 SK플래닛에서 개발자로 근무하며 경력의 대부분을 자바스크립트와 함께 했다. React, AngularJS 등 프레임워크를 활용해서 프론트엔드 개발, 하이브리드 앱 개 발 프로젝트를 담당했으며 Node.js를 활용한 백엔드 개발까지 겸했다. 현재는 라인플러스에 서 데이터플랫폼 UI를 개발하며 데이터 시각화에 대해 심도 있게 공부하며 실무에 적용 중이 다. 저서로는 『웹으로 시작하는 모바일게임』(지앤선, 2017 )이 있다.

5


옮긴이의 말

2016년 3월 9일 알파고와 이세돌의 대국을 기점으로 많은 회사가 앞다투어 인공지능을 사용 한 여러 상용 플랫폼 개발에 뛰어들었다. 이에 발맞춰 인공지능 전공자뿐 아니라 IT업계 종사 자, 수학자, 통계학자에게도 관심이 쏠리는 것은 당연하다. 알파고가 인공지능 열풍을 몰고 온 것이다. 그런 열풍은 인공지능 서적 출판에서도 예외는 아니다. 참으로 많은 인공지능 관련 서적이 출 간되었다. 이 책도 그중 하나다. 하지만 다른 책과는 명확히 구분되는 특징이 있다. 파이썬이 아닌 자바 기반의 DL4J 라이브러리를 사용해 딥러닝으로 인공지능을 개발하는 방법을 알려준 다는 점이다. 그래서 자바 개발자들이 새로운 언어에 대한 부담 없이 딥러닝에 입문하기 적합 하다. 기존에 인공지능을 쭉 공부해오고 있지만 파이썬보다 자바에 더 익숙한 분에게 더 적합 하다. 딥러닝을 배우려면 1차 방정식부터 선형대수, 통계학까지 다시 배우거나 새롭게 알아야 할 것 들이 많다. 이때 개발 언어에 익숙하다면 딥러닝 자체와 로직에 집중하는 데 더 도움이 될 것이 다. 언어를 학습할 시간에 딥러닝을 사용한 멋진 아이디어를 생각해보는 건 어떨까? 마지막으로 공동 역자에게 감사하다는 말을 전한다. 번역이 마무리될 때까지 잘 이끌어주신 최 현우 차장님께도 감사의 말씀을 전한다. 끝으로 옆에서 응원을 아끼지 않은 세상에서 가장 사 랑하는 사람에게 감사의 인사를 전한다. _배철민

6


이 책에 대하여

이 책에는 어떤 내용이 들어 있나? 이 책의 처음 네 장에서는 실무자들이 책의 나머지 부분을 이해하는 데 바탕이 되는 충분한 이 론과 기초 내용에 집중한다. 나머지 다섯 장에서는 이러한 개념을 바탕으로 딥러닝에서 DL4J를 사용하여 다음 몇 가지 실용적인 방안을 소개한다. 심층 신경망 구축

고급 튜닝 기법

다양한 데이터 타입에 따른 벡터화

스파크에서 딥러닝 실행하기

NOTE_ DL4J : Deeplearning4j 요약어

이 책에서는 DL4J와 Deeplearning4j를 같은 의미로 사용한다. 두 용어 모두 Deeplearning4j 라이브러리 가 제공하는 도구 모음을 의미한다.

필자는 상용 수준의 딥러닝 작업을 구축할 만큼 실용적이면서도 충분히 이론을 다루는 책이 필 요하다고 생각했으며 이러한 복합적 접근 방식이 이 분야에 매우 적합하다고 느꼈다.

1장에서는 모든 독자가 책의 나머지 부분을 이해하는 데 필요한 기본 지식을 빠르게 익힐 수 있도록 딥러닝에서 필수적이며 기본적인 머신러닝 개념을 알아본다. 많은 독자가 이런 개념을 다시 일깨우고 입문하는 데 도움이 될 것이다.

2장에서는 1장의 개념을 바탕으로 신경망의 기초를 제시한다. 주로 신경망 이론을 설명하지만 신경망에 쉽게 접근할 수 있는 방법에 초점을 맞출 것이다. 3장에서는 어떻게 신경망의 기본 원리에서 심층 신경망으로 진화했는지 최대한 빠르게 설명하면서 앞의 1장과 2장의 내용을 더 자세히 알아본다. 4장에서는 심층 신경망의 네 가지 핵심 구조를 소개하고, 책의 나머지 부분 의 기초를 제공한다.

7


5장에서는 책의 전반부의 기술들을 이용한 몇 가지 자바 코드 예제를 살펴본다. 6장과 7장에 서는 일반적인 신경망의 성능 개선과 각 구조별 심층 신경망의 성능을 개선하는 방법을 설명한 다. 이 장은 플랫폼에 구애받지 않고 어떤 이용자도 실제로 적용할 수 있는 내용을 담고 있다.

8장에서는 벡터화 기술과 DataVec1을 이용하는 방법을 알아본다. 9장에서는 스파크와 하둡 기반에서 DL4J를 사용하는 방법을 설명하고 여러분의 스파크 클러스터에서 실행할 수 있는 세 가지 실제 예제를 보여준다. 이 책의 주제와 관련은 있지만 본문에서 다루지 않은 아래와 같은 내용을 부록으로 담았다. 인공지능

D L4J 프로젝트에서 메이븐 사용하기

G PU (Graphics Processing Unit )를 이용한 작업

N D4J API 사용하기

기타

누가 ‘실무자’인가? 오늘날 데이터 과학이라는 용어는 명확한 정의가 없고 종종 다양한 방식으로 사용된다. 최근 데이터 과학과 인공지능의 세계는 컴퓨터 과학 분야의 어떤 용어보다 광범위하고 흐릿하다. 이 는 머신러닝이 거의 모든 분야에 얽혀 있기 때문이다. 이 광범위한 연관성은 90년대 월드 와이드 웹이 HTML을 모든 분야로 끌어들이고 많은 새로 운 사람을 그 기술 분야로 데려올 때와 역사적으로 유사하다. 같은 방식으로 엔지니어, 통계학 자, 분석가, 예술가 등 모든 직종의 사람이 매일 머신러닝에 발을 들이고 있다. 이 책의 목표는 딥러닝(그리고 머신러닝)을 대중화하여 가능한 한 많은 사람에게 전파하는 것이다. 이 책의 제목에 흥미를 느껴서 서문을 읽었다면 ‘당신은 실무자고, 이 책은 당신을 위한 것이다.’

1 옮긴이_ DL4J의 ETL과 벡터화 작업 도구. ETL은 추출(Extract ), 변환(Transform ), 적재(Load )의 약어로 데이터를 다루는 기술이다.

8


누가 이 책을 꼭 읽어야 할까? 간단한 예제로 시작해 그 주변을 확장해나가는 방법 대신 딥러닝으로의 완벽한 여정을 위해 일 련의 본질적인 사항들로 이 책을 시작한다. 너무 많은 책이 실무자가 자주 빠르게 확인하는 핵심 주제를 생략하고 있다. 머신러닝 실전 경 험을 바탕으로 초급 실무자들이 딥러닝 프로젝트에서 자주 연마해야 할 기술로 이 책을 시작하 기로 결정했다.

1장과 2장을 건너뛰고 바로 딥러닝의 기초부터 시작하길 원할 수도 있다. 하지만 첫 장부터 내 용을 제대로 이해한다면 딥러닝에 대한 보다 심층적인 내용도 쉽게 익힐 수 있을 것이다. 직무 별로 이 책을 읽는 방법은 다음과 같다. 기업의 머신러닝 실무자 이들은 다음 두 집단이다. 현업 데이터 과학자

이 그룹은 전형적으로 이미 모델을 구축하고 데이터 과학 분야에 능통하다. 만약 여러분이 현업 데이터 과학자라면 아마 1장은 건너뛰고 2장은 가볍게 보기 원할 것이다. 심층 신경 망의 기본으로 들어갈 준비가 되어 있을 것이므로 3장으로 바로 넘어갈 것을 제안한다. 자바 개발자

자바 개발자는 일반적으로 상용 시스템에 머신러닝 코드를 통합하는 업무를 수행한다. 여 러분이 여기에 속한다면 1장부터 자세히 읽어 데이터 과학 용어를 차근차근 배워나가자.

ND4J의 API를 직접적으로 접할 수 있는 모델 스코어링을 위한 통합 코드인 부록 E 또한 흥미로울 것이다. 학계 종사자 만약 여러분이 학계 종사자라면 이미 대학원에서 다룬 주제인 1장과 2장을 건너뛰고 싶을 것

9


이다. 딥러닝 구현에 범용적이고 연구에 기반이 되는 내용을 담고 있는 일반적인 신경망 성능 개선과 각 딥러닝 구조별 성능 개선에 대한 장이 흥미로울 것이다. 또한 JVM (자바 가상 머신) 에서 고성능 선형대수를 구현하기 원한다면 ND4J의 적용 범위를 알아보면 도움이 될 것이다.

코드 예제 책에서 소개하는 자바 코드 예제에서는 종종 import 문을 생략했다. import 문을 생략하지 않 는 예제는 코드 저장소에서 확인할 수 있다. 다음 사이트에서 DL4J, ND4J, DataVec의 API 정보를 제공한다. https://deeplearning4j.org/api/latest/

모든 코드 예제와 보조 자료(가상 머신, 데이터, 스크립트, 명령줄 도구 등)는 다음 사이트에 서 다운로드할 수 있다. https://github.com/deeplearning4j/oreilly-book-dl4j-examples

역자의 깃허브 저장소에서도 코드 예제를 확인할 수 있다. https://github.com/Practitioner-Approach-DeepLearning/oreilly-book-dl4jkorean-examples-master

DL4J에 대한 자세한 내용은 다음 사이트를 확인하기 바란다. http://deeplearning4j.org

한빛미디어 홈페이지에서도 코드 예제를 내려받을 수 있다. http://www.hanbit.co.kr/src/10106

10


감사의 글

조시 이 책의 아이디어를 구체화하고 리뷰하는 데 나보다 훌륭한 분들의 도움을 많이 받았다. 아무 것도 없는 상태에서 DL4J 프로젝트를 같이 진행해준 스카이마인드 그룹의 여러 전문가와 엔지 니어가 많은 아이디어와 조언을 해주었다. 머신러닝 콘퍼런스 MLConf 에서 애덤과 만난 후 DL4J를 진행하면서도 이렇게 책까지 집필하게 될 줄은 몰랐다. 나도 DL4J 프로젝트 처음부터 함께 했지만 솔직히 애덤이 나보다 훨씬 더 많 은 기여를 했다. JVM 위에서 동작하는 딥러닝에 대한 아이디어와 상당히 불확실하던 프로젝트 초기에 나아갈 방향을 제시한 애덤에게 깊은 감사의 말을 전한다. 그래 네가 맞았어, ND4J는 좋은 아이디어였어! 글을 쓰는 일은 길고 고독한 시간이 될 수도 있다. 책을 리뷰해주었을 뿐만 아니라 부록에 콘텐 트까지 추가하며 상당한 노력을 기울여준 알렉스 블랙에게 특별히 감사하다는 인사를 전하고 싶다. 알렉스의 인공 신경망 관련 문헌에 대한 방대한 지식은 이 책의 세부사항을 만들고 크고 작은 것들을 검증하는 데 많은 도움이 되었다. 그가 없었다면 6장과 7장은 절반도 완성하지 못 했을 것이다. 수전 에랄리는 손실함수 절의 구성과 부록 자료에 많은 도움을 주었고 꼼꼼한 리뷰로 이 책의 많은 방정식을 검증해주었다. 멜러니 워릭은 이 책의 초안을 리뷰하고 피드백하고 합성곱 신경 망의 내부 동작에 대해 설명하는 데 핵심적인 역할을 해주었다. 데이비드 케일은 자주 즉각적인 리뷰에 참여해주었고 많은 핵심 네트워크에 대한 세부사항과 논문 레퍼런스를 정확히 작성할 수 있도록 도움을 주었다. 또한 학계의 관점에서 우리가 어떤 독자들을 대상으로 해야 하는지 고민하는 데 도움을 주었다. 제임스 롱은 책에 들어갈 콘텐트에 대해 논의해주었고 통계 전문가의 관점에서 실용적인 견해 를 제시해주었다. 복잡한 주제를 어떻게 전달할 것인지 여러 방면으로 의견을 주고 고민해주었 다. 데이비드 케일과 알렉스 블랙이 수학적인 정확성에 대해 많은 이야기를 해주었던 반면 제 임스는 ‘독자 수준에 맞는 수학을 어떻게 제공할 것인가’에 대해 자주 이야기했다.

11


‘흥이 넘치는’ 뱌체슬라프 코코린은 자연어 처리 및 Word2Vec 예제 개발을 한층 더 높은 수준 으로 이끌어주었다. 스카이마인드 그룹의 사장인 크리스 니컬슨으로부터 받은 지원 또한 말씀드리고 싶다. 이 책을 완성할 때까지 시간과 자원을 아낌없이 지원해주었다. 이 책의 부록을 집필하는 데 도움을 준 분들께 감사 인사를 전한다. 역전파와 데이터 벡터화에 도움을 준 알렉스 블랙, GPU에 도움을 준 뱌체슬라프 코코린과 수잔 에랄리, 강화학습에 도움 을 준 루벤 피스젤. 이 책의 다양한 부분을 리뷰해준 그랜트 잉거솔, 딘 웜플러, 로버트 충, 테 드 말래스카, 라이언 지노, 라스 조지, 순니엘 마티, 프랑수아 게릴롯, 돈 브라운에게도 깊은 감 사의 말씀을 전한다. 수년간 인내하며 책에 대한 피드백과 첨언을 해준 편집자 팀 맥고번에게 감사 인사를 전한다. 이 책이 올바른 방향으로 갈 수 있도록 해준 것에 정말 감사드린다. 다음으로 이 책으로 이어진 나의 인생에 영향을 준 부모님 루이스와 코니, 논문 고문 역할을 해 주었던 미나 사르티피 박사, 졸업 과제를 함께 해준 빌리 해리스 박사, 대학원 동료 앤디 노보 빌리스키 박사, 조 듀머스 박사, 오픈PDC openPDC 창시자인 리치 캐럴, 클라우데라에서 나를 채용할 수 있도록 도와준 폴 트란치안, 크리스토프 비실리아와 마이크 올슨, 나의 첫 사회생활 프로젝트를 함께 해준 말콤 래미, 대학생 시절 즐겨 먹었던 루피 피자집에 감사 인사를 전한다. 마지막으로 가장 소중한 나의 아내 레슬리와 아들 에단, 그리핀, 데인에게 고맙다는 말을 전 한다.

12


애덤 스카이마인드 그룹의 우리 팀에 감사하다는 인사를 전한다. 특히 스타트업을 준비하면서도 책 을 쓰자는 나의 황당한 아이디어를 받아들여 준 크리스에게 감사드린다.

DL4J는 2013년 머신러닝 콘퍼런스에서 조시와의 만남을 계기로 시작되었으며 현재 전 세계 에서 사용하는 프로젝트로 성장했다. DL4J는 나를 더 넓은 세상으로 인도했으며 많은 새로운 경험을 할 수 있도록 해주었다. 먼저 이 책의 제일 중요한 부분을 맡아주고 많은 공로를 인정해준 공저자인 조시 패터슨에게 감사하다는 인사를 전한다. 내가 코드 작업을 하는 동안 밤이고 주말이고 할 것 없이 새로운 부 분을 추가하며 이 책에 대한 전반적인 작업을 진행해주었다. 다시 한번 조시와 팀 동료에게 감사드리며, 시작할 때부터 도움을 준 알렉스, 멜러니, 뱌체슬라 프 코코린과 늦게 합류하였지만 수학적인 부분에 상당한 도움을 준 데이비드에게 감사의 말을 전한다. 마지막으로 나의 아이디어에 귀 기울여주고 오라일리에서 출판할 수 있도록 도와준 팀 맥고번 에게 감사 인사를 전한다.

13


CONTENTS

지은이 소개 �������������������������������������������������������������������������������������������������������������������� 4

옮긴이 소개 �������������������������������������������������������������������������������������������������������������������� 5

옮긴이의 말 �������������������������������������������������������������������������������������������������������������������� 6

이 책에 대하여 ���������������������������������������������������������������������������������������������������������������� 7 감사의 글 ��������������������������������������������������������������������������������������������������������������������� 11

CHAPTER

1 머신러닝 복습하기

1.1 학습하는 기계 ������������������������������������������������������������������������������������������������������������ 25

1.1.1 기계는 어떻게 학습할까? ���������������������������������������������������������������������������������� 26

1.1.2 생물학적 영감 ������������������������������������������������������������������������������������������������� 29

1.1.3 딥러닝이란? ��������������������������������������������������������������������������������������������������� 30

1.1.4 토끼굴로 들어가기 ������������������������������������������������������������������������������������������� 31

1.2 문제 정의하기 ������������������������������������������������������������������������������������������������������������ 33 1.3 머신러닝 속의 수학 : 선형대수 ��������������������������������������������������������������������������������������� 33

1.3.1 스칼라 ����������������������������������������������������������������������������������������������������������� 33

1.3.2 벡터 �������������������������������������������������������������������������������������������������������������� 34

1.3.3 행렬 �������������������������������������������������������������������������������������������������������������� 34

1.3.4 텐서 �������������������������������������������������������������������������������������������������������������� 35

1.3.5 초평면 ����������������������������������������������������������������������������������������������������������� 35

1.3.6 관련 연산 ������������������������������������������������������������������������������������������������������� 36

1.3.7 데이터를 벡터로 변환하기 ��������������������������������������������������������������������������������� 36

1.3.8 연립방정식 풀기 ���������������������������������������������������������������������������������������������� 38

1.4 머신러닝 속의 수학 : 통계 ��������������������������������������������������������������������������������������������� 41

1.4.1 확률 �������������������������������������������������������������������������������������������������������������� 42

1.4.2 조건부확률 ����������������������������������������������������������������������������������������������������� 43

1.4.3 사후확률 �������������������������������������������������������������������������������������������������������� 44

14


1.4.4 분포 �������������������������������������������������������������������������������������������������������������� 44

1.4.5 표본과 모집단 비교 ������������������������������������������������������������������������������������������ 47

1.4.6 재표본추출 방법 ���������������������������������������������������������������������������������������������� 47

1.4.7 선택편향 �������������������������������������������������������������������������������������������������������� 48

1.4.8 가능도 ����������������������������������������������������������������������������������������������������������� 48

1.5 머신러닝은 어떻게 작동하는가? ������������������������������������������������������������������������������������� 48

1.5.1 회귀 �������������������������������������������������������������������������������������������������������������� 49

1.5.2 분류 �������������������������������������������������������������������������������������������������������������� 51

1.5.3 군집화 ����������������������������������������������������������������������������������������������������������� 52

1.5.4 과대적합과 과소적합 ���������������������������������������������������������������������������������������� 52

1.5.5 최적화 ����������������������������������������������������������������������������������������������������������� 53

1.5.6 볼록 최적화 ���������������������������������������������������������������������������������������������������� 55

1.5.7 경사 하강법 ���������������������������������������������������������������������������������������������������� 56

1.5.8 확률적 경사 하강법 ������������������������������������������������������������������������������������������ 58

1.5.9 유사 뉴턴 최적화 방법 �������������������������������������������������������������������������������������� 59

1.5.10 생성 모델과 판별 모델 �������������������������������������������������������������������������������������� 59

1.6 로지스틱 회귀 ������������������������������������������������������������������������������������������������������������ 60

1.6.1 로지스틱 함수 ������������������������������������������������������������������������������������������������� 61

1.6.2 로지스틱 회귀 출력에 대한 이해 ������������������������������������������������������������������������� 62

1.7 모델 평가하기 ������������������������������������������������������������������������������������������������������������ 62

1.7.1 분류행렬 �������������������������������������������������������������������������������������������������������� 62

1.8 머신러닝 이해하기 ������������������������������������������������������������������������������������������������������� 67

CHAPTER

2 신경망과 딥러닝의 기초

2.1 신경망 ���������������������������������������������������������������������������������������������������������������������� 69

2.1.1 생물학적 뉴런 ������������������������������������������������������������������������������������������������� 71

15


CONTENTS

2.1.2 퍼셉트론 �������������������������������������������������������������������������������������������������������� 74

2.1.3 다층 순방향 신경망 ������������������������������������������������������������������������������������������ 78

2.2 신경망 학습 ��������������������������������������������������������������������������������������������������������������� 85

2.2.1 역전파 학습 ���������������������������������������������������������������������������������������������������� 86

2.3 활성화함수 ���������������������������������������������������������������������������������������������������������������� 95

2.3.1 선형 �������������������������������������������������������������������������������������������������������������� 95

2.3.2 시그모이드 ����������������������������������������������������������������������������������������������������� 96

2.3.3 tanh ������������������������������������������������������������������������������������������������������������� 96

2.3.4 hard tanh ����������������������������������������������������������������������������������������������������� 97

2.3.5 소프트맥스 ����������������������������������������������������������������������������������������������������� 97

2.3.6 ReLU ����������������������������������������������������������������������������������������������������������� 98

2.4 손실함수 ����������������������������������������������������������������������������������������������������������������� 100

2.4.1 손실함수 표기법 �������������������������������������������������������������������������������������������� 101

2.4.2 회귀용 손실함수 �������������������������������������������������������������������������������������������� 101

2.4.3 분류용 손실함수 �������������������������������������������������������������������������������������������� 104

2.4.4 재구성용 손실함수 ����������������������������������������������������������������������������������������� 107

2.5 하이퍼파리미터 �������������������������������������������������������������������������������������������������������� 108

2.5.1 학습률 ��������������������������������������������������������������������������������������������������������� 108

2.5.2 규제 ������������������������������������������������������������������������������������������������������������ 109

2.5.3 모멘텀 ��������������������������������������������������������������������������������������������������������� 109

2.5.4 희소성 ��������������������������������������������������������������������������������������������������������� 110

CHAPTER

3 심층 신경망의 기본 원칙

3.1 딥러닝 정의 ������������������������������������������������������������������������������������������������������������� 111

3.1.1 딥러닝이란 ��������������������������������������������������������������������������������������������������� 111

3.1.2 이 장의 구성 ������������������������������������������������������������������������������������������������� 123

16


3.2 심층 신경망의 공통 설계 원리 �������������������������������������������������������������������������������������� 123

3.2.1 파라미터 ������������������������������������������������������������������������������������������������������ 124

3.2.2 계층 ������������������������������������������������������������������������������������������������������������ 124

3.2.3 활성화함수 ��������������������������������������������������������������������������������������������������� 125

3.2.4 손실함수 ������������������������������������������������������������������������������������������������������ 127

3.2.5 최적화 알고리즘 �������������������������������������������������������������������������������������������� 128

3.2.6 하이퍼파라미터 ��������������������������������������������������������������������������������������������� 131

3.2.7 요약 ������������������������������������������������������������������������������������������������������������ 136

3.3 심층 신경망 구축하기 ������������������������������������������������������������������������������������������������� 137

3.3.1 제한된 볼츠만 머신 ���������������������������������������������������������������������������������������� 138

3.3.2 오토인코더 ��������������������������������������������������������������������������������������������������� 144

3.3.3 VAE ������������������������������������������������������������������������������������������������������������ 146

CHAPTER

4 주요 심층 신경망 구조

4.1 비지도 사전학습 신경망 ���������������������������������������������������������������������������������������������� 150

4.1.1 심층 신뢰 신경망 ������������������������������������������������������������������������������������������� 150

4.1.2 GAN ����������������������������������������������������������������������������������������������������������� 153

4.2 합성곱 신경망 ���������������������������������������������������������������������������������������������������������� 157

4.2.1 생물학적 영감 ����������������������������������������������������������������������������������������������� 159

4.2.2 직관적으로 보기 �������������������������������������������������������������������������������������������� 159

4.2.3 합성곱 신경망 구조 둘러보기 ��������������������������������������������������������������������������� 161

4.2.4 입력 계층 ����������������������������������������������������������������������������������������������������� 163

4.2.5 합성곱 계층 �������������������������������������������������������������������������������������������������� 163

4.2.6 풀링 계층 ����������������������������������������������������������������������������������������������������� 173

4.2.7 완전 연결 계층 ���������������������������������������������������������������������������������������������� 174

4.2.8 그외 합성곱 신경망 애플리케이션 ��������������������������������������������������������������������� 174

4.2.9 대표적인 합성곱 신경망 ���������������������������������������������������������������������������������� 175

17


CONTENTS

4.2.10 요약 ������������������������������������������������������������������������������������������������������������ 176

4.3 순환 신경망 ������������������������������������������������������������������������������������������������������������� 176

4.3.1 시간 차원 모델링 ������������������������������������������������������������������������������������������� 177

4.3.2 3차원 입력 ��������������������������������������������������������������������������������������������������� 180

4.3.3 왜 마르코프 모델은 안 되는가? ������������������������������������������������������������������������� 182

4.3.4 일반적인 순환 신경망 구조 ������������������������������������������������������������������������������ 183

4.3.5 LSTM 신경망 ����������������������������������������������������������������������������������������������� 184

4.3.6 도메인별 응용 사례와 혼합된 신경망 ����������������������������������������������������������������� 194

4.4 재귀 신경망 ������������������������������������������������������������������������������������������������������������� 195

4.4.1 신경망 구조 �������������������������������������������������������������������������������������������������� 196

4.4.2 다양한 재귀 신경망 ���������������������������������������������������������������������������������������� 196

4.4.3 재귀 신경망 애플리케이션 ������������������������������������������������������������������������������� 196

4.5 요약 및 논의 ������������������������������������������������������������������������������������������������������������ 197

4.5.1 딥러닝의 등장으로 다른 알고리즘은 더 이상 사용하지 않는가? ������������������������������� 197

4.5.2 문제마다 최선의 방법이 있다 ��������������������������������������������������������������������������� 198

4.5.3 언제 딥러닝이 필요한가? �������������������������������������������������������������������������������� 199

CHAPTER

5 심층 신경망 구축하기

5.1 심층 신경망을 올바른 문제에 일치시키기 ����������������������������������������������������������������������� 201

5.1.1 열 기반 데이터와 다층 퍼셉트론 ����������������������������������������������������������������������� 202

5.1.2 이미지와 합성곱 신경망 ���������������������������������������������������������������������������������� 202

5.1.3 시계열과 순환 신경망 ������������������������������������������������������������������������������������� 203

5.1.4 하이브리드 신경망 사용하기 ���������������������������������������������������������������������������� 205

5.2 DL4J 도구 모음 ������������������������������������������������������������������������������������������������������� 205

5.2.1 벡터화와 DataVec ���������������������������������������������������������������������������������������� 206

5.2.2 ND4J와 실행 환경 ���������������������������������������������������������������������������������������� 206

18


5.2.3 ND4J 속도의 중요성 ������������������������������������������������������������������������������������� 207

5.2.4 ND4J와 DL4J 성능 측정 ������������������������������������������������������������������������������� 208

5.3 DL4J API의 기본 개념 ���������������������������������������������������������������������������������������������� 208

5.3.1 모델 로딩 및 저장 ������������������������������������������������������������������������������������������ 209

5.3.2 모델을 위한 입력값 얻기 ��������������������������������������������������������������������������������� 210

5.3.3 모델 구조 설정하기 ���������������������������������������������������������������������������������������� 211

5.3.4 학습과 검증 �������������������������������������������������������������������������������������������������� 212

5.4 다층 퍼셉트론 신경망으로 CSV 데이터 모델링하기 ��������������������������������������������������������� 213

5.4.1 입력 데이터 설정 ������������������������������������������������������������������������������������������� 216

5.4.2 신경망 구조 결정하기 ������������������������������������������������������������������������������������� 216

5.4.3 모델 학습 ����������������������������������������������������������������������������������������������������� 220

5.4.4 모델 검증 ����������������������������������������������������������������������������������������������������� 220

5.5 합성곱 신경망을 활용한 손글씨 이미지 모델링 ���������������������������������������������������������������� 221

5.5.1 LeNet 합성곱 신경망에 대한 자바 코드 ������������������������������������������������������������� 222

5.5.2 입력 이미지 불러오기 및 벡터화 ����������������������������������������������������������������������� 225

5.5.3 DL4J에서 LeNet 신경망 구조 ������������������������������������������������������������������������� 225

5.5.4 합성곱 신경망 학습 ���������������������������������������������������������������������������������������� 230

5.6 순환 신경망을 활용한 시퀀스 데이터 모델링 ������������������������������������������������������������������� 231

5.6.1 LSTM을 활용하여 셰익스피어 문체 생성하기 ����������������������������������������������������� 231

5.6.2 LSTM을 활용하여 센서에서 발생한 시계열 시퀀스 분류하기 ��������������������������������� 241

5.7 이상 탐지를 하는 오토인코딩 장치 사용 ������������������������������������������������������������������������� 249

5.7.1 오토인코더 예제에 대한 자바 코드 �������������������������������������������������������������������� 249

5.7.2 입력 데이터 준비 ������������������������������������������������������������������������������������������� 254

5.7.3 오토인코더 신경망 구조 및 학습 ����������������������������������������������������������������������� 254

5.7.4 모델 검증 ����������������������������������������������������������������������������������������������������� 256

5.8 VAE를 사용하여 MNIST 숫자 재구성 ��������������������������������������������������������������������������� 257

5.8.1 MNIST 숫자를 재구성하는 코드 ����������������������������������������������������������������������� 257

5.8.2 VAE 모델 검증 ���������������������������������������������������������������������������������������������� 260

19


CONTENTS

5.9 자연어 처리에서의 딥러닝 애플리케이션 ������������������������������������������������������������������������ 264

5.9.1 Word2Vec을 활용한 단어 임베딩 �������������������������������������������������������������������� 264

5.9.2 단락 벡터가 있는 문장의 분산된 표현 ���������������������������������������������������������������� 271

5.9.3 단락 벡터를 활용한 문서 분류 �������������������������������������������������������������������������� 276

CHAPTER

6 심층 신경망 튜닝하기

6.1 심층 신경망 튜닝의 기본 개념 �������������������������������������������������������������������������������������� 283

6.1.1 심층 신경망 구축을 위한 이해 �������������������������������������������������������������������������� 284

6.1.2 구축 단계별로 이해하기 ���������������������������������������������������������������������������������� 285

6.2 신경망 구조와 입력 데이터 매칭시키기 �������������������������������������������������������������������������� 286

6.2.1 요약 ������������������������������������������������������������������������������������������������������������ 288

6.3 출력 계층과 모델의 목표 연관짓기 �������������������������������������������������������������������������������� 288

6.3.1 회귀 모델의 출력 계층 ������������������������������������������������������������������������������������ 289

6.3.2 분류 모델의 출력 계층 ������������������������������������������������������������������������������������ 289

6.4 계층 수, 파라미터 수, 메모리 다루기 ����������������������������������������������������������������������������� 292

6.4.1 순방향 다층 신경망 ���������������������������������������������������������������������������������������� 293

6.4.2 계층 수와 파라미터 수 조절하기 ����������������������������������������������������������������������� 294

6.4.3 신경망 메모리 사용량 예측하기 ������������������������������������������������������������������������ 297

6.5 가중치 초기화 전략 ���������������������������������������������������������������������������������������������������� 299

6.5.1 순환 신경망의 직교 가중치 초기화 �������������������������������������������������������������������� 300

6.6 활성화함수 사용하기 �������������������������������������������������������������������������������������������������� 300

6.6.1 활성화함수 요약 표 ���������������������������������������������������������������������������������������� 302

6.7 손실함수 적용하기 ����������������������������������������������������������������������������������������������������� 303 6.8 학습률 이해하기 �������������������������������������������������������������������������������������������������������� 305

6.8.1 업데이트에 대한 파라미터의 비율 사용하기 �������������������������������������������������������� 306

6.8.2 추천하는 학습률 �������������������������������������������������������������������������������������������� 307

20


6.9 희소성이 학습에 주는 영향 ������������������������������������������������������������������������������������������ 310 6.10 최적화 기법 적용하기 ������������������������������������������������������������������������������������������������� 310

6.10.1 확률적 경사 하강법 적용해보기 ������������������������������������������������������������������������ 312

6.11 병렬화와 GPU로 더 빠르게 학습하기 ��������������������������������������������������������������������������� 313

6.11.1 온라인 학습과 병렬 반복 알고리즘 �������������������������������������������������������������������� 313

6.11.2 DL4J로 확률적 경사 하강법 병렬화하기 ������������������������������������������������������������ 316

6.11.3 GPU 사용하기 ���������������������������������������������������������������������������������������������� 319

6.12 미니배치 크기와 에포크 조절하기 ��������������������������������������������������������������������������������� 320

6.12.1 미니배치 크기별 장단점 이해하기 ��������������������������������������������������������������������� 321

6.13 규제 사용하기 ���������������������������������������������������������������������������������������������������������� 323

6.13.1 프라이어 함수로 규제하기 ������������������������������������������������������������������������������� 323

6.13.2 최대노름 규제 ����������������������������������������������������������������������������������������������� 324

6.13.3 드롭아웃 ������������������������������������������������������������������������������������������������������ 324

6.13.4 그외 다른 규제 ���������������������������������������������������������������������������������������������� 326

6.14 분류 불균형 다루기 ���������������������������������������������������������������������������������������������������� 327

6.14.1 분류 샘플링 기법 ������������������������������������������������������������������������������������������� 329

6.14.2 가중치 손실함수 �������������������������������������������������������������������������������������������� 330

6.15 과대적합 다루기 �������������������������������������������������������������������������������������������������������� 331 6.16 training UI에서 신경망 통계 보기 �������������������������������������������������������������������������������� 332

6.16.1 잘못 초기화된 가중치 찾기 ������������������������������������������������������������������������������ 335

6.16.2 셔플되지 않은 데이터 찾기 ������������������������������������������������������������������������������ 336

6.16.3 규제 관련 이슈 찾기 ��������������������������������������������������������������������������������������� 338

CHAPTER

7 심층 신경망 구조별 튜닝하기

7.1 합성곱 신경망 ���������������������������������������������������������������������������������������������������������� 341

7.1.1 일반적인 합성곱 구조 패턴 ������������������������������������������������������������������������������ 342

21


CONTENTS

7.1.2 합성곱 계층 구성하기 ������������������������������������������������������������������������������������� 346

7.1.3 풀링 계층 구성하기 ���������������������������������������������������������������������������������������� 352

7.1.4 전이학습 ������������������������������������������������������������������������������������������������������ 353

7.2 순환 신경망 ������������������������������������������������������������������������������������������������������������� 354

7.2.1 신경망 입력 데이터와 입력 계층 ����������������������������������������������������������������������� 355

7.2.2 출력 계층과 RnnOutputLayer ������������������������������������������������������������������������ 356

7.2.3 신경망 학습시키기 ����������������������������������������������������������������������������������������� 357

7.2.4 LSTM의 주요 문제 디버깅하기 ������������������������������������������������������������������������ 359

7.2.5 패딩과 마스킹 ����������������������������������������������������������������������������������������������� 360

7.2.6 마스킹으로 평가 및 점수 매기기 ����������������������������������������������������������������������� 361

7.2.7 순환 신경망 구조의 변형 ��������������������������������������������������������������������������������� 363

7.3 제한된 볼츠만 머신 ���������������������������������������������������������������������������������������������������� 363

7.3.1 은닉 유닛과 모델링 가능한 정보 ����������������������������������������������������������������������� 364

7.3.2 다양한 유닛 사용하기 ������������������������������������������������������������������������������������� 365

7.3.3 제한된 볼츠만 머신에서 규제 사용하기 �������������������������������������������������������������� 366

7.4 심층 신뢰 신경망 ������������������������������������������������������������������������������������������������������� 366

7.4.1 모멘텀 사용하기 �������������������������������������������������������������������������������������������� 367

7.4.2 규제 사용하기 ����������������������������������������������������������������������������������������������� 367

7.4.3 은닉 유닛 수 정하기 ��������������������������������������������������������������������������������������� 368

CHAPTER

8 벡터화

8.1 머신러닝에서 벡터화하는 법 ���������������������������������������������������������������������������������������� 369

8.1.1 왜 데이터를 벡터화해야 하는가? ����������������������������������������������������������������������� 370

8.1.2 열 기반 원시 데이터를 속성별로 다루는 법 ��������������������������������������������������������� 374

8.1.3 특징 엔지니어링과 정규화 기법 ������������������������������������������������������������������������ 376

8.2 ETL과 벡터화에 DataVec 사용하기 ����������������������������������������������������������������������������� 384

22


8.3 이미지 데이터 벡터화 ������������������������������������������������������������������������������������������������� 385

8.3.1 DL4J의 이미지 데이터 표현 ���������������������������������������������������������������������������� 386

8.3.2 DataVec으로 이미지 데이터와 벡터 정규화하기 ������������������������������������������������� 388

8.4 순차 데이터 벡터화 ���������������������������������������������������������������������������������������������������� 390

8.4.1 순차 데이터 소스의 주요 변형 �������������������������������������������������������������������������� 390

8.4.2 DataVec으로 순차 데이터 벡터화하기 �������������������������������������������������������������� 392

8.5 텍스트 벡터화 ���������������������������������������������������������������������������������������������������������� 398

8.5.1 단어 주머니 �������������������������������������������������������������������������������������������������� 399

8.5.2 TF - IDF ������������������������������������������������������������������������������������������������������� 400

8.5.3 Word2Vec 비교와 벡터 환경 모델 비교 ������������������������������������������������������������ 405

8.6 그래프로 작업하기 ����������������������������������������������������������������������������������������������������� 406

CHAPTER

9 스파크에서 딥러닝과 DL4J 사용하기

9.1 하둡과 스파크에서 DL4J 사용하는 방법 ����������������������������������������������������������������������� 409

9.1.1 명령줄에서 스파크 다루기 ������������������������������������������������������������������������������� 412

9.2 스파크 실행 구성 및 튜닝하기 �������������������������������������������������������������������������������������� 415

9.2.1 메소스에서 스파크 실행하기 ���������������������������������������������������������������������������� 416

9.2.2 얀에서 스파크 실행하기 ���������������������������������������������������������������������������������� 418

9.2.3 스파크 튜닝 가이드 ���������������������������������������������������������������������������������������� 420

9.2.4 스파크에서 DL4J 잡 튜닝하기 ������������������������������������������������������������������������� 424

9.3 스파크와 DL4J용 메이븐 POM 작성하기 ��������������������������������������������������������������������� 426

9.3.1 pom .xml 의존성 템플릿 ��������������������������������������������������������������������������������� 428

9.3.2 CDH 5.X를 위한 POM 작성하기 ��������������������������������������������������������������������� 432

9.3.3 HDP 2.4 POM 작성하기 ������������������������������������������������������������������������������� 433

9.4 하둡 및 스파크 문제 해결 �������������������������������������������������������������������������������������������� 434

9.4.1 ND4J 관련 이슈 ������������������������������������������������������������������������������������������� 435

23


CONTENTS

9.5 스파크에서 DL4J 병렬 처리 ��������������������������������������������������������������������������������������� 436

9.5.1 간단한 스파크 학습 예제 ��������������������������������������������������������������������������������� 438

9.6 스파크에서 DL4J API 사용하는 법 ������������������������������������������������������������������������������ 441 9.7 스파크 다층 퍼셉트론 예제 ������������������������������������������������������������������������������������������ 442

9.7.1 스파크에서 MLP 신경망 구조 설정하기 ������������������������������������������������������������� 445

9.7.2 분산 학습 및 모델 평가 ����������������������������������������������������������������������������������� 446

9.7.3 DL4J 스파크 잡 빌드 및 실행하기 �������������������������������������������������������������������� 448

9.8 LSTM으로 스파크에서 셰익스피어 텍스트 생성하기 �������������������������������������������������������� 449

9.8.1 LSTM 신경망 구조 설정하기 ��������������������������������������������������������������������������� 452

9.8.2 학습, 학습 진행 상황 추적, 결과 이해하기 ����������������������������������������������������������� 453

9.9 스파크에서 합성곱 신경망으로 MNIST 모델링하기 ��������������������������������������������������������� 454

9.9.1 스파크 잡 구성 및 MNIST 데이터 불러오기 �������������������������������������������������������� 457

9.9.2 LeNet 합성곱 신경망 구조 설정 및 학습하기 ������������������������������������������������������ 458

부록 A 인공지능이란? ������������������������������������������������������������������������������������������������������������������������������

461

부록 B

RL4J 및 강화학습 �������������������������������������������������������������������������������������������������������������������������

473

부록 C

반드시 알아야 하는 숫자들 ��������������������������������������������������������������������������������������������������������������

499

부록 D

신경망과 역전파 : 수학적 접근 ����������������������������������������������������������������������������������������������������������

501

부록 E

ND4J API 활용하기 ����������������������������������������������������������������������������������������������������������������������

507

부록 F

DataVec 활용하기 �������������������������������������������������������������������������������������������������������������������������

523

부록 G

DL4J 소스로 작업하기 �������������������������������������������������������������������������������������������������������������������

535

부록 H

DL4J 프로젝트 설정 ����������������������������������������������������������������������������������������������������������������������

537

I

DL4J 프로젝트에 알맞게 GPU 설정하기 ��������������������������������������������������������������������������������������������

543

부록 J

DL4J 설치 시 문제 해결 ������������������������������������������������������������������������������������������������������������������

547

찾아보기 ���������������������������������������������������������������������������������������������������������������������������������������������������

553

부록

24


CHAPTER

1

머신러닝 복습하기

표정에서 우러나오는 미묘한 느낌이 모든 걸 요약한다. _닐 타운 스티븐슨 저, 『스노 크래시 (Snow Crash )』

1.1 학습하는 기계 지난 10년간 머신러닝에 대한 관심은 폭발적으로 증가했다. 전산 프로그램, 업계 콘퍼런스, 월 스트리트 저널 등에서 매일같이 머신러닝을 언급한다. 많은 사람이 머신러닝에 대해 말할 때 할 수 있는 것과 하고 싶은 것을 동일시한다. 근본적으로 머신러닝은 알고리즘을 사용해 원시 데이터에서 정보를 추출하고 이를 모델로 표현하는 기법이다. 이 모델은 아직 모델링하지 않은 다른 데이터를 이용해 추론하는 데 사용한다. 신경망 neural networks 은 머신러닝 모델 중 하나로, 적어도 50년 전에 소개되었다. 신경망은 포유 류의 뇌를 구성하는 신경세포를 본떠서 만든 노드로 구성된다. 노드 간의 연결 또한 생물의 뇌 와 마찬가지로 시간이 지남에 따라 (‘학습’을 거치면서) 발달한다. 2장과 3장에서 이 모델이 어 떻게 작동하는지 자세히 살펴보겠다. 신경망의 핵심 구조는 1980년대 중반과 1990년대 초반에 개선되고 완성되었다. 그러나 좋 은 결과를 얻으려면 많은 시간과 데이터가 필요해 그 당시에는 큰 관심을 끌지 못했다. 그러다

2000년대 초에 컴퓨터의 계산 능력이 기하급수적으로 향상되면서 이전까지는 사용할 수 없었 던 기술들이 쏟아졌다. 그중에서도 딥러닝은 지난 10년간 컴퓨팅 파워의 폭발적인 성장과 함

1장 머신러닝 복습하기

25


께 등장해 수많은 머신러닝 대회에서 우승하면서 이 분야에서 확고한 입지를 다진 기술이다. 딥러닝에 대한 관심은 현재까지 식지 않았다. 오늘날 머신러닝과 관련된 모든 곳에서 딥러닝을 언급한다. 이 책은 딥러닝의 정의에 대해 깊이 있게 다룰 것이다. 실무자가 언제든 참고할 수 있도록 아래 와 같이 구성했다. 선형대수 및 머신러닝의 기초

신경망의 기초

네 가지 주요 심층 신경망 구조 소개

실제 심층 신경망을 변형시켜 볼 수 있는 예제 제공

이 책이 쉬우면서도 유용했으면 좋겠다. 우선 머신러닝에 대한 기초 및 몇 가지 핵심 개념을 살 펴보자.

1.1.1 기계는 어떻게 학습할까? 기계가 어떻게 학습하는지 정의하기 전에 먼저 ‘학습’의 의미에 대해 생각해보자. 학습한다는 것은 ‘연구, 경험 또는 지도를 통해 지식을 습득한다’는 것을 뜻한다. 그러므로 머신러닝에서의 학습은 알고리즘을 사용해 데이터가 어떤 구조를 가지는지 설명할 수 있는 지식을 습득하는 것 으로 볼 수 있다. 즉, 컴퓨터는 원시 데이터 속에 있는 정보를 구조로 설명하는 법을 학습한다. 이 구조 설명을 다른 말로 모델이라 부른다. 모델은 원시 데이터로부터 추출한 정보로 알려지 지 않은 데이터를 예측하는 데 사용된다. 모델(또는 구조 설명)은 아래에 언급한 것 외에도 다 양한 종류가 있다. 의사결정 트리

선형회귀

신경망 가중치

각 모델은 알려지지 않은 데이터를 예측하기 위해 서로 다른 방법으로 알려진 데이터에 룰을 적용한다. 의사결정 트리는 트리 구조 형태로 규칙 집합을 만들고 선형 모델은 입력 데이터를 나타내는 일련의 파라미터를 만든다.

26

자바를 활용한 딥러닝


신경망은 네트워크의 노드 간 연결마다 가중치를 나타내는 파라미터 벡터를 가지고 있다. 이 장 뒷부분에서 이 타입의 모델에 대해 자세히 설명한다.

머신러닝과 데이터 마이닝 데이터 마이닝 data mining 은 수십 년 동안 사용됐지만 많은 머신러닝 용어가 그러하듯 의미가 잘 못 사용되거나 오해를 받아왔다. 이 책에서는 ‘데이터 마이닝’을 ‘데이터에서 정보를 추출하는 것’이라는 의미로 사용한다. 머신러닝은 원시 데이터에서 구조화된 정보를 얻는 데이터 마이닝 과정에 알고리즘을 이용한다는 점이 다르다. 머신러닝 내 데이터 마이닝에 대해 생각해보자. 개념을 이해하려면

- 원시 데이터가 필요하고 데이터의 행 또는 인스턴스로 구성된 예제에서

- 데이터 내에 등장하는 특정 패턴을 찾아내고 기계는 데이터의 이러한 패턴들로부터 개념을 학습한다.

- 이것이 머신러닝에서 말하는 알고리즘이다.

이러한 일련의 과정이 ‘데이터 마이닝’이다.

IBM과 스탠포드에서 인공지능 Artificial Intelligence, AI 연구로 유명한 아서 새뮤얼 1은 머신러닝을 다음과 같이 정의했다. 컴퓨터가 배울 수 있는 능력, 즉 코드로 정의하지 않은 동작을 실행하는 능력에 대한 연구 분야

새뮤얼은 체커게임 2에서 특정한 보드 배치로 승리와 실패 확률에 따른 전략을 학습하고 이를 활용하여 게임을 하는 소프트웨어를 만들었다. 승리 혹은 패배로부터 유용한 패턴을 찾아내고 이를 토대로 강화하는 기본적인 방식은 오늘날 머신러닝과 인공지능의 토대가 되었다.

1 http://infolab.stanford.edu/pub/voy/museum/samuel.html 2 옮긴이_ 보드게임의 한 종류(https://en.wikipedia.org/wiki/Draughts )

1장 머신러닝 복습하기

27


스스로 목표를 달성하기 위해 학습하는 기계라는 개념은 수십 년 동안 활용되어 왔다. 현대 인 공지능의 할아버지라 불리는 스튜어트 J. 러셀 3과 피터 노빅 4은 『Artificial Intelligence: A

Modern Approach』5에 이 개념을 잘 표현했다. 생물학적으로든 전자적으로든 느리고 작은 두뇌가 자신보다 훨씬 크고 복잡한 세상을 인지하고, 이해하고, 예측하고, 조종하는 게 어떻게 가능할까?

위 표현은 기계가 알고리즘과 단계별 과정을 거쳐 학습하는 개념이 자연에서부터 출발하였다 는 것을 이야기한다. [그림 1-1]에서 인공지능과 머신러닝, 딥러닝 간의 관계를 확인할 수 있다. 그림 1-1 인공지능과 딥러닝 간의 관계

인공지능

머신러닝

딥러닝

3 https://www2.eecs.berkeley.edu/Faculty/Homepages/russell.html 4 http://norvig.com 5 http://aima.cs.berkeley.edu

28

자바를 활용한 딥러닝


인공지능은 긴 시간 동안 연구된 매우 광범위한 영역이다. 딥러닝은 인공지능의 한 분야로 머 신러닝의 하위 개념이다. 이제 딥러닝의 또 다른 근원인 신경망이 어떻게 생물학에서 영감을 받게 되었는지 확인해보자.

1.1.2 생물학적 영감 생물학적 신경망(뇌)은 약 860억 개의 뉴런으로 구성되어 있으며 서로 연결되어 있다. NOTE_ 사람의 두뇌와 인공 신경망의 뉴런 연결 수

과학자들은 사람의 두뇌에는 최소한 500조 이상의 뉴런 간 연결이 있을 것이라고 이야기한다. 하지만 오늘 날 가장 큰 인공 신경망조차 이 수치에 근접하지 못하고 있다.

정보를 처리하는 관점에서 볼 때 생물학에서의 뉴런은 전기와 화학신호로 정보를 처리하고 전 송하는 자극에 반응하는 기관으로서 뇌, 중추신경계, 척수 및 말초신경계의 신경절에서 핵심이 다. 이 장 뒷부분에서 확인할 수 있듯이 인공 신경망에서의 구조는 훨씬 단순하다. CAUTION_ 생물학적 신경망과 인공 신경망의 비교

생물학적 신경망의 구조는 인공 신경망보다 몇 십 배 복잡하다!

뇌의 일반적인 동작 원리를 따르는 인공 신경망에는 두 가지 중요한 특성이 있다. 첫째, 인공 신경망의 가장 기본적인 단위는 인공 뉴런(또는 노드)이다. 인공 뉴런은 생물학에서의 뉴런과 마찬가지로 입력에 의해 자극을 받는다. 자극을 받은 인공 뉴런은 다른 뉴런으로부터 전달받은 모든 정보를 전송하지 않고 일부 정보만 전송한다. 앞으로 신경망에서 이러한 전송에 대해 자 세히 설명할 것이다. 둘째, 뇌가 높은 목표를 달성하는 데 유용한 신호만 전달하도록 뇌의 뉴런을 학습시킬 수 있는 것처럼 인공 신경망에서도 뉴런을 학습시켜 유용한 신호만 전달하도록 할 수 있다. 이 장에서 는 비트와 함수를 이용하여 어떻게 이러한 기능을 구현할 수 있는지 알아볼 것이다.

1장 머신러닝 복습하기

29


컴퓨터 과학에서의 생물학적 영감 컴퓨터 과학 분야가 생물학에서 영감을 받은 영역은 인공 신경망에만 국한되지 않는다. 지난 50 여 년 동안 학술 연구적으로 자연의 다음과 같은 영역에서 힌트를 찾았다. 개미

흰개미 6

꿀벌

유전자 알고리즘

예를 들어 개미 콜로니 ant colony 7 는 실패의 원인이 어떤 단일 개미가 되지 않도록 강력하게 분산 된 구조를 가지고 있다. 개미들은 끊임없이 서로의 담당업무를 전환하며 정량적인 간접적 협력 체계 quantitative stigmergy 와 같은 메타 휴리스틱 접근 8 을 통해 일의 균형을 최적으로 맞추도록 해 답을 찾는다. 즉, 개미 무리는 직접적으로 일을 조정하는 특정한 개미 없이 필요에 따라 업무별 담당자 수를 거의 최적으로 유지하면서 방어, 은신처 건설, 식량 수집과 같은 일을 수행한다.

1.1.3 딥러닝이란? 딥러닝은 지난 10년 동안 천천히 바뀌어왔기 때문에 개념을 정의하기 어렵다. 자주 사용하 는 정의 중 하나는 ‘딥러닝은 둘 이상의 계층을 가진 신경망을 다루는 것’이다. 이 정의는 마치

1980년대 이후부터 존재했던 둘 이상의 계층을 가지는 모든 신경망을 말하는 것처럼 들리고 현대의 딥러닝과 정확히 동일하다고 이야기할 수도 없다. 최근 몇 년간 딥러닝은 놀라운 결과 를 보여주었고 그 바탕에 초기 신경망의 구조적인 개선(처리 능력의 비약적인 향상과 함께)이 먼저 일어났다. 다음은 이러한 신경망의 진화와 관련된 몇 가지 사실이다. 이전보다 많아진 뉴런

각 계층/뉴런 간을 연결하는 더 복잡한 방법

학습에 사용할 수 있는 계산 능력의 폭발적인 증가

자동화된 특징 추출

6 「TinyTermite: A Secure Routing Algorithm」(Patterson, 2008 ) (http://scholar.utc.edu/theses/184/ ), 「TinyTermite: A Secure Routing Algorithm on Intel Mote 2 Sensor Network Platform」( Sartipi, Patterson, 2009 ) ( http://www. aaai.org/ocs/index.php/IAAI/IAAI09/paper/viewFile/235/1030 ) 7 https://mitpress.mit.edu/books/ant-colony-optimization 8 옮긴이_ 전체 시스템의 상황을 파악하고 개인의 행동을 결정하는 것이 아닌, 단지 주변 상황에 남겨진 정보를 이용해 자신의 행동을 결정 하고 서로 간의 간접적인 의사소통을 행하는 개념

30

자바를 활용한 딥러닝


이 책은 딥러닝을 다음의 기본적인 네 가지 네트워크 구조 중 한 가지를 이용하면서 많은 파라 미터와 계층을 사용하는 신경망으로 정의한다. 비지도 사전학습 신경망(Unsupervised Pretrained Network , UPN )

합성곱 신경망(Convolutional Neural Network , CNN )

순환 신경망(Recurrent Neural Network , RNN )

재귀 신경망(Recursive Neural Network , RvNN )

이 외에도 합성곱과 순환 신경망의 결합처럼 다양한 구조가 존재한다. 하지만 이 책에서는 위 네 가지 구조에 집중할 것이다. 자동 특징 추출은 전통적인 머신러닝 알고리즘에 비해 딥러닝이 가지는 가장 큰 장점이다. 특 징 추출을 통해 데이터가 가지는 특성을 이용하여 해당 데이터에 확실하게 레이블을 지정하는 과정을 수행할 수 있다. 과거의 머신러닝 종사자들은 몇 달, 몇 년 또는 수십 년 동안 데이터를 분류하는 특징셋을 수작업으로 만들었다. 2006년 딥러닝 빅뱅 이후 최신 머신러닝 알고리즘 은 특히 이러한 노동집약적인 분야(입력 데이터를 분류할 수 있도록 관련 특징을 찾아내는 것) 를 개선하려고 노력했다. 딥러닝은 거의 모든 데이터에 대해 최소한의 튜닝과 사람의 노력으로 기존 알고리즘의 정확도를 능가하게 되었다. 이제 이러한 심층 신경망은 데이터 과학자들이 더 의미 있는 활동에 집중할 수 있게 해줄 것이다.

1.1.4 토끼굴로 들어가기 최근 딥러닝은 기술적인 부분을 넘어서서 컴퓨터 과학 분야에 깊숙이 스며들었다. 머신러닝 모 델링에서 정확도를 크게 향상시킨 것뿐만 아니라 비 컴퓨터 과학 종사자들도 매료시킬 수 있는 생성 방법을 입증했기 때문이다. [그림 1-2]는 심층 신경망이 유명 화가의 그림으로 학습한 후 다른 사진을 그 화가의 독특한 화풍으로 재생산하는 예술 작품 생성의 실례다.

1장 머신러닝 복습하기

31


그림 1-2 이미지 화풍 적용 예 9

이 예제는 ‘기계는 창의적일 수 있는가?’ 또는 ‘무엇이 창의력인가?’와 같은 많은 철학적인 논쟁 을 일으켰다(이 부분은 독자들이 추후에 고민할 수 있도록 남겨두겠다). 어느 날 눈을 떴을 때 기계가 제퍼디 10의 챔피언이 되어 있고 바둑의 최고 고수를 이기게 된 지금까지 머신러닝은 계 절의 변화처럼 아주 미묘하지만 꾸준하게 수년에 걸쳐서 발전해왔다. 기계가 인간만큼의 지능을 가지고 똑똑해질 수 있을까? 인공지능은 무엇이고 얼마나 강력한 가? 이들 질문은 아직 답을 얻지 못했고 이 책 역시 완벽하게 대답하지 못한다. 단지 딥러닝의 실질적인 학습을 통해 오늘날 우리 주변에 적용할 수 있는 인공지능의 일부분에 대해 설명할 것이다. NOTE_ 인공지능 추가 토론

인공지능을 더 자세히 알고 싶다면 부록 A를 참조하라.

9 「A Neural Algorithm of Artistic Style」(Gatys et al ., 2015 ) (http://arxiv.org/pdf/1508.06576v1.pdf ) 10 옮긴이_ 미국의 퀴즈쇼

32

자바를 활용한 딥러닝


1.2 문제 정의하기 머신러닝을 적용하는 가장 기본적인 방법은 올바른 질문을 하는 것에서 시작한다. 그러려면 다 음과 같은 내용을 정의해야 한다. 정보 또는 모델을 얻고자 하는 입력 데이터는 무엇인가?

이 데이터에 가장 적합한 모델은 무엇인가?

이 모델을 기반으로 새로운 데이터에서 얻고자 하는 정답은 무엇인가?

이 세 가지 질문에 대답할 수 있다면 모델을 구축하고 원하는 답변을 생성하는 머신러닝 워크 플로를 만들 수 있다. 워크플로를 더 잘 만들 수 있도록 머신러닝을 수행할 때 알아야 할 몇 가 지 핵심 개념에 대해 확인해보자. 이후에 실제 머신러닝에서 어떻게 이용되는지 알게 되면 신 경망과 딥러닝을 이해하는 데 도움이 될 것이다.

1.3 머신러닝 속의 수학 : 선형대수 선형대수는 머신러닝과 딥러닝 기반으로 모델을 만드는 데 사용하는 방정식을 푸는 수학적인 기초를 제공한다.11 NOTE_ 제임스 E . 젠틀의 「Matrix Algebra : Theory, Computations, and Applications in Statistics」11 는

선형대수의 훌륭한 입문서다.

보다 핵심적인 개념을 배우기 전에 스칼라 scala 라는 기본 개념부터 시작하자.

1.3.1 스칼라 수학에서 스칼라는 벡터의 한 요소로 언급된다. 스칼라는 실숫값이고 벡터 공간을 정의하는 데 이용되는 요소 중 하나다.

11 http://mason.gmu.edu/~jgentle/books/matbk/

1장 머신러닝 복습하기

33


컴퓨터 분야에서 스칼라는 변수와 동의어다. 어떠한 상징적인 이름과 짝을 이루는 저장공간을 뜻하며 이 공간에는 값 value 이라는 알려지지 않은 정보가 들어 있다.

1.3.2 벡터 벡터 vector 는 보통 다음과 같이 정의한다. 벡터는 양의 정수 n 이 있을 때 튜플, 요소 또는 스칼라라고 불리는 숫자 n 개로 이루어진 정렬된 셋 또는 배열이다.

벡터화 vectorization 라는 과정을 통해 벡터라는 데이터 구조를 만들어보자. 벡터의 요소 수를 ‘차 수’ 또는 ‘길이’라고 한다. 벡터는 n 차수 공간에서 점으로 표현할 수도 있다. 특히 이런 경우 원 점에서 점까지의 유클리드 거리 Euclidean distance 는 벡터의 ‘길이’를 나타낸다. 벡터는 수학적인 표현법으로 다음과 같이 나타낸다.

 x1  x   2 x =  x3      xn    또는 다음과 같이 표현할 수도 있다.

x = [x1 , x2 , x3 ,  xn ] 벡터화에는 여러 가지 방법이 존재하며 전처리 과정에 적용하여 출력 모델에 다양한 등급을 부 여할 수 있다. 원시 데이터를 벡터로 변환하는 방법에 대해서는 8장에서 다룰 것이다.

1.3.3 행렬 행렬 matrix 은 같은 차원(열의 수)을 가지는 벡터들의 그룹이다. 즉, 행렬은 행과 열을 가지는 2차 원 배열이다.

34

자바를 활용한 딥러닝


n × m 행렬은 n 개 행과 m 개 열을 가진다. [그림 1-3]은 3 × 3 행렬이다. 행렬은 선형대수와 머신러닝의 중심 구조로, 이 장을 진행하며 계속 살펴볼 것이다. 그림 1-3 3 × 3 행렬

1.3.4 텐서 텐서 tensor 는 가장 근본적인 수준에서의 다차원 배열이며 벡터보다 더 일반적인 수학적 구조다. 벡터는 텐서의 부분집합으로 볼 수 있다. 텐서에서 행은 y 축을 따라, 열은 x 축을 따라 확장된다. 각 축은 차원을 의미하며 텐서는 추가 적인 차원을 가진다. 이러한 텐서의 차원 수를 랭크 rank 라고 한다. 즉, 스칼라는 랭크 0, 벡터는 랭크 1, 행렬은 랭크 2이며, 랭크 3 이상은 모두 텐서라고 부른다.

1.3.5 초평면 꼭 알아야 하는 또 다른 선형대수의 중요한 개념은 초평면 hyperplane 이다. 기하학에서 초평면은 주변 공간보다 한 차원 작은 부분 공간을 말한다. 3차원 공간에서 초평면은 2차원이고, 2차원 공간에서는 1차원 선을 초평면이라고 한다. 초평면은 n 차원의 공간을 ‘부분’으로 나누는 수학적인 구조이므로 분류와 같은 문제에서 유용 하게 사용된다. 초평면의 파라미터를 최적화하는 것은 선형 모델링의 핵심 개념으로 1.5.5절 ‘최적화’에서 자세히 설명할 것이다.

1장 머신러닝 복습하기

35


1.3.6 관련 연산 여기서는 꼭 짚고 넘어가야 할 일반적인 선형대수 연산을 간단히 살펴본다.

내적 머신러닝에서 자주 사용하는 선형대수 연산으로 내적 dot product 이 있다. 내적은 때때로 ‘스칼라 곱’ 또는 ‘점 곱’으로도 불린다. 내적은 차원이 같은 두 벡터를 숫잣값 하나로 반환한다. 두 벡터 의 항목을 차례대로 곱한 후 각 값을 모두 더해 값 하나를 얻는다. 많은 수학 연산 없이 즉각적 으로 숫자 하나에 많은 정보를 담을 수 있다는 것이 중요하다. 내적은 각 벡터에서 개별 요소가 얼마나 큰 값인지 나타내는 척도다. 큰 값을 가진 두 벡터 는 더 작은 값을 가진 두 벡터보다 더 큰 값을 반환한다. 이러한 벡터의 상대적인 값이 정규화 normalization

다. 정규화를 이용하면 수학적으로 두 벡터가 얼마나 유사한지 나타낼 수 있다. 정규

화된 두 벡터에 대한 내적을 수학적으로 코사인 유사도 cosine similarity 라고 한다.

성분 곱 또 다른 연산으로 성분 곱 element-wise product (또는 아다마르 연산 Hadamard product )이 있다. 이 연산 은 두 벡터의 각 요소를 곱하여 같은 길이의 벡터 하나를 생성한다.

외적 외적 outer product 은 두 입력 벡터의 ‘텐서 곱’이다. 열 벡터의 각 요소를 행 벡터의 모든 요소와 곱 하여 결과 벡터의 새로운 행으로 만든다.

1.3.7 데이터를 벡터로 변환하기 머신러닝과 데이터 과학 분야에서는 모든 타입의 데이터를 분석해야 한다. 중요한 점은 각 데 이터 타입을 벡터로 표현할 수 있는가 하는 것이다. 머신러닝에서는 텍스트, 시계열, 오디오, 이미지, 비디오 등 다양한 타입의 데이터를 이용한다. 그렇다면 왜 알고리즘을 학습할 때는 원시 데이터를 그대로 이용하고 다룰 수는 없는 것일까?

36

자바를 활용한 딥러닝


문제는 바로 머신러닝이 선형대수에 기반을 두고 있고 방정식을 풀어야 한다는 점이다. 이들 방정식은 입력을 부동소수점수로 받기 때문에 원시 데이터를 부동소수점수의 집합으로 변환해 야 한다. 다음 절에서는 이러한 개념으로 방정식을 푼다. 원시 데이터는 표준 붓꽃 데이터셋 12 이다. 5.1,3.5,1.4,0.2,Iris-setosa 4.9,3.0,1.4,0.2,Iris-setosa 4.7,3.2,1.3,0.2,Iris-setosa 7.0,3.2,4.7,1.4,Iris-versicolor 6.4,3.2,4.5,1.5,Iris-versicolor 6.9,3.1,4.9,1.5,Iris-versicolor 5.5,2.3,4.0,1.3,Iris-versicolor 6.5,2.8,4.6,1.5,Iris-versicolor 6.3,3.3,6.0,2.5,Iris-virginica 5.8,2.7,5.1,1.9,Iris-virginica 7.1,3.0,5.9,2.1,Iris-virginica

또 다른 예제는 원시 텍스트 문서다. Go, Dogs. Go! Go on skates or go by bike.

두 원시 데이터의 타입은 다르지만 두 데이터 모두 벡터화하여 머신러닝을 수행하기 적합한 형 태로 변환해야 한다. 시점에 따라서 데이터를 행렬이 아닌 중간 단계의 형식으로 표현할 수도 있다(예를 들면 다음 예제와 같은 svmlight 파일 형식). 머신러닝 알고리즘의 입력 데이터를 다음과 같이 직렬화된 희소 벡터 형식으로 표현해보자. 1.0 1:0.7500000000000001 2:0.41666666666666663 3:0.702127659574468 4:0. 5652173913043479 2.0 1:0.6666666666666666 2:0.5 3:0.9148936170212765 4:0.6956521739130436 2.0 1:0.45833333333333326 2:0.3333333333333336 3:0.8085106382978723 4:0 .7391304347826088 0.0 1:0.1666666666666665 2:1.0 3:0.021276595744680823 2.0 1:1.0 2:0.5833333333333334 3:0.9787234042553192 4:0.8260869565217392 12 http://archive.ics.uci.edu/ml/datasets/Iris

1장 머신러닝 복습하기

37


1.0 1:0.3333333333333333 3:0.574468085106383 4:0.47826086956521746 1.0 1:0.7083333333333336 2:0.7500000000000002 3:0.6808510638297872 4:0 .5652173913043479 1.0 1:0.916666666666667 2:0.6666666666666667 3:0.7659574468085107 4:0 .5652173913043479 0.0 1:0.08333333333333343 2:0.5833333333333334 3:0.021276595744680823 2.0 1:0.6666666666666666 2:0.8333333333333333 3:1.0 4:1.0 1.0 1:0.9583333333333335 2:0.7500000000000002 3:0.723404255319149 4:0 .5217391304347826 0.0 2:0.7500000000000002

이 형식은 각 행의 첫 번째 숫자인 레이블값을 빠르게 읽어서 행렬이나 열 벡터로 만들 수 있다. 각 행의 인덱싱된 나머지 숫자는 런타임 시 행렬의 적절한 위치에 특징값으로 삽입되어 머신러 닝 과정에서 다양한 선형대수 연산에 사용된다. 벡터화 과정에 대한 더 자세한 이야기는 8장에 서 다룬다. 그런데 머신러닝 알고리즘은 왜 데이터를 일반적으로 (희소) 행렬로 표현하기 원할까? 방정식 문제를 해결하는 기본적인 방법을 빠르게 살펴보며 이 질문의 답을 얻자.

1.3.8 연립방정식 풀기 선형대수에서는 일반적으로 다음과 같은 형태의 방정식을 풀게 된다.

Ax = b A 는 입력 행 벡터의 집합 행렬이고 b 는 A 행렬에서 각 벡터의 레이블을 나타내는 열 벡터다. 앞의 예제에서 직렬화된 희소 출력의 첫 세 개 행을 가져와서 선형대수 형식으로 값을 표현하 면 다음과 같다. Column 1 0.7500000000000001 0.6666666666666666 0.45833333333333326

Column 2 0.41666666666666663 0.5 0.3333333333333336

Column 3 0.702127659574468 0.9148936170212765 0.8085106382978723

Column 4 0.5652173913043479 0.6956521739130436 0.7391304347826088

이 숫자들의 행렬은 식에서 A 변수고, 각 열의 값은 입력 데이터에서 특징값으로 간주된다.

38

자바를 활용한 딥러닝


특징이란? 머신러닝에서 특징이란 입력 행렬 A 에서 독립변수로 사용되는 모든 열 값을 의미한다. 원시 데 이터에서 특징값을 바로 가져올 수도 있지만 대부분의 경우 모델링에 더 적합한 방법으로 원시 데이터를 변환하는 과정을 거친다. 예를 들면 원시 데이터에 네 종류의 텍스트 레이블이 들어 있는 열이 있다. 모든 입력 데이터를 탐색하고 사용된 모든 레이블값을 색인화해보자. 그러려면 각 행에 (0, 1, 2, 3 ) 중 한 가지 값으 로 들어 있는 레이블을 0.0에서 1.0 사이의 값으로 정규화해야 한다. 이러한 변환은 머신러닝이 모델링 문제에서 더 나은 해결법을 찾는 데 큰 도움을 준다. 8장에서 벡터화 변환에 대해 더 많 은 기술을 볼 수 있을 것이다.

이제 출력 b 또는 예측함수에 의해 예측된 각 행의 레이블을 활용하여 각 열의 계수를 구하자. 앞서 살펴본 직렬화된 희소 벡터 예제의 레이블은 다음과 같다. Labels 1.0 2.0 2.0

계수는 [그림 1-4]에 표시된 x 열 벡터(또는 파라미터 벡터)가 된다. 그림 1-4 Ax = b 방정식의 시각화 학습 데이터 (A)

파라미터 벡터 (x)

결과 (b)

입력 데이터 1 입력 데이터 2 입력 데이터 3

다음과 같은 식을 만족하는 파라미터 벡터 x 가 존재한다면 ‘해가 있다’라고 말한다.

x = A -1 b 실제로 방정식을 풀 때 x = A -1 b 라는 식은 중요하다. 이 식은 해 그 자체를 나타내며 행렬 A 의

1장 머신러닝 복습하기

39


역행렬인 A -1 은 행렬 역변환 matrix inversion 에 의해 계산된다. 모든 행렬이 역행렬을 갖는 것은 아니기 때문에 방정식을 풀 수 있는 또 다른 방법이 필요하다. 한 가지 방법은 행렬 분해 matrix decomposition

로 선형 방정식에서 해를 찾을 때 LU lower upper 분해를 이용하는 것이다. 행렬 분해

외에 선형 방정식을 푸는 방법에 대해서도 살펴보자.

선형 방정식을 푸는 방법 선형 방정식은 두 가지 방법으로 풀 수 있다. 첫 번째는 직접법 direct method 으로, 일정한 횟수의 계산을 통해 답을 구할 수 있다는 것을 알고 있을 때 이용한다. 두 번째는 반복법 iterative method 이 라는 접근법으로, 일련의 근삿값이나 종료 조건을 통해 매개벡터 x 를 유도하는 방식이다. 직접 법은 모든 학습 데이터(A 와 b )가 컴퓨터 한 대의 메모리에 저장될 수 있을 때 특히 효과적이 다. 선형 방정식을 풀 때 흔히 사용하는 직접법으로는 가우스 소거법과 정규 방정식이 있다.

반복법 반복적인 접근법은 데이터가 컴퓨터 한 대의 메모리에 저장되지 않을 때 효과적이며 디스크로 부터 각 데이터를 순환하여 처리하기 때문에 훨씬 많은 양의 데이터를 모델링할 수 있다. 요즘 머신러닝에서 가장 일반적으로 사용되는 반복법은 확률적 경사 하강법 Stochastic Gradient Descent, SGD

으로 이 장 뒷부분에서 설명할 것이다. 다른 방법으로는 켤레 기울기법 Conjugate Gradient Method

과 교대 최소 제곱법 Alternating Least Square, ALS 이 있으며 3장에서 살펴볼 것이다. 반복적인 방법은 로컬 데이터를 반복 처리하여 스케일 아웃 방식에 효과적으로 활용되며 전체 데이터를 각 클러 스터에 분산시키고 주기적으로 파라미터 벡터값을 로컬 모델에 업데이트하는 데 활용할 수도 있다(9장에서 설명할 것이다).

반복적인 방법과 선형대수 이들 알고리즘을 이용하여 입력 데이터를 다루려면 원시 데이터를 입력 행렬인 A 로 변환하는 과정이 필요하다. 앞서 설명한 선형대수에 대한 간단한 개요는 ‘왜’ 데이터를 벡터화하는지 말 해준다. 이제 원시 데이터를 입력 행렬 A 로 변환하는 예제를 살펴보며 ‘어떻게’ 벡터화하는지 알아보자. 데이터를 벡터화하는 방법 또한 학습 프로세스의 결과에 영향을 미친다. 데이터를 벡터화하기 전에 전처리 과정을 거치면 더 정확한 모델을 만들 수 있다.

40

자바를 활용한 딥러닝


1.4 머신러닝 속의 수학 : 통계 이제 통계에 대해 이야기해보자. 다음과 같은 기본 개념은 꼭 알아야 한다. 확률(probability )

분포(distribution )

가능도(likelihood )

기술 통계와 추리 통계에서 강조하는 몇 가지 기본적인 관계가 있다. 기술 통계에는 다음과 같 은 것들이 있다. 히스토그램

박스플롯(또는 상자그림)

산점도

평균

표준편차

상관계수

표본에서 모집단으로 일반화하는 추리 통계 기술에는 다음과 같은 것들이 있다. p 값

신뢰구간

추리 통계와 확률은 다음과 같은 관계가 있다. 표본에 대한 모집단의 확률적 근거(연역적 추론)

표본의 분포에 대한 추리 통계적 근거

특정 표본으로부터 모집단에 대해 알아내는 방법을 알기 전에 주어진 모집단에서 표본을 추출 하는 것이 어떤 불확실성을 가질 수 있는지 이해해야 한다. 다른 책에서 자주 다루고 있는 일반적인 통계에 대해서는 깊이 언급하지 않을 것이다. 통계에 대 한 지식을 재점검하는 것보다 앞으로 다룰 주제를 더 깊이 이해할 수 있도록 도와주는 데 의미가 있기 때문이다. 먼저 통계에서의 확률에 대해 살펴보자.

1장 머신러닝 복습하기

41


1.4.1 확률 어떤 사건의 확률 E 는 항상 0과 1 사이의 수로 정의된다. 이때 0은 사건 E 가 절대로 발생하지 않는다는 것을 의미하고 1은 사건이 확실히 발생하는 것을 의미한다. 보통 확률은 부동소수점수 로 표현하지만 0%에서 100% 사이의 백분율로 나타낼 수도 있다. 예를 들어 확률 0.35를 35% 로 표시할 수 있다(0.35 × 100 = 35%). 0보다 작거나 100보다 큰 백분율은 존재할 수 없다. 확률 측정에 대한 고전적인 예제는 정상적인 동전을 던졌을 때 앞면이 나오거나 뒷면이 나오는 횟수를 관찰하는 것이다(각 면이 0.5의 확률). 표본공간은 시도한 경우에 대한 모든 가능한 결 과를 나타내기 때문에 확률은 항상 1이다. 던져진 동전의 두 가지 결과인 앞면과 뒷면에 대해 서도 표본공간의 총 확률은 항상 1을 만족해야 하기 때문에 각각 0.5의 확률을 가진다. 사건의 확률은 다음과 같이 표현할 수 있다.

P (E ) = 0.5 그리고 이렇게 읽을 수 있다. 사건 E 의 확률은 0.5다.

확률과 승산 통계나 머신러닝을 처음 접하는 실무자는 확률과 승산 odds 을 혼동한다. 먼저 이 개념을 분명히 하자. 사건 E 에 대한 확률은 다음과 같이 정의된다.

P (E ) = (E가 발생하는 경우의 수) / (전체 경우의 수) 카드 52장에서 4장 존재하는 에이스 카드를 가져오는 경우는 다음과 같다.

4/52 = 0.077 승산은 다음과 같이 정의된다. (E가 발생하는 경우의 수) : (E가 발생하지 않는 경우의 수) 이제 에이스 카드를 선택하는 승산은 다음과 같이 계산한다.

4 : (52 - 4 ) = 1/12 = 0.0833333... 이 두 가지 개념을 구별하는 가장 큰 차이점은 분모다.

42

자바를 활용한 딥러닝


확률은 심층 신경망의 두 가지 주요 기능인 특징 추출과 분류에서 중요한 역할을 하기 때문 에 신경망과 딥러닝에서 필수적이다. 통계에 대해 더 자세히 알고 싶다면 보슬로와 워터스의 『Statistics in a Nutshell: A Desktop Quick Reference』(오라일리, 2009 )를 읽어보라.

확률에 대한 추가적인 정의 : 베이즈주의와 빈도주의 확률에는 베이즈주의 Bayesianism 와 빈도주의 Frequentism 라는 두 가지 다른 접근 방식이 있다. 기본적인 차이점은 확률이 정의되는 방법이다. 빈도주의에서 확률은 단지 반복해서 측정하는 것을 의미한다. 무언가를 측정할 때 장비 등에 의 해 약간의 차이가 발생할 수 있다. 하지만 매우 여러 번 측정을 하면 측정된 값의 빈도는 그 값이 나타날 확률을 나타내게 된다. 베이즈주의에서 확률은 상태에 대한 확실성 측면으로 확장된다. 확률은 측정된 결과가 무엇인지 지식을 제공하고 사건에 대한 지식이 근본적으로 확률과 연관된다. 빈도주의자는 어떤 변수에 대해 추정을 하기 전에 수없이 많은 실험을 반복한다. 반면 베이즈주 의자는 변수에 대한 ‘믿음 belief ’(수학적 용어로 ‘분포’)을 이용하고 새로운 정보가 입력되었을 때 그 믿음을 업데이트한다.

1.4.2 조건부확률 기존의 다른 사건을 기반으로 어떤 사건에 대한 확률을 알고 싶을 때 조건부확률을 이용하고 다음과 같이 표현한다.

P (E | F ) E 는 확률을 알고자 하는 사건이고 F 는 이미 발생한 사건이다. 예를 들어 건강한 심장 박동을 가진 사람이 병원 중환자실에서 사망할 확률이 얼마나 낮은지는 다음과 같이 표현한다.

P (중환자실 사망 수 | 낮은 심장 박동 횟수 ) > P (중환자실 사망 수 | 건강한 심장 박동 횟수 ) 두 번째 사건인 F 를 ‘조건’으로 부르기도 한다. 조건부확률은 머신러닝과 딥러닝에서 여러 가

1장 머신러닝 복습하기

43


지 사건이 언제 어떻게 상호작용하는지 설명할 때 매우 중요하다. 또한 머신러닝에서 학습을 통한 분류기를 만들 때도 중요하게 쓰인다.

P (E | F ) 분류기에서 E 는 레이블이고 F 는 예측하는 개체의 여러 가지 속성이다. 앞의 예로 보면 각 환 자의 중환자실에서의 여러 속성값(F )에 대해 사망률(E )을 예측하는 것이다.

베이즈 정리 조건부확률의 일반적인 애플리케이션 중 한 가지는 베이즈 정리(베이즈 공식)다. 의학 분야에 서는 특정한 질병 검사에서 양성 반응을 보인 환자가 실제로 질병을 가지고 있을 확률을 구할 때 사용한다. 어떤 두 사건 A 와 B 에 대한 베이즈 공식은 다음과 같다.

P( A | B) =

P ( B | A) P ( A) P( B)

1.4.3 사후확률 베이즈 통계에서는 어떤 결과가 발생했을 때 어떤 원인이 있었을 것이라고 예상되는 확률을 사 후확률이라고 한다. 임의의 사건에 대한 사후확률은 어떤 증거가 나타났을 때 새롭게 부여되 는 조건부확률이라고 할 수 있다. 사후확률분포는 무작위 변수로 실험된 증거들에 대한 미지의 조건부확률분포로 정의된다. 이 개념을 활용하여 소프트맥스 활성화함수 activation function 를 통해 원시 입력값을 사후확률로 변환하는 것을 이 장 뒷부분에서 확인할 것이다.

1.4.4 분포 확률분포는 임의 변수의 확률론적 구조에 대한 설명이다. 통계에서는 데이터에 대해 추론할 때 이 데이터가 어떻게 분포되어 있는지 가정한다. 이때 분포에서 관측값의 빈도가 어떠한지와 각 값을 점으로 어떻게 나타낼지 표현하려면 공식이 필요하다. 가장 잘 알려진 분포는 정규분포 (가우스 분포, 종 커브)다. 데이터셋이 분포에 매우 잘 맞는다면 이론적인 분포를 기반으로 가

44

자바를 활용한 딥러닝


정을 하고 데이터를 사용할 수 있다. 따라서 데이터를 분포에 적합하게 맞추는 것이 유용하다. 분포는 연속과 이산으로 분류된다. 이산분포에서는 데이터가 어떤 특정한 값만 취할 수 있고 연속분포에서는 범위 안의 모든 값을 가질 수 있다. 연속분포의 예로 정규분포가 있고, 이산분 포의 예로 이항분포가 있다. 정규분포에서는 무작위로 추출된 표본들의 표본추출분포(예를 들면 표본평균)가 특정한 조건 에서 정규분포를 따른다는 것을 가정할 수 있다. 정규분포(그림 1-5 ) 또는 가우스 분포는 18 세기의 수학자이자 물리학자인 칼 가우스의 이름을 따서 명명되었다. 평균과 표준편차로 정의 하며 일반적으로 모든 변형에 대해 동일한 모양을 가진다. 그림 1-5 정규분포의 예

정규분포

1장 머신러닝 복습하기

45


머신러닝과 관련된 또 다른 분포로 다음과 같은 것들이 있다. 이항분포

역가우스 분포

로그 정규분포

머신러닝에서 학습 데이터의 분포는 모델링할 때 데이터를 어떻게 벡터화할 것인지 결정하는 데 유용하게 쓰인다.

중심 극한 정리 만약 표본 크기가 충분히 크다면 표본평균의 표본분포는 정규분포와 유사하다. 이는 수집된 표 본으로부터 도출되는 모집단의 분포와 무관하게 유효하다. 이 사실을 바탕으로 평균의 대략적인 정규성에 기반한 여러 테스트를 통해 통계적인 추론을 할 수 있다. 이때 표본을 추출한 모집단이 정규분포인지는 문제가 되지 않는다. 컴퓨터 과학에서는 비정규 모집단 nonnormal population 에서 알고리즘이 특정 크기의 표본을 반복적 으로 추출하는 경우가 있는데 표본 모집단의 히스토그램을 정규분포에 그리면 그 내용을 확인할 수 있다.

롱테일 분포(지프의 법칙, 멱함수, 파레토 분포와 같은)는 고빈도의 모집단 뒤를 상대적으 로 낮은 저빈도의 모집단이 따르는 형태다. 이 분포는 1950년대에 브누아 망델브로에 의해 발견되었으며 이후에 크리스 앤더슨의 『The Long Tail: Why the Future of Business is

Selling Less of More』를 통해 널리 알려졌다. 예를 들어 어떤 가게에서 판매하는 상품 순위를 매기면 몇몇 상품은 유난히 인기 있는데 대부 분의 많은 상품은 매우 소량만 판매된다. 이러한 순위-빈도 분포(주로 인기도나 얼마나 많이 팔렸는지)는 대체로 멱함수로 표현되고 롱테일 분포의 일종으로 볼 수 있다. 이러한 롱테일 분포는 다음과 같은 상황에서 나타난다. 지진 피해

지진의 규모가 커짐에 따라 피해의 정도도 크게 증가한다. 수확량

모델은 평균을 중심으로 조정되는 경향이 있지만 기록된 결과의 범위를 넘어서는 사건이 발생하기도 한다.

46

자바를 활용한 딥러닝


중환자실 방문 후 사망자 예측

사망에 영향을 미치는 원인에는 중환자실 내부에서 발생한 일보다 바깥에서 발생한 사건이 중요할 수 있다.

대부분의 통계 모델은 많은 양의 데이터에서 추론하는 방식을 이용하기 때문에 이러한 문제들 은 분류 문제와 관련이 있다. 만약 어떤 특별한 사건이 분포의 꼬리 부분에서 발생하고 이러한 내용이 학습 데이터에 반영되지 않는다면 모델은 예측 불가능하게 동작할 수도 있다. 이러한 현상은 신경망과 같은 비선형 모델에서 특히 심화될 수 있으며 ‘내 표본/외 표본’ 문제의 특별한 예 중 하나다. 불균형한 학습 데이터에 대해 잘 동작하는 모델을 만드는 노련한 머신러닝 전문 가더라도 큰 모집단을 잘 일반화하기는 힘들다. 롱테일 분포는 표준편차의 다섯 배만큼 발생할 가능성이 있는 이벤트에 대해 다루고 있다. 학 습 데이터에 과대적합 overfitting (오버피팅)되지 않도록 학습 데이터 내의 이벤트를 적절하게 표 현하는 데 유의해야 한다. 1.5.4절 ‘과대적합과 과소적합’에서 과대적합을 다루고 4장에서 튜 닝 방법을 다룬다.

1.4.5 표본과 모집단 비교 모집단 population 은 실험에서 연구하거나 모델링하고자 하는 전체 집합이다. 예를 들어 ‘테네시 주에 사는 모든 자바 프로그래머’를 모집단으로 정할 수도 있다. 표본 sample 은 편향되지 않고 전체 모집단의 정확한 분포를 나타낼 수 있는 부분집합이다. 모집 단을 표본추출하는 방식에 따라 표본분포가 왜곡될 수 있다.

1.4.6 재표본추출 방법 부트스트랩 bootstrapping 과 교차검증 cross-validation 은 머신러닝 실무자들이 자주 사용하는 통계학적 재표본추출 방법이다. 머신러닝에서의 부트스트랩은 표본으로부터 새로운 표본을 생성해 클래 스당 표본 수의 균형이 맞는 새로운 표본을 만드는 방법이다. 매우 불균형한 클래스별 표본 수 를 가지는 데이터셋을 모델링할 때 유용하다. 교차검증(또는 회전 평가 rotation estimation )은 모델이 학습 데이터에서 얼마나 잘 일반화되었는지 평가하는 방법이다. 학습 데이터를 N 개의 조각으로 나눠 학습 그룹과 테스트 그룹으로 분리한

1장 머신러닝 복습하기

47


다. 학습 그룹에 속한 데이터 조각을 이용하여 모델을 학습하고 테스트 데이터로 검증한다. 각 그룹에 속한 조각을 바꾸어가며 이러한 작업을 반복한다. 데이터 분할 개수는 정해진 것은 없 지만 일반적으로 10개를 사용한다. 또한 학습 과정 동안에는 검증용 데이터로 사용되는 부분 을 분리하는 것이 보통이다.

1.4.7 선택편향 선택편향은 적절한 무작위화 없이 추출되었거나 모델링하고자 하는 모집단을 대표할 수 없는 치우친 표본들이 사용되었을 때 발생한다. 재표본추출 시 이러한 편향된 데이터가 모델에 입력 되어 성능을 떨어뜨리지 않도록 유의해야 한다.

1.4.8 가능도 사건이 발생할 가능성은 있지만 아직 구체적인 수치적 확률이 없을 때 가능도 likelihood (우도)를 사용한다. 일반적으로 이 용어를 사용할 때 사건은 합리적인 발생 확률을 가지지만 여전히 발 생하지 않을 가능성은 남아 있다. 또한 사건에 영향을 미칠 수 있지만 아직 관찰되지 않은 요인 이 남아 있을 수도 있다. 확률과 동의어로 사용되기도 한다.

1.5 머신러닝은 어떻게 작동하는가? 1.3.8절 ‘연립방정식 풀기’에서는 Ax = b 를 풀어서 선형 방정식을 해결하는 방법을 소개했다. 근본적으로 머신러닝은 이러한 식에서 최적화를 통해 오차를 최소화하는 알고리즘을 기반으로 한다. 최적화는 x 열 벡터(파라미터 벡터)의 숫자를 변경해가며 출력값이 실젯값에 가장 근접하도록 하는 적합한 값들의 집합을 찾는 것이다. 가중치 행렬의 각 값은 손실함수가 네트워크에 의해 생성된 오찻값(실제 출력값, 앞의 식에서 b 열 벡터)을 모두 계산한 후 조정된다. 오차 행렬은 각 가중치로부터 영향을 받는 손실값으로 이루어져 있으며 가중치 자체에 다시 곱해진다.

1.5.7절 ‘경사 하강법’에서는 머신러닝 최적화에서 가장 자주 사용되는 기법인 경사 하강법

48

자바를 활용한 딥러닝


Gradient Descent, SGD

을 배우고 이러한 개념이 다른 최적화 알고리즘에 어떻게 적용되는지 설명할

것이다. 또한 정규화와 학습률 같은 하이퍼파라미터의 기본적인 내용에 대해서도 설명한다.

1.5.1 회귀 회귀는 실제 출력값을 예측하는 함수와 이미 알고 있는 독립변수 값으로 종속변수를 추정한다. 가장 일반적인 타입은 이전의 선형 방정식 시스템 모델링에서 설명한 개념을 기반으로 하는 선 형회귀다. 선형회귀는 주어진 x 값을 기반으로 정확한 y 값을 예측할 수 있도록 x 와 y 의 관계를 설명하는 함수를 제시한다.

모델 설정하기 선형회귀 모델에서의 예측은 파라미터 벡터 x 로부터 얻어진 계수와 입력 벡터로부터 생성된 특징값의 선형 조합으로 다음과 같이 나타낼 수 있다.

y = a + Bx a 는 식의 y 절편, B 는 입력된 특징값, x 는 파라미터 벡터다. 다음과 같이 확장하여 쓸 수 있다.

y = a + b0 * x0 + b1 * x1 +  + bn * xn 선형회귀로 풀 수 있는 간단한 문제로 출퇴근길의 거리에 따른 월별 주유금액 예측 문제를 생 각해보자. 이 문제에서 ‘얼마나 지불할 것인가?’는 ‘얼마나 운전을 멀리까지 하는가?’에 대한 함수로 표현된다. 주유금액은 종속변수고 출퇴근길의 거리는 독립변수로 이 두 가지 양을 측정 하고 함수로 정의할 때 다음과 같이 표현할 수 있다. 비용 = f ( 거리 )

이 식을 이용해 이동거리에 따른 소비하는 주유금액을 예측할 수 있으며, 모델 f 를 이용해 거리 를 독립변수로, 비용을 종속변수로 사용할 수 있다. 또 다른 선형회귀 모델링 예제로는 다음과 같은 것들이 있다. 키에 따른 몸무게 예측

집의 넓이에 따른 집값 예측

1장 머신러닝 복습하기

49


선형회귀 시각화 [그림 1-6]에서 보여주는 것처럼 선형회귀는 데이터 산점도에서 최대한 많은 점이 가까이에 있 는 선 하나로 시각화할 수 있다. 그림 1-6 선형회귀 플롯

적합 fitting (피팅)은 측정되거나 실젯값에 가장 가까운 y 값을 생산하는 함수 f ( x )로 정의한다.

y = f ( x )로 생성된 선은 좌표평면에서 종속변수와 독립변수 값 쌍으로 이루어진 점들에 가깝게 위치한다.

선형회귀 모델과 관련된 것 이 함수를 앞에서 언급한 Ax = b 와 연결해서 생각해보자. A 는 모델링하려는 모든 입력변수의 특징값(앞의 예제에서 키 또는 집의 넓이)으로, 각 입력 데이터는 A 행렬의 행 하나로 나타낸 다. 열 벡터 b 는 A 행렬의 모든 입력 데이터에 대한 결괏값이다. 오차 함수와 최적화 기법(확 률적 경사 하강법과 같은)을 이용해서 예측값과 실젯값의 차이를 가장 최소화하는 x 파라미터 셋을 찾을 수 있다. 확률적 경사 하강법을 이용해서 파라미터 벡터 x 를 구할 때 사용하는 세 가지 구성요소가 있다. 데이터에 대한 가설

위 예제에서는 파라미터 벡터 x 와 입력된 특징값의 내적

50

자바를 활용한 딥러닝


비용함수

예측에 대한 제곱오차(예측값과 실젯값의 차) 업데이트 함수

제곱오차 손실함수, 즉 비용함수의 미분

선형회귀로 직선 문제를, 비선형 곡선적합으로 나머지 모든 문제를 해결할 수 있다. 이때 x 에 의한 곡선은 x 에 대해 1보다 큰 지숫값을 가진다. 이것이 머신러닝에서 때때로 언급되는 곡선 적합 curve fitting 이다. 절대적합은 산점도 상의 모든 점에 선이 꼭 맞도록 하는 방법이지만 얄궂 게도 대체로 매우 좋지 않은 결과를 가져온다. 모델이 학습 데이터에 너무 완벽하게 맞춰서 학 습되었고 이전에 언급한 것처럼 일반화되어 있지 않은 또 다른 데이터에 대해서는 예측 능력이 거의 없기 때문이다.

1.5.2 분류 분류는 입력된 특징값을 기반으로 클래스를 구분하여 출력하도록 모델링하는 기법이다. 회귀 가 ‘값이 얼마인가’를 결과로 준다면 분류는 ‘어떤 종류인가’를 결과로 준다고 할 수 있다. 그래 서 종속변수 y 는 수치형이 아닌 범주형이다. 가장 일반적인 분류 기법으로 이진 분류기가 있다. 오직 두 가지 레이블(각각 0과 1인 두 가지 클래스)로 구분할 수 있는 결과를 가지며 부동소수점수 형태로 표현하여 절대적인 분류가 아 닌 어느 정도 속하는지 나타낼 수도 있다. 이런 경우 클래스 두 개를 구분할 수 있는 임곗값(보 통 0.5 )을 정하게 된다. 이러한 클래스를 구분하는 기준에 따라 가끔 양의 분류 또는 음의 분류 로 언급되기도 한다. 자세한 내용은 1.7절 ‘모델 평가하기’에서 설명한다. 이진 분류의 예는 다음과 같다. 병이 있는지 없는지 분류하기

이메일이 스팸인지 아닌지 분류하기

거래가 정상인지 비정상인지 분류하기

(둘 이상) N 개의 레이블을 구분할 수 있는 모델을 만들 수도 있다. 이때 입력 데이터별로 각 레이블에 대해 점수가 매겨지게 되고 가장 높은 값을 가지는 레이블이 결괏값으로 나오게 된 다. 이 내용은 다중 출력값을 가지는 신경망과 단일 출력값을 가지는 신경망(이진 분류)에서

1장 머신러닝 복습하기

51


더욱 자세히 논의할 것이다. 그리고 이 장에서 로지스틱 회귀에 대해 언급할 때 분류에 대해 한 번 더 살펴보고 이후 신경망의 전체 구조에 대해 깊이 알아볼 것이다. NOTE_ 추천

추천은 유사한 다른 사용자나 이전에 보았던 아이템을 기반으로 또 다른 새로운 아이템을 사용자에게 제 안하는 과정이다. 추천 알고리즘에서 가장 유명한 것 중 하나는 Amazon.com에서 사용하는 협업 필터링 (Collaborative Filtering, CF )이다.

1.5.3 군집화 군집화 clustering (클러스터링)는 유사한 아이템이 서로 가까이 위치할 수 있도록 거리를 측정하 고 이동시키는 비지도학습법이다. 모든 과정이 끝났을 때 각 아이템은 가장 가까운 n 개의 중심 점 그룹에 속하도록 분류된다. K-평균 군집화는 머신러닝에서 유명한 기법이다.

1.5.4 과대적합과 과소적합 앞서 언급한 것처럼 최적화 알고리즘은 먼저 데이터를 가장 유사하게 표현할 수 있는 선을 사 용하여 과소적합 underfitting (언더피팅)을 해결하는 데 집중하게 된다. [그림 1-7]에서 보여주는 것처럼 곡선으로 분포된 데이터를 가로지르는 직선을 구하는 것이 과소적합의 예다. 그림 1-7 머신러닝에서 과대적합과 과소적합

과소적합

52

자바를 활용한 딥러닝

적합

과대적합


선이 데이터에 너무 적합하면 과대적합이라는 반대의 문제가 생긴다. 물론 과소적합 해결을 우 선시해야 하지만 머신러닝에서는 데이터에 선이 너무 과대적합되지 않도록 하는 데도 많은 노 력을 소비한다. 모델이 데이터셋에 과대적합되었을 때 학습 데이터에 대한 오차율은 매우 낮 아지지만 우리가 정말 관심을 가지고 있는 모집단 전체에 대해서는 잘 일반화되지 않아 결과가 좋지 않게 된다. 또한 과대적합에 대해 고려할 때 데이터의 분포에 대해서도 생각해야 한다. 선을 그릴 때 사용 하는 학습 데이터는 커다란 전체 데이터의 일부분일 뿐이며 실제로 예측력을 높이려면 더 큰 전체 데이터에 대해서도 잘 맞는 선을 그려야 한다. 그러므로 표본이 전체 데이터를 매우 느슨 하게 대표하고 있다고 추정해야 한다.

1.5.5 최적화 앞에서 설명한 데이터를 더욱더 잘 예측하기 위해 가중치를 조정하는 과정을 파라미터 최적화 라고 한다. 이러한 과정을 과학적인 방법으로 생각할 수 있다. 먼저 가설을 공식화하고, 실젯값 에 대해 테스트하고, 실젯값을 더 잘 설명할 수 있도록 가설을 바꾸거나 재정의하는 것을 반복 하는 것이다. 모든 가중치셋은 입력이 의미하는 바에 대한 특정 가설을 나타낸다. 즉, 그들이 속한 레이블과 어떠한 관계가 있는지 나타내는 것으로 네트워크 상의 입력과 예측하고자 하는 대상 레이블 간 의 상관관계를 나타낸다. 가능한 모든 가중치와 그 조합은 주어진 문제의 가설 공간으로 설명 할 수 있다. 가장 적합한 가설을 공식화하는 것은 이 가설 공간을 탐색하는 문제며 오차와 최적 화 알고리즘을 사용한다. 입력변수가 많을수록 문제에서 탐색해야 할 공간은 더 커지기 때문에 학습에서 많은 부분을 차지하는 일은 어떤 변수를 사용하고 어떤 변수를 무시할지 결정하는 것 이다. NOTE_ 결정경계와 초평면

결정경계(decision boundary ) 에 대해 말할 때는 선형 모델링에서 파라미터 벡터에 의해 생성되는 n 차원 초평면(hyperplane ) 에 대해 이야기하게 된다.

1장 머신러닝 복습하기

53


비용(실제 데이터를 나타내는 점과 선과의 거리)을 측정해서 선을 데이터에 적합시키는 것이 머신러닝의 핵심이다. 선은 데이터에 거의 일치해야 하며, 각 점에서부터 선까지의 거리의 합 은 최소화되어야 한다. 즉, 어떤 점 x 에서의 선과 실젯값 y 와의 거리의 합을 최소화한다. 3차원 공간에서는 오차를 언덕과 골짜기로 생각할 수 있고 이러한 탐색 알고리즘을 앞이 보이지 않고 오직 경사도만 느끼며 걷는 사람으로 표현할 수 있다. 경사 하강법과 같은 최적화 알고리즘은 그 사람에게 내리막길의 방향만 알려주게 된다. 가중치 탐색의 목표는 [그림 1-4]와 같은 식에서 예측값( b̂ , 또는 A 와 x 의 내적)과 테스트 데 이터의 실젯값인 b 와의 차이를 최소화시키는 것이다. 네트워크의 정확도는 입력과 파라미터에 대한 함수며 얼마나 빨리 정확한 값을 찾게 되는지는 하이퍼파라미터에 대한 함수다. NOTE_ 하이퍼파라미터

머신러닝에는 모델 파라미터가 존재하고 이를 통해 네트워크가 더 빠르게 잘 학습되도록 만들 수 있다. 이러 한 튜닝 파라미터를 하이퍼파라미터 (hyperparameter ) 라고 부르며, 학습 알고리즘을 이용하여 훈련 중에 최적화함수나 모델 선택을 제어하는 역할을 한다.

NOTE_ 수렴

수렴 (convergence ) 은 최적화 알고리즘이 학습 데이터에서 오찻값이 가장 작은 파라미터를 찾는 과정이다. 최적화 알고리즘은 가능한 여러 다른 파라미터값을 시도한 후 가장 좋은 해에 수렴한다.

다음은 머신러닝 최적화에서 중요한 세 가지 기능이다. 파라미터

입력을 네트워크가 분류를 위한 추론에 이용할 수 있도록 변환한다. 손실함수

각 단계에서 얼마나 잘 분류했는지(오차를 최소화했는지) 측정한다. 최적화함수

오차를 최소화하는 방향으로 이끈다.

이제 볼록 최적화 convex optimization 라는 최적화의 한 분류에 대해 살펴보자.

54

자바를 활용한 딥러닝


1.5.6 볼록 최적화 볼록 최적화에서 학습 알고리즘은 볼록 비용함수를 다룬다. x 축이 단일 가중치를 나타내고 y 축 이 해당 비용일 때 비용은 x 축의 어느 한 지점에서 0으로 가장 작고 두 방향으로 뻗어가며 기하 급수적으로 증가한다. [그림 1-8]은 이러한 비용함수를 거꾸로 표현한 것이다. 그림 1-8 볼록함수 시각화

파라미터와 데이터를 연결하는 또 다른 방법은 최대 가능도 추정 maximum likelihood estimation, MLE 이 다. 최대 가능도 추정은 가로축이 파라미터고 세로축이 측정된 가능도며 양 끝이 아래쪽으로 향한 포물선으로 그려진다. 포물선 상의 각 점은 주어진 파라미터에 따른 데이터의 가능도다. 최대 가능도 추정은 주어진 데이터를 가장 가능성 있게 표현하는 파라미터 집합을 찾을 때까지 반복적으로 파라미터를 탐색한다. 어떤 의미에서 최대 가능도와 최소 비용은 동전의 양면과 같다. 오차에 대한 두 가중치의 비용 함수를 계산하여 3차원 공간에 표현하면 각 가장자리는 고정되어 있고 중간이 아래로 볼록한 그릇 모양의 평면으로 나타난다. 이 볼록한 곡선의 기울기를 이용하여 경사 하강법에서와 같이 알고리즘의 다음 단계를 어느 방향으로 수행할지에 대한 힌트를 얻을 수 있다.

1장 머신러닝 복습하기

55


1.5.7 경사 하강법 경사 하강법에서 파라미터/가중치의 함수인 네트워크의 예측 성능은 풍경처럼 표현될 수 있 다. 언덕은 많은 예측 오차가 있는 부분을 나타내고 계곡은 오차가 작은 부분을 나타낸다. 최초 가중치를 설정할 때 그중 한 지점을 선택하게 되는데 기존의 도메인 지식을 바탕으로 선택할 수도 있다. 예를 들면 꽃의 품종을 분류하는 네트워크를 학습할 때 꽃잎의 길이는 중요하지만 색깔은 그렇지 않다는 것을 알고 있을 때 이러한 점을 반영해서 시작점을 설정할 수 있다. 또는 네트워크가 모든 작업을 수행하기 원하는 경우 초기 가중치를 임의로 선택하기도 한다. 이 작업의 최종 목표는 오차가 가장 작은 영역인 아래쪽으로 가능한 한 빠르게 이동하는 것이 다. 경사 하강법과 같은 최적화 알고리즘은 각 가중치와 관련된 기울기를 알 수 있고 비용을 최 소화하는 방향으로 안내할 수 있다. 경사 하강법은 기울기, 즉 가중치를 변경했을 때 오차의 변 화를 측정하고 다음 단계에 계곡의 아래쪽으로 이동하도록 한다. 이때 기울기는 손실함수의 미 분값으로 계산된다. 즉, [그림 1-9]와 같이 최적화 알고리즘에서 다음에 나아가야 할 방향을 제 시하게 된다. 그림 1-9 경사 하강법에서 전역 최솟값을 찾는 방향으로 가중치를 이동

경사도

비용

전역적 최솟값

가중치

미분은 함수의 변화율을 나타낸다. 볼록 최적화에서는 미분하여 0이 되는 지점을 찾게 되고 이 지점을 정지점 또는 최소점이라고 부른다. 비용함수가 반전된 경우를 제외하고 일반적으로 최 적화에서 함수를 최적화한다는 것은 함수의 최솟값을 찾는 것을 의미한다.

56

자바를 활용한 딥러닝


경사도란? 경사도는 여러 차원의 함수 f 를 한 차원에 대해 미분한 값을 일반화한 것이며 함수 f 에 대한 n 개 부분 미분의 벡터로 표현된다. 이는 함수가 가장 가파르게 증가하는 방향을 나타내고 그 크기는 증가하는 기울기를 나타낸다는 점에서 최적화에서 유용하다. 경사 하강법은 미적분학에서 익숙한 미분을 사용해서 손실함수의 기울기를 계산한다. 2차원 손 실함수에서 미분은 포물선 상에 있는 임의의 점에 대한 접선이 된다. 즉, x 의 변화에 따른 y 의 변 화량이다. 삼각법에서 알고 있듯이 접선은 직각 삼각형에서 한 면(수평 변화량)에 대한 다른 한 면(수직 변화량)의 비율이다. 곡선(의 정의 중 하나)은 끊임없이 기울기가 변하는 선이다. 곡선에서 각 지점의 기울기는 그 점 의 접선으로 나타낸다. 기울기는 사실 두 점으로부터 생길 수 있는데, 곡선에서 단 한 점에 대한 기울기는 어떻게 구할 수 있을까? 아주 가까운 거리의 두 점 사이의 기울기를 계산하고 이 거리 가 0에 가까워질 때까지 계속 두 점의 거리를 줄여서 미분한다. 미적분학에서는 이것이 한계다.

손실을 측정하고 손실이 적어지는 방향으로 한 단계씩 가중치를 변경하는 과정은 더 이상 가중 치가 변경될 수 없는 최소 지점에 도착할 때까지 반복된다. 이 과정은 가장 높은 정확도를 가지 는 지점에서 멈추게 된다. 일반적으로 선형 모델링에서 사용하는 볼록 손실함수를 이용하면 손 실함수는 한 개의 전역 최솟값을 가진다. 선형 모델링에서 파라미터 벡터 x 를 찾는 주요한 세 가지 구성요소가 있다. 데이터에 대한 가설 : 모델에서 예측하는 데 사용하는 식

비용함수 : 손실함수라고도 하며 예를 들면 제곱오차 합

업데이트함수 : 손실함수의 미분

가설은 학습된 파라미터 x 와 입력값(특징)의 조합으로, 분류값이나 수치값을 결과로 가져온 다. 비용함수는 손실함수의 전역 최솟값에서 얼마나 오차가 있는지 보여주며 손실함수를 미분 하여 파라미터 벡터 x 를 변경하는 업데이트 함수로 이용한다. 손실함수에 미분을 취한 결과는 손실 곡선의 0점에 더 가까워지려면 x 의 각 파라미터가 얼마 나 조정되어야 할지를 나타낸다. 이 장 뒷부분에서 선형회귀와 로지스틱 회귀에서 어떻게 동작 하는지 살펴보며 이 식에 대해 더 자세히 알아볼 것이다.

1장 머신러닝 복습하기

57


하지만 비선형 문제에서는 항상 깔끔한 손실 곡선을 얻을 수는 없다. 이러한 비선형 가상 환경 의 문제는 몇 개의 계곡이 존재할 수 있으며 가중치를 변경해가는 경사 하강법 메커니즘은 현 재 가장 낮은 지점에 도착했는지, 아니면 높은 계곡 안에서 가장 낮은 지점인지 알 수 없다는 것이다. 모든 계곡의 최하점은 지역 최소 지점이고 가장 낮은 계곡의 가장 낮은 지점은 전역 최 소 지점이다. 만약 경사 하강법으로 지역 최소 지점에 도착했다면 사실은 함정에 빠진 것이고 이는 이 알고리즘의 약점이다. 6장에서 하이퍼파라미터와 학습률에 대해 배우며 이를 극복하 는 방법을 알아볼 것이다. 경사 하강법의 두 번째 문제는 정규화되지 않은 특징들을 만났을 때 발생한다. ‘정규화되지 않 은 특징들’은 서로 다른 스케일로 측정된 값들을 의미한다. 만약 한 축은 수백만으로 측정되고 다른 축이 소수로 측정된다면 경사 하강법은 오차를 최소화하는 가장 가파른 경사를 찾기 매우 어려울 것이다. NOTE_ 정규화 다루기

8장에서 벡터화와 관련하여 정규화를 더 자세히 살펴보고 이 문제를 더 잘 해결할 수 있는 방법을 알아볼 것 이다.

1.5.8 확률적 경사 하강법 경사 하강법에서는 기울기를 계산하고 파라미터 벡터를 업데이트하기 전에 모든 학습 데이터 에 대해 전체적인 손실을 계산했다. 확률적 경사 하강법에서는 모든 학습 데이터 이후에 기울 기를 계산하고 파라미터 벡터를 업데이트한다. 이러한 방법은 학습 속도를 높이는 것으로 나타 났다. 뒤에서 더 자세히 이야기할 것이다. 확률적 경사 하강법은 경사 하강법의 전체 배치에 대 한 근사치다.

미니배치 학습과 확률적 경사 하강법 확률적 경사 하강법의 또 다른 변형은 기울기를 계산하는 데 하나 이상의 학습 데이터를 사용 하지만 전체 학습 데이터는 사용하지 않는 것이다. 이를 확률적 경사 하강법을 이용한 미니배 치 학습이라고 하며 학습 데이터를 한 개 사용하는 것보다 더 좋은 성능을 보여준다. 확률적 경

58

자바를 활용한 딥러닝


CHAPTER

2

신경망과 딥러닝의 기초

허공에는 너의 발, 땅에는 너의 머리 마구 혼란스럽게 돌아봐 너의 생각은 무너지고 그 안에는 아무것도 없어 그리고 넌 스스로 묻겠지 내 정신은 어디에 있지? _그룹 픽시스, < Where is My Mind?>

2.1 신경망 신경망은 동물의 두뇌처럼 중앙 제어 장치 없이 단순한 유닛들이 모여 병렬로 작동하는 특성을 가진 컴퓨터 모델이다. 유닛 사이의 가중치는 신경망에서 정기적으로 정보를 저장하는 주요 수 단이고 이러한 가중치를 업데이트하는 것은 신경망이 새로운 정보를 학습하는 주요한 방법이다.

1장에서는 1차 방정식 Ax = b에 대한 집합 모델링에 대해 알아봤다. 신경망의 맥락에서 A 행 렬은 입력 데이터며, b 열 벡터는 A 행렬의 각 행에 대한 레이블 또는 결과다. 신경망에서의 연 결 가중치는 x (파라미터 벡터)가 된다. 신경망의 행동은 신경망의 구조에 의해 형성된다. 신경망의 구조는 다음과 같은 부분으로 이뤄 져 있다.

2장 신경망과 딥러닝의 기초

69


뉴런 수

계층 수

계층 간 연결 타입

순방향 다층 신경망 feed-forward multilayer neural networks 은 가장 이해하기 쉬운 신경망으로 알려졌다. 이 신경망은 하나의 입력 계층과 하나 이상의 은닉 계층, 하나의 출력 계층으로 이루어져 있다. 각 계층은 서로 다른 뉴런 수를 가질 수 있고 인접한 계층에 완전히 연결되어 있다. 계층 내에 서 뉴런 간의 연결은 [그림 2-1]에 표현한 것처럼 단방향으로 진행하는 형태다. 그림 2-1 다층 신경망 도표

입력값

입력 계층

은닉 계층 1

은닉 계층 2

출력 계층

순방향 다층 신경망은 충분한 인공 뉴런이 주어지면 어떤 기능이든 구현할 수 있다. 이는 일반 적으로 역전파 학습 backpropagation learning 이라는 학습 알고리즘에 의해 학습된다. 역전파 학습은 신경망의 연결 가중치에 경사 하강법(1장 참조)을 사용해 신경망의 출력 오차를 최소화한다. NOTE_ 국지적 최솟값과 역전파

역전파는 국지적 최솟값에 제한될 수 있지만, 일반적인 경우 잘 수행된다.

과거에는 역전파 학습이 느리다고 생각했지만 최근 병렬 처리 방식과 GPU의 발전으로 신경망 학계에서 다시 주목받고 있다.

70

자바를 활용한 딥러닝


인간의 정신과 신경망의 공통점에 대해 많은 잘못된 내용이 인터넷이나 책을 통해 거론된다. 이런 잘못된 내용을 무시하고 제대로 인공 신경망을 생물학적 시각에서 분석해보자. NOTE_ 인간의 정신에 대한 기계적인 측면

모든 입력을 하나의 값으로 대응시키는 엄격한 트리를 구성하는 대신 부분적이고 모호한 정보를 보내는 세상 을 반영하는 모델을 만들 수 있다. 이 모델은 확실성보다는 추론을 이끌어내는 방식이다. 신경망의 이러한 측면은 20세기 초에 지배적이었던 ‘정신의 기계적 관점’으로부터의 단절을 의미하는데, 이 관점은 우리 두뇌가 명확한 두 개의 기어 변환처럼 예측한 그대로 동작하는 세상이라고 가정한다. 불완전하 고 모순된 정보를 바탕으로 앞으로 뛰어들어 행동해야 한다고 생각해보자. 이 경우 인간의 뇌는 신경망 동작 과 마찬가지로 확률을 추론한다.

다음 절에서 생물학적인 뉴런을 검토하고 퍼셉트론이라는 근대 신경망의 초기 학문에 대해 알 아본다. 퍼셉트론에 대한 이해를 바탕으로 오늘날의 순방향 다층 퍼셉트론을 지원하는 좀 더 일반화된 인공 뉴런이 어떻게 진화되어왔는지 확인할 수 있을 것이다. 또한 이 장은 더 다양한 심층 신경망 구조를 탐구하는 기초를 제공할 것이다.

2.1.1 생물학적 뉴런 [그림 2-2]와 같은 생물학적 뉴런은 모든 동물 신경계의 기본적인 신경 조직이다. 뉴런은 서로 통신하고 자극이 시냅스 사이를 가로지른다. 자극이 화학물질의 방출을 활성화할 정도로 충분 히 강하면 한 세포에서 다른 세포로 시냅스를 가로질러 전기 화학 자극을 전달한다. 자극의 강 도는 최소 임곗값를 넘어야 하거나 화학물질이 방출되지 않는 수준이어야 한다. [그림 2-2]는 다음과 같은 신경세포의 주요 구성요소를 나타낸 것이다. 소마

수상돌기

축삭

시냅스

뉴런은 많은 수상돌기와 하나의 축삭을 가진 소마(체세포)로 구성된 신경세포다. 하나의 축삭 은 백 개 이상의 뉴런으로 이어질 수 있다. 수상돌기는 체세포에서 발생한 얇은 조직이며, 축삭 은 체세포에서 특별히 세포 확장된 신경 섬유다.

2장 신경망과 딥러닝의 기초

71


그림 2-2 생물학적 뉴런

시냅스

다른 세포에서 연결된 축삭

수상돌기

축삭

세포체(소마)

시냅스

시냅스 시냅스는 축삭과 수상돌기 사이의 접합점이다. 시냅스의 주요 역할은 특정 신호를 뉴런의 축삭 으로부터 다른 뉴런의 수상돌기로 전달하는 역할이다. 신호를 전달하지 못하는 경우는 뉴런에 수상돌기가 없거나 축삭이 없거나 축삭을 다른 축삭에 연결하는 시냅스가 없는 경우다.

수상돌기 수상돌기에는 신경 세포 주위의 덤불 같은 신경망의 소마로부터 파생되는 섬유를 가지고 있다. 수상돌기는 세포가 연결된 인접 뉴런으로부터 신호를 수신할 수 있게 하며 각 수상돌기는 수상 돌기의 무게만큼 증식할 수 있다. 여기에서 증식은 수상돌기에 도입된 신호 화학 물질에 대한 시냅스 신경 전달 물질의 비율 증가 또는 감소를 의미한다.

축삭 소마로부터 확장된 길고 얇은 섬유질을 축삭이라고 한다. 축삭은 수상돌기보다 좀 더 길게 뻗

72

자바를 활용한 딥러닝


어서 1cm (소마의 100배) 정도다. 결과적으로 축삭은 다른 수상돌기에 연결된다. 뉴런은 세 포막의 전압 변화를 이용해 전기 화학 신호를 전달하여 활동 전위를 생성한다. 이 신호는 세포 의 축삭을 따라 이동하고 다른 뉴런과의 시냅스 연결을 활성화한다.

생물학적 뉴런을 통한 정보의 흐름 잠재력을 증가시키는 시냅스를 흥분성 excitatory, 잠재력을 하락시키는 시냅스를 억제성 inhibitory 이라고 한다. 소성 plasticity 은 입력 자극에 대한 연결 강도의 장기적인 변화를 나타낸다. 또한 뉴 런은 시간 경과에 따라 새로운 연결을 형성하고 심지어 이동하는 것으로 나타났다. 이러한 연 결 변화의 메커니즘은 생물학적 뇌에서의 학습 과정을 주도한다.

생물학적 뉴런에서 인공 뉴런으로 동물의 뇌는 정신의 근본적인 부분을 담당하는 것으로 밝혀졌다. 우리는 뇌의 기본 구성을 연 구하고 이해할 수 있었고 연구는 뇌의 기능을 지도화하고 뉴런을 통해 움직이는 신호를 추적하 는 방법을 보여주었다.1 NOTE_ 합성곱 신경망과 포유류의 시각 시스템

4.2절 ‘합성곱 신경망’에서는 합성곱 신경망이라는 딥러닝 신경망에 대해 알아볼 것이다. 합성곱 신경망의 서 로 다른 계층에서의 이미지 표현은 시각적 정보를 뇌에서 처리하는 방법과 비슷하다.1 이 연구는 흥미롭지만 그렇다고 해서 합성곱 신경망이 포유류의 뇌활동과 완전히 유사하다는 이야기는 아니다.

그러나 여전히 이 기능 단위로 분산된 구조가 사고의 기초와 의식을 어떻게 제공하는지 완전히 이해하지는 못한다. NOTE_ 의식이 있는 자리

19세기 후반에서야 동물의 뇌의 기능적 영역에 대한 이해가 이뤄졌기 때문에 18세기에는 뇌에 ‘의식이 머문 다’고 생각했다. 이전 세대는 의식이 심장과 비장에 있다고 생각하기도 했다.

이제 생물학적 뉴런의 기본 원리를 확인했으니 퍼셉트론을 사용해서 뉴런을 모델링하는 첫 번 째 시도를 살펴보자. 1 http://bit.ly/2sOwuo5

2장 신경망과 딥러닝의 기초

73


2.1.2 퍼셉트론 퍼셉트론은 이진 분류에 사용되는 선형 모델이다. 신경망에서 퍼셉트론은 활성화함수로 헤비 사이드 계단함수 Heaviside step function 를 사용하는 인공 뉴런이다. 퍼셉트론의 전신은 1943년에 맥컬러 McCulloch 와 피츠 Pitts 에 의해 개발된 임계 논리 유닛 Threshold Logic Unit, TLU 이다. 퍼셉트론 학 습 알고리즘은 지도학습 알고리즘으로, 임계 논리 유닛과 퍼셉트론 모두 앞서 살펴본 생물학적 뉴런을 바탕으로 만들어졌다.

퍼셉트론의 역사 퍼셉트론은 1957년 코넬 대학교의 항공 학회에서 프랭크 로젠블랫 Frank Rosenblatt 2에 의해 처음 연구되었고, 이후 미국 해군연구소의 지원을 받아 뉴욕타임즈에 발표했다. 발표된 내용의 일부 는 다음과 같다. 해군에서 기대하는 전기 컴퓨터의 초기 모델은 걸을 수 있고 말할 수 있고 볼 수 있으며 쓸 수 있 고 스스로 재생산하고 존재에 대해 고민하는 존재다.

명백하게 이 예언은 시기상조이지만 머신러닝과 AI가 이 예언을 실현해나가는 모습을 지켜보 고 있다. 초기 버전은 소프트웨어 프로그램이 아닌 물리적인 기계로 구현되었지만 이후에는 계 속해서 소프트웨어로 개발되고 있다. 초기 소프트웨어 버전은 IBM 740에 사용되었고 이후에

Mark I 퍼셉트론 머신에서 개발되었다. 또한 맥컬러와 피츠는 임곗값과 가중치 합에 기초하여 1943년 1월에 신경 활동을 분석하는 기 본 개념을 소개했다.3 이러한 개념은 퍼셉트론과 같은 최신 변형 모델을 개발하는 데 중요한 역 할을 했다. NOTE_ 마크 I 퍼셉트론

마크 I 퍼셉트론은 미국 해군에 의해 군사적인 목적의 이미지 인식기로 설계되었다. 마크 I 퍼셉트론은 인공 뉴런이 400 광전지에 연결되었고 가중치는 전위차계(potentiometer )로 구현되었다. 가중치에 대한 업데 이트는 전기 모터에 의해 물리적으로 업데이트되었다.

2 https://en.wikipedia.org/wiki/Frank_Rosenblatt 3 「A logical calculus of the ideas immanent in nervous activity」(McCulloch , Pitts , 1943 ) (http://www.cse.chalmers. se/~coquand/AUTOMATA/mcp.pdf )

74

자바를 활용한 딥러닝


퍼셉트론의 정의 퍼셉트론은 [그림 2-3]처럼 간단한 입력 계층과 출력 계층을 가진 이진 선형 분류기다. 입력 n 개에 연결된 가중치를 모두 더한 다음 정의된 임곗값이 있는 계단함수에 순입력 net input 을 넣는 다. 전형적으로 퍼셉트론에서는 임곗값이 0.5인 헤비사이드 계단함수를 사용한다. 이 함수는 입력값에 따라 이진값 하나(0 혹은 1 )를 출력한다. 그림 2-3 단층 퍼셉트론 입력

가중치

계단함수 퍼셉트론 분류 출력값 ( 0, 1 )

순입력

임곗값

다음과 같은 헤비사이드 계단함수 방정식으로 결정경계와 분류 출력값을 모델링할 수 있다.

0 f ( x) =  1

x<0 x >= 0

입력과 연결 가중치의 내적을 구해서 활성화함수(여기서는 계단함수)에 대한 순입력을 만들 어낸다. 내적한 값을 모두 더하면 [그림 2-3]의 왼쪽 절반에 대한 합계가 순입력값으로 표시된 다. [표 2-1]은 합계함수가 수행되는 방법과 합계함수 관련 파라미터에 대한 설명이다.

2장 신경망과 딥러닝의 기초

75


표 2-1 합계함수의 파라미터 함수 파라미터

설명

w

연결 가중치의 실수 벡터값

w⋅ x

내적(

n

∑w x

i i

)

i =1

n

퍼셉트론의 입력 수 편향 조건(입력값은 편향 조건에 영향을 주지 않는다. 이 값은 결정경계를 출발지로부터 이동하는 데

b

사용한다)

계단함수(활성화함수)의 출력은 퍼셉트론의 출력이며 입력에 대한 이진 분류 정보를 제공한 다. 편향값이 음수면 학습된 가중치 합계가 훨씬 큰 값이 되도록 강제로 1로 분류한다. 이처럼 계단함수에 대한 편향은 모델의 결정경계 영역을 이동시킨다. 입력값은 편향에 영향을 미치지 않지만, 편향은 퍼셉트론 학습 알고리즘을 이용해 학습되는 요소다. NOTE_ 단층 퍼셉트론

신경망 연구에서는 퍼셉트론을 ‘단층 퍼셉트론( single-layer perceptron )’으로 불러서 ‘다층 퍼셉트론 (multilayer perceptron )’과 구별한다.

기본적인 선형 분류기는 순방향 신경망 feed-forward Neural Network, FNN 을 구현할 수 있는 간단한 단 층 퍼셉트론으로 구현할 수 있다. NOTE_ 생물학적 뉴런과 퍼셉트론의 관계

뇌의 동작에 대한 완벽한 모델을 가지고 있지 않지만, 퍼셉트론은 생물학적 뉴런을 모델로 만들어졌다. 퍼셉 트론은 뇌의 시냅스에서 다른 뉴런으로 정보를 전달하는 방식으로 가중치를 가진 연결을 통해 입력받는다고 볼 수 있다.

퍼셉트론 학습 알고리즘 퍼셉트론 학습 알고리즘은 모든 입력이 정확하게 분류될 때까지 퍼셉트론의 가중치들을 바꾼 다. 이때 학습에 대한 입력값이 선형으로 분리되지 않으면 멈추지 않는다. 선형으로 분리 가능 한 데이터셋이란 데이터셋을 두 분류로 완벽히 나누는 선을 찾을 수 있는 데이터셋이다.

76

자바를 활용한 딥러닝


퍼셉트론 학습 알고리즘은 학습 초기에 작은 임의값 또는 0.0으로 가중치 벡터를 초기화한다. [그림 2-3]에서 볼 수 있듯이 각 입력 레코드를 가져와서 예측값을 계산하여 실제로 분류되어야 하는 레이블과 대조한다. 분류되려면 출력 레이블의 컬럼(특징)이 가중치와 일치해야 한다. 여 기서 n 은 입력 및 가중치의 차원 수다. 첫 번째 입력값은 편향 입력이며, 편향은 알고리즘에 영 향을 받지 않으므로 항상 1.0이다. 입력 벡터와 가중치 벡터의 내적은 앞서 논의한 것처럼 활 성화함수에 대한 입력을 제공한다. 내적을 통해 계산된 예측값이 정확하면 가중치를 변경하지 않고 그렇지 않으면 그에 따라 가중 치가 조정된다. 가중치는 개별 학습 예제 간에 ‘온라인 학습 알고리즘’으로 업데이트된다. 이는 입력된 예제가 정확하게 분류될 때까지 계속해서 진행된다. 데이터셋이 선형으로 분산되지 않 으면 학습 알고리즘은 무한히 반복된다. [그림 2-4]는 XOR 함수로 이 함수는 선형으로 분리되 지 않는 대표적인 데이터셋이다. 그림 2-4 XOR 함수

기본적인 단층 퍼셉트론은 XOR 로직 문제를 해결할 수 없는 한계가 있다.

초기 퍼셉트론의 한계 미해군에서 처음 인공지능의 기준을 발표한 이후, 퍼셉트론은 퍼셉트론이 인식할 수 있는 패턴 의 형태가 제한되어 있음이 밝혀졌다. 비선형(선형으로 분리되지 않는 데이터셋) 문제를 해결

2장 신경망과 딥러닝의 기초

77


할 수 없는 퍼셉트론은 신경 회로 분야의 실패로 간주되었다. 1969년 마빈 민스키 Minsky 와 시 모어 페퍼트 Papert 의 『Perceptrons』4에는 단층 퍼셉트론의 한계에 대해 자세히 나와 있다. 그 러나 일반 산업계에서 인지하지 못했던 점은 많은 비선형 문제 중 XOR 문제는 다층 퍼셉트론 이 풀 수 있다는 것이었다.5 NOTE_ 1차 암흑기 : 1974~1980

다층 퍼셉트론에 대한 오해는 이후 10년 동안 신경망에 관한 관심과 자금 후원이 끊기게 만들었고, AI가 개 발된 초기에 대중화하는 데 방해물이 되었다. 이는 역전파 5 가 유행하고 신경망의 제2 물결이 일던 1980년 대 중반까지 대중의 관심을 받지 못했다.

2.1.3 다층 순방향 신경망 다층 순방향 신경망은 입력 계층 하나, 은닉 계층 하나 이상, 출력 계층 하나인 신경망이다. 각 계층에는 하나 이상의 인공 뉴런이 있다. 이 인공 뉴런들은 퍼셉트론 전구물질 precursor 과 유사 하지만 신경망 계층의 특정 목적에 따라 다른 활성화함수를 가지고 있다. 이 장 후반부에서 다 층으로 된 계층 타입을 더 자세히 살펴보겠다. 일단 이 진화한 인공 뉴런에 대해 단층 퍼셉트론 을 살펴보며 알아보자.

인공 뉴런의 진화 다층 퍼셉트론의 인공 뉴런은 그 전신인 단층 퍼셉트론과 유사하지만 사용할 수 있는 활성화 계층의 형태에 유연성이 높다. [그림 2-5]는 단층 퍼셉트론을 기반으로 한 업데이트된 인공 뉴 런을 보여준다.

4 https://en.wikipedia.org/wiki/Perceptrons_(book ) 5 위보스(Webos )에 의해 1974년에 발견되었다.

78

자바를 활용한 딥러닝


그림 2-5 다층 퍼셉트론의 인공 뉴런 입력

가중치

활성화함수 순입력 활성홧값

전달함수

이 그림은 [그림 2-3]의 단층 퍼셉트론과 유사하지만 활성화함수를 계단함수를 사용하지 않고 다른 함수를 사용할 수 있도록 더 일반화되었다. 앞으로 이 그림을 더 자세히 발전시키면서 인 공 뉴런에 대해 자세히 살펴볼 것이다. NOTE_ 뉴런

지금부터 이 책에서 사용하는 ‘뉴런’이라는 용어는 [그림 2-5]에 근거한 인공 뉴런을 말한다.

활성화함수에 대한 순입력은 여전히 가중치와 입력에 대한 내적이지만, 활성화함수를 계단함 수가 아닌 다른 함수를 사용하여 유연하게 사용하면 출력값의 타입을 다양하게 만들 수 있다. 이는 계단함수를 사용하는 초기 퍼셉트론의 설계와의 중요한 차이점이다. 그 덕분에 현재 인공 뉴런은 더 복잡한 활성 출력값을 표현할 수 있다. 인공 뉴런의 입력. 인공 뉴런([그림 2-6] 참조)은 연결에 대한 가중치에 따라 무시되거나(연결

에 0.0 가중치를 적용함으로써) 활성화함수를 통과한 입력값을 가진다. 활성화 함수에서 출력 되는 활성홧값이 0인 경우 데이터를 필터링할 수 있다.

2장 신경망과 딥러닝의 기초

79


그림 2-6 다층 퍼셉트론 신경망의 상세한 인공 뉴런 모습

순입력 활성홧값

전달함수

들어오는 연결

연결에 대한 가중치

활성화함수

인공 뉴런 i

나가는 연결

뉴런에서의 순입력은 이전 계층에서 출력되어 입력으로 들어오는 활성홧값과 연결의 가중치를 곱한 값으로 표현한다(그림 2-6 ). 입력 계층은 특정 인덱스에서 특징 feature 을 가지고, 활성화함 수는 선형함수를 사용한다(특징값을 전달한다). 은닉 계층의 입력은 이전 계층의 뉴런으로부 터 전달되는 활성홧값을 사용한다. 수학적으로 인공 뉴런의 순입력(가중치가 적용된 전체 입 력)은 다음 식으로 표현할 수 있다.

input _ sum i = Wi ⋅ A i Wi 는 뉴런 i 로 이어지는 모든 가중치의 벡터고, Ai 는 뉴런 i 의 입력으로 사용되는 활성홧값의 벡터다. 계층별로 추가되는 편향을 고려하여 이 식을 구축해보자.

input _ sum i = Wi ⋅ A i + b 뉴런에서 출력을 생성하기 위해 다음 식에서 보여주는 활성화함수 g 로 input_sumi 를 감싼다.

ai = g (input_sumi ) inputi 의 정의를 활용하여 위 식을 전개하면 다음 식으로 표현 가능하다.

80

자바를 활용한 딥러닝


CHAPTER

3

심층 신경망의 기본 원칙

이곳에서는 제자리에 머물고 싶으면 최선을 다해 달려야 해. 어디든 다른 곳으로 가고 싶다면 지금보다 두 배는 빨리 뛰어야 해. _<거울나라의 앨리스> 중 붉은 여왕의 대사

3.1 딥러닝 정의 앞 장에서는 머신러닝과 신경망의 기초를 다졌다. 이 장에서는 이러한 내용을 바탕으로 심층 신경망의 핵심 개념을 알아볼 것이다. 이후 4장에서 특별한 구조에 대해 배우며 서로 다른 신 경망 구조를 이해하게 될 것이고 5장에서 실질적인 예를 확인할 것이다. 이제 딥러닝과 심층 신경망에 대한 정의부터 다시 살펴보자.

3.1.1 딥러닝이란 1장에서의 딥러닝 정의를 다시 생각해보면, 일반적으로 딥러닝이 고전적인 순방향 다층 신경 망과 차별화되는 측면은 다음과 같다. ●

이전 신경망보다 더 많은 뉴런 수

계층을 연결하는 더 복잡한 방법

학습을 위한 컴퓨팅 파워의 폭발적인 증가

자동 특징 추출

3장 심층 신경망의 기본 원칙 111


갈수록 복잡해지는 모델을 표현하기 위해 ‘더 많은 뉴런’이 필요했다. 기존에는 다층 신경망 내 계층 간 완전 연결되는 방식이었다. 이후 합성곱 신경망에서는 계층 간 뉴런이 국지적으로 연결 되는 방식으로 진화했고, 순환 신경망에서는 (이전 계층으로부터 연결 외에도) 같은 뉴런 내에 서 반복적으로 연결되는 방식으로 진화했다. 연결이 많다는 것은 신경망에 최적화할 파라미터가 더 많다는 것을 뜻한다. 따라서 지난 20년 동안 폭발적으로 증가한 컴퓨팅 파워가 필요했다. 이러한 진화와 발전은 더 지능적인 방식으로 스스로 특징을 추출하는 차세대 신경망을 구축하는 토대를 제공했다. 이로 인해 심층 신경망은 이전보다 더욱 복잡한 문제 영역(이미지 인식 향상)을 모델링할 수 있게 되었다. 업계의 요구 는 끊임없이 변화하고 뻗어나가고 있으며 신경망의 능력은 더 향상되어야 한다. 붉은 여왕 1에 게 다른 방법은 없다.

심층 신경망 정의 네 가지 주요 심층 신경망 구조를 정의하여 딥러닝의 정의를 세분화해보자. 비지도 사전학습 신경망

합성곱 신경망

순환 신경망

재귀 신경망

신경망 영역에서 지속적인 연구가 행해지고 있지만 이 책은 위에서 언급한 네 가지 구조에 집 중할 것이다. 이 네 가지 구조는 지난 20년간 발전되어왔다. 이제 1장부터 살펴본 순방향 다층 신경망의 역사에 대해 중요한 몇 가지를 알아보자.

심층 강화학습 리차드 서튼 교수는 그의 저서 2 에서 강화학습 reinforcement learning 을 다음과 같이 정의했다. 강화학습은 학습 방법을 특징지어서가 아니라 학습 문제를 특징지어 정의된다.

이 정의에 따르면 문제를 해결하는 데 적합한 모든 방법을 강화학습이라고 할 수 있다. 강화학습

1 루이스 캐럴의 <거울나라의 앨리스>에 등장하는 붉은 여왕은 같은 공간에 머무르기 위해 끊임없이 달려야 했다. 2 http://incompleteideas.net/book/the-book.html

112 자바를 활용한 딥러닝


에서는 학습기에 어떠한 행동을 취할지 알려주는 대신 에이전트 agent 가 시뮬레이션을 수행하여 가장 좋은 보상을 받을 수 있는 방법을 발견하도록 한다. 강화학습에서 에이전트는 환경에 대해 학습되지 않은 모델로 학습을 시작한다. 이때 효용함수 utility function

는 에이전트가 받게 되는 행위에 대한 보상 또는 목적과 동일한 의미로 사용된다. 학

습 시스템은 에이전트에 환경으로부터 입력을 제공하고 시뮬레이션(또는 게임)의 (사이클 또는 프레임) 결과가 긍정적으로 나오면 보상을 준다. 많은 경우 행동은 즉각적인 보상뿐 아니라 미래 의 보상에도 영향을 미친다. 시행착오와 지연보상의 메커니즘이 강화학습의 핵심 특징이다. 심층 강화학습 deep reinforcement learning 은 신경망이 보편적인 근사함수로 사용되는 강화학습이다. 이 접근법의 단점은 신경망은 유계 bounded 가 아니고 수렴도 증명할 수 없다는 것이다. 이런 단점 에도 불구하고 신경망을 보편적 근사함수로 사용하는 것은 좋은 결과를 보여준다.

2013년에 딥마인드팀은 NIPS 딥러닝 워크샵에서 딥 큐 러닝 Deep Q Learning 으로 ATARI 3 게임 을 하는 논문을 발표했다.4 이 논문에서 함수 근사를 이용한 큐 러닝이라는 표준 알고리즘이 사 용되었다. 이때 알고리즘에 사용된 근사적 함수가 바로 합성곱 신경망이었다. 딥마인드팀은 화 면의 픽셀을 입력으로 받고 합성곱 신경망을 내부 모델로 사용해서 <아타리 2600> 게임을 하는 에이전트를 시연했다. 아타리 게임을 하는 컴퓨터 또는 에이전트는 수행한 행동에 따라 게임의 결과가 긍정적이었을 때 긍정적인 보상을 받는다. 몇몇 게임에서 알고리즘이 사람보다 더 뛰어난 수준이 되도록 학습 할 수 있었다. 심층 강화학습은 이 책을 출간하는 중에 인기를 끌게 되었고 다음 버전에 포함될 예정이다. 지금 은 부록 B에서 예제를 확인할 수 있다.

진화 과정과 재기 신경망은 AI가 약속한 수준을 전달하지 못하게 되면서 1980년대 중반 암흑기에 접어들었다. 유망한 기술이 여러 번 환멸 단계에 빠져들었지만(그림 3-1 ) 신경망 영역에는 여전히 중요한 일을 하는 많은 연구자가 있었다.

3 옮긴이_ 미국의 비디오 게임 회사 4 「Human - level control through deep reinforcement learning」(Mnih et al ., 2013 ) (http://go.nature.com/2txUtoI )

3장 심층 신경망의 기본 원칙 113


그림 3-1 환멸의 계곡 5 시장의 관심 부풀려진 기대의 정점

생산성 안정기

깨우침의 단계

환멸의 계곡 기술 촉발

시간

신경망에서 한 가지 중요한 발전은 AT&T Bell 연구실에서 얀 레쿤이 수행한 광학 문자 인식 에 대한 연구였다.6 이 연구실은 금융 서비스 분야에서 수표의 이미지 인식에 중점을 두었다. 이 연구에서 레쿤과 동료들은 오늘날 합성곱 신경망으로 알려진 생물학적 영감을 받은 이미지 인식 모델의 개념을 개발했다. 결국 MNIST 필기체 벤치마크 7와 딥러닝에 의해 달성된 기록적 인 정확도를 남기게 되었다.8 NOTE_ 더 나은 레이블 데이터

딥러닝이 발전하고 성공하는 데 기여한 또 다른 점은 MNIST와 ImageNet 8 처럼 레이블이 붙은 크고 더 향 상된 데이터셋이 만들어진 것이다.

순환 신경망을 이용하여 순차 데이터를 모델링하는 발전된 방법은 1980년대 후반과 1990년 대 초반 셉 호흐라이터 Sepp Hochreiter 같은 연구자에 의해 등장했다. 시간이 흘러 연구 단체들은 5 https://ko.wikipedia.org/wiki/하이프_사이클 6 「Gradient - based learning applied to document recognition」(LeCun et al ., 1998 ) (http://yann.lecun.com/exdb/ publis/pdf/lecun-01a.pdf ) 7 옮긴이_ 오늘날 인공지능 성능 평가 시 지표로 삼는 벤치마크용 필기체 데이터셋(http://yann.lecun.com/exdb/mnist ) 8 http://image-net.org

114 자바를 활용한 딥러닝


1990년대 후반쯤 더 나은 인공 뉴런의 변형(예를 들면 LSTM Long Short-Term Memory, 장단기 메모리 메 모리 셀과 망각 게이트를 가진 LSTM 메모리 셀)을 만들었다. 전 세계의 연구실에서 신경망의 재기를 위한 움직임이 조용히 일고 있었다.

2000년대 들어 연구자와 업계에서는 다음과 같은 제품에 이러한 발전된 신경망을 적용해나갔다. 자율주행 자동차

구글 번역 9

아마존의 에코

알파고 10

2006년 다르파 그랜드 챌린지 Darpa Grand Challenge 11에서 자율주행 자동차는 단순한 딥러닝 이상 의 많은 기술을 사용했다. 스탠포드와 카네기 멜론 대학교 같은 상위의 팀들은 향상된 이미지 처리 기술을 활용했다.12 NOTE_ 컴퓨터 비전의 발전

2012년 알렉스 크리체브스키, 일리야 수츠케버, 제프리 힌튼은 ILSVRC (ImageNet Large-Scale Visual Recognition Challenge )에서 우승한 대용량 심층 합성곱 신경망을 개발했다. 알렉스넷(AlexNet )12 은 컴퓨터 비전의 발전으로 환영받았고 특히 딥러닝 열풍을 일으키는 데 공헌했다. 그 러나 알렉스넷은 1990년대부터 존재한 합성곱 신경망의 규모적으로 확대된 (더 깊고 넓어진) 변형 중 하나 일 뿐이다. 최근 컴퓨터 비전의 발전은 최신 알고리즘의 발전보다는 처리 능력, 데이터, 인프라의 개선에 의해 이루어졌다.

이미지 분석 기능이 개선되어 자동차의 주행 계획 시스템은 불확실한 지형을 통과하는 경로를 더 잘 선택하고 장애물을 더 안전하게 피하게 되었다. 딥러닝은 오디오 데이터를 더 정확히 해 석하고 인식하는 수준으로 발전하여 ‘구글 번역’과 ‘아마존 에코’ 제품의 가치를 높여주었다. 급 기야 2016년에는 알파고가 프로 바둑 기사인 이세돌 9단을 이기고 마스터 자리에서 올라섰다. 머신러닝에 업적을 남길 만큼 큰 진보는 흔하지 않다. 다르파 그랜드 챌린지나 제퍼디에서 켄 9 https://translate.google.com 10 https://deepmind.com/research/alphago 11 미 국방성 산하 핵심 연구기관인 방위고등연구계획국(Defense Advanced Research Projects Agency, DAPRA )이 후원하는 무인자동차 경주 대회(http://archive.darpa.mil/grandchallenge ) 12 「ImageNet Classification with Deep Convolutional Neural Networks」(Krizhevsky, Sutskever, Hinton, 2012 ) (http:// bit.ly/2tmodqn )

3장 심층 신경망의 기본 원칙 115


제닝스를 이긴 왓슨처럼 세간의 이목을 끄는 다방면의 시연 덕분에 대중은 머신러닝의 진보를 인식하게 되었다. 하지만 사실 이러한 진보에 대한 토대는 느리지만 끊임없이 변화한다. 계절 이 변하는 것처럼 사람들은 일상생활에서 이런 변화는 어느 정도의 한계점을 넘을 때까지 알아 차리지 못한다. 가까운 미래에 딥러닝이 독창적이고 혁신적인 방법으로 적용될 것이다. 이러한 애플리케이션 은 실용적인 기술과 결합된 잠재적인 지능을 가진 다양한 방식(예를 들면 추천이나 음성 인식) 으로 우리 일상을 유용하게 해줄 것이다. 적어도 가까운 시일 내에 악의적인 인공지능 에이전 트가 우리를 강제로 에어록 바깥으로 날려버리는 일은 벌어지지 않을 것이다(『2001: 스페이스 오디세이』에 등장하는 ‘HAL 9000’을 생각하라).

HAL 9000 HAL 9000은 아서 C. 클라크의 책 『2001: 스페이스 오디세이』에 등장하는 우주선 디스커버리호 를 제어하는 가상의 시스템이다. HAL은 경험적으로 프로그래밍된 알고리즘 기반의 컴퓨터다. 영화에서는 주로 빛나는 빨간 점이 있는 카메라 렌즈로 표현되고 대화형 음성 인식 시스템을 통 해 액세스할 수 있다. 영화에서 HAL은 성공적으로 임무를 완수하려면 디스커버리호의 승무원을 죽여야 한다고 결론을 내린다. 데이브 : 팟베이 문 열어 HAL!

HAL : 미안합니다, 데이브. 유감스럽지만 그럴 순 없어요.

딥러닝은 여러 분야의 많은 머신러닝 주요 과제를 풀어가고 있다. 지난 몇 년 동안 딥러닝이 달 성한 주요 벤치마크 기록은 다음과 같다. 텍스트 음성 변환 합성 13

언어 식별 14

대용량 어휘 음성 인식 15

운율 억양 예측 16

13 text - to - speech synthesisz (Fan et al., Microsoft, Interspeech 2014 ) 14 language identification (Gonzalez - Dominguez et al ., Google, Interspeech 2014 ) 15 large vocabulary speech recognition (Sak et al ., Google, Interspeech 2014 ) 16 prosody contour prediction (Fernandez et al ., IBM, Interspeech 2014 )

116 자바를 활용한 딥러닝


중간 어휘 음성 인식 17

영어 -프랑스어 번역 18

오디오 시작 감지 19

사회적 신호 분류 20

아랍어 필체 인식 21

T IMIT 음소 인식 22

광학 문자 인식 23

이미지 캡션 생성 24

비디오 텍스트화 설명 25

자연어 처리를 위한 구문 분석 26

말하는 얼굴 사진 27

이러한 성과를 바탕으로 향후 10년 동안 많은 애플리케이션에 영향을 줄 수 있는 딥러닝 프로 젝트를 쉽게 수행할 수 있게 되었다. 딥러닝이 적용된 더욱 인상적인 예로 다음과 같은 것들이 있다. 자동 이미지 선명화 28

자동 이미지 해상도 향상 29

웨이브넷 : 누군가의 목소리를 흉내 낸 대화를 생성하는 것 30

웨이브넷 : 믿을 만한 클래식 음악 생성

무성음 비디오에 대한 음성 재구성 31

17 medium vocabulary speech recognition (Geiger et al., Interspeech 2014 ) 18 English - to - French translation (Sutskever et al ., Google, NIPS 2014 ) 19 audio onset detection (Marchi et al., ICASSP 2014 ) 20 social signal classification (Brueckner & Schulter, ICASSP 2014 ) 21 arabic handwriting recognition (Bluche et al ., DAS 2014 ) 22 TIMIT phoneme recognition (Graves et al ., ICASSP 2013 ) 23 optical character recognition (Breuel et al ., ICDAR 2013 ) 24 image caption generation (Vinyals et al ., Google, 2014 ) 25 video - to - textual description (Donahue et al ., 2014 ) 26 syntactic parsing for natural language processing (Vinyals et al., Google, 2014 ) 27 photo - real talking heads (Soong, Wang, Microsoft , 2014 ) 28 https://github.com/alexjc/neural-enhance 29 https://github.com/nagadomi/waifu2x 30 https://deepmind.com/blog/wavenet-generative-model-raw-audio 31 http://www.vision.huji.ac.il/vid2speech

3장 심층 신경망의 기본 원칙 117


글꼴 생성 32

누락된 영역 이미지 자동 채우기 33

자동화된 이미지 캡션 생성 34

손으로 그린 낙서를 세련된 예술 작품으로 바꾸기 35

아마도 사람들은 바로 눈앞에 갖다놓을 때까지 모든 주요 상용 애플리케이션을 인식하지 못할 것 이다. 딥러닝 구조의 발전에 대한 이해는 애플리케이션 아이디어를 이해하는 데 매우 중요하다.

신경망 구조의 발전 다층 순방향 신경망에 합성곱 신경망과 순환 신경망과 같은 새로운 구조의 첨단기술을 적용하 면서 계층을 설정하는 방법, 뉴런을 구성하는 방법, 계층을 연결하는 방법이 변경되었다. 신경 망 구조는 특정 타입의 입력 데이터를 활용하기 위해 발전했다. 계층 타입의 발전. 구조의 타입이 다양해짐에 따라 계층도 더욱 다양해졌다. 심층 신뢰 신경망 Deep Belief Networks, DBN

은 제한된 볼츠만 머신 Restricted Boltzmann Machine, RBM 을 특징을 구축하기 위

한 사전준비 작업계층으로 사용해서 성과를 입증했다. 합성곱 신경망은 계층 내에서 새롭고 다 양한 타입의 활성화함수를 이용했고, 계층 간 연결 방법을 완전 연결 방식에서 패치들이 국지 적으로 연결되는 방식으로 변경했다. 순환 신경망은 시계열 데이터에서 시간적인 부분을 더 잘 모델링하는 연결 방식을 모색했다. 뉴런 타입의 발전. 순환 신경망은 특히 LSTM 신경망을 중심으로 뉴런 타입에서 발전을 이루었

다. 순환 신경망은 LSTM 메모리 셀과 회로형 순환 유닛 Gated Recurrent Unit, GRU 과 같이 그들에 특 화된 새로운 유닛(뉴런)을 소개했다. 하이브리드 구조. 하이브리드 구조는 시간 데이터와 이미지 데이터가 모두 포함되는 입력 데이

터를 지원하고자 고안되었다. 예를 들어 비디오에서 물체를 분류하는 일은 합성곱 신경망과 순 환 신경망의 계층을 하이브리드 신경망 하나로 결합함으로써 성공적인 결과를 보여주었다. 하 이브리드 신경망 구조는 제한적인 상황에서 양쪽 모델의 장점을 모두 활용할 수 있도록 해준다.

32 http://bit.ly/2tQhtSG 33 https://bamos.github.io/2016/08/09/deep-completion/ 34 http://cs.stanford.edu/people/karpathy/deepimagesent/, https://github.com/karpathy/neuraltalk2 35 https://github.com/alexjc/neural-doodle

118 자바를 활용한 딥러닝


특징 추출에서 자동화된 특징 학습까지 심층 신경망이 내부적으로 새로운 유닛과 계층을 도입하게 되었지만 여전히 근본적으로는 입 력으로 특징을 구성하고 최종적으로 차별화된 분류기를 사용하고 있다. 특징 추출 자동화는 여 러 구조의 공통된 주제다. 각 구조는 서로 다른 방식으로 특징을 구조화하고 특정 타입의 입력 에 더 효율적이다. 얀 레쿤은 이러한 개념을 ‘세상을 대표하는 법을 배우는 기계’라고 말하며 딥 러닝을 묘사할 때 사용했다.36 제프리 힌튼은 심층 신뢰 신경망에서 제한된 볼츠만 머신이 어떻게 데이터를 고차원적 특징으 로 분해하는지 설명할 때 특징 추출 자동화에 대해 이야기했다.37 NOTE_ 심층 신뢰 신경망 분류

이 책의 목적상 심층 신뢰 신경망과 오토인코더를 심층 신경망의 비지도 사전학습 신경망으로 분류한다.

이미지 분류에 대한 주제로 얼굴 인식을 예로 들 수 있다. 원시 얼굴 이미지 데이터는 얼굴의 방향, 사진의 조명, 얼굴의 주요 특징의 위치와 같은 문제를 가지고 있다. 일반적으로 얼굴과 연관된 주요 특징은 얼굴의 경계선, 눈이나 코와 같은 특정 부위의 경계 등이며, 보조개와 같이 지속적으로 보이지 않는 미묘한 특징도 있다. 특징 추출. 수작업으로 특징을 추출하는 일은 오랜 기간 동안 머신러닝의 전형적인 특성이었다.

실무자들은 머신러닝 경연에서 우승하려고 데이터셋을 철저히 공부했고 학습 과정을 가능한 한 쉽게 학습 알고리즘에 적용하기 위해 비범한 기술을 사용했다. 이런 데이터셋은 종종 컬럼 이나 표 형태의 텍스트 데이터이므로 도메인 지식을 특정 열에 적용하여 특징을 직접 생성하는 작업을 수행했다.

1장에서 입력 데이터를 방정식 Ax = b 에서 행렬 A 로 모델링했던 방법을 생각해보면 데이터를 A 의 특정 열 값으로 직접 코딩해야 했었다. 이렇게 수작업으로 생성된 특징은 매우 정확한 모델 을 만드는 경향이 있지만 생산하는 데 많은 시간과 경험이 든다. 지식을 표현하는 관점에서 볼 때 못 쓴 책보다 잘 쓴 책이 훨씬 더 읽기 쉬운 것과 같다. 전자는 읽는 데 시간이 오래 걸리기 때 문에 후자와 같은 정보를 얻으려면 더 많은 노력을 들여야 한다. 36 http://bit.ly/2tQit95 37 「A Fast Learning Algorithm for Deep Belief Nets」( Hinton, Osindero, Teh, 2006 ) ( https://www.cs.toronto. edu/~hinton/absps/fastnc.pdf )

3장 심층 신경망의 기본 원칙 119


수작업으로 이미지 특징을 추출하는 일은 표 형태의 데이터에서 특징을 생성하는 일보다 더 어 렵기 때문에 이미지 분류는 매우 흥미로운 예제다. 이미지 내의 정보는 똑같은 열에 머무르지 않고 빛, 각도, 그리고 다른 원인에 영향을 받을 수 있다. 이미지의 특징 추출과 생성은 새로운 접근법을 필요로 했고 이는 합성곱 신경망의 진화를 주도하게 되었다. 특징 학습. 다시 얼굴 인식 예제로 돌아와서, 은행 예금 잔액 데이터가 표의 특정 열에 항상 위

치하는 것과 대조적으로 이미지에서 코는 어떤 픽셀 집합에든 위치할 수 있다. 합성곱 신경망 을 이용하여 코의 에지를 이해하고 이러한 ‘nose-edge’ 특징에서 더 나아가 일반적인 코의 모 양까지 알 수 있도록 신경망을 학습시킨다. 신경망의 첫 번째 계층은 nose-edge 특징을 선택 하고 더 큰 특징 맵으로 신경망의 다음 계층에 전달할 수 있다. 이러한 특징 맵의 작은 영역들은 결국 합성곱 신경망의 후반 계층에서 얼굴이라는 큰 특징 하 나로 결합된다. 이는 합성곱 신경망이 이전에 계속 여러 번 시도한 문제인 ‘이 이미지는 얼굴입 니까?’라는 질문에 대답을 줄 수 있지만 여전히 ‘더 정확하고 에너지가 덜 소비되는 간단한 방 법은 없을까?’라는 의문을 남긴다. NOTE_ 복잡한 데이터를 이용한 자동화된 특징 학습

더 간단한 분류(또는 회귀) 결과를 만들기 위해 복잡한 원시 데이터를 가져와서 고차원적인 특징을 자동으로 생성하는 일은 딥러닝의 전형적인 특성이다.

이 책을 계속 읽어나가면 입력 데이터 타입을 심층 신경망 구조에 적절하게 맞추는 방법과 데 이터셋에 맞추어 가장 좋은 모델을 생성할 수 있도록 신경망 구조를 설정하는 방법에 대해 더 잘 이해하게 될 것이다.

생성 모델링 생성 모델링은 새로운 개념이 아니다. 하지만 심층 신경망의 구현 수준이 인간의 창의력에 필 적하기 시작했다. 예술 창작부터 음악 제작, 맥주 리뷰까지 딥러닝은 매일매일 창조적인 영역 에 적용되었다. 주목해야 할 생성 모델링의 최근 활용은 다음과 같다. 인셉셔니즘(이미지 합성)

예술 작품 스타일 모델링

G AN (Generative Adversarial Networks, 생성적 적대 신경망)

순환 신경망

120 자바를 활용한 딥러닝


CHAPTER

4

주요 심층 신경망 구조

건축은 예술의 어머니다. 건축이 없으면 문명의 영혼도 없다. _프랭크 로이드 라이트

지금까지 심층 신경망의 구성요소 중 일부를 살펴봤다. 이제 심층 신경망의 네 가지 주요 구조 와 작은 신경망을 사용해서 구축하는 방법을 알아볼 것이다. 지금까지 다음 네 가지 주요 신경 망 구조를 소개했다. ●

비지도 사전학습 신경망

합성곱 신경망

순환 신경망

재귀 신경망

이 장에서는 이들 구조를 더 자세히 다룬다. 2장에서 신경망의 기초가 되는 알고리즘과 수학에 대해 깊이 살펴보았다. 이 장에서는 서로 다른 심층 신경망의 고급 구조에 더 중점을 두고 이러 한 신경망을 실제로 적용하는 방법을 살펴본다. 모든 신경망을 자세히 다루지는 않을 것이다. 실제로 자주 사용되는 이미지 모델링을 위한 합 성곱 신경망과 시퀀스 모델링을 위한 LSTM에 더 비중을 둘 것이다.

4장 주요 심층 신경망 구조 149


4.1 비지도 사전학습 신경망 이 분류에 속하는 세 가지 특수한 구조가 있다. ●

오토인코더

심층 신뢰 신경망

생성적 적대 신경망

NOTE_ 오토인코더의 역할

3장에서 설명했듯이 오토인코더는 큰 신경망의 일부로 자주 사용되기 때문에 심층 신경망의 기본적인 구조 로 다루어진다. 하지만 많은 다른 신경망처럼 이러한 역할 외에 단독 신경망으로 사용되기도 한다.

이미 오토인코더는 깊이 다루었으므로 심층 신뢰 신경망과 GAN을 자세히 알아보자.

4.1.1 심층 신뢰 신경망 심층 신뢰 신경망은 사전학습 단계가 제한된 볼츠만 머신 계층으로 구성되어 있고 이후 미세조 정 단계는 순방향 신경망으로 되어 있다. [그림 4-1]은 심층 신뢰 신경망의 구조다. 그림 4-1 심층 신뢰 신경망의 구조

제한된 볼츠만 머신 사전학습 스택

입력값

일반 순방향 다층 퍼셉트론

150 자바를 활용한 딥러닝


다음 절에서는 심층 신뢰 신경망이 제한된 볼츠만 머신을 활용해서 학습 데이터를 더 잘 모델 링하는 방법에 대해 자세히 알아볼 것이다.

제한된 볼츠만 머신 계층을 이용한 특징 추출 제한된 볼츠만 머신을 이용해서 원시 입력 벡터에서 상위 수준 특징을 추출한다. 이를 위해 제 한된 볼츠만 머신에 은닉 유닛 상태와 가중치를 설정하고 입력 레코드를 주어 해당 레코드를 재구성하도록 요청한다. 그러면 제한된 볼츠만 머신은 원본 입력 벡터와 가능한 한 매우 가까 운 새로운 것을 생성한다. 힌튼은 이러한 효과를 ‘기계가 데이터에 대해 상상하는 방법’이라고 이야기했다. 딥러닝과 심층 신뢰 신경망 관점에서 제한된 볼츠만 머신의 근본적인 목적은 데이터셋에서 비 지도학습 방식으로 이러한 고차원적인 특징을 학습하는 것이다. 낮은 수준의 제한된 볼츠만 머 신 사전학습 계층으로부터 학습된 특징을 더 높은 수준의 제한된 볼츠만 머신 사전학습 계층의 입력으로 사용해서 제한된 볼츠만 머신이 점진적으로 고차원적 특징을 학습하게 하면 신경망 학습을 더 잘 할 수 있다는 것이 밝혀졌다. 자동으로 고차원 특징 학습하기. 고차원 특징을 비지도 방식으로 학습하는 것은 심층 신뢰 신경

망의 사전학습 단계로 간주된다. 사전학습 단계에서 제한된 볼츠만 머신의 각 은닉 계층은 데 이터 분포를 이용해서 점진적으로 더 복잡한 특징을 학습한다. 이러한 고차원 특징은 비선형적 방법으로 단계적인 결합을 해서 고급 자동화 특징 엔지니어링을 수행한다. [그림 4-2] ~ [그림 4-4]를 살펴보면 제한된 볼츠만 머신 계층에서 특징을 어떻게 구축하는지 시각적으로 이해할 수 있다. 이는 제한된 볼츠만 머신에서 MNIST 숫자를 학습할 때 활성화 진 행 과정을 보여준다. 그림 4-2 학습 시작 시 활성화 렌더링

4장 주요 심층 신경망 구조 151


그림 4-3 활성화 렌더링 후 특징 등장

그림 4-4 학습 종료 시 MNIST 숫자 중 일부 등장

6장에서 이러한 렌더링이 어떻게 생성되는지 자세히 설명할 것이다. 이때 제한된 볼츠만 머신 의 계층이 어떻게 학습을 통해 숫자의 일부를 추출하는지 알 수 있을 것이다. 이러한 특징은 상 위 레벨 계층에서 결합되어 점진적으로 더 복잡한(그리고 비선형적인) 특징을 구축한다. 원시 데이터는 제한된 볼츠만 머신의 각 계층에서 생성 모델링 프로세스를 거쳐 모델링되기 때 문에 시스템은 기본적인 입력 벡터화 과정으로 생성된 원시 입력 데이터에서 점점 더 높은 수 준의 특징을 추출할 수 있다. 이러한 특징은 제한된 볼츠만 머신 계층에서 한 방향으로 전달되 어 가장 상위 계층에서 더 뛰어난 특징을 생성하게 된다. 순방향 신경망의 초기화. 이렇게 얻은 특징 계층은 전통적인 역전파 기반 순방향 신경망에서 초

기 가중치로 사용할 수 있다. 이런 초깃값은 학습 알고리즘이 전통적인 신경망 파라미터가 파라미터 탐색 공간에서 더 나은 값을 얻도록 안내하는 데 도움을 준다. 이 단계가 심층 신뢰 신경망의 미세조정으로 알려진 과 정이다.

순방향 다층 신경망에서 심층 신뢰 신경망 미세조정 심층 신뢰 신경망 미세조정 단계에서는 일반 역전파를 낮은 학습률로 사용해서 완만하게 역전

152 자바를 활용한 딥러닝


파를 수행한다. 사전학습 단계는 원시 데이터를 이용한 비지도 방식으로 파라미터 공간을 일반 적으로 탐색하는 단계라고 할 수 있다. 대조적으로 미세조정 단계는 신경망과 특징을 (분류처 럼) 우리가 실제로 해결하려는 작업에 맞게 특화시키는 것이다. 완만한 역전파. 제한된 볼츠만 머신을 이용한 사전학습 단계에서는 데이터에서 고차원 특징을

학습하고 이를 순방향 신경망의 초깃값으로 사용한다. 하지만 아직 이러한 가중치를 가지고 최 종 신경망 모델에 더 적합하도록 조금 더 조정하고 싶을 것이다. 출력 계층. 심층 신경망의 일반적인 목표는 특징셋을 학습하는 것이다. 심층 신경망의 첫 번째

계층은 원본 데이터셋을 재구성하는 방법을 학습한다. 후속 계층들은 이전 계층의 활성화 확률 분포를 재구성하는 방법을 학습한다. 신경망의 출력 계층은 전체적인 목표와 연결되어 있다. 이것은 보통 특징 수가 마지막 계층의 입력 수와 같고, 출력 수는 클래스 수와 같은 로지스틱 회귀로 구현된다.

심층 신뢰 신경망의 현재 상태 이 책에서는 심층 신뢰 신경망을 다른 신경망 구조만큼 광범위하게 다루지는 않았다. 현장에서 는 합성곱 신경망이 이미지 모델링 분야에 널리 사용되고 있기 때문에 다음 절에서 살펴볼 합 성곱 신경망에 더 집중할 것이다. NOTE_ 딥러닝의 부흥에서 심층 신뢰 신경망의 역할

비록 이 책에서는 심층 신뢰 신경망을 강조하지 않지만 딥러닝 부흥에 중대한 역할을 했다. 토론토 대학교의 제프리 힌튼 팀은 이미지 모델링 분야에서 성과를 이루려 오랜 기간 기술 발전에 집중했다. 심층 신경망의 발 전에 심층 신뢰 신경망이 기여한 바에 대해서도 기억해야 한다.

4.1.2 GAN 주목할 만한 신경망은 GAN 1이다. GAN은 다른 학습용 이미지를 기반으로 새로운 이미지를 합성하는 데 매우 뛰어난 것으로 밝혀졌다. 이 개념을 확장해서 다음과 같은 다른 도메인을 모 델링할 수 있다. 1 「Generative Adversarial Networks」(Goodfellow et al., 2014 ) (https://arxiv.org/abs/1406.2661 )

4장 주요 심층 신경망 구조 153


소리 2

비디오 3

텍스트 설명에서 이미지 생성 4

GAN은 비지도 방식을 이용해서 두 모델을 동시에 학습하는 신경망의 예다. GAN (그리고 일 반적인 생성 모델)의 핵심적인 면은 신경망을 학습할 때 사용하는 데이터양에 따른 파라미터 수가 일반적인 경우보다 훨씬 적다는 것이다. 신경망은 학습 데이터와 비슷한 데이터를 더 효 율적으로 생성해냄으로써 학습 데이터를 더욱 효과적으로 표현한다.

생성 모델 학습과 비지도학습 및 GAN 이미지넷 5 데이터셋 같은 대규모 학습 이미지 모음을 가지고 있다면 (분류와 반대로) 이미지를 출력하는 생성 신경망을 만들 수 있다. 생성된 출력 이미지는 모델의 샘플로 간주한다. GAN 생성 모델이 이러한 이미지를 생성할 때 보조 판별자 discriminator 신경망은 이렇게 생성된 이미지 를 분류하려 시도한다. 이 보조 판별자 신경망은 출력 이미지가 진짜인지 가짜인지 분류하려 시도한다. GAN은 학습 데이터를 기반으로 더 믿을 수 있는 출력 이미지를 생성하도록 파라미터를 업데이트한다. 목표 는 판별자 신경망이 실제 데이터와 만들어진 데이터의 차이점을 구별하지 못할 만큼 충분히 진 짜 같은 이미지를 만드는 것이다.

GAN으로 효율적인 모델을 표현한 예는 이미지넷 같은 데이터셋을 모델링할 때 파라미터를 약 1억 개 사용한 것이다. 학습 과정에서 200GB의 이미지넷 같은 입력 데이터셋은 100MB에 가까운 파라미터가 된다. 이 학습 과정은 유사한 픽셀 그룹, 에지, 다른 패턴과 같이 데이터 특 징을 표현하는 더 효과적인 방법을 찾는 과정이다(자세한 내용은 4.2절 ‘합성곱 신경망’을 참 조하라). 판별자 신경망. 이미지를 모델링할 때 판별자 신경망은 일반적으로 표준 합성곱 신경망이다. 보

2 https://github.com/usernaamee/audio-GAN 3 「Generating Videos with Scene Dynamics」( Vondrick , Pirsiavash , Torralba, 2016 ) ( https://www.cs.columbia. edu/~vondrick//tinyvideo/paper.pdf ) 4 「StackGAN: Text to Photo - realistic Image Synthesis with Stacked Generative Adversarial Networks」(Zhang et al., 2016 ) (https://arxiv.org/abs/1612.03242 ) 5 옮긴이_ http://www.image-net.org/

154 자바를 활용한 딥러닝


조 신경망을 판별자 신경망으로 사용하면 GAN이 비지도 방식으로 동시에 두 신경망을 학습할 수 있다. 이 판별자 신경망은 이미지를 입력으로 받고 분류 결과를 출력한다. 합성된 입력 데이터에 의한 판별자 신경망의 출력 기울기는 그 이미지를 더 진짜처럼 만들려면 얼마나 바꾸어야 하는지를 나타낸다. 생성 신경망. GAN에서 생성 신경망은 역합성곱 계층 deconvolutional layer 이라고 불리는 특별한 계

층에 의해 데이터나 이미지를 생성한다. 역합성곱 신경망과 계층에 대한 상세한 내용은 이어지 는 ‘역합성곱 신경망’에 대한 글을 참조하라. 학습하는 동안 생성 신경망이 더 진짜 같은 이미지를 생성하도록 두 신경망 모두 역전파를 사 용해 파라미터를 업데이트한다. 목표는 판별자 신경망이 생성 신경망에 더 잘 속도록 생성 신 경망 파라미터를 업데이트하는 것이다. 즉, 생성 이미지가 학습 데이터의 실제 이미지와 비교 해도 진짜 같도록 만드는 것이다.

역합성곱 신경망 이 타입의 신경망은 ZF Net 개발의 일환으로 뉴욕 대학교의 매튜 자일러와 롭 퍼거스가 개발했 다.6 역합성곱 신경망은 다양한 특징 활성화와 입력 공간의 관계를 조사하는 데 도움이 된다(그 림 4-5 ). 그림 4-5 역합성곱 계층의 시각화

계층 1

계층 2

6 「Visualizing and Understanding Convolutional Neural Networks」( Zeiler, Fergus, 2013 ) ( https://arxiv.org/ abs/1311.2901v3 )

4장 주요 심층 신경망 구조 155


역합성곱 신경망 deconvolutional network, deconvnet 의 역합성곱 계층은 [그림 4-5]에서 볼 수 있듯이 이미지를 모델링할 때 특징을 픽셀에 매핑한다. 이는 일반적인 합성곱 계층이 하는 것과 반대되 는 것이다. 역합성곱 신경망의 이러한 면은 신경망의 출력으로 이미지를 생성할 수 있도록 한다. 역합성곱 신경망은 비지도고 심층 신뢰 신경망과 비슷하게 계층 단위 접근법으로 학습된다. 신 경망에는 중첩된 역합성곱 계층 여러 개가 있으며 각 계층은 이전 계층의 입력에 대해 학습한다. 계층으로 정보를 전달하는 일반적인 아이디어는 각 계층의 출력이 계층의 입력 데이터에 대한 일부 표현이라는 것이다.

생성 모델 구축과 DCGAN GAN의 변형 중 한 가지는 DCGAN Deep Convolutional Generative Adversarial Network (심층 합성곱 GAN )이다.7 [그림 4-6]은 DCGAN이 생성한 침실 이미지를 보여준다. 그림 4-6 DCGAN 신경망이 생성한 침실 이미지 8

이 신경망은 균일 분포에서 임의의 수를 가져와서 신경망 모델의 이미지를 출력으로 생성한다. 입력하는 숫자가 바뀌면 DCGAN은 다른 타입의 이미지를 생성한다.

7 https://github.com/Newmu/dcgan_code 8 이미지는 DCGAN 저자의 깃허브 저장소(https://github.com/Newmu/dcgan_code )에서 가져왔다.

156 자바를 활용한 딥러닝


조건부 GAN 조건부 conditional GAN 9은 클래스 레이블 정보를 사용해서 특정 클래스의 데이터만 생성할 수 있다.

GAN과 VAE 비교 GAN은 학습 데이터를 모델의 분포인지 실제 분포인지 분류하는 데 집중한다. 판별자 모델이 두 분포의 차이를 예측하면 생성 신경망은 파라미터를 조정한다. 결국 생성기는 실제 데이터 분포를 재현하고 판별기가 그 차이를 찾지 못하도록 파라미터를 변경한다.

3장에서 보았듯이 VAE를 사용하면 같은 문제를 비지도 방식으로 입력을 재구성하는 확률적 그래픽 모델로 만들 수 있다. VAE는 생성된 이미지가 더 진짜 같도록 데이터의 로그 가능도에 대한 하한을 극대화하기 위해 노력한다.

GAN과 VAE의 또 다른 재미있는 차이점은 이미지를 생성하는 방식이다. 기본적인 GAN은 이미지를 어떠한 코드로 생성하므로 특정한 특징을 가지는 이미지를 생성해낼 수 없다. 하지만

VAE는 원래 이미지와 생성된 이미지를 비교할 수 있는 특별한 인코딩/디코딩 방식을 사용한 다. 이런 점은 특정 타입의 이미지를 생성할 수 있는 부가적인 효과가 있다. CAUTION_ 생성 모델과 관련된 문제

때때로 생성된 이미지는 또 다른 타입의 노이즈를 발생시킨다. VAE가 생성한 이미지의 단점은 이미지가 약 간 흐릿해진다는 것이다. GAN이 생성한 이미지는 입력 데이터의 스타일을 잡아내기는 하지만 때로는 논리 적으로 맞지 않을 때가 있다(예를 들면 개 이미지인데 개가 제대로 보이지 않음).

4.2 합성곱 신경망 합성곱 신경망의 목표는 합성곱을 통해 데이터로부터 고차원 특성을 학습하는 것이다. 이미지 객체 인식과 최고의 이미지 분류 대회에서 지속적으로 좋은 성과를 얻고 있다. 합성곱 신경망 은 얼굴, 개인, 도로 표지판 또는 시각적 데이터의 많은 측면을 식별할 수 있다. 또한 광학 문자 9 「Conditional Generative Adversarial Nets」(Mirza, Osindero, 2014 ) (https://arxiv.org/abs/1411.1784 )

4장 주요 심층 신경망 구조 157


인식과 같은 텍스트 분석 분야에서도 사용되며 개별 텍스트 단위 단어 분석 10에도 유용하게 쓰 인다. 소리 분석에서도 좋은 성과를 보이고 있다. 이미지 인식에서 합성곱 신경망의 효용성은 세계가 딥러닝의 힘을 인식하게 된 가장 중요한 이 유다. [그림 4-7]은 합성곱 신경망이 원시 이미지 데이터에서 위치가 유지되고 (어느 정도) 방 향이 바뀌지 않는 특징을 보여준다. 그림 4-7 합성곱 신경망과 컴퓨터 비전

합성곱 신경망은 머신 비전 분야의 주요 발전에 큰 원동력이며 자율주행 자동차, 로봇공학, 무 인항공기, 시각장애인을 위한 치료와 같은 확실한 애플리케이션도 가지고 있다. NOTE_ 합성곱 신경망과 데이터 구조

합성곱 신경망은 입력 데이터에 대한 구조가 있을 때 매우 유용하다. 예를 들어 특정 패턴이 반복되고 바로 다음 값이 이전 값과 서로 공간적으로 관련이 있는 이미지나 오디오 데이터 같은 경우다. 반대로 관계형 데이 터베이스 관리 시스템(relational database management system, RDBMS )에서 추출한 열형(columnar ) 데이터의 경우 구조적으로 데이터끼리 서로 공간적인 관계는 없다. 한 열의 다음 열은 단지 데이터베이스가 추출한 방식에 따라 나타날 뿐이다.

10 「Neural Machine Translation in Linear Time」(Kalchbrenner et al., 2016 ) (https://arxiv.org/abs/1610.10099 )

158 자바를 활용한 딥러닝


또한 합성곱 신경망은 자연어 번역과 생성 11, 감정 분석 12 같은 분야에도 사용되었다. 합성곱 은 신호를 기반으로 더욱 견고한 특징 공간을 구축하는 데 도움이 되는 매우 강력한 개념이다.

4.2.1 생물학적 영감 합성곱 신경망은 동물의 시각피질에서 생물학적 영감을 받았다.13 시각피질 세포는 입력의 작 은 부분 영역에 민감하다. 이것을 시각 영역 또는 수용 영역이라고 부른다. 이 작은 부분 영역 들은 바둑판식으로 배열되어 전체 시각 영역을 덮고 있다. 세포는 두뇌가 처리하는 이미지 타 입에서 뚜렷한 공간적 상관관계를 발견해 입력 공간에 국부 필터 역할을 하는 데 활용한다. 뇌 의 이러한 영역에는 두 가지 세포가 있다. 단순한 세포는 에지 같은 패턴을 찾았을 때 활성화되 고, 좀 더 복잡한 세포는 더 큰 수용 영역을 가지고 있으며 패턴의 위치가 변하지 않을 때 활성 화된다.

4.2.2 직관적으로 보기 순방향 다층 신경망은 입력으로 단일 일차원 벡터를 받아서 하나 또는 그 이상의 (완전 연결 된) 은닉 계층으로 데이터를 변환한다. 그 후 출력 계층에서 결과를 제공한다. 기존 다층 신경 망에서 이미지 데이터를 다룰 때 문제는 신경망이 이미지 데이터를 입력으로 받도록 확장되지 않는다는 점이다. 예를 들어 CIFAR-10 데이터셋을 모델링한다고 생각해보자. 학습해야 할 이 미지는 너비 32픽셀, 높이 32픽셀에 RGB 채널 세 개를 가지고 있다. 하지만 첫 번째 은닉 계 층에서 뉴런 하나당 가중치가 3,072개 생성되고 아마도 그 은닉 계층에 한 개 이상의 뉴런이 필요할 것이다. 많은 경우 다층 신경망에서는 은닉 계층 여러 개가 필요하고 그에 따라 가중치 도 배가 될 것이다.

11 「A Convolutional Encoder Model for Neural Machine Translation」( Gehring et al., 2016 ) ( https://arxiv.org/ abs/1611.02344 ) 12 「Deep Convolutional Neural Networks for Sentiment Analysis of Short Texts」(Nogueira dos Santos, Gatti, 2014 ) (http://www.aclweb.org/anthology/C14-1008 ) 13 「Seeing it all : Convolutional network layers map the function of the human visual system」(Eickenberg et al., 2017 ) (http://bit.ly/2sOwuo5 )

4장 주요 심층 신경망 구조 159


CIFAR-10 데이터셋 CIFAR-10은 알렉스 크리체브스키, 비노드 나이르, 제프리 힌튼이 만든 유명한 이미지 분류 벤 치마크 데이터셋 14 이다. 서로 다른 클래스 10개에 클래스마다 이미지 6,000장으로 구성되어 있 는 총 60,000장의 컬러 이미지다. 이미지는 32 × 32 픽셀이며 학습 이미지 50,000장과 테스트 이미지 10,000장으로 나뉜다. [그림 4-8]은 데이터셋 내의 클래스별 이미지 샘플이다. 그림 4-8 CIFAR -10 데이터셋

비행기 자동차

고양이

사슴

개 개구리

트럭

클래스는 서로 겹치지 않는다. 즉, 트럭 클래스에는 트럭 이미지만 들어 있다. 데이터셋 크기는 약 170MB다.

일반적인 이미지는 보통 너비 300픽셀, 높이 300픽셀, RGB 3채널 정도다. 이 경우 은닉 뉴런 당 가중치 연결이 270,000개 발생한다. 이 예는 완전 연결 다층 신경망이 이미지 데이터를 모 델링할 때 얼마나 많은 연결을 생성하는지 보여준다. 이러한 이미지 데이터의 구조를 수용할 14 http://www.cs.toronto.edu/~kriz/cifar.html

160 자바를 활용한 딥러닝


CHAPTER

5

심층 신경망 구축하기

지금은 가지고 있지 않은 것에 대해 생각할 때가 아니다. 있는 것을 가지고 무엇을 할 수 있는지 생각하라. _어니스트 헤밍웨이, 『노인과 바다』

이 장에서는 DL4J에서 사용하는 도구와 프로젝트에서 사용하는 실제 예제를 살펴볼 것이다. 심층 신경망을 적절한 문제에 어떻게 대응하는지 검토하고, DL4J 라이브러리와 함께 제공되는 많은 핵심 예제에 대해 살펴볼 것이다. NOTE_ DL4J 설치 및 지원은 부록 G를 참조하라.

5.1 심층 신경망을 올바른 문제에 일치시키기 4장에서 소개한 주제는 입력 데이터를 수작업으로 생성하는 것이 아니라 딥러닝을 통해 문제 에 맞는 신경망 아키텍처를 어떻게 설계하는가에 대한 것이다. 이 장에서는 특정 타입의 문제 와 일치하는 심층 신경망의 예를 살펴본다. 이 장의 목적에 맞게 다음과 같은 용도로 특별한 애 플리케이션을 만들어본다.

5장 심층 신경망 구축하기 201


열 기반 데이터 모델링

이미지 데이터 모델링

시퀀스/시계열 데이터 모델링

자연어 처리 애플리케이션

이 장에서 다루는 애플리케이션은 1장 이후에 구축한 심층 신경망의 개념을 실제로 보여준다.

4장에서 언급한 모든 아키텍처에 대한 예제는 없지만, 대부분의 예제를 새로운 목적에 맞게 쉽 게 확장할 수 있도록 딥러닝의 핵심 개념을 설명했다. 앞에서 소개한 것처럼 올바른 신경망 아 키텍처에 적합한 데이터 타입을 검토한다.1 NOTE_ 온라인에서 예제를 확인하는 방법

이 책의 예제는 깃허브 저장소1 에서 확인할 수 있다. DL4J와 같은 프로젝트가 시간이 지남에 따라 업데이트 되더라도, 이 저장소에서 제공하는 코드는 현재 책에서 제공하는 버전에서 항상 작동할 것이다.

5.1.1 열 기반 데이터와 다층 퍼셉트론 일반적인 열 기반 데이터는 정적 구조를 가지며, 고전적인 다층 퍼셉트론 신경망을 이용하여

DL4J에서 가장 잘 모델링된다. 열 기반 데이터를 사용하는 문제들은 특징 엔지니어링을 통해 쉽게 다룰 수 있지만, 간혹 신경망이 자체적으로 데이터셋에서 최상의 가중치를 찾도록 할 수 있다. 하이퍼파라미터 튜닝은 다층 퍼셉트론을 사용하여 모델링할 때 주요 도전과제다. 6장에 서 하이퍼파라미터 선택을 살펴볼 때 도움이 되는 다양한 기법을 다룰 것이다.

5.1.2 이미지와 합성곱 신경망 합성곱 신경망은 이미지의 원시 데이터에서 구조를 찾는 데 뛰어나다. 역사적으로 이미지 모델 링 분야는 정렬된 입력 이미지 데이터를 얻는 데 과도한 양의 전처리 기법을 사용해왔지만 모 델링 기법이 더 잘 처리하는 형태로 변환되었다. 약간의 회전이나 크기 변화만으로도 이미지 처리는 힘든 작업이 된다. 합성곱 신경망은 이러한 작업을 쉽게 할 수 있도록 해서 신경망이 원 시 이미지 데이터를 처리하고, 실무자가 신경망 구조를 조정하는 데 집중할 수 있게 해준다. 이 1 http://bit.ly/2uy8ClX

202 자바를 활용한 딥러닝


장 뒷부분에서 합성곱 신경망을 사용하여 손으로 쓴 숫자를 분류하는 예제를 살펴보겠다. NOTE_ 합성곱 신경망과 원시 이미지 데이터

열 기반 데이터는 특정 열(컬럼)에 정렬된 모든 특징으로 나타낸다. 역사적으로 머신러닝 모델링은 특징이 모델이 예상하는 올바른 ‘지점’에 있지 않을 때 상대적으로 취약하다. 이미지의 객체는 원하거나 기대하는 지점에 거의 나타나지 않으며 고전적인 머신러닝 기법의 특징 추출 단계 에서 중요한 도전과제를 제공한다. 합성곱 신경망의 가장 큰 강점은 장면의 객체가 임의의 자세를 취하더라 도 원시 이미지 데이터를 가져오고 해당 특징을 잘 인식하는 능력이다.

합성곱 신경망 애플리케이션의 발전 합성곱 신경망을 사용한 애플리케이션은 끊임없는 속도로 계속 발전한다. 실무자들이 이미지 모 델링을 할 때 합성곱 신경망으로 시작하는 것을 추천하며, 텍스트 모델링 문제에도 이러한 신경 망의 애플리케이션을 사용하는 것이 좋다. 다음은 이러한 애플리케이션 중 일부다. 기 계 번역 2

문 장 구분 3

감 정 분석 4

이미지 영역 위로 윈도우를 슬라이드하는 것과 같은 방식으로 합성곱 신경망은 일련의 문자 위 로 윈도우를 슬라이드할 수 있다. 이 특징은 위치-불변성 측면에서 합성곱 신경망을 강력한 심 층 신경망 도구로 만든다. 이 장에서는 이미지 데이터에 합성곱 신경망을 적용하는 예제를 중점 적으로 다룬다. 이 예제를 신경망 구조의 끝이라고 생각하지 말고, 더 연구해야 할 출발점으로 생각하면 좋겠다.

5.1.3 시계열과 순환 신경망 웹 로그 데이터와 같은 순차 데이터로 작업할 때는 순환 신경망이 적합하다. 모든 샘플에 대해 타임스탬프가 있는 순차 데이터가 있을 때 이 데이터를 시계열 데이터로 간주한다. 2 「Neural Machine Translation in Linear Time」(Kalchbrenner et al., 2016 ) (https://arxiv.org/abs/1610.10099 ) 3 「Convolutional Neural Networks for Sentence Classification」(Kim, 2014 ) (http://arxiv.org/abs/1408.5882 ) 4 「Deep Convolutional Neural Networks for Sentiment Analysis of Short Texts」(Nogueira dos Santos, Gatti, 2014 ) (http://www.aclweb.org/anthology/C14-1008 )

5장 심층 신경망 구축하기 203


시계열 데이터와 순차 데이터를 2차원 그래프로 나타낼 때는 파형으로 나타낸다. 종종 우리는 시간의 순서에 따라 특정 패턴을 만들어내는 그래프를 그리고자 한다. 이것은 이미지 데이터가

2차원 격자 배열로 형성되는 것과 대조적이다. 그러나 시계열과 이미지 모두에서 우리는 데이 터에서 발생하는 특정 객체를 찾고 있다. 이러한 객체는 크기가 조정될 수 있으며, 일반적으로 데이터의 매번 같은 위치에 나타나지 않아서 모두에게 도전과제를 제공한다. 순환 신경망은 시계열 데이터에 대한 시간 영역을 더욱 잘 모델링하기 위해 다층 퍼셉트론에서 발전해왔다. 4장에서 보았듯이 순환 신경망은 일련의 입력 벡터가 순환 신경망 모델에 대한 단 일 논리 입력으로 취급되도록 해서 시간 영역을 더 잘 모델링할 수 있다. NOTE_ 센서, 로그, 기타 측정 방법

시간에 따라 측정해야 하는 소스가 있는 데이터셋을 처리할 때는 시간의 범위에서 데이터 변경을 더 잘 모델 링하는 순환 신경망을 사용하라.

분류, 회귀 및 새로운 출력 생성에 순환 신경망을 사용할 수 있다. 이 장 뒷부분에서 분류와 생 성의 예를 볼 수 있다.

모델 선택의 회의적인 시각 랜덤 포레스트 random forest 와 같은 다른 머신러닝 기법으로 큰 성공을 발견했다는 사례도 있다. 그 러나 순차 데이터를 이용할 때는 특정 상황을 제외하고 일반적으로 다른 기법은 적합하지 않다. 일부 전문가는 시계열이 일종의 평평한 벡터 표현으로 변환되어야 하기 때문에 순환 신경망으로 하는 것과 같은 방식으로 시계열/순차 데이터에 랜덤 포레스트를 직접 적용할 수 없다고 주장한 다 5 (예 : 추출 기능). 일반적으로 ‘딥러닝 모델을 이용한 자동화’와 ‘강력한 모델을 활용한 수작업’을 비교하는 소모적 인 논쟁을 하고는 한다. 실무자가 특정 데이터셋의 입력에서 특징들을 발견하고 분류할 때까지 더 나은 기능을 개발하려면 지속적으로 노력을 들여야 한다. 따라서 ‘딥러닝 모델’을 활용한 자동 화가 좀 더 나은 방법일 것이다.

5 「iSax: Indexing and Mining Terabyte Sized Time Series」(Shieh , Keogh , 2008 ) (http://www.cs.ucr.edu/~eamonn/ iSAX.pdf )

204 자바를 활용한 딥러닝


시계열에 대한 딥러닝의 진정한 장점이자 동시에 문제점을 유발하는 원인은 다음과 같다. 시계열 데이터당 맞춤형 특징을 찾는 알고리즘을 구현하는 접근법을 사용한다면 모든 시계열 데 이터에 대해 새로운 코드를 작성하고 새로운 문제를 적용해야 한다. 순수한 소프트웨어 공학 세 계에 있다면 이 상황을 기술적 부채라고 생각할 것이다. 지금까지 이러한 기술적 부채가 해결되 지 않고 있다. 적절한 특징이 무엇인지 모르는 상황에서 모델링한다면 신경망의 하이퍼파라미터를 튜닝해서 적절한 특징을 찾는 방법이 특징 엔지니어링을 이용해 직접 특징을 찾는 방법보다 쉽다. 잘 설계 된 딥러닝 시스템(하이퍼파라미터 튜닝 포함)은 효율적으로 재사용될 수 있으며, 다양한 문제에 걸쳐 매우 잘 수행될 것이다. 긴 의존성을 가진 가변 길이 시계열 데이터에는 순환신경망이 적합하고, 입력이 고정 길이인 열 기반 데이터(모든 시계열 데이터가 동일한 길이인 경우)에는 다층 퍼셉트론 혹은 합성곱 신경망 이 적합하다. 그러나 모든 입력 데이터 히스토리를 고려하는 임의의 긴 열 기반 데이터 입력을 허용하려면 순 환 신경망(또는 커다란 숨겨진 상태 공간을 가지도록 신중하게 제작된 마르코프 Markov 모델)이 기본적으로 유일한 선택이다.

5.1.4 하이브리드 신경망 사용하기 동영상과 같이 시간과 이미지를 조합한 데이터를 볼 때는 LSTM과 합성곱 계층을 조합한 하이 브리드 신경망을 사용한다. LSTM 신경망은 비디오에서 시간이 지남에 따라 이미지를 변경하는 시간적 측면을 캡처할 수 있고, 합성곱 계층은 프레임 데이터 자체에서 구조를 캡처할 수 있다.

5.2 DL4J 도구 모음 DL4J는 아래 기능을 수행하는 딥러닝 도구 모음이다. 통합

벡터화

모델링

평가

5장 심층 신경망 구축하기 205


이 도구들은 여러 플랫폼에서 작동하도록 설계되었고 하나의 기능만 실행하는 것이 아니라 여 러 기능을 한번에 실행하는 병렬화가 가능하다. DL4J는 처음부터 현대적인 실행 플랫폼을 염 두에 두고 설계되었기 때문에 다른 머신러닝 라이브러리가 지난 10년 동안 경험한 병렬화 문 제에 대한 어려움을 겪지 않았다. 또한 DL4J 커뮤니티는 스파크나 하둡 분산 파일 시스템과 같 은 플랫폼과의 더 나은 통합을 제공하고자 기본적인 모델링에 대한 최적화 이상의 요구사항에 관심을 기울여왔다. DL4J는 DataVec을 도입함으로써 최적화된 벡터화를 제공한다.

DL4J는 자바 가상 머신 위에서 기업이 요구하는 딥러닝 기능을 제공한다. 또한 C++의 빠른 처리 속도와 병렬 처리 방식에 대한 이득을 얻고자 스파크를 같이 사용한다. 도구를 설정하는 방법에 대해 알아보기 전에 DL4J의 구성에 대해 살펴보자.

5.2.1 벡터화와 DataVec 신경망은 벡터에 대해서만 학습할 수 있기 때문에 데이터 벡터화라는 전처리 단계가 반드시 필 요하다. DL4J의 구성요소 중 핵심 라이브러리 도구로 모델링하기에 적합한 벡터화된 데이터를 신속하게 생성하는 DataVec 라이브러리가 있다. DataVec은 이 책 후반부에서 확인할 수 있 듯이 아파치 스파크의 로컬 모드와 병렬 실행 모드로 작동한다.

5.2.2 ND4J와 실행 환경 ND4J는 과학적 계산을 제공하는 자바 가상 머신 기반 라이브러리다. 이 라이브러리 구문은 넘 파이와 매트랩의 구문을 에뮬레이션한다. 선형대수 및 대규모 행렬 조작에 사용하는 자바용

n 차원 배열을 제공한다. ND4J는 사용자가 구현 코드를 변경하지 않고도 컴퓨터에서 GPU로 데이터를 스왑하는 깨끗한 숫자 파사드 façade 를 제공한다. 선형대수의 구현을 작성한 다음에

ND4J에 대한 백엔드를 메이븐에서 지정할 수 있다. ND4J의 가장 일반적인 백엔드는 x86과 jcublas를 포함한다. DL4J 프로젝트 개발에는 결국 OpenCL과 Power8이 포함된다. ND4J 는 JVM 기반 언어를 사용하는 프로그래머에게 익숙한 환경을 제공하는 자바 및 스칼라 API를 모두 포함한다. ND4J API는 넘파이의 기능을 가능한 한 간결하고 쉽게 제공하기 위한 것이다.

DL4J 자바 API를 사용하면 프로그래머는 구성 가능한 프레임워크 내에서 확장 가능한 신경망 을 구현하여 필요에 따라 하이퍼파라미터를 조정할 수 있다. 신경망에 데이터를 작성, 조정, 평

206 자바를 활용한 딥러닝


가 및 적재하는 공간을 제공한다. ND4J의 API는 넘파이와 유사한 환경(개발자가 여러 CPU 또는 GPU를 사용해 분산 처리 환경에 배포할 수 있음)에서 필수 선형대수, 미적분 및 신호 처 리 함수를 제공한다. 자바 API와 ND4J 백엔드는 오늘날 기업의 딥러닝 애플리케이션에 필요 한 실무자의 프로그래밍 방식과 접근성에 최적화되어 있다.

5.2.3 ND4J 속도의 중요성 딥러닝 분야에서는 더 빠른 계산이 항상 필요하다. ND4J는 다음 세 가지 주요 방법으로 좀 더 빠른 선형대수 처리 속도를 제공한다. J avaCPP 사용

C PU 백엔드

G PU 백엔드

ND4J가 심층 모델을 더 빨리 모델링하는 데 도움이 되는 이들 개선사항에 대해 알아보자.

JavaCPP C ++용 JNI 바인딩 자동 생성

자바에서 C++ 바이너리를 손쉽게 유지 관리하고 배포할 수 있게 해준다.

CPU 백엔드 O penMP (네이티브 실행 환경에서의 멀티스레딩)

O penBLAS 또는 MKL (BLAS 작업)

S IMD 확장

GPU 백엔드 D L4J는 현재 Cuda 7.5 (+cuBLAS )를 지원하며, 곧 8.0을 지원할 것이다.

또한 cuDNN 6 을 사용한다.

6 옮긴이_ CUDA Deep Neural Network Library, 엔비디아에서 제공하는 딥러닝 프레임워크

5장 심층 신경망 구축하기 207


NOTE_ GPU 지원 설정하기

DL4J의 GPU 세팅에 대한 자세한 정보는 부록 I에서 확인할 수 있다.

5.2.4 ND4J와 DL4J 성능 측정 DL4J가 다른 주요 딥러닝 라이브러리와 어떻게 다른지 비교하려면 깃허브 프로젝트 7를 참고 하라.

DL4J는 [표 5-1]에 나와 있는 것처럼 다른 라이브러리보다 적은 리소스를 사용한다. 표 5-1 LeNet 예제와 w/cuDNN 패키지

CPU

GPU

멀티

정확도

Dl4j

20m08s

3m13s

1m18s

~99.0%

Caffe

19m52s

53s

1m14s

~99.0%

Tensorflow

5m15s

1m44s

2m44s

~98.6%

Torch

18m03s

6m25s

3m50s

~98.3%

DL4J 커뮤니티는 계속해서 ND4J와 DL4J 성능 향상을 도모한다. 성능 측정 결과는 언제든지 오픈 벤치마크 8에서 확인할 수 있다.

5.3 DL4J API의 기본 개념 이 절에서는 대부분의 DL4J 예제에서 사용하는 핵심 기술을 빠르게 훑어본다. API 사용에 대 한 자세한 내용은 부록 E 또는 DL4J 온라인 문서 9를 참고하라.

7 https://github.com/deeplearning4j/dl4j-benchmark 8 https://github.com/deeplearning4j/dl4j-benchmark 9 옮긴이_ 한글로 번역된 사이트(https://deeplearning4j.org/kr-index )도 제공한다.

208 자바를 활용한 딥러닝


5.3.1 모델 로딩 및 저장 이 절에서는 DL4J API로 하는 몇 가지 공통적인 사항에 대해 알아보자.

학습된 모델을 디스크에 쓰기 ModelSerializer 클래스를 사용하여 모델의 아키텍처와 파라미터를 디스크에 쓸 수 있다. 아

래 예제를 살펴보자. BufferedOutputStream stream = new BufferedOutputStream(...); ModelSerializer.writeModel( trainedNetwork, stream, true );

이 작업은 로컬 디스크나 하둡 분산 시스템 같은 다른 파일 시스템 모두에 쓸 수 있다. 하둡 분산 시스템에 쓰기. 하둡 분산 시스템에 쓰려면 다음과 같이 올바른 Path 클래스( org. apache.hadoop.fs.Path )와 올바른 형식의 하둡 분산 시스템 경로 문자열을 사용해야 한다.

Path modelPath = new Path( hdfsPathToSaveModel ); BufferedOutputStream stream = new BufferedOutputStream( os ); ModelSerializer.writeModel( trainedNetwork, stream, true );

HDFS 파일 경로는 보통 다음과 같다. hdfs:// /path/to/my/file.txt

디스크에 저장된 모델 불러오기 디스크에서 이전에 저장된 DL4J 모델을 불러오려면 다음 코드에서처럼 ModelSerializer 클 래스를 다시 사용해야 한다. InputStream stream = ... MultiLayerNetwork network = ModelSerializer.restoreMultiLayerNetwork( stream );

5장 심층 신경망 구축하기 209


하둡 분산 시스템에서 읽기. 하둡 분산 시스템에서 모델을 직접 불러오려면 같은 API 호출을 사

용하되, 다음과 같이 하둡 FileSystem 클래스를 사용하여 InputStream을 만든다. org.apache.hadoop.conf.Configuration hadoopConfig = new org.apache.hadoop. conf.Configuration(); FileSystem hdfs = FileSystem.get(hadoopConfig); InputStream stream = hdfs.open( new Path( hdfsPathToSavedModelFile ) ); MultiLayerNetwork network = ModelSerializer.restoreMultiLayerNetwork( stream );

5.3.2 모델을 위한 입력값 얻기 DL4J는 학습 및 채점 모델을 위한 데이터 구조에 NDArray를 사용한다. DataSet 객체 내에서 입력과 출력으로 NDArray를 사용하는 것을 간혹 볼 수 있다. DataSet 클래스 사용에 대한 자 세한 내용은 부록 E에서 확인할 수 있다. NOTE_ 데이터 벡터화

DL4J 모델에 사용할 원시 데이터를 NDArray 벡터로 변환하는 방법은 부록 E와 부록 F에서 확인할 수 있다.

학습하는 동안 데이터 불러오기 DL4J 모델링 프로젝트의 학습 및 테스트 진행 중에는 RecordReaders로 파일 형식의 데이터 를 구문 분석한 다음 데이터를 미니배치로 함께 처리해서 데이터를 불러온다. RecordReaders

이 클래스는 파일 형식에서 특정 벡터를 구문 분석하고, 데이터값을 표준화된 NDArray에 저장한다. DataSetIterator

이 클래스는 RecordReaders와 함께 작동하여 각 레코드에 대해 생성된 NDArray를 가져와서 학습용

NDArrays의 미니배치를 만든다.

CAUTION_ 스파크 데이터 불러오기

스파크 데이터 불러오기 패턴은 하둡 혹은 디스크에서 데이터를 불러오는 패턴과 유사하지만 특별 클래스를 사용하여 스파크 및 HDFS에서 데이터를 불러온다. 이에 대해서는 9장 ‘스파크에서 딥러닝과 DL4J 사용하 기’에서 자세히 다룬다.

210 자바를 활용한 딥러닝


5.3.3 모델 구조 설정하기 DL4J로 모델링한 각각의 신경망은 특정 아키텍처를 구성해야 한다. 4장에서 논의한 주요 아키 텍처에 대한 개념은 DL4J에서 신경망 구조를 설정하는 방법과 일치한다.

계층 기반의 구조 만들기 NeuralNetConfiguration 객체는 DL4J 신경망에서 계층을 구축하는 데 사용되는 기본 객체

다. 다음 예제와 같이 결합된 많은 단일 계층이 신경망을 구성한다. MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder() .seed(seed) .iterations(1) .optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT) .learningRate(learningRate) .updater(Updater.NESTEROVS).momentum(0.9) .list() .layer(0, new DenseLayer.Builder().nIn(numInputs).nOut(numHiddenNodes) .weightInit(WeightInit.XAVIER) .activation(Activation.RELU) .build()) .layer(1, new OutputLayer.Builder(LossFunction.NEGATIVELOGLIKELIHOOD) .weightInit(WeightInit.XAVIER) .activation(Activation.SOFTMAX) .nIn(numHiddenNodes).nOut(numOutputs).build()) .pretrain(false).backprop(true).build();

계층을 추가한 뒤 각 계층을 구체적으로 구성하고 이 구성 클래스를 이용해 의도한 신경망 구조 를 디자인한다.

하이퍼파라미터 NeuralNetConfiguration 객체를 사용하면 다음과 같이 학습과 관련된 많은 하이퍼파라미터

를 설정할 수 있다. .learningRate(learningRate) .updater(Updater.NESTEROVS).momentum(0.9)

5장 심층 신경망 구축하기 211


위 코드에서는 주어진 MultiLayerConfiguration 객체에 대해 학습률, 업데이터 및 모멘텀 값과 같은 하이퍼파라미터를 설정해서 신경망 학습 방법을 제어할 수 있다. 이 장 후반부에서 는 다른 신경망 구조에 대한 하이퍼파라미터 설정 전략을 살펴보도록 하겠다.

5.3.4 학습과 검증 신경망 아키텍처를 구성하고 RecordReaders 객체 및 Iterator ( )를 통해 데이터를 로드한 후 에는 모델을 학습시켜야 한다. 여러 에포크를 설정하고 신경망에서 fit ( ) 메서드를 호출하여 학습된 데이터를 파라미터로 전달해야 한다. model.fit( trainingDataIter );

이 메서드는 Iterator ( )에 의해 참조되는 모든 데이터셋의 모든 학습 데이터를 순환하고 신 경망이 순환을 완료한 뒤 학습된 모델을 반환한다. 각 학습 에포크는 입력 데이터셋에 대한 전체 전달로 간주된다. 다음 코드에서는 입력 데이터셋 에 대한 반복문에서 .fit ( ) 메서드를 호출하는 모델을 볼 수 있다. for ( int n = 0; n < nEpochs; n++) { model.fit( trainingDataIter ); }

이 장 후반부의 예제에서 에포크 루프를 관리하는 이 패턴을 흔히 볼 수 있다.

예측하기 예측에 대해 좀 더 이해하고 싶다면 부록 E를 참조하라.

학습, 검증, 테스트 데이터 보통은 학습 데이터를 학습 및 테스트 데이터로 나눈다. 그러나 검증에 대한 부분도 나누는 것 이 좋다. 검증 데이터를 사용해 학습을 일찍 중단시키는 것도 가능하기 때문이다.

212 자바를 활용한 딥러닝


5.4 다층 퍼셉트론 신경망으로 CSV 데이터 모델링하기 본격적으로 DL4J를 사용하기에 앞서 비교적 쉬운 다층 퍼셉트론 모델을 만들어보자. 이 구형 신경망 구조를 통해 DL4J API의 기본 사용법을 알아볼 것이다. 이 책의 깃허브 저장소에는

Saturn이라는 합성 비선형 데이터셋 10을 모델링하는 자바 예제가 있다. [예제 5-1]은 깃허브 저장소11에서 받을 수 있다. 예제 5-1 다층 퍼셉트론 예제

public class MLPClassifierSaturn { public static void main(String[] args) throws Exception { Nd4j.ENFORCE_NUMERICAL_STABILITY = true; int batchSize = 50; int seed = 123; double learningRate = 0.005; // 데이터의 전체 통과 횟수 int nEpochs = 30; int numInputs = 2; int numOutputs = 2; int numHiddenNodes = 20; final String filenameTrain = new ClassPathResource("/classification/saturn_data_train.csv") .getFile().getPath(); final String filenameTest = new ClassPathResource("/classification/saturn_data_eval.csv") .getFile().getPath(); // 학습 데이터 로드 RecordReader rr = new CSVRecordReader(); rr.initialize(new FileSplit(new File(filenameTrain))); DataSetIterator trainIter = new RecordReaderDataSetIterator(rr,batchSize,0,2); // 테스트/검증 데이터 로드 RecordReader rrTest = new CSVRecordReader();

10 Dr. Jason Baldridge가 신경망 프레임워크의 기본적인 기능을 테스트하려고 만든 데이터셋 11 https://goo.gl/Awfi5Z

5장 심층 신경망 구축하기 213


rrTest.initialize(new FileSplit(new File(filenameTest))); DataSetIterator testIter = new RecordReaderDataSetIterator(rrTest,batchSize,0,2); // log.info("Build model...."); MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder() .seed(seed) .iterations(1) .optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT) .learningRate(learningRate) .updater(Updater.NESTEROVS).momentum(0.9) .list() .layer(0, new DenseLayer.Builder().nIn(numInputs) .nOut(numHiddenNodes) .weightInit(WeightInit.XAVIER) .activation(Activation.RELU) .build()) .layer(1, new OutputLayer.Builder(LossFunction.NEGATIVELOGLIKELIHOOD) .weightInit(WeightInit.XAVIER) .activation(Activation.SOFTMAX) .nIn(numHiddenNodes).nOut(numOutputs).build()) .pretrain(false).backprop(true).build(); MultiLayerNetwork model = new MultiLayerNetwork(conf); model.init(); model.setListeners(new ScoreIterationListener(10)); // 점수를 매 10 파라미터 // 업데이트마다 출력 for ( int n = 0; n < nEpochs; n++) { model.fit( trainIter ); } System.out.println("Evaluate model...."); Evaluation eval = new Evaluation(numOutputs); while(testIter.hasNext()){ DataSet t = testIter.next(); INDArray features = t.getFeatureMatrix(); INDArray lables = t.getLabels(); INDArray predicted = model.output(features,false); eval.eval(lables, predicted); } System.out.println(eval.starts());

214 자바를 활용한 딥러닝


// 학습 완료. 아래 코드는 데이터 플로팅과 예측을 위한 코드 double double double double

xMin xMax yMin yMax

= = = =

-15; 15; -15; 15;

// x/y 입력 공간의 모든 점에서 예측을 평가하고 이것을 백그라운드에서 플롯한다. int nPointsPerAxis = 100; double[][] evalPoints = new double[nPointsPerAxis*nPointsPerAxis][2]; int count = 0; for( int i=0; i<nPointsPerAxis; i++ ){ for( int j=0; j<nPointsPerAxis; j++ ){ double x = i * (xMax-xMin)/(nPointsPerAxis-1) + xMin; double y = j * (yMax-yMin)/(nPointsPerAxis-1) + yMin; evalPoints[count][0] = x; evalPoints[count][1] = y; count++; } } INDArray allXYPoints = Nd4j.create(evalPoints); INDArray predictionsAtXYPoints = model.output(allXYPoints); // 학습된 모든 데이터를 단일 배열로 모으고 플롯한다. rr.initialize(new FileSplit(new File(filenameTrain))); rr.reset(); int nTrainPoints = 500; trainIter = new RecordReaderDataSetIterator(rr,nTrainPoints,0,2); DataSet ds = trainIter.next(); PlotUtil.plotTrainingData(ds.getFeatures(), ds.getLabels(), allXYPoints, predictionsAtXYPoints, nPointsPerAxis); // 테스트 데이터를 얻고, 신경망을 통해 테스트 데이터를 실행하여 예측을 생성하고, // 그 예측을 플롯한다. rrTest.initialize(new FileSplit(new File(filenameTest))); rrTest.reset(); int nTestPoints = 100; testIter = new RecordReaderDataSetIterator(rrTest,nTestPoints,0,2); ds = testIter.next(); INDArray testPredicted = model.output(ds.getFeatures()); PlotUtil.plotTestData(ds.getFeatures(), ds.getLabels(), testPredicted, allXYPoints, predictionsAtXYPoints, nPointsPerAxis);

5장 심층 신경망 구축하기 215


System.out.println("****************Example finished****************"); } }

다음 절에서는 Saturn 데이터셋을 모델링하는 방법을 코드로 살펴볼 것이다.

5.4.1 입력 데이터 설정 입력 데이터는 아래 형식과 같이 비선형 데이터셋이다. 1,-7.1239700674365,-5.05175898010314 0,1.80771566423302,0.770505522143023 1,8.43184823707231,-4.2287794074931 0,0.451276074541732,0.669574142606103 0,1.52519959303934,-0.953055551414968

첫 번째 열은 행의 레이블이고 두 번째 열과 세 번째 열은 두 개의 독립변수 열을 나타낸다.

DL4J 이터레이터 iterator (반복자)로 데이터셋을 참조해야 하므로 CSVRecordReader로 데이터 를 로드한다. // 학습 데이터 로드 RecordReader rr = new CSVRecordReader(); rr.initialize(new FileSplit(new File(filenameTrain))); DataSetIterator trainIter = new RecordReaderDataSetIterator(rr,batchSize,0,2);

RecordReaderDataSetIterator ( ) 내에서 레코드 판독기에 데이터가 얼마나 많은 열을 가지

고 있고 어떤 열이 레이블로 표현되는지 알려줘야 하기 때문에 파라미터로 레이블 열과 전체 열 수를 전달해야 한다.

5.4.2 신경망 구조 결정하기 우리는 기본적인 다층 퍼셉트론을 구성할 것이다. 다음과 같이 MultiLayerConfiguration 객 체를 사용하여 다층 퍼셉트론(및 모든 DL4J 신경망 구조)을 설정한다.

216 자바를 활용한 딥러닝


// log.info("Build model...."); MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder() .seed(seed) .iterations(1) .optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT) .learningRate(learningRate) .updater(Updater.NESTEROVS).momentum(0.9) .list() .layer(0, new DenseLayer.Builder().nIn(numInputs).nOut(numHiddenNodes) .weightInit(WeightInit.XAVIER) .activation(Activation.RELU) .build()) .layer(1, new OutputLayer.Builder(LossFunction.NEGATIVELOGLIKELIHOOD) .weightInit(WeightInit.XAVIER) .activation(Activation.SOFTMAX) .nIn(numHiddenNodes).nOut(numOutputs).build()) .pretrain(false).backprop(true).build(); MultiLayerNetwork model = new MultiLayerNetwork(conf); model.init(); model.setListeners(new ScoreIterationListener(10)); // 점수를 매 10 파라미터 // 업데이트마다 출력

예제는 다음 두 계층을 가진다. DenseLayer : 완전 연결 계층

OutputLayer : 출력 계층

신경망 구조의 특정 내용에 대해 알아보자.

일반적인 하이퍼파라미터 아래의 파라미터를 사용해서 알고리즘 최적화를 진행한다. .optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT)

이 코드는 DL4J 가 확률적 경사 하강법을 사용하여 알고리즘 ( OptimizationAlgorithm. STOCHASTIC_GRADIENT_DESCENT )을 최적화한다. 학습률을 다음과 같이 설정한다.

5장 심층 신경망 구축하기 217


.learningRate(learningRate)

DL4J에 대해 아래와 같이 모멘텀이 0.9로 설정된 파라미터 NESTEROVS를 업데이트한다. .updater(Updater.NESTEROVS).momentum(0.9)

첫 번째 은닉 계층 첫 번째 은닉 계층은 벡터화 파이프라인에서 생성한 입력값을 사용한다. 이러한 값은 일반적으 로 다양한 형식으로 정규화한 후 [-1.0, 1.0] 또는 [0.0, 1.0] 범위를 가진다. .layer(0, new DenseLayer.Builder().nIn(numInputs).nOut(numHiddenNodes) .weightInit(WeightInit.XAVIER) .activation(Activation.RELU) .build())

여기서 계층은 입력 벡터의 독립변수 열 수와 같은 수의 입력 뉴런을 가질 필요가 있다. .nIn(numInputs)

계층에 대한 출력 수는 단순히 신경망의 다음 계층에 있는 뉴런 수다. 이 경우 이 숫자는 numHiddenNodes 변수로 표시된다. 이 계층의 경우 WeightInit.XAVIER를 사용하여 특별히 가

중치를 초기화하고, 활성화함수는 수정된 선형함수를 사용한다. .weightInit(WeightInit.XAVIER) .activation(Activation.RELU)

이 신경망의 다음 계층인 출력 계층을 살펴보자.

분류를 위한 출력 계층 여기서 사용할 출력 계층의 활성화함수는 소프트맥스다. 4장에서 여러 레이블에 대해 소프트

218 자바를 활용한 딥러닝


맥스 출력 계층을 사용했던 것을 잊지 말자. 예제에서는 바이너리 분류자를 만들고 있다. 따라 서 시그모이드 활성화함수를 사용할 수도 있다. .layer(1, new OutputLayer.Builder(LossFunction.NEGATIVELOGLIKELIHOOD) .weightInit(WeightInit.XAVIER) .activation(Activation.SOFTMAX) .nIn(numHiddenNodes).nOut(numOutputs).build())

예상되는 입력 수는 이전 계층(입력 계층)에서의 출력 수와 같다. 출력값의 개수는 이진 분류 이기 때문에 두 개이며 소프트맥스는 각 분류별로 점수를 부여한다. NOTE_ 출력 계층의 활성화함수는 시그모이드나 소프트맥스 중 어떤 것을 사용해야 할까?

시그모이드 단일 출력을 수학적으로 사용하는 것은 두 출력 단위가 있는 소프트맥스를 활성화함수로 사용한 출력 계층과 같다. MCXENT 혹은 NegativeLogLikelihood 및 원-핫 벡터 표현을 사용해서 [0] 또는 [1] 대신 [1, 0] 또는 [0, 1]을 사용하면 시그모이드 대신 소프트맥스를 활용할 수 있도록 바꿀 수 있다. 원-핫 벡터 표현은 아래에 설명되어 있다.

또한 소프트맥스 출력 계층과 일반적으로 쌍을 이루고 있기 때문에 여기에서 음의 로그 가능도 손실함수를 사용하도록 출력 계층을 지정한다.

원-핫 벡터 표현 원-핫 one-hot 벡터 표현에서는 벡터의 단일 열 값만 1.0을 값으로 가질 수 있는 비트 그룹이 있다. 다른 모든 열 값은 0.0이다. 이 벡터 표현 방법은 ‘1 of K’ 체계를 사용하여 범주형 정수 특징을 표현하는 데 자주 사용된다. [표 5-2]에 값의 표준적인 2진 표현(0-4 )의 예와 원-핫 벡터 표현 의 예를 나타냈다. 표 5-2 시각적으로 표현된 원-핫 벡터 값

이진값

원-핫 벡터 표현

0

000

00000001

1

001

00000010

2

010

00000100

3

011

00001000

4

100

00010000

5장 심층 신경망 구축하기 219


5.4.3 모델 학습 모델을 학습하기 위해 주어진 에포크 수(즉, 전체 데이터셋을 학습하는 횟수)에 대한 입력 데 이터셋을 입력하면서 신경망을 학습시키는 for 루프를 작성한다. for ( int n = 0; n < nEpochs; n++) { model.fit( trainIter ); }

MultiLayerNetwork 클래스 인스턴스에서 fit ( ) 메서드를 호출해서 전체 데이터를 학습시킨

다. 입력 데이터셋의 반복문에서 설정했던 미니배치 크기와 같은 적절한 하이퍼파라미터를 적 용한다. DataSetIterator testIter = new RecordReaderDataSetIterator(rrTest,batchSize,0,2);

이때 배치 크기 변수(batchSize )는 디스크에서 수집되어 학습 모델로 전달되는 학습 데이터 수를 제어한다. 모델이 학습 중일 때 다음과 비슷한 콘솔 출력을 보여줘야 한다. o.d.o.l.ScoreIterationListener o.d.o.l.ScoreIterationListener o.d.o.l.ScoreIterationListener o.d.o.l.ScoreIterationListener o.d.o.l.ScoreIterationListener

-

Score Score Score Score Score

at at at at at

iteration iteration iteration iteration iteration

0 is 0.6313823699951172 10 is 0.4763660430908203 20 is 0.42963680267333987 30 is 0.39850467681884766 40 is 0.3672478103637695

이 오류 번호는 시간이 지남에 따라 떨어지고 0.0에 가까워지면 학습 데이터에 대한 모델의 학 습이 거의 끝난 것이다.

5.4.4 모델 검증 다음 코드는 새로운 다층 퍼셉트론 모델을 평가하는 방법을 다룬다. 실제 레이블과 예측된 레 이블을 Evaluation 클래스의 인스턴스로 로드하기 위해 testIter 객체 인스턴스를 통해 테스 트 데이터셋을 사용한다.

220 자바를 활용한 딥러닝


System.out.println("Evaluate model...."); Evaluation eval = new Evaluation(numOutputs); while(testIter.hasNext()){ DataSet t = testIter.next(); INDArray features = t.getFeatureMatrix(); INDArray lables = t.getLabels(); INDArray predicted = model.output(features,false); eval.eval(lables, predicted); } System.out.println(eval.stats());

1.7절 ‘모델 평가하기’에서 다룬 F1 점수 및 기타 평가 관련 행렬을 상기해보자. eval.stats ( ) 메서드를 호출하면 다음과 같은 콘솔 출력이 생성된다. Evaluate model.... Examples labeled as 0 classified by model as 0: 48 times Examples labeled as 1 classified by model as 1: 52 times

==========================Scores======================================== Accuracy: 1 Precision: 1 Recall: 1 F1 Score: 1 ========================================================================

F1 점수에 대한 데이터는 상대적으로 간단한 데이터셋이며, 30 에포크 이후 DL4J는 모든 평가 측면에서 완벽한 등급 (1.0 )을 얻을 수 있을 것이다. 이제 더 복잡한 예제로 넘어가자.

5.5 합성곱 신경망을 활용한 손글씨 이미지 모델링 이 장을 시작할 때 논의했듯이 합성곱 신경망은 이미지 분류에 강점이 있다. 이번 예제에서는 손글씨 이미지를 로드하고 모델링하는 방법을 살펴본다. 결과로 나온 합성곱 신경망 모델은 새 로운 손글씨 숫자 이미지를 적절히 분류한다.

5장 심층 신경망 구축하기 221


예제에서는 학습 데이터셋과 테스트 데이터셋에 대한 데이터셋 이터레이터를 설정한다. 학습 데이터셋에서 모델을 학습한 다음 보유한 테스트 데이터셋을 사용해 모델의 정확성을 평가한 다. 학습에 MNIST 손글씨 이미지 데이터셋 12을 사용했다. 이 모델 구조는 이전 예제와 다른 계층과 파라미터를 사용한다. 이 특정 합성곱 신경망은 ‘LeNet’ 으로 알려졌다.13 NOTE_ LeNet

LeNet 합성곱 신경망 구조는 맥스풀링(max-pooling ) 계층이 뒤따르는 일련의 합성곱 계층에 초점을 맞추 는 구조 13 다([예제 5 - 2]는 DL4J에서 구현된 합성곱 신경망 구조를 보여준다).

5.5.1 LeNet 합성곱 신경망에 대한 자바 코드 [예제 5-2]는 MNIST에 대한 LeNet 합성곱 신경망 예제 코드 14다. 예제 5-2 DL4J에서 MNIST 데이터셋을 학습하는 LeNet 구축하기

public class LenetMnistExample { private static final Logger log = LoggerFactory .getLogger(LenetMnistExample.class); public static void main(String[] args) throws Exception { int nChannels = 1; // 입력 채널 수 int outputNum = 10; // 가능한 출력 수 int batchSize = 64; // 테스트 배치 크기 int nEpochs = 1; // 학습 에포크 수 int iterations = 1; // 학습 반복 수 int seed = 123; /* 하나의 Iterator에 대한 배치 크기를 사용하여 Iterator 생성 */ log.info("Load data....");

12 http://yann.lecun.com/exdb/mnist/ 13 「Gradient-based learning applied to document recognition」(Yann LeCun , 1998 )에서 소개함 14 https://goo.gl/b11qnF

222 자바를 활용한 딥러닝


DataSetIterator mnistTrain = new MnistDataSetIterator(batchSize,true,12345); DataSetIterator mnistTest = new MnistDataSetIterator(batchSize,false,12345); /* 신경망 구축

*/ log.info("Build model...."); MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder() .seed(seed) .iterations(iterations) // 학습 반복 횟수 설정 .regularization(true).l2(0.0005) /* 학습 감소 타입과 편향에 대한 다음 주석을 해제하자. */ .learningRate(.01) // .biasLearningRate(0.02) // .learningRateDecayPolicy(LearningRatePolicy.Inverse) // .lrPolicyDecayRate(0.001).lrPolicyPower(0.75) .weightInit(WeightInit.XAVIER) .optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT) .updater(Updater.NESTEROVS).momentum(0.9) .list() .layer(0, new ConvolutionLayer.Builder(5, 5) // nln과 nOut을 지정한다. nIn은 채널 수고 nOut은 적용할 필터 수다. .nIn(nChannels) .stride(1, 1) .nOut(20) .activation(Activation.IDENTITY) .build()) .layer(1, new SubsamplingLayer.Builder(SubsamplingLayer.PoolingType.MAX) .kernelSize(2,2) .stride(2,2) .build()) .layer(2, new ConvolutionLayer.Builder(5, 5) // 이후 계층부터는 nIn을 지정할 필요가 없다. .stride(1, 1) .nOut(50) .activation(Activation.IDENTITY) .build()) .layer(3, new SubsamplingLayer.Builder(SubsamplingLayer.PoolingType.MAX) .kernelSize(2,2) .stride(2,2) .build()) .layer(4, new DenseLayer.Builder().activation(Activation.RELU) .nOut(500).build())

5장 심층 신경망 구축하기 223


.layer(5, new OutputLayer .Builder(LossFunctions.LossFunction.NEGATIVELOGLIKELIHOOD) .nOut(outputNum) .activation(Activation.SOFTMAX) .build()) .setInputType(InputType.convolutionalFlat(28,28,1)) // 아래 주석을 참조하라. .backprop(true).pretrain(false).build(); /* .setInputType(InputType.convolutionalFlat(28,28,1)) 행에 대해 다음과 같은 작업을 수행한다. (a) 합성곱 계층, 서브 샘플링 계층, 완전 연결 계층 사이의 변환을 다루는 전처리를 추가한다. (b) 일부 추가 구성에 대한 검증을 수행한다. (c) 필요하면 이전 계층의 크기를 기반으로 각 계층의 nln 값(입력 뉴런의 수 또는 합성곱 신경망의 경우 입력 깊이)을 설정한다(단, 사용자가 직접 입력한 값은 덮어쓰지 않는다). InputTypes는 합성곱 신경망(CNN)뿐만 아니라 다른 계층 타입(RNN, MLP 등)에도 사용할 수 있다. 일반적인 이미지(ImageRecordReader를 사용하는 경우)에는 InputType.convolutional(height, width, depth)를 사용하자. MNIST 레코드 판독기는 28x28 픽셀 그레이스케일(nChannels = 1) 이미지를 ‘평평한’ 행 벡터 형식 (즉, 1x784 벡터)으로 출력하는 특수한 경우다. 여기서는 ‘convolutionalFlat’ 입력 타입을 사용했다. */ MultiLayerNetwork model = new MultiLayerNetwork(conf); model.init(); log.info("Train model...."); model.setListeners(new ScoreIterationListener(1)); for( int i=0; i<nEpochs; i++ ) { model.fit(mnistTrain); log.info("*** Completed epoch {} ***", i); log.info("Evaluate model...."); Evaluation eval = new Evaluation(outputNum); while(mnistTest.hasNext()){ DataSet ds = mnistTest.next(); INDArray output = model.output(ds.getFeatureMatrix(), false); eval.eval(ds.getLabels(), output); } log.info(eval.stats()); mnistTest.reset(); } log.info("****************Example finished********************"); } }

224 자바를 활용한 딥러닝


CHAPTER

6

심층 신경망 튜닝하기

모든 것은 독이며 독이 없는 것은 없다. 복용량이 독과 약을 결정한다. _파라셀수스1

6.1 심층 신경망 튜닝의 기본 개념 이 장에서는 신경망을 학습시키는 방법과 전략을 살펴본다. 다음 내용을 확인할 수 있다. ●

문제 해결에 적합한 신경망 구조를 고르는 법

하이퍼파라미터 튜닝의 기초

학습 과정에 대한 이해

여기서 딥러닝 분야의 모든 튜닝 기법을 설명하지는 않는다. 대신 자주 사용되는 다음 기법들을 위주로 심층 구조 튜닝의 핵심 개념을 설명한다. 그리고 7장에서 대표적인 심층 신경망을 튜닝 하는 법을 자세히 설명할 것이다. ●

심층 신뢰 신경망

합성곱 신경망

순환 신경망

먼저 신경망을 구축할 때 보통 어떻게 접근하는지부터 개념적으로 파악해보자. 1 15세기 르네상스 의사, 식물학자, 연금술사, 점성가, 신비주의자. https://en.wikipedia.org/wiki/Paracelsus

6장 심층 신경망 튜닝하기 283


NOTE_ 제한된 볼츠만 머신 튜닝하기

이 장에서는 심층 신뢰 신경망을 튜닝하는 법을 설명하면서 제한된 볼츠만 머신 튜닝에 대해서도 다룬다.

6.1.1 심층 신경망 구축을 위한 이해 진행하기에 앞서 다음 두 가지 질문을 생각해보자. 어떤 타입의 입력 데이터를 모델링하는가?

어떤 결과를 얻기 위해 모델링하는가?

모델링하는 데이터 타입에 따라 심층 신경망 구조와 입력 계층이 결정된다. 그리고 데이터에서 어떤 정보를 추출할지 결정하면 클래스별로 점수를 도출(확률에 따른 분류)할지, 실제 값을 갖는 출력을 산출(회귀)할지 결정된다. 또한 어떤 종류의 출력 계층을 사용할지도 결정된다. 심층 신경망을 구축하려면 다양한 분기를 거쳐야 하지만 위 질문을 먼저 생각해보면 신경망의 밑바탕을 잘 설계할 수 있게 된다. 두 질문을 이해했으면 아래의 파라미터를 설정하는 다음 단 계로 넘어갈 수 있다. 계층 수

계층당 파라미터 수

먼저 파라미터 수에 따라 신경망에 필요한 메모리를 고려해야 한다. 계층 수와 계층당 파라미 터 수는 궁극적으로 신경망에서 데이터 구조를 나타내는 데 필요한 메모리 크기를 표현한다. 복잡한 모델이더라도 비교적 적은 파라미터(총 뉴런 수)만 필요한 경우도 있다. 이제 기본 구조와 계층을 구성했으므로 다음 항목을 고려해야 한다. 가중치 초기화 전략

활성화함수

손실함수

최적화 알고리즘

미니배치

규제

284 자바를 활용한 딥러닝


입력 데이터와 마찬가지로 신경망 구조마다 적합한 가중치 초기화 전략이 정해져 있다. 가중치 를 어떻게 초기화하느냐에 따라 학습 과정이 매우 달라진다. 입력 데이터와 출력 데이터 간의 비선형 관계를 모델링하려면 계층마다 활성화함수도 필요하다. 활성화함수를 사용하면 필요한 특징을 학습하고 출력 계층을 설정해 회귀 또는 분류를 수행할 수 있다. 구조에 따라 손실함수 를 특정 활성화함수와 짝지을 필요가 있다. NOTE_ 손실함수가 학습에 미치는 영향

손실함수는 신경망에서 무엇을 학습할지 결정한다(예를 들면 분류 또는 회귀). 활성화함수와 데이터 타입에 적합한 손실함수를 사용해야 한다.

또한 문제 영역에 따라 어떤 최적화 기법을 사용할지도 고려한다. 규제는 모델이 데이터의 노이즈에 피팅되는 것을 방지하고 데이터(학습에 사용되지 않은 데이 터도 포함) 전반에 걸쳐 일반적인 결과를 얻을 수 있도록 가중치를 가능하면 작게 유지한다. 앞서 설명한 많은 디자인 결정사항은 서로 연관되거나 신경망의 다른 부분을 결정하는 데 영향 을 미친다. 이 장 대부분에서 이러한 구성 간 상호의존성을 설명한다. 이제 이러한 개념을 바탕 으로 신경망 구축 단계별로 어떤 작업이 필요한지 구체적으로 살펴보자.

6.1.2 구축 단계별로 이해하기 심층 신경망 구조를 구축하면서 수행해야 할 작업들을 전반적으로 알아보자. 아래 나열된 구축 단계는 대부분의 신경망을 모델링하는 데 사용할 수 있다. 1 입력 데이터 타입 결정 a 입력 데이터 타입에 따른 신경망 구조 결정 2 결과 형태 결정 a 신경망 구조 구성에 대한 지침 수행 b 출력 계층 타입 결정 3 문제 해결에 적합한 신경망 구조 설정 a 모델, 구조, 비용함수 결정 b 구조에 따른 은닉 계층 수 결정 c 신경망의 전체 구조와 특정 계층의 의도에 따른 계층별 활성화함수 결정

6장 심층 신경망 튜닝하기 285


4 학습 데이터 처리 a 데이터 클렌징 b 시각화 c 벡터화와 정규화 d 클래스별 균형 조정(필요시) e 테스트 데이터, 학습 데이터, 검증 데이터 생성 5 균형 잡힌 부분 데이터셋으로 하이퍼파라미터 튜닝 전략 수립 a 부분 데이터셋 늘리기, 하이퍼파라미터 조정하기(필요시) 6 최종 학습 데이터셋이 큰 경우 스파크를 사용해 빠르게 학습(분산 처리가 가능하다면)

위 단계는 특정 튜닝 기법이라기보다 심층 신경망을 구축할 때 따라할 수 있는 기본적인 과정 이다. 이 장 후반부를 볼 때쯤이면 최신 데이터 과학을 이해하는 데 필요한 기본적인 튜닝 원칙 을 숙지할 수 있을 것이다. 첫 번째 단계인 입력 데이터와 신경망 구조를 매칭하는 법부터 시작 해 신경망을 튜닝하는 법을 세부적으로 살펴보자.

6.2 신경망 구조와 입력 데이터 매칭시키기 앞서 말한 것처럼 원본 데이터가 나타내는 내용을 고려해 심층 신경망을 디자인하는 과정부터 알아보자. 데이터 타입은 다음과 같다. 열 기반 데이터

이미지 데이터

오디오 데이터

비디오 데이터

시계열 데이터

열 기반 데이터나 CSV 데이터는 일반적으로 테이블의 관계형 데이터베이스 관리 시스템에서 테이블 또는 여러 데이터셋을 조인해 비정규화된 결과를 내보낼 때 생성된다. 형태는 다음과 같다.

286 자바를 활용한 딥러닝


M,0.455,0.365,0.095,0.514,0.2245,0.101,0.15,15 M,0.35,0.265,0.09,0.2255,0.0995,0.0485,0.07,7 F,0.53,0.42,0.135,0.677,0.2565,0.1415,0.21,9 M,0.44,0.365,0.125,0.516,0.2155,0.114,0.155,10 I,0.33,0.255,0.08,0.205,0.0895,0.0395,0.055,7 I,0.425,0.3,0.095,0.3515,0.141,0.0775,0.12,8

이미지 픽셀로부터 특징을 추출하거나 시간에 종속된 데이터(시계열 데이터)를 다루는 것이 아니라면 구조가 복잡할 필요는 없다. 이럴 때는 간단한 다층 퍼셉트론 신경망으로 시작하는 것이 좋다. 이미지 분류에는 합성곱 신경망을 사용할 수 있다. 최근 몇 년간 합성곱 신경망은 이미지 처리 작업에서 최상의 결과를 제공함을 입증했다(자세한 내용은 4장 참조). 순차 데이터는 각 레코드가 물리적 순서를 가지는 데이터다. 순차 데이터도 모델의 입력으로 사용할 수 있다. 예를 들어 서버 또는 센서에 의해 생성된 로그 데이터를 들 수 있다. 시간에 매 핑되는 연속된 데이터인 시계열 데이터도 순차 데이터에 해당한다. 발생 순서대로 정렬된 이 값들은 시간이 지남에 따라 대상의 활동을 기록한다. 대부분의 머신러닝 모델에서는 일종의 특 징을 추출하고 시계열 데이터셋마다 입력 벡터 하나를 생성해 학습 알고리즘에 사용한다. 순차 데이터나 시계열 데이터는 입력 벡터 1 ~ N 개를 모델링할 수 있는 순환 신경망을 사용해야 한 다(4장 참조). 이를 통해 시간이 흐름에 따라 활동을 모델링할 수 있다. 일반적으로 오디오 데이터에 순환 신경망을 사용하면 좋은 결과를 얻는다. 오디오 데이터는 오 디오 샘플의 시계열이 파형을 이루는 성질이 있어 순환 신경망에 적합하다. 비디오 데이터로 작업할 때 이미지에서 결과를 추출하려면 정교한 일련의 계산을 수행해야 한 다. 한 가지 방법은 합성곱 계층, 맥스풀링 계층, 완전 연결 계층, LSTM 계층을 거쳐 비디오의 각 프레임을 분류하는 것이다. 또는 비디오의 개별 프레임을 이미지 파일로 추출한 다음 합성 곱 신경망을 사용해 각 프레임을 분석하는 방법도 있다. CAUTION_ 비디오 데이터 다루기

실무에서는 옵티컬 플로(Optical Flow, 광학 흐름) 전처리가 자주 사용된다. 전처리를 사용하면 단일 프레임 만으로는 알 수 없는 시간과의 상관관계(예를 들면 연속적인 프레임에 나타나는 움직임)를 포착할 수 있다.

6장 심층 신경망 튜닝하기 287


6.2.1 요약 지금까지 입력 데이터 타입에 따라 어떤 신경망 구조를 사용해야 하는지 설명했다. [표 6-1]에 간단히 정리했다. 표 6-1 입력 데이터와 신경망 구조의 매칭 입력 데이터 타입

제안 구조

열 기반 또는 CSV 데이터

다층 퍼셉트론

이미지 데이터

합성곱 신경망

순차 데이터

순환 신경망, 일부는 LSTM

오디오 데이터

순환 신경망, 일부는 LSTM

영상 데이터

합성곱 신경망 + 순환 신경망 혼합

NOTE_ 발전하는 신경망 구조

각 데이터 타입에 대해 앞서 제안한 신경망 구조도 좋은 결과를 보여주지만 지금도 다양한 연구가 진행되고 있다. 새로운 신경망 구조가 계속해서 발표되고 있으므로 여기서 제시한 구조를 발판삼아 더 좋은 구조가 있 는지 확인해야 한다.

다음 절에서는 계층 수와 뉴런 수를 설정하는 방법을 살펴보면서 구체적인 신경망 구조 설계 방안을 설명한다.

6.3 출력 계층과 모델의 목표 연관짓기 앞 절에서는 입력 데이터 타입을 특정 신경망 구조와 매칭시키는 방법에 대해 설명했다. 이제 출력 계층을 알아볼 차례다. 출력 계층을 결정하려면 더 많은 고민이 필요하다. 출력 계층은 생 성할 모델에서 어떤 종류의 대답을 기대하는지와 연관되어 있기 때문이다. 모든 계층에는 정보를 다음 계층으로 전달하는 데 사용하는 활성화함수가 있다. 신경망에서 출 력을 얻으려면 출력 계층으로 불리는 최종 계층이 필요하고 원하는 출력이나 대답(예를 들면 분류 또는 회귀)에 따라 활성화함수의 타입도 결정해야 한다.

288 자바를 활용한 딥러닝


6.3.1 회귀 모델의 출력 계층 회귀 모델 regression model 은 면적을 토대로 집값을 계산하듯이 실제 값을 갖는 출력을 생성한다. 회귀 모델의 출력 계층에서는 손실함수와 활성화함수를 고려해야 한다. 손실함수

회귀 출력 계층의 손실함수는 선택의 폭이 넓다. 보통 평균제곱오차(MSE )나 제곱오차의 합(L2 )을 사용한다. 활성화함수

회귀에서는 항등함수(선형함수)를 사용한다.

회귀 출력 계층의 특별 사례 데이터가 [-1, 1] 사이에 있다면 회귀 출력 계층에 tanh 함수를 사용할 수도 있다. 데이터가 [0,∞) 사이에 있다면 소프트플러스 함수나 변형 ReLU인 LReLU나 RReLU randomized leaky ReLU 를 사용할 수도 있다. 만약 [0,∞) 사이의 데이터에 ReLU를 사용한다면 출력값이 [0,∞) 범위를 벗어나지는 않지만 죽 은 ReLU 문제가 발생하게 된다.

ReLU는 본질적으로 활성화함수의 출력이 0으로 고정될 가능성이 있다. 이 경우 신경망 입력에 관계없이 해당 ReLU의 출력값(신경망의 결과)은 항상 0이다. 다른 변형 ReLU (LReLU 또는

RReLU )는 이러한 문제가 발생하지 않는다.

6.3.2 분류 모델의 출력 계층 분류 모델에서 출력 계층에 출력 유닛 N 개가 있고 각 출력 유닛에서 클래스별 점수를 생성한다 고 하자. N = 1이면 단일 레이블을 가진 모델이 된다. 이 경우 조건을 만족하느냐 만족하지 않 느냐에 따라(예를 들면 스팸 여부) 분류한다. N > 1이면 각 클래스별로 입력에 따른 점수를 매 기는 모델이며 출력 계층 구성이 달라진다. 이 경우 스포츠, 비즈니스, 정치 등 카테고리에 따 라 문서를 분류할 수 있다. 또한 문서가 여러 카테고리(예를 들면 스포츠와 비즈니스)에 속할 수도 있다.

6장 심층 신경망 튜닝하기 289


단일 레이블 분류 모델 단순한 단일 레이블 예제나 이진 분류기에서는 출력 계층에 시그모이드 활성화함수를 사용한 다. 그러면 출력이 0.0과 1.0 사이의 값을 가지며 문서가 실제로 스팸인지 여부를 나타낸다. 단일 출력 레이블(두 클래스에 대해 0.0에서 1.0 사이의 값을 가짐)을 얻고자 할 때는 교차 엔 트로피 손실함수를 사용한다.

출력이 한 개 또는 두 개인 이진 분류기 출력 계층에서 소프트맥스 활성화함수를 사용해 이진 분류기가 출력 두 개를 갖도록 만들 수도 있다. 이 경우 출력은 합이 1.0인 실숫값 두 개가 되고 큰 값은 레이블의 인덱스가 된다. 이 모델 에서는 소프트맥스 활성화함수와 함께 MCXENT 손실함수를 사용한다. 어떤 출력 계층이 이진 분류 모델을 모델링하는 데 가장 적합한가에 대해서는 논쟁의 여지가 있 다. 수학적으로 시그모이드 단일 출력을 사용하는 것은 출력 유닛 두 개만(MCXENT나 음의 로 그 가능도 손실함수를 사용하고 원-핫 인코딩을 사용해 0이나 1 대신 [0, 1]이나 [1, 0]으로 표현) 있는 소프트맥스 출력 계층을 사용하는 것과 같다.

둘 이상의 레이블이 있는 모델 둘 이상의 레이블이 있는 경우는 크게 두 가지다. 여러 레이블 중 모델을 사용해 레이블 하나만 구하려는 경우를 멀티 클래스 분류(multiclass classification )

라 한다.2 여러 레이블이 있고 출력마다 하나 이상인 레이블을 구하는 경우(예를 들면 사람 + 자동차)를 멀티 레이블 분

류(multilabel classification )라 한다.3

각각의 시나리오를 살펴보자. 멀티 클래스 분류 모델. 2장에서 언급했듯이 멀티 클래스 모델링 문제에서 가장 높은 점수를 가진

클래스만 필요하다면 소프트맥스 활성화함수를 출력 계층에 사용한다. 출력 유닛 수는 이 시나 리오에서 분류할 클래스 수와 같다.

2 https://en.wikipedia.org/wiki/Multiclass_classification 3 https://en.wikipedia.org/wiki/Multi-label_classification

290 자바를 활용한 딥러닝


출력 계층의 모든 유닛의 출력 합은 1.0이다. 결괏값이 클래스당 확률임을 감안할 때 출력은

1.0이나 0.0 둘 중 하나가 아니라 0.0과 1.0 사이의 값으로 나타난다. 분류 결과로 가장 높은 확률을 보이는 클래스(출력 유닛)를 선택한다. arg-max ( ) 함수를 사용하여 가장 높은 점수를 갖는 클래스(예측된 클래스)의 인덱스를 얻는다. 다음 예제에서 신경망의 출력 계층에 소프트맥스 활성화함수를 설정하는 부분을 볼 수 있다. .layer(1, new OutputLayer.Builder(LossFunction.NEGATIVELOGLIKELIHOOD) .weightInit(WeightInit.XAVIER) .activation(Activation.SOFTMAX) .nIn(numHiddenNodes).nOut(numOutputs).build())

이 예제에서 출력 계층을 설정할 때 .activation ( ) 메서드를 사용해 출력 계층의 타입을 지정 하는 것을 볼 수 있다. 대부분의 경우 위 코드에서처럼 소프트맥스 활성화함수와 음의 로그 가능도 손실함수가 사용 된다. 때때로 MCXENT를 사용하기도 하지만 음의 로그 가능도와 효과는 동일하다. 출력은 원-핫으로 표현되어야 한다. 입출력 학습 벡터를 만들 때 출력 벡터를 원-핫 표현으로 변환하게 된다. DL4J의 RecordReaderDataSetlterator는 자동으로 클래스 인덱스(0부터 클 래스 수 - 1까지)를 원-핫 벡터로 변환해준다.45 CAUTION_ 매우 많은 레이블을 다루는 경우

레이블 수가 1만 개에 이를 정도로 많다면 계층적 소프트맥스 출력 계층을 사용할 수 있다. 계층적 소프트맥 스 4 는 결과의 근사치를 다수의 클래스에 사용 가능한 소프트맥스로 더 빠르게 도출한다.5 계산 속도가 중요 할 때만 사용해야 하며 정확도가 중요한 경우에는 사용해서는 안 된다.

멀티 레이블 분류 모델. 출력마다 여러 클래스를 고르는 경우(예를 들면 사람 + 자동차) 소프트

맥스를 출력 계층의 활성화함수로 사용할 수 없다. 출력 계층을 각 클래스별 출력 유닛으로 구성 4 「Hierarchical Probabilistic Neural Network Language Model」( Morin, Bengio, 2005 ) ( http://www.iro.umontreal. ca/~lisa/pointeurs/hierarchical-nnlm-aistats05.pdf )와 「Distributed Representations of Words and Phrases and their Compositionality」(Mikolove et al., 2013 ) (https://arxiv.org/abs/1310.4546 )를 참고하라. 5 계층적 소프트맥스가 유일한 선택지는 아니다. 다른 대안으로 「BlackOut : Speeding up Recurrent Neural Network Language Models With Very Large Vocabularies」(Vishwanathan et al., 2015 ) (https://arxiv.org/abs/1511.06909 )를 참고하 라.

6장 심층 신경망 튜닝하기 291


하고 시그모이드 활성화함수를 사용한다. 그런 다음 각 유닛에서 클래스별로 확률값을 얻는다. 다시 말하지만 이 시나리오에서는 출력 계층에 이진 교차 엔트로피(LossFunction.XENT ) 손 실함수를 사용한다. 학습 데이터의 출력 벡터는 각 클래스에 대해 0 또는 1로 표현된다. 원-핫 표현은 한 레이블만

1을 가질 수 있는 반면 이 경우에는 여러 레이블이 1.0을 가질 수 있으므로 앞에서 언급한 원핫 표현과는 다르다. NOTE_ 다중 출력 계층

자동차 제조사(포드, 도요타, GM 등)와 자동차 종류(SUV, 스포츠카, 트럭 등)을 예측하기 위해 신경망을 사용한다고 하자. 이 시나리오에서는 ComputationGraph와 다중 출력 계층(Multiple Output Layers )을 사용해야 한다. 자세한 내용은 https://deeplearning4j.org/compgraph#multitask를 참조하라.

NOTE_ 시그모이드와 소프트맥스 비교

소프트맥스 활성화함수는 출력의 합이 1.0 (즉, 확률을 의미함)인데 반해 시그모이드 활성화함수는 출력값들 이 개별적인 범위를 가지고 있다. 예를 들어 소프트맥스 계층의 출력은 확률을 의미하므로 모두 합치면 1.0이 되지만 시그모이드 계층의 출력은 모든 유닛이 출력으로 0.9를 가질 수도 있다. 시그모이드 계층은 소프트맥 스와 다르게 제약이 없다.

6.4 계층 수, 파라미터 수, 메모리 다루기 신경망에서는 계층 수와 계층당 뉴런 수에 따라 모델의 총 파라미터 수가 결정된다. 신경망의 총 파라미터 수는 계층 타입과 각 계층의 뉴런(편향 가중치를 포함한) 사이의 연결(또는 가중 치) 개수에 따라 다르다. NOTE_ 계층 타입과 뉴런 수

계층 타입도 신경망의 파라미터 수에 영향을 미칠 수 있다. 계층 입출력 크기가 동일할 때 LSTM 계층, 순환 신경망 계층, DL4J의 DenseLayer, 합성곱 계층 순으로 계층 뉴런 수가 줄어든다.

292 자바를 활용한 딥러닝


파라미터 수가 늘어날수록 모델의 함수도 더욱 복잡해진다. 파라미터 수가 너무 많아지면 노이 즈에 지나치게 과대적합되어 모델이 일반적이지 않게 된다. 신경망 구조마다 계층, 뉴런, 연결 가중치 설정 방식이 다양하다. 순방향 다층 신경망을 필두로 다양한 형태가 있다. 이 장 뒷부분에서 이러한 구조에 대해 설명한다.

6.4.1 순방향 다층 신경망 순방향 다층 신경망의 입력 계층은 입력 벡터의 크기만큼 입력 유닛을 가져야 한다. 출력 계층 은 분류를 위한 레이블 수와 동일하거나 회귀 분석을 위한 뉴런 한 개만 있으면 된다. 다음 절 에서는 신경망에 대한 계층 수와 뉴런 수를 결정하는 전략에 대해 설명한다.

은닉 계층 수 정하기 은닉 계층 수는 데이터셋 크기와 관련이 있다. 데이터셋 크기가 클수록 더 많은 은닉 계층이 필 요하다. 예를 들어 MNIST는 은닉 계층(깊이가 깊어질수록 정확도 감소가 큼) 서너 개만 있으 면 되지만 페이스북의 딥페이스는 매우 큰 데이터셋을 사용하므로 은닉 계층을 아홉 개까지 사 용한다. NOTE_ 은닉 계층 수를 정하는 일반적인 방법

은닉 계층 수를 정하는 간단한 방법은 데이터셋이 클수록 과대적합 걱정 없이 은닉 계층과 뉴런을 더 많이 사 용하는 것이다. 학습 데이터가 많을수록 과대적합이 발생할 가능성은 적다. 신경망이 클수록 정확도가 좋아질 가능성은 높다. 입력 데이터셋은 큰데 반해 신경망이 너무 작으면 과소적합이 발생할 위험이 있으며 정확도 도 데이터셋의 최고점에 도달하지 못한다.

또한 데이터셋의 분산이 클수록 계층과 파라미터 수를 훨씬 늘릴 수 있다.

계층당 뉴런 수 정하기 은닉 계층의 뉴런이 너무 적으면 학습 과정에서 데이터를 모델링하는 데 어려움을 겪을 수 있 다. 신경망에 파라미터가 너무 많으면 과대적합 문제에 당면하거나 알맞은 모델을 찾기까지 처 리 시간이 더 필요하다.

6장 심층 신경망 튜닝하기 293


뉴런 수를 정하는 좋은 방법이 있다. 아래 계층으로 갈수록 점진적으로 뉴런 수를 감소시키는 것이다. 도중에 은닉 계층이 입력 계층 노드 수의 사분의 일보다 작아지지 않도록 주의해야 한 다. 은닉 계층이 너무 많은 뉴런을 가지면 데이터셋을 과대적합할 가능성도 증가한다. NOTE_ 계층당 뉴런 수를 정하는 일반적인 방법

계층의 크기, 규제, 데이터양은 조화를 이루어야 한다. 규제가 충분히 적용되지 않은 상태에서 계층 크기가 너 무 크면 모델이 일반화되지 않는다. 계층이 크고 파라미터가 많다면 과대적합을 피할 수 있도록 더 적극적인 규제(그리고/또는 더 많은 데이터)가 필요할 수 있다.

경우에 따라 뉴런 수를 감소시키는 대신 모든 계층에 대해 동일한 수의 은닉 파라미터를 사용 하면 효과적일 수 있다. 그러나 이 방법은 특정 타입의 데이터셋에서만 유효하다.

6.4.2 계층 수와 파라미터 수 조절하기 신경망에서 파라미터(또는 뉴런)를 제거하는 방법은 학습 중 발생하는 과대적합 같은 문제를 해결하는 데 보편적으로 사용된다. 하지만 종종 은닉 뉴런 수를 최적화된 값보다 많이 사용할 때도 있다. 경험적으로 비지도 사전학습(심층 신뢰 신경망의 구성요소인 제한된 볼츠만 머신) 신경망을 사용할 때는 은닉 뉴런을 최적화된 값보다 더 많이 사용한다. 예를 들어 유닛 수백 개에서 수천 개를 은닉 뉴런으로 사용할 수 있다.6 대신 과대적합을 방지하려면 다음과 같은 규제 기법을 사용하는 것이 좋다. L 1

L 2

드롭아웃

노이즈 삽입

드롭커넥트

작은 신경망은 지역 극솟값 local minima 이 거의 없지만(대신 나쁜 모델일 수 있다) 큰 신경망은 6 『Neural Networks: Tricks of the Trade, Second Edition』( Muller et al., 2012 )의 「Practical Recommendations for Gradient - Based Training of Deep Architectures」(Bengio, 2012 ) (https://arxiv.org/abs/1206.5533 )

294 자바를 활용한 딥러닝


지역 극솟값이 많다.7 학습 데이터셋에 과대적합되지 않도록 작은 신경망은 사용하지 않는다. 대신 계산 플랫폼이 허용하는 만큼 파라미터를 많이 사용하고 앞에서 언급한 기법들을 사용해 과대적합 문제를 해결해야 한다. CAUTION_ 파라미터에 열광하지 마라

파라미터를 많이 사용하되 실용성을 따져라. 하드웨어가 충분하더라도 뉴런 100만 개를 가진 단일 계층을 사용하는 것은 최선이 아닐 수도 있다.

학습 데이터셋의 크기가 커지고 다양해지면 은닉 계층 수와 계층당 뉴런 수를 천천히 늘려가는 것을 추천한다. NOTE_ 데이터를 추가해 과대적합 다루기

과대적합을 다루는 최선의 방법은 학습 데이터를 (가능한 한) 더 많이 사용하는 것이다.

신경망의 파라미터 수 구하기 두 가지 방법으로 신경망의 파라미터 수를 구할 수 있다. 직접 손으로 세기

D L4J API를 사용해 파라미터 수 계산하기

각 계층의 파라미터 수를 단순히 합하여 신경망의 파라미터 수를 결정할 수 있다. [표 6-2]는 각 계층에서 일반적으로 사용되는 파라미터 수를 보여준다. 표 6-2 신경망 계층 타입별 파라미터 수 계산하기 계층 타입

파라미터 수

완전 연결 계층(예를 들면 DL4J의 Dense, MLP, OutputLayer )

n L−1n L + n L

합성곱 계층

d L−1d L k H k W + d L

LSTM 순환 신경망(예를 들면 GravesLSTM )

4 n L (n L−1 + 1) + n L (4 n L + 3 )

기본 순환 신경망

n L−1n L + (n L ) + n L 2

7 「CS231n: Convolutional Neural Networks for Visual Recognition」(Li , Karpathy ) (http://cs231n.stanford.edu/ ) (강 의 노트)

6장 심층 신경망 튜닝하기 295


다음은 파라미터 수를 계산하는 방법이다. n L-1

입력 수. 이전 계층(L -1 )의 크기

n L

현재 계층(L )의 크기

k H 과 k W

높이와 너비 차원으로 구성된 합성곱 계층의 커널 크기 d L 1 과 d L

합성곱 계층의 입출력 깊이/채널

일부 계층은 파라미터가 없다. 부분샘플링 계층과 활성화 계층, DL4J의 LossLayer가 이러한 경우에 해당한다. 여기서 주의해야 할 점은 신경망이 합성곱 계층과 완전 연결 계층(또는 출력 계층)으로 결합되어 있다는 점이다. 합성곱 계층/부분샘플링 계층 다음에 있는 완전 연결 계 층에서는 이전 합성곱 계층의 활성홧값 배열의 크기를 확인해야 한다. 완전 연결 계층/출력 계 층의 n L-1 값을 정하는 데 (입력 데이터 하나에 대한) 활성홧값의 크기를 사용할 수 있다. 예를 들어 최종 합성곱 계층이 채널 100개로 5 × 5 활성홧값을 출력하는 경우 완전 연결 계층/출력 계층에 대한 입력으로 n L-1 = 5 × 5 × 100 = 2500을 사용해야 한다.8

DL4J에서 신경망을 구성했다고 가정해보자. 파라미터 수를 어떻게 확인해야 할까? 간단한 방 법은 다음과 같다. MultiLayerConfiguration configuration = ... MultiLayerNetwork network = new MultiLayerNetwork(configuration); network.init(); System.out.println("Total number of parameters: " + network.numParams()); for( int i=0; i<network.getnLayers(); i++ ){ System.out.println("Layer " + i + " number of parameters: " + network.getLayer(i).numParams()); }

8 입력 크기 계산에 대한 자세한 내용은 스탠포드 대학의 CS231n 강의 노트와 DL4J의 ConvolutionMode 자바독을 참고하라(또는 DL4J의 InputType 기능을 사용해 numInputs 값을 계산해 설정하고, DL4J로 신경망 구성을 확인할 수 있다).

296 자바를 활용한 딥러닝


CHAPTER

7

심층 신경망 구조별 튜닝하기

일단 지금 알아야 할 것은 우주가 당신 생각보다 훨씬 복잡하다는 거다. 다른 방식으로 이해하려 해도 애초에 우주는 더럽게 복잡하다. _더글러스 애덤스, 『은하수를 여행하는 히치하이커를 위한 안내서』(책세상, 2005)

이 장에서는 6장에서 배운 일반적인 신경망 튜닝에 대한 개념을 확고히 한다. 다음과 같은 특 정 아키텍처의 튜닝에 대해 자세히 살펴본다. ●

합성곱 신경망

순환 신경망

심층 신뢰 신경망

컴퓨터 비전은 딥러닝 세계에서 가장 많이 사용되는 애플리케이션 중 하나다. 합성곱 신경망 구조를 튜닝하는 방법을 배우는 것으로 시작하자.

7.1 합성곱 신경망 합성곱 신경망은 일반적인 디자인 패턴과 특별한 합성곱 구조 디자인 패턴으로 이루어져 있다.

6장에서는 일반적인 신경망 디자인 패턴을 검토했다. 이 절에서는 합성곱 구조와 관련된 기술

7장 심층 신경망 구조별 튜닝하기 341


을 검토한다. 이 절 대부분은 합성곱 계층과 풀링 계층을 배치하는 패턴을 설명하는 데 중점을 둔다.

4장에서 설명한 대로 합성곱 단계에서 계층은 필터를 사용해 입력으로부터 특징을 학습한다. 이 단계의 출력은 활성화함수, 즉 ReLU 활성화함수에 의해 변환된다. NOTE_ 검출기 단계

일부 합성곱 신경망 문헌은 합성곱 신경망 구조에서 검출기 단계를 별개 계층 또는 단계로 분리한다. 하지만 이 검출기 단계는 단순히 활성화함수로만 구성되어 있으며 DL4J는 활성화함수를 계층 일부로 다룬다. 이 책 에서는 검출기 단계를 합성곱 단계에 포함시켜 다룬다.

풀링 계층은 일반적으로 연속적인 합성곱 계층 사이에 들어간다. 풀링 계층은 합성곱 계층 뒤 에 위치해 데이터를 표현하는 공간 크기(너비와 높이)를 점차 줄인다. 이렇게 하면 점진적으 로 파라미터 수를 줄이고 신경망에서 필요한 계산량도 줄어든다. 이 방법으로 파라미터 크기를 줄이면 과대적합을 완화하는 데도 도움이 된다. 출력 계층 전략과 같은 다른 튜닝 기법에 대해 서는 6장에서 설명했다.

7.1.1 일반적인 합성곱 구조 패턴 보통 풀링 계층 사이에 합성곱 계층 하나를 배치한다. 이 패턴은 다음과 같이 나타난다. 입력 계층

합성곱 계층

풀링 계층

합성곱 계층

풀링 계층

완전 연결 계층

(가능하다면) 또 다른 완전 연결 계층

때로는 풀링 계층이 나오기 전에 합성곱 계층 여러 개를 연속적으로 배치할 수도 있다.

342 자바를 활용한 딥러닝


NOTE_ 더 큰 신경망에서는 각 풀링 계층 앞에 합성곱 계층 두 개를 배치하는 것이 좋다. 이렇게 하면 풀링

계층으로 다운샘플링하기 전에 대규모 신경망이 더 복잡한 특징을 개발할 수 있다.

구조 패턴을 더 자세히 이해하려면 5장의 LeNet 예제를 다시 살펴보라. 이 신경망은 1998년 얀 르쿤이 처음 발표한 것으로 가장 유명한 합성곱 구조 중 하나다. LeNet은 5.5절 ‘합성곱 신 경망을 활용한 손글씨 이미지 모델링’에서 한 것처럼 MNIST 데이터를 성공적으로 모델링할 수 있다. 다음은 특정 계층 구조를 나타낸 것이다. 입력 계층

합성곱 계층 : 필터 20개 [5 × 5]

최대 풀링 계층 : [2 × 2]

합성곱 계층 : 필터 50개 [5 × 5]

최대 풀링 계층 : [2 × 2]

완전 연결 계층

[예제 7-1]은 위 구조를 5장의 자바 코드 예제에 표현한 것이다. 신경망을 구성하는 부분만 포 함시켰으니 위에서 설명한 특정 LeNet 계층 구조와 비교해보기 바란다. 예제 7-1 자바로 구현한 LeNet DL4J 모델 구성

/* 신경망 구성

*/ log.info("Build model...."); MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder() .seed(seed) .iterations(iterations) // 학습 반복 횟수 설정 .regularization(true).l2(0.0005) .learningRate(.01) .weightInit(WeightInit.XAVIER) .optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT) .updater(Updater.NESTEROVS).momentum(0.9) .list() .layer(0, new ConvolutionLayer.Builder(5, 5) // nln과 nOut을 지정한다. nIn은 채널 수고 nOut은 적용할 필터 수다. .nIn(nChannels) .stride(1, 1)

7장 심층 신경망 구조별 튜닝하기 343


.nOut(20) .activation(Activation.IDENTITY) .build()) .layer(1, new SubsamplingLayer.Builder(SubsamplingLayer.PoolingType.MAX) .kernelSize(2,2) .stride(2,2) .build()) .layer(2, new ConvolutionLayer.Builder(5, 5) // 이후 계층부터는 nIn을 지정할 필요가 없다. .stride(1, 1) .nOut(50) .activation(Activation.IDENTITY) .build()) .layer(3, new SubsamplingLayer.Builder(SubsamplingLayer.PoolingType.MAX) .kernelSize(2,2) .stride(2,2) .build()) .layer(4, new DenseLayer.Builder().activation(Activation.RELU) .nOut(500).build()) .layer(5, new OutputLayer.Builder(LossFunctions.LossFunction .NEGATIVELOGLIKELIHOOD) .nOut(outputNum) .activation(Activation.SOFTMAX) .build()) .setInputType(InputType.convolutionalFlat(28,28,1)) // 아래 주석을 참조하라. .backprop(true).pretrain(false).build();

[예제 7 -1 ]에서는 각 합성곱 계층 뒤에 풀링 계층이 있다. 신경망 끝부분은 완전 연결된 DenseLayer와 바로 뒤에 소프트맥스 활성화함수가 있는 출력 계층으로 구성된다. 여기서 소프

트맥스 활성화함수는 학습/테스트 데이터셋의 10개 MNIST 숫자 중 하나를 감지하는 데 사용 된다. 여기서 주목해야 할 메서드가 있다. .setInputType(InputType.convolutionalFlat(28,28,1))

이 메서드 호출은 아래에 나열한 몇 가지 작업을 수행한다. 합성곱 계층/부분샘플링 계층과 완전 연결 계층 간 전환 등을 처리하는 전처리를 추가한다.

구성을 추가 검증한다.

필요하다면 계층마다 이전 계층 크기를 참조해 nIn (입력 뉴런 수 또는 합성곱 신경망의 경우 입력 깊이)을

설정한다.

344 자바를 활용한 딥러닝


- InputTypes에 의해 수동으로 설정된 값은 덮어쓰지 않는다. - 합성곱 신경망뿐 아니라 다른 계층 타입(순환 신경망, MLP 등)에도 사용할 수 있다.

일반적으로 합성곱 구조를 설계할 때 커다란 수용 영역이 있는 단일 합성곱 계층 대신 작은 합 성곱 계층 여러 개를 사용해야 한다. 이렇게 하면 신경망이 데이터에 포함된 많은 표현적 특징 간 비선형 역학 관계를 도출해낼 수 있다. 첫 번째 합성곱 계층의 경우 입력 깊이(nIn )는 데이터와 일치해야 하지만 채널 수(nOut )는 자 유롭게 설정할 수 있다. 유닛 수는 일반적으로 nOut이다. 다운샘플링 후에도 특징을 추출할 정 보가 충분하려면 입력 계층 크기가 두 번 이상 나눌 수 있을 만큼 커야 한다. 예를 들어 (2장에 서 논의된) CIFAR-10을 모델링할 때 합성곱 신경망의 입력 계층 크기는 32여야 한다. 합성곱 계층에는 ReLU 활성화함수를 가장 자주 사용한다. 입력 데이터 채널은 다음과 같이 .nIn ( ) 메서드로 제어한다. .layer(0, new ConvolutionLayer.Builder(5, 5) // nln과 nOut을 지정한다. nIn은 채널 수고 nOut은 적용할 필터 수다. .nIn(nChannels)

이 값은 입력 데이터 타입에 따라 구성할 수 있지만 일반적으로 단색은 1, RGB는 3이다. 물론 입력이 이미지 데이터가 아닌 다차원으로 표현되는 데이터라면 이 숫자는 훨씬 클 수 있다.1 CAUTION_ 첫 번째 합성곱 계층 크기 조정에 대한 몇 가지 주의사항

일반적으로 입력 계층 유닛 수는 스트라이드/필터 크기에 따라 다르다. (현재 기준으로는 너무 크긴 하지만) 224 × 224 × 3 입력, 11 × 11 커널을 가진 AlexNet1 을 예로 들 수 있다. 실무에서는 데이터를 사용하려는 신경망 구성에 적합한 크기로 잘라내거나 크기를 조정할 수 있다. (늘리는 것보다) 되도록 자르고 축소하는 것이 더 좋다.

첫 번째 합성곱 계층 뒤로는 여러 합성곱 계층과 풀링 계층이 반복되는 패턴을 가질 것이다.

VGGNet과 같은 일부 구조에서는 풀링 계층 앞에 여러(보통 두 개) 합성곱 계층이 연속적으 로 위치한다. 1 「ImageNet Classification with Deep Convolutional Neural Networks」( Krizhevsky et al ., 2012 ) ( http://bit. ly/2tmodqn )

7장 심층 신경망 구조별 튜닝하기 345


일반적으로 합성곱 신경망을 구성할 때 초기에는 필터 크기를 크게 잡았다가 점진적으로 줄인다. NOTE_ 합성곱 계층 시퀀스에 정답은 없다

이 글을 쓰는 시점에도 모든 이미지 모델링 문제를 해결할 수 있는 마법 같은 합성곱 구조는 없다. LeNet ,

VGGNet , 인셉션 2 , AlexNet 같은 검증된 구조로 시작해 문제를 풀어나가는 것이 좋다. 그러고 나서 계층 시퀀스와 하이퍼파라미터를 조정해가며 좋다고 알려진 해법들을 시도해볼 수 있다.

출력 계층은 6장에서 설명한 패턴을 따른다.2

7.1.2 합성곱 계층 구성하기 합성곱 계층의 공간 배열을 설정한 다음 필터 수를 선택한다. 합성곱 계층에서 하이퍼파라미터는 출력 볼륨에 포함된 뉴런 수와 뉴런 배열 방법에 영향을 준 다. 주요 하이퍼파라미터는 다음과 같다. 필터 크기

스트라이드

패딩

예를 들어 5 × 5 필터로 합성곱 계층을 만드는 경우 코드는 다음과 같다. ConvolutionLayer convLayer = new ConvolutionLayer.Builder() .kernelSize(5,5).stride(1,1).padding(2,2) .name("first_layer") .nOut(out) .biasInit(bias) .build();

이 샘플은 필터 크기(.kernelSize )가 5 × 5고 스트라이드(1, 1 )와 패딩(2, 2 ) 파라미터에 정 수를 사용한다. .name ( ) 메서드를 사용해 이 합성곱 계층에 first_layer라는 이름을 지정하 고 .nOut (out ) 메서드를 호출해 필터 수를 설정한다. 계층 출력은 유닛 수보다 더 복잡하다. 뒤에서 출력 볼륨을 계산하는 법에 대해 알아볼 것이다. 2 「Going Deeper with Convolutions」( Szegedy et al., 2015 ) ( https://www.cs.unc.edu/~wliu/papers/GoogLeNet. pdf )

346 자바를 활용한 딥러닝


필터의 스트라이드 설정하기 스트라이드는 공간 차원(너비, 높이)에 깊이 열 depth column 을 할당한다. 스트라이드가 커짐에 따라 수용 영역이 덜 겹치게 되고 출력 볼륨은 공간적으로 더 작아진다. 위 예제에서 다음 파라 미터가 합성곱 계층에 설정된 것을 볼 수 있다. .stride(1,1)

이는 필터가 적용될 때마다 필터가 입력 격자 셀 한 개를 소모하고 입력 격자 셀 한 개만큼 이 동함을 의미한다(자세한 내용은 4장 참조). 스트라이드가 2인 경우 필터는 한 번에 두 개씩 이 동한다. CAUTION_ 2보다 큰 스트라이드

실무에서는 필터 크기가 크지 않기 때문에 스트라이드를 2보다 크게 설정하지 않는다. 필터 크기보다 큰 스 트라이드는 무조건 피해야 한다.

스트라이드 값이 커질수록 출력 볼륨이 공간적으로 줄어든다. 실무에서는 스트라이드가 작을 수록(예를 들면 1 ) 합성곱 계층에서 더 잘 작동한다. 따라서 풀링 계층에 다운샘플링 작업을 맡기고 합성곱 계층은 깊이에 대해 출력 볼륨을 변환하는 데만 집중할 수 있다.

패딩 사용하기 인셉션 같은 구조의 구성요소는 입력 볼륨의 공간 크기를 보존하려는 경향이 있다. 제로패딩을 사용하면 출력 볼륨의 공간 크기를 제어할 수 있다. 합성곱 계층이 입력 공간 차원을 변경하지 않도록 입력 볼륨을 0으로 채운다. 제로패딩은 테두리를 따라 입력 정보를 보존한다.

필터 수 선택하기 각 필터는 입력 학습 데이터에서 이질적인 무언가를 찾을 수 있다. 데이터가 다양하고 복잡도 가 높을수록 관련 특징을 찾으려면 더 많은 필터가 필요하다. [그림 7-1]은 신경망의 첫 번째 합성곱 계층에서 학습된 필터를 보여준다.

7장 심층 신경망 구조별 튜닝하기 347


그림 7-1 학습된 필터 96개, 11 × 11 × 3 크기 3

단일 합성곱 필터의 활성홧값을 계산하는 비용은 기존 다층 신경망보다 비싸기 때문에 합성곱 계층의 필터 수를 신중히 선택해야 한다. DL4J에서는 nOut (int ) 옵션을 사용해 필터 수를 구 성한다. 합성곱 신경망에서 계층 진행 과정을 자세히 살펴보면 활성화 맵 크기가 줄어드는 것을 볼 수 있다. 입력 계층에 가까운 계층일수록 필터가 더 작다. 합성곱 신경망의 출력 계층에 가까울수 록 더 큰 필터를 만나게 된다. 합성곱 계층당 필터 수를 설정하는 특별한 방법이 있는 것은 아니지만 합성곱 신경망 구조가 큰 경우 64에서 시작해 1,024 정도 4에 끝나기 때문에 입력으로부터 더 많이 진행될수록 증가한 다. [표 7-1]은 일반적으로 사용되는 세 가지 합성곱 신경망 구조에 대한 필터 수를 나타낸다. 표 7-1 필터 수 예 합성곱 신경망

합성곱 계층 필터 수

LeNet

20, 50

AlexNet

96, 256, 384, 384, 256

VGGNet

64, 128, 256, 512, 512

NOTE_ 계산 비용 대 데이터 보존

각 계층의 픽셀 수와 특징 수의 곱이 거의 같도록 만들어 모든 계층의 계산 비용을 비슷하게 유지한다. 따라 서 입력에서 특징을 추출할 때 풀링 계층으로 다운샘플링하면서 입력 데이터를 잃어버리는 경향이 있다. 대 신 입력 내용에 대한 정보를 신경망 끝까지 다른 양식(특징)으로 보존할 수 있다.

3 「ImageNet Classification with Deep Convolutional Neural Networks」(Krizhevsky, Sutskever, Hinton , 2012 ) (http:// bit.ly/2tmodqn ) 4 http://josephpcohen.com/w/visualizing-cnn-architectures-side-by-side-with-mxnet/

348 자바를 활용한 딥러닝


필터 크기 구성 필터 크기를 줄이고 여러 개 중첩된 합성곱 계층을 사용하는 방법 5이 합성곱 계층 수를 줄이고 필터 크기를 키우는 방법보다 결과가 더 좋다.6 필터 크기가 커지면 계산 비용이 증가할 뿐만 아니라 조회해야 하는 필터당 입력 영역도 커진 다. 큰 공간 필터(예를 들면 5 × 5 또는 7 × 7 )를 갖는 합성곱 계층은 지나치게 계산 비용이 비 싸질 수 있다. 예를 들어 필터 m 개가 있는 격자에서 필터 n개를 사용하는 5 × 5 합성곱 계층은 같은 필터 수를 사용하는 3 × 3 합성곱 계층보다 계산 비용이 25/9 = 2.78배 더 비싸다. 특징 크기는 입력 볼륨 공간 차원보다는 작지만 관련 특징을 추출할 만큼 충분히 커야 한다. 그 래서 보통 필터 크기는 3 × 3 또는 5 × 5를 사용하고 스트라이드는 1로 설정한다.7 상대적으로 복잡한 합성곱 신경망인 GoogleLeNet 8은 1 × 1, 3 × 3, 5 × 5 크기의 필터를 사용하고 각각을 비교한다. 또 다른 인기 있는 신경망인 VGGNet 9은 합성곱 계층 필터를 보통 3 × 3으로 사용한다. 3 × 3 은 픽셀의 상, 하, 좌, 우, 중앙을 모두 캡처할 수 있는 최소 크기다. NOTE_ 필터 크기와 중첩된 계층

3 × 3 필터와 풀링 계층을 사용한 중첩된 합성곱 계층 세 개는 7 × 7 필터를 사용한 단일 합성곱 계층과 유사 하다. 합성곱 계층과 필터를 추가하면 학습 과정에서 규제를 적용하기 쉬워진다. 계층이 더 많아지면 변환이 비선 형성을 띠게 되고 파라미터 수가 줄어들기 때문이다.

계층 시퀀스와 필터 모양을 결정하는 또 다른 방법은 VGGNet이나 GoogleLeNet 같은 성공 적인 구조로 시작해 해당 신경망에서 관찰되는 패턴 10으로부터 영감을 얻는 것이다. 5 「Very Deep Convolutional Networks for Large - Scale Image Recognition」(Simonyan, Zisserman, 2014 ) (https:// arxiv.org/abs/1409.1556 ) 6 치레산(Ciresan )은 2011년 작은 필터 개념을 도입했으나 그 당시 신경망은 깊지 않았다. 굿펠로(Goodfellow )는 2014년 거리 표지 판 인식에 이 개념을 적용했다. GoogleLeNet (세게디)는 2014년에 ImageNet (이미지넷) 상을 수상하기도 했다. 7 예를 들어 MNIST를 사용할 때는 입력 이미지가 28 × 28 공간 차원을 가지며 첫 번째 합성곱 계층 필터는 5 × 5 크기를 갖는다. 8 인셉션이라고도 하며, 2014년 ILSVRC (ImageNet Large - Scale Visual Recognition Challenge )에서 분류 및 탐지를 위한 새로 운 최첨단기술을 선보였다. https://arxiv.org/abs/1409.4842 9 「Very Deep Convolutional Networks for Large - Scale Image Recognition」(Simonyan , Zisserman , 2014 ) (https:// arxiv.org/abs/1409.1556 ) 10 AlexNet과 같은 신경망의 필터/커널 크기는 현대 표준에 비해 큰 편이다. 이미지 크기를 변경하면 작업을 더 잘 수행할 수 있다(예를 들어 이미지를 자르거나 크기를 조절할 수 있다).

7장 심층 신경망 구조별 튜닝하기 349


CAUTION_ v3 인셉션 논문에 명시된 필터 크기에 대한 주의사항

위 결과는 3 × 3보다 큰 필터를 가진 합성곱 계층이 항상 중첩된 3 × 3 합성곱 계층으로 축소될 수 있기 때문 에 일반적으로 유용하지 않을 수 있음을 시사한다.11

합성곱과 출력 볼륨의 공간 크기 계산11 다음은 입력 볼륨 크기로부터 출력 볼륨의 공간 크기를 계산하는 데 사용하는 일반적인 공식 12 이다. Output volume size = (W – F +2P)/S + 1

[표 7-2]는 변수에 대한 설명이다. 표 7-2 출력 볼륨의 공간 크기에 대한 변수 변수

설명

W

입력 볼륨 크기

F

합성곱 계층 뉴런의 수용 영역 크기

S

스트라이드 설정값

P

제로패딩 설정값

이 수식의 결과는 정수여야 한다. 그렇지 않은 경우 구성이 잘못된 것이다. 결과가 정수가 아닌 경우 패딩, 다른 필터 크기, 자르기 모드(잠시 후에 설명)를 사용하여 결과를 정수로 수정할 수 있다. 합성곱 계층이 입력 공간 크기를 유지하는 반면 풀링 계층은 다운샘플링을 통해 입력 공간 크기를 줄임을 염두에 두라. CAUTION_ 입력 볼륨 추적하기

1보다 큰 스트라이드를 사용하거나 합성곱 계층에서 입력에 제로패딩을 사용하지 않으면 합성곱 신경망 전 반에서 입력 볼륨을 추적해야 한다. 모든 스트라이드와 필터가 신경망에서 균형을 유지할 필요가 있다.

DL4J는 입력을 검증해 잘못된 구성을 잡아낸다. 그러나 문제를 해결하려면(또는 각 계층에서 유효한 정보를 파악하려면) 전체 볼륨을 추적해야 한다. 또한 패딩을 고정하지 않고 구성하는 방법도 있다.

11 「Rethinking the Inception Architecture for Computer Vision」( Szegedy et al., 2015 ) ( https://arxiv.org/abs/ 1512.00567v3 ) 12 http://cs231n.github.io/convolutional-networks/

350 자바를 활용한 딥러닝


CHAPTER

8

벡터화

뉴욕 시, 세인트 조, 앨버커키, 뉴멕시코 이 오래된 도시들은 활발하고 경사 완만하며 그녀는 잘 해내고 있다. 누군가 어떻게 된 일인지 알고 싶어 한다면, 긴 흰색 선의 끝을 찾고 있다고 말해주오. _스터길 심슨(Sturgill Simpson ), <긴 흰색 선(Long White Line )>

8.1 머신러닝에서 벡터화하는 법 이 장은 머신러닝 환경에 사용되는 다양한 데이터를 벡터화하는 일련의 과정을 설명한다. 딥러 닝에 관한 책에서 벡터화를 설명하는 이유는 대부분의 머신러닝 책이 알고리즘 자체에만 초점 을 맞추고 데이터 마이닝의 전체 생명주기에는 그다지 집중하지 않기 때문이다. 가능한 한 빨 리 데이터를 실험할 수 있는 머신러닝 기법을 익혀서 실무 작업에서 ‘텍스트 데이터의 사용자 정의 벡터화’와 같은 주제에 너무 많은 시간을 쏟지 않길 바란다. 기업에서 고객을 상대하다 보면 텍스트 분류 기술 구현에 관해 이야기하게 되는데, 그들이 전 혀 관심을 두지 않는 텍스트를 벡터로 변환하는 방법을 길게 설명하다가 고객 유치에 실패했던 경험이 있다. 기업들은 대부분 CSV 파일과 같이 쉼표로 구분된 형식으로 내보낼 수 있는 스프 레드시트와 같은 간단한 데이터 소스를 가지고 있다. 하지만 이런 간단한 데이터 소스도 반드 시 벡터화 과정을 거쳐야 한다. 또한 고객에게 설명하다 보면 그들은 텍스트를 벡터화하는 방 법에 대해 잘 알지 못하기 때문에 텍스트 데이터를 벡터화할 수 있는 무수히 많은 방법을 설명 하려 드는 나를 발견하게 된다. 8장 벡터화 369


NOTE_ 원시 데이터와 자동화된 특징 학습

3장에서 논의했듯이 딥러닝의 핵심 측면은 특징 공학에서 자동화된 특징 학습으로 이동한다는 것이다. 자동 화된 특징 학습은 딥러닝에서 유용한 측면이지만, 원시 데이터를 신경망이 이해할 수 있는 형태로 가져와야 자동화할 수 있다. 원시 데이터 벡터화 기법은 바로 이러한 작업을 할 수 있게 해준다.

지난 수년간 ‘벡터화 기술’이 데이터 처리 프로세스와 함께 데이터 과학에서 핵심이라는 주장이 여러 번 무시당했다. 이 책을 쓰면서 딥러닝의 모델링 프로세스와 벡터 생성에 대한 프로그래 밍 기법을 어렵지 않게 설명하고 벡터화를 잘 처리하는 방법에 대해 다뤄야겠다는 강한 필요성 을 느꼈다. 또한 이 장에서 모델을 만드는 데 사용되는 원본 데이터의 벡터화 방법에 대해 이론 부터 실습까지 다루면서 양질의 데이터를 딥러닝에 적용하는 방법에 대해 알아보겠다. 이 장의 목표는 독자들이 가능한 한 빨리 데이터 모델링을 할 수 있게 하는 것이다. 일반적으로 머신러닝 작업에 많이 사용되는 데이터셋 1으로 작업할 때 벡터화 작업이 얼마나 다루기 어려운 문제인지 잘 보여준다. 머신러닝의 벡터화 단계는 프로그래밍 및 벡터화에 대한 숙련도에 따라 몇 시간에서 며칠까지 지속될 수 있다. 이러한 벡터화 작업의 특성 때문에 새로 운 사용자가 통계 모델로 작업을 시작하는 데 어려움을 겪는다.

8.1.1 왜 데이터를 벡터화해야 하는가? 머신러닝 및 데이터 과학 분야에서 작업하다 보면 다양한 타입의 데이터를 분석하게 된다. 핵 심 요구사항은 각 데이터 타입을 가져와서 수치적 벡터 또는 수치적 다차원 배열로 나타내야 한다는 것이다. 신경망은 텍스트, 그래프 및 기타 비벡터/비행렬 데이터를 입력값으로 사용할 수 없으므로 입력 데이터를 벡터 및 행렬로 나타내야 한다. 벡터화하는 여러 방법이 있고, 벡터화된 입력을 사용해 출력된 출력 모델이 얼마나 유효한지 다양한 등급을 부여하는 전처리 단계를 적용할 수 있다. 모델링의 유효성을 결정하는 것은 입 력 데이터를 얼마나 잘 벡터화하는지에 달려 있다. 입력 데이터는 다음과 같은 내용과 형태로 제공된다.

1 옮긴이_ 예를 들면 UCI의 데이터셋(https://archive.ics.uci.edu/ml/datasets.html )

370 자바를 활용한 딥러닝


열 기반 CSV 데이터

텍스트 문서

이미지 데이터

오디오 데이터

비디오 데이터

순차 데이터

다음 입력 데이터는 캘리포니아 대학교 어바인 저장소에서 가져온 원시 붓꽃 iris 데이터셋 2인 데, 열 기반 CSV 데이터임을 알 수 있다.

5.1,3.5,1.4,0.2,Iris-setosa 4.9,3.0,1.4,0.2,Iris-setosa 4.7,3.2,1.3,0.2,Iris-setosa 7.0,3.2,4.7,1.4,Iris-versicolor 6.4,3.2,4.5,1.5,Iris-versicolor 6.9,3.1,4.9,1.5,Iris-versicolor 5.5,2.3,4.0,1.3,Iris-versicolor 6.5,2.8,4.6,1.5,Iris-versicolor 6.3,3.3,6.0,2.5,Iris-virginica 5.8,2.7,5.1,1.9,Iris-virginica 7.1,3.0,5.9,2.1,Iris-virginica

다음은 『Go Dogs, Go!』에 실린 내용(평범한 텍스트)이다.

Go, Dogs. Go! Go on skates or go by bike.

두 데이터는 서로 다른 타입의 원시 데이터다. 머신러닝을 수행하려면 두 데이터 모두 벡터화 해야 한다. 머신러닝 알고리즘의 입력 데이터가 다음의 직렬화된 희소 벡터 형식으로 변형되어 야 한다.

2 https://archive.ics.uci.edu/ml/datasets/Iris

8장 벡터화 371


1.0 1:0.7500000000000001 2:0.41666666666666663 3:0.702127659574468 4:0.5652173913043479 2.0 1:0.6666666666666666 2:0.5 3:0.9148936170212765 4:0.6956521739130436 2.0 1:0.45833333333333326 2:0.3333333333333336 3:0.8085106382978723 4:0.7391304347826088 0.0 1:0.1666666666666665 2:1.0 3:0.021276595744680823 2.0 1:1.0 2:0.5833333333333334 3:0.9787234042553192 4:0.8260869565217392 1.0 1:0.3333333333333333 3:0.574468085106383 4:0.47826086956521746 1.0 1:0.7083333333333336 2:0.7500000000000002 3:0.6808510638297872 4:0.5652173913043479 1.0 1:0.916666666666667 2:0.6666666666666667 3:0.7659574468085107 4:0.5652173913043479 0.0 1:0.08333333333333343 2:0.5833333333333334 3:0.021276595744680823 2.0 1:0.6666666666666666 2:0.8333333333333333 3:1.0 4:1.0 1.0 1:0.9583333333333335 2:0.7500000000000002 3:0.723404255319149 4:0.5217391304347826 0.0 2:0.7500000000000002

원시 데이터를 머신러닝용 벡터로 변환하는 과정은 두 단계로 나뉜다. 1 벡터화 2 정규화

다음 절에서 각 단계에 대한 상세한 내용을 확인할 것이다. 또한 다음 세 가지 딥러닝의 주요 입력 데이터를 활용한 데이터 벡터화 및 정규화 개념을 살펴볼 것이다. 순차 데이터

이미지 데이터

텍스트 데이터

이들은 이 책에서 이미 익숙하게 다뤘던 데이터 타입이다. 해당 데이터 타입의 벡터화에 대해 알아볼 것이다. 5.5절 ‘합성곱 신경망을 활용한 손글씨 이미지 모델링’에서 순환 신경망이 순차 데이터를 다루는 데 얼마나 적합한지 알아봤다. 따라서 순환 신경망에 사용하는 순차 데이터에 대한 벡터화 기술을 설명할 것이다. 또한 5.4절 ‘다층 퍼셉트론 신경망으로 CSV 데이터 모델 링하기’에서 알아봤던 것처럼 이미지 분석 영역에서 합성곱 신경망을 활용할 때 큰 장점을 보 여주기 때문에 이미지 벡터화도 살펴볼 것이다. 5장 말미에서 다뤘던 텍스트 데이터에 대한 벡 터화를 좀 더 자세히 검토하고, Word2Vec으로 텍스트를 벡터화하는 방법을 살펴볼 것이다.

372 자바를 활용한 딥러닝


NOTE_ 딥러닝에서 데이터 전처리의 본질적인 변화

딥러닝은 벡터화 같은 특징 공학(feature engineering )을 적용한 전처리 단계를 줄일 수 있는 방법을 연구 해왔다. 여전히 데이터를 벡터 형식으로 가져와야 하지만, 데이터셋 학습 과정에서 특징 선택과 차원 감소를 수행하여 전처리 과정을 더 적게 수행할 수 있게 했다.

지난 10년 동안 많은 머신러닝 전문가들은 전문지식을 활용하여 수작업으로 입력 데이터셋에 대한 벡터 특징을 알아내는 것을 선호했다. 여기서 전문지식이란 데이터가 어떻게 생성되었는 지 또는 데이터 소스가 실세계와 어떤 상관관계를 가지는지에 대한 이해도를 말한다. 이 장 뒷부분에서는 적은 수의 속성을 가진 데이터셋을 수작업으로 벡터화하는 방법을 살펴 볼 것이다. 하지만 텍스트 문서, 이미지, 오디오 파일처럼 크기가 큰 데이터셋은 수작업으로 할 수 없기 때문에 알고리즘을 사용한 벡터화를 알아봐야 한다. 원본 데이터의 텍스트 데이터양 이 많을 때도 복잡성이 증가해 수작업이 어렵다. 벡터를 자동으로 생성해주는 일반적인 알고 리즘으로는 커널 해싱, TF-IDF Term Frequency-Inverse Document Frequency (단어 빈도-역문서 빈도),

Word2Vec 등이 있다. 원시 데이터를 사용해서 모델을 만들 때 고려해야 할 주요사항은 다음과 같다. 어떤 종류의 데이터를 다룰 것인가?

이 데이터를 이용해서 어떤 모델의 타입을 학습할 것인가?

데이터를 벡터화하는 방법은 무엇인가?

- 특징을 수작업으로 인코딩할 것인가? 아니면 자동화 알고리즘을 사용할 것인가? - 원시 텍스트는 다루기가 더 어려워지는 경향이 있으므로 어떻게 처리하는 것이 좋을까?

데이터 타입에 따라 벡터화를 수행하는 동안 여러 사항을 고려해야 한다. 예를 들어 데이터베 이스 테이블과 같은 열 기반 데이터는 각 열의 타입을 벡터화하는 방법이 다른 데이터 타입보 다 비교적 잘 알려졌다. 그러나 여러 파일에 분산되어 여러 변수로 표현되는 시계열 데이터를 벡터화하는 경우에는 어떻게 해야 할까? 최근 들어 애플리케이션에서의 머신러닝 파이프라인 아키텍처에 대한 논의가 활발하다. 이 장에서는 머신러닝의 파이프라인을 구축하는 방법을 다 룬다. 먼저 열 기반 데이터를 다루는 방법에 대해 알아보자.

8장 벡터화 373


추출, 변환, 로드 오늘날 기업의 많은 기업 정보 수집 활동 Business Intelligence 및 보고 도구들은 추출 Extract, 변환 Transform

, 로드 Load 의 약자를 따서 ETL이라는 전처리 단계를 사용한다. 이 용어는 아파치 하둡에

서 일반적으로 쓰인다. ETL은 여러 데이터셋을 병합하고, 원치 않는 열을 필터링하며, 필요한 변 환을 적용한 다음 다른 애플리케이션에서 사용할 수 있도록 데이터를 로드하는 단계다. 대부분 의 벡터화 프로세스는 파이프라인의 ETL 단계 동안 수행되며, 파이프라인을 구축할 때 ETL 단 계에서 어떤 작업들을 수행할지 고려할 필요가 있다.

8.1.2 열 기반 원시 데이터를 속성별로 다루는 법 관계형 데이터베이스 관리 시스템 RDBMS 으로부터 내보내기 된 테이블과 같은 열 기반 원시 데 이터는 다양한 타입과 크기를 가지지만, 데이터 테이블의 각 열 기반 데이터 타입과 상관없이 모두 ‘속성’으로 간주된다. 데이터셋의 각 속성은 속성 타입으로 분류할 수 있다. 데이터 과학에 서는 속성별로 타입을 분류하는 작업에 데이터 열이나 속성에 대한 정의를 사용할 것이다. 통 계 논문에서는 일반적으로 열 기반 데이터를 다음 4가지 타입의 속성으로 정의한다. 명목형(nominal ) 데이터

순서형(ordinal ) 데이터

간격형(interval ) 데이터

비율형(ratio ) 데이터

각 타입에 대해 간단히 살펴보자.

명목형 데이터 명목형 데이터는 열거된 데이터나 특정 범주에 있는 데이터를 말한다. 예를 들어 ‘맑음’, ‘흐림’, ‘비’와 같은 분리된 데이터를 들 수 있다. ‘명목형’이라는 용어는 데이터가 속성에 따라 분류된 다는 의미다. 특정 기준으로 분류된다는 것은 데이터가 명확한 속성을 지닌다는 것을 의미하기 때문이다. 그리고 이런 기준은 이후 출력 계층에서 레이블 역할을 하기도 한다. ‘명목’이라는 용 어는 ‘이름’의 라틴어에서 유래되었다. 다른 기준으로 분류된 데이터 간에는 속성이나 레이블 이 서로 연관되어 있지 않으며 데이터 간의 순서도 큰 의미가 없다.

374 자바를 활용한 딥러닝


명목형 열 기반 데이터의 경우 열의 값에 5.4절 ‘다층 퍼셉트론 신경망으로 CSV 데이터 모델링 하기’에서 알아본 원-핫 인코딩을 적용하는 것이 좋다. 그러면 1.0 값을 포함하는 소스 데이터 의 값과 0.0 값을 포함하는 다른 열로부터 특징 벡터에 다중 열을 생성할 수 있다. [표 8-1]은 첫 번째 레코드의 값이 ‘맑음’이고 두 번째 레코드 값이 ‘비’인 두 레코드의 예제 표현 을 보여준다. 표 8-1 특징 벡터에서 원-핫 인코딩을 사용하는 예 [다른 열들]

맑음

흐림

[다른 열들]

...

1.0

0.0

0.0

...

...

0.0

0.0

1.0

...

순서형 데이터 순서형 데이터에 대한 값은 순서가 있다는 것을 제외하고는 명목형 데이터와 분류되는 기준이 같 다. 순서형 데이터에는 순위를 지정하거나 순서를 지정하는 개념은 있지만, 값 사이의 거리 개념 은 없다. 순섯값을 서로 비교할 수 있지만, 거리 개념이 없는 순서형 데이터에서는 의미가 없다. 순서형 데이터의 예로 ‘뜨거운’, ‘온화한’, ‘시원한’의 관계를 이야기할 수 있다(규칙이 일치하는 한 순서는 중요하지 않음). 순서형 데이터의 다른 예는 ‘낮다’, ‘중간’, ‘높다’다. 이 값들은 결국 정수(예 : 시원한 = 0, 온화한 = 1 등)로 변환하여 벡터화의 코드에서 부동소수점 값으로 표현 된다. 순서형 데이터와 명목형 데이터는 유사해서 차이점이 명확하지 않다. 오래된 데이터 마이닝 시 스템 중 일부는 명목형 데이터와 순서형 데이터만 다루기도 한다. 순서형 데이터에서 출력 벡 터에 대한 벡터 표현은 원-핫 인코딩을 적용한 후 사용한다. 입력 벡터의 경우 열 값을 실숫값 으로 변환한 데이터를 사용한다.

간격형 데이터 간격형 데이터는 일정 간격으로 정렬되어 있는 값을 말한다. 간격형 데이터를 사용하는 좋은 예는 특정 날짜 또는 연도다. 정렬되어 있는 값 간의 간격은 비교할 수 있지만 간격을 더하거나 뺄 수는 없다. 간격값은 이미 숫자이므로 변환할 필요가 없지만 정규화 규칙이 적용되어 값이 변경되어 적용될 수 있다.

8장 벡터화 375


비율형 데이터 비율형 데이터는 영점을 기준으로 비율을 측정하며 실수로 표현한다. 실수로 표현하기 때문에 간격형 데이터와는 다르게 수학 연산을 할 수 있다. 비율 데이터를 사용하여 먼저 영점을 정의한 다음, 이 고정된 영점과의 거리를 비율로 나타낸다. 비율형 데이터는 이미 숫자이므로 변환할 필 요가 없지만 정규화를 적용할 수 있다. 비율형 데이터에 대한 정규화는 다음 절에서 다루겠다.

8.1.3 특징 엔지니어링과 정규화 기법 벡터화에 대한 연구가 활발하게 진행되면서 실무자들은 표준적인 ‘균일한’ 형태의 벡터를 구하 는 방법을 연구했다. 로지스틱 회귀, 랜덤 포레스트 등과 같은 방법이 연구되었고, 이러한 방법 을 바탕으로 머신러닝의 파이프라인에 적용한 벡터화 패턴을 자주 접할 수 있다. 벡터화를 진행하는 고전적인 방법을 살펴보자. 길이 n 만큼 고정된 벡터를 생성하고, 0에서

n - 1까지는 특징값, 마지막 슬롯은 레이블값이 들어간다. 데이터에 대한 벡터화를 진행하는 방법을 적용하여 각 순서가 매겨진 셀에 값을 저장한다. 이러한 고전적인 형태의 벡터화는 일 반적으로 미니배치를 사용하지 않는 다층 퍼셉트론과 같은 신경망에 적합하다. 하지만 대부분 의 경우 딥러닝의 입력으로 n 차원의 행렬 데이터 구조를 구축한다. 이 장을 진행하면서 순환 신경망의 입력 텐서와 합성곱 신경망에 대한 4차원 텐서 입력을 생성하는 발전된 방법을 보게 될 것이다. 이 절에서는 입력 텐서에 대한 개별 특성값을 설정하는 방법과 이 값에 표준화를 적 용하는 방법을 집중적으로 살펴본다. 벡터화는 속성을 선택하고 특성을 할당할 특성 벡터에서 차원을 찾는 것에 기반한다. 이는

CSV, 텍스트, 이미지 또는 시계열 데이터로 작업하는지 여부에 따라 다양한 방식으로 수행된 다. 입력 데이터의 어느 부분을 작업할지 선택하고 입력 벡터에서 그 데이터를 수집해야 한다.

n 개의 속성을 가져와 출력 벡터에서 m 개의 특징으로 변환하는 과정을 특징 엔지니어링이라고 한다. 특징 엔지니어링은 다양한 방법으로 수행할 수 있다. 원시 데이터는 일반적으로 모델링 을 준비하기 전에 변환이 필요며, 다음과 같은 다양한 포맷일 수 있다. 텍스트 파일로 된 문서와 같은 원시 텍스트

줄마다 트윗 문자열이 포함되어 있는 파일

사용자 지정 파일 형식의 이전 시계열 데이터

376 자바를 활용한 딥러닝


숫자와 문자열 속성이 혼합된 전처리된 데이터셋

이미지 파일

오디오 파일

원시 데이터의 포맷 및 데이터 내용에 따라 속성은 숫자 또는 문자열 형식일 수 있다. 대부분의 경우 속성값은 숫자며 연속된 값이다. 이들 속성은 실수 또는 정숫값 중 하나로 숫자를 측정한 다. ‘연속성’은 이 설정에 부합하는 용어다.

데이터 정리 및 ETL 데이터 정리는 대부분의 데이터 과학자에게 있어서 실용적인 단계며 상당한 시간이 소요된다. 데이터 정리는 머신러닝의 ETL 단계에서 수행하며, 일반적으로 스크립트 또는 하둡 작업과 함 께 ETL 파이프라인에서 수행된다. 속성의 종류 및 시나리오의 의도에 따라 적절한 기본값을 사 용할 수 있다. 그리고 값이 있는 데이터셋의 열 또한 확인할 필요가 있다. 다양한 이유로 값이 부 정확할 수 있기 때문이다. 데이터가 수집되는 도중 일부 열의 값이 부적절하거나 정확하지 않은 더미 값을 받았을 수 있다. 따라서 데이터셋의 통계치 및 그래프의 특성을 확인하는 것이 좋다.

열 기반 데이터를 벡터화하는 코딩을 하거나 시계열이나 이미지 데이터와 같은 더 복잡한 데이 터로 작업을 할 때 특징 엔지니어링의 기법을 적용할 수 있다. 이러한 기법에는 다음과 같은 것 들이 있다. 속성에서 값을 변경하지 않고 직접 가져오기

속성을 정규화해서 특징 생성하기

특징 이진화하기

차원 축소하기

이 기법들을 자세히 알아보자.

특징 복사 원시 입력 데이터에서 벡터를 생성하려면 모델과 가장 관련 있다고 생각되는 데이터의 적절한 특징을 선택해야 한다. 특징 선택은 오랫동안 성공적인 모델을 구축하기 위한 키포인트로 알려 져 있다. 생성된 벡터의 특징 수는 일반적으로 소스 데이터의 속성 수와 일치하지 않는다. 여러

8장 벡터화 377


번 소스 데이터가 다른 데이터셋과 함께 결합하고 나서 데이터셋의 결과로 비정규화된 뷰의 속 성 하위 셋이 벡터의 최종 특징 셋을 유도하는 데 사용된다. 특징을 생성하는 가장 일반적인 방법은 이미 숫자로 되어 있고 올바른 범위에 있는 속성을 단 순히 복사하는 것이다. 하지만 안타깝게도 이런 식으로 특징을 생성하는 경우는 흔하지 않다. 더 자주 그 속성에 몇 가지 기본적인 변화를 줄 필요가 있기 때문이다.

누락값 다루기 데이터를 사용할 때마다 범위를 벗어난 데이터 입력(-1이 숫자 요소에 포함되어 있거나 0 값이 들어갈 수 없는 숫자 속성에 0이 들어 있는 경우)이 발생하고 원시 입력 데이터 상의 누락값이 표시된다. 명목 속성의 경우 누락값은 대개 공백이나 대시(-)로 표시된다. 누락값은 다양한 이 유로 발생할 수 있으며, 원본 데이터의 메커니즘을 이해하면 값이 왜 누락되었는지 아는 데 도움 이 된다. 좋은 사례는 분리된 데이터를 찾기 위해 벡터를 작성하기 전에 데이터셋의 통계 및 특 성을 연구하는 것이다. 이것에 대한 간단한 방법은 다양한 속성의 그래프를 만들어보고, 올바르 게 보이지 않는 것을 찾는 것이다. 예를 들어 0 값을 갖는 연도 속성과 같은 것을 찾는다. 누락값을 다루는 기본적인 방법은 다음과 같다. 레 코드를 필터링해서 누락값이 있는지 확인한다(경고 : 누락값이 발생하는 레코드가 무작위로 발생하지 않으면

레코드 간의 편향이 발생할 수 있다).

누 락값이 있다면 0으로 설정한다(경고 : 어떤 경우에는 상관없지만 데이터를 지저분하게 만들 수 있다).

누 락값이 있다면 열의 가장 일반적인 값으로 설정한다(이 일반적인 값을 결정하는 다른 변형이 있다).

정규화 정규화 방법은 입력에 사용되는 원시 데이터로 변환한 뒤 훈련에 사용될 데이터의 범위, 예를 들어 [0, 1], [-1, 1] 등으로 확대하는 것이다. 정규화는 신경망의 활성홧값에 영향을 줄 수 있으 므로 정확하게 계산해야 한다. 신경망의 입력값이 너무 크면 활성홧값이 너무 커져서 잠재적으 로 학습에 악영향을 미친다. 반대로 입력값이 너무 작으면 활성홧값이 너무 작아질 수 있다. 신 경망의 계산된 경사도 또한 활성홧값과 비슷한 방식으로 영향을 받을 수 있다.

378 자바를 활용한 딥러닝


CHAPTER

9

스파크에서 딥러닝과 DL4J 사용하기

길 위에서 보낸 10년은 하룻밤 같았어 내 젊은 시절은 순식간에 지나갔지 알아듣게 한 번 더 말해줄래 행크가 이렇게 노래했다고 생각해? 행크 옹이 정말 이렇게 노래했냐고? _웨이론 제닝스, <행크가 이렇게 노래했다고 생각해?>

9.1 하둡과 스파크에서 DL4J 사용하는 방법 지난 10년 간 등장한 두 가지 주요 데이터센터 기술은 하둡과 스파크다. 하둡은 특히 데이터 웨어하우스의 성장과 발전을 이끌었다. 스파크는 맵리듀스 뒤를 이어 병렬 반복 알고리즘을 실 행할 수 있는 하둡의 주요 프레임워크가 되었다.

DL4J는 스파크에서 신경망 학습의 스케일 아웃 scale-out (수평 확장)을 지원한다. 스파크로 DL4J 를 실행해 신경망을 학습시키는 데 필요한 시간을 크게 줄일 수 있다. 또한 입력 크기가 커져도 학습 시간이 비례해서 늘어나지 않는다.

9장 스파크에서 딥러닝과 DL4J 사용하기 409


NOTE_ 클라우드로!

아마존 웹 서비스, 구글 클라우드, 마이크로소프트 애저와 같은 플랫폼을 사용하면 적은 돈으로 필요한 만큼 스파크 클러스터를 구축할 수 있다. DL4J는 대부분의 퍼블릭 클라우드 인프라에서 실행할 수 있으므로 실무 자가 방법에 구애받지 않고 어디서든 딥러닝 워크플로를 실행할 수 있다.1

스파크는 하둡 얀 Yet Another Resource Negotiator, YARN 을 사용한 하둡 클러스터, 아파치 메소스 2 클러 스터 또는 독립 모드로 실행할 수 있는 병렬 처리 엔진이다. 스파크는 하둡에 포함된 입력 형식 을 사용해 하둡 분산 파일 시스템 Hadoop Distributed File System, HDFS 의 데이터로 작업할 수 있다. 스 파크는 자주 사용되는 데이터를 RDD Resilient Distributed Datasets (탄력적 분산 데이터셋) 형태로 메 모리에 캐싱한다. 스파크를 사용하면 프로그래머는 병렬 처리하는 부분을 추상화해 알고리즘 을 작성하는 데 집중할 수 있다. 이 책에서는 DL4J의 확률적 경사 하강법과 같은 병렬 반복 알 고리즘을 스파크가 어떻게 배치 처리하는지 중점적으로 설명한다.12 스파크 잡의 핵심 구성요소는 다음과 같다. 애플리케이션

스파크 애플리케이션은 컴파일된 스파크 잡 JAR 파일을 말한다. 단일 잡이거나 체이닝된 여러 잡이거나 상호 작용하는 스파크 세션일 수 있다. 스파크 드라이버

스파크 드라이버는 스파크 컨텍스트를 실행하고 애플리케이션을 태스크의 방향 그래프로 변환한다. 변환된 태스크는 클러스터에서 실행되도록 스케줄링된다. 드라이버는 스파크 애플리케이션당 하나만 존재한다. 스파크 애플리케이션 마스터

하둡 얀을 통해 스파크를 실행하면 스파크 애플리케이션 마스터는 얀으로부터 클러스터의 리소스를 할당받는 다. 애플리케이션 마스터는 스파크 애플리케이션당 하나만 존재한다. 스파크 익스큐터

익스큐터는 로컬 호스트의 단일 JVM 인스턴스에서 여러 태스크를 실행한다. 스파크 드라이버는 살아 있는 익스큐터에 태스크를 할당한다. 단일 호스트는 로컬에 스파크 익스큐터 여러 개를 가질 수 있다. 클러스터는 심지어 장비에 익스큐터를 천 개 이상 띄워놓고 여러 애플리케이션을 동시에 실행하도록 할 수 있다. 스파크 태스크

익스큐터가 수행할 분산 데이터셋(RDD라고도 함)의 일부 작업 단위를 의미한다. R DD

RDD는 병렬로 처리할 수 있는 요소들로 구성된 내고장성이 있는 컬렉션이다. 1 현재 데이터브릭스(DataBrick )는 스파크 클라우드를 제공하지 않지만 향후 제공할 것이다. 2 http://mesos.apache.org/

410 자바를 활용한 딥러닝


RDD RDD는 아파치 스파크의 핵심 자료 구조다. 스파크에서 사용하는 RDD는 여러 분산 노드에 저장 되는 변경 불가능한 컬렉션이다. RDD 작업은 고수준 언어 코드로 컴파일되어 프로그래머가 알 고리즘 및 비즈니스 로직에 집중하고, 분산 시스템 관리 및 실행에 대해서는 고민할 필요 없도록 만든다. 다음은 스파크 프로그램에서 RDD를 생성하는 일반적인 두 가지 방법이다. 스 파크 애플리케이션에서 기존 컬렉션을 병렬화한다.

외 부 스토리지 시스템에서 데이터셋을 참조한다.

외부 스토리지 시스템에는 HDFS, HBase 3 , 카산드라 Cassandra 4 , Hadoop InputFormat과 호 환되는 기타 시스템이 포함된다. 사실 대부분은 HDFS다.

아파치 하둡은 자바로 작성된 병렬 처리 도구(예를 들면 MapReduce ) 및 분산 파일 시스템 (예를 들면 HDFS ) 묶음이다. 하둡은 구글의 맵리듀스 5와 구글 파일 시스템 GFS 논문에 게시된 디자인을 기반으로 한다. 하둡은 아파치 너치 프로젝트 Apache Nutch project 6의 일환으로 처음에는 아파치 루씬 Apache Lucene 7 검색 엔진의 역색인 구조를 병렬화하는 용도로 만들어졌다. 하둡 프 로젝트는 더그 커팅 8과 마이크 카파렐라가 시작해 궁극적으로 검색 엔진 인프라를 널리 전파 했으며 나중에는 데이터 웨어하우스의 구축 방법에 혁신을 가져왔다. 2008년 1월 하둡은 너치 프로젝트와 분리되어 최상위 아파치 프로젝트가 되었다. 야후!는 내부적으로 이 기술을 채택하고 프로젝트에 필요한 엔지니어링 리소스를 투입해 하둡 프로젝트를 더 발전시켰다. 2008년 4월 하둡은 (노드 910개를 가진 하둡 클러스터를 사용해) 단지 209초 만에 1테라바이트 데이터를 정렬하는 세계 기록을 세웠다.9 2009년까지 라스트

3 https://hbase.apache.org/ 4 http://cassandra.apache.org/ 5 「MapReduce : Simplified Data Processing on Large Clusters 」( Dean , Ghemawat , 2008 ) ( https://static. googleusercontent.com/media/research.google.com/en//archive/mapreduce-osdi04.pdf ) 6 https://nutch.apache.org/ 7 https://lucene.apache.org/ 8 https://en.wikipedia.org/wiki/Doug_Cutting 9 http://sortbenchmark.org/YahooHadoop.pdf

9장 스파크에서 딥러닝과 DL4J 사용하기 411


FM, 페이스북, 뉴욕타임스, 테네시 강 유역 개발공사10 같은 많은 기업에서 상용 장비를 사용 해 대량의 데이터를 병렬로 처리 11할 수 있는 하둡에 주목했다. 현재 여러 하둡 배포판 공급업 체가 포춘 500대 기업 외에도 여러 기업에 하둡을 제공하고 있다. 아파치 하둡은 최신 데이터 웨어하우스 인프라가 되었으며 엔터프라이즈 실행 환경의 사실상 표준이다. NOTE_ DL4J, 스파크, 하둡

DL4J는 하둡 환경에서 일급 객체(first-class citizen )로 동작하도록 디자인되었다. DL4J는 스파크의 하둡 클러스터 얀 모드, 메소스 모드, 독립 모드 모두에서 동작한다. DL4J를 테스트하는 실무자라면 스파크 전용 클러스터에서 DL4J를 사용할 수도 있지만 큰 규모의 기업에서는 일반적으로 스파크를 메소스 모드나 얀 모 드로 사용한다.

9.1.1 명령줄에서 스파크 다루기 일반적으로 명령줄에서 많은 파라미터를 포함시켜 스파크 잡을 실행한다. 명령줄에서 스파크 잡을 실행하는 기본 방법과 다양한 옵션을 처리하는 방법에 대해 알아보자.

spark-submit spark-submit 배시 셸 스크립트로 클러스터에 잡을 제출할 수 있다. 다음은 spark-submit 명령

과 얀 모드로 하둡 클러스터(CHD12, HDP13 )에서 스파크 잡을 실행하는 데 필요한 옵션이다. spark-submit --class [class name] --master yarn [jar name] [job options]

다음은 각 속성에 대한 설명이다. c lass name

완전한 클래스 이름.

10 http://cnet.co/2uytyct, http://bit.ly/2uSutEa 11 http://bit.ly/2tpfzHk 12 http://bit.ly/2uyAaaV 13 http://bit.ly/2tpf4gC

412 자바를 활용한 딥러닝


j ar name

JAR 파일의 경로 및 이름. 잡을 수행하는 데 필요한 모든 것을 포함하고 있어 uber jar라고도 한다. j ob options

스파크 잡에 필요한 여러 옵션.

다음은 예제다. spark-submit --class io.skymind.spark.SparkJob --master yarn /tmp/Skymind-SNAPSHOT.jar /user/skymind/data/iris/iris.txt

이 잡은 Skymind-SNAPSHOT.jar에서 io.skymind.spark.SparkJob 클래스를 실행한다. 그리 고 입력 데이터의 위치를 설명하는 파라미터가 하나다. 때로는 실행할 때 명령줄에서 특정한 잡 구성 등록 정보를 변경할 수 있다. 다음과 같이 명령줄 에 여분의 플래그를 넣거나 특수한 구성 파일에 플래그를 지정해 이 작업을 수행할 수 있다. spark.master spark://mysparkmaster.skymind.com:7077 spark.eventLog.enabled true spark.eventLog.dir hdfs:///user/spark/eventlog # 스파크 익스큐터 메모리 설정 spark.executor.memory 2g spark.logConf true

텍스트 파일에 구성 키값을 배치하는 것은 잡을 보다 빠르게 실행하고 관리할 수 있는 유용한 방법이다. 일반적으로 이 텍스트 파일을 잡이 담긴 JAR 파일과 함께 로컬 디렉터리에 저장하 고 명령줄에서 잡을 실행할 때 이 디렉터리를 참조한다.

하둡 보안 및 커버로스 커버로스 Kerberos 는 일반적인 엔터프라이즈급 인증 시스템이다. 인증 세션 가로채기와 같은 공 격을 방어할 수 있다. 또한 자격 증명을 일반 텍스트로 네트워크를 통해 보내지 않아 사용자 가 장 공격을 방지하는 데 도움이 된다. 보안에 대한 내용을 건너뛰려면 9.2절 ‘스파크 실행 구성 및 튜닝하기’로 이동하라.

CDH 및 HDP 같은 주요 하둡 배포판은 커버로스 인증을 지원한다.

9장 스파크에서 딥러닝과 DL4J 사용하기 413


NOTE_ 하둡 배포판에서 인증 획득하기

스카이마인드(DL4J에 대한 상용 지원)는 새로운 DL4J 릴리즈가 CDH 및 HDP 신규 릴리즈에 대한 인증 을 받도록 보장한다.

커버로스 인증서는 선택적으로 LDAP Lightweight Directory Access Protocol (경량 디렉터리 액세스 프로 토콜) 또는 활성 디렉터리에 저장된다. 커버로스 인증을 사용하는 클러스터에서 얀 모드로 스파크를 실행하려면 다음 두 가지 작업을 해야 한다. 1 수동으로 스파크 어셈블리 JAR를 HDFS에 업로드 2 명령줄에서 커버로스 초기화

스파크 어셈블리 업로드하기. 먼저 스파크 어셈블리 JAR를 HDFS 디렉터리에 수동으로 업로드

한다. /user/spark/share/lib

스파크 어셈블리 JAR는 로컬 파일 시스템에 있으며 일반적으로 다음 위치에 있다. /usr/lib/spark/assembly/lib

CDH를 사용한다면 다음 위치에 있다. /opt/cloudera/parcels/CDH/lib/spark/assembly/lib

HDP에서 스파크 잡을 실행하면 라이브러리가 HDFS로 업로드되므로 잡을 실행하는 사용자 는 HDFS에 쓸 수 있는 권한이 필요하다. CAUTION_ 커버로스 및 스파크 주의사항

커버로스 인증을 사용하는 클러스터에서 JAR를 HDFS에 수동으로 업로드하지 않고 스파크 잡을 실행하면 잡이 실패한다. 스파크에 커버로스 지원이 제한되어 있으므로 (잡의 일부로 실행되는) JAR 업로드 명령은 자 동으로 실패한다.

414 자바를 활용한 딥러닝


커버로스 초기화하기. 커버로스를 초기화하려면 먼저 다음 명령을 입력한다.

kinit [user-name]

암호를 입력하라는 메시지가 나타나면 암호를 입력한다. 커버로스를 초기화한 후에는 다음 명 령을 입력해 커버로스 티켓이 있음을 확인한다. klist

그러면 다음 출력과 비슷한 내용이 표시된다. 커버로스 티켓이 활성화 상태고 유효하다는 것을 확인할 수 있다. [skymind@sandbox ~]$ klist Ticket cache: FILE:/tmp/krb5cc_1025 Default principal: skymind@HORTONWORKS.COM

Valid starting

Expires

Service principal

07/05/16 20:39:08

07/06/16 20:39:08

krbtgt/HORTONWORKS.COM@HORTONWORKS.COM

renew until 07/05/16 20:39:08

9.2 스파크 실행 구성 및 튜닝하기 스파크는 여러 타입의 분산 플랫폼에서 실행하거나 단일 장비에서 로컬로 실행할 수 있다. 이 장에서는 얀 기반 하둡 클러스터 및 메소스 기반 클러스터에서 실행되는 스파크에 중점을 두어 설명한다. 이러한 시스템은 클라우데라의 CDH 배포판이나 호튼웍스의 HDP 배포판의 엔터 프라이즈 사용자뿐만 아니라 아파치 메소스 클러스터 관리 시스템 사용자가 친숙하게 다룰 수 있어야 한다.

9장 스파크에서 딥러닝과 DL4J 사용하기 415


스파크는 실행이 어떻게 분산되고 스파크 드라이버 프로세스가 어디에서 실행되는지에 따라 다양한 방식으로 실행할 수 있다. 이 작업 방식에 대한 몇 가지 기본 개념을 이해하면 로컬에서 실행되는 간단한 잡부터 클러스터에서 밤새 실행되는 잡까지도 실행할 수 있게 된다. 각 스파크 애플리케이션에는 포그라운드(클라이언트 모드) 또는 백그라운드(클러스터 모드) 에서 실행할 수 있는 드라이버 프로세스가 있다. 예를 들어 포어그라운드 클라이언트를 닫으면 클러스터에서 작업을 제어하는 로컬 프로세스가 중지되므로 잡이 중단된다. 그러나 백그라운 드 클라이언트를 종료하는 경우에는 잡 컨트롤러가 다른 호스트에서 실행 중이므로 스파크 작 업을 계속 실행할 수 있다. 활성화된 드라이버는 스파크에서 워크플로를 관리하고 스파크 태스 크를 스케줄링하는 데 사용된다. 클라이언트 모드에서 스파크 드라이버 프로세스는 로컬 장비에서 실행된다. 클러스터 모드에 서 스파크 드라이버 프로세스는 클러스터의 원격 장비에서 실행된다.

9.2.1 메소스에서 스파크 실행하기 하둡 배포판 없이 스파크를 분산 모드로 작동시키고 싶다면 메소스 14 클러스터 관리자를 사용 하라. 메소스는 사용자가 물리 장비 개념을 벗어나 CPU, 메모리, 스토리지, 기타 컴퓨팅 리소 스를 사용할 수 있게 한다. 이를 통해 클러스터 장비를 단일 리소스 풀처럼 사용할 수 있어서 내고장성을 확보하고 다중 점유 시스템 multitenant system (‘멀티테넌트 시스템’이라고도 한다)을 보다 효율적으로 실행할 수 있다. 메소스를 사용하여 클러스터를 관리할 때 메소스 마스터는 스파크 마스터를 클러스터 관리자 로 대체한다. 이 모드에서 메소스는 드라이버가 스파크 작업을 생성하고 스케줄링할 태스크를 생성할 때 어떤 장비가 어떤 태스크를 처리하는지 결정한다. 클러스터에서는 보통 많은 단기 태스크를 처리한다. 메소스는 클러스터의 다른 프레임워크나 태스크와의 멀티테넌시를 허용하 는 방식으로 태스크를 다룬다. 스파크 메소스 모드에는 두 가지 주요 모드가 있다. 클라이언트 모드

클러스터 모드

14 http://mesos.apache.org/

416 자바를 활용한 딥러닝


클라이언트 모드에서 스파크 메소스 프레임워크는 클라이언트 장비에서 직접 실행되며 사용자 가 명령을 입력하거나 프로그램을 실행할 때까지 기다린다. 사용자는 화면의 콘솔에서 직접 드 라이버 출력을 볼 수 있다. 클라이언트 모드 15에서 스파크 메소스 모드를 사용해 작업을 실행하려면 다음을 수행해야 한다. 1 spark -env.sh에서 특정 메소스 관련 환경 변수 설정 2 유효한 메소스 클러스터 URL을 SparkContext로 전달

클러스터 모드 16에서 스파크 드라이버는 클러스터의 자체 호스트에서 실행되며 사용자는 메 소스 웹 UI에서 작업 결과를 볼 수 있다. 클러스터 모드에서는 올바른 메소스 마스터 URL 로 sbin/start-mesos-dispatch.sh 스크립트를 사용해 MesosClusterDispatcher를 시작 해야 한다. 이전처럼 spark-submit.sh 스크립트를 사용할 수도 있지만 다음 예제와 같이 MesosClusterDispatcher의 마스터 URL을 포함시켜야 한다.17

./bin/spark-submit \ --class io.skymind.spark.mesos.MyTestMesosJob \ --master mesos://210.181.122.139:7077 \ --deploy-mode cluster \ --supervise \ --executor-memory 20G \ --total-executor-cores 100 \ /tmp/mySparkJob.jar \ 1000

NOTE_ 메소스 모드로 스파크를 사용하는 법을 더 자세히 배우려면 아파치 스파크 웹사이트에서 ‘Running

Spark on Mesos’ 페이지 17 를 확인하라. 이 페이지에는 메소스 잡을 구성할 때 참고해야 할 주요 구성 옵션 목록이 전부 나열되어 있다.

스파크와 메소스를 기존 하둡 클러스터와 함께 동일한 장비에서 별도의 서비스로 실행할 수도 있다. 이 경우 메소스의 스파크 작업은 HDFS 내 주소에 대한 완전한 URL을 사용해 HDFS 데 이터에 액세스할 수 있다. 15 https://spark.apache.org/docs/latest/running-on-mesos.html#client-mode 16 https://spark.apache.org/docs/latest/running-on-mesos.html#cluster-mode 17 https://spark.apache.org/docs/latest/running-on-mesos.html

9장 스파크에서 딥러닝과 DL4J 사용하기 417


9.2.2 얀에서 스파크 실행하기 얀은 맵리듀스와 함께 범용 애플리케이션이 일급 객체로 실행되도록 허용하는 하둡 API다. 현 재 스파크 얀 구현은 두 가지 모드를 지원한다. 얀 클라이언트

얀 클러스터

얀 애플리케이션은 애플리케이션 마스터(ApplicationMaster )와 노드 매니저(NodeManager ) 개념을 포괄한다.

얀, 애플리케이션 마스터, 노드 매니저 애플리케이션 마스터는 하둡 클러스터에서 리소스와 특정 작업의 실행을 추적한다. 노드 매니저는 태스크가 실행되는 얀 컨테이너를 할당한다. 이 절의 목적은 분산 시스템 용어를 하나하나 소개하 는 것이 아니라 하둡 클러스터에서 모든 일이 어떻게 진행되는지 개략적으로 설명하는 것이다. 스파크에서는 얀 컨테이너에서 실행 중인 스파크 익스큐터와 스파크 애플리케이션 마스터에서 조 정된 스파크 작업을 볼 수 있다. 스파크 작업을 어떻게, 어디서, 언제 실행하는지 더 잘 이해하려 면 이러한 프로세스를 알 필요가 있다.

각 스파크 익스큐터는 얀 컨테이너 18로 실행된다. 스파크는 동일한 컨테이너에서 여러 태스크 를 진행해 빠르게 작업을 수행한다. 각 모드를 더 자세히 살펴보자. 얀 클라이언트

이 모드에서는 스파크 드라이버가 작업을 제출한 장비에서 실행된다. 클러스터에 연결된 개발자의 로컬 노트 북이 대부분일 것이다. 스파크 드라이버는 하둡 클러스터에서 스파크 애플리케이션 마스터와 통신하고 얀 컨테이너에서 실행되는 스 파크 익스큐터에서 태스크로 실행될 명령을 실행한다. 얀 클러스터

스파크 드라이버 프로세스는 얀 기반 하둡 클러스터(HDP19 , CDH20 )의 애플리케이션 마스터에서 원격으 18 리눅스 컨테이너 개념과 혼동하지 말 것. 다른 개념이다. 19 http://bit.ly/2tQmuuh 및 ‘아파치 나이파이(NiFi )에서 원격으로 스파크 잡 실행하는 법’(http://bit.ly/2tPJTME ) 참고 20 http://bit.ly/2uS6CV4

418 자바를 활용한 딥러닝


로 실행된다. 얀 애플리케이션 마스터는 얀이 잡을 조정하도록 입력을 제공하고 스파크 드라이버 프로세스도 실행한다. 이 방식으로 스파크 잡을 실행하면 사용자가 클라이언트 또는 터미널 세션을 종료해도 작업을 완료 할 수 있다.

스파크 실행 노드 비교하기 [표 9-1]은 얀에서 다양한 모드로 스파크를 실행했을 때 어떤 효과가 있는지 간략하게 요약한 것이다. 이 표의 원본은 클라우데라 기술 블로그 21에서 샌디 라이자 Sandy Ryza 가 작성했다. 표 9-1 얀 모드별 스파크 이해하기 얀 클러스터 모드

얀 클라이언트 모드

스파크 독립 모드

드라이버는 어디서 실행되는가?

애플리케이션 마스터

클라이언트

클라이언트

리소스 요청은 누가 하는가?

애플리케이션 마스터

애플리케이션 마스터

클라이언트

익스큐터 프로세스는 누가 실행하는가?

얀 노드 매니저

얀 노드 매니저

스파크 워커

유지되는 서비스

얀 리소스 매니저와 노드 매니저

얀 리소스 매니저와 노드 매니저

스파크 마스터 및 워커

스파크 셸로 실행할 수 있는가?

아니오

NOTE_ 어떤 얀 모드로 스파크를 사용해야 할까?

얀에서 스파크 작업을 대화식으로 디버깅할 때는 얀 클라이언트 모드를 사용한다. 장기간 또는 상용으로 스 케줄링된 스파크 잡을 수행할 때는 얀 클러스터 모드를 사용한다.

왜 얀 또는 메소스에서 스파크를 실행하는가? 하둡의 얀 프레임워크는 맵리듀스 외에도 애플리케이션이 하둡의 실행 환경을 이용할 수 있도록 한다. 얀에서 스파크를 실행하면 다음을 수행할 수 있다. 서 로 다른 애플리케이션과 프레임워크 간에 클러스터 리소스 풀 하나를 구성하고 동적으로 공유할 수 있다.

얀 스케줄러 기능을 활용해 애플리케이션 간의 동시성을 향상시킨다.

단 일 스파크 애플리케이션에 대해 클러스터에서 주어진 시간에 사용되는 익스큐터 수를 동적으로 할당하고 제어

할 수 있다.

커 버로스를 지원한다.22

21 http://bit.ly/2tZYx4r 22 메소스는 커버로스는 지원하지 않지만 대부분의 인증 시스템을 지원한다.

9장 스파크에서 딥러닝과 DL4J 사용하기 419


여러 애플리케이션 간에 클러스터를 동적으로 공유할 수 있다는 것은 엔터프라이즈 상용 시스템 에서는 중요한 특성이다. 즉, 같은 클러스터에서 임팔라 쿼리, 맵리듀스 작업 및 스파크 애플리 케이션을 동시에 실행할 수 있으며 각 애플리케이션에서 사용하는 리소스를 관리하는 합리적인 방법을 제공한다. 얀이나 메소스 스케줄러를 사용하면 클러스터에서 임시 쿼리를 동시에 실행하 면서 스케줄링된 상용 잡을 실행하고 상용 잡에 필요한 SLA Service Level Agreement (서비스 수준 협 약)를 완료하는 데 충분한 리소스가 할당되게 할 수 있다. 얀과 메소스가 둘 다 예측 가능하고 관 리 가능한 방식으로 리소스를 관리해 여러 프레임워크를 동시에 관리할 수 있기 때문이다. 클러스터 하나에 여러 종류의 작업부하가 걸리는 다중 점유(멀티테넌트) 환경에서 얀과 메소스 는 데브옵스 DevOps 에 없어서는 안 될 존재다.

9.2.3 스파크 튜닝 가이드 고수준에서 스파크 잡을 조정할 때는 주로 CPU와 메모리 두 가지를 조정한다. 익스큐터 수, 익스큐터당 코어 수, 익스큐터당 메모리 할당량을 설정할 수 있다. NOTE_ 메소스와 GPU

메소스에는 GPU를 관리할 수 있는 옵션이 있지만, 얀에는 아직 GPU 관련 옵션이 없다.

익스큐터 수 설정하기 명령줄 플래그 또는 구성 파일 속성을 사용해 애플리케이션의 익스큐터 수를 설정할 수 있다. 명령줄 플래그는 다음과 같이 설정한다. --num-executor

구성 파일 속성은 다음 속성 키를 사용해 설정한다. spark.executor.instances

spark-defaults.conf 파일, 추가 스파크 구성 파일 또는 API의 SparkConf 객체에서 이 작업 을 수행한다.

420 자바를 활용한 딥러닝


APPENDIX

A

인공지능이란?

쿠퍼 : 이봐 타스, 넌 얼마나 솔직하지? 타스 : 90%입니다. 쿠퍼 : 90%? 타스 : 감정을 가진 존재에게 절대 솔직하다는 것은 가장 외교적인 방법도 아니고 안전한 커뮤니케이션 형태도 아니기 때문입니다. 쿠퍼 : 좋아, 90%로 하자고. _영화 <인터스텔라>의 한 장면

인공지능은 철학만큼이나 오래된 학문이다. 오랜 시간 발전되어 왔지만 아직 인류에 대한 실존 적 의미와 함께 사회적으로 자리 잡으려고 여전히 노력하고 있다. 인공지능의 시작에 관한 가 장 눈에 띄는 글은 파멜라 맥코덕의 ‘신을 따라 하기 위한 고대의 소망’이다.1 맥코덕은 인공지능에 대해 매우 높은 수준의 글을 썼지만 오늘날 대부분의 마케팅에서는 비즈 니스 측면으로 겨우 단순한 기능만 홍보한다. 딥러닝 또한 인공지능에 대해 이야기할 때 자주 언급되면서 이 주제에 관해 제대로 이야기하기가 더 어려워졌다. 부록 A는 실무자가 딥러닝이 어떻게 도움이 될지 그리고 AI 환경을 어떻게 도입할지에 대해 고객, 임원, 관리자와 의논할 때 도움을 준다. 그러므로 AI 분야의 역사에 대한 이야기와 고객, 업계 동료와 토론한 내용을 함께 담았다. 딥러닝 환경을 제대로 갖추는 방법을 제공하고 프로젝 1 『Machines Who Think (2nd ed )』(McCorduck , 2004 )

부록 A 인공지능이란?

461


트의 이해당사자와 실질적인 기대치에 대해 이야기함으로써 딥러닝이 더 효과적으로 도움이 되 도록 할 것이다. 간단히 말해 AI에 대해 매우 과대평가되어 있는 부분을 올바르게 잡을 것이다. 그리고 연구자와 실무자에게 재미를 주고 항상 꿈꾸지만 아직까지 실현하지 못한 주제에 대해 상상력을 자극하는 기회를 제공할 것이다. 몇 가지 기본 정의와 AI에 대한 짧은 이야기를 통해 앞으로 어떤 방향으로 나아갈 수 있을지 알아보자. 또한 AI에서 발생할 수 있는 함정을 피하고 정 확한 목표와 기대수준을 설정해서 더 성공적으로 딥러닝 프로젝트를 수행하는 방법을 찾아보자.

A.1 지금까지의 이야기 이 책의 주제인 딥러닝은 미디어와 마케팅 분야에서 항상 인공지능이라는 단어와 함께 한다. 인 공지능의 정의는 시시때때로 바뀌어서 다른 실무자나 이해당사자와 관련 대화를 나누기도 매우 어렵다. 특히 요즘 마케팅 부서는 과대포장과 과대광고를 하고 있다. 최근 많은 관심을 받고 있 는 다음 주제를 살펴보자. 스마트 그리드

클라우드

빅데이터

이러한 영역이나 딥러닝 분야에서 일할 때 실무자들은 마케팅을 통해 과대포장된 내용 중에서 무엇이 진짜인지 잘 설명해야 한다. 그것은 해당 주제의 역사에 대한 이해와 정확한 정의를 알 고 있는 것에서 시작된다. 딥러닝이라고 생각하는 것이 무엇인지 먼저 확인하고 AI의 정의를 이야기해보자.

A.1.1 딥러닝의 정의 1장과 3장에서 딥러닝을 다음과 같은 성질을 가지는 신경망으로 정의했다. 과거의 신경망보다 더 많은 뉴런을 가짐

계층 간 연결 방법이 더 복잡해짐

학습에 사용할 수 있는 연산 능력이 폭발적으로 증가함

자동 특징 학습

462 자바를 활용한 딥러닝


이러한 네트워크는 회귀와 분류 같은 다른 머신러닝 기법처럼 모델링 기능을 수행하며 특히 다 음과 같은 영역에서 뛰어난 성능을 보인다. 생성 모델링(예를 들면 예술작품이나 텍스트 생성)

음성 인식 기술

이미지 인식 기술

딥러닝이 떠오르게 된 또 다른 중요한 이유는 직접 사람이 작업할 때와 달리 영역에 구애받지 않고 데이터로부터 특징을 자동으로 학습할 수 있다는 점이다. 이러한 딥러닝의 힘은 많은 새 로운 기술적 애플리케이션을 주도했고 기술 분야를 넘어서서 다양한 분야 사람들의 상상력을 자극했다. 하지만 사람의 운영과 조작 없이 단지 딥러닝만으로는 데이터에서 가장 중요한 내용 이 무엇인지 이해하는 것 같은 수준의 기능을 수행할 수는 없다.

A.1.2 인공지능의 정의 인공지능의 역사는 수많은 전설과 이야기 그리고 최신 기술을 지나치게 과대포장하는 마케팅 부서로 가득 차 있다. 인공지능에 대해 정의하려면 먼저 지능 연구의 역사와 근대의 논증 그리 고 어떻게 진화해왔는지 약간의 배경을 알 필요가 있다. 이것을 출발선으로 지난 60여 년 동안 어떻게 시작되고 발전했는지 알아보자.

지능 연구 지능 연구는 공식적으로는 1956년 다트머스 콘퍼런스 Dartmouth Conference 2에서 시작되었지만 사 실 2000년 넘게 연구된 분야다. 지적인 존재에 대한 이해와 다음과 같은 주제에 대한 연구가 기본이 된다. 보기

학습

기억

추론

2 인공지능이라는 단어를 가장 처음 사용한 학술회의

부록 A 인공지능이란?

463


이러한 주제는 지능이 무엇이고 어떠한 기능을 하는 것인지 정의하는 구성요소다. 이 내용을 알게 되면 인공지능 분야에 대해 이해할 수 있을 것이다. 다음 목록은 지금까지 이루어진 인공 지능 연구 중 일부다. 철학(기원전 400년)

철학자들은 지성을 ‘지식을 뇌 속에 어떠한 형태로 암호화한 기계장치’라고 이야기했다. 수학

수학자들은 알고리즘을 추론하는 기본적인 방식과 논리적인 구문을 통해 작업을 하는 핵심 아이디어를 개발 했다. 심리학

심리학은 동물과 사람이 정보를 처리할 수 있는 두뇌를 가지고 있다는 생각에서 시작된다. 컴퓨터 과학

전문가들은 하드웨어, 데이터 구조, 알고리즘을 통해 뇌의 기본 구성요소를 역설계하는 데 도움을 주었다.

오늘날 인공지능 기술에 대한 연구와 애플리케이션은 이러한 원리를 기반으로 한다. 전형적으 로 인공지능에 대한 연구는 가상의 지능 시스템이 생각하고 행동하는 것에 중점을 둔다. 머신 러닝 애플리케이션, 기본적인 지식 시스템, 체스나 바둑 같은 게임 프로그램 영역에 주로 활용 된다. 하지만 인공지능 연구의 구현에는 한계가 존재한다. 의식과 같은 고차원적인 뇌 기능을 잘 표 현할 수 있는 모델은 아직까지 존재하지 않는다. 과학적으로도 우리 뇌에서 의식이 어디에 있 는지 알지 못한다. 또한 의식이 뇌에 존재하는 실제 기능인지에 대한 의문으로 과학자들과 철 학자들은 여전히 논쟁 중이다.3 NOTE_ 더 알고 싶다면

인공지능 분야 최고의 책인 스튜어트 러셀과 피터 노빅의 『Artificial Intelligence: A Modern Approach』3 을 추천한다. 인공지능의 역사와 깊이에 대해 너무 완벽한 정보를 담고 있다.

인지 부조화와 현대적 정의 사회의 핵심 정의와 연관되는 인공지능과 같은 분야에 대해 이야기할 때 자연히 실제 세상과는

3 http://aima.cs.berkeley.edu/ 옮긴이_ 『인공지능 : 현대적 접근방식』(제이펍, 2016 )

464 자바를 활용한 딥러닝


APPENDIX

B

RL4J 및 강화학습

루벤 피스젤 1

B.1 사전준비 부록 B에서는 강화학습 소개로 시작해 픽셀 입력을 처리하는 DQN Deep Q Network 의 세부 설명 을 진행하고 RL4J 예제로 마무리한다. 먼저 강화학습의 핵심 개념을 살펴보자. 강화학습은 머신러닝 중에서도 흥미진진한 영역이다. 강화학습이란 기본적으로 주어진 환경에 서 효율적인 전략을 학습하는 것이다. 사실 강화학습은 고전적 조건 형성 Pavlovian conditioning 과 매우 유사하다. 고전적 조건 형성이란 주어진 행동에 대한 보상을 할당하면 시간이 지남에 따 라 더 많은 보상을 받을 수 있는 행동을 재연하는 것을 에이전트가 배우는 것을 말한다.

B.1.1 마르코프 결정 과정 공식적으로 ‘환경’은 마르코프 결정 과정 Markov Decision Process, MDP 에 의해 정의된다. 이름만 보면 난해하기 짝이 없지만 사실 아래 나열한 다섯 가지 요소의 조합일 뿐이다. ● ●

상태(state ) 집합 SS : 체스를 예로 들면 보드의 구성 상태 가능한 행동(action ) 집합 AA : 체스에서 가능한 모든 구성 상태별 모든 이동 가능 경로(예를 들면 e4 - e5 이동)

현재 상태와 행동이 주어졌다는 가정하에 다음 상태의 조건부 분포 P (s′ | s, a )P (s′ |, a ) : 체스와 같은 결정

1 https://rubenfiszel.github.io/

부록 B RL4J 및 강화학습

473


론적 환경에서는 확률이 1인 상태는 한 개뿐이며 다른 환경은 모두 확률이 0이다. 하지만 동전던지기와 같은 확률적 혹은 무작위성 환경에서는 분포가 체스처럼 간단하진 않다. s 상태에서 s′ 상태로 전환했을 때의 보상함수 R ( s, s′) : 예를 들어 체스에서 +1은 승리로 이어지는 최종 이

동을 의미하고 -1은 패배를 가져오는 최종 이동을 의미한다. 할인계수(discount factor ) γγ . 미래 보상 대비 현재 보상을 선호하는 정도를 의미한다(금융에서 자주 사용

하는 개념 2 ).

NOTE_ 행동 집합 A s 를 사용하는 경우

대부분의 경우 전체 집합 A보다 특정 상태가 주어졌을 때 사용 가능한 행동 집합 A s 를 더 편리하게 사용할 수 있다.

A s : 전체 집합 A 중 P ( s′ | s, a ) > 0 을 만족하는 구성요소 a

마르코프 속성(그림 B-1 )은 메모리 기능이 없다. 과거 기록(이전에 접근한 상태)은 다음 전 환 단계 및 보상에 영향을 미치지 않는다. 오로지 현재 상태만 영향을 미친다. 그림 B-1 MDP의 개요

B.1.2 용어집 진행하기에 앞서 용어 및 단어를 정의하자. 2 https://en.wikipedia.org/wiki/Discounted_utility

474 자바를 활용한 딥러닝


최종/터미널 상태

다음 행동이 불가능한 상태를 최종/터미널 상태라 한다. 에피소드

에피소드란 시작 상태에서부터 완료 상태까지 진행한 완성된 작업이다.

s0 , a0 , r0 , s1 , a1 , r1 ,  , sn 누적 보상

누적 보상은 에피소드 전체에 누적된 보상을 할인한 합이다.

R = ∑ t = 0 γ t rt +1 n

정책

정책은 에이전트의 전략이며 각 상태에서 행동을 결정한다. π 로 표현한다. 최적화 정책

최적화 정책이란 이론적 기대치를 최대화한 누적 보상이다. 이 정책은 충분한 에피소드가 주어졌다고 가정했을 때 큰 수의 법칙과 기대치의 정의에 의해 가장 높은 평균 누적 보상을 가진다. 이 정책은 다루기 힘들 수 있다.

강화학습의 목적은 최적화 정책에 최대한 가깝게 정책을 학습하도록 에이전트를 학습시키는 것이다.

B.2 다른 설정 천리길도 한걸음부터(큰 일을 할 수 있는 사람은 작은 일도 할 수 있다)

B.2.1 모델 프리 조건부 분포와 보상함수는 환경 모델을 구성한다. 주사위 게임의 모델을 생각해보자. 주사위 를 던질 경우 어떤 값이 나올지에 대한 기댓값은 주사위를 던졌을 때 나올 숫자의 분포에 의해 결정된다. 이것을 이용해서 주사위를 던지는 경우에 대한 보상도 미리 예측할 수 있다. TD-

gammon 알고리즘 3도 이러한 사실을 사용해 V 함수를 학습한다(B.3 절 ‘Q 러닝’ 참조).

3 http://people.inf.elte.hu/lorincz/Files/RL_2006/SuttonBook.pdf

부록 B RL4J 및 강화학습

475


일부 강화학습 알고리즘은 모델이 없어도 실행된다. 하지만 최상의 전략을 배우려면 훈련으로 추가적인 모델을 학습할 필요가 있다. 이것을 모델 프리 강화학습 model-free reinforcement learning 이 라 한다. 대다수의 복잡한 현실 속 문제가 이 범주에 속해 있어서 모델 프리 알고리즘은 굉장히 중요하다. 모델 프리는 간단히 말해 추가적인 제약이다. 이는 모델 기반 강화학습을 포함하는 상위 개념이기 때문에 훨씬 더 강력하다.

B.2.2 관측 설정 상태에 접근하는 대신 상태 일부만 관측할 수도 있다. 은닉 마르코프 체인 Hidden Markov Chain 도 이 같은 발상을 기반으로 한다. 이것이 부분 관측 설정과 전체 관측 설정의 차이다. 예를 들어 사람의 시야는 우주 전체(우주에 있는 모든 입자의 위치 및 에너지) 중 아주 작은 부분만 관측 할 수 있다. 다행스럽게도 부분 관측 설정은 관측한 기록을 바탕으로 전체 관측 설정과 같은 내 용을 유추할 수 있다(상태는 이전 상태들의 누적이다). 그럼에도 일반적으로 기록 전체를 축적하지는 않는다. 마지막 h 관측치만 쌓거나 순환 신경망 을 사용해 무엇을 메모리에 저장하고 지울지 결정할 수 있다(LSTM의 작동 원리). 이런 기록(잘린 부분 포함)을 ‘상태’라고 하며, St 로 표기하기도 한다.

B.2.3 싱글 플레이와 대전 게임 싱글 플레이 게임은 자연스럽게 마르코프 결정 과정을 따라 학습한다. 상태는 플레이어가 조작 가능한 순간을 나타낸다. 이러한 상태의 관측은 게임의 여러 프레임을 축적한 모든 정보를 바 탕으로 이뤄진다. 여기서 행동이란 플레이어가 실행 가능한 모든 명령이다(둠 게임을 예로 들 면 상, 하, 좌, 우, 발사 등). 강화학습은 에이전트 간의 플레이를 대전 게임에 적용할 수 있다. 이때 에이전트의 상대는 자 기 자신이다. 이 경우 내시 균형 Nash equilibrium 4에 따라 에이전트가 최적의 전략을 찾아낸다. 이 는 항상 상대방이 완벽한 플레이어인 것처럼 게임에 임하는 것을 전제로 한다. 체스를 예로 들 면 특정 보드의 구성이 주어졌을 때 체스 마스터와 경기 시 좋은 움직임을 보였다면 초보자를 4 https://en.wikipedia.org/wiki/Nash_equilibrium

476 자바를 활용한 딥러닝


APPENDIX

C

반드시 알아야 하는 숫자들

다음 표에 있는 ‘제프 딘의 12가지 숫자’로 잘 알려진 컴퓨터 구성요소의 대기시간을 알아두기 바란다. 표 C-1 제프 딘의 12가지 숫자 컴퓨터 구성요소

대기시간(단위 : 나노초)

L1 캐시 참조

0.5

분기 예측

5

L2 캐시 참조

7

뮤텍스 스레드 잠금/해제

100

메인 메모리 참조

100

구글 지피 ( Zippy ) 압축 알고리즘으로 1KB 압축하기

10,000

1Gbps 네트워크에서 2KB 데이터 보내기

20,000

메모리에서 순차적으로 1MB 읽기

250,000

같은 데이터센터에서 왕복하기

500,000

디스크 탐색

10,000,000

네트워크에서 순차적으로 1MB 데이터 읽기

10,000,000

디스크에서 순차적으로 1MB 데이터 읽기

30,000,000

캘리포니아 -> 네덜란드 -> 캘리포니아로 패킷 보내기

150,000,000

부록 C 반드시 알아야 하는 숫자들

499



APPENDIX

D

신경망과 역전파 : 수학적 접근

알렉스 블랙

D.1 소개 부록 D에서는 신경망 학습의 기초가 되는 계산 방식인 역전파 알고리즘에 대해 살펴본다. 본 격적으로 살펴보기 전에 신경망은 어떤 방식으로 학습시키는지 되짚어보자. 신경망 학습의 핵심은 신경망이 정확하게 예측할 수 있도록 학습 데이터를 기반으로 학습을 통 해 신경망의 파라미터를 조정하는 것이다. 이 과정을 정확한 예측과 파라미터 조정 두 부분으 로 나눌 수 있다. 신경망에 몇 가지 입력 데이터가 주어지고 입력 데이터의 클래스를 예측하는 분류 작업을 예로 들어보자. 정확도, F1 점수, 음의 로그 가능도 등 분류에 대한 평가를 정량화하는 방법은 다양 하다. 모두 유효한 방법이지만 일부는 다른 방법보다 최적화하기 훨씬 어렵다. 예를 들어 신경 망의 특정 파라미터를 조금 변경하는 정도로는 신경망의 정확성이 변하지 않을 수 있다. 따라 서 경사도를 사용해 직접 정확도를 최적화하는 일은 불가능하다(정확도는 미분 가능하지 않기 때문). 반대로 음의 로그 가능도 같은 측정값은 파라미터값을 약간만 변경해도 증가하거나 감소할 것 이다. 클래스 미분 가능 손실함수(음의 로그 가능도 등)만 사용해 신경망 예측 품질을 정량화 하면 신경망을 학습하는 간단하고 우아한 알고리즘에 도달하게 된다. 역전파 알고리즘의 핵심 아이디어는 매우 간단하다.

부록 D 신경망과 역전파 : 수학적 접근

501


미분 가능 손실함수를 기반으로 신경망의 현재 예측에 대해 좋고 나쁨을 정량화한다.

손실함수 및 신경망 구조에 다변수미적분을 적용해 신경망의 각 파라미터에 대한 경사도를 계산한다.

계산된 경사도를 사용해 손실함수를 최소화하는 방향으로 신경망 파라미터를 반복적으로 조정한다.

아이디어를 알고리즘 형태로 구체화하면 확률적 경사 하강법 알고리즘은 다음과 같다. 입력 : 신경망 파라미터 w, 손실함수 L, 학습 데이터 D, 학습률 α > 0 다음 종료 조건을 만족할 때까지 반복

(features, labels) ← D.임의의_미니배치_가져오기() out ← 신경망_출력_가져오기(w, features) ∂L ← 파라미터_경사도_계산(w, L, out, labels) ∂w ∂L w ← w −α ∂w 반복 끝

주목할 부분은 편미분을 계산하는

∂L ∂w

이다. 편미분에 익숙하지 않다면 이렇게 생각해보자. 편

미분은 다른 모든 값을 고정하고 특정 값(가중치 벡터 w 의 각 파라미터 wi )만 변경했을 때 관 심 대상(손실함수 값 L )이 변하는 정도를 표현한다. NOTE_ 스텝 크기 ∂L ∂wi

는 wi 에 대한 함수이기도 하다. 때문에 작은 스텝만 사용해야 하고(예를 들면 학습률 α 를 작은 값만 사

용), 각 반복에서 파라미터를 변경한 후 경사도를 재계산해야 한다. ∂L ∂wi

가 양수인 경우 wi 를 소량 증가시키면 입력 데이터의 손실함수 값 L이 증가한다. wi 를 줄

이면 손실함수 값 L이 감소한다. 손실함수를 정의하고 손실함수와 관련된 모든 파라미터의 미분을 계산해 손실함수 값을 최소 화하는 방향으로 스텝을 작게 한다. 이것이 역전파 알고리즘이다. 역전파 알고리즘은 모든 딥 러닝 학습의 기반이 되는 간단하면서도 강력한 방법이다.

D.2 다층 퍼셉트론에서의 역전파 이론은 이제 충분하니 계산을 시작해보자. 완전 연결 계층 또는 DL4J의 DenseLayer 같은 단

502 자바를 활용한 딥러닝


순한 다층 퍼셉트론에서 단일 입력 데이터에 대한 제곱오차손실함수의 합(DL4J의 L2 손실함 수 값)은 아래와 같이 구할 수 있다.

L( y, yˆ ) = ∑i =1 ( yi − yˆ i ) N

2

N 은 출력 개수, yi 는 i 번째 레이블, yˆ i = output (w, f ) 는 특징 벡터 f 와 현재 파라미터 w 가 주어졌을 때 yi 에 대한 신경망의 예측값이다. [그림 D-1]은 단층 신경망을 보여준다. 이 부록의 나머지 부분에서 이 그림을 계속 참조할 것 이다. 그림 D-1 단층 신경망

현재 계층에 대한 입력 벡터를 벡터 a (길이 4 )라 하고, 각 요소가 σ 에 의해 비선형성(tanh 또 는 ReLU 같은 활성화함수)을 갖게 되면 신경망의 순방향 방정식은 다음과 같다.

zi = bi + ∑ j =1 w j, i ai 4

yˆ i = σ ( zi )

부록 D 신경망과 역전파 : 수학적 접근

503


여기서 bi는 편향이고 wj,i는 입력 j 와 뉴런 i 를 연결하는 가중치다. 손실함수 값이 주어지면 신경망 출력 ŷi 에 대한 첫 번째 편미분은 다음과 같이 계산할 수 있다.

∂L ∂ = ∂yˆ j ∂yˆ j =

(∑

N

i =1

( yi − yˆ i )2 )

∂ ( y j − yˆ j )2 ∂yˆ j

= −2( y j − yˆ j ) 신경망 구조를 역순으로 따라가면 다음에는

∂L ∂zi

∂L ∂yˆ j

을 계산할 수 있다. 이 값은 활성화함수

σ ( z) 의 수학적 형태에 따라 달라진다. 여기서는 시그모이드, tanh, ReLU 같은 간단한 활성화 함수를 사용해 계산을 간소화하자(이 경우 미분은 각 요소별 함수가 된다. 소프트맥스 같은 함 수는 이러한 방법을 사용할 수 없다).

∂L ∂L ∂yˆ i = ∂zi ∂yˆ i ∂zi = σ ′( zi )

∂L ∂yˆ i

예를 들어 시그모이드 활성화함수는 σσ(z(z))== 있다.

11 이므로 11++ee− z− z

다음으로 연쇄 법칙을 적용해 이전에 계산된 편미분 3 ∂L ∂L ∂z k = ∑k =1 ∂ wj, i ∂z k ∂ w j, k

=

∂L ∂zi ∂zi ∂ wj, i

=

4 ∂L ∂ bi + ∑k =1 wk, i ai ∂zi ∂ wj, i

= ai

(

∂L ∂zi

504 자바를 활용한 딥러닝

)

∂L ∂zi

σ ′( z ) = σ ( z )(1 − σ ( z )) 를 구할 수

로 가중치 wj,i 에 대한 편미분을 계산한다.


APPENDIX

E

ND4J API 활용하기

ND4J는 자바 가상 머신을 위한 과학적 컴퓨팅 라이브러리다. 상용 환경에서 빠르게 동작하도 록 디자인되었고 주요 기능은 다음과 같다. ●

다양한 n 차원 배열 객체

GPU를 포함한 멀티 플랫폼 지원

선형대수와 신호처리함수

NOTE_ ND4S는 ND4J의 스칼라 버전이다.

사용성의 차이로 자바, 스칼라, 클로저 개발자들은 가장 강력한 데이터 분석 도구인 넘파이 NumPy

나 매트랩 Matlab 을 사용하지 못하고 있다. 브리즈 Breeze 같은 라이브러리는 딥러닝을 비롯

한 다른 작업에 필수적인 n 차원 배열이나 텐서를 지원하지 않는다. ND4J와 ND4S는 계산 집 약적인 시뮬레이션을 필요로 하는 기후 모델링 같은 작업을 위해 국립 연구소에서 사용되기도 한다.

ND4J는 분산 처리가 되며 GPU 사용도 가능한 오픈소스 라이브러리다. 특히 파이썬 커뮤니티 의 직관적이고 과학적인 컴퓨팅 도구를 그대로 JVM으로 옮겨왔다. 구조적으로는 SLF4J와 유 사하다. ND4J를 이용하면 자바와 스칼라 생태계의 알고리즘, 인터페이스, 다른 라이브러리들 을 실무 환경으로 쉽게 포팅할 수 있다.

부록 E ND4J API 활용하기

507


NOTE_ 완벽한 ND4J 온라인 사용자 가이드

ND4J는 부록에서 나열한 것보다 더 많은 작업을 지원한다. 완벽한 ND4J 사용자 가이드를 보려면 http:// nd4j.org/userguide 웹사이트를 방문하라.

NOTE_ 완벽한 ND4J API 자바독

ND4J API 전체를 확인하려면 http://nd4j.org/doc/에서 자바독을 보면 된다.

E.1 디자인과 기본 사용법 ND4J는 여러 환경에서 실행되도록 설계되었으며 최신 데이터 시스템과 통합이 가능하다. C UDA를 통한 GPU 지원

하둡 및 스파크와의 통합

N umPy의 의미론을 모방하도록 디자인된 API

대부분의 ND4J 작업은 숫자 배열 조작에 초점을 맞추고 있으며 핵심 데이터 구조를 NDArray 라고 한다.

E.1.1 NDArray 이해하기 NDArray는 본질적으로 n 차원 배열이다. 차원을 몇 개 가지며 숫자로 이루어진 사각형 배열 로, 다음과 같은 특징을 통해 정량화할 수 있다. 랭크(Rank )

모양(Shape )

길이(Length )

스트라이드(Stride )

데이터 타입

508 자바를 활용한 딥러닝


NDArray와 관련된 이들 속성에 대해 알아보자. NOTE_ NDArray와 INDArray

NDArray라는 용어는 일반적인 n 차원 배열을 나타내기 위해 사용한다. INDArray라는 용어는 특히 ND4J 가 정의하는 자바 인터페이스를 나타낸다. 실제로 이 두 용어는 같은 의미로 사용할 수도 있다.

랭크

NDArray의 랭크는 차원 수다. 2차원 NDArray의 랭크는 2이고, 3차원 배열의 랭크는 3이다. 어떤 랭크값 을 가지는 NDArray도 생성할 수 있다. 모양

NDArray의 모양은 각 차원의 크기로 결정된다. 행 3개와 열 5개를 가지는 2차원 배열이라면 NDArray의 모양은 [3,5]가 된다. 길이

NDArray의 길이는 배열의 전체 원소 수로 정해진다. 길이는 모양을 구성하는 값들의 곱과 항상 같다. 스트라이드

스트라이드는 (기본적인 데이터 버퍼에서) 각 차원의 연속된 원소 사이의 간격으로 정의된다. 스트라이드는 차원별로 정의되므로 랭크 N 인 NDArray는 각 차원마다 하나씩, 스트라이드값 N 개를 가진다. 대부분의 경 우 스트라이드에 대해 알 필요가 없으며 ND4J가 내부적으로 동작하는 방식으로 인식하고 있으면 된다. 다음 절에서 스트라이드에 대한 예제를 살펴볼 것이다. 데이터 타입

데이터 타입은 NDArray에서 지원하는 데이터의 타입을 나타낸다(예를 들면 float이나 double ). ND4J에 서 전역적으로 선언하므로 모든 NDArray는 같은 데이터 타입을 가져야 한다. 데이터 타입에 대한 설정은 이 장 뒷부분에서 추가로 논의할 것이다.

NOTE_ NDArray의 인덱싱과 차수에 대해 알아야 할 사항

행의 차원은 0이고 열의 차원은 1이다. 즉, INDArray.size (0 )은 행 수고 INDArray.size (1 )은 열 수 다. 대부분의 프로그래밍 언어의 배열과 마찬가지로 인덱스는 0부터 시작한다. 그래서 행은 다른 차원에 대해

0부터 INDArray.size (0 )-1까지의 인덱스를 가진다.

NDArray와 물리적 메모리 저장 공간 NDArray는 숫자의 단일 플랫 배열(단일 연속 메모리 블록)로 메모리에 저장되므로 float[][] 이나 double[][][]과 같은 일반적인 자바의 다차원 배열과는 많이 다르다.

부록 E ND4J API 활용하기

509


물리적으로 INDArray를 뒷받침하는 데이터는 오프힙 off-heap 으로 저장되어 JVM 외부에 있다. 그래서 성능 증가, 고성능 BLAS 라이브러리와 상호운용성 증대, 고성능 컴퓨팅에서 JVM의 단 점(자바 행렬은 정수 인덱스 때문에 원소 수가 231 - 1 (21억 4천만 개)로 제한됨) 회피 등 수많 은 이점이 있다.

E.1.2 ND4J의 일반적 구문 ND4J에는 세 가지 타입의 연산이 있다. 스칼라

변환

누적

대부분의 연산 operation, op 은 열거형 enum 이나 자동 완성되는 불연속 값들의 리스트를 사용한다. 스칼라, 변환, 누적은 고유한 패턴을 가진다. 각각에 대해 살펴보자. 스칼라

스칼라(scalar )는 입력과 입력에 적용될 스칼라값 등 두 가지 인수를 가진다. 예를 들어 ScalarAdd ( )는 ScalarAdd (INDArray x, Number num )과 같이 입력 INDArray x와 스칼라값 Number num 두 가지 인 수를 취한다. 동일한 형식이 모든 스칼라 연산에 적용된다. 변환

변환(transform )은 인수 한 개를 취하여 연산을 하기 때문에 가장 간단하다. 절댓값은 abs (IComplexNDArray ndarray )와 같이 인수 x를 취해서 그 수의 절댓값을 결과로 생성하는 변환이다. 마찬가지로 sigmoid ( )로 시그모이드 변환을 적용하면 x의 시그모이드값을 생성할 수 있다. 누적

마지막으로 GPU에서 축소(reduction )라고 알려져 있는 누적(accumulation )이 있다. 누적을 이용하면 배열과 벡터를 서로 더하고 행별 연산에 요소를 추가하여 배열의 차원을 줄일 수 있다. 예를 들어 다음과 같은 배열에 누적을 적용하면 [1 2 3 4] 다음 벡터를 얻는다. [3 7]

510 자바를 활용한 딥러닝


APPENDIX

F

DataVec 활용하기

알렉스 블랙

DataVec은 머신러닝 데이터를 처리하는 라이브러리다. DataVec은 추출, 변환, 로드(ETL ) 작업이나 머신러닝 파이프라인의 벡터화 구성요소를 다룬다. DataVec의 목표는 원시 데이 터를 머신러닝에서 사용할 수 있는 포맷으로 준비하고 로드하는 작업을 단순화하는 것이다.

DataVec은 단일 머신과 분산 애플리케이션(아파치 스파크와 같은) 모두에서 사용할 수 있는 테이블형 데이터(콤마로 구분되는 CSV 파일 등), 이미지, 시계열 데이터셋 로드 기능을 제공 한다. NOTE_ ND4J 벡터 생성과 DataVec

DataVec은 특징을 다루거나 레이블을 생성하는 일 등을 처리한다. DataVec을 사용하는 것은 단일 머신과 스파크에서 DL4J 워크플로 활용의 좋은 예다.

DataVec은 두 가지 주요 기능을 제공한다. ●

다양한 포맷의 데이터를 로드하는 기능

공통 데이터 변환 연산 수행 기능(데이터 랭글링 또는 데이터 먼징이라 한다).

이 두 가지 기능에 대해 알아보자.

부록 F DataVec 활용하기

523


F.1 머신러닝을 위한 데이터 로딩 머신러닝 데이터는 다양한 형식으로 제공되며 각각에 대한 로드 요구사항과 라이브러리가 다 르다. 머신러닝 실무자들은 데이터를 로드하기 위해 일회용 코드를 작성해야 하는 경우가 너무 많다. 이러한 작업은 시간이 많이 소요되고 오차가 발생하기 쉽다. DataVec은 두 가지 방법으 로 이러한 문제를 해결한다. 먼저 이미지나 CSV 데이터와 같은 일반적인 데이터를 로드하는 기능을 제공한다. 그리고 새로운 데이터 포맷이나 데이터 소스를 추가하도록 간단한 추상화셋 을 제공한다. NOTE_ ETL, 전처리, 벡터화

데이터를 DL4J가 쉽게 읽고 자동으로 벡터화할 수 있는 형식으로 전처리하려면 DataVec과 같은 도구를 사 용하는 것이 좋다. 원시 데이터를 수동으로 벡터화하는 것은 노동 집약적인 작업이므로 가능한 한 피해야 한다.

DataVec이 제공하는 추상화셋은 비교적 간단하다. Writable은 데이터를 표현할 수 있는 인터페이스다. 예를 들어 DoubleWritable을 이용해서

배정밀도 부동소수점수를 표현할 수 있고 텍스트 데이터에 Text 인스턴스를 이용할 수 있다.1 RecordReader 인터페이스는 원시 데이터 포맷을 공통 데이터 포맷으로 변환하는 메커니즘

을 제공한다. 특히 RecordReader는 원시 데이터를 DL4J의 RecordReaderDataSetIterator 클래스가 읽을 수 있는 List<Writable> 형식으로 변환한다. 이 클래스는 데이터를 미니배치 DataSet 객체로 결합하여 처리한다. [그림 F-1]은 이 과정을 보여준다.

1 추가로 IntWritable, LongWritable, FloatWritable, NullWritable이 있다. DataVec은 또한 ND4J를 이용한 숫자형 배 열(이미지와 같은)을 효율적으로 처리할 수 있는 NDArrayWritable 클래스를 제공한다.

524 자바를 활용한 딥러닝


그림 F-1 DataVec 처리 파이프라인 원시 데이터 포맷

DataVec 레코드 리더

데이터 로드

DL4J RecordReaderDataSetterator

학습 준비 완료

마찬가지로 SequenceRecordReader 인터페이스는 시퀀스(시계열) 데이터를 로드하는 메커 니즘을 제공한다. DataVec에서 단일 데이터는 List<Writable>로 나타내고 시퀀스 데이터는 List<List<Writable>>로 나타낸다. 이를 시간단계(의 시퀀스)의 리스트로 생각할 수 있다.

바깥쪽 리스트는 시간단계 리스트고 안쪽 리스트는 각 시간단계의 값 목록이다. 예를 들어 코드 mySequence.get (i ).get (j )는 i 번째 시간단계의 j 번째 값을 반환한다. [그림 F-2]에서 보는

것처럼 시퀀스 레코드 리더를 사용하는 것은 일반 레코드 리더를 사용하는 것과 사실상 같다. 그림 F-2 DataVec 시퀀스 파이프라인 원시 시퀀스 데이터 포맷

DataVec 시퀀스 레코드 리더

시퀀스 데이터 로드

DL4J SequenceRecordReaderDataSetterator

학습 준비 완료

DataVec과 DL4J가 학습 데이터를 처리하는 방식에서 한 가지 중요한 측면은 이터레이터 패턴 을 사용해서 데이터가 필요할 때만 로드한다는 것이다. 즉, 모든 데이터를 한번에 메모리에 로 드(보통 대용량 데이터셋은 불가능함)하는 대신 필요할 때 학습 데이터를 로드(비동기적으로

부록 F DataVec 활용하기

525


필요할 때 사전 패치)할 수 있다. RecordReader, SequenceRecordReader, DataSetIterator 인터페이스는 이러한 목적으로 모두 next ( ), hasNext ( ), reset ( ) 함수를 가진다.

F.2 다층 퍼셉트론에 CSV 데이터 로드 코드 몇 줄로 CSV 데이터를 로드할 수 있다. 또한 이 프로세스는 탭 구분 포맷 같은 다른 구분 자로 분리된 데이터에도 사용할 수 있다. [예제 F-1]은 CSV 데이터 파일을 로드하고 DL4J에서 신경망을 학습하는 DataSetIterator를 생성하는 방법을 보여준다. 예제 F-1 CSV 데이터 로드하기

// 먼저 파일 위치와 몇 가지 속성을 지정한다. File file = new File("/path/to/my/file.csv"); int numLinesToSkip = 0; // 헤더 라인을 건너뛴다(선택사항). String delimiter = ","; // 쉼표로 구분된 파일 // 레코드 리더를 생성하고 초기화한다. RecordReader reader = new CSVRecordReader(numLinesToSkip, delimiter); InputSplit inputSplit = new FileInputSplit(file); reader.initialize(inputSplit); // DataSetIterator를 생성한다. 여기서는 분류 문제로 가정한다. int minibatchSize = 10; // 각 미니배치 데이터 수 int labelIndex = 7; // 레이블을 가지는 열 인덱스 int numClasses = 5; // 클래스 수(레이블 카테고리) DataSetIterator iterator = new RecordReaderDataSetIterator(reader, minibatchSize, labelIndex, numClasses); // DataSetIterator로 신경망 학습하기 myNetwork.fit(iterator);

526 자바를 활용한 딥러닝


APPENDIX

G

DL4J 소스로 작업하기

개발자는 사용자 정의 확장 기능을 작성하거나, DL4J 코어를 수정하거나, 최신 코드베이스로 작업할 수 있다. DL4J 소스를 직접 설치하는 방법에 대해 알아보자. 깃허브는 웹 기반 버전 관리 시스템이며 사실상 대부분의 오픈소스 프로젝트를 위한 호스트다. 버그를 수정하고 코드를 커밋해 ND4J 또는 DL4J 프로젝트에 기여하려면 깃과 깃허브가 필요 하다. NOTE_ 소스 코드로 작업할 필요가 있는가?

단순히 코드베이스를 사용하려는 경우에는 깃허브에서 소스 코드를 다운로드할 필요가 없다.

G.1 깃 설치 확인 깃이 설치되어 작동하는지 확인하려면 명령줄에 다음 명령을 입력하라. git --version

오류 메시지가 반환된다면 깃을 설치해야 한다. 깃허브 계정이 없다면 가입을 권장한다. 무료 며 가입 절차도 간단하다.

부록 G DL4J 소스로 작업하기

535


G.2 주요 DL4J 깃허브 프로젝트 클론하기 ND4J나 DL4J를 클론하려면 다음 명령을 콘솔에 입력하라. git clone https://github.com/deeplearning4j/nd4j git clone https://github.com/deeplearning4j/datavec git clone https://github.com/deeplearning4j/deeplearning4j

DLJ 예제에서는 미리 빌드된 ND4J 또는 DL4J를 사용해 작업할 수 있다. git clone https://github.com/deeplearning4j/dl4j-examples

NOTE_ 예제를 실행하는 데 도움이 더 필요한 경우

깃, 인텔리제이, 메이븐을 사용해 예제를 설치하는 방법은 퀵 스타트 가이드(https://deeplearning4j. org/quickstart )를 참고하라.

G.3 Zip 파일 소스 다운로드하기 ND4J 깃허브 페이지 1에서 Download ZIP 버튼을 클릭해 Zip 파일 소스를 다운로드할 수 있다.

G.4 메이븐을 사용해 소스 코드 빌드하기 깃과 함께 메이븐을 사용해 ND4J, DataVec, DL4J를 빌드할 수 있다. 라이브러리의 최신 버 전을 로컬에 설치하려면 각 프로젝트의 디렉터리로 이동해 명령줄에 다음 명령을 입력하라. mvn clean install -DskipTests=true -Dmaven.javadoc.skip=true

ND4J, DataVec, DL4J를 순서대로 설치하면 버그가 수정된 최신 기능을 사용할 수 있다.2 1 https://github.com/deeplearning4j/nd4j/archive/master.zip 2 옮긴이_ 최신 버전에서는 libnd4j, ND4J, DataVec, DL4J 네 개로 구성된 DL4J 스택을 순서대로 빌드해야 한다. 자세한 방법은 DL4J 사이트(https://deeplearning4j.org/buildinglocally )를 참고하라.

536 자바를 활용한 딥러닝


APPENDIX

H

DL4J 프로젝트 설정

DL4J는 딥러닝을 위한 완벽한 플랫폼을 함께 제공하는 도구 모음이다. 서로 연결할 수 있는 여 러 의존성을 엮어 다양한 기능을 수행해 딥리닝 모델을 지원한다. DL4J는 메이븐을 사용해 프 로젝트 의존성을 관리한다. 여기서는 딥러닝 모델, 도구, 통합을 구축하는 데 사용하는 몇 가지 의존성에 대해 알아본다.

H.1 새로운 DL4J 프로젝트 생성하기 DL4J는 상용 배포에 익숙한 전문 자바 개발자 그리고 인텔리제이와 같은 IDE 및 메이븐과 같 은 자동화된 빌드 도구를 대상으로 하는 오픈소스 프로젝트다. 이미 그러한 도구들을 갖추고 있다면, 여기에서 설명하는 내용이 도움이 될 것이다. ND4J와 벡터화 라이브러리인 DataVec 은 지금부터 설명하는 환경 설정을 따라하다 보면 자동으로 설치된다. 다음은 시스템 구성 요구사항이다. 1 자바 7 또는 그 이상 2 메이븐 3.2.5 또는 그 이상(의존성 관리 및 자동화된 빌드 도구) 3 깃

부록 H DL4J 프로젝트 설정

537


개발 환경을 구축하는 데 다음 프로그램을 선택적으로 설치하면 좀 더 편한 DL4J 프로젝트 환 경을 구축할 수 있다. G PU 전용 CUDA 7

스칼라 2.10.x

윈도우

깃허브

자바부터 설치하면서 차근차근 개발 환경을 구축해보자.

H.1.1 자바 자바는 노드가 수천 개에 달하는 분산 클라우드 기반 시스템에서부터 메모리 용량이 작은 사물 인터넷 장치에 이르기까지 폭넓게 사용되기 때문에 ND4J의 주요 인터페이스 및 네트워킹 언 어로 사용했다. 참고로 자바는 ‘코드를 한 번 작성하면 어디서나 실행되는’ 언어다. 설치된 자바 버전(또는 자바가 있는지 여부)을 확인하려면 명령줄에 다음 명령을 입력한다. java -version

자바 7 이상 버전이 시스템에 설치되어 있지 않다면 자바 홈페이지 1에서 자신의 OS에 맞는 자 바 개발 키트 Java Development Kit, JDK 의 최신 버전을 다운로드하자.

H.1.2 메이븐 이용하기 메이븐은 자동화된 자바 프로젝트 관리 도구다. 메이븐 중앙저장소 2에 ND4J와 DL4J 프로젝 트 라이브러리가 등록되어 있다. 따라서 메이븐을 사용하면 자동으로 최신 버전을 다운로드할 수 있다. 그뿐 아니라 메이븐을 사용하면 인텔리제이와 같은 통합 개발 환경을 함께 이용하기 도 편리하다.

1 https://goo.gl/PLJkUL 2 https://search.maven.org/

538 자바를 활용한 딥러닝


APPENDIX

I

DL4J 프로젝트에 알맞게 GPU 설정하기

뱌체슬라프 코코린과 수전 에랄리 신경망 학습에는 다수의 선형대수 계산이 포함된다. 수천 개의 코어가 있는 GPU는 이러한 계 산에 탁월한 성능을 제공한다. 따라서 GPU를 사용하면 학습 속도를 높이고 궁극적으로 비용 대비 더 나은 계산 성능을 얻을 수 있다.

I.1 백엔드를 GPU로 전환하기 DL4J는 현재 CUDA 7.5를 지원하는 엔비디아 GPU와 함께 사용할 수 있다. GPU에서 지원한 다면 CUDA 8.0 또한 사용할 수 있다. DL4J는 플러그 앤 플레이를 지원한다. 백엔드를 CPU 에서 GPU로 전환하는 방법은 pom.xml 파일에 있는 의존성 <artifactId> 태그값을 고치는 것만큼 쉽다. <dependencyManagement> <dependencies> <dependency> <groupId>org.nd4j</groupId> <artifactId>nd4j-cuda-7.5-platform</artifactId> <version>${nd4j.version}</version> </dependency> </dependencies> </dependencyManagement>

부록 I DL4J 프로젝트에 알맞게 GPU 설정하기

543


I.1.1 GPU 선택하기 일반적으로 고성능 모델 또는 전문 테슬라 장치를 권장한다. 이 글을 쓰는 시점에서 엔비디아 지포스 GTX 1070 사용을 권장한다.1

GPU를 구입할 때 고려사항은 다음과 같다. 보드가 지원하는 멀티프로세서(혹은 코어) 수

병렬 스레드로 처리하기 때문에 GPU를 많이 사용할 수 있을수록 좋다. 디바이스에서 사용 가능한 최대 메모리 크기

이 값에 따라 업로드해서 처리할 수 있는 데이터 크기가 결정된다. 또한 메모리 타입도 메모리 대역폭과 전 송 속도를 결정하기 때문에 중요하다. 최소한 GDDR5는 되어야 하고 보통 GDDR5X가 더 좋으며, HBM/

HBM2가 최고다.

또한 DL4J는 데이터센터 가속기인 테슬라 P100 GPU 혹은 엔비디아 테그라 NVIDIA Tegra 에서 선택적으로 사용할 수 있는 반정밀도 지원 기능을 사용할 수 있다. 이 기능은 데이터 크기나 모 델 크기에 따라 학습 속도를 최대 200 ~ 300% 높일 수 있다. 장치 간의 연결을 통해 학습 속도를 높이는 것도 중요하다. 현재 시장에는 PCIe와 NVLink 고 속 인터커넥트가 있다(NVLink는 160GBps 대역폭을 제공한다). 이 장치들은 딥러닝의 병렬 처리 모델을 처리할 수 있는 멀티 GPU 시스템을 제공하는데, 이 장치들과 엔비디아에서 제공 하는 DGX-1이라는 8개의 테슬라 P100 장치로 구동되는 서버를 함께 사용할 수 있다. 이 서 버는 엄청난 고가라서 ‘상자 안의 슈퍼컴퓨터’라는 별명이 있다. DGX-1의 특징을 고려했을 때 꽤 잘 어울리는 별명이다.

I.1.2 멀티 GPU 시스템에서의 학습하기 DL4J는 데이터 병렬 모드를 사용해서 멀티 GPU 시스템 이용을 지원한다. DL4J는 기존 데이 터 모델을 병렬로 학습시킬 수 있는 모델로 변환하는 데 사용하는 ParallelWrapper 클래스를 제공한다. 간단한 예제를 살펴보자.

1 옮긴이_ 글을 번역하는 시점에서 Geforce 2080이 가장 최신 모델이다.

544 자바를 활용한 딥러닝


APPENDIX

J

DL4J 설치 시 문제 해결

예제를 실행할 때 문제가 발생한다면 해결책을 찾아야 한다. 여기서는 DL4J 초보자가 경험하 는 몇 가지 일반적인 문제에 대해 알아본다.

J.1 설치하기 전에 DL4J를 설치해 사용하다가 예제에서 오류가 발생한 경우라면 라이브러리를 업데이트하라. 메 이븐을 사용하면 pom.xml 파일의 버전을 메이븐 중앙 저장소 1 의 최신 버전과 일치하도록 업데이트하면 된다. 소스를 사용해 설치하려면 git clone 명령을 실행해 ND4J, DataVec,

DL4J를 클론한 후 mvn clean install -Dskiptests=true -Dmaven.javadoc.skip=true 명 령을 세 디렉터리에서 (순서대로) 실행해 설치할 수 있다.

J.2 소스 설치 중 메모리 에러가 발생한다면 코드베이스의 규모가 커졌기 때문에 소스를 사용해 설치하려면 메모리가 많이 필요하다. DL4J 빌드 중에 Permgen 오류가 발생하면 힙 공간을 늘리면 된다. 먼저 배시에 환경 변수를 추가하는 1 https://search.maven.org/

부록 J DL4J 설치 시 문제 해결

547


.bash_profile 파일을 찾는다. 이어서 명령줄에 env를 입력해 환경 변수를 확인한다. 힙 공간 을 늘리려면 다음 명령을 입력한다. echo "export MAVEN_OPTS="-Xmx512m -XX:MaxPermSize=512m""

>

~/.bash_profile

J.3 구버전 메이븐을 사용하는 경우 3.0.4 같은 구버전 메이븐을 사용하면 NoSuchMethodError 같은 예외가 발생할 수 있다. 3.3.x 버전 이상으로 업그레이드하면 문제를 해결할 수 있다. 메이븐 버전을 확인하려면 명령 줄에 mvn -v를 입력하라.

J.4 메이븐과 PATH 변수 메이븐을 설치한 후 다음과 같은 메시지가 나타날 수 있다. mvn is not recognised as an internal or external command, operable program or batch file.

이 메시지는 PATH 변수에 메이븐을 추가해야 함을 의미한다. PATH 변수는 다른 환경 변수 처럼 변경할 수 있다.

J.5 잘못된 JDK 버전 설치 도중에 다음과 같은 메시지가 출력된다면 메이븐 버전 문제일 수 있다. 메이븐을 3.3.x 버전 이상으로 업데이트하라.

548 자바를 활용한 딥러닝


자바 개발자를 위한 실용적인 딥러닝 신경망 구축 가이드 D e e p

딥러닝 입문부터 DL4J를 이용한 신경망 구현과 스파크·하둡 연동까지

L e a r n i n g

행하는 실용적인 방법과 전략을 알려준다. 이론과 실습 모두 깊이 있게 다뤄 딥러닝 관련 전문 지식이 없는 입문자도 이 책을 읽고 나면 딥러닝 신경망을 구축할 수 있다.

•머신러닝·딥러닝 개념에 대한 전반적인 소개 •신경망 기본 원리를 토대로 발전한 심층 신경망 이해 •합성곱 신경망, 순환 신경망 등 주요 심층 신경망 구조 •문제에 적합한 특정 심층 신경망 매핑 방법 •일반적인 신경망 및 특정 심층 신경망 구조 튜닝 •DL4J의 워크플로 도구인 DataVec을 활용한 데이터 유형별 벡터화 기법

Deep Learning

설명한다. 특히 DL4J 라이브러리로 스파크 및 하둡에서 심층 신경망 구조를 학습하고 딥러닝 워크플로를 실

자바를 활용한 딥러닝

이 책의 전반부에서는 이론을, 후반부에서는 튜닝, 병렬화, 벡터화, 파이프라인 구축 등 딥러닝 실무의 핵심을

•스파크 및 하둡에서 DL4J 사용 방법

“개발자가 실무에서 딥러닝을 시작하는 데 알아야 할 모든 것이 담겨 있다.” 그랜트 잉거솔, 루시드웍스 CTO

Deep Learning 자바를 활용한 딥러닝

김홍진, 박다희, 배철민 옮김

자바 8 인 액션

핸즈온 머신러닝

밑바닥부터 시작하는 딥러닝

조시 패터슨, 애덤 깁슨 지음

관련 도서

딥러닝 / 자바

93000

9 791162 241066

ISBN 979-11-6224-106-6

정가 38,000원

조시 패터슨, 애덤 깁슨 지음 김홍진, 박다희, 배철민 옮김


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.