믿고 보는 한빛미디어 인공지능 서적 거부할 수 없는 공전의 히트작
인공 신경망 원리와 응용을 파이썬 날코딩으로 깊이 이해하기
박살내야 게 하 벽 완 를 원리 내 것이 된다!
이 책은 딥러닝 알고리즘의 원리를 깊숙이 이해하고 이를 파이썬 코딩만으로 구현하는 데 주안점을 둔다. 이를 위해 가 장 간단한 신경망 구조부터 복잡한 응용 구조까지 다양한 딥러닝 신경망 예제의 실제 구현 과정을 소개한다. 그 과정에 서 독자는 딥러닝 알고리즘을 텐서플로 같은 프레임워크 없이도 개발하는 능력을 갖추게 된다. 딥러닝 알고리즘을 깊 이 이해하면 역설적으로 프레임워크를 이용할 때의 장단점을 더 확실히 알 수 있다. 나아가 자신만의 새로운 딥러닝 신
파이썬 날코딩으로 알고 짜는 딥러닝
경망을 개발하는 밑거름이 될 것이다.
3분 딥러닝 시리즈
이 책에서 파이썬 날코딩으로 구현하는 신경망
1. 단층 퍼셉트론(SLP)
5. 오토인코더
2. 다층 퍼셉트론(MLP)
6. 인코더-디코더
3. 합성곱 신경망(CNN)
7. 생성적 적대 신경망(GAN)
4. 순환 신경망(RNN)
지음 윤덕호
추천사 초보자를 위한 입문서
최근 심층학습(딥러닝) 기반의 기계학습 기술이 몇 가
수십 년간 개발된 기술들을 무용지물로 만드는 딥러닝
지 난제를 극복하면서 자동 번역, 음성 인식, 이미지 분
시대에도 변치 않는 사실이 있습니다. 바로 기초가 튼
류 등 다양한 인공지능 분야에 성공적으로 적용되어 획
튼해야 제대로 된 변화를 만들 수 있다는 것입니다. 딥
기적인 상용화를 이끌고 있습니다. 그런데 그 기술을 더
러닝 관련 책이 쏟아지고 있으나 깊이 있는 이해로 이
쉽게, 더 널리 활용하는 데 도움이 될 국내 책자는 전무
끄는 책을 찾기 어렵습니다. 이에 천재 전산학자로 소
해서 매우 아쉬웠습니다. 이 책은 이러한 측면에서 국내
문난 저자는 역시 기대를 저버리지 않고 딥러닝의 세
최초의 기초 이론 및 알고리즘 소개, 그리고 손쉬운 활
부 주제를 확실하게 소화시키는 비책을 내놓았습니다.
용을 위한 예제 기반 소프트웨어 해설서로 손색이 없습
_ 김형순 교수(부산대 전자공학과)
니다. 깊은 이론적 배경지식 없이도 쉽고 빠르게 인공지 윤덕호 지음
능 기술을 활용할 수 있는 도구로 적극 추천합니다. _ 김회린 교수(KAIST 전기및전자공학부)
프레임워크 없이 단층 퍼셉트론에서 GAN까지
관련 도서 인공지능 / 파이썬
밑바닥부터 시작하는 딥러닝 2
처음 배우는 딥러닝 수학
김기현의 자연어 처리 딥러닝 캠프 (파이토치 편)
정가 45,000원
‘코난아카데미’ 딥러닝 교재
지은이 윤덕호 dhyoon1225@gmail.com 서울대학교 컴퓨터공학과에서 공부하고 우리나라에 첫 번째 인공지능 바람이 휩쓸 무렵 석박사 과정을 거치면서 자연어 처리 분야를 연구했다. 10여 년간 한남대학교 정보통신공학 과 교수로 학생들을 가르쳤으며 2000년부터 지금까지 (주) 코난테크놀로지에 임원으로 재직하면서 각종 소프트웨어 개 발에 빠져 살았다. 현재 사내 교육 프로그램인 코난아카데미 를 운영하고 있다. 또한 인공지능 혁신성장동력 프로젝트 ‘비 디오 튜링 테스트(VTT) 연구 사업’의 제3세부 과제 책임자로 서 각종 딥러닝 연구에 이용될 학습용 멀티모달 메타데이터 를 구축하고 메타데이터의 초벌 자동 생성 딥러닝 기법을 연 구하고 있다. 그 외에 인문학과 축구, 커뮤니티 댄스 등으로 심신을 단련한 다. 가끔 배우로 변신하여 연극 무대에 오르기도 한다.
파이썬 날코딩으로 알고 짜는 딥러닝
파이썬 날코딩으로 알고 짜는 딥러닝 프레임워크 없이 단층 퍼셉트론에서 GAN까지 초판 1쇄 발행 2019년 07월 15일 지은이 윤덕호 / 베타리더 김형순, 김회린, 강찬석, 다람쥐, 박규리, 백재연, 사지원, 이석곤, 이형도, 허헌 / 펴낸이 김태헌 펴낸곳 한빛미디어 (주) / 주소 서울시 서대문구 연희로2길 62 한빛미디어(주) IT출판사업부 전화 02 – 325 – 5544 / 팩스 02 – 336 – 7124 등록 1999년 6월 24일 제25100 – 2017 – 000058호 / ISBN 979 – 11 – 6224 –200 –1 93000 총괄 전태호 / 책임편집 이상복 / 기획 최현우 / 교정 이인호 디자인 표지 이아란 내지 김연정 조판 이경숙 영업 김형진, 김진불, 조유미 / 마케팅 송경석, 김나예, 이행은 / 제작 박성우, 김정우 이 책에 대한 의견이나 오탈자 및 잘못된 내용에 대한 수정 정보는 한빛미디어(주)의 홈페이지나 아래 이메일로 알려주십시오. 잘못된 책은 구입하신 서점에서 교환해드립니다. 책값은 뒤표지에 표시되어 있습니다. 한빛미디어 홈페이지 www.hanbit.co.kr / 이메일 ask@hanbit.co.kr
Published by HANBIT Media, Inc. Printed in Korea Copyright © 2019 윤덕호 & HANBIT Media, Inc. 이 책의 저작권은 윤덕호와 한빛미디어 (주)에 있습니다. 저작권법에 의해 보호를 받는 저작물이므로 무단 전재와 무단 복제를 금합니다.
지금 하지 않으면 할 수 없는 일이 있습니다. 책으로 펴내고 싶은 아이디어나 원고를 메일 ( writer@hanbit.co.kr ) 로 보내주세요. 한빛미디어(주)는 여러분의 소중한 경험과 지식을 기다리고 있습니다.
게 박살내야 하 벽 완 를 리 원 내 것이 된다!
파이썬 날코딩으로 알고 짜는 딥러닝 윤덕호 지음
프레임워크 없이 단층 퍼셉트론에서 GAN까지
추천의 말·베타리더의 말
수십 년간 개발된 기술을 무용지물로 만드는 딥러닝 시대에도 변치 않는 사실이 있습니다. 바로 기 초가 튼튼해야 제대로 된 변화를 만들 수 있다는 것입니다. 딥러닝 관련 책이 쏟아지고 있으나 깊 이 있는 이해로 이끄는 책을 찾기 어렵습니다. 이에 천재 전산학자로 소문난 저자는 역시 기대를 저 버리지 않고 딥러닝의 세부 주제를 확실하게 소화시키는 비책을 내놓았습니다. _김형순 교수(부산대 전자공학과)
최근 심층학습(딥러닝) 기반의 기계학습 기술이 몇 가지 난제를 극복하면서 자동 번역, 음성 인식, 이미지 분류 등 다양한 인공지능 분야에 성공적으로 적용되어 획기적인 상용화를 이끌고 있습니다. 그런데 그 기술을 더 쉽게, 더 널리 활용하는 데 도움이 될 국내 책자는 전무해서 매우 아쉬웠습니 다. 이 책은 이러한 측면에서 국내 최초의 기초 이론 및 알고리즘 소개, 그리고 손쉬운 활용을 위한 예제 기반 소프트웨어 해설서로 손색이 없습니다. 깊은 이론적 배경지식 없이도 쉽고 빠르게 인공 지능 기술을 활용할 수 있는 도구로 적극 추천합니다. _김회린 교수(KAIST 전기및전자공학부)
‘딥러닝’ 하면 개발자는 어떤 프레임워크를 쓸지를 제일 먼저 떠올릴 것입니다. 그런데 이 책은 케라 스나 텐서플로와 같은 프레임워크를 사용하지 않고, 직접 신경망을 구현해보면서 딥러닝을 이해할 수 있게 구성되어 있습니다. 더불어 엠니스트 같은 기본적인 데이터부터 음성과 비디오와 문맥까지 활용해 예제를 진행하기 때문에 현업에 유용합니다. 다만 딥러닝을 처음 접해보는 사람에게 약간 어 려울 만한 부분도 존재합니다. 논문이나 기반 지식이 더 소개되었다면 이해하는 데 더 도움이 되지 않았을까 하는 아쉬움이 있습니다. 『밑바닥부터 시작하는 딥러닝』처럼 예제 위주로 진행하며 직접 성능을 개선시키는 점에서 여타 딥러닝 관련 서적과 차별점이 있다고 생각합니다. _강찬석(LG전자)
4
시중에 동화책 같이 진입 장벽이 낮은 딥러닝 입문 책이 많습니다. 동화책을 건너뛰고 제대로 된 딥 러닝 교과서를 원한다면 이 책은 최고의 바이블이 될 겁니다. 심도 있는 이론과 적절한 실제 데이터 셋까지 제공해, 머신러닝 전문가를 꿈꾸는 사람이라면 만족스러운 책이 될 겁니다. _다람쥐
이 책은 딥러닝 프레임워크 없이 신경망을 구현하여 딥러닝을 제대로 이해하는 데 그 취지가 있습니 다. 좋은 프레임워크가 많아 굳이 파이썬 날코딩을 할 이유를 못 느낄 수도 있지만, 프레임워크만 쓰 면 오히려 원리를 모른 채 코드만 실행시키는 형편없는 모델러가 될 수 있습니다. 그런 의미에서 이 책이 매우 반가웠습니다. 한 줄 한 줄 쉽게 풀어서 설명하려는 의도가 보여 매우 읽기 편했고 딥러닝 의 원리를 조금이나마 들여다볼 수 있었습니다. _박규리(딥러닝 모델러)
출간된 범인공지능 도서 중에 현업에 가장 가까워 보이는 책이라고 생각됩니다. 술술 읽히는 가벼 운 책은 아닙니다. 책의 전반에 걸쳐 캐글 예제를 다루고 있기 때문에 머신러닝의 기본 개념이나 용 어 등 어느 정도 배경지식을 갖춘 입문 단계 독자에게 중급으로 넘어가는 좋은 길라잡이가 될 것입 니다. _백재연
딥러닝을 처음 접하는 사람이 가벼운 마음으로 읽고 이해하기는 어려운 책입니다. 이 책은 다루는 주제의 배경지식이나 관련 내용을 세세하게 설명합니다. 이 책의 가장 중요한 기저는 프레임워크나 라이브러리 API를 이용하지 않고 직접 구현한다는 점입니다. 딥러닝 기술을 더 잘 이해하고, 단순 딥러닝 기술 사용자가 아니라 자신만의 문제에 활용하고 응용하려는 분께 추천합니다. _사지원
5
딥러닝을 하려면 알고리즘을 잘 알아야 합니다. 하지만 딥러닝 프레임워크에서 다 처리해주기 때문 에 깊게 공부하지 않아도 딥러닝을 사용할 수는 있습니다. 그렇지만 딥러닝에 더 깊게 들어가면 한 계에 부딪치게 됩니다. 이 책은 프레임워크 없이 파이썬 코드로 기존 프레임워크에서 채워주지 못하 는 더 깊은 내용을 알려줍니다. 머신러닝과 딥러닝 지식과 파이썬 문법을 조금 알고 있다면 이 책을 읽기가 좀 더 수월할 겁니다. 딥러닝 알고리즘 원리와 각종 신경망 특성을 깊게 공부하고 싶은 분들 에게 좋은 교재가 될 것이라 생각합니다. _이석곤(엔컴)
새로운 분야를 공부하는 효과적인 방법 중 한 가지는 처음부터 한 땀 한 땀 구현해보는 겁니다. 시중 에 다양한 라이브러리가 나와 있고 현업에서도 많이 사용하지만 알고리즘에 대한 이해 없이 사용하 는 것은 위험합니다. 라이브러리 사용한다고 알고리즘 자체를 이해하고 있는 것은 아닐 수 있기 때 문입니다. 이 책은 단층 신경망부터 순환 신경망까지 단계적으로 제공합니다. 단계별 접근이 초보 자가 알고리즘을 이해하는 데 많은 도움이 될 겁니다. 알고리즘을 한 땀 한 땀 구현하면서 딥러닝의 원리를 이해할 수 있도록 구성되어 있습니다. 초보자와 입문자에게 딥러닝을 공부하는 좋은 안내서 가 될 거라고 생각합니다. _이형도(엠티콤)
딥러닝에 있어서 파이썬이 필수라고 해도 과언이 아니죠, 워낙 프레임워크들이 잘 되어 있어 굳이 알고리즘을 몰라도 잘 가져다가 쓰면 딥러닝 알고리즘을 구현할 수 있습니다. 하지만 더 깊게 다가 가려면 한계에 부딪히죠. 그런 한계와 답답함을 이 책이 어느 정도 풀어준다고 생각합니다. 프레임 워크를 쓰지 않고 퍼셉트론, 인공 신경망 원리 등을 날코딩으로 깊이 이해할 수 있습니다. 기존 도서 가 프레임워크 활용법을 알려주는 데 반해 이 책은 더 깊은 이해를 제공해 좋았습니다. 다만 용어와 원리를 이해하는 데 시간이 걸렸습니다. 딥러닝 원리를 깊이 이해하고 싶으신 분에게는 딱 알맞은 책이라고 할 수 있습니다. _허헌(리걸테크)
6
책 소개
이 책의 목표는 독자가 딥러닝 알고리즘의 원리를 깊이 있게 이해하여 활용 능력을 갖추도록 돕는 데 있다. 각 장은 이론을 제시한 후에 파이썬으로 예제 프로그램을 구현하고 실험을 수행 하는 과정을 차근차근 소개한다. 케라스나 텐서플로 같은 프레임워크를 이용하지 않고 파이썬 날코딩만으로 딥러닝의 모든 문 제를 풀어내는 예제가 이 책의 가장 큰 특징이다. 이들 예제 프로그램을 꼼꼼하게 설명한다. 또 한 실험 과정을 재현하고 변형해 활용하기 쉽게 구성했다. 예제 프로그램을 살펴보면서 그동안 편리한 프레임워크에 가려져 이해하지 못한 채 지나쳤던 딥러닝의 동작 원리를 확실하게 알게 된다. 이렇게 길러진 이해를 토대로 프레임워크 없이도 직접 딥러닝 신경망을 개발하는 능력을 갖추게 될 것이다. 동시에 역설적으로 숨은 동작 원리를 간파하게 됨으로써 프레임워크를 더 잘 이용하게 된다. 예제에서 다루는 다양한 데이터셋은 이 책의 또 하나의 매력이다. 각종 인공지능 챌린지 대회 가 펼쳐지는 캐글 플랫폼에서 수집한 실전 데이터셋은 딥러닝 모델의 활용 범위에 대한 상상의 지평을 넓혀줄 것이다. 전복 나이 추정, 천체 펄서 여부 판정, 철판 불량 상태 분류, 꽃 사진 이 미지나 도시 소음의 분류 등의 문제를 캐글 데이터셋을 이용해 다룬다. 이 밖에도 사무용품 이 미지들로 구성된 오피스31 데이터셋, 필기체 문자 이미지들을 모은 엠니스트(MNIST) 데이터 셋을 비롯해 영화 동영상 파일, 회화 이미지 파일, 오토마타 문법 등 다양한 종류의 데이터셋을 예제 프로그램에서 사용한다. 여러분이 자신만의 새로운 딥러닝 신경망을 개발하고, 딥러닝을 넘어서는 인공지능의 또 다른 지평을 향해 나아가는 첫걸음에 이 책이 도움이 되기를 기대해본다.
7
이 책의 대상 독자 이 책의 대상 독자는 크게 두 부류다. 첫 번째는 텐서플로 같은 프레임워크를 사용해 딥러닝에 입문했지만 여전히 딥러닝 알고리즘의 동작 원리를 제대로 이해할 수 없어 답답함을 느끼는 기 존 딥러닝 개발자다. 두 번째는 딥러닝을 새로 배워보려 하지만 기왕이면 수박 겉 핥기식 공부 보다는 딥러닝 알고리즘을 제대로 이해하는 공부를 하고 싶은 딥러닝 입문자다.
이 책의 개발 환경 이 책은 다음과 같은 환경을 기반으로 설명했으며, 모든 소스의 구동을 확인했다. 도구
버전
운영체제
윈도우 10 (64비트)
개발 툴
파이썬 3.4.3
SDK
주피터 노트북 5.7.4
예제 소스 이 책에서 소개하는 모든 예제 프로그램은 주피터 노트북을 이용해 작성했다. 각 장마다 독립 된 예제를 소개하며, 각 예제를 주피터 노트북의 셀에 해당하는 두 가지 코드 블록, 즉 구현 코 드와 실행 코드 단위로 자세히 설명한다. 이들 예제 프로그램과 데이터셋은 저자의 깃허브 계 정과 한빛미디어 홈페이지에서 내려받을 수 있으며 각자의 개발 환경에 설치된 주피터 노트북 을 이용해 손쉽게 동작을 재현하고 실습할 수 있다.
8
●●
저자 깃허브 : github.com/konantechnology/academy.alzza
●●
한빛미디어 : www.hanbit.co.kr/src/10200
다루는 내용 소개
이 책은 총 5부로 구성되어 있다.
1부와 2부에서는 딥러닝 신경망의 기본 구조인 단층 퍼셉트론과 다층 퍼셉트론을 소개한다. 3부와 4부에서는 이미지 데이터나 시계열 데이터 처리에 특화된 고급 딥러닝 신경망 구조인 합 성곱 신경망(CNN)과 순환 신경망(RNN)을 살펴본다. 마지막으로 5부에서는 딥러닝의 응용 구조로서 오토인코더, 인코더-디코더, 생성적 적대 신경망(GAN)의 원리와 구현 방법을 알아 본다. 각 부는 3개의 장으로 구성되어 있으며, 각 장은 점차 심화되는 내용으로 긴밀하게 상호 연결 되어 있지만 각각 독립적인 예제를 제공한다. 각 장은 이론적 배경을 소개하고 나서 예제 프로 그램을 구현한다. 마지막 절에서는 예제 프로그램 실행 결과를 검토한다. 각 장의 주요 내용을 부 단위로 살펴보면 다음과 같다.
1부 : 단층 퍼셉트론 가장 간단한 신경망 구조인 단층 퍼셉트론 구조를 소개하면서 신경망 출력을 이용해 풀어야 할 세 가지 문제 유형의 해결 방법을 살펴본다. 1장에서는 전복 고리 수 추정 신경망 예제를 통해 ‘회귀 분석 문제’의 해결 방법을, 2장에서는 펄서 여부 판정 신경망 예제를 통해 ‘이진 판단 문 제’의 해결 방법을, 3장에서는 철판의 불량 상태 분류 신경망 예제를 통하여 ‘선택 분류 문제’의 해결 방법을 각각 소개한다.
2부 : 다층 퍼셉트론 기본적이면서도 실전적인 다층 퍼셉트론 구조를 소개하면서 객체지향 모델 구조와 복합 출력의 처리 방법을 다룬다. 4장에서는 지금까지의 예제들을 다층 퍼셉트론으로 다시 풀어내며, 5장에 서는 객체지향 구조로 프로그램을 재구성하면서 꽃 이미지 분류 신경망 예제를 소개한다. 6장 에서는 오피스31 이미지의 다차원 분류 예제를 사용해 복합 출력을 다루는 방법을 살펴본다.
9
3부 : 합성곱 신경망 합성곱 신경망과 정규화 기법, 거대 심층 구조를 살펴보면서 은닉 계층 구성에 이용되는 12가 지 계층의 기능과 구현 방법을 살펴본다. 7장에서는 이미지 처리에 특화된 합성곱 신경망에 이 용되는 4가지 계층을 소개한다. 8장에서는 다섯 가지 정규화 기법을 살펴본다. 이 가운데 L1 손실 및 L2 손실을 가중치 학습 과정에 반영해 처리하는 과정을 소개한다. 또한 드롭아웃, 잡 음 주입, 배치 정규화 기법을 각각 별도 계층으로 구현한다. 9장에서 인셉션 모델이나 레스넷 모델 같은 거대 심층 구조를 지원하는 5가지 복합 계층을 소개한다.
4부 : 순환 신경망 시간 축을 갖는 시계열 데이터 처리에 특화된 순환 신경망을 이용해 다양한 종류의 데이터를 다루는 과정을 살펴본다. 10장에서 오토마타 생성 문장 판별 신경망 예제와 함께 기본 구조 의 순환 계층을 소개한 후, 11장에서 도시 소음 분류 신경망 예제와 함께 LSTM(long short-
term memory) 셀 구조의 개선된 순환 계층을 살펴본다. 12장에서는 동영상 장면 전환 프레 임 판별 신경망 예제와 함께 시계열 출력을 다루는 방법을 다룬다.
5부 : 고급 응용 신경망 구조들 문제에 접근하는 새로운 시각을 보여주는 세 가지 딥러닝 응용 구조를 소개한다. 13장에서는 입력 재현을 목표로 삼는 방법으로 비지도학습에 활용하는 오토인코더, 14장에서는 콘텍스트 벡터를 매개로 입출력 간의 데이터 형태 차이를 극복하는 인코더-디코더, 15장에서는 경쟁 관 계의 두 신경망을 이용해 데이터 생성 능력을 기르는 생성적 적대 신경망을 소개하고 각각 구 체적 예제 프로그램을 제시한다.
10
감사의 말
몇 년 전 딥러닝을 접하면서 데이터 중심 접근 방법에 크게 공감이 갔다. 일찍이 80년대에 인공 지능을 공부하며 지식 중심 접근 방법으로 많은 어려움을 겪었던 탓이다. 막상 프레임워크를 이 용한 예제 프로그램을 돌리면서 놀라우면서도 한편으로는 수박 껍질을 핥는 기분이 들었다. 중 요한 처리 과정은 프레임워크 안에 감추어져 전혀 보이지 않았다. 자칫하면 모두가 이런 틀 안 에 갇혀 버릴지 모른다는 걱정이 이 책을 쓰게 된 계기가 되었다. 사내교육 프로그램인 코난아카데미에서 동료들과 함께 진행한 딥러닝 세미나는 이 책을 집필하 는 밑거름이 되었다. 부족한 강의를 들어준 코난 직원들에게 감사드리고 싶다. 코난테크놀로지 김영섬 사장님은 이 책을 완성하기까지 큰 도움을 주셨다. 나름 잘 나가던 대학 교수를 꼬드겨 산업계 일꾼으로 탈바꿈해주신 인연이 어느덧 25년을 넘어섰다. 김영섬 사장님 의 격려와 채근이 없었다면 이 책은 아마 세상에 나오지 못했을 것이다. 젊은 시절 인공지능 세계로 이끌어주신 김영택 교수님과 권혁철 선배님을 비롯한 많은 IT 분야 의 지인께 감사드리며, 꼼꼼하게 원고를 살펴주시고 과분한 추천 말씀까지 주신 김회린 교수님, 김형순 교수님을 비롯한 베타리더 분께도 고마움을 전한다. 최현우 편집자님을 비롯한 한빛미 디어의 많은 분께도 감사드린다. 열심히 일하는 것 못지않게 큰 힘이 되는 것은 열심히 노는 것이다. 함께 놀아준 문탁네트워크, 이우FC, 꿈지락, 극단동동 등 마을공동체 활동을 통해 만난 많은 분에게 감사의 인사를 전한다. 끝으로 30년 가까이 필자의 곁을 지켜 준 아내 김란경, 그리고 사랑하는 윤영무, 윤영섬에게도 고마움을 전한다. _윤덕호
2019년 7월
11
CONTENTS
추천의 말·베타리더의 말 .....................................................................................................
4
책 소개 ..............................................................................................................................
7
다루는 내용 소개 .................................................................................................................
9
감사의 말 .........................................................................................................................
CHAPTER
11
0 들어가기 0.1 이 책의 구성 .............................................................................................................. 36 0.2 인공지능과 머신러닝, 딥러닝 ........................................................................................ 39 0.3 동물의 신경세포, 뉴런 ................................................................................................. 40 0.4 인공 신경망의 기본 유닛, 퍼셉트론 ................................................................................ 42 0.5 딥러닝을 위한 수학 ..................................................................................................... 43 0.5.1 선형대수학 ....................................................................................................... 43 0.5.2 미분적분학 ....................................................................................................... 43 0.5.3 확률통계론 ....................................................................................................... 44
0.6 예제 실습 환경 소개 .................................................................................................... 44 0.7 마치며 ...................................................................................................................... 45
PART
I 단층 퍼셉트론(SLP)
CHAPTER
1 회귀 분석 : 전복의 고리 수 추정 신경망 1.1 단층 퍼셉트론 신경망 구조 ........................................................................................... 50 1.2 텐서 연산과 미니배치의 활용 ........................................................................................ 52
12
1.3 신경망의 세 가지 기본 출력 유형과 회귀 분석 .................................................................. 54 1.4 전복의 고리 수 추정 문제 ............................................................................................. 55 1.5 회귀 분석과 평균제곱오차(MSE) 손실 함수 ..................................................................... 56 1.6 경사하강법과 역전파 ................................................................................................... 59 1.7 편미분과 손실 기울기의 계산 ........................................................................................ 62 1.8 하이퍼파라미터 .......................................................................................................... 65 1.9 비선형 정보와 원-핫 벡터 표현 .................................................................................... 66 1.10 구현하기 : 전복 고리 수 추정 신경망 ............................................................................ 68 1.10.1 파이썬 모듈 불러들이기 .................................................................................... 69 1.10.2 하이퍼파라미터값의 정의 .................................................................................. 70 1.10.3 실험용 메인 함수 정의 ...................................................................................... 71 1.10.4 데이터 적재 함수 정의 ...................................................................................... 71 1.10.5 파라미터 초기화 함수 정의 ................................................................................ 73 1.10.6 학습 및 평가 함수 정의 ..................................................................................... 73 1.10.7 학습 및 평가 데이터 획득 함수 정의 .................................................................... 75 1.10.8 학습 실행 함수와 평가 실행 함수 정의 ................................................................. 76 1.10.9 단층 퍼셉트론에 대한 순전파 및 역전파 함수 정의 ................................................. 78 1.10.10 후처리 과정에 대한 순전파 및 역전파 함수 정의 .................................................. 81 1.10.11 정확도 계산 함수 정의 .................................................................................... 83
1.11 실행하기 ................................................................................................................ 83 1.11.1 구현 코드 파일 실행 ......................................................................................... 83 1.11.2 전복 고리 수 추정 신경망 실행 ........................................................................... 84 1.11.3 학습된 파라미터값 확인 .................................................................................... 85 1.11.4 하이퍼파라미터 바꾸어 실행하기 ........................................................................ 86
1.12 마치며 ................................................................................................................... 87
13
CONTENTS
CHAPTER
2 이진 판단 : 천체의 펄서 여부 판정 신경망 2.1 펄서 판정 문제 ........................................................................................................... 90 2.2 이진 판단 문제의 신경망 처리 ....................................................................................... 91 2.3 시그모이드 함수 ......................................................................................................... 92 2.4 확률 분포와 정보 엔트로피 ........................................................................................... 96 2.5 확률 분포의 추정과 교차 엔트로피 ................................................................................. 99 2.6 딥러닝 학습에서의 교차 엔트로피 ................................................................................ 101 2.7 시그모이드 교차 엔트로피와 편미분 ............................................................................. 102 2.8 계산값 폭주 문제와 시그모이드 관련 함수의 안전한 계산법 .............................................. 104 2.9 구현하기 : 펄서 여부 판정 신경망 ................................................................................ 106 2.9.1 코드 재활용을 위한 아발로니 파일 실행시키기 ...................................................... 106 2.9.2 메인 함수 정의 ................................................................................................ 108 2.9.3 데이터 적재 함수의 정의 ................................................................................... 108 2.9.4 후처리 과정에 대한 순전파와 역전파 함수의 재정의 ............................................... 109 2.9.5 정확도 계산 함수의 재정의 ................................................................................ 111 2.9.6 시그모이드 관련 함수 정의 ................................................................................ 111
2.10 실행하기 .............................................................................................................. 112 2.10.1 구현 코드 파일 실행 ....................................................................................... 113 2.10.2 천체의 펄서 여부 판정 신경망 학습시키기 .......................................................... 113 2.10.3 전복 고리 수 추정 예제의 동작 확인 .................................................................. 114
2.11 확장하기 : 균형 잡힌 데이터셋과 착시 없는 평가 방법 ................................................... 115 2.11.1 코드 재활용을 위한 파일 실행시키기 ................................................................. 117 2.11.2 메인 실행 함수의 재정의 ................................................................................. 118 2.11.3 데이터 적재 함수의 재정의 .............................................................................. 118 2.11.4 정확도 계산 함수의 재정의 .............................................................................. 119 2.11.5 출력문 수정을 위한 실행 함수 재정의 ................................................................ 120
14
2.12 실행하기 : 확장된 펄서 여부 판정 신경망 .................................................................... 121 2.12.1 구현 파일 실행시키기 ..................................................................................... 121 2.12.2 원래의 데이터셋으로 신경망 학습시키기 ............................................................ 122 2.12.3 균형 잡힌 데이터로 신경망 학습시키기 .............................................................. 122
2.13 마치며 ................................................................................................................. 123
CHAPTER
3 선택 분류 : 철판 불량 상태 분류 신경망 3.1 불량 철판 판별 문제 .................................................................................................. 126 3.2 선택 분류 문제의 신경망 처리 ..................................................................................... 127 3.3 소프트맥스 함수 ....................................................................................................... 129 3.4 소프트맥스 함수의 편미분 .......................................................................................... 132 3.5 소프트맥스 교차 엔트로피 .......................................................................................... 134 3.6 소프트맥스 교차 엔트로피의 편미분 ............................................................................. 135 3.7 시그모이드 함수와 소프트맥스 함수의 관계 ................................................................... 136 3.8 구현하기 : 불량 철판 판별 신경망 ................................................................................ 137 3.8.1 코드 재활용을 위한 아발로니 파일 실행시키기 ...................................................... 138 3.8.2 메인 함수 정의 ................................................................................................ 139 3.8.3 데이터 적재 함수 정의 ...................................................................................... 139 3.8.4 후처리 과정에 대한 순전파와 역전파 함수의 재정의 ............................................... 140 3.8.5 정확도 계산 함수의 재정의 ................................................................................ 141 3.8.6 소프트맥스 관련 함수 정의 ................................................................................ 142
3.9 실행하기 ................................................................................................................. 144 3.9.1 구현 코드 파일 실행 ......................................................................................... 144 3.9.2 철판의 불량 상태 분류 신경망 학습시키기 ............................................................ 145 3.9.3 학습률을 바꾸어 학습시키기 .............................................................................. 146
3.10 마치며 ................................................................................................................. 147
15
CONTENTS
PART
II 다층 퍼셉트론(MLP)
CHAPTER
4 다층 퍼셉트론 기본 구조 : 세 가지 신경망의 재구성 4.1 다층 퍼셉트론 신경망 구조 ......................................................................................... 152 4.2 은닉 계층의 수와 폭 .................................................................................................. 153 4.3 비선형 활성화 함수 ................................................................................................... 154 4.4 ReLU 함수 ............................................................................................................. 157 4.5 민스키의 XOR 문제와 비선형 활성화 함수 .................................................................... 159 4.6 구현하기 : 다층 퍼셉트론 신경망 지원 함수 ................................................................... 161 4.6.1 수정이 필요한 세 함수 내용 확인 ........................................................................ 162 4.6.2 은닉 계층 하나를 위한 파라미터 생성 함수 정의 .................................................... 163 4.6.3 은닉 계층 하나를 위한 순전파 함수 정의 .............................................................. 164 4.6.4 은닉 계층 하나를 위한 역전파 함수 정의 .............................................................. 165 4.6.5 가변적 은닉 계층 구성을 위한 파라미터 생성 함수 정의 .......................................... 167 4.6.6 가변적 은닉 계층 구성을 위한 순전파 함수 정의 .................................................... 168 4.6.7 가변적 은닉 계층 구성을 위한 역전파 함수 정의 .................................................... 169 4.6.8 스위치 함수 정의 ............................................................................................. 170 4.6.9 은닉 계층 구조 지정 함수 정의 ........................................................................... 171
4.7 실행하기 ................................................................................................................. 172 4.7.1 전복 고리 수 추정 문제 ..................................................................................... 172 4.7.2 천체 펄서 판정 문제 ......................................................................................... 175 4.7.3 철판 재료의 불량 판별 문제 ............................................................................... 177 4.7.4 다층 퍼셉트론 도입의 효과 ................................................................................ 180
4.8 마치며 .................................................................................................................... 180
16
CHAPTER
5 다층 퍼셉트론 모델 구조 : 꽃 이미지 분류 신경망 5.1 다층 퍼셉트론을 위한 클래스 설계 ............................................................................... 182 5.2 데이터 분할 : 학습, 검증, 평가 ..................................................................................... 184 5.3 시각화 .................................................................................................................... 185 5.4 이미지 분류 문제와 꽃 이미지 분류 데이터셋 ................................................................. 185 5.5 구현하기 : 모델 클래스 .............................................................................................. 187 5.5.1 클래스 선언을 위한 준비 ................................................................................... 188 5.5.2 Model 클래스의 선언 ...................................................................................... 188 5.5.3 MlpModel 클래스의 선언 ................................................................................ 190 5.5.4 파라미터 생성 메서드의 정의 ............................................................................. 191 5.5.5 학습 메서드의 정의 .......................................................................................... 192 5.5.6 평가 메서드의 정의 .......................................................................................... 194 5.5.7 시각화 메서드 정의 .......................................................................................... 194 5.5.8 미니배치 학습 메서드의 정의 ............................................................................. 195 5.5.9 신경망 부분에 대한 순전파 및 역전파 메서드 정의 ................................................. 196 5.5.10 계층 하나에 대한 순전파 및 역전파 메서드 정의 .................................................. 197 5.5.11 후처리 부분에 대한 순전파 메서드 정의 ............................................................. 198 5.5.12 후처리 부분에 대한 역전파 메서드 정의 ............................................................. 199 5.5.13 정확도 계산 메서드 정의 ................................................................................. 200 5.5.14 추정 결과 산출 메서드 정의 ............................................................................. 201
5.6 구현하기 : 데이터셋 클래스 ........................................................................................ 202 5.6.1 보조적 기능들이 선언된 파일 실행시키기 ............................................................. 202 5.6.2 Dataset 클래스 선언 ....................................................................................... 202 5.6.3 학습 데이터 공급 메서드 정의 ............................................................................ 203 5.6.4 평가 데이터 공급 메서드 정의 ............................................................................ 204
17
CONTENTS
5.6.5 검증 데이터 공급 메서드 정의 ............................................................................ 205 5.6.6 데이터 뒤섞기 메서드 정의 ................................................................................ 206 5.6.7 후처리 순전파 처리 지원 메서드 정의 .................................................................. 207 5.6.8 후처리 역전파 처리 지원 메서드 정의 .................................................................. 208 5.6.9 정확도 계산 메서드 정의 ................................................................................... 210 5.6.10 추정 결과 변환 메서드 정의 ............................................................................. 211 5.6.11 로그 출력 메서드 정의 .................................................................................... 211
5.7 구현하기 : 네 가지 데이터셋 파생 클래스 ...................................................................... 212 5.7.1 기반 클래스 파일 실행시키기 ............................................................................. 213 5.7.2 AblaoneDataset 클래스 선언 .......................................................................... 213 5.7.3 PulsarDataset 클래스 선언 ............................................................................. 214 5.7.4 SteelDataset 클래스 선언 ............................................................................... 216 5.7.5 PulsarSelectDataset 클래스 선언 . .................................................................. 217
5.8 구현하기 : 꽃 이미지 분류 데이터셋 클래스 ................................................................... 218 5.8.1 기반 클래스 파일 실행시키기 ............................................................................. 218 5.8.2 FlowersDataset 클래스 선언 ........................................................................... 218 5.8.3 객체 초기화 메서드의 재정의 ............................................................................. 219 5.8.4 시각화 메서드 정의 .......................................................................................... 221
5.9 구현하기 : 수학 연산과 각종 부수적 기능 ...................................................................... 221 5.9.1 파이썬 모듈 불러들이기 .................................................................................... 221 5.9.2 ReLU 관련 함수 정의 ...................................................................................... 222 5.9.3 시그모이드 관련 함수 정의 ................................................................................ 223 5.9.4 쌍곡탄젠트 관련 함수 정의 ................................................................................ 223 5.9.5 소프트맥스 관련 함수 정의 ................................................................................ 224 5.9.6 CSV 파일 읽기 ............................................................................................... 224 5.9.7 벡터 처리 지원 함수의 정의 ............................................................................... 225
18
5.9.8 이미지 입출력 함수의 정의 ................................................................................ 226 5.9.9 선택 분류 결과 출력 함수의 정의 ........................................................................ 227 5.9.10 폴더 정보 읽기 함수의 정의 ............................................................................. 228
5.10 실행하기 .............................................................................................................. 228 5.10.1 구현 파일 실행시키기 ..................................................................................... 228 5.10.2 전복 고리 수 추정 문제 ................................................................................... 229 5.10.3 펄서 여부 판정 문제 ....................................................................................... 230 5.10.4 불량 철판 판별 문제 ....................................................................................... 231 5.10.5 꽃 사진 분류 문제 .......................................................................................... 233
5.11 마치며 ................................................................................................................. 235
CHAPTER
6 복합 출력의 처리 방법 : 오피스31 다차원 분류 신경망 6.1 오피스31 데이터셋과 다차원 분류 ................................................................................ 238 6.2 딥러닝에서의 복합 출력의 학습법 ................................................................................ 240 6.3 복합 출력을 위한 MlpModel 클래스와 Dataset 클래스의 역할 .......................................... 242 6.4 아담 알고리즘 .......................................................................................................... 242 6.5 구현하기 : 아담 모델 클래스 ....................................................................................... 243 6.5.1 기반 클래스 파일 실행시키기 ............................................................................. 244 6.5.2 AdamModel 클래스 선언 ................................................................................ 244 6.5.3 신경망 역전파 메서드 재정의 ............................................................................. 245 6.5.4 파라미터 수정 메서드 정의 ................................................................................ 246 6.5.5 두 가지 파라미터 수정 메서드 정의 ..................................................................... 246
6.6 구현하기 : 오피스31 데이터셋 클래스 ............................................................................ 248 6.6.1 기반 클래스 파일 실행시키기 ............................................................................. 248 6.6.2 Office31Dataset 클래스 선언 .......................................................................... 249
19
CONTENTS
6.6.3 객체 초기화 함수 정의 ...................................................................................... 249 6.6.4 복합 출력 처리를 위한 순전파 함수 정의 .............................................................. 252 6.6.5 복합 출력 처리를 위한 역전파 함수 정의 .............................................................. 253 6.6.6 정확도 계산 함수와 로그 출력 함수 정의 .............................................................. 253 6.6.7 시각화 관련 함수 정의 ...................................................................................... 254 6.6.8 메서드 일괄 등록 ............................................................................................. 256
6.7 실행하기 ................................................................................................................. 256 6.7.1 구현 파일 실행시키기 ....................................................................................... 257 6.7.2 오피스31 데이터셋 객체 생성 ............................................................................ 257 6.7.3 은닉 계층 하나를 갖는 다층 퍼셉트론 신경망 학습 ................................................. 257 6.7.4 은닉 계층 세 개와 학습률을 조절한 다층 퍼셉트론 신경망 학습 ................................ 259 6.7.5 아담 알고리즘을 이용한 신경망 학습 ................................................................... 260
6.8 마치며 .................................................................................................................... 261
PART
III 합성곱 신경망(CNN)
CHAPTER
7 간단한 합성곱 모델 : 꽃 이미지 분류 신경망 7.1 다층 퍼셉트론의 문제점과 새로운 구조의 필요성 ............................................................ 266 7.2 합성곱 계층 ............................................................................................................. 267 7.3 합성곱 연산의 패딩과 건너뛰기 ................................................................................... 269 7.4 풀링 계층 ................................................................................................................ 271 7.5 채널의 도입과 커널의 확장 ......................................................................................... 273 7.6 합성곱과 풀링의 역전파 처리 ...................................................................................... 276 7.7 합성곱 신경망의 일반적인 구성 ................................................................................... 279
20
7.8 세 가지 합성곱 연산 방법 ........................................................................................... 280 7.9 다양한 계층의 처리를 위한 모델 확장 ........................................................................... 282 7.10 구현하기 : 간단한 합성곱 신경망 클래스 ..................................................................... 286 7.10.1 기반 클래스 파일 실행시키기 ........................................................................... 287 7.10.2 CnnBasicModel 클래스 선언 ........................................................................ 287 7.10.3 계층에 대한 파라미터 생성 메서드 재정의 .......................................................... 288 7.10.4 계층에 대한 순전파 메서드 재정의 .................................................................... 290 7.10.5 계층에 대한 역전파 메서드 재정의 .................................................................... 290 7.10.6 네 가지 계층에 대한 파라미터 생성 메서드 정의 .................................................. 291 7.10.7 은닉 계층 구성 정보 접근을 위한 보조 함수 정의 ................................................. 293 7.10.8 완전 연결 계층에 대한 순전파 메서드 정의 ......................................................... 294 7.10.9 완전 연결 계층에 대한 역전파 메서드 정의 ......................................................... 296 7.10.10 비선형 활성화 함수에 대한 순전파 및 역전파 메서드 정의 ................................... 297 7.10.11 합성곱 계층에 대한 원론적 순전파 처리 함수 정의 ............................................. 298 7.10.12 합성곱 계층에 대한 개선된 순전파 처리 함수 정의 ............................................. 299 7.10.13 합성곱 계층에 대한 순전파 메서드 정의 ........................................................... 301 7.10.14 합성곱 계층에 대한 역전파 메서드 정의 ........................................................... 303 7.10.15 확장 영역 처리 함수 정의 .............................................................................. 304 7.10.16 확장 영역에 대한 역처리 함수 정의 ................................................................. 306 7.10.17 평균치 풀링 계층에 대한 순전파와 역전파 메서드 정의 ....................................... 307 7.10.18 최대치 풀링 계층에 대한 순전파와 역전파 메서드 정의 ....................................... 309 7.10.19 시각화 메서드 정의 ...................................................................................... 311
7.11 실행하기 .............................................................................................................. 312 7.11.1 구현 파일 실행시키기 ..................................................................................... 313 7.11.2 실험용 데이터셋 객체 생성 .............................................................................. 313 7.11.3 확장된 모델로 다층 퍼셉트론 신경망 만들어보기 ................................................. 314
21
CONTENTS
7.11.4 완전 연결 계층 구성 정보의 명시적 표현과 아담 알고리즘의 해제 ........................... 315 7.11.5 간단한 합성곱 신경망을 이용한 꽃 이미지 분류 신경망 ......................................... 316 7.11.6 좀 더 많은 계층을 갖는 합성곱 신경망을 이용한 꽃 이미지 분류 신경망 ................... 319 7.11.7 같은 구성의 합성곱 신경망을 이용한 오피스31 다차원 분류 신경망 ........................ 320 7.11.8 오피스31 문제를 위한 합성곱 신경망의 학습 횟수 늘려보기 .................................. 322 7.11.9 시그모이드 함수를 비선형 활성화 함수로 이용해보기 ........................................... 322 7.11.10 쌍곡탄젠트 함수를 비선형 활성화 함수로 이용해보기 ......................................... 324
7.12 마치며 ................................................................................................................. 325
CHAPTER
8 다섯 가지 정규화 확장 : 꽃 이미지 분류 신경망 8.1 부적합과 과적합 ....................................................................................................... 328 8.2 L2 손실 .................................................................................................................. 329 8.3 L1 손실 ................................................................................................................... 331 8.4 드롭아웃 ................................................................................................................. 333 8.5 잡음 주입 ................................................................................................................ 335 8.6 배치 정규화 ............................................................................................................. 336 8.7 정규화 기법 도입을 위한 계층의 추가 ........................................................................... 339 8.8 구현하기 : 정규화 확장 클래스 .................................................................................... 340 8.8.1 기반 클래스 파일 실행시키기 ............................................................................. 341 8.8.2 CnnRegModel 클래스 선언 ............................................................................ 341 8.8.3 파라미터 분포 출력 메서드 정의 ......................................................................... 342 8.8.4 추가 손실 함수 계산 메서드 재정의 ..................................................................... 343 8.8.5 파라미터 갱신 함수 재정의 ................................................................................ 344 8.8.6 드롭아웃 계층 지원을 위한 세 가지 메서드 정의 .................................................... 345 8.8.7 잡음 주입 계층 지원을 위한 세 가지 메서드 정의 ................................................... 346 8.8.8 배치 정규화 계층 지원을 위한 세 가지 메서드 정의 ................................................ 348
22
8.9 실행하기 ................................................................................................................. 350 8.9.1 구현 파일 실행시키기 ....................................................................................... 350 8.9.2 실험용 데이터셋 객체 생성 ................................................................................ 351 8.9.3 베이스라인 모델의 파라미터 분포 확인 ................................................................ 351 8.9.4 L2 손실의 효과와 파라미터 분포의 변화 확인 ....................................................... 353 8.9.5 L1 손실의 효과와 파라미터 분포의 변화 확인 ....................................................... 354 8.9.6 베이스라인 합성곱 신경망의 성능 확인 ................................................................ 354 8.9.7 드롭아웃 기법의 동작과 효과 확인 ...................................................................... 356 8.9.8 잡음 주입 기법의 동작과 효과 확인 ..................................................................... 357 8.9.9 배치 정규화 기법의 동작과 효과 확인 .................................................................. 358 8.9.10 오피스31 문제에 대한 정규화 기법의 효과 확인 .................................................. 359
8.10 마치며 ................................................................................................................. 360
CHAPTER
9 인셉션 모델과 레스넷 모델 : 꽃 이미지 분류 신경망 9.1 인셉션 모델 ............................................................................................................ 362 9.1.1 인셉션 모델과 인셉션 모듈 ................................................................................ 363 9.1.2 합성곱 연산 과정의 변형 ................................................................................... 365 9.1.3 인셉션-v3 모델의 구조 .................................................................................... 366
9.2 레스넷 모델 ............................................................................................................. 367 9.2.1 VGG-19 모델과 플레인-34 모델 ..................................................................... 368 9.2.2 레지듀얼 블록과 레지듀얼-34 모델 .................................................................... 371 9.2.3 보틀넥 블록과 레스넷-152 모델 ........................................................................ 372
9.3 인셉션 모델과 레스넷 모델 구현을 위해 필요한 확장들 .................................................... 374 9.4 구현하기 : 확장된 합성곱 신경망 모델 클래스 ................................................................ 376 9.4.1 기반 클래스 파일 실행시키기 ............................................................................. 376
23
CONTENTS
9.4.2 CnnExtModel 클래스 선언 .............................................................................. 377 9.4.3 계층을 위한 파라미터 생성 메서드 재정의 ............................................................ 378 9.4.4 병렬 계층 지원을 위한 세 개의 메서드 정의 .......................................................... 380 9.4.5 순차 계층 지원을 위한 세 개의 메서드 정의 .......................................................... 383 9.4.6 합산 계층 지원을 위한 파라미터 생성 메서드 정의 ................................................. 385 9.4.7 합산 계층 지원을 위한 순전파 처리 메서드 정의 .................................................... 388 9.4.8 합산 계층 지원을 위한 역전파 처리 메서드 정의 .................................................... 389 9.4.9 합산 계층 지원을 위한 보조 함수 정의 ................................................................. 390 9.4.10 반복 계층 지원을 위한 세 가지 메서드 정의 ........................................................ 391 9.4.11 사용자 정의 계층 지원을 위한 세 가지 메서드 정의 .............................................. 393 9.4.12 매크로 등록 및 조회 메서드 정의 ...................................................................... 395 9.4.13 합성곱 계층을 위한 파라미터 생성 메서드 재정의 ................................................ 397 9.4.14 합성곱 계층을 위한 순전파 처리 메서드 재정의 ................................................... 398 9.4.15 합성곱 계층을 위한 역전파 처리 메서드 재정의 ................................................... 399 9.4.16 최대치 풀링 계층을 위한 파라미터 생성 메서드 재정의 ......................................... 401 9.4.17 최대치 풀링을 위한 순전파 처리 메서드 재정의 ................................................... 401 9.4.18 최대치 풀링을 위한 역전파 처리 메서드 재정의 ................................................... 403 9.4.19 평균치 풀링을 위한 파라미터 생성 메서드 재정의 ................................................ 404 9.4.20 평균치 풀링 계층을 위한 순전파 처리 메서드 재정의 ............................................ 406 9.4.21 평균치 풀링 계층을 위한 역전파 처리 메서드 재정의 ............................................ 407 9.4.22 출력 형태 계산 함수 정의하기 .......................................................................... 408 9.4.23 건너뛰기 반영 함수 정의 ................................................................................. 409 9.4.24 출력 변형의 역처리 함수 정의하기 .................................................................... 410 9.4.25 은닉 계층 구성 정보 획득 함수 정의하기 ............................................................ 411
9.5 구현하기 : 더미 데이터셋 클래스 ................................................................................. 412 9.5.1 기반 클래스 파일 실행시키기 ............................................................................. 413 9.5.2 DummyDataset 클래스 선언 ........................................................................... 413
24
9.6 실행하기 : 인셉션 모델 .............................................................................................. 414 9.6.1 파일 불러오기와 데이터셋 객체 생성하기 ............................................................. 414 9.6.2 v3_preprop 매크로 정의하기 ........................................................................... 415 9.6.3 v3_inception1 매크로 정의하기 ....................................................................... 416 9.6.4 v3_resize1 매크로 정의하기 ............................................................................. 417 9.6.5 v3_inception2 매크로 정의하기 ....................................................................... 418 9.6.6 v3_resize2 매크로 정의하기 ............................................................................. 418 9.6.7 v3_inception3 매크로 정의하기 ....................................................................... 419 9.6.8 v3_postproc 매크로 정의하기 .......................................................................... 420 9.6.9 inception_v3 매크로로 정의하기 ...................................................................... 421 9.6.10 은닉 계층 구성 정보를 갖는 모델 객체 생성하기 .................................................. 422 9.6.11 파일 불러오기와 데이터셋 객체 생성하기 ........................................................... 423 9.6.12 인셉션-꽃 모델에서 사용하는 모듈 정의하기 ...................................................... 424 9.6.13 인셉션-꽃 모델 객체 만들기 ............................................................................ 426 9.6.14 model_flower_LA 객체 학습시키기 ................................................................ 427 9.6.15 model_flower_LAB로 학습하기 ..................................................................... 429
9.7 실행하기 : 레스넷 모델 .............................................................................................. 430 9.7.1 파일 불러오기와 데이터셋 객체 만들기 ................................................................ 430 9.7.2 VGG-19 모델 객체 만들고 구조 확인하기 .......................................................... 431 9.7.3 플레인-34 모델 객체를 만들고 구조 확인하기 ...................................................... 433 9.7.4 레지듀얼-34 모델 객체를 만들고 구조 확인하기 ................................................... 434 9.7.5 보틀넥-152 모델 객체를 만들고 구조 확인하기 .................................................... 437 9.7.6 레스넷-꽃 모델 학습을 위한 준비 ....................................................................... 439 9.7.7 레지듀얼 입력이 없는 플레인-꽃 모델로 학습하기 ................................................. 439 9.7.8 레지듀얼 입력을 갖는 레지듀얼-꽃 모델로 학습하기 .............................................. 442 9.7.9 보틀넥 블록을 이용하는 보틀넥-꽃 모델로 학습하기 .............................................. 444
9.8 마치며 .................................................................................................................... 445
25
CONTENTS
PART
IV 순환 신경망(RNN)
CHAPTER
10 기본 셀 순환 신경망 : 오토마타 문장 판별 신경망 10.1 시계열 데이터 ....................................................................................................... 450 10.2 순환 계층과 순환 벡터의 활용 ................................................................................... 451 10.3 순환 계층의 입출력 형태 ......................................................................................... 453 10.4 순환 계층을 위한 시계열 데이터의 표현 ...................................................................... 454 10.5 순환 계층의 순전파와 역전파 처리 ............................................................................. 456 10.6 오토마타를 이용한 수식 표현의 생성과 검사 ................................................................ 459 10.7 구현하기 : 간단한 순환 신경망 클래스 ........................................................................ 464 10.7.1 기반 클래스 파일 실행시키기 ........................................................................... 465 10.7.2 RnnBasicModel 클래스 선언하기 ................................................................. 465 10.7.3 순환 계층에 대한 파라미터 생성 메서드 정의하기 ................................................ 465 10.7.4 순환 계층에 대한 파라미터 순전파 메서드 정의하기 ............................................. 467 10.7.5 순환 계층에 대한 파라미터 역전파 메서드 정의하기 ............................................. 469
10.8 구현하기 : 오토마타 데이터셋 ................................................................................... 471 10.8.1 기반 클래스 파일 실행시키기 ........................................................................... 472 10.8.2 푸시다운오토마타 알파벳의 지정 ...................................................................... 472 10.8.3 푸시다운오토마타 문법 규칙의 지정 .................................................................. 473 10.8.4 푸시다운오토마타 파싱 테이블의 지정 ............................................................... 474 10.8.5 클래스 선언과 객체 초기화 메서드 및 속성 메서드 재정의 ..................................... 475 10.8.6 학습, 검증, 평가, 시각화 단계에 데이터를 공급하는 네 가지 메서드 재정의 ............... 476 10.8.7 문장 생성 함수 정의 ....................................................................................... 478 10.8.8 문장 검사 함수 정의 ....................................................................................... 479 10.8.9 오토마타 데이터셋을 위한 시각화 메서드 정의하기 .............................................. 481
26
10.9 실행하기 .............................................................................................................. 482 10.9.1 구현 파일 실행시키기 ..................................................................................... 482 10.9.2 데이터셋 객체와 신경망 모델 객체 생성 ............................................................. 482 10.9.3 순환 벡터 크기 4인 순환 신경망 모델 학습 ......................................................... 483 10.9.4 순환 벡터 크기 16인 순환 신경망 모델 학습 ....................................................... 484 10.9.5 순환 벡터 크기 64인 순환 신경망 모델 학습 ....................................................... 484 10.9.6 드롭다운 계층을 추가한 순환 신경망 모델 학습 ................................................... 485
10.10 마치며 ............................................................................................................... 487
CHAPTER
11 LSTM 순환 신경망 : 도시 소음 분류 신경망 11.1 순환 벡터와 기울기 정보의 소멸 및 폭주 ..................................................................... 490 11.2 LSTM의 구조와 동작 방식 ...................................................................................... 493 11.3 쌍곡탄젠트 함수 .................................................................................................... 496 11.4 LSTM 계층의 순전파와 역전파 처리 ......................................................................... 497 11.5 주파수 스펙트럼 분석을 이용한 음원 처리 ................................................................... 499 11.6 음원 분류 데이터셋 ................................................................................................ 500 11.7 구현하기 : LSTM 신경망 클래스 ............................................................................... 501 11.7.1 기반 클래스 파일 실행시키기 ........................................................................... 501 11.7.2 RnnLstmModel 클래스 선언하기 ................................................................... 502 11.7.3 LSTM 계층에 대한 파라미터 생성 메서드 정의하기 ............................................. 502 11.7.4 LSTM 계층에 대한 순전파 메서드 정의하기 ....................................................... 504 11.7.5 LSTM 계층에 대한 역전파 메서드 정의하기 ....................................................... 506
11.8 구현하기 : 음원 분류 데이터셋 .................................................................................. 509 11.8.1 기반 클래스 파일 실행시키기 ........................................................................... 510 11.8.2 클래스 선언과 객체 초기화 메서드 재정의 .......................................................... 510
27
CONTENTS
11.8.3 폴더 순회 및 캐시 파일 관리 함수의 정의 ........................................................... 511 11.8.4 주파수 스펙트럼 분석 함수의 정의 .................................................................... 513 11.8.5 도시 소음 데이터셋을 위한 시각화 메서드 정의 ................................................... 515 11.8.6 음원 파일에 대한 시각화 함수 정의하기 ............................................................. 516
11.9 실행하기 .............................................................................................................. 517 11.9.1 클래스가 선언된 파일들 실행시키기 .................................................................. 517 11.9.2 오토마타 비교실험 ......................................................................................... 517 11.9.3 도시 소음 분류 실험용 데이터셋 객체 생성하기 ................................................... 518 11.9.4 실험용 모델 객체 생성하기 .............................................................................. 519 11.9.5 작은 윈도우와 rnn 계층을 이용하는 도시 소음 분류 신경망의 학습 ......................... 520 11.9.6 작은 윈도우와 lstm 계층을 이용하는 도시 소음 분류 신경망의 학습 ........................ 521 11.9.7 상태 정보를 출력으로 이용하는 도시 소음 분류 신경망의 학습 ............................... 522 11.9.8 세 가지 도시 소음 분류 신경망의 추가 학습 ........................................................ 522 11.9.9 넓은 윈도우와 rnn 계층을 이용하는 도시 소음 분류 신경망의 학습 ......................... 524
11.10 마치며 ............................................................................................................... 525
CHAPTER
12 CNN과 RNN의 결합 : 장면 전환 판별 신경망 12.1 비순환 계층에서의 시계열 데이터 처리 ....................................................................... 528 12.2 동영상 처리를 위한 합성곱 신경망과 순환 신경망의 결합 ............................................... 530 12.3 출력 계층과 후처리 단계에서의 시계열 데이터 처리 ...................................................... 533 12.4 장면 전환 데이터셋 ................................................................................................ 534 12.5 실행 부담을 줄이는 방법들 ...................................................................................... 537 12.6 구현하기 : 확장된 순환 신경망 클래스 ........................................................................ 538 12.6.1 기반 클래스 파일 실행 .................................................................................... 538 12.6.2 RnnExtModel 클래스 선언 ............................................................................ 538
28
12.6.3 시계열 포장 계층에 대한 파라미터 생성 메서드 정의 ............................................ 538 12.6.4 시계열 포장 계층에 대한 순전파 메서드 정의 ...................................................... 540 12.6.5 시계열 포장 계층에 대한 역전파 메서드 정의 ...................................................... 541 12.6.6 출력 계층에서의 시계열 데이터 처리를 위한 파라미터 생성 메서드 재정의 ............... 542 12.6.7 출력 계층에서의 시계열 데이터 처리를 위한 순전파 메서드 재정의 ......................... 544 12.6.8 출력 계층에서의 시계열 데이터 처리를 위한 역전파 메서드 재정의 ......................... 545
12.7 구현하기 : 장면 전환 데이터셋 .................................................................................. 546 12.7.1 기반 클래스 파일 실행시키기 ........................................................................... 546 12.7.2 VideoShotDataset 클래스 선언과 기본 메서드들의 재정의 ................................. 547 12.7.3 캐시 생성 함수의 정의 .................................................................................... 548 12.7.4 캐시 적재 함수의 정의 .................................................................................... 550 12.7.5 데이터 공급 메서드 재정의 .............................................................................. 551 12.7.6 데이터 생성 메서드의 정의 .............................................................................. 552 12.7.7 장면 전환 데이터셋을 위한 시각화 메서드 정의 ................................................... 553 12.7.8 시계열 이진 판단 출력의 후처리를 위한 순전파 및 역전파 메서드 재정의 ................. 553 12.7.9 시계열 이진 판단 출력의 정확도와 추정치 변환 메서드 재정의 ............................... 555
12.8 실행하기 .............................................................................................................. 556 12.8.1 클래스가 선언된 파일들 실행시키기 .................................................................. 556 12.8.2 실험용 데이터셋 객체 생성하기 ........................................................................ 557 12.8.3 기본적인 장면 전환 신경망 학습 실험 ................................................................ 557 12.8.4 시계열 길이를 늘린 장면 전환 신경망 학습 실험 .................................................. 558 12.8.5 순환 계층을 연달아 배치한 장면 전환 신경망 학습 실험 ........................................ 560 12.8.6 이미지 처리 계층 구성을 강화한 장면 전환 신경망 학습 실험 ................................. 561 12.8.7 세 모델에 대한 추가 학습 ................................................................................ 562
12.9 마치며 ................................................................................................................. 564
29
CONTENTS
PART
V 고급 응용 신경망 구조들
CHAPTER
13 오토인코더 : 엠니스트 이미지 재현 및 분류 신경망 13.1 오토인코더의 구조 ................................................................................................. 568 13.2 지도학습과 비지도학습 ........................................................................................... 569 13.3 잡음 제거용 오토인코더 .......................................................................................... 571 13.4 유사 이진 코드 생성과 시맨틱 해싱 ............................................................................ 572 13.5 지도학습이 추가된 확장 오토인코더 모델 .................................................................... 574 13.6 확장 인코더 모델을 위한 엠니스트 데이터셋 ................................................................ 576 13.7 구현하기 : 확장 오토인코더 모델 클래스 ..................................................................... 577 13.7.1 기반 클래스 파일 실행시키기 ........................................................................... 577 13.7.2 Autoencoder 클래스 선언하기 ....................................................................... 578 13.7.3 오토인코딩 지원을 위한 파라미터 생성 메서드 재정의 .......................................... 578 13.7.4 오토인코딩 단계의 메인 학습 메서드 정의 .......................................................... 580 13.7.5 미니배치 단위의 오토인코딩 학습 메서드 정의 .................................................... 581 13.7.6 오토인코딩 순전파 처리 메서드 정의 ................................................................. 583 13.7.7 오토인코딩 역전파 처리 메서드 정의 ................................................................. 583 13.7.8 지도학습을 위한 순전파 처리 메서드 재정의 ....................................................... 584 13.7.9 지도학습을 위한 역전파 처리 메서드 재정의 ....................................................... 585 13.7.10 시맨틱 해싱을 위한 인덱싱 메서드 정의 ........................................................... 586 13.7.11 시맨틱 해싱을 위한 검색 메서드 정의 .............................................................. 587 13.7.12 시각화 메서드 재정의 ................................................................................... 588
13.8 구현하기 : 오토인코더를 위한 엠니스트 데이터셋 ......................................................... 589 13.8.1 기반 클래스 파일 실행시키기 ........................................................................... 589 13.8.2 AutoencodeDataset 클래스 선언 .................................................................. 590
30
13.8.3 MnistAutoDataset 클래스 선언 ..................................................................... 591 13.8.4 세 가지 시각화 메서드 정의 ............................................................................. 591
13.9 실행하기 .............................................................................................................. 593 13.9.1 클래스가 선언된 파일들 실행시키기 .................................................................. 593 13.9.2 실험용 데이터셋 객체 생성하기 ........................................................................ 594 13.9.3 전체 레이블 정보를 이용한 다층 퍼셉트론 모델 학습 ............................................ 594 13.9.4 부족한 레이블 정보를 이용한 다층 퍼셉트론 모델 학습 ......................................... 595 13.9.5 확장 오토인코더를 이용한 엠니스트 분류 모델 학습 ............................................. 596 13.9.6 지도학습 시 인코더 학습을 동결시킨 확장 오토인코더 모델 학습 ............................ 598 13.9.7 인코더와 디코더 구성을 강화한 확장 오토인코더 모델 학습 ................................... 599 13.9.8 중간 코드 폭을 축소시킨 확장 오토인코더 모델 학습 ............................................ 600 13.9.9 시맨틱 해싱 모델 학습 .................................................................................... 602 13.9.10 모델 구성을 강화한 시맨틱 해싱 모델 학습 ....................................................... 603 13.9.11 추가 학습을 통한 시맨틱 해싱 기능의 확인 ....................................................... 604
13.10 마치며 ............................................................................................................... 605
CHAPTER
14 인코더-디코더 : 엠니스트 이미지 숫자 읽기 신경망 14.1 인코더-디코더의 구조 ............................................................................................ 608 14.2 인코더-디코더와 언어 처리 ...................................................................................... 609 14.3 필기체 숫자 이미지를 영어로 읽기 ............................................................................. 610 14.4 필기체 숫자 이미지열을 한글로 읽기 .......................................................................... 611 14.5 인코더-디코더의 분리 학습 문제 ............................................................................... 613 14.6 구현하기 : 인코더-디코더 모델 클래스 ....................................................................... 614 14.6.1 기반 클래스 파일 실행시키기 ........................................................................... 614 14.6.2 EncoderDecoder 클래스 선언하기 ................................................................ 614
31
CONTENTS
14.6.3 파라미터 생성 메서드 재정의 ........................................................................... 615 14.6.4 학습 모드 제어를 위한 여러 가지 메서드 정의 ..................................................... 616 14.6.5 학습 모드별 알맞은 처리를 위한 순전파 메서드 재정의 ......................................... 618 14.6.6 학습 모드별 알맞은 처리를 위한 역전파 메서드 재정의 ......................................... 619 14.6.7 콘텍스트 벡터 내용 확인을 위한 시각화 메서드 재정의 ......................................... 620
14.7 구현하기 : 인코더-디코더를 위한 엠니스트 데이터셋 .................................................... 621 14.7.1 기반 클래스 파일 실행시키기 ........................................................................... 621 14.7.2 EndecDataset 클래스 선언 ........................................................................... 621 14.7.3 콘텍스트 벡터 포함을 위한 데이터 뒤섞기 메서드 재정의 ...................................... 623 14.7.4 후처리 단계를 위한 순전파 메서드 재정의 .......................................................... 624 14.7.5 후처리 단계를 위한 역전파 메서드 재정의 .......................................................... 625 14.7.6 후처리 단계를 위한 정확도 산출 메서드 재정의 ................................................... 626 14.7.7 중간 점검 출력 메서드 재정의 .......................................................................... 627 14.7.8 MnistEngDataset 클래스 선언 ...................................................................... 628 14.7.9 중간 코드 및 출력 생성 메서드 정의 .................................................................. 629 14.7.10 시각화 메서드 재정의 ................................................................................... 630 14.7.11 엠니스트 데이터 적재 함수 재정의 .................................................................. 631 14.7.12 MnistKorDataset 클래스 선언 ..................................................................... 631 14.7.13 숫자를 이미지열로 변환하는 함수의 정의 ......................................................... 633 14.7.14 숫자를 한글 읽기 표현으로 변환하는 메서드 정의 .............................................. 634 14.7.15 시각화 메서드 재정의 ................................................................................... 635
14.8 실행하기 .............................................................................................................. 636 14.8.1 클래스가 선언된 파일들 실행시키기 .................................................................. 636 14.8.2 영어 읽기 실험용 데이터셋 객체 생성하기 .......................................................... 637 14.8.3 베이스라인 영어로 읽기 신경망 학습 ................................................................. 637 14.8.4 배치 정규화를 이용한 성능 향상 ....................................................................... 639
32
14.8.5 인코더-디코더의 2단계 분리 학습을 이용한 비교 실험 ......................................... 640 14.8.6 인코더-디코더의 3단계 분리 학습을 이용한 비교 실험 ......................................... 641 14.8.7 두 자리 숫자 이미지를 한글로 읽는 신경망 모델 학습하기 ..................................... 642 14.8.8 세 자리 숫자 이미지를 한글로 읽는 신경망 모델 학습하기 ..................................... 644 14.8.9 네 자리 숫자 이미지를 한글로 읽는 신경망 모델 학습하기 ..................................... 645
14.9 마치며 ................................................................................................................. 647
CHAPTER
15 생성적 적대 신경망 : 회화 및 숫자 이미지 생성 신경망 15.1 생성적 적대 신경망의 구조 ...................................................................................... 650 15.2 생성적 적대 신경망과 데이터 생성 ............................................................................. 651 15.3 생성적 적대 신경망의 순전파와 역전파 처리 ................................................................ 652 15.4 구현하기 : 생성적 적대 신경망 모델 클래스 ................................................................. 654 15.4.1 기반 클래스 파일 실행시키기 ........................................................................... 655 15.4.2 Gan 클래스 선언하기 .................................................................................... 655 15.4.3 파라미터 생성 메서드 재정의 ........................................................................... 655 15.4.4 미니배치 학습 메서드 재정의 ........................................................................... 657 15.4.5 판별기 학습 메서드 정의 ................................................................................. 658 15.4.6 생성기 학습 메서드 정의 ................................................................................. 659 15.4.7 판별기에 대한 순전파 및 역전파 처리 메서드 정의 ............................................... 660 15.4.8 생성기에 대한 순전파 및 역전파 처리 메서드 정의 ............................................... 661 15.4.9 파라미터 수정 메서드 재정의 ........................................................................... 662 15.4.10 정확도 계산 메서드 재정의 ............................................................................ 662 15.4.11 시각화 메서드 재정의 ................................................................................... 664
15.5 구현하기 : 생성적 적대 신경망을 위한 데이터셋 ........................................................... 664 15.5.1 기반 클래스 파일 실행시키기 ........................................................................... 665
33
CONTENTS
15.5.2 GanDataset 클래스 선언 .............................................................................. 665 15.5.3 GanDataset 클래스의 시각화 메서드 정의 ....................................................... 665 15.5.4 GanDataset 클래스의 출력 메서드 재정의 ....................................................... 666 15.5.5 GanDatasetPicture 클래스 선언 . .................................................................. 667 15.5.6 GanDatasetMnist 클래스 선언 ...................................................................... 669
15.6 실행하기 .............................................................................................................. 670 15.6.1 클래스가 선언된 파일들 실행시키기 .................................................................. 670 15.6.2 실험용 회화 이미지 데이터셋 객체 생성하기 ....................................................... 671 15.6.3 서양화가 고흐를 흉내 내는 생성적 적대 신경망 학습 ............................................ 672 15.6.4 동양화가 정선을 흉내 내는 생성적 적대 신경망 학습 ............................................ 673 15.6.5 실험용 엠니스트 데이터셋 객체 생성하기 ........................................................... 674 15.6.6 두 가지 숫자 이미지를 흉내 내는 생성적 적대 신경망 학습 .................................... 675 15.6.7 아담 알고리즘을 이용하지 않을 때의 생성적 적대 신경망 학습 ............................... 676 15.6.8 아담 알고리즘을 이용할 때의 생성적 적대 신경망 학습 ......................................... 677 15.6.9 모든 숫자를 흉내 내는 생성적 적대 신경망 학습하기 ............................................ 678
15.7 마치며 ................................................................................................................. 679 찾아보기 ........................................................................................................................
34
680
CHAPTER
0
들어가기
0장 들어가며
35
이 책은 딥러닝 알고리즘에 기반을 둔 각종 신경망을 구현하는 방법을 소개한다. 딥러닝 알고 리즘의 원리와 각종 신경망의 특성을 심도 있게 다루면서도 실제 동작하는 예제들을 제시한다. 시중 많은 책이 딥러닝을 간단히 소개하고 프레임워크 기반 예제를 보여준다. 이런 책으로 공 부하면 빠르게 구현해 신경망 작동을 확인할 수 있어 공부하는 맛도 난다. 그런데 막상 딥러닝 알고리즘을 이용해 실제로 이용할 신경망 프로그램을 작성하다 보면 어느 순간 막히게 된다. 실전에는 더 깊은 지식이 필요하기 때문이다. 프레임워크로 빠르게 딥러닝을 배우는 책은 이미 많다. 반면 이 책은 기존 책과 다르게 프레임 워크를 버리고 파이썬 날코딩으로 딥러닝을 배운다. 다른 책이 채워주지 못하는 더 깊은 이야 기를 제대로 담으려면 파이썬 날코딩이어야 하기 때문이다. 그래서 이 책은 상대적으로, (어쩌 면 굉장히) 어렵다. 행여 프레임워크로 배우는 책을 업신여기거나 깍아내리려는 의도로 오해하지는 말자. 기존 책 과 이 책은 상호보완적이라는 말을 하고 싶은 거다. 아무쪼록 각자의 신경망 프로젝트 구현에 필요한 구체적인 딥러닝 동작 원리와 구현 방법을 속 속들이 알아 가기 바란다.
0.1 이 책의 구성 이 책은 5부, 15장으로 구성되어 있다. 각 장은 주제를 소개하고 나서 신경망을 구현하고 실험 한다. 다루는 딥러닝 알고리즘은 점진적으로 난도가 올라간다. 각 장에서 다루는 주제의 연결 관계는 다음과 같다.
36
파이썬 날코딩으로 알고 짜는 딥러닝
그림 이 책에서 구현하는 예제 프로그램
단층 퍼셉트론
회귀 분석 출력
이진 판단 출력
선택 분류 출력
1장. Abalone
2장. Pulsar
3장. Steel
객체지향 구조
복합 출력, 아담 알고리즘
4장. Mlp
5장. MlpModel
6장. AdamModel
합성곱 계층, 풀링 계층
정규화 기법
거대 심층 구조
7장. CnnBasicModel
8장. CnnRegModel
9장. CnnExtModel
단순 순환 계층
LSTM
CNN + RNN
10장. RnnBasicModel
11장. RnnLstmModel
12장. RnnExtModel
오토인코더
인코더-디코더
생성적 적대 신경망
13장. Autoencoder
14장. EncoderDecoder
15장. Gan
은닉계층 다층 퍼셉트론
합성곱 신경망
순환 신경망
고급 응용 구조
점선 상자는 함수 정의 방식으로 구성된 예제 프로그램을, 점선 화살표는 주피터 노트북이 제 공하는 외부 파일 실행 기능을 이용한 함수 수준의 코드 재활용 관계를 나타낸다. 실선 상자는 객체지향 방식으로 작성한 예제 프로그램을, 실선 화살표는 상속 관계를 이용한 클래스 수준의 코드 재활용을 의미한다.
5장에서 MlpModel 클래스를 처음 정의한 후 12장까지는 파생 클래스를 차례로 정의해 확장해 가는 방식으로 기능을 구현한다. 또한 13장부터는 여러 서브 신경망이 역할을 분담해 새로운 고급 기능을 수행하는 응용 구조를 소개한다. 각 장에서 사용하는 데이터셋 관련 클래스의 관계는 다음과 같다.
0장 들어가며
37
그림 이 책의 예제에서 이용하는 데이터셋
5장
AbaloneDataset
K
1,2 ,3, 4장
PulsarDataset Dataset
K
PulsarSelectDataset SteelDataset
K
FlowersDataset
K
7, 8, 9장
7장 6장
Office31Dataset
9장
DummyDataset
10장
AutomataDataset
11장
UrbanSoundDataset
캐시
K
12장
VideoShotDataset
캐시
동영상
13장 14장
AutoencoderDataset
EndecDataset
O
MnistAutoDataset MnistEngDataset MnistKorDataset
15장
GanDataset
M
GanMnistDataset GanPictureDataset
회화
4장까지는 캐글에서 구한 세 가지 데이터셋을 클래스 선언 없이 직접 이용한다. 5장에서 데이 터셋 관련 기본 기능을 모아 Dataset 클래스로 정의한 후 여기에서 파생된 많은 클래스들을 정의해 다양한 데이터를 다루면서 응용 문제를 풀어나간다. ‘K’로 표시된 다섯 원통 모양은 캐글 데이터셋을 의미하여 ‘O’와 ‘M’으로 표시된 두 원통 모양은 연구용으로 공개된 다른 데이터셋이다. 또한 ‘동영상’, ‘회화’로 표시된 데이터는 저작권 시한이 만료된 영화 동영상이나 회화 이미지 파일이다. DummyDataset, AutomataDataset의 두 가지 데이터셋 클래스는 외부 데이터 없이 직접 데이터를 생성한다.
38
파이썬 날코딩으로 알고 짜는 딥러닝
한편 11장과 12장의 데이터는 용량이 매우 큰 데다가 데이터 적재 과정에서 주파수 스펙트럼 분석이나 이미지 추출 및 크기 변형 같은 전처리 작업이 필요하다. 따라서 다양한 실험이 용이 하도록 캐시 파일을 생성해 이용하는 방법을 통해 데이터셋 준비 과정에서의 반복 작업을 줄이 기도 한다. 저자 깃허브(github.com/konantechnology/academy.alzza)의 데이터 폴더에는 단원별 로 필요한 데이터를 구하고 배치하는 방법이 소개되어 있다. 또한 용량이 작은 일부 테이터의 경우 직접 데이터 파일을 제공하기도 한다. 예제들은 주피터 노트북의 코드 블록 단위로 쪼개서 소개한다. 각 코드 블록은 학습하기 적당 한 분량이며 어느 정도의 독립성과 완결성을 갖는다.
0.2 인공지능과 머신러닝, 딥러닝 신경망을 구현하는 방법을 본격적으로 다루기 전에 간략히 인공지능 전반에 대해 살펴보자. 먼 저 인공지능, 머신러닝, 딥러닝 관계부터 정리해보자. 그림 딥러닝 관련 용어들의 포함 관계
딥러닝
머신러닝 (기계학습)
인공지능
가장 큰 개념은 인공지능이다. 인공지능은 사람의 지능과 비슷한 역할을 수행하는 소프트웨어 를 말한다. 인공지능을 만들려는 시도는 크게 ‘지식 기반 접근’과 ‘데이터 기반 접근’으로 나뉜다. 인공지능 연구 초기에 주류였던 ‘지식 기반 접근’은 문제 영역의 지식을 기호로 표현해 풀어내는 방식이다. 초창기 열악한 컴퓨팅 환경을 고려할 때 핵심 지식을 추출하여 문제를 해결하려는 시 도가 주를 이룬 것은 당연하다. 하지만 이런 접근은 전문가가 갖는 풍부하고 섬세하며 때로 추
0장 들어가며
39
상적이거나 막연하기까지 한 전문지식을 모순 없이 기호로 표현하는 일에서 큰 난관에 봉착했 고, 기호로 표현된 지식을 자동 처리해 문제를 풀어내는 일에서도 많은 어려움을 겪었다. 머신러닝으로 통칭되는 ‘데이터 기반 접근 방식’에서는 프로그램이 직접 데이터를 분석하여 숨 어 있는 규칙이나 패턴을 포착해 문제를 해결한다. 데이터로부터 규칙이나 패턴을 획득하는 과 정을 학습이라고 하는데 이 학습 과정을 프로그램이 직접 수행하기 때문에 기계학습, 즉 머신 러닝이라고 부른다. 머신러닝이 제대로 작동하려면 통계나 확률을 기초로 한 학습 알고리즘과 대량의 데이터, 막대한 컴퓨팅 파워가 필요하다. 하지만 전문가로부터 지식을 추출하는 어려운 과정 없이도 인공지능을 실현할 수 있다는 장점이 있다. 딥러닝은 머신러닝의 한 방법이다. 동물의 신경세포를 흉내 낸 퍼셉트론을 단위로 삼아 구성한 신경망 구조를 이용해 학습을 수행하고 문제를 풀어낸다. 인공지능 초창기부터 연구가 진행되 었지만 오랫동안 머신러닝 안에서조차 변방에 머물렀다. 2000년대 들어 연구에 여러 가지 돌 파구가 만들어지고 2010년 무렵부터 여러 성공적인 결과를 얻었다. 특히 2016년 3월 알파고 와 이세돌의 바둑 대결이 딥러닝의 이름을 널리 알리는 계기가 되었다. 딥러닝은 이제 인공지 능 분야의 대표주자로 세상에 널리 알려진 채 발전의 발걸음을 계속하고 있다.
0.3 동물의 신경세포, 뉴런 인공 신경망은 동물의 신경세포인 뉴런을 흉내 내어 고안한 퍼셉트론 단위로 구성된다. 따라서 신경세포 뉴런에 대해 잠시 살펴보자. 뉴런은 정보 전달용 신경세포다. 구조는 다음과 같다. 그림 뉴런 세포의 구조 가지돌기
축삭 축삭
시냅스
40
파이썬 날코딩으로 알고 짜는 딥러닝
가지돌기
뉴런은 세포체 주변에 돋은 가지돌기들을 통해 다른 뉴런들로부터 전기 신호를 받아들인다. 이 때 전기 신호는 시냅스라는 화학적 연결 부위를 통해 전달되는데 시냅스 발달 정도에 따라 같 은 신호라도 더 강하게 전달된다. 시냅스 연결 부위는 사용 빈도에 따라 커졌다가 작아졌다가 하며 심지어 시냅스 자체가 사라지기도 한다. 한편 뉴런은 각 가지돌기로부터 전달된 전기 신 호들로부터 자신의 출력 신호를 만들어낸다. 그런데 이 신호는 단순히 입력 신호값의 합이 아 니며 이른바 비선형 방식으로 결정된다. 예를 들어 합이 어떤 임곗값 이상이면 활성 상태, 임곗 값 미만이면 비활성 상태가 되어 두 가지 서로 다른 값 가운데 하나를 출력하는 디지털 방식으 로 동작하는 것이다. 이렇게 비선형으로 만들어진 뉴런의 전기 신호는 축삭돌기와 축삭돌기에 무수히 붙은 가지돌 기를 통해 다른 뉴런에 전달된다. 축삭은 전기 신호를 빠르게 전달하는 세포 안의 전도체이며 길게 뻗은 축삭돌기는 길이가 보통 1mm나 된다. 세포 평균 크기가 17㎛임을 고려하면 이런 축삭돌기를 갖는 뉴런은 대단히 긴 세포다. 사람의 좌골신경 축삭은 척추 끝에서 엄지발가락 끝부분까지 연결되어 그 길이가 1m 이상인 경우도 있다. 초기 뉴런은 신호를 전달하는 간단한 선형 신경망 형태로 연결되었다. 동물의 진화 과정에서 많은 신경세포가 한곳에 모여 복잡하게 연결된 채 정보를 처리하는 덩어리, 즉 신경절이 나타 났고 신경절이 더욱 커진 뇌로 발전했다. 특히 척추동물은 튼튼한 파이프 형태로 신경다발을 둘러싸 보호하는 등뼈, 즉 척추를 몸의 기둥으로 삼으면서 척추 한끝에 뇌를 갖는 복잡하고 정 교한 신경계를 구성했다. 뇌는 고도로 밀집된 신경 세포의 복잡한 연결망으로서 정보를 종합적 으로 처리하는 능력을 갖춘다. 또한 척추 각 마디에서 뻗어 나가 온 몸의 장기와 사지를 연결된 신경망 덕분에 척추동물은 신체를 잘 모니터링하고 제어할 수 있다. 잘 발달한 뇌는 매우 유용하지만 에너지를 많이 소모하는 값비싼 기관이기도 하다. 인류는 몸 전체 에너지의 20%를 뇌에서 소비한다. 그래서인지 멍게는 자리를 잡아 고착생활을 시작하면 유충 시절에 존재하던 뇌를 스스로 먹어 치운다.
0장 들어가며
41
0.4 인공 신경망의 기본 유닛, 퍼셉트론 1957년 미국의 로젠블랫은 동물의 신경세포인 뉴런을 모델 삼아 퍼셉트론 구조를 처음 개발했 다. 인공 신경망을 구성하는 기본 단위가 되는 퍼셉트론 구조는 아래 그림과 같다. 그림 퍼셉트론의 구조 입력
x1
가중치
x2
w2
x3
w1 w3
합산
비선형 함수
f
∑
출력
⋮
wn
w0
⋮
xn
x0
편향
퍼셉트론의 구조를 앞서 소개한 뉴런의 구조와 연결지어 살펴보자. 먼저 퍼셉트론에 주어지는 입력 x1, ..., xn은 다른 뉴런들로부터 전달되는 전기 신호에 해당한다. 각 입력 항에 곱해지는 가중치 w1, ..., wn은 뉴런 연결 부위에 형성된 시냅스의 발달 정도에 해당한다. xiwi값들을 합 산하는 ∑(시그마) 처리는 각 수상돌기로부터 들어오는 전기 신호들이 뉴런 세포체 안에서 합 해지는 과정에 해당한다. 이 밖에 뉴런에는 표시되지 않았지만 외부 입력과 별도로 주어지는 미리 정해진 입력값 x0와 가중치 w0는 흔히 편향(바이어스)이라고 불리는 요소다. x0w0를 함 께 묶어 b라는 하나의 값으로 나타내기도 한다. 비선형 함수 f ()는 활성화 함수라고도 불린다. 뉴런 세포체가 단순히 입력 전기 신호를 합한 값을 출력으로 삼지 않고 나름의 처리를 거쳐 출 력값을 결정하는 것처럼 퍼셉트론의 활성화 함수도 ∑에서 구한 값에 적절한 비선형 함수를 적 용하여 퍼셉트론 단위에서 최종 출력을 결정한다. 결국 퍼셉트론의 출력은 y =f (x1w1 + ... +
xnwn + b)로 계산되며 딥러닝 알고리즘에서 퍼셉트론을 이용한다는 말은 이런 계산식을 이용 해 입력으로부터 출력을 구한다는 것을 의미한다. 이 간단한 퍼셉트론이 뉴런의 복잡한 기능을 온전히 표현한다고 말할 수는 없다. 하지만 이런 퍼셉트론을 이용해 다양한 구조의 신경망을 구성하고 퍼셉트론 안의 가중치와 편향값을 알맞 게 조정함으로써 인공지능 분야의 여러 문제를 풀어나가고 있다.
42
파이썬 날코딩으로 알고 짜는 딥러닝
0.5 딥러닝을 위한 수학 수학을 이용하면 생각을 정확하고 간결하게 표현할 수 있다. 복잡한 문제를 간명하고 효율적으 로 처리할 수도 있다. 수학의 이런 힘은 딥러닝에서 특히 두드러진다. 따라서 딥러닝 알고리즘 을 깊게 이해하려면 약간의 수학 지식이 필요하다. 물론 수학을 깊이 있게 알지 못해도 이 책을 읽는 데 큰 지장은 없다. 이 책에서 다루는 수학 분야를 간단히 알아보자.
0.5.1 선형대수학 선형대수학은 선형 함수와 비선형 함수의 이해에 도움을 주며 벡터나 행렬 같은 텐서를 다루는 방법을 알려준다. 텐서는 프로그램에서 다차원 배열 형태로 저장되는 다양한 데이터 뭉치를 통 칭하는 용어다. 벡터는 일차원 텐서, 행렬은 이차원 텐서인 셈이다. 텐서를 잘 이용하면 딥러닝 알고리즘의 복잡한 처리들을 간단히 표현할 수 있을뿐 아니라 효율 적으로 처리할 수 있다. 파이썬의 수치 연산 라이브러리 등이 텐서 연산에 최적화되어 있기 때 문이다. 특히 GPU가 장착된 환경에서는 텐서를 이용하지 않고는 장치의 이점을 살릴 수 없다. 딥러닝에서 텐서의 중요성은 텐서플로 같은 대표적인 딥러닝 프레임워크들의 이름만 보아도 알 수 있다.
0.5.2 미분적분학 미분과 적분은 세상의 많은 현상을 이해하는 데 큰 도움을 준다. 딥러닝에서는 미분, 특히 편미 분이 중요하다. 원하는 동작을 하도록 퍼셉트론 가중치를 조금씩 바꾸는 학습 과정이 편미분을 이용한 역전파 처리로 이루어지기 때문이다. 편미분은 복잡한 미분 문제를 간단하게 푸는 쉬운 방법이다. 입력 변수가 여럿인 함수를 하나 의 입력 변수에 대해 미분할 때 나머지 입력 변수를 상수로 취급해 그 영향을 무시한 채 처리한 다. 반면에 편미분이 아닌 정통 미분법에 해당하는 전미분은 다른 입력 변수를 통한 간접적인 영향까지 모두 계산에 넣는다. 딥러닝에서는 다행히 전미분을 이용할 필요 없이 편미분만으로 학습한다. 참고로 이 책의 예제에서는 다양한 수학적 함수의 편미분 문제를 실제로 다루게 되는데 이는
0장 들어가며
43
텐서플로 같은 프레임워크에서는 접하기 어렵다. 프레임워크에서는 편미분을 이용하는 역전파 학습 과정을 내부에서 처리하기 때문이다.
0.5.3 확률통계론 데이터를 학습하여 특성을 파악하고 비슷한 문제에 답하는 딥러닝 알고리즘의 동작 방식은 경 험적이고 귀납적인 추론 방식에 해당한다. 또한 딥러닝 알고리즘이 답을 만들어내는 과정은 수 학적으로는 조건부 확률 분포의 추정에 해당한다. 이런 내용을 다루는 수학 분야가 확률통계론 이다. 조건부 확률 분포의 추정이라는 말만 간단히 짚고 가자. 오지선다형 객관식 문제를 푼다고 가정하자. 정확하게 알고 정답을 고르는 경우도 있겠지만 백 퍼센트 확신이 없는 상태에서 가장 그럴듯한 항목을 고르는 경우도 있다. 즉 오지선다형 문제 는 다섯 항목 각각이 정답일 가능성을 나름대로 짐작해서 그중 가능성이 가장 높은 항목을 선 택하는 과정이다. 이는 수학적으로는 정답의 확률 분포를 추정한 후 가장 높은 확률의 항을 선 택하는 과정이다. 이때 문제에 따라 각 항목의 정답 가능성이 달라지므로 조건부 확률 분포 추 정인 것이다. 반면에 공부를 전혀 안 한 탓에 연필을 굴리거나 모두 3번을 찍는다면 이는 문제 내용에 영향을 받지 않는 무조건적 확률 분포 추정에 해당한다. 딥러닝 알고리즘으로 풀어야 하는 문제 중에는 직접 값을 계산해야 할 때도 있지만 여러 후보 중에 하나를 고르는 경우가 더 많다. 그래서 답을 고르는 조건부 확률 분포 추정이 중요하다.
0.6 예제 실습 환경 소개 이 책의 모든 예제 프로그램은 주피터 노트북과 파이썬 실행 환경만 준비하면 직접 입력해 실 행시켜 볼 수 있다. 또한 저자의 깃허브에서 예제 프로그램들을 주피터 노트북 파일 형태로 다 운로드받아 실행시켜볼 수도 있다. 파이썬과 주피터 노트북 설치는 깃허브에 수록된 설치 안내 파일을 참고하자. ●●
44
github.com/konantechnology/academy.alzza
파이썬 날코딩으로 알고 짜는 딥러닝
모든 예제는 누락되거나 감추어진 부분 없이 완결된 프로그램으로 제공된다. 손쉽게 실험 내용 을 재현해 확인할 수 있으면서 자유롭게 변형시켜 가면서 실험할 수도 있다. 예제 프로그램에는 다섯 가지 캐글 데이터셋을 비롯하여 여러 가지 데이터셋을 이용한다. 이 들 데이터셋은 각 장에 명시된 사이트에서 직접 다운로드받아 설치하는 것을 원칙으로 한다. 대부분의 데이터셋이 깃허브의 용량 제한을 초과하고 있어서 작은 용량만 차지하는 일부 단원 의 데이터셋 말고는 깃허브에 올려놓을 수가 없었기 때문이다. 다만 깃허브 사이트의 /data/
chap01~chap15 폴더에 데이터셋 접근 경로와 함께 다운로드받은 데이터 파일들을 어떻게 배치해야 탈 없이 실험을 수행할 수 있는지를 명시해 놓았으니 참고하기 바란다.
0.7 마치며 퍼셉트론 하나하나는 쓸모있는 일을 하기에 너무 작고 간단한 구조다. 하지만 인간의 뇌가
1000억 개가 넘는 뉴런으로 구성되듯이 많은 수의 퍼셉트론이 조직적으로 연결되어 함께 동작 하면 작고 간단한 구조에서 상상하기 어렵던 놀라운 능력을 발휘할 수 있다. 이 책은 그런 놀라 운 경험들을 여러분과 함께할 것이다. 하지만 성능에 대한 너무 큰 기대는 하지 말기 바란다. 높은 성능을 내려면 풍부하고 질 좋은 데이터를 확보하는 수고, 적절한 모델 구성을 찾는 시행착오, 하이퍼파라미터값을 조정하는 반 복 실험이 모두 필요하기 때문이다. 깊고 거대한 모델 규모와 방대한 데이터, 많은 학습 횟수 또한 날로 중요해지고 있다. 그럴수록 계산 용량과 시간이 더 든다. 그러한 이유로 이 책은 완성된 딥러닝 신경망을 보여주지 않는다. 이 책을 다양한 형태의 딥러 닝 모델을 개발하고 성능을 향상시키는 긴 과정의 출발점으로 삼기 바란다.
0장 들어가며
45
Part
I
단층 퍼셉트론(SLP)
1부에서는 가장 기본적인 신경망 연결 구조인 단층 퍼셉트론(single layer perceptrons, SLP)을 소개하 고 기본적인 신경망 출력 형태인 회귀 분석(regression analysis), 이진 판단(binary decision), 선택 분 류(selective classify)를 살펴본다. 다루는 내용 ●
회귀 분석을 이용한 전복 고리 수 추정 신경망
●
이진 판단을 이용한 천체의 펄서(pulsar, 회전하는 중성자별) 여부 판정 신경망
●
선택 분류를 이용한 철판 재료의 불량 유형 분류 신경망
0장 들어가며
47
Part I
단층 퍼셉트론(SLP)
1장
회귀 분석 : 전복의 고리 수 추정 신경망
2장 이진 판단 : 천체의 펄서 여부 판정 신경망 3장
선택 분류 : 철판 불량 상태 분류 신경망
48
파이썬 날코딩으로 알고 짜는 딥러닝
CHAPTER
1
회귀 분석 : 전복의 고리 수 추정 신경망
1장 회귀 분석 : 전복의 고리 수 추정 신경망
49
전복 나이를 알아내는 데 이용하는 껍질의 고리 수를 추정하는 회귀 분석 신경망을 만들어보 자. 신경망은 단층 퍼셉트론으로 구현하며, 캐글의 아발로니 데이터셋을 활용한다. 실습을 하기에 앞서 아발로니 데이터셋을 내려받아두자. ●●
아발로니 데이터셋 : www.kaggle.com/rodolfomendes/abalone -dataset
이 장에서 다루는 내용은 다음과 같다. 1 단층 퍼셉트론 신경망의 구조 2 텐서 연산, 미니배치, 하이퍼파라미터, 원-핫 벡터 표현 3 신경망의 세 가지 기본 출력 유형 4 회귀 분석, 평균제곱오차(MSE ) 손실 함수 5 경사하강법, 역전파, 편미분, 손실 기울기 6 전복 고리 수 추정 신경망 구현과 실행
1.1 단층 퍼셉트론 신경망 구조 단층 퍼셉트론은 다음 그림처럼 일련의 퍼셉트론을 한 줄로 배치하여 입력 벡터 하나로부터 출 력 벡터 하나를 단번에 얻어내는 가장 기본적인 신경망 구조다. 그림 단층 퍼셉트론의 신경망 구조
x x1
y
w11
…
P1
x2 P2 x3
… x4
50
w43
1부 단층 퍼셉트론(SLP)
y1 b1 y2 b2
P3 b3
y3
입력 벡터로부터 출력 벡터를 얻어내려면 출력 벡터의 크기, 즉 출력 벡터가 담고 있어야 할 스 칼라 성분의 수만큼의 퍼셉트론이 필요하다. 그림에서 P1, P2, P3은 크기 3의 출력 벡터를 만들 어내기 위한 퍼셉트론들을 나타내며 이들 퍼셉트론 사이에는 어떤 연결도 없어서 서로 영향을 주고받을 수 없다. 이들 퍼셉트론은 저마다의 가중치 벡터와 편향값을 이용하여 입력 벡터 x로 부터 출력 벡터 y를 도출한다. 예를 들어 첫 번째 퍼셉트론 P1은 가중치 벡터 (w11, w21, w31, w41)과 편향값 b1을 이용해 입 력 x1, x2, x3, x4로부터 y1 =x1w11 +x2w21 +x3w31 +x4w41 +b1을 계산해 출력하며 P2나 P3도 같은 방식으로 y2와 y3을 계산한다. 이처럼 단층 퍼셉트론에서 퍼셉트론들은 입력 벡터만 공유할 뿐 각자의 가중치 벡터와 편향값 에 따라 각자의 방식으로 독립적인 정보를 따로따로 생산한다. 한편 이들 퍼셉트론의 가중치 벡터들을 한데 모은 것이 가중치 행렬 W이고 편항값들을 한데 모은 것이 편향 벡터 b이다. 그 리고 실제 퍼셉트론들의 계산은 가중치 행렬과 편향 벡터를 이용하여 한꺼번에 처리하게 된다. 참고로 학습 과정 중에 끊임없이 변경되어 가면서 퍼셉트론의 동작 특성을 결정하는 값들을 파라미 터parameter라고 한다. 가중치와 편향은 대표적인 파라미터다. 딥러닝 학습 목표는 한마디로 문제
풀이에 적합한 파라미터값의 조합을 구하는 것이다. 파라미터를 모델 파라미터model parameter라 고 부르기도 하는데 이는 뒤에 소개할 하이퍼파라미터hyperparameter와 확실하게 구분하는 용도로 사용한다. 퍼셉트론들끼리 서로 영향을 주고받을 수 없기 때문에 단층 퍼셉트론 신경망으로 높은 수준의 문제 해결 능력을 기대하기 어렵다. 이에 따라 입력을 일차 처리하여 그 결과를 최종 출력을 생 성할 퍼셉트론 열에 제공하는 새로운 퍼셉트론 열들을 신경망에 추가하기도 한다. 딥러닝에서 는 퍼셉트론 열을 계층layer이라고 부르는데 최종적으로 출력을 생성하는 계층을 출력 계층이라 고 한다. 출력 계층 앞에서 입력을 처리하여 그 결과를 출력 계층에 전달하는 계층을 은닉 계층 이라고 부른다. 따라서 단층 퍼셉트론은 은닉 계층 없이 출력 계층 하나만으로 구성되는 가장 간단한 신경망 구조다. 출력 계층 앞에 은닉 계층을 갖는 다층 퍼셉트론은 3장에서 살펴본다.
1장 회귀 분석 : 전복의 고리 수 추정 신경망
51
입력 계층에 대하여 입력 벡터 x를 제공하는 부분을 입력 계층이라고 부르는 경우가 있는데 논란의 여지가 있다. 입 력 벡터는 독립적인 퍼셉트론 열에서 생산되는 것이 아니라 학습 데이터로부터 얻어져 직접 출 력 계층 혹은 은닉 계층에 제공되기 때문이다. 인간의 시각에서는 망막의 빛수용체에서 신호를 전달받는 뉴런 세포들을 입력 계층으로 볼 수 있다. 하지만 인공 신경망들에는 그런 퍼셉트론 계층이 필요 없다. 이안 굿펠로, 요슈아 벤지오, 에런 쿠빌이 함께 저술한 『심층학습Deep Learning』(제이펍, 2018)1에서는 입력 계층input layer을 전혀 언급하지 않는다. 이 책에서도 입력 계층의 실체를 인정하지 않으며 앞으로 다시 언급하지 않을 것이다.
단층 퍼셉트론은 비록 간단한 구조지만 여러 고급 신경망 구조의 기본 요소다. 고급 신경망 안 에서는 여러 계층이 다양한 방식으로 연결된다. 이때 각 계층이 단층 퍼셉트론 혹은 단층 퍼셉 트론을 변형시킨 구조를 갖는다. 따라서 단층 퍼셉트론의 동작과 학습 과정을 이해하는 것은 고급 신경망의 복합 구조를 이해하는 바탕이 된다.
1.2 텐서 연산과 미니배치의 활용 딥러닝 프로그래밍에서 텐서의 이해와 활용은 대단히 중요하다. 텐서를 엄밀하게 정의하기란 쉽지 않지만 딥러닝에서는 다차원 숫자 배열 정도로만 이해해도 큰 문제가 없다. 0차원 스칼라, 1차원 벡터,
2차원 행렬이 모두 텐서이며, 3차원 이상의 숫자 배열 역시 텐서다. 딥러닝에서 텐서가 중요한 이유는 같은 문제라도 반복문 대신 텐서를 이용해 처리하는 편이 프 로그램도 간단하고 처리 속도도 훨씬 빠르기 때문이다. 이는 파이썬 인터프리터가 반복문보다 텐서 연산을 더 효율적으로 처리할 수 있기 때문이며, 특히 병렬 수치 연산을 지원하는 GPU 이용 환경에서 속도 차이는 더욱 커진다. 일반적으로 딥러닝에서는 신경망이 여러 데이터를 한꺼번에 처리하는데 이를 미니배치minibatch라고 한다.
1 www.deeplearningbook.org
52
1부 단층 퍼셉트론(SLP)
아래의 그림은 ⓐ 퍼셉트론 하나의 동작 방식, ⓑ 입력 데이터 하나에 대한 단층 퍼셉트론의 동 작 방식, ⓒ 입력이 여럿인 미니배치에 대한 단층 퍼셉트론의 동작 방식을 차례로 나타낸 것 이다. 그림 단층 퍼셉트론의 동작 방식 x
x
x1
w1
x2
w2
x3 x4
…
x2
x11
y1 b1
y
w11 …
y11
x12
b1
x13
b2
y2
y b
y
w11
x1
w3 w4
x
b2
x3
y3
…
w43
x4
ⓐ 퍼셉트론 하나의 동작
y12
b3
ⓑ 퍼셉트론 열의 동작
y13
…
x14
w43
b3
ⓒ 미니배치 데이터 처리
단층 퍼셉트론은 보통 ⓒ 형태다. ⓐ, ⓑ는 단지 ⓒ의 작동 방식을 단계적으로 이해하는 용도로 간단화한 것뿐이다. 이어지는 설명에 언급된 수식에서 소문자 굵은 글씨체는 벡터, 대문자 굵 은 글씨체는 행렬을 나타낸다. 그림 ⓐ는 퍼셉트론 하나가 동작하는 방식이다. 이 퍼셉트론은 가중치 벡터
w =(w 1,...,w n)와 스칼라 편향 b 를 이용해 입력 벡터 x =(x 1,...,x n)로부터 스칼라 출력 y =x1w1 +⋯+xnwn +b =xw +b를 계산한다. 이때 반복문을 이용해 xiwi들을 모두 계산하고 합산해서 y를 구할 수도 있지만 그보다는 벡터의 내적 연산을 이용해 xw를 단번에 계산하는 편이 훨씬 간단하고 빠르다. 한편 입력 성분의 일차식으로 표현되는 이런 계산 과정을 선형 연산이라 고 하며, 일차식으로 나타낼 수 없는 계산 과정을 비선형 연산이라 한다. 2장부터는 신경망 출력 처 리에 비선형 함수를, 4장부터는 퍼셉트론 안에도 활성화 함수라는 이름으로 비선형 함수를 이 용한다. 하지만 이번 장에서 다루는 회귀 분석 문제 풀이에 사용하는 단층 퍼셉트론에서는 아 직 비선형 함수를 이용하지 않는다. 그림 ⓑ는 단층 퍼셉트론을 구성하는 일련의 퍼셉트론들이 데이터 하나를 처리할 때의 동작 방식을 나타낸다. 퍼셉트론이 여럿이니 가중치는 가중치 벡터들이 퍼셉트론 수만큼 모인 가 중치 행렬 W가 되며 편향 역시 벡터 b가 된다. 이때 출력 벡터 y를 구성하는 yi값들은 각각
yi =x1wi1 +⋯+xnwin +b =xwi +bi로 구해지는데 이를 한꺼번에 표현하면 y =xW +b다. 역
1장 회귀 분석 : 전복의 고리 수 추정 신경망
53
시 퍼셉트론 하나의 동작을 반복문으로 처리하기보다는 y =xW +b 식을 이용하여 벡터와 행 렬의 연산 형태로 전체 퍼셉트론을 한꺼번에 처리하는 편이 훨씬 효율적이다. 그림 ⓒ는 미니배치 처리에서의 단층 퍼셉트론의 동작 방식을 나타낸다. 데이터가 여러 개 모 여서 입력 행렬 X와 출력 행렬 Y가 될 뿐 ⓑ에서와 같은 일련의 퍼셉트론들이 각 데이터에 공 통적으로 적용되어 yj =xjW +b를 계산하는 것이다. 따라서 가중치 행렬 W와 편향 벡터 b가 그대로 이용된다. 이 미니배치 처리는 Y =XW +b의 식으로 요약 가능하며 역시 반복문으로 ⓐ나 ⓑ의 동작을 반복하기보다 행렬 연산을 이용하여 단번에 계산하는 편이 간단하고 효율적 이다. 예제의 구현 과정에서 거듭 살펴보겠지만 딥러닝 프로그램의 효율을 높이려면 최대한 반복문 사용을 피하고 텐서 연산을 이용해 처리하는 것이 중요하다는 점을 명심해두어야 한다. 미니배치는 모든 학습 데이터를 한꺼번에 일괄처리하는 배치 작업은 아니지만 그렇다고 해서 데이터를 하나씩 다루지도 않는다. 배치 작업보다 상대적으로 작은 단위로 처리하는 일괄처리 라서 미니배치라는 이름이 붙었다. 미니배치는 데이터 처리의 효율을 높여주며 개별 학습 데이 터의 특징을 무시하지 않으면서도 특징에 너무 휘둘리지 않게 해주어서 유용하다. 학습 데이터 전체에 대한 한 차례 처리를 에포크epoch(에폭, 이폭으로도 부른다)라고 한다. 딥러닝에서는 에 포크 수나 미니배치 크기처럼 학습 과정에서 변경되지 않으면서 신경망 구조나 학습 결과에 영향을 미치는 고려 요인들을 하이퍼파라미터hyper parameter라고 한다. 하이퍼파라미터값은 신경망 설계자가 학습
전에 미리 정해주어야 하는 값이며 학습 결과에 큰 영향을 미치는 경우가 많다. 따라서 신경망 설계자는 문제 유형, 신경망 구조, 데이터양, 학습 결과 등을 종합적으로 살펴보며 하이퍼파라 미터값들을 잘 조절해야 한다.
1.3 신경망의 세 가지 기본 출력 유형과 회귀 분석 인공지능 알고리즘의 출력 내용을 세분해보면 회귀 분석, 이진 판단, 선택 분류로 구성된다. 다 음 그림은 세 출력 유형 문제들을 비유적으로 표현해본 것이다.
54
1부 단층 퍼셉트론(SLP)
그림 세 가지 출력 유형에 해당하는 문제의 비유적 표현 너 올해 몇 살이나? 백 세 살? 아니 만으로는 102살이네
토끼가 자고 있네. 어떻게 할래? ① 그냥 간다 ② 깨운다 ③ 같이 잔다 ④ 잠시 쉰다 주사위 없나? 에라 모르겠다. 3번!
밥은 먹고 다니니? 응… 보면 몰라? 지금 먹는 중이잖아
ⓐ 회귀 분석
ⓑ 이진 판단
ⓒ 선택 분류
회귀 분석은 어떤 특징값 하나를 숫자로 추정하여 출력한다. 이진 판단은 ‘예’나 ‘아니오’ 가운데 한 쪽을 택해 출력하며, 선택 분류는 몇 가지 후보 항목 중 하나를 골라 선택 결과를 출력한다. 인공지능 알고리즘의 출력은 이 세 가지 유형의 반복이나 혼합이다. 이진 판단과 선택 분류는 2장 ‘이진판단’과 3장 ‘선택 분류’에서 다루고 지금은 회귀 분석을 살 펴보자. 회귀regression는 옛날 상태로 돌아간다는 뜻이다. 최초로 회귀 분석이라는 용어를 사용한 사람은 영국의 유전학자 프랜시스 골턴이다. 부모와 자녀 키 사이의 상관관계를 연구하면서 ‘두 값 사 이에 깊은 상관관계가 있지만 세대가 지남에 따라 키가 계속 커지거나 작아지려고 하기보다는 조사 집단의 평균값으로 되돌아가려는 경향이 있다’는 가설을 세웠고, 이 같은 분석 방법을 ‘회 귀 분석’이라고 불렀다. 통계학에서는 연속형 변수 사이의 모형을 구한 뒤 적합도를 측정하는 분석 방법을 회귀 분석이 라고 한다. 입력으로 주어진 값들을 근거로 미지의 변숫값을 추정하고 예측하는 데 주로 이용 된다. 딥러닝 알고리즘의 값 추정 역시 신경망 모델이 입력 데이터를 근거로 출력값을 추정하 는 것이므로 통계학에서 이야기하는 회귀 분석의 한 방법에 해당한다.
1.4 전복의 고리 수 추정 문제 전복 껍질을 잘라 내서 현미경으로 고리 수를 센 후 1.5를 더하면 전복의 나이를 정확하게 알 수 있다. 하지만 길고 지루한 작업이다. 이런 복잡한 과정 대신 성별이나 크기, 무게처럼 육안
1장 회귀 분석 : 전복의 고리 수 추정 신경망
55
으로 식별 가능하거나 간단하게 측정할 수 있는 속성값들을 활용해서 전복 나이를 추정할 수는 없을까? 비록 완벽하게 정확한 값이 아니더라도 어느 정도 정확성이 보장된다면 전복 양식 등 에 매우 유용할 것이다. 그림 전복 나이의 추정 방법(좌측)과 조사 방법(우측)
정확한 나이
추정된 나이 : 딥러닝
현미경 측정
데이터 분석 방식
현미경을 이용하는 방식
캐글의 아발로니 데이터셋에는 전복 4,177마리에 대해 비교적 쉽게 측정 가능한 8가지 특징값 (성별, 키, 지름, 높이, 전체 무게, 몸통 무게, 내장 무게, 껍질 무게)과 현미경을 이용해 측정한 껍질의 고리 수가 들어 있다(총 9가지 특징값). 이 데이터셋 정보를 이용하여 임의의 전복 개체 에 대해 나이 추정에 직결되는 껍질의 고리 수를 추정하는 인공 신경망을 만들어보자. 전복의 고리 수는 자연수 하나로 표현된다. 따라서 연속값을 다루는 회귀 분석의 출력으로 다 소 문제가 있고 음수나 너무 큰 값도 답으로 적당하지 않다. 하지만 자연수를 실수로 간주해서 처리해도 별 문제는 없으며 필요하면 반올림 등의 처리를 추가하면 된다. 또한 단층 퍼셉트론 처럼 간단한 신경망도 조금만 학습시키면 음수나 터무니없이 큰 값을 출력하는 실수는 좀처럼 범하지 않기 때문에 값의 범위에 따로 제한을 둘 필요도 없다.
1.5 회귀 분석과 평균제곱오차(MSE) 손실 함수 회귀 분석 출력을 내는 딥러닝 신경망은 값의 추정에 근거가 되는 입력 데이터가 잘 주어질수 록 그리고 신경망 구조가 이 데이터에 적합한 구조이고 학습이 잘 될수록 더 정확한 추정값을 만든다. 그런데 딥러닝 학습을 하려면 추정값이 따로 주어지는 정답에 비교할 때 얼마나 정확한지를 숫 자 하나로 요약해서 보여주는 정량적 지표가 필요하다.
56
1부 단층 퍼셉트론(SLP)
회귀 분석에서는 추정값이 얼마나 정확한지 평가할 때 보통 평균제곱오차MSE, mean squared error를 평가 지표로 삼는다. 평균제곱오차란 출력 각 성분에 대해 추정값과 정답 사이의 차이인 오차 를 제곱한 뒤 모두 합해 전체 성분 수로 나눈 값이다. 이 값은 오차를 제곱하는 연산 때문에 항 상 0 이상이며 추정이 정확해질수록 오차가 줄어들면서 0에 가까워진다. 특히 정확한 추정, 즉 추정값과 정답이 완전히 일치하면 평균제곱오찻값은 0이 된다. 딥러닝에서는 값이 항상 0 이상이며 추정이 정확해질수록 값이 작아지는 성질이 있으면서 미 분도 가능한 평가지표를 정의한 후 이를 최소화하는 것을 목표로 학습을 수행한다. 이런 성질 의 평가지표를 손실 함수loss function 혹은 비용함수cost function라고 부른다. 여기에서 함수라는 표 현이 붙는 이유는 입력이나 신경망의 가중치에 따라 그 값이 달라지기 때문이며 그냥 줄여서 손실 혹은 비용이라고 부르기도 한다. 회귀 분석 출력에 대한 평균제곱오차는 계산하기 쉬우면 서도 딥러닝이 요구하는 성질을 충족시켜 손실 함수로 유용하게 이용된다. 올림픽에 참가한 한중일 세 나라의 획득 메달 수를 예측한 결과를 평가하는 예를 들어보자. 우 선 2016 하계 올림픽에서 국가별로 획득한 메달 수는 다음과 같다. 표 메달 수 예측 게임의 정답 역할을 할 2016 하계 올림픽 국가별 획득 메달 수 순위
1
2
3
4
5
6
7
8
…
국가
미국
영국
중국
러시아
독일
일본
프랑스
한국
…
금
46
27
26
19
17
12
10
9
…
은
37
23
18
17
10
8
18
3
…
동
38
17
26
19
15
21
14
9
…
합계
121
67
70
55
42
41
42
21
…
메달 색깔을 무시하고 금·은·동 세 종류 메달을 모두 합한 전체 메달 수만 다뤄보자. 대회가 열리기 전, 즉 결과를 모르는 상태에서 철수는 한국 25개, 중국 65개, 일본 32개를, AI 깡통로 봇은 한국 20개, 중국 80개, 일본 35개를 획득한다고 예측했다. 둘 중에 누가 더 정확한 예측 을 한 것일까? 철수와 깡통로봇의 예측 가운데 정확히 맞힌 것은 하나도 없고 틀린 내용도 서 로 들쭉날쭉하다. 그렇다고 무승부로 게임을 끝내기도 찜찜하다. 이럴 때 둘의 예측에 대해 평 균제곱오차를 구해 비교하면 누가 더 정확하게 예측했는지 가릴 수 있다. 먼저 철수의 예측에 대해 평균제곱오찻값을 구해보자.
1장 회귀 분석 : 전복의 고리 수 추정 신경망
57
그림 철수의 메달 수 예측에 대한 평균제곱오차
평균제곱오차
철수
철수 ( 25 − 21)2 + ( 65 − 70 )2 + ( 32 − 41)2 = 16 + 25 + 81 = 122 한국 25개 3 3 3 중국 65개 2 2 2 32 − 21 ( 25일본 ) 개+ ( 65 − 70 ) + ( 32 − 41) = 16 + 252+ 81 = 122 2 ( 20 − 213) + ( 80 − 370 ) + ( 35 − 41)2 = 1+ 100 + 36 = 137 3 3 3 3
( 20 − 21)2 + ( 80 − 70 )2 + ( 35 − 41)2 3
=
1+ 100 + 36 137 = 3 3
이번에는 깡통로봇의 예측에 대해 평균제곱오찻값을 구해보자. 그림 깡통로봇의 메달 수 예측에 대한 평균제곱오차
( 25 − 21)2 + ( 65 − 70 )2 + ( 32 − 41)2 평균제곱오차 3
2 2 2 21) + ( 65 − 70 ) + ( 32 − 41) ( 25 − AI
3 한국 20개 중국 80개 35 − 21 ( 20일본 )2개+ ( 80 − 70 )2 + ( 35 − 41)2 3
=
16 + 25 + 81 122 = 3 3
16 + 252+ 81 122 2 2 =( 20 − 21) + ( 80= − 70 ) + ( 35 − 41) 1+ 100 + 36 137 = = 3 3 3 3 3 =
1+ 100 + 36 137 = 3 3
AI
122
계산 결과 예측에 대한 철수의 평균제곱오차 3 는 깡통로봇의 평균제곱오차 따라서 철수가 이 게임의 승자라고 말할 수
137 있다.3
122 3 137 3 보다
작다.
그런데 이 게임 결과에서 평균제곱오차 대신 오차 합을 구해보자. 철수가 (25 - 21) + (70 -
65) + (41 - 32) = 4 + 5 + 9 = 18인데 반해 깡통로봇은 1 + 10 + 6 = 17이어서 철수의 오차합이 더 크다. 만약 오차 합을 따져 승자를 정하면 깡통로봇이 승자다. 그런데도 철수가 승 자가 될 수 있었던 것은 깡통로봇이 중국에 대해 예측에서 오차 10을 기록했기 때문이다(제곱 값이 무려 100이다). 오차 합을 평균제곱오차 회귀 분석의 손실 함수로 이용하는 방법도 생각 해볼 수 있다. 하지만 오차 합은 미분 불가능한 지점이 있고 학습 효과도 좋지 않아 거의 이용 하지 않는다.
58
1부 단층 퍼셉트론(SLP)
학습(learn)과 훈련(train) 딥러닝에서는 학습과 훈련이라는 용어를 뒤섞어 쓴다. 두 말은 같은 행위를 정반대의 입장에서 보고 표현한 것이다. 딥러닝에서는 데이터를 처리해 신경망 성능을 개선시킨다. 신경망 입장에 서 이 과정은 ‘데이터를 학습’하는 것이고, 신경망 개발자 입장에서 ‘신경망을 훈련’시키는 것이 다. 두 용어는 우리 말에서는 물론 영어권에서도 혼용되고 있다. 이 책에서는 독자의 혼란을 막 기 위하여 가급적 ‘학습’으로 표현한다.
1.6 경사하강법과 역전파 경사하강법gradient descent algorithm은 함수의 기울기를 반복 계산하면서 이 기울기에 따라 함숫값이 낮아지는 방향으로 이동하는 기본적인 딥러닝 학습 알고리즘이다. 딥러닝은 기본적으로 가변 파라미터를 갖는 신경망 구조를 설정한 후 학습을 통해 파라미터값들을 조절하여 신경망이 원 하는 동작을 수행하도록 만드는 인공지능 기법이다. 앞에서 말했듯이 퍼셉트론에서 파라미터 란 가중치와 편향을 말한다. 경사하강법은 미니배치 입력 데이터에 대해 순전파와 역전파 과정을 번갈아 수행하는 과정을 반복하면서 신경망 파라미터들을 원하는 방향으로 바꾸어나간다. 순전파 forward propagation란 입 력 데이터에 대해 신경망 구조를 따라가면서 현재의 파라미터값들을 이용해 손실 함숫값을 계 산하는 과정을 말한다. 또한 역전파 backward propagation, backpropagation란 순전파의 계산 과정을 역순 으로 거슬러가면서 손실 함숫값에 직간접적으로 영향을 미친 모든 성분에 대하여 손실 기울기 를 계산하는 과정을 말한다. ‘성분 x의 손실 기울기’는 그 성분에 대한 손실 함숫값의 변화율, ∂L
∂L ∂y
즉 ∂x =를∂y나타낸다. 역전파에서는 또한 딥러닝 알고리즘이 값을 바꿀 수 있는 대상인 파라미 ∂x 터 성분에 대해서는 계산된 손실 기울기를 이용해 실제로 그 값을 변경하는데, 이 변경으로 신 경망의 변화, 즉 학습이 일어난다. 경사하강법의 경우 손실 기울기에 미리 정해진 학습률 learning 이라는 하이퍼파라미터값을 곱한 값을 빼는 가장 간단한 방법으로 파라미터값을 변경한다.
rate
경사하강법의 원리를 대략이라도 이해하기 위해 우선 아래의 2차원 그래프를 살펴보자.
1장 회귀 분석 : 전복의 고리 수 추정 신경망
59
그림 2차원 그래프로 표시한 경사하강법의 원리 출발점
f(x)
단계 2
단계 3 수렴
x 목표 지점
그래프 전체를 볼 수 없는 상황에서 f (x)값이 최소가 되는 x값을 찾아야 한다고 하자. 출발점 에서 x값을 적당히 바꾸면서 f (x)값이 최소가 되는 목표 지점으로 다가가야 하는 것이다. 경사 가 심한 곳에서는 바닥이 멀리 있으니 좀 빨리 내려가도 되고 경사가 완만해질수록 목표 지점 에 가까우니 목표를 지나치지 않도록 천천히 움직일 필요가 있다. 또한 경사가 오르막이라면 x 값을 줄여 후진할 필요가 있고 내리막이면 반대로 x값을 늘려 전진해야 한다. 그래프의 경사는 미분값 f '(x)에 해당하므로 이에 비례하는 값을 x에서 빼주는 처리를 하면 이 모든 처리가 가능 하다. ∂ f ( x) 따라서 위의 그림에서 단 한 걸음 속의 관계를 식으로 나타내면 x 이 된다. 이때 i+1 = xi − α ∂x
비례상수 α를 학습률이라고 하며 임의의 양수값을 사용할 수 있지만 값이 클수록 목표 근처에 서 정확하게 바닥을 찾는 능력이 무디어지고 값이 작을수록 바닥점 근처에 접근하는 시간이 더 df ( x ) dx df ( x ) ∂ f ( x) df ( x ) 또한 이 식에서 미분식 dx 대신 편미분식 을 사용하고 있는데 편미분은 x를 제외한 다 dx ∂x ∂ f ( x) ∂ f ( x) df ( x ) 른 변수 모두를 상수로 간주하고 미분하는 간소화된 미분법이다. ∂x 미분과 편미분의 차이는 f (x) ∂x dx df df ( x ) 의 정의가 x 외의 다른 변수까지 포함할 때 발생한다. 미분에서 ( x ) 는 원래 전미분이라고 하 dx dx
오래 걸린다.
여 x가 다른 변수에 미치는 영향을 통해 f (x)값에 간접적으로 미치는 영향까지 모두 정확하게 따진다. 반면 편미분은 이런 간접적 영향을 일체 무시하고 x에 의한 직접적 영향만을 따지기 때문에 전미분보다 훨씬 간단하게 계산할 수 있다.
60
1부 단층 퍼셉트론(SLP)
미분 대신 편미분을 쓰는 이유는 다음과 같다. 1 미분은 대부분 계산 자체가 불가능하거나 몸시 어렵지만, 편미분은 상대적으로 쉽게 계산할 수 있다. 2 편미분 과정에서 상수처럼 취급되는 다른 변수도 같은 편미분 방식으로 처리해서 이들을 잘 종합하면 전체적 으로 전미분과 같은 효과를 낼 수 있다.
그런데 왜 기울기에 따라 보폭을 조절해가는 복잡한 방법을 택하는 걸까? 그것은 최소화해야 할 대상인 손실 함숫값을 결정하는 성분이 하나가 아니라 수없이 많기 때문이다. 예를 들어 θ0와 θ1로 결정되는 함수 J(θ0, θ1)값을 최소화하는 문제를 생각해보자. J 함수의 그 래프는 다음 그림처럼 3차원 지형도 모양이 된다. 그림 3차원 지형도에 비유해 살펴보는 경사하강법
3 2 1
J(θ0, θ1)
0 -1 -2 -3 1
0 0.2 0.9
08
0.4 0.7
0.6
θ0
0.5
0.6 0.4
0.3
0.2
08 0.1
0
1
θ1
이 지형도에서 바닥점의 2차원 좌표는 단번에 계산하기도 쉽지 않고 일정한 방향으로 내달려 서 찾아지지도 않는다. 게다가 현재 위치를 제외한 주위 지형을 관측할 수도 없는 상황이다. 이 런 상황에서 바닥점을 찾아가려면 현재 위치의 기울기를 따져 한 걸음씩 내려가는 수밖에 없 다. 이때 내려가는 방향은 θ0에 대한 기울기와 θ1에 대한 기울기로 구성되는 기울기 벡터를 통 해 결정해야 한다. 이 비유에서 주의할 점은 사람은 하산할 때 안전한 길을 찾지만 경사하강법은 빨리 바닥에 내 려가는 길을 찾는다는 점이다. 그래서 경사하강법이 찾아내는 경로는 등산객의 하산경로보다 는 오히려 물이 흘러내리거나 돌이 굴러가는 길과 비슷해진다. 딥러닝 모델에서 손실 함숫값은 매우 많은 성분에 의해 계산되기 때문에 이를 그래프로 나타내
1장 회귀 분석 : 전복의 고리 수 추정 신경망
61
면 위의 지형도와는 비교도 되지 않는 고차원의 그래프로서 그림으로 나타낼 수 없는 지경이 된다(정확히 말하자면 모델이 갖는 전체 파라미터 개수만큼의 차원을 갖는 엄청난 고차원 공간 이다). 하지만 경사하강법에서는 2차원 등산로에서와 마찬가지 방법으로 고차원 등산로를 한 발 한 발 탐색해 손실 함숫값이 최소화되는 바닥점을 찾아간다. 경사하강법에서는 우선 난수함 수 등을 이용해 파라미터값을 초기화하는데 이는 고차원 등산로에서 임의의 출발점을 정하는 것이다. 이어서 순전파와 역전파를 반복하면서 파라미터값들을 조절해 가는데 이는 미니배치 데이터를 이용해 현재 위치의 기울기 벡터를 추정한 후 그 방향으로 파라미터들을 한 걸음 움 직여주는 것과 같은 과정이다. 안타깝게도 경사하강법으로 항상 최적의 바닥점에 도달할 수 있다는 보장은 없다. 단지 현재 위치를 둘러싼 주위의 지형에 비해 작은 함숫값을 갖는 이른바 지역적 바닥점local minimum에 도 달할 수 있을 뿐이며 이 때문에 경사하강법에 대한 여러 가지 개선책과 보조 기법들이 제안되 고 있다. 이 책에서는 경사하강법의 대표적인 개선책인 아담 알고리즘을 6.4절 ‘아담 알고리즘’에서 소 개하고 6장 이후 각종 신경망의 학습에 이용한다. 이런 노력으로 학습 효과가 높아지고는 있지 만 지역적 바닥점 문제에 대한 근본적인 해결책은 아직 없다.
1.7 편미분과 손실 기울기의 계산 역전파 과정에서 손실 함숫값에 직간접적으로 영향을 미친 모든 성분에 대하여 손실 기울기를 계산한다고 했는데 이는 편미분의 연쇄적 관계 덕분이다. 편미분의 연쇄적 관계는 미분의 기본 ∂L ∂L ∂y 성질인 의 수식을 의미한다. 이 식을 이용해 역전파가 어떻게 진행되는지 알아보자. = ∂x
∂y ∂x
순전파 처리 과정 중에 입력 x로부터 출력 y를 계산해내는 과정이 있다고 하자. 일반적으로 이 과정은 최초의 입력으로부터 x를 계산해주는 앞 과정과 y를 이용해 손실 함수를 계산하는 뒷 과정 사이에 끼여 있다. 이를 그림으로 나타내면 다음과 같다.
62
1부 단층 퍼셉트론(SLP)
그림 편미분의 연쇄적 관계를 이용한 역전파 처리 L 과정 ∂L = 1.0 L ∂L
L ∂L = 1.0 ∂L
L L ∂L∂L = 1.0 = 1.0 ∂L∂LL
L ∂L L = 1.0 ∂L L ∂L = 1.0 ∂L ∂L = 1.0 ∂L ∂L = 1.0 y y➌ y y ∂L = 1.0 ∂L y∂L ∂L ∂L∂L y y ∂L ∂y ∂y ∂y∂yy ∂L ∂L ∂y ∂L ∂L ∂y ∂L ∂ f ( x ) ∂L ∂y y = f ( x∂y = ∂L ∂ f ( x ) ) =∂L ∂L ∂y ➋ ➎∂ f (∂L ∂y ∂y ∂x y = f x = ( )f x ∂L∂L ∂L∂L ∂y∂y ∂L∂L ) ∂L ∂y ∂L ∂∂x ( x )∂x∂y= ∂x ∂L ∂y ∂L (x) ∂y ∂x ∂y ∂ f∂x y =y f=( xf )( = =f (=x ) ∂ f ( x=) ∂L =y = f ( x ) ∂L = x ) ∂L= =∂Ly∂y f (x) ∂L ∂y ∂L∂x ∂y = ∂y ∂L ∂∂x ∂ f ∂x x ∂x ∂L ( ) ∂x ∂y ∂x ∂y ∂y ∂x ∂y ∂x ∂x ∂x ∂y ∂x ∂y ∂x ∂L y = f ( x ) = = y = f ( x ) ∂L = ∂L ∂y = ∂L ∂ f ( x ) ∂x ∂y ∂x ∂y ∂x ∂x = ∂y ∂x = ∂y ∂x ∂L ∂x ∂L∂Ly = f ( x ) ∂x ∂x ∂y∂L ∂x ∂y ∂x ∂L ∂L ∂x ∂x∂x∂L ∂x ∂x ∂x ∂x
y ∂L ➍ ∂y
➊
➏
순전파
역전파
순전파에서는 앞 과정 ➊을 거쳐 x가 구해지며 ➋에서 y =f(x)가 계산되고 뒷 과정 ➌에서 y를 이용해 손실 함수 L이 계산된다. 한편 역전파는 순전파의 역순으로 처리되어야 한다. 즉 ➍에 ∂L ∂L ,..., 일어나야 서 ➌의 역전파 처리, ➎에서 ➋의 역전파 처리, ➏에서 ➊의 역전파 처리가 차례로 ∂y1
한다. 먼저 ➍에서는
∂L = 1 이라는 ∂L
당연한 성질에서 시작하여 y의 손실 기울기
을 ➎에 전달한다. 또한 ➏은 ➎에서 입력 x의 손실 기울기
∂L ⎡ ∂L ∂L ⎤ =를 전달받아 ,..., ∂x ⎢⎣ ∂x1 ∂xn ⎥⎦
∂yn
∂L ∂L ∂L = 구해 + ...+이 값 를 ∂y ∂y1 ∂yn
➊의 역전파 처리에
이용한다. ∂L
∂L
1
n
,..., 순전파에서 실제로 구해진 우리가 관심을 갖는 ➎는 ➋의 역전파 과정으로서 y =f(x)의 성질과 ∂y ∂y
x, y값을 이용하여
∂y ∂ f ( x ) = ∂x ∂x
값을 계산한 후 여기에 전달받은
∂L ∂L ∂L∂L ⎡ ∂L ∂L ⎤ =값을+곱해 ...+ =값을,..., 구한다. ∂y ∂y1 ∂yn∂x ⎢⎣ ∂x1 ∂xn ⎥⎦
하지만 이는 x와 y가 하나의 변수뿐인 가장 간단한 경우의 처리 방법이며 일반적으로는 그렇 지 않은 경우까지 처리할 수 있어야 한다. 우선 입력이 여러 개의 성분으로 구성된 경우, 즉 x = (x1, ..., xn)이어서 다변수 함수 y =
f (x 1, ..., x n)를 이용해 순전파 처리가 수행되는 경우의 처리 방법을 살펴보자. 편미분에 서는 다른 입력 변수끼리는 서로 무관한 것으로 간주하기 때문에 이 경우의 처리는 아 ∂L ∂L ∂ f ( x1 ,..., xn ) 주 간단하다. 각 입력 성분에 대한 손실 기울기를 ➎에서와 같은 방법, 즉 ∂x = ∂y ∂x i
로 계산한다. 그리고 이들 값을 모아
∂L ∂L ∂L =( ,..., ) ∂x ∂x1 ∂xn 로서
i
➏에 전달하면 된다.
또한 출력이 여러 군데 중복으로 이용되는 경우에는 여러 몫을 한 것이니 각 경우에 대해 전
1장 회귀 분석 : 전복의 고리 수 추정 신경망
63
∂L
∂L
1
n
,..., 된다. 즉 달받은 출력의 손실 기울기를 단순 합산해 입력의 손실 기울기 계산에 반영하면 ∂y ∂y
y =∂Ly,..., 1 =∂L... = yn여서 y1, ..., yn을 이용한 ➍로부터 ∂y1
로
∂yn
∂L ∂L ∂L = 계산한 + ...+ 후 를 ∂y ∂y1 ∂yn
∂L ∂L ,..., 이 ∂y1 ∂yn ∂L
=
∂L
전달된 경우
+ ...+
∂L ∂L ∂L = + ...+ ∂y ∂y1 ∂yn
∂L
∂y ∂y1 계산한다. ∂yn 이 값을 이용해 입력에 대한 손실 기울기를
한편 ➊, ➌의 순전파 처리나 ➍, ➏의 역전파 처리는 계산 과정을 세밀하게 분할한 후 ➋, ➎의 처리 방법을 재귀적으로 적용하면 된다. 딥러닝의 여러 신경망들은 편미분이 가능한 함수만 손실 함수 계산 과정에 이용하도록 각별히 주의하여 설계되었기 때문에 이러한 처리 과정만으로 모든 경우의 역전파를 처리할 수 있다. 여러 가지 신경망에서의 손실 함수 계산 과정과 그에 대한 역전파 처리 과정은 앞으로 여러 신 경망 예제의 구현 방법을 소개하면서 살펴보기로 하자. 한편 역전파 과정 중에 가중치나 편향 같은 파라미터 성분에 대해서는 해당 성분의 손실 기울 기에 학습률을 곱한 값을 빼줌으로써 그 값을 변경시킨다. 바로 이 부분이 학습이 실제로 일어 나는 지점이다. 이때 학습률은 학습 속도를 조절하는 매우 중요한 하이퍼파라미터값으로서 너 무 크거나 작지 않게 적절한 값을 설정해줄 필요가 있다. 그림 적절한 학습률 설정의 필요성
J(θ1 )
보폭이 너무 작다 보니 바닥에 가는 데 오래 걸려
J(θ1 )
보폭이 너무 크다 보니 바닥에 닿기는 커녕 점점 멀어지기까지 하네
θ1 ⓐ 지나치게 작은 학습률
θ1 ⓑ 지나치게 큰 학습률
위의 그림에서 보듯 학습률은 보폭에 비유할 수 있는데 지나치게 작은 학습률은 손실 함숫값이 최소가 되는 바닥점에 도달하기까지 너무 긴 학습이 필요하게 만들어 바람직하지 못하다. 또한 길에 파인 작은 웅덩이를 벗어나지 못한 채 그 안에서 전체 바닥점보다 높은 지역적 바닥점에 머물게 할 수도 있다. 반면 지나치게 큰 학습률은 손실 함숫값이 바닥점에 도달하지 못한 채 바
64
1부 단층 퍼셉트론(SLP)
닥점 근처를 맴돌게 만들 가능성이 크다. 신경망 학습 결과가 만족스럽지 않을 때 가장 먼저 바꿔보아야 할 하이퍼파라미터는 바로 학습 률이다. 경사하강법의 고정된 학습률 대신 학습 초반에는 큰 학습률을 사용하고 바닥점에 가까 워질수록 학습률을 줄이는 기법들이 고안되어 아담 알고리즘 등에 이용되고 있다.
1.8 하이퍼파라미터 딥러닝 모델들을 개발하다보면 여러 가지 값이 등장한다. 이들을 크게 네 가지로 나눌 수 있다. 그림 딥러닝 모델에 등장하는 네 가지 값들 재료가 있어야 공장이 돌아가지
쓰레기 인 쓰 레기 아웃 기 왕이면 좋은 재료
생산 라인을 가 변적으로 제어하 는 컴퓨터야
ⓒ 파라미터(가변제어장치)
ⓐ 외부에서 주어지는 값(재료 투입구)
이야 온갖 것들이 만들어지네
완제품도 있지만 중간 결과도 있어
ⓑ 각종 중간 계산 결과 (생산 결과물)
생산품 중 불량품을 검사해서 스스로 내용을 고친대
고정된 생산 기계야 이건 쉽게 바꿀 수 없어
수시로 바꾸기는 힘들 지만 그래서 더 중요한 부분이야
ⓓ 하이퍼파라미터(고정기계장치)
ⓐ 학습에 사용되는 데이터처럼 외부에서 주어지는 값이다. 이 값은 신경망 개발자 입장에서는 직접 손댈 수 없는 고정된 값이며 개발 시점에는 정확하게 알기도 어렵다. 좋은 결과를 얻으려
1장 회귀 분석 : 전복의 고리 수 추정 신경망
65
면 잘 만들어진 데이터가 필요하지만 딥러닝 알고리즘에 집중하고자 데이터 구축 문제는 일단 논외한다. ⓑ 순전파나 역전파 처리 과정에서 생성되는 각종 중간 계산 결과이다. 학습 과정에서 최소화 대상이 되는 손실 함숫값이나 성능에 대한 평가 지표로서 신경망의 출력 유형에 따라 별도로 정의될 정확도는 지속적인 관찰의 대상이 되기도 한다. 하지만 이 값은 프로그램의 실행 결과 로 얻어지므로 신경망 개발자는 좋은 값이 나오도록 애쓸 뿐 달리 손댈 수가 없다. ⓒ 학습이 진행됨에 따라 값이 변하고 그러면서 순전파와 역전파 처리에 계속 이용되는 값이다. 이미 소개한 파라미터로서 퍼셉트론의 가중치나 편향이 이에 해당한다. 결국, 딥러닝 연구는 딥 러닝 모델의 구조, 즉 파라미터의 구조를 잘 잡는 방법과 값을 적절한 조합으로 만드는 학습 방 법을 탐구하는 것으로 요약할 수 있다. 그만큼 파라미터는 딥러닝 알고리즘의 핵심 요소다. ⓓ 학습률이나 학습 횟수, 미니배치 크기처럼 딥러닝 모델의 구조나 학습 과정에 영향을 미치 는 각종 상숫값이다. 딥러닝에서는 이들을 하이퍼파라미터라고 부르는데 하이퍼파라미터는 딥 러닝 알고리즘을 실행하는 동안은 값이 변하지 않는 상수이지만 그렇다고 항상 고정불변인 것 은 아니다. 마음에 드는 학습 결과를 얻기까지 개발자가 끊임없이 값을 바꾸어가며 실험한다. 파라미터는 학습으로 적당한 값을 얻을 수 있지만, 하이퍼파라미터는 학습 진행을 위해 신경망 개발자가 미리 정해주어야 한다. 그래서 더 많은 경험과 이해가 필요하다.
1.9 비선형 정보와 원-핫 벡터 표현 아발로니 데이터셋의 8가지 특징값 중 7가지는 크기나 무게와 관련이 있다. 이 값들은 대소 관 계나 비율이 나름대로 타당한 의미가 있는 선형적 특성을 띤다. 그런데 전복의 성별 정보는 짚고 넘어갈 필요가 있다. 전복의 암수는 내장을 보고 구별한다. 내 장이 짙은 노란색이면 암컷, 청록색이면 수컷이며 내장이 아직 눈에 띌 정도의 크기와 색깔을 갖추지 못한 어린 전복을 유충이라고 부른다. 아발로니 데이터셋에서는 전복의 성별을 숫자값 이 아닌 I(infant, 유충), M(male, 수컷), F(female, 암컷)로 표시한다. 신경망에서 처리하려 면 이 정보를 숫자로 표현해야 하는데 성별 정보는 숫자로 표현해도 선형 정보로 볼 수는 없다. 예를 들어 I, M, F를 각각 0, 1, 2라는 숫자로 바꾸어 표현한다 해도 이 순서 관계나 값의 크기
66
1부 단층 퍼셉트론(SLP)
에서 타당한 선형적 의미를 찾을 수 없다. 성별 정보를 표현하는 더 바람직한 방법은 유충 여부, 수컷 여부, 암컷 여부를 나타내는 세 개 의 입력 항으로 분할하여 각각을 0이나 1로 표현하는 것이다. 비선형 정보를 이렇게 항목별로 분할 하여 해당 항목만 1, 나머지는 0으로 나타내는 방식을 ‘원-핫 벡터one-hot vector ’ 표현이라고 한다.
단층 퍼셉트론의 처리 과정에는 비선형 함수가 이용되지 않기 때문에 단층 퍼셉트론 신경망은 입력의 비선형적 특성을 포착할 수 없다. 원-핫 벡터 표현으로의 변환은 단층 퍼셉트론의 이 런 약점을 완화시켜 준다. 또한 계층과 계층 사이에 비선형 활성화 함수가 추가되는 다층 퍼셉 트론 이상의 고급 구조에서도 입력이 비선형 특성을 띠는지 확인하는 수고를 덜어 빠른 학습을 가능하게 한다. 그림 전복 성별 정보의 원-핫 벡터 표현
sex=I
sex=M
sex=F
infant=1 male=0 female=0
infant=0 male=1 female=0
infant=0 male=0 female=1
정보 항 하나로 표시되던 성별 정보를 세 정보 항으로 구성해 원-핫 벡터로 분할해 표현하면 입력 벡터 크기는 8에서 10으로 늘어난다. 한편 전복 고리 수 추정 프로그램의 출력은 고리 수를 나타내는 값 하나면 되기 때문에 데이터 별 출력 크기는 1이다. 따라서 단층 퍼셉트론 신경망 구성을 위한 퍼셉트론 수도 하나가 된다. 퍼셉트론 수가 겨우 하나라니 너무 썰렁하기는 하지만 때로는 크기 1의 벡터도 생각할 수 있는 법이다. 그러니 그저 퍼셉트론 하나가 아니라 어엿한 단층 퍼셉트론의 출력 계층으로 생각하 자. 또한 여기에서 생성되는 출력 항 하나도 스칼라값이 아닌 크기가 1인 벡터로 해석하자. 이제까지 설명한 바를 요약해보자. 전복 고리 수 추정 문제를 단층 퍼셉트론으로 풀려면 입력 벡터 크기를 10, 출력 벡터 크기를 1로 지정해야 한다. 실제 처리는 미니배치 단위로 이루어지 기 때문에 미니배치 크기가 mb_size이면, 입력은 [mb_size, 10] 형태의 행렬이 되고 출력은 [mb_size, 1] 형태의 행렬이 된다. 이런 입출력 벡터 크기는 단층 퍼셉트론 신경망 안에 퍼셉
1장 회귀 분석 : 전복의 고리 수 추정 신경망
67
트론이 하나 있어야 하며 이 퍼셉트론이 10개의 입력 벡터 성분을 처리해야 함을 의미한다. 따 라서 가중치 정보는 [10, 1] 형태의 행렬이 되어야 하며 편향 정보는 [1] 형태의 벡터가 되어야 한다.
1.10 구현하기 : 전복 고리 수 추정 신경망 이제 전복의 고리 수를 추정하는 프로그램을 파이썬으로 작성해보자. 실습에 필요한 abalone.csv 데이터셋 파일을 캐글 사이트에서 받아 압축을 해제하자. ●●
www.kaggle.com/maik3141/abalone
또는 이 책의 깃허브 /data/chap01 폴더에서 내려받을 수도 있다. 또한 /codes/chap01 폴 더에서는 지금 소개할 구현 프로그램과 실행 프로그램을 각각 abalone.ipynb, abalone_
test.ipynb라는 이름의 주피터 노트북 파일로 내려받을 수 있다. 주피터 노트북은 하나의 파이썬 프로그램을 여러 조각cell으로 나누어 실행하는 편리한 개발 환 경을 제공한다. 이 책에서 예제 해설은 주피터 노트북 파일에 작성된 프로그램 조각인 코드 블 록 단위로 진행한다. 코드 블록은 ‘구현 코드’와 ‘실행 코드’로 구분한다. ‘구현하기’에서 코드 블록들은 신경망 프로그 램이나 데이터셋 프로그램을 구현한 ‘구현 코드’다. ‘실행하기’에서 코드 블록들은 구현된 코드 를 이용해 실제 딥러닝 모델을 만들어 실행시키고 실험 결과를 보여주는 ‘실행 코드’다. 참고로 구현 코드는 각종 선언과 정의로만 구성되기 때문에 실행해도 아무것도 출력하지 않는다. 프로 그램 실행에 따른 결과 출력은 오직 실행 코드를 실행할 때만 생성된다. 코드 블록이 지나치게 늘어나지 않도록 코드를 최대한 재활용한다. 또한 모든 예제에서 구현 코드와 실행 코드는 별개의 파일로 작성했다. 두 가지 코드를 소개하는 소단원도 명확히 구분 할 것이다. 그럼 첫 번째 예제를 살펴보자!
68
1부 단층 퍼셉트론(SLP)
1.10.1 파이썬 모듈 불러들이기 예제 프로그램 구현에 필요한 파이썬의 여러 모듈을 불러들인다. 파일명 : /codes/chap01/abalone.ipynb
import numpy as np import csv import time
➊ ➋ ➌
np.random.seed(1234) def randomize(): np.random.seed(time.time())
➍ ➎
파이썬에서 ➊ 배열 및 수치 연산을 지원하는 numpy 모듈과 ➋ 아발로니 데이터셋 파일을 읽는 데 필요한 csv 모듈, ➌ 난수 함수 초기화에 이용할 time 모듈을 불러들인다. 특히 자주 이용될 numpy 모듈은 선언된 내용에 간단한 이름으로 접근할 수 있도록 np라는 별 칭을 지정한다.
난수 발생 패턴의 고정과 실험 결과 재현 앞으로 소개할 예제 프로그램들은 난수 함수를 사용하기 때문에 실행마다 처리 결과가 달라진 다. 결과 재현이 가능해야 독자가 원활히 학습할 수 있을 것이다. 따라서 여기서는 난수 발생 패턴을 고정하는 ➍ np.random.seed(1234) 명령을 실행한다. 고 정되지 않은 난수 발생 패턴을 이용한 다양한 실험을 하려면 이 명령 호출을 삭제하거나 실행 코드를 담은 파일의 어떤 부분에서든 ➎ 현재 시각을 이용해 난수 발생 패턴을 다시 설정하는 randomize ( ) 함수를 호출하면 된다.
혹은 1234 대신 다른 값을 지정할 수도 있는데, 그러면 책에 소개된 결과와 다른 방식으로 고정 된 결과가 생성된다. 난수 발생 패턴을 고정하는 이 코드는 4.5절 ‘구현하기 : 모델 클래스’에만 한 번 더 나타날 뿐 다른 예제에 다시 나타나지 않는다. 하지만 주피터 노트북의 %run 기능을 이용한 코드 재활용 덕분에 모든 예제에서 계속 같은 효력을 미친다.
1장 회귀 분석 : 전복의 고리 수 추정 신경망
69
1.10.2 하이퍼파라미터값의 정의 프로그램에서 사용할 하이퍼파라미터 중 일부를 상수로 정의한다. 파일명 : /codes/chap01/abalone.ipynb
RND_MEAN = 0 RND_STD = 0.0030
➊
LEARNING_RATE = 0.001
➋
➊ RND_MEAN, RND_STD는 정규분포 난숫값의 평균과 표준편차다. 가중치 파라미터를 초기화 할 때 이용한다. 또한 ➋ LEARNING_RATE는 학습에 매우 커다란 영향을 미치는 중요한 하이퍼 파라미터인 학습률을 나타낸다. 뒤에 더 많은 하이퍼파라미터가 함수 매개변수 형태로 지정될 것이다. 여기에서는 일단 하이퍼파라미터를 이처럼 상수로 정의하기도 한다는 점을 알아두자. 이 예제에서 사용하는 함수 호출 관계는 다음과 같다. 그림 전복 고리 수 추정 프로그램의 함수 호출 관계 시작
abablone_exec
load_abalone_dataset
arrange_data
get_train_data
forward_neuralnet
init_model
train_and_test
get_test_data
forward_postproc
backprop_neuralnet
이제부터 함수들을 하향식(top-down) 순서로 정의해나가자.
70
1부 단층 퍼셉트론(SLP)
run_train
run_test
eval_accuracy
backprop_postproc
1.10.3 실험용 메인 함수 정의 실험용 메인 함수인 abalone_exec()를 정의한다. 파일명 : /codes/chap01/abalone.ipynb
def abalone_exec(epoch_count=10, mb_size=10, report=1): load_abalone_dataset() init_model() train_and_test(epoch_count, mb_size, report)
➊ ➋ ➌
abalone_exec() 함수를 호출하면 ➊ 데이터셋을 읽어들이는 load_ablone_dataset() 함
수, ➋ 모델의 파라미터들을 초기화하는 init_model() 함수, ➌ 학습 및 평가 과정을 수행하 는 train_and_test() 함수를 차례로 호출하여 딥러닝 모델을 생성하고 학습 전체 과정을 일 괄 처리한다. abalone_exec() 함수는 학습 횟수, 미니배치 크기, 중간 보고 주기 등 학습 과정에 관련된 하
이퍼파라미터값들을 epoch_count, mb_size, report 등의 매개변수로 지정받아 이 값들을 실제로 이용할 train_and_test() 함수에 전달한다. 이때 매개변수에 디폴트값을 지정함으로 써 함수를 호출할 때 인수를 생략할 수 있게 했다. 하이퍼파라미터값을 상수로 선언하는 대신 이처럼 매개변수로 전달하는 방식을 사용하면 다양한 설정을 더 쉽게 실험할 수 있다.
1.10.4 데이터 적재 함수 정의 데이터셋 파일 내용을 메모리로 읽어들여 이용할 수 있게 준비해주는 load_abalone_ dataset() 함수를 정의한다. 파일명 : /codes/chap01/abalone.ipynb
def load_abalone_dataset(): with open('../../data/chap01/abalone.csv') as csvfile: csvreader = csv.reader(csvfile) next(csvreader, None) rows = [] for row in csvreader:
1장 회귀 분석 : 전복의 고리 수 추정 신경망
➊ ➋ ➌ ➍
71
rows.append(row) global data, input_cnt, output_cnt input_cnt, output_cnt = 10, 1 data = np.zeros([len(rows), input_cnt+output_cnt]) for n, row in enumerate(rows): if row[0] == 'I': data[n, 0] = 1 if row[0] == 'M': data[n, 1] = 1 if row[0] == 'F': data[n, 2] = 1 data[n, 3:] = row[1:]
➎ ➏ ➐
➑
➒
load_abalone_dataset() 함수는 메인 함수에서 호출된다. csv 모듈의 기능들을 이용해 캐
글의 아발로니 데이터셋에서 가져온 ➊ abalone.csv 파일의 내용을 ➋ 메모리로 읽어들인다. 참고로 액셀에서 abalone.csv 파일의 일부 내용을 살펴보면 다음과 같다.
➌ next() 함수 호출은 파일의 첫 행을 읽지 않고 건너뛰게 만든다. Sex, Length 등 필드 이 름을 지정하는 헤더 행을 무시하기 위한 것이다. ➍ 파일 각 행에 담긴 전복 개체별 정보를 csvreader 객체를 이용해 rows 리스트에 수집한다.
한편 ➏ input_cnt와 output_cnt 변수에 입출력 벡터 크기를 각각 10과 1로 지정한다. 이 값 은 ➐ 전복 개체들의 입출력 벡터 정보를 저장할 data 행렬을 만들 때 크기 지정에 이용된다. 또한 ➎ data와 함께 전역 변수로 선언되어 다른 함수에서도 이용될 수 있다. 전복 개체별 정보를 rows 리스트에 수집한 후 다시 별도의 반복문에서 data 배열에 옮기는 다 소 번거로운 처리를 한다. 이는 ➑ 비선형인 성별 정보를 원-핫 벡터 표현으로 변환하는 처리 와 ➒ 성별 이외의 나머지 정보 항목들을 일괄 복제하는 처리를 ➍에서 한꺼번에 처리하기가 불편해서다.
72
1부 단층 퍼셉트론(SLP)
1.10.5 파라미터 초기화 함수 정의 파라미터를 초기화하는 init_model() 함수를 정의한다. 파일명 : /codes/chap01/abalone.ipynb
def init_model(): global weight, bias, input_cnt, output_cnt weight = np.random.normal(RND_MEAN, RND_STD,[input_cnt, output_cnt]) bias = np.zeros([output_cnt])
➊ ➋ ➌
메인 함수인 abalone_exec()에서 호출되는 이 함수는 단층 퍼셉트론의 가중치 파라미터 weight와 편향 파라미터 bias를 초기화한다. 이 함수는 load_abalone_dataset() 함수에
서 input_cnt, output_cnt 변수에 지정한 입출력 벡터 크기를 이용해 가중치 행렬과 편향 벡 터의 크기를 결정한다. 전복 고리 추정 예제에서 weight 가중치 행렬은 [10, 1], bias 편향 벡터는 [1] 형태로 만들어 진다. ➊ 생성된 weight와 bias 파라미터 역시 input_cnt나 output_cnt처럼 전역 변수로 선언되어 있어서 다른 함수에서 이용이 가능하다. ➋ 가중치 행렬 값들을 np.random.normal() 함수를 이용해 정규분포를 갖는 난숫값으로 초 기화한다. 경사하강법의 출발점에 해당하는 파라미터의 초깃값을 실행할 때마다 달라지게 만 들려는 의도다(실행 때마다 조금이라도 다른 결과를 내놓아야 추세를 살피고 좋은 결과를 고를 수 있다). 또한 1.6절 ‘경사하강법과 역전파’에서 소개된 지역적 바닥점을 피할 가능성을 조금 이라도 높여보려는 의도도 있다. ➌ 편향은 초기에 지나친 영향을 주어 학습에 역효과를 불러 오지 않도록 0으로 초기화하여 생성한다.
1.10.6 학습 및 평가 함수 정의 학습과 평가 과정을 일괄 실행해주는 train_and_test() 함수를 정의한다.
1장 회귀 분석 : 전복의 고리 수 추정 신경망
73
파일명 : /codes/chap01/abalone.ipynb
def train_and_test(epoch_count, mb_size, report): step_count = arrange_data(mb_size) test_x, test_y = get_test_data() for epoch in range(epoch_count): losses, accs = [], []
➊ ➋ ➌
for n in range(step_count): train_x, train_y = get_train_data(mb_size, n) loss, acc = run_train(train_x, train_y) losses.append(loss) accs.append(acc)
➍ ➎
if report > 0 and (epoch+1) % report == 0: acc = run_test(test_x, test_y) print('Epoch {}: loss={:5.3f}, accuracy={:5.3f}/{:5.3f}'. \ format(epoch+1, np.mean(losses), np.mean(accs), acc))
➏
final_acc = run_test(test_x, test_y) print('\nFinal Test: final accuracy = {:5.3f}'.format(final_acc))
➐
이 함수는 적재된 데이터셋과 초기화된 파라미터를 이용하여 학습 및 평가의 전체 과정을 수 행한다. 이 함수에서는 이중 반복을 이용해 ➌ epoch_count 인수로 지정된 에포크 수만큼 학 습을 반복하며 반복문 안에서 다시 ➍ step_count값만큼 미니배치 처리를 반복한다. 이때 step_count값은 반복문 시작 전에 ➊ arrange_data() 함수를 호출해 구하는데, 이 함수는
데이터를 뒤섞고 학습용 데이터셋과 평가용 데이터셋을 분리하는 등의 데이터 정렬 작업도 함 께 수행한다. 미니배치 처리는 ➎ get_train_data() 함수로 학습용 미니배치 데이터를 얻어와 run_ train() 함수로 학습시키는 방식으로 처리되며 이때 미니배치 단위에서의 비용과 정확도를
보고받아 리스트 변수 losses와 accs에 집계한다. 각 에포크 처리가 끝나면 ➏ report 인수로 지정된 보고 주기에 해당하는지 검사한다. 해당되 면 중간 평가 함수 run_test()를 호출한 후 그 결과를 출력한다. 이때 학습 과정에서 집계한 손실 함수와 정확도의 평균값도 함께 출력한다.
74
1부 단층 퍼셉트론(SLP)
또한 전체 에포크 처리가 끝나면 다시 ➐ 최종 평가 함수 run_test()를 호출하고 그 결과를 출력한다. 이때 중간 평가와 최종 평가에 동일한 평가용 데이터셋을 반복적으로 이용하기 때문 에 이를 이중 반복 실행 전에 미리 ➋ get_test_data() 함수를 호출해 test_x, test_y에 저 장해두어 반복해서 활용한다.
1.10.7 학습 및 평가 데이터 획득 함수 정의 앞에서 정의한 train_and_test() 함수가 학습 및 평가 데이터를 얻을 때 호출하는 세 함수를 정의한다. 파일명 : /codes/chap01/abalone.ipynb
def arrange_data(mb_size): global data, shuffle_map, test_begin_idx shuffle_map = np.arange(data.shape[0]) np.random.shuffle(shuffle_map) step_count = int(data.shape[0] * 0.8) // mb_size test_begin_idx = step_count * mb_size return step_count def get_test_data(): global data, shuffle_map, test_begin_idx, output_cnt test_data = data[shuffle_map[test_begin_idx:]] return test_data[:, :-output_cnt], test_data[:, -output_cnt:] def get_train_data(mb_size, nth): global data, shuffle_map, test_begin_idx, output_cnt if nth == 0: np.random.shuffle(shuffle_map[:test_begin_idx]) train_data = data[shuffle_map[mb_size*nth:mb_size*(nth+1)]] return train_data[:, :-output_cnt], train_data[:, -output_cnt:]
➊ ➋ ➌
➍ ➎
➏ ➐ ➑
arrange_data() 함수는 train_and_test() 함수가 이중 반복을 준비할 때 단 한 번 호출한
다. 이 함수에서는 ➊ 데이터 수만큼의 일련번호를 발생시킨 후 ➋ 무작위로 순서를 섞는다. 이렇게 만든 shuffle_map 리스트는 전역 변수로 전달되어 get_train_data() 함수와 get_ test_data() 함수에서 이용된다. 이 함수는 또한 ➌ 학습용 데이터와 평가용 데이터의 경
1장 회귀 분석 : 전복의 고리 수 추정 신경망
75
계를 test_begin_idx에 저장한 후 한 에포크 학습에 필요한 미니배치 처리 스텝 수(step_ count값)를 반환한다.
평가 데이터를 일괄 공급하는 get_test_data() 함수는 arrange_data() 함수가 test_ begin_idx에 구해놓은 위치를 경계 삼아 ➍ 인덱스 배열 shuffle_map의 후반부가 가리키는
위치의 data 행들을 평가용 데이터로서 반환한다. 이때 ➎ 각 행에 대해 뒤에서 output_cnt 번째 되는 원소 위치를 기준으로 분할해 앞 쪽을 입력 벡터, 뒷 쪽을 정답 벡터로서 반환한다. 파이썬에서는 콜론을 이용해 배열의 구간을 지정하며, 이때 구간 정보에서 생략된 값은 배열의 처음 혹은 끝을 의미한다. 또한 음수는 뒤에서부터 헤아린 위치를 지정할 때 이용되며 -1이 배 열의 마지막 원소를 가리킨다는 점을 명심하자. 학습 데이터를 공급하는 get_train_data() 함수는 get_test_data() 함수와 비슷한 처리 를 한다. ➐ 미니배치 구간의 위치를 따져 그 구간에 해당하는 shuffle_map이 가리키는 데이 터들만을 반환한다. 또한 ➏ 각 에포크 첫 번째 호출, 즉 nth값이 0일 때에 한하여 학습 데이터 부분에 대한 부분적인 순서를 뒤섞어 에포크마다 다른 순서로 학습이 수행되게 한다. 이 함수 역시 ➑ 반환하는 각 행에 대해 입력 벡터 부분과 정답 벡터 부분을 분할해 반환한다.
1.10.8 학습 실행 함수와 평가 실행 함수 정의 train_and_test() 함수가 호출하는 학습 실행 함수와 평가 실행 함수를 정의한다. 파일명 : /codes/chap01/abalone.ipynb
def run_train(x, y): output, aux_nn = forward_neuralnet(x) loss, aux_pp = forward_postproc(output, y) accuracy = eval_accuracy(output, y) G_loss = 1.0 G_output = backprop_postproc(G_loss, aux_pp) backprop_neuralnet(G_output, aux_nn) return loss, accuracy def run_test(x, y):
76
1부 단층 퍼셉트론(SLP)
➊ ➋ ➌
➍ ➎
output, _ = forward_neuralnet(x) accuracy = eval_accuracy(output, y) return accuracy
➏ ➐
미니배치 학습 처리를 담당하는 run_train() 함수는 학습용 데이터의 일부로 주어지는 미니 배치 입력 행렬 x와 정답 행렬 y를 이용해 한 스텝의 학습을 수행한다. 학습은 ➊~➋ 순전파 처리와 ➌ 보고용 정확도 계산에 이은 ➍~➎ 역전파 처리 순으로 진행된다. 먼저 ➊ forward_neuralnet() 함수가 단층 퍼셉트론 신경망에 대한 순전파를 수행하여 입력 행렬 x로부터 신경망 출력 output을 구한다. 이어서 ➋ forward_postproc() 함수가 회귀 분 석 문제의 성격에 맞춘 후처리 순전파 작업을 수행해 output과 y로부터 손실 함수 loss를 계 산한다. 이처럼 순전파 과정을 신경망 처리와 후처리로 분리한 것은 이 두 단계가 각각 독립적으로 여 러 다른 형태로 교체될 수 있기 때문이다. 예를 들어 2장과 3장에서는 forward_postproc() 함수의 후처리 과정만 이진 판단이나 선택 분류 문제의 특성에 맞추어 바꾼다. 반대로 4장 이 후부터는 forward_neuralnet() 함수만 고급 신경망 구조에 맞추어 바꾼다. 이처럼 두 단계 로 분리하면 다양한 신경망 구조와 문제 유형에 맞게 후처리 과정을 조합할 수 있다. 순전파를 처리하는 두 함수는 output과 loss라는 본연의 임무에 따른 출력 외에 aux_nn과 aux_pp라는 값을 추가로 반환한다. 이는 역전파에 필요한 정보 가운데 순전파 과정에서 확보
가능한 것들을 챙겨 역전파 함수에 전달하려는 것이다. 이들 정보 가운데는 다른 데에서 구할 수 없어서 반드시 전달해야 하는 정보도 있지만 불필요한 반복 계산을 줄여 효율을 높이려고 전달하는 정보도 있다. ➌ 순전파 처리 후에는 eval_accuracy() 함수를 호출해 정확도를 구한 후 역전파 처리 후에 반환할 수 있도록 accuracy 변수에 저장한다. 순전파 처리와 정확도 계산이 끝나면 손실 기울기 G_loss값을 1로 지정하는데 이는
∂L = 1이 ∂L
니 너무나 당연한 이야기지만 바로 여기가 역전파의 시작점이 된다. 역전파 함수는 항상 순전파 함수의 역순으로 호출되어야 한다. 순전파 때 출력이었던 성분의 손실 기울기를 입력으로 받아 내부 처리를 마친 후 순전파 때 입력이었던 성분의 손실 기울기 를 반환해야 하기 때문이다.
1장 회귀 분석 : 전복의 고리 수 추정 신경망
77
따라서 ➍ 순전파 뒷 단계였던 후처리 과정에 대한 역전파 함수 backprop_postproc()가 먼 저 호출되어 G_loss로부터 G_output을 구한다. 이때 순전파 함수가 역전파용 보조 정보로서 보고했던 aux_pp도 제공된다. 이어서 ➎ 순전파 첫 단계인 backprop_neuralnet() 함수가 호출되는데 이 함수는 원칙적으로 G_output으로부터 G_x를 구해야 맞다. 하지만 x는 딥러닝 알고리즘이 손댈 수 없는 고정된 값이고 더 이상 수행될 역전파도 없으니 따로 반환값을 챙길 필요는 없다. 중요한 점은 backprop_neuralnet() 함수가 실행되는 중에 신경망 파라미터값 의 변화, 즉 학습이 실제로 일어난다는 점이다. 평가 데이터 전체에 대해 일괄적으로 평가를 수행하는 run_test() 함수는 ➏ 신경망 부분에 대한 순전파 처리만 수행한 후 바로 ➐ eval_accuracy() 함수를 호출해 정확도를 계산해 반 환한다. 학습 때와 달리 ‘손실 함수 계산을 위한 후처리 과정’과 ‘학습을 위한 역전파 과정’이 필 요 없으므로 이처럼 간단한 처리로 충분하다. forward_neuralnet() 함수의 반환값 가운데 역전파용 보조 정보 역시 필요 없으므로 ‘_’를 이용해 무시한다.
1.10.9 단층 퍼셉트론에 대한 순전파 및 역전파 함수 정의 단층 퍼셉트론 신경만 부분에 대해 순전파 처리와 역전파 처리를 수행하는 두 함수를 정의한다. 파일명 : /codes/chap01/abalone.ipynb
def forward_neuralnet(x): global weight, bias output = np.matmul(x, weight) + bias return output, x def backprop_neuralnet(G_output, x): global weight, bias g_output_w = x.transpose()
78
➊
➋
G_w = np.matmul(g_output_w, G_output) G_b = np.sum(G_output, axis=0)
➌ ➍
weight -= LEARNING_RATE * G_w bias -= LEARNING_RATE * G_b
➎
1부 단층 퍼셉트론(SLP)
너무 간단해 허탈할지 모르지만 이 두 함수가 사실은 단층 퍼셉트론 신경망 처리와 관련된 전 부이다. 아직 재활용할 코드가 없는 첫 예제인 만큼 신경망 자체보다는 신경망을 이용해 문제 를 푸는 부분이 프로그램의 대부분을 차지하고 있다. 단층 퍼셉트론 신경망에서 순전파를 처리하는 forward_neuralnet() 함수는 ➊ 입력 행렬 x에 대해 가중치 행렬 weight를 곱하고 편향 벡터 bias를 더하는 간단한 방법으로 신경망 출
력에 해당하는 output 행렬을 만든다. 이때 가중치 곱셈은 행렬끼리의 곱셈이고 편향 덧셈은 행렬과 벡터의 덧셈이다. 실제 실행 과정에서 x는 학습용 미니배치 데이터 혹은 평가 데이터 전체에 대해 10가지 특징 값을 갖는 행렬이니 데이터 수에 해당하는 행 수를 N이라 할 때 [N, 10] 형태가 된다. 한편 weight는 [10, 1] 형태이므로 이 두 행렬을 곱하면 [N, 1] 형태의 결과를 얻게 된다. 여기에
[1] 형태의 편향을 더하려면 형태가 맞지 않는데 이 경우 파이썬 인터프리터는 행렬의 각 행에 편향 벡터를 반복하여 더한다. 이런 계산 과정은 1.2절 ‘텐서 연산과 미니배치의 활용’의 그림 에서 ⓒ에 해당한다. forward_neuralnet() 함수는 이렇게 생성된 신경망 출력 output 행렬 과 역전파에 이용될 보조 정보로 x를 반환한다. backprop_neuralnet() 함수는 역전파 처리를 수행한다. 순전파 출력 output에 대한 손실
기울기 G_output을 전달받아 ➌, ➍ weight와 bias 성분의 손실 기울기 G_w와 G_b를 구한 다. ➎ G_w와 G_b 값에 학습률을 곱한 값을 weight와 bias에서 빼줌으로써 가중치와 편향 파 라미터에 대한 실제 학습을 수행한다. 이때 역전파용 보조 정보로 전달된 x를 이용해 ➋ x와 output 사이의 부분 기울기 g_output_w를 구해 G_w 계산에 이용한다.
참고로 x의 행 수, 즉 미니배치 크기를 N이라 할 때 g_output_w는 x의 전치행렬이므로 [10,
N] 형태가 되고 G_output은 output과 같은 [N, 1] 형태로 전달된다. 따라서 두 행렬의 곱인 G_w는 [10, 1]로서 weight와 같은 형태로 계산된다. 또한 G_output의 각 행을 합산한 G_b는
[1]로서 역시 bias와 같은 형태가 되어 학습률을 이용한 뺄셈이 아무 문제 없이 수행된다. 이 과정에서 학습률을 이용한 뺄셈은 1.7절 ‘편미분과 손실 기울기의 계산’을 참고하기 바란다. 또한 weight와 bias 성분의 손실 기울기를 구하는 수학적 원리는 아래의 글상자를 참고하기 바란다. 사실 이 책을 공부하는 데 수학적으로 깊은 이해가 필요한 것은 아니다. 수학을 멀리하 고 싶은 독자라면 건너뛰어도 예제를 따라가는 데 큰 지장은 없다. 하지만 알아두면 피가 되고 살이 될 내용이다.
1장 회귀 분석 : 전복의 고리 수 추정 신경망
79
가중치의 손실 기울기 행렬 연산 Y = XW + B가 수행되면 원소 Yi j는 입력 행렬 X의 i-행 벡터와 가중치 행렬 W 의 j-열 벡터 사이의 내적에 편향 벡터 B의 원소 Bj를 더한 값으로 계산된다. 즉 Yi j = Xi1W1 j + Xi2W2 j + ... + XinWn j + B j이다. 여기에서 Wk j 성분에 곱해지는 계수는 Xik이고 따라서 ∂Yij = Xik 이다. ∂Wkj
이제 Yi j 성분의 손실 기울기가
∂L = Gij 로 구해졌다고 하자. 이때 Wk j 성분이 L에 미치는 영 ∂Yij ∂L ∂Y
ij 향 가운데 Yi j를 통해 미치는 부분만 따진다면 ∂Y ∂W = Gij Xik 이다. 그런데 Wk j는 Y의 j-열 벡 ij kj
터를 이루는 Y1 j, Y2 j, ..., Ym j 원소들 모두의 계산에 이용되고 이들을 통해 L에 여러 경로로 영 향을 미치므로 Wk j의 손실 기울기는 이들 경로 각각을 통해 얻어지는 기울기 성분을 모두 합한
G1 j X1 k + G2 j X2 k + ... + Gn j Xnk이다. 이 모양을 행렬곱셈에 알맞은 형태로 바꿔보자. X 대신 행과 열이 뒤바뀐 전치행렬 T=X⊤를 사용하면
∂L = 다음과 Tk1G1 j +같다. Tk 2G2 j + ... + TkmGmj 는 ∂Wkj
∂L = Tk1G1 j + Tk 2G2 j + ... + TkmGmj ∂Wkj
각 원소에 대해 이와 같은 방식으로 계산되므로 가중치 행렬 W 손실 비용 기울기는 W와 같은 크기의 행렬이 되며
∂L = TG = X T G 로 계산된다. ∂W
편향의 손실 기울기 Y = XW + B일 때 Yi j = Xi1W1 j + Xi2W2 j + ... + Xin Wn j + B j이므로 따라서
∂L = Gij ∂Yij
라면
∂L ∂Yij = Gij ∂Yij ∂B j
∂Yij = 1 이다. ∂B j
이다.
Bj 역시 Y1 j ,Y2 j, ...,Ym j, 모두를 통해 L값에 영향을 미치므로
∂L ∂B j
는 다음과 같다.
∂L = G1 j + G2 j + ... + Gmj ∂B j 이 계산은 1로 채워진 행렬과 G의 곱으로 구할 수도 있겠지만 구현 코드에서와 같이 단순히 G 의 각 행의 합을 구하는 간단한 방법으로도 구할 수 있다.
80
1부 단층 퍼셉트론(SLP)
1.10.10 후처리 과정에 대한 순전파 및 역전파 함수 정의 후처리 부분에 대한 순전파 처리와 역전파 처리를 수행하는 두 함수를 정의한다. 파일명 : /codes/chap01/abalone.ipynb
def forward_postproc(output, y): diff = output - y square = np.square(diff) loss = np.mean(square) return loss, diff
➊
def backprop_postproc(G_loss, diff): shape = diff.shape g_loss_square = np.ones(shape) / np.prod(shape) g_square_diff = 2 * diff g_diff_output = 1
➋
G_square = g_loss_square * G_loss G_diff = g_square_diff * G_square G_output = g_diff_output * G_diff
➌
return G_output
후처리 부분의 순전파는 단층 퍼셉트론 신경망이 생성한 출력으로부터 손실 함숫값을 구하는 과정이다. 이 예제에서 forward_postproc() 함수는 회귀 분석 문제에서 손실 함수로 이용되 는 ➊ 평균제곱오찻값을 구하는 세 단계 연산을 차례로 수행한다. 신경망 출력 output과 정답 행렬 y에 대해 각 행렬 원소 짝에 대한 오차와 그 제곱을 diff와 square에 차례로 구하고, 이 들의 평균으로 loss를 구한다. 이때 diff와 square는 y나 output과 같은 [N, 1] 형태의 행렬 로 계산되지만 loss는 평균 계산에 의해 손실 함수에 해당하는 단 하나의 값, 즉 스칼라 텐서가 된다. 역전파 처리를 수행하는 backprop_postproc() 함수는 1.0으로 설정된 채 매개변수로 전달 되는 G_loss값을 이용해 순전파 역순으로 G_output을 구해 반환한다. 이 함수는 ➌ 평균, 제 곱, 오차 연산에 대한 역전파 처리를 차례로 수행하면서 G_loss로부터 G_square, G_diff 를 거쳐 G_output를 구한다. 이때 ➋ 각 단계 입출력 간 부분기울기를 g_loss_square, g_
1장 회귀 분석 : 전복의 고리 수 추정 신경망
81
square_diff, g_diff_output에 구해놓고 손실 기울기의 연쇄적 계산에 활용한다. 각 부분
기울기가 어떻게 구해지는지는 아래의 글상자를 참고하자. 한편 g_square_diff 계산에는 순전파 때 계산된 diff값이 필요하기 때문에 이를 역전파용 보조 정보로 전달해 이용한다. 참고로 이 함수에 사용되는 G_loss와 g_diff_output은 둘 다
1.0값을 갖는 스칼라 변수다. 나머지 g_loss_square, g_square_diff, G_square, G_diff, G_output은 모두 [N,1] 형태의 행렬들이다. G_loss와 g_diff_output은 물론 np.ones() 함수의 실행 결과까지도 값이 모두 곱셈의 항등
원인 1이다. 따라서 backprop_postproc() 함수를 다음과 같이 줄여 표현할 수 있다. 앞의 구 현 코드에서는 역전파 처리 과정에 대한 이해를 돕기 위해 자세히 기술했을 뿐이다. def backprop_postproc_oneline(G_loss, diff): return 2 * diff / np.prod(diff.shape)
평균제곱오차의 역전파 처리 순전파가 편차 → 제곱 → 평균의 순서로 output에서 diff, square, loss를 구하므로 역전파 는 반대의 순서로 loss의 손실 기울기 1로부터 square, diff, output의 손실 기울기를 구해 낸다. 이때 loss만 스칼라값일 뿐 나머지는 모두 [미니배치 크기, 출력벡터 크기], 즉 [N, 1]의 크기를 갖는다. 이들 성분들의 부분 기울기를 역전파 처리 순서에 따라 하나씩 따져 보자. M
우선 평균 연산에 대해서는
L=
N
∑ ∑ square i=1 j=1
MN
ij
이고 따라서
∂L 1 = ∂squareij MN
이다. 이 값들을
square 텐서와 같은 구조로 모은 것이 G_loss_square이다. 또한 제곱 연산에 대해서는 squareij = diffij 2
이므로
∂squareij = 2diffij ∂diffij
이다. 모든 원소에 대해 이 간단한 관계가 성립하므로
square와 diff 사이의 부분 기울기는 2 × diff의 간단한 계산으로 구할 수 있다. 끝으로 편
차 연산에 대해서는 한편 같은 식에서
diffij = outputij − yij 이어서
∂diffij = −1 이어서 y와 diff ∂yij
∂diffij = 1이다. ∂outputij
사이의 부분 기울기, 나아가 y의 손실 기울기도 쉽게
구해낼 수 있지만 y는 데이터셋으로부터 주어진 값으로서 내용을 바꿀 수 있는 가변적 성분이 아니어서 파라미터 학습과 무관하므로 y에 대해서는 굳이 계산할 필요가 없다.
82
1부 단층 퍼셉트론(SLP)
1.10.11 정확도 계산 함수 정의 회귀 분석 문제의 특성에 알맞게 정확도를 계산하는 eval_accuracy() 함수를 정의한다. 파일명 : /codes/chap01/abalone.ipynb
def eval_accuracy(output, y): mdiff = np.mean(np.abs((output - y)/y)) return 1 - mdiff
➊
회귀 분석 문제에서 정확도를 정의하는 다양한 시각이 있다. 여기에서는 정답과 오차의 비율을 오류율로 보고 ➊ 1에서 오류율 평균을 뺀 값으로 정확도를 정의한다.
1.11 실행하기 구현된 프로그램 내용을 실행해 동작을 확인하는 실행 코드를 작성해보자. 실행 코드를 간단히 구현 코드와 같은 파일에 덧붙여 작성해도 되지만 이렇게 할 경우 나중에 다른 구현용 파일에 서 코드를 재활용할 때 방해가 된다. 따라서 실행 코드들은 구현 코드와 분리해 abalone_test.ipynb 파일에 따로 작성한다.
1.11.1 구현 코드 파일 실행 첫 번째 실행 코드에서는 앞서 작성한 구현 코드를 담은 노트북 파일 내용을 실행한다. 파일명 : /codes/chap01/abalone_test.ipynb
%run abalone.ipynb
이 명령은 abalone.ipynb 파일의 구현 코드들을 모두 실행한다. 구현 코드는 모두 상수나 함 수를 정의할 뿐이다. 정의된 함수를 호출하지 않아 출력은 없다.
1장 회귀 분석 : 전복의 고리 수 추정 신경망
83
1.11.2 전복 고리 수 추정 신경망 실행 메인 실행 함수 abalone_exec()를 호출하여 전복 고리 수 추정 신경망을 학습시키고 평가하 는 전체 과정을 실행한다. 파일명 : /codes/chap01/abalone_test.ipynb
abalone_exec()
➊
Epoch Epoch Epoch Epoch Epoch Epoch Epoch Epoch Epoch Epoch
➋ ➌
1: loss=33.875, accuracy=0.557/0.812 2: loss=8.226, accuracy=0.820/0.814 3: loss=7.582, accuracy=0.812/0.809 4: loss=7.475, accuracy=0.808/0.811 5: loss=7.395, accuracy=0.810/0.809 6: loss=7.328, accuracy=0.808/0.810 7: loss=7.269, accuracy=0.808/0.811 8: loss=7.217, accuracy=0.808/0.812 9: loss=7.175, accuracy=0.810/0.810 10: loss=7.135, accuracy=0.809/0.810
Final Test: final accuracy = 0.810
➍
필요한 함수들을 하향식 순서로 모두 정의했다. ➊ abalone_exec() 함수를 호출하면 디폴트 인숫값으로 지정된 10에포크만큼 학습이 수행되며 중간 출력과 평가 결과가 화면에 출력된다. 이때 주피터 노트북의 ‘Kernel | Restart & Run All’ 명령을 이용해 abalone_test.ipynb 파 일 내용을 일괄 실행하면 난수 패턴 고정 처리 때문에 항상 위의 출력 내용과 동일한 결과가 얻 어진다. 하지만 이 실행 코드만 따로 반복해서 실행하거나 randomize() 함수 호출 후 실행하 면 여기저기 사용된 난수 함수들 때문에 실행할 때마다 실행 결과가 다르다. 정확도 역시 그때 그때 달라지지만 대체로 큰 차이는 없을 것이다. 예시된 결과를 보면 ➋ 첫 에포크 처리에서 이미 81.2% 수준의 정확도가 얻어졌고 ➌ 추가 학습 에서도 품질이 향상되지 않는다. ➍ 최종 평가에서의 정확도는 81.0%로 오히려 첫 에포크 학습 후의 결과보다 낮다. 퍼셉트론을 하나만 이용하는 너무 간단한 단층 퍼셉트론 신경망의 한계일 수도 있지만 문제 자체의 한계일 가능성도 있다. 손실 함숫값인 loss가 꾸준히 줄어들고 있는데 도 추정 정확도가 제자리 걸음이기 때문이다. 예를 들어 사람 나이를 키나 몸무게 등 몇 가지 외 형적 특징만으로 얼마나 정확하게 추정할 수 있을까? 이 문제도 이와 비슷한 경우일지 모른다.
84
1부 단층 퍼셉트론(SLP)
1.11.3 학습된 파라미터값 확인 학습 결과 구해진 파라미터 내용이 궁금하다면 다음과 같이 weight와 bias 변수를 출력하여 어떤 값인지 확인할 수 있다. 파일명 : /codes/chap01/abalone_test.ipynb
print(weight) print(bias) [[1.02697603] [1.47450981] [1.66960135] [2.04468668] [1.62513525] [0.60292627] [2.39993815] [0.54107313] [0.46878034] [1.01969382]] [4.16894769]
➊ ➋ # # # # # # # # # # #
가중치: 유충 여부
➌
가중치: 수컷 여부 가중치: 암컷 여부 가중치: 키 가중치: 지름 가중치: 높이 가중치: 전체 무게 가중치: 몸통 무게 가중치: 내장 무게 가중치: 껍질 무게 편향
➍
➊ weight값과 ➋ bias값을 출력해 ➌, ➍ 학습을 통해 파라미터값들이 실제로 어떻게 구해졌 는지 확인할 수 있다. 하지만 파라미터 내용은 난수 초깃값을 이용한 학습 결과이므로 실행 때 마다 값이 달라질 수 있다. 또한 예시된 실행 결과에서 주석으로 표시한 부분은 실제 출력이 아 니라 이해를 돕기 위해 집필 과정에서 추가한 내용이다. 가중치 각 항목이 입력 벡터의 어떤 정 보에 곱해지는지를 나타낸 것이니 오해 없기 바란다. 제시된 결과를 토대로 키와 전체 무게가 고리 수를 짐작하는 데 특히 중요하다거나, 높이나 몸 통 무게, 내장 무게가 비교적 덜 중요하다는 이야기를 할 수 있다. 하지만 반복 실험을 해보면 전혀 다른 조합의 파라미터 구성이 비슷한 결과를 내기도 하므로 섣부른 판단은 금물이다. 그런데 이처럼 학습된 파라미터값을 쏟아놓고 내용을 검토하는 경우가 아주 없지는 않겠지만 그런다고 해서 의미 있는 정보를 얻기는 어렵다. 고급 구조로 갈수록 파라미터 수가 엄청나게 많아져서 만만한 작업도 아니다. 따라서 잘 학습된 파라미터가 비록 중요한 정보이기는 하지만 보통은 일종의 블랙박스처럼 이용할 뿐이며 앞으로 이 책에서도 지금처럼 파라미터 내용을 출 력해 살피는 일은 없다.
1장 회귀 분석 : 전복의 고리 수 추정 신경망
85
학습을 마친 이 파라미터 조합을 가지고 실제 업무를 처리하려면 어떻게 해야 할까? 현장의 전 복 개체들로부터 수집된 특징값들을 x에 저장한 후 output = forward_neuralnet(x)까지 만 계산하면 output에 추정된 고리 수를 구할 수 있으며 (output +1.5)가 나이에 해당한다. 다만 이러한 추정은 단층 퍼셉트론을 이용할 경우 정확성이 80% 수준일 뿐이고 신경망 구조를 고급화한다고 해도 정확성이 그다지 높아지지 않을 것이다. 전복의 품종이나 양식 조건이 달라 져 특징값 분포가 아발로니 데이터셋과 달라질 경우 정확성은 더욱 떨어질 것이다. 이런 점을 감수하고서도 인공지능 기법으로 전복 나이를 추정할 것인지는 현장에서 여러 상황을 고려해 선택할 문제다.
1.11.4 하이퍼파라미터 바꾸어 실행하기 같은 구조의 딥러닝 모델이라도 하이퍼파라미터값을 바꾸면 학습 과정과 결과가 달라질 수 있 다. 아래의 실행 코드는 학습 횟수와 미니배치 크기, 그리고 보고주기를 바꾸어 실험해본 것 이다. 파일명 : /codes/chap01/abalone_test.ipynb
LEARNING_RATE = 0.1 abalone_exec(epoch_count=100, mb_size=100, report=20)
➊ ➋
Epoch Epoch Epoch Epoch Epoch
➌
20: loss=5.804, accuracy=0.825/0.831 40: loss=5.259, accuracy=0.834/0.828 60: loss=5.056, accuracy=0.837/0.838 80: loss=4.950, accuracy=0.838/0.840 100: loss=4.910, accuracy=0.840/0.826
Final Test: final accuracy = 0.826
➍
➎
좋은 모델을 개발하려면 여러 하이퍼파라미터값을 다양하게 바꾸어가며 실험해봐야 한다. 이 번 예제처럼 간단한 모델에서 일찌감치 다양한 시도를 해보며 각 하이퍼파라미터값에 대한 감 을 키워놓는 것도 좋다. abalone_exec() 함수를 정의할 때 세 가지 하이퍼파라미터값을 함수 호출의 인숫값으로 지정해 바꿀 수 있게 했다. 이 값들을 바꿔가면서 실험하여 얼마 정도의 값 이 적당하며 값이 그보다 커지거나 작아질 때 어떤 영향을 미치는지 확인해보자.
86
1부 단층 퍼셉트론(SLP)
또한 ➊ 상수로 선언한 하이퍼파라미터도 이 실행 코드에서 LEARNING_RATE값을 바꿔 실험할 수 있다. 특히 학습률과 미니배치 크기는 학습에 가장 큰 영향을 주는 하이퍼파라미터이므로 꼭 다양한 값으로 바꿔보기 바란다. 학습률을 바꾼 후 ➋ 매개변수로 전달되는 여러 가지 인숫 값도 바꿔 실험한 결과 앞의 실험보다 높은 ➎ 82.6%의 정확도를 얻었다. 게다가 ➌ 첫 20에 포크의 학습 결과가 이 기록을 상회했고 ➍ 중간에 더 우수한 결과가 나왔다.
실행하기 단원과 실행 코드, 실험 이 책 각 장의 말미에는 실행하기 단원이 있다. 이들 단원에 있는 실행 코드들은 구현하기 단원 에서 작성된 구현 코드들을 이용하여 다양한 딥러닝 신경망 모델을 만들고 그 성능을 확인한다. 이를 위해 실행하기 단원의 실행 코드들은 여러 가지 처리 과정을 수행한다. 물론 처리 과정의 중 심에는 ‘학습’이 있다. 하지만 학습에 앞서 신경망 모델의 설계와 구성, 데이터셋의 준비가 이루어 져야 한다. 학습 후에는 학습 데이터와 별도로 준비한 데이터로 학습 성과를 확인하는데 이를 ‘평 가’라고 한다. 학습 중에도 적은 양의 데이터로 학습 성과를 중간중간 확인하기도 하는데 이를 ‘검 증’이라고 한다. 정확도 같은 숫자로 학습 성과를 확인하는데 그치지 않고 실제 어떤 식으로 데이 터 처리가 일어나는지 확인할 수 있는 출력을 생성하기도 하는데 이를 ‘시각화’라고 한다. 이들 과정을 한 마디로 퉁쳐서 ‘학습’이라 하기 쉽지만 학습은 이 과정 속의 한 단계일 뿐이다. 이 책에서는 모델 설계, 모델 구성, 데이터셋 준비, 학습, 평가, 검증, 시각화 등의 과정의 일부 혹은 전부를 필요한 순서에 따라 진행하는 것을 ‘실험’이라 부르기로 한다.
한 마디로 실행하기 단원 속의 실행 코드들은 딥러닝 모델에 대한 다양한 실험을 수행하기 위한 코드인 것이다.
1.12 마치며 1장에서는 단층 퍼셉트론을 이용하여 회귀 분석 문제를 해결하는 과정을 살펴보고 이를 이용 해 전복 개체의 껍질 고리 수를 추정하는 신경망을 구현했다. 이 과정에서 딥러닝 프로그램의 전체적인 구조가 만들어졌다. 2장과 3장에서는 이 구조를 재활용하면서 이진 판단 문제와 선 택 분류 문제에 도전해보자.
1장 회귀 분석 : 전복의 고리 수 추정 신경망
87
CHAPTER
2
이진 판단 : 천체의 펄서 여부 판정 신경망
2장 이진 판단 : 천체의 펄서 여부 판정 신경망
89
어떤 천체가 펄서인지 아닌지 판정하는 이진 판단 신경망을 만들어보자. 신경망은 단층 퍼셉트 론으로 구현하며, 캐글의 펄서 예측 데이터셋을 활용한다. 실습을 하기에 앞서 펄서 예측 데이터셋을 내려받아두자. ●●
펄서 예측 데이터셋 : www.kaggle.com/pavanraj159/predicting -a -pulsar -star
이 장에서 다루는 내용은 다음과 같다. ●●
펄서 판정 문제
●●
이진 판단 문제와 시그모이드 함수
●●
확률 분포, 정보 엔트로피, 교차 엔트로피
●●
시그모이드 교차 엔트로피와 편미분
●●
계산값 폭주 문제와 시그모이드 관련 함수의 안전한 계산법
●●
펄서 여부 판정 신경망 구현과 실행
2.1 펄서 판정 문제 펄서는 1968년 영국의 천체물리학자 조셀린 벨 버넬과 안토니 휴이시가 발견한 천체다. 보통 의 별이 가시광선을 내뿜는 것과 달리 펄서는 주로 전파를 주위에 내뿜는다. 1.5밀리초 내지
8.5초 정도의 빠른 주기로 신호의 세기가 변동하기 때문에 맥동전파원이라고도 부른다. 그림 특정 방향으로 강력한 전자기파를 내뿜는 펄서
출처 : bit.ly/2HppiVI
1968년 펄서가 보내는 전파 신호가 처음 발견되자 한때 외계의 지적 생명체가 쏘아보내는 등
90
1부 단층 퍼셉트론(SLP)
대신호라는 주장까지 등장했다. 하지만 이 신호의 정체는 강한 자기장을 가진 채 빠르게 자전 하는 중성자별이 내뿜는 강력한 전자기파로 밝혀졌다. 중성자별은 핵융합 원료를 소진한 커다 란 별이 중력에 짓눌리면서 만들어지는 어둡고 무거운 별이다. 펄서의 맥동은 중성자별의 자전 에 따라 전자기파 회전 방향이 바뀌어 생긴다. 즉 전자기파의 세기 자체가 변하는 것이 아니라 자전으로 인해 방출 방향이 우리를 향할 때 신호가 강해지고 그렇지 않을 때 약해지는 것이다. 어떤 천체가 펄서인지 확인하려면 전자기파 변화를 찾아야 한다. 전파망원경에 포착되는 무수 히 많은 천체에 대해 일일이 이런 작업을 수행하는 것은 비효율적이다. 쉽게 관측되는 다른 성 질을 활용해 천체가 펄서인지를 높은 확률로 추정할 수 있다면 유력한 후보들을 추릴 수 있다. 이렇게 걸러진 소수의 후보들을 집중적으로 정밀하게 관측하면 빠르게 더 많은 펄서를 확인하 고 유용한 정보를 수집할 수 있다. 캐글의 펄서 예측 데이터셋에는 천체 1만 7,898개에 8가지 특징값과 펄서 여부가 표시되어 있 다. 8가지 특징은 ‘integrated profile’과 ‘DM-SNR curve’ 값에 대한 평균과 표준편차, 첨도, 뒤틀림 등을 포함한다. 전파천문학의 전문 영역에 속하는 이들 특징값이 구체적으로 어떤 내용 인지는 몰라도 된다. 이는 오히려 딥러닝 같은 데이터 기반의 인공지능 기법이 문제 내용을 이 해하지 못해도 문제를 풀 수 있다는 중요한 사실을 확인하는 기회가 될 것이다. 데이터셋에서
1,639개만 실제로 펄서이며 나머지 대부분은 펄서가 아니다. 이 데이터셋 정보를 이용해 임의의 천체에 대해 펄서 여부를 판정하는 인공지능 신경망을 만들 어보자.
2.2 이진 판단 문제의 신경망 처리 이진 판단 문제는 예/아니오 혹은 0/1 같은 두 가지 값 중 하나로 답하는 문제다. 펄서 여부 판정 문제도
천체가 펄서인지 묻는 질문에 예/아니오로 답하면 되므로 이진 판단 문제다. 얼핏 생각하면 숫자값을 구하는 회귀 분석 문제에 비해 단답형인 이진 판단 문제가 더 쉬울 것 같다. 안타깝게도 이진 판단 문제를 인공지능 신경망으로 처리하는 일은 생각보다 까다롭다. 우선 가중치와 편향을 이용하는 퍼셉트론의 선형 연산은 기본적으로 두 가지 값으로 결과를 제 한할 수 없다. 이에 따라 초기에는 선형 연산 결과가 임계치를 넘는지에 따라 두 가지 값 중 하
2장 이진 판단 : 천체의 펄서 여부 판정 신경망
91
나를 출력하는 방법이 고려되었으나 미분이 불가능해 학습이 어려워지는 문제가 생긴다. 이 때문에 신경망은 확률에 해당하는 값을 추정하고 이 값이 1에 가까우면 참, 0에 가까우면 거짓을 선택하는 방식을 생각하게 되었다. 하지만 퍼셉트론의 선형 연산 자체는 0과 1 사이의 확률값으로 출력 범위를 제한하는 것마저도 불가능하다. 이에 따라 선형 연산에서는 일단 범위 에 제한이 없는 실숫값을 생산하고 이를 확률값의 성질에 맞게 변환해주는 비선형 함수를 찾아 내 이용하게 되었다. 이것이 뒤에 소개할 시그모이드 함수다. 그런데 시그모이드 함수를 이용해 신경망 출력을 확률로 해석하고도 어떻게 학습해야 할지 몰 라 어려움이 많았다. 1.5절 ‘회귀 분석과 평균제곱오차(MSE) 손실 함수’에서 설명한 것처럼 딥 러닝에서는 값이 0 이상이면서 추정이 정확해질수록 작아지는 성질이 있는 손실 함수를 정의 할 수 있어야 한다. 그래야 이 손실 함숫값을 줄이는 것을 목표로 삼아 경사하강법을 이용한 학 습이 가능하기 때문이다. 하지만 이진 판단 문제에서 손실 함수를 어떻게 정의해야 하는지 쉽 게 알 수 없었다. 이 문제는 한동안 딥러닝 발전을 가로막은 난제가 되었다. 이 문제를 해결해 준 것은 두 가지 확률 분포가 얼마나 다른지를 숫자 하나로 표현해주는 교차 엔 트로피라는 개념이었다. 항상 양수이고 두 확률 분포가 비슷해질수록 값이 작아지는 교차 엔트 로피값은 이진 판단 문제에 대한 손실 함수로 적합했고 그 덕분에 시그모이드 함수의 교차 엔트 로피값을 손실 함수로 정의하는 방법으로 이진 판단 문제를 다루는 신경망 학습이 가능하게 되었 다. 시그모이드 함수와 이 함수의 교차 엔트로피에 대해서는 뒤에서 차례로 살펴보기로 한다. 그런데 신경망 출력의 해석을 시그모이드 함수에 맡기고 손실 함수 계산을 시그모이드 함수의 교차 엔트로피 개념을 이용해 처리하면, 나머지 신경망 처리나 신경망을 둘러싼 주변의 처리는 회귀 분석 문제와 크게 다르지 않다. 이에 따라 이번 절에서 다루는 펄서 여부 판정 프로그램은 전복 고리 수 추정 프로그램에서 데이터셋 관련 부분과 시그모이드 함수 관련 부분만 새로 작 성한다. 나머지는 코드를 재활용한다.
2.3 시그모이드 함수 시그모이드 함수sigmoid function는 범위에 제한 없는 임의의 실숫값을 입력으로 받아 확률값의 범위에 해당하 는 0과 1 사이의 값을 출력하는 함수다. σ(x)로 표시한다.
92
1부 단층 퍼셉트론(SLP)
시그모이드 함수는 입력 x가 어떤 확률값의 로짓logit 표현이라고 간주한다. 여기에서 로짓이란 실제 표현하려는 값을 로그값으로 대신 나타낸 것이다. 시그모이드 함수는 이 로짓값 x를 확률 값으로 변환해주는 함수이다. 그런데 로짓값은 상대적이다. 예를 들어 ‘월드컵에서 한국이 우승할 확률의 로짓값은 2다’는 무 엇을 뜻할까? 이 말만으로는 정확한 의미를 알 수 없다. 이 말이 의미를 가지려면 같은 대회에 서 ‘브라질 우승 확률의 로짓값은 5’, ‘파나마 우승 확률의 로짓값은 1’과 같은 비교 로짓값이 있 어야 한다. 이때 로그함수는 지수함수의 역함수이기 때문에 브라질의 우승 확률은 한국의 우승 확률보다 e5-2 =e3 =20.1배 가량 크다. 또한 한국의 우승 확률은 파나마보다 e2-1 =e1 =2.7배 정도 크다. 로짓값으로 표시하면 넓은 범위의 값을 간단히 표현할 수 있다. 또한 값의 변화를 변화량보다 변화 비율 관점에서 더 민감하게 포착할 수 있다. 예들 들어 지진 규모를 나타내는 진도는 대표 적인 로짓 표현이다. 진도가 0.2 커질 때마다 지진의 에너지는 2배가 된다. 따라서 진도가 1 커 지면 에너지는 32배 커진다. 지진 에너지가 얼마 증가했는지보다 몇 배 증가했는지가 더 중요 한 관심사라면 진도는 지진을 나타내는 훌륭한 표현 방법이다. 인간의 뇌에서 자극을 인식하고 정보를 처리할 때 본능적으로 자극값들을 로짓 표현으로 바꾸 어 인식하는 경우가 많다. 예를 들어 소음 정도를 나타내는 데시벨(dB)은 소리가 지니는 에너 지의 로짓 표현인데 뇌가 인식하는 소음의 정도는 소음의 에너지 자체보다 데시벨로 표현한 값 에 더 가깝다. 10억과 1,000억의 중간 정도 되는 숫자를 생각할 때 산술평균값인 505억이 아 니라 기하평균값인 100억이 머리에 떠오른다면 그 사람은 자신도 모르게 로짓 단위로 값의 크 기를 헤아리고 있는 것이다. 시그모이드 함수는 입력값을 ‘답이 참일 가능성을 로짓으로 표시한 값’이라고 간주한다. 그런데 로짓은 상대적인 값이므로 정확한 의미를 알려면 비교 대상이 필요하다. 시그모이드 함수에서 는 남은 또 하나의 가능성인 답이 거짓일 경우에 대한 로짓값을 0으로 간주하는 방법으로 시그 모이드 입력값이 나타내는 확률의 정확한 값을 구할 근거를 마련한다. 1
시그모이드 함수는 σ ( x ) = 1+ e− x 로 정의된다. 시그모이드의 입력이 로짓값이고 비교 대상이 거짓인 경우의 로짓값 0이라는 데서 이런 결과가 얻어지는데, 그 자세한 수학적 과정은 아래의 글상자를 참고하자.
2장 이진 판단 : 천체의 펄서 여부 판정 신경망
93
시그모이드 함수 정의식의 도출 과정 다음 그림을 살펴보자. 그림 로짓값으로 표시된 가능성과 진품일 확률 이 다이아몬드가 진 품일 가능성은 로짓 값으로 -1입니다.
이 도자기가 진품일 가능성은 로짓값으로 0.5입니다.
진품 가능성 : 모조품 가능성 = e0.5 : e0 = 1.649 : 1
진품 가능성 : 모조품 가능성 = e-1 : e0 = 0.368 : 1
네! 진품 확률은 62.2%입니다.
네! 진품 확률은 27%입니다. 1.649 1.649 + 1
진품일 확률 = 1.649 =0.622 1.649 + 1
진품일 확률 = 0.368 0.368 + 1 0.270
0.368 0.368 + 1
먼저 왼쪽 그림에서 전문가 감정 결과 도자기가 진품일 가능성의 로짓값이 0.5로 얻어졌다고 하 자. 물론 이렇게 말하는 전문가는 거의 없겠지만 마음 속에 드는 느낌의 정도는 막연하게나마 비 슷한 모습일 것이다(인공 신경망으로 만들어진 전문가라면 거의 틀림없이 이렇게 답할 것이다). 이때 시그모이드 함수의 약속에 따라 도자기가 진품이 아닌 모조품일 가능성의 로짓값은 0으로 간주된다. 따라서 진품일 가능성과 모조품일 가능성은 각각 e0.5,e0에 비례하며 두 값의 비율은
1.649 : 1이다. 그런데 도자기는 진품 아니면 모조품이므로 두 경우의 확률 합은 1이 되어야 한 1
다. 따라서 확률 합을 1로 만들어주는 비례상수값을 구해 두 값에 곱해주어야 한다.1.649 물론+ 이 1 값 1
1
1.649
은 1.649 + 1 이고 이 값을 진품에 대한 지수함숫값 1.649에 곱하면 진품일 확률이 즉, 1.649 + 1 1.649 + 1 1 11.649 1.649 1 1.649 + 1 1.649 + 1 1.649 1.649 0.368 + 1 마찬가지로 오른쪽 그림에서 다이아몬드가 진품일 확률을 구해보자. 1.649 로짓값이 진품 가 + 1 -1인 0.368 1.649 +11 1 -1 0 능성0.368 비례상수는 e =+01.368과 로짓값이 0인 모조품 가능성 e +=11의 확률 합을 1로 만드는0.368 +1 0.368 1 0.368 10.368 0.368 이다. 따라서 다이아가 진품일 확률은 0.368 + 1 =0.270이다. 0.368 + 1 0.368 + 1 0.368 0.368 +1+1 0.368 0.368 0.368 0.368 0.368 +1 0.368 + 1 0.368 + 1 0.368 + 1 0.368 0.368 0.368 + 1 0.368 + 1
로 구해진다. 물론 모조품일 확률은 나머지 확률 0.378이고 이는 1.649 + 1 로 계산된다. 0.622 1.649 + 1
94
1부 단층 퍼셉트론(SLP)
CHAPTER
3
선택 분류 : 철판 불량 상태 분류 신경망
2장 선택 분류 : 철판 불량 상태 분류 신경망 125
철판 표면 상태의 불량 여부, 불량 종류를 판별하는 선택 분류 신경망을 만들어보자. 신경망은 단층 퍼셉트론으로 구현하며, 캐글의 불량 철판 데이터셋을 활용한다. 실습을 하기에 앞서 불량 철판 데이터셋을 내려받아두자. ●●
불량 철판 데이터셋 : www.kaggle.com/uciml/faulty -steel -plates
이 장에서 다루는 내용은 다음과 같다. ●●
불량 철판 판별 문제 소개
●●
선택 분류 문제의 신경망 처리 방법
●●
소프트맥스 함수와 소프트맥스 교차 엔트로피
●●
시그모이드 함수와 소프트맥스 함수의 관계
●●
불량 철판 판별 신경망 구현과 실행
3.1 불량 철판 판별 문제 이번 장에서 다룰 데이터셋은 원래 이탈리아의 철강 회사가 한 연구 기관에 의뢰하며 제공한 자료다. 연구 주제는 불량 여부를 판별하고 불량의 종류를 분류하는 것이었다. 그림 철판 야적장 전경
출처 : nwrecycling.com
126 1부 단층 퍼셉트론(SLP)
데이터셋에서는 7가지 불량 종류를 Pastry, Z_ Scratch, K_ Scatch, Stains, Dirtiness,
Bumps, Other_Faults로 표시한다. 짐작은 가지만 정확한 불량 상태와 종류를 알기 어렵다. 하지만 대체로 철판 구성 성분이나 구조적 문제라기보다는 단지 표면 상태 관련 분류로 보인다. 한편 표면 이상 유무를 판별하는 정보로 육안으로 확인 가능한 27가지 특징값이 주어졌다. 이 들 특징값에 대한 구체적인 설명은 없다. 하지만 불량 유형의 정체와 특징값의 물리적 성질을 정확하게 몰라도 딥러닝에서는 문제 해결에 별 어려움은 없다. 어차피 데이터 기반 딥러닝 학 습은 숫자로 표현된 입력 벡터와 출력 벡터의 상관관계를 파악하는 것이다. 따라서 이들 특징 값이 실세계에서 의미하는 물리 성질을 반드시 알아야 하는 것은 아니다. 캐글의 불량 철판 데이터셋에는 1,941개의 철판 재료에 대하여 27가지 측정된 특징값과 7가 지 철판 불량 상태에 대한 원-핫 벡터 정보가 총 27 +7 =34 필드에 저장되어 있다. 이 데이터 셋 정보를 이용하여 임의의 철강 재료에 대해 27가지 특징값이 주어지면 불량 종류를 판별하 여 알려주는 인공지능 신경망을 만들어보자.
3.2 선택 분류 문제의 신경망 처리 선택 분류 문제는 몇 가지 정해진 후보 가운데 하나를 골라 답하는 문제다. 철판의 불량 여부를 판정하는 문제라면 이진 판단 문제에 속하겠지만 불량 유형을 가려내 답해야 한다면 선택 분류 문제에 속한다. 객관식 시험 문제를 비롯한 일상생활에서 접하는 많은 의사 결정 문제가 선택 분류 문제에 속 한다. 심지어 언어 행위까지도 이 선택 분류 문제를 차례로 풀어내는 과정으로 해석할 수 있다. 글이란 어떤 언어의 알파벳 문자들을 차례로 골라내 나열한 것이며 말 역시 음소들을 차례로 선택해 나열하는 것으로 볼 수 있기 때문이다. 선택 분류는 후보 항목이 여럿인 탓에 처리 방법이 달라지기는 하지만 여러모로 이진 판단과 성격이 비슷하다. 우선 이진 판단에서처럼 신경망이 직접 후보 항목의 번호를 지정한다거나 각 후보 항목의 확률값을 계산하기는 어렵다. 대신 선택 분류 신경망은 이진 판단에서처럼 일 단 각 후보 항목에 대한 로그 척도의 상대적 추천 강도, 즉 로짓값을 추정하도록 구성된다. 이 때 퍼셉트론 하나가 후보 하나에 대한 로짓값을 출력한다. 따라서 선택 분류를 수행하려면 후
3장 선택 분류 : 철판 불량 상태 분류 신경망 127
보 수만큼의 퍼셉트론이 필요하다. 이진 판단과 달리 거짓에 대한 로짓값을 0으로 간주하던 암 묵적 요소는 없다.
2.3절 ‘시그모이드 함수’에서 설명한 것처럼 로짓값은 상대적인 가능성을 로그를 이용해 나타 낸 값이다. 선택 분류에서 로짓값의 표현 대상은 각 후보 항목을 답으로 추정할 확률이다. 예를 들어 A 항목의 로짓값이 3이고 B 항목의 로짓값이 1이면, A를 답으로 추정할 확률이 B보다
e3-1 =e2 =7.39 배 크다는 의미다. 예를 들어 A 항목의 로짓값이 36.5이고 B 항목의 로짓값이 34.5라도 차이가 똑같은 2이기 때문에 이 비율은 똑같이 7.39로 계산된다. 하나의 로짓값만으 로는 의미가 없고 로짓값 사이의 차이가 중요한 것이다. 그런데 선택 분류 자체만 생각한다면 로짓값들을 구하는 것으로 충분하며 굳이 이를 확률로 변 환하여 확률 분포를 따질 필요가 없다. 로짓값이 크면 확률도 크기 때문에 가장 큰 로짓값을 갖 는 항목을 선택하면 가장 높은 확률을 갖는 항목이 선택되기 때문이다. 하지만 로짓값만으로 는 마땅한 학습 방법을 찾기 어렵고 이 때문에 딥러닝 연구가 한동안 답보 상태에 머무르게 되 었다. 이런 상황에 돌파구를 만들어준 것이 확률 분포와 교차 엔트로피 개념이다. 2.5절 ‘확률 분포 의 추정과 교차 엔트로피’와 2.6절 ‘딥러닝 학습에서의 교차 엔트로피’에서 시그모이드 함수와 시그모이드 교차 엔트로피가 이진 판단 문제에서 딥러닝 연구의 돌파구를 만들어주었음을 소 개했다. 이제 선택 분류 문제에서도 마찬가지로 신경망이 추정한 확률 분포와 정답이 나타내는 확률 분포 사이의 교차 엔트로피를 구할 수 있고 이를 손실 함수 삼아서 학습을 수행하면 신경 망의 선택을 점점 더 정답에 근접시킬 수 있음을 알게 된 것이다. 이에 따라 복수의 후보 항목들에 대한 로짓값 벡터를 확률 분포 벡터로 변환하는 함수와 이렇 게 구해진 확률 분포와 정답에 나타난 확률 분포 사이의 교차 엔트로피를 계산해주는 함수가 필요하게 되었다. 바로 이어서 소개할 소프트맥스 함수와 소프트맥스 교차 엔트로피 함수가 그 것이다. 한 마디로 시그모이드 함수가 이진 판단 문제 해결의 주역이었다면 선택 분류 문제 해 결의 주역은 소프트맥스 함수인 것이다. 신경망 출력을 후처리하는 과정을 소프트맥스 함수와 소프트맥스 교차 엔트로피 함수를 이용 하는 방식으로 수정하고 나면 신경망 내부의 처리 과정을 비롯한 나머지 부분의 코드들은 회귀 분석 문제나 이진 판단 문제를 처리하는 경우와 크게 다르지 않다. 따라서 불량 철판 판별 신경 망은 1.10절 ‘구현하기 : 전복 고리 수 추정 신경망’에서 작성한 함수들을 최대한 재활용한다.
128 1부 단층 퍼셉트론(SLP)
3.3 소프트맥스 함수 소프트맥스 함수는 로짓값 벡터를 확률 분포 벡터로 변환해주는 비선형 함수다. 소프트맥스 함수가 어떻게 이용되는지 철판 문제의 처리 과정을 나타낸 다음 그림으로 살펴 보자. 신경망에 주어지는 미니배치 데이터는 각 철판 정보 27가지를 갖는 데이터 벡터의 모음으로 미니배치 크기를 N이라 할 때 [N, 27]의 형태를 갖는다. 퍼셉트론 7개로 구성된 단층 퍼셉트 론은 실제로는 [27, 7] 형태의 가중치와 [7] 형태의 편향 정보로 표현되며 선형 텐서 연산으로 [N, 7] 출력을 만들어낸다. 선택 분류 문제에서는 이 결과를 미니배치 데이터 N개에 대해 각각
7가지 후보들의 로짓값을 나타내는 벡터들로 해석한다. 그림 선택 분류 문제에서의 소프트맥스 함수의 활용
확률값 벡터
P0,0
P0,1
P0,2
P0,3
P0,4
P0,5
P0,6
P1,0
P1,1
P1,2
P1,3
P1,4
P1,5
P1,6
…
…
…
…
…
…
…
확률 분포 시각화 출력 손실 함수 편미분 계산
softmax( ) 로짓값 벡터
L0,0
L0,1
L0,2
L0,3
L0,4
L0,5
L0,6
L1,0
L1,1
L1,2
L1,3
L1,4
L1,5
L1,6
…
…
…
…
…
…
…
P0
퍼셉트론
P1
P2
P3
P4
P5
선택항 결정 손실 함수 계산
P6
데이터 벡터
D0,0
D0,1
D0,2
D0,3
……
D0,23
D0,24
D0,25
D0,26
D1,0
D1,1
D1,2
D1,3
……
D1,23
D1,24
D1,25
D1,26
…
…
…
…
…
…
…
…
3장 선택 분류 : 철판 불량 상태 분류 신경망 129
로짓값들은 후보 항들에 대한 선택 확률을 로그 척도로 표현한 것이기 때문에 신경망이 어느 후보를 골랐는지는 굳이 로그 계산을 하지 않아도 로짓값 벡터에서 최대항이 어느 것인지만 확 인하면 바로 알 수 있다. 또한 3.5절 ‘소프트맥스 교차 엔트로피’에서 살펴보겠지만 선택 분류 를 위한 손실 함숫값도 이 로짓값 벡터를 이용하여 바로 계산할 수 있다. 굳이 확률값으로 변환 하지 않고도 로짓값만으로도 순전파의 모든 처리가 가능한 것이다. 하지만 두 가지 이유에서 이 로짓값 벡터를 확률값 벡터, 즉 후보 항목 간의 확률 분포로 바꿀 필요가 있다. 첫 번째 이유는 사용자가 확률 분포를 눈으로 확인하고 싶을 때다. 아직은 신경망 이 추정한 확률 분포를 보여주지 않지만 5.3절 ‘시각화’에서 이 문제를 다룬다. 또 하나의 이유 는 역전파에서 손실 함수에 대한 편미분을 구할 때 이 확률 분포가 필요하기 때문이다. 이에 대 해서는 3.6절 ‘소프트맥스 교차 엔트로피의 편미분’에서 다룬다. 위의 두 가지 이유 때문에 로짓값 벡터를 확률값 벡터, 즉 확률 분포 벡터로 변환해주는 소프트 맥스 함수가 필요하다. 소프트맥스 함수의 출력은 확률 분포, 즉 각 후보 항목이 정답일 확률값 들로 구성된 벡터다. 따라서 출력의 형태는 스칼라값이 아니라 입력 벡터와 동일한 크기를 갖 는 벡터다. 확률의 성질상 벡터 각 성분은 0 이상 1 이하의 값을 가져야 하며 전체 벡터 성분 의 합은 정확하게 1이 되어야 한다. 물론 확률 분포를 나타내는 이 출력 벡터에는 입력 로짓 벡 터에 로그값으로 표현되어 있었던 상대적 가능성 비율이 더 이상 로그 표현이 아닌 확률값으로 변환되어 반영되어 있어야 한다. 소프트맥스 함수의 성질들을 이용해 소프트맥스 함수의 일반식을 구하면 다음과 같다.
yi =
e xi e x1 + ...+ e xn
하지만 이 식은 계산 과정에 오류를 일으킬 수 있기 때문에 실제 소프트맥스 함숫값을 계산할 때는 xi 가운데 최댓값 xk를 찾은 후 아래의 변형된 식을 이용하여 계산한다. 자세한 내용은 글 상자를 참고하기 바란다.
yi =
130 1부 단층 퍼셉트론(SLP)
e x1 −xk
e xi −xk + ...+ e xn −xk
Part
II
다층 퍼셉트론(MLP)
복수의 퍼셉트론 계층으로 구성되는 다층 퍼셉트론(multiple layer perceptrons, MLP)을 소개한다. 다루는 내용 ●
다층 퍼셉트론의 기본 구현 방법 소개
●
예제 프로그램에 객체지향 개념 적용
●
개선된 구조로 다차원 분류 문제 풀이
2장 선택 분류 : 철판 불량 상태 분류 신경망 149
Part II
다층 퍼셉트론(MLP)
4장
다층 퍼셉트론 기본 구조 : 세 가지 신경망의 재구성
5장 다층 퍼셉트론 모델 구조 : 꽃 이미지 분류 신경망 6장
복합 출력의 처리 방법 : 오피스31 다차원 분류 신경망
150 1부 다층 퍼셉트론(MLP)
CHAPTER
4
다층 퍼셉트론 기본 구조 : 세 가지 신경망의 재구성
2장 다층 퍼셉트론 기본 구조 : 세 가지 신경망의 재구성 151
1부에서 단층 퍼셉트론으로 해결했던 ‘전복 고리 수 추정’, ‘천체 펄서 판정’, ‘철판 불량 유형 분 류’ 문제를 다층 퍼셉트론 신경망으로 해결해보자. 신경망 구조를 단층 퍼셉트론에서 다층 퍼셉트론으로 바꾼다고 해도 입력 벡터와 출력 벡터 형 태는 문제 성격에 맞게 그대로 유지되어야 한다. 따라서 신경망을 둘러싼 프로그램의 다른 부 분들에서의 처리 과정을 바꿀 필요는 없다. 따라서 이 절에서는 1부의 세 장에서 구현한 코드 들을 최대한 재활용하면서 신경망 부분에서만 다층 퍼셉트론을 지원하도록 수정한다. 이 장에서 다루는 내용은 다음과 같다. ●●
다층 퍼셉트론 신경망 구조와 은닉 계층
●●
비선형 활성화 함수와 ReLU 함수
●●
민스키의 XOR 문제와 비선형 활성화 함수의 필요성
●●
다층 퍼셉트론 신경망을 지원하는 함수 구현
●●
1부에서 다루었던 세 문제를 다층 퍼셉트론으로 풀어보기
4.1 다층 퍼셉트론 신경망 구조 다층 퍼셉트론 신경망은 복수의 퍼셉트론 계층을 순서를 두고 배치하여 입력 벡터로부터 중간 표현을 거쳐 출력 벡터를 얻어내는 신경망 구조다. 간단히 다층 퍼셉트론이라고도 부른다. 그림 다층 퍼셉트론의 구성 예 입력 벡터
첫 번째 은닉 벡터
두 번째 은닉 벡터
출력 벡터
x1
y1
x2
y2
x3
y3
x4
y4 첫 번째 은닉 계층
152 2부 다층 퍼셉트론(MLP)
두 번째 은닉 계층
출력 계층
위의 그림은 은닉 계층이 둘인 다층 퍼셉트론의 구성 예다. 문제 성격에 알맞은 출력 벡터를 생 성하기 위한 출력 계층은 다층 퍼셉트론에도 여전히 필요하다. 따라서 새로 추가되는 계층들은 출력 계층 앞단에 배치되어 입력 벡터를 차례로 처리한 뒤 다음 단계에 넘겨 출력 계층까지 이 르게 한다. 출력에 직접 드러나지 않는 이들 계층을 은닉 계층이라고 하며 은닉 계층이 생성하 는 중간 표현을 은닉 벡터라고 한다. 다층 퍼셉트론에서 각각의 계층은 단층 퍼셉트론과 같은 내부 구조를 갖는다. 즉 하나의 계층 안에 속한 퍼셉트론들은 동일한 입력을 공유하면서 각각 출력 성분을 만들어내지만 서로 어떤 연결도 없어 영향을 주고받을 수 없다. 하지만 이와 반대로 인접한 계층끼리는 앞 계층의 출력 이 뒤 계층의 모든 퍼셉트론에 공통 입력으로 제공된다. 즉 다층 퍼셉트론의 인접 계층끼리는 방향성을 갖는 완전 연결 방식으로 연결되는 것이다. 엄밀하게는 단층 퍼셉트론도 0개의 은닉 계층을 갖는 다층 퍼셉트론의 특수한 경우로 생각할 수도 있다. 하지만 다층 퍼셉트론 신경망이라고 할 때는 은닉 계층을 하나 이상 갖는 것이 보통 이다. 다층 퍼셉트론 신경망은 단층 퍼셉트론 구조에 비해 더 많은 퍼셉트론을 이용해 기억 용 량이나 계산 능력에 대한 부담이 커지는 대신 품질 향상을 기대할 수 있다.
4.2 은닉 계층의 수와 폭 다층 퍼셉트론에서 최종 단계에 배치된 계층은 신경망에 주어진 원래의 임무에 따라 알맞은 형 태의 출력 벡터를 생성하는 역할을 맡는다. 그래서 출력 계층이라는 별도 이름을 가지며 출력 벡터의 크기, 즉 출력 계층이 가질 퍼셉트론 수도 문제의 성격에 따라 고정적으로 정해진다. 반면에 다층 퍼셉트론에서 새로 도입된 은닉 계층이 만들어낼 은닉 벡터에는 이런 제약이 없 다. 따라서 출력 계층과 달리 은닉 계층의 수와 각 은닉 계층의 폭은 신경망 설계자가 자유롭게 정할 수 있다. 여기에서 은닉 계층의 폭width이란 물론 해당 계층이 갖는 퍼셉트론 수이자 생성 하는 은닉 벡터 크기를 말한다. 또한 퍼셉트론을 노드node라고도 한다. 앞의 그림에서 입력 벡터 크기와 출력 벡터 크기는 둘 다 4다. 또한 각각 노드 3개, 즉 퍼셉트 론 3개를 갖는 은닉 계층이 2개다. 이 신경망에 이용되는 퍼셉트론 수는 출력 계층에서 4개, 두 은닉 계층에 각각 3개로 모두 10개다. 또한 한 계층의 퍼셉트론들은 각각 해당 계층에 대한
4장 다층 퍼셉트론 기본 구조 : 세 가지 신경망의 재구성 153
입력 벡터 크기만큼의 가중치와 하나의 편향 파라미터를 갖는다. 따라서 입력 m개에 연결된 퍼셉트론 n개를 갖는 한 계층의 파라미터 수는 m×n개의 가중치 파라미터와 n개의 편향 파 라미터를 합쳐 m×n +n개가 된다. 앞의 그림의 신경망은 첫 번째 은닉 계층이 4×3 +3 =15, 두 번째 은닉 계층이 3×3 + 3 = 12, 출력 계층이 3×4 + 4 = 16 등 총 43개의 파라미터를 갖 는다. 은닉 계층의 수와 각 은닉 계층의 폭은 신경망의 품질을 결정짓는 중요한 요인이 될 수 있지만 무조건 은닉 계층 수나 폭을 늘린다고 품질이 좋아지는 것은 아니다. 은닉 계층을 추가해 파라 미터 수가 늘어나면 더 많은 학습 데이터가 필요해지는 경향이 있다. 따라서 충분한 양의 양질 의 데이터가 준비되지 않으면 다층 퍼셉트론 구조의 확장은 오히려 신경망 품질을 떨어뜨릴 수 있다. 은닉 계층 수와 폭은 문제의 규모, 데이터양, 난이도를 종합적으로 고려해 정해야 한다. 그래서 다양한 실험과 축적된 경험이 중요하다. 이때 학습률이나 미니배치 크기 같은 다른 하이퍼파라 미터도 중요한 영향을 미칠 수 있으므로 유의해야 한다. 따라서 다층 퍼셉트론을 도입할 때는 은닉 계층 수와 폭 설정값을 쉽게 바꾸어가며 실험할 수 있게 프로그램을 구현해야 한다.
4.3 비선형 활성화 함수 은닉 계층은 가중치와 편향을 이용해 계산된 선형 연산 결과를 바로 출력으로 내보내는 대신 한 번 더 변형시켜 내보낸다. 선형 연산 결과 뒷단에 적용되어 퍼셉트론의 출력을 변형시키려 고 추가한 장치를 비선형 활성화 함수라고 한다. 선형 연산 결과는 곱셈과 덧셈으로만 이루어 지는 선형 연산의 특성상 항상 입력의 일차 함수로 나타나게 마련이다. 비선형 함수는 일차 함 수로 표현이 불가능한 좀 더 복잡한 기능을 수행하는 함수다. 따라서 비선형 활성화 함수를 추 가하면 입력의 일차 함수 표현을 넘어서는 다양하고 복잡한 형태의 퍼셉트론 출력을 만들 수 있다.
2장 ‘이진 판단’과 3장 ‘선택 분류’에서 살펴본 시그모이드 함수나 소프트맥스 함수 역시 대표적 인 비선형 함수지만 단층 퍼셉트론에서는 이들을 퍼셉트론 내의 구성 요소로 간주하지 않았었 다. 이는 출력 계층의 경우 출력 유형에 따라 후처리 과정에서 비선형 함수를 이용하는 방법이
154 2부 다층 퍼셉트론(MLP)
달라지고 이 때문에 비선형 함수를 퍼셉트론 안에 두기가 곤란하기 때문이다. 대표적으로 소프 트맥스 함수는 출력 여러 개를 묶어 함께 처리해야 하며 따라서 각기 독립된 구조인 개별 퍼셉 트론 안에 이 함수를 나누어 넣을 수가 없다. 또한 출력 벡터 하나 안에 각기 다른 역할을 하는 여러 정보를 함께 생성해야 할 때도 있다.
6장 ‘복합 출력의 처리 방법’에서 이 문제를 자세히 다룬다. 이 경우 출력 벡터를 구성하는 각 정보의 특성에 맞게 별도의 비선형 처리를 해야 한다. 이런 경우 출력 계층 안에 여러 가지 비 선형 활성화 함수를 두면 코드가 지나치게 복잡해진다. 이 역시 출력 계층에 비선형 활성화 함 수를 두지 않는 이유다. 요약하자면 출력 계층에는 비선형 활성화 함수가 사용되지 않는다. 이 때문에 단층 퍼셉트론에 서는 후처리 과정에서 시그모이드 관련 함수나 소프트맥스 관련 함수를 이용했을 뿐 출력 계층 내부의 비선형 활성화 함수를 따로 다루지 않았다. 하지만 출력 계층과 달리 은닉 계층은 비선형 활성화 함수가 선형 연산 결과를 변형시켜 퍼셉 트론의 최종 출력을 만들어낸다. 은닉 계층 다음에는 또 다른 은닉 계층이나 출력 계층이 있기 때문에 다층 퍼셉트론에서는 계층과 계층 사이, 즉 각 계층의 선형 연산 사이마다 비선형 활성 화 함수가 놓이게 된다. 다층 퍼셉트론에서 비선형 활성화 함수는 필수적 구성 요소다. 애써서 다층 퍼셉트론을 도입해 도 비선형 활성화 함수가 없으면 아무런 의미가 없다. 이는 선형 처리는 아무리 여러 단계를 반 복해도 하나의 선형 처리로 줄여 표현할 수 있다는 수학적 원리 때문이다. 비선형 활성화 함수 가 없다면 언제나 다층 퍼셉트론과 똑같은 기능의 단층 퍼셉트론을 만들 수 있어서 굳이 다층 퍼셉트론을 만들 필요가 없어진다는 말이다. 이에 대해서는 글상자 내용을 참고하도록 하자.
다층 선형 연산의 불필요성 수학적 원리를 살펴보기에 앞서 잠시 비슷한 사례인 카이사르 암호법에 대해 알아보자. 로마 공 화정 말기의 정치가이자 장군으로 황제정의 토대를 마련한 카이사르는 많은 발명품을 남긴 천재 발명가이기도 했다. 카이사르의 대표적인 발명품으로 두루마리 형식이 아닌 좌우로 넘기도록 제 본된 책과 카이사르 암호법을 꼽을 수 있다. 카이사르 암호법은 알파벳 치환으로 문자열 안의 문 자들을 바꾸어주는 방법으로서 지금 보자면 너무 간단하고 기본적인 기법이지만 당시로서는 참 신하고 유용했다.
4장 다층 퍼셉트론 기본 구조 : 세 가지 신경망의 재구성 155
그림 카이사르 암호법에 따른 중복 암호화의 불필요성 철수의 암호표
A B C D E
중요한 정보니까 암호화해야지 LOVE ⇒ VYFR
Q F T K O G H L I H U M B I P N N J W O
R P G U V A Q X V D S R C W L E S Y X J K T F Y M
영희의 암호표
A P F M K B D G N L C T H A M D C I O N E R J S O
B P U V Q W E R H K S I Y T J
U V W X Y
Q F G X L
영희의 암호화만으로는 불안해 안전하게 한번 더 암호화해야지 VYFR ⇒ DMTC
합성 암호표(거꾸로 적용하면 해독표)
A G F S K O B B G E L D C F H Q M N D I I K N R E C J Y O M
바보… 암호표 하나로 암호화하는 거랑 똑같은데 DMTC ⇒ LOVE 해독 성공!!!
P V Q L R U S P T W
U V W X Y
X T H J A
그림에서 보듯 영희의 암호표와 철수의 암호표를 이용한 이중 암호화는 깡통로봇의 암호표를 이 용한 한 번의 암호화와 동일한 결과를 만들어내며 해독 역시 한 번에 가능하다. 이처럼 단순 치환을 이용한 암호화는 몇 번을 거듭하더라도 합성된 암호표를 이용하는 한 번의 암호화로 대체될 수 있다. 선형 연산 사이에 비선형 활성화 함수가 왜 필요한지도 마찬가지 이유 로 설명할 수 있는데 이를 굳이 수학적으로 따진다면 다음과 같다. 직렬 연결된 두 퍼셉트론 계층의 가중치를 각각 w, v, 편향을 b, c라 할 때 선형 처리만으로는 두 계층의 처리 관계식을 다음과 같이 표현할 수 있다.
hi = wi1 x1 + ...+ win xn + b y j = v j1h1 + ...+ v jm hm + c 각 hi항에 대해 해당 항의 정의식을 대입하여 정리하면 다음과 같다.
y j = (w11v j1 + ...+ wm1v jm )x1 + ...+ (w1n v j1 + ...+ wmn v jm )xn + (v j1b + ...+ v jmb + c) 얼핏 복잡해보이지만 파라미터 w, v, b, c 값들이 모두 결정된 상황에서는 이 식에 나타난 계수 역시 모두 쉽게 계산해 숫자로 대치할 수 있다. 즉 두 층의 퍼셉트론으로 얻어지는 관계는 실은 한 계층만으로도 처리가 가능한 선형식일 뿐이다.
156 2부 다층 퍼셉트론(MLP)
CHAPTER
5
다층 퍼셉트론 모델 구조 : 꽃 이미지 분류 신경망
2장 다층 퍼셉트론 모델 구조 : 꽃 이미지 분류 신경망 181
이 장에서는 지금까지 살펴본 내용을 종합하고 시각화 등 일부 새로운 기능도 추가하면서 다층 퍼셉트론 신경망을 지원하는 MlpModel 클래스를 정의한다. 또한 Dataset 클래스와 네 가지 파생 클래스를 정의해 지금까지 다룬 세 가지 문제를 해결하고 추가로 꽃 이미지 분류 문제를 해결하는 과정을 살펴본다. MlpModel 클래스는 객체지향 프로그래밍 기법으로 구현한다. MlpModel 클래스는 6장에서 15
장까지 여러 고급 신경망을 지원하는 클래스들의 기반 클래스로도 이용된다. 실습에 사용할 꽃 이미지 분류 문제 해결에 이용할 캐글의 꽃 인식 데이터셋을 내려받아두자. ●●
꽃 인식 데이터셋 : www.kaggle.com/alxmamaev/flowers -recognition
이 장에서 다루는 내용은 다음과 같다. ●●
다층 퍼셉트론 구조를 지원하는 클래스 설계
●●
학습, 검증, 평가 단계에 사용할 데이터셋 분할
●●
시각화의 필요성과 방법
●●
이미지 분류 문제와 꽃 이미지 분류 데이터셋
●●
Model 클래스와 MlpModel 클래스 구현
●●
Dataset 클래스와 여러 가지 파생 클래스 구현
●●
수학 연산과 각종 부수적 기능을 수행하는 함수 구현
●●
1~3장의 여러 문제와 꽃 이미지 분류 문제 해결에 구현된 클래스 이용하기
5.1 다층 퍼셉트론을 위한 클래스 설계 객체지향 프로그래밍object oriented programming은 변수와 알고리즘을 객체별로 모아 정리해서 프로 그램의 가독성과 확장성을 높이는 발전된 프로그래밍 기법이다. 파이썬이 지원하는 object 클래스로부터 다음과 같은 상속 관계를 갖는 8가지 새로운 클래스 들을 선언하여 다층 퍼셉트론 모델을 지원하는 코드를 새로 구현하자.
182 2부 다층 퍼셉트론(MLP)
그림 5장에서 이용될 클래스들의 상속 관계
object
Model
MlpModel
Dataset
AbaloneDataset
PulsarDataset
PulsarSelectDataset
SteelDataset
FlowerDataset
Model 클래스와 Dataset 클래스는 파이썬이 지원하는 object 클래스의 파생 클래스로 선언
된다. 앞으로 만들 다양한 딥러닝 신경망 모델 지원 클래스와 데이터셋 지원 클래스의 기반 클 래스로 이용할 것이다. 참고로 기반 클래스를 부모 클래스로도 부른다. 이 책에서는 기반 클래 스base class라는 용어를 사용한다. 우선 Model 클래스의 파생 클래스로 다층 퍼셉트론 모델을 지원하는 MlpModel 클래스를 선 언한다. 또한 다양한 데이터셋을 이용해 여러 가지 신경망을 만들도록 Dataset 클래스의 파생 클래스 5가지를 선언한다. 예제 프로그램은 코드 재활용을 고려해 여섯 파일에 다음과 같이 나누어 작성한다. ●●
Model 클래스와 MlpModel 클래스
●●
Dataset 클래스
●●
1~3장에서 소개한 데이터셋들을 처리할 네 가지 파생 클래스
●●
새로 추가되는 꽃 사진 분류 데이터를 공급할 FlowersDataset 클래스
●●
이들 클래스가 이용할 수학 연산이나 기타 부수적 기능을 지원하는 함수
●●
이들 클래스로 구성되는 여러 가지 신경망을 실험할 실행 코드들
이들 파일은 모두 이 책 깃허브의 /codes/chap05 폴더를 방문하면 내려받을 수 있다.
5장 다층 퍼셉트론 모델 구조 : 꽃 이미지 분류 신경망 183
5.2 데이터 분할 : 학습, 검증, 평가 딥러닝은 대표적인 데이터 중심 인공지능 방법론이다. 데이터 중심 인공지능 방법론에서 인공 지능 프로그램은 필요한 지식이나 패턴을 스스로 학습해 문제를 해결한다. 반면 1980년대 인공지능 붐 때는 지식 중심 인공지능 방법론 연구가 활발했다. 전문 분야 지 식knowledge을 찾아내 이를 프로그램에 직접 반영하는 방법이었다. 이를테면 꽃 이미지를 분류 하려면 어떤 꽃이 어떻게 생겼으며 무슨 색깔이고 꽃잎 수나 꽃받침의 특성이 어떠한지를 일일 이 조사해 이를 코드나 사전dictionary 정보 형태로 제공하는 것이다. 원시 데이터로 주어지는 예 제는 프로그램이 학습할 대상이 아니라 인공지능 개발자가 지식을 찾아내야 할 대상이었다. 하 지만 지식을 찾아내 프로그램으로 표현하는 일이 생각보다 너무 까다로운 문제였고 상충하는 지식을 어떻게 조율할지 마땅치 않아 장난감 수준을 벗어나는 프로그램을 만들기가 어려웠다. 지식 중심의 접근 방법과 달리 데이터 중심 접근에서는 프로그램이 문제 해결에 필요한 정보를 스스로 학습하여 찾아낸다. 문제 해결에 알맞게 학습된 인공 신경망 구조를 모델이라고 한다. 딥러닝 모델을 개발하려면 많은 데이터가 필요하다. 전문 지식을 갖춘 사람은 비교적 적은 데 이터로도 많은 지식 정보를 추출해내지만 프로그램은 그렇지 못하기 때문에 지식 중심 접근에 비해 훨씬 많은 데이터가 필요하다. 또한 딥러닝 학습을 진행하려면 입력과 함께 출력이 어떠 해야 할지를 알려주는 모범 답안 정보도 제공되어야 한다. 이 모범 답안 정보를 레이블 정보라 하는데 신경망 학습은 신경망이 데이터 입력을 가지고 얻어낸 출력을 이 레이블 정보와 비교하 는 데서 시작된다. 데이터에 레이블 정보를 추가하는 과정은 지겨운 반복 노동이어서 구축 비용이 크다. 이런 부 담을 덜고자 비지도학습이라는 접근 방법도 등장했다. 비지도학습은 레이블 정보 없이 입력을 출력, 즉 모범답안 삼아 학습을 수행한다. 그러나 비지도학습은 레이블 정보를 이용하는 지도 학습을 보조하는 역할을 할 뿐 비지도학습만으로 인공 신경망이 필요한 일을 하게 만들기는 지 금의 기술 수준에서 기대하기 어렵다. 비지도학습은 13장 ‘오토인코더’에서 자세히 다룬다. 일반적으로 데이터는 학습 재료가 되는 훈련training 데이터(학습 데이터), 학습 과정에서 중간 점 검에 이용되는 검증validation 데이터, 학습 후에 학습 품질을 확인하는 데 이용되는 평가test 데이 터로 나눈다. 그런데 딥러닝 모델에서 정말 중요한 것은 학습 과정에서의 성적보다 실전에서의 성적이다. 따라서 학습 데이터도 중요하지만 검증 데이터나 평가 데이터를 잘 활용해 학습 결 과를 검증하고 평가하여 실전 적용에 알맞은 모습으로 학습되고 있는지를 확인하는 과정도 이
184 2부 다층 퍼셉트론(MLP)
에 못지 않게 중요하다. 이 때문에 세 가지 데이터는 서로 겹치지 않으면서 골고루 섞이게 준비 하는 것이 중요하다. 형편이 여의치 않으면 검증 데이터 대신 학습 데이터나 평가 데이터를 이 용하기도 하지만 학습 데이터와 평가 데이터만은 분명히 갈라놓아야 한다. 이 책에서는 학습과 훈련이라는 두 용어를 가급적 학습으로 통일시켜 표현하기로 했다. 이에 따라 훈련 데이터 역시 학습 데이터로 부른다.
5.3 시각화 시각화는 딥러닝 모델의 처리 과정이나 처리 결과를 문제의 성격을 살려 시각적으로 보여주는 기능이다. 이 기능은 딥러닝 모델이 어떻게 동작하는지 이해를 돕고 혹시 있을지 모를 잘못된 처리나 문제점을 조기에 파악하는 데 도움을 준다. 지금까지 딥러닝 모델을 다루면서 실험을 할 때 실제 어떤 데이터 입력에 대해 어떤 처리가 이 루어졌는지 전혀 볼 수 없어 답답했다. 새로 작성할 모델 클래스에서는 시각화 기능을 추가해 이런 답답함에서 벗어나보자. 시각화 기능은 문제 특성에 맞게 정의되어야 한다. 그래서 구체적인 시각화 방법은 모델 클래스 보다는 각 데이터셋을 다루는 Dataset 파생 클래스에 지정하는 것이 좋다. 따라서 모델 클래스 에는 시각화 함수 기능을 주도하는 기능을 두어 순전파에 의한 추정 출력 생성을 담당하게 하고 문제의 특성에 맞춘 출력의 생성은 Dataset 클래스의 시각화 함수를 호출해 맡기기로 한다. 한편 시각화 데이터는 학습 데이터보다는 검증 데이터나 평가 데이터에서 취하는 것이 적절해 보이지만 그 숫자는 너무 많지 않게 하여 지나치게 장황하고 긴 출력을 막기로 한다.
5.4 이미지 분류 문제와 꽃 이미지 분류 데이터셋 이미지 분류는 딥러닝 알고리즘이 가장 큰 성과를 내는 분야다. 3부에서 소개할 합성곱 신경망 이 두각을 나타내고 있지만 다층 퍼셉트론으로도 이미지 분류가 불가능한 것은 아니다. 하지만 모델 크기, 즉 파라미터 수가 지나치게 많은 데도 결과의 품질이 합성곱 신경망에 비해 떨어지
5장 다층 퍼셉트론 모델 구조 : 꽃 이미지 분류 신경망 185
는 경우가 많아 거의 이용되지 않는다. 이미지 관련 분야에서 합성곱 신경망이 우세를 보이는 이유는 3부에서 살펴보기로 하고 여기 에서는 일단 다층 퍼셉트론 신경망으로 이미지 분류 문제에 도전해보자. 이번 장에서는 새로 캐글에서 제공하는 꽃 인식Flowers Recognition 데이터셋을 이용하여 꽃 사진을 분류한다. 이 데이터셋은 카모마일, 튤립, 장미, 해바라기, 민들레 등 다섯 가지 꽃을 찍은 사진 을 종류별로 약 800장씩 총 4,242장 가지고 있다. 압축 파일로 제공되는 225MB 분량의 데이 터셋 파일을 풀면 flowers 폴더 밑에 다섯 개의 꽃 이름으로 된 서브 폴더가 있고 그 아래 꽃 사 진 이미지들이 jpg 파일 형태로 저장되어 있다. 이 데이터셋은 아래의 URL에서 구할 수 있다. ●●
URL : www.kaggle.com/alxmamaev/flowers -recognition
그림 꽃 인식 데이터셋의 꽃 사진 이미지들
사진의 해상도는 320 × 240픽셀 정도로 그리 높은 편은 아니며 모든 사진이 정확하게 이 해 상도인 것도 아니다. 데이터마다 입력 크기가 다르면 일관성 있게 처리하기가 어렵다. 그래서 데이터셋 준비 단계에서 이미지 크기를 같게 고쳐놓는 것이 보통이다. 이때 메모리 부담도 줄 일 겸 대개는 원본 이미지를 상대적으로 작은 크기의 섬네일로 고친다. 컬러 이미지는 RGB 색상으로 표현할 수 있다(이 데이터셋의 모든 이미지는 컬러다). 따라서 채 널 세 개로 RGB 색상을 각각 표현하는 방법이 널리 이용된다. 이에 비해 단색 이미지는 채널 하나로 명암만을 표현하면 된다. 어쨌든 이미지는 보통 [행, 열, 채널]의 3차원 구조의 픽셀 정 보로 표현된다. 3부에서 소개할 합성곱 신경망은 이미지 처리에 특화되어 이미지의 3차원 구조 를 살려둔 채 처리하지만 다층 퍼셉트론에서는 입력 이미지를 1차원 벡터로 변환해 처리한다. 이미지를 다룰 때는 이미지 해상도 설정과 은닉 계층 구성에 따라 필요한 파라미터 수가 매우
186 2부 다층 퍼셉트론(MLP)
CHAPTER
6
복합 출력의 처리 방법 : 오피스31 다차원 분류 신경망
2장 복합 출력의 처리 방법 : 오피스31 다차원 분류 신경망 237
두 가지 차원에서 동시에 분류를 수행하는 다차원 분류 신경망을 만들어보자. 또한 MlpModel 클래스에 아담 ADAM, Adaptive Moments 알고리즘을 적용해 신경망 모델의 학습 품질을 향상시켜 보자. 실습을 하기에 앞서 오피스31 데이터셋을 내려받아두자. ●●
오피스31 데이터셋 : drive.google.com/file/d/0B4IapRTv9pJ1WGZVd1VDMmhwdlE/view
이 장에서 다루는 내용은 다음과 같다. ●●
오피스31 데이터셋과 다차원 분류
●●
딥러닝에서의 복합 출력의 처리 방법
●●
복합 출력 처리를 하는 모델 클래스와 데이터셋 클래스의 역할
●●
아담 알고리즘
●●
AdamModel 클래스 및 Office31Dataset 클래스의 구현과 신경망 학습 실험
6.1 오피스31 데이터셋과 다차원 분류 오피스31은 컴퓨터 비전 분야에서의 전이학습 연구용으로 구축된 표준 벤치마크 데이터셋으 로 사무용품 이미지 4,652장으로 구성되어 있다. 각 이미지 데이터에는 사진 수집 방법에 따른
3가지 도메인과 사진 속에 담긴 내용이 31가지 품목 중 어디에 속하는지가 이중으로 레이블링 되어 있다. 오피스31 데이터셋의 도메인은 웹에서 수집된 이미지를 나타내는 amazon, 디지털 사진기로 촬영한 이미지를 의미하는 dSLR, 웹캠으로 촬영한 이미지에 해당하는 webcam으로 구분된 다. 31가지 품목은 배낭, 자전거, 자전거용 헬멧, 파일캐비닛, 헤드폰, 키보드, 랩톱, 편지함 등 이다.
238 2부 다층 퍼셉트론(MLP)
그림 오피스31 데이터셋
31가지의 품목 파일캐비닛 아마존
헤드폰
랩톱
키보드
dSLR
편지함 웹캠
3가지의 도메인
오피스31 데이터셋이 주로 활용되는 연구 분야는 전이학습 transfer learning이다. 전이학습이란 한 도메인에서 학습시킨 결과를 다른 도메인에 활용하여 학습 효과를 높이는 학습 기법이다. 예를 들어 아마존 도메인에 속한 데이터들에 품목 레이블 정보가 모두 태깅되어 있어서 이를 이용해 이미 만족할 만한 성능으로 학습시킨 모델이 있다고 하자. 이에 반해 dSLR 도메인의 데이터들 은 품목 레이블 정보가 없거나 아주 적은 양만 있다고 하자. 이럴 때 이미 확보된 아마존 도메 인 모델의 학습 정보를 잘 활용하면 dSLR 도메인에서 좀 나은 성능을 얻을 수 있다. 이런 구체 적인 방법을 찾는 연구 분야가 전이학습이다. 수집된 데이터에 정답을 표시하는 레이블링 작업에는 많은 경우 데이터 수집 이상의 더 많은 인력과 시간이 든다. 그렇다고 레이블링이 전혀 없이 신경망을 학습시킬 수 있는 방법은 마땅 치 않다. 이런 상황에서 비록 새로운 도메인에서만이라도 다른 도메인에서 학습된 내용을 이용 하여 레이블링 작업량을 줄여줄 수 있다면 큰 보탬이 될 것이고 이것이 전이학습 연구가 각광 받는 이유다. 하지만 이 책에서 전이학습을 다루려는 것은 아니다. 여기에서는 각 데이터 이미지의 도메인과 품 목을 동시에 판별해주는 딥러닝 모델을 만든다. 두 가지 차원에서의 분류를 한꺼번에 수행하고 결 과 두 가지를 동시에 보여주어야 하기 때문에 지금까지 살펴본 예제들보다는 난도가 높다.
2차원 분류를 1차원으로 줄이는 방법도 있기는 하다. 이를 차원 축소라고 한다. 이 경우에는
6장 복합 출력의 처리 방법 : 오피스31 다차원 분류 신경망 239
(아마존, 배낭), (dSLR , 배낭), ... 식으로 도메인과 품목을 묶어 (도메인, 품목) 순서쌍을 단위 로 카테고리를 설정하면 된다. 3가지 도메인과 31가지 품목이므로 총 93가지 순서쌍 중 하나 를 고르는 선택 분류 문제가 된다. 하지만 이렇게 하면 출력이 과도하게 커질 뿐 아니라 도메인 특성이나 품목 특성 또한 따로 포착하기 어려워져 학습 성과가 좋게 나오지 않을 가능성이 크 다. 게다가 두 개의 선택 분류 출력에 대한 미봉책은 될지언정 회귀 분석이나 이진 판단 출력이 섞이거나 출력 항목 수가 마구 늘어나는 경우를 생각하면 근본적인 대책은 될 수 없다. 이번에 다루는 다차원 분류 문제의 핵심은 둘 이상의 복합 출력을 어떻게 다루는지 보여주는 것이다. 이제까지의 예제 프로그램들은 하나의 회귀 분석이나 이진 판단, 선택 분류 출력을 생 성하는 간단한 문제만을 다뤘다. 하지만 실제 인공지능 프로그램에서는 둘 이상의 출력 요소가 필요한 경우가 많다. 비록 이 책에서 이런 실용적인 수준의 복잡한 예제를 다루고 있지는 않지 만 이번 절에서 소개하는 예제의 접근 방법을 적용하면 아무리 출력 항목의 숫자가 많고 구성 이 복잡한 복합 출력도 마찬가지 방식으로 문제를 풀어낼 수 있다. 이제 도메인에 대한 분류와 품목에 대한 분류를 동시에 수행하는 다차원 분류 기능을 오피스31 데이터셋을 이용해 만들어보자.
6.2 딥러닝에서의 복합 출력의 학습법 딥러닝에서는 같은 퍼셉트론이라도 학습 과정에 따라 역할이 달라진다. 이때 달라지는 것은 퍼 셉트론의 구조가 아니라 가중치나 편향 같은 파라미터값의 구성뿐이다. 똑같은 퍼셉트론이라 도 학습시키기에 따라 전복의 고리 수를 추정할 수도 있고 꽃을 분류할 수도 있다. 동일한 구조의 신경망을 다양한 용도에 이용하기 위해서는 후처리 과정에서의 처리 방법만 변 경하면 된다. 후처리 과정 역시 신경망에서와 마찬가지로 순전파와 역전파의 두 부분으로 구성 된다. 돌이켜보면 후처리 순전파 과정은 신경망 순전파 처리 과정에서 얻어진 출력으로부터 손 실 함수를 계산하는 과정이다. 또한 후처리 역전파 과정은 출력 각 성분의 손실 기울기를 계산 해서 신경망 역전파 처리 과정에 시동을 걸어주는 과정이다. 복합 출력의 처리 역시 후처리를 어떻게 할지의 문제일 뿐이다. 신경망 회로에서는 알맞은 크기 의 출력 벡터를 만들어내기만 하면 된다. 예를 들어 오피스31 데이터셋을 이용한 다차원 분류
240 2부 다층 퍼셉트론(MLP)
의 경우 신경망은 이미지 픽셀 수만큼의 입력 벡터 크기를 가지며 출력 벡터 크기는 도메인 판 별에 사용될 성분 3가지와 품목 판별에 사용될 성분 31가지를 더한 34가지 성분을 가지면 된 다. 즉 출력 벡터 크기만 34로 키우면 신경망 내부 구조는 더 고칠 게 없다. 출력 벡터 크기만 맞으면 학습 시간과 품질에 차이는 나겠지만 내부 신경망이 단층 퍼셉트론이든 아니든, 또한 은 닉 계층의 폭과 수가 어떻게 구성된 다층 퍼셉트론이든 동작 자체에는 아무런 문제도 없다. 하나의 신경망 출력을 복합 출력으로 처리하는 대신 필요한 출력별로 별도의 신경망을 구성하 면 어떨까? 출력 계층을 구성하는 퍼셉트론은 맡은 임무에 따라 역할이 확실하게 다르기 때문 에 출력 계층만 따지면 신경망을 분리하든 말든 별 차이가 없다. 하지만 은닉 계층에 속한 퍼셉 트론은 모든 출력 계층 퍼셉트론에 영향을 주고 모든 출력 계층 퍼셉트론으로부터 역전파 피드 백을 받으므로 복합 출력으로 처리하는 경우와 신경망을 따로 구성하는 경우에 커다란 차이가 생긴다. 그런데 출력은 여럿이지만 이들 출력이 내용상 서로 연관되어 있다 보니 중요한 공통 특성이 있을 수 있다. 이럴 때 각각의 출력을 위한 별도의 은닉 계층을 힘들게 따로 학습시키는 것보다 모든 출력에 연결된 하나의 은닉 계층이 이러한 공통 특성을 포착하도록 학습시키면 계 산량을 절감하면서도 성능을 향상시킬 수 있다. 결론적으로 출력별로 별도의 신경망을 구성하 는 것보다는 하나의 신경망 출력을 복합 출력으로 처리하는 방법이 더 바람직하다. 어떤 신경망이 두 성분으로 구성된 복합 출력을 낼 때 학습 방법은 간단하다. 레이블 정보로 준 비된 정답 y1, y2와 복합 출력의 두 성분 output1, output2를 비교해 손실값 L1, L2가 얻어진다 고 할 때 전체적인 손실 함숫값은 L = L1 + L2으로 정의하면 된다. 이때 L을 최소화하려는 노 력은 L1과 L2를 함께 줄이려는 노력으로 귀결된다. 이 정의에서 재미있는 점은 다른 변수의 영향을 받지 않는 편미분의 특성과 L1과 L2가 서로에 게는 상수로 간주된다는 점이다. 즉, output1의 손실 기울기는 y1과의 후처리 과정을 통해 L1을 이용해 구하면 되고, output2의 손실 기울기는 y2와의 후처리 과정을 통해 L2를 이용해 구하면 된다. 기존의 방법 그대로를 적용해 두 부분의 손실 기울기를 따로 구하면 된다는 의미이다. 이 렇게 구해진 손실 기울기는 두 부분으로 갈라진 출력 계층에 따로 반영되지만 은닉 계층 퍼셉 트론에 이르러서는 인접 계층 간의 완전 연결 탓에 마구 뒤섞여 반영될 것이다. 출력이 복잡하면 출력 정보를 세부적인 요소로 나누어볼 수 있다. 이렇게 세분하다 보면 각각 의 세분된 요소들은 결국 1부에서 다룬 회귀 분석, 이진 판단, 선택 분류 가운데 한 가지에 이 르게 된다. 후처리 단계에서는 이렇게 세분된 출력 요소별로 기존 방법을 이용하여 손실 함수
6장 복합 출력의 처리 방법 : 오피스31 다차원 분류 신경망 241
와 손실 기울기를 계산하면 된다. 그런 후에 계산된 손실 기울기들을 복합 출력의 형태에 맞추 어 모아서 신경망 출력 계층에 주면서 역전파를 시작하면 된다. 출력 벡터 크기가 늘어날 뿐 신 경망 내부의 처리 과정은 순전파나 역전파 모두 달라질 필요가 전혀 없다.
6.3 복합 출력을 위한 MlpModel 클래스와 Dataset 클래스의 역할 지금까지 살펴본 예제는 한 가지 출력만 냈다. 그래서 MlpDataset 클래스와 Dataset 클래스 가 복합 출력을 처리할 수 있다는 생각이 들지 않을 수도 있다. 하지만 실제로 두 클래스는 매 우 간단한 확장만으로 복합 출력을 다룰 수 있도록 설계되었다. 복합 출력에서 달라지는 부분은 신경망 처리가 아니라 신경망 출력에 대한 후처리 과정이며 처 리 결과를 보여주는 사용자 인터페이스에 관련한 부분들이다. 그런데 3.2절 ‘다층 퍼셉트론 모 델과 꽃 이미지 분류’에서 이런 기능은 MlpDataset 클래스가 직접 다루지 않고 Dataset 클래 스에게 의뢰해 처리하도록 만들었다. 또한 Dataset 클래스는 세 가지 기본 모드 ‘regression’, ‘binary’, ‘select’에 한해서 여러 처리 기능을 제공한다. 복합 출력의 처리는 Dataset의 파생 클래스를 선언하되 필요한 출력 구성에 따라 처리 기능 을 알맞게 재정의하는 방식으로 내용을 정의하면 된다. 이때 MlpModel 클래스는 전혀 손댈 필 요가 없다. 또한 복합 출력을 구성하는 요소들의 개별적인 처리 과정에서는 Dataset 클래스에 준비된 기본 모드 처리 기능을 활용하여 처리 과정을 간결하게 표현할 수도 있다.
6.4 아담 알고리즘 아담 알고리즘은 파라미터에 적용되는 실질적인 학습률을 개별 파라미터 별로 동적으로 조절 해 경사하강법의 동작을 보완하고 학습 품질을 높여주는 방법이다. 경사하강법에서는 역전파 처리 때 해당 파라미터의 손실 기울기와 학습률을 곱한 값을 각 파라 미터에서 빼주는 간단한 방식으로 학습을 수행한다. 하지만 아담 알고리즘에서는 모멘텀 개념 을 도입해 이 처리 과정을 보완한다. 아담 알고리즘이라는 이름도 ‘Adaptive moments’의 약
242 2부 다층 퍼셉트론(MLP)
Part
III
합성곱 신경망(CNN)
3부에서는 합성곱 신경망(convolutional neural network, CNN)을 소개한다. 다루는 내용 ●
합성곱 계층(convolution layer)과 풀링 계층(pooling layer)을 이용하는 간단한 합성곱 신경망
●
신경망의 과적합(overfitting)을 막는 다섯 가지 정규화 기법
●
인셉션(inception) 모델과 레스넷(resnet) 모델 등 거대 규모의 합성곱 신경망과 복합 계층
7장 복합 출력의 처리 방법 : 오피스31 다차원 분류 신경망 263
Part III
합성곱 신경망(CNN)
7장
간단한 합성곱 모델 : 꽃 이미지 분류 신경망
8장 다섯 가지 정규화 확장 : 꽃 이미지 분류 신경망 9장
인셉션 모델과 레스넷 모델 : 꽃 이미지 분류 신경망
264 3부 합성곱 신경망(CNN)
CHAPTER
7
간단한 합성곱 모델 : 꽃 이미지 분류 신경망
7장 간단한 합성곱 모델 : 꽃 이미지 분류 신경망 265
합성곱 신경망은 이미지 처리에 알맞게 다층 퍼셉트론을 변형시킨 신경망으로 흔히 CNN으로 줄여 부른다. 합성곱 신경망에는 이미지 처리에 알맞게 고안된 합성곱 계층과 풀링 계층이 새 로운 유형의 은닉 계층으로 이용된다. 합성곱 계층은 다층 퍼셉트론의 완전 연결 계층에 비해 획기적으로 줄어든 수의 파라미터만을 가지며 풀링 계층은 아예 파라미터를 갖지 않는다. 합성 곱 신경망은 합성곱 계층이 갖는 소수의 파라미터를 집중적으로 학습시키는 방법으로 이미지 처리 분야에서의 학습 품질을 크게 향상시켰다. CnnBasicModel 클래스를 만들고 꽃 이미지 분류 신경망에 적용해보며 합성곱 신경망을 구현
하고 동작 방식을 살펴보자. 이 장에서 다루는 내용은 다음과 같다. ●●
다층 퍼셉트론의 문제점과 새로운 구조의 필요성
●●
합성곱 계층과 풀링 계층
●●
합성곱 연산, 패딩, 보폭(stride ), 채널
●●
효율적인 합성곱 연산 방법
●●
다양한 계층 지원을 위한 모델 확장 방안
●●
CnnBasicModel 클래스의 구현과 꽃 이미지 분류 신경망 구성
7.1 다층 퍼셉트론의 문제점과 새로운 구조의 필요성 다층 퍼셉트론 신경망은 입력과 출력 계층 사이에 은닉 계층을 갖는다. 이때 계층 간의 연결은 인접한 양쪽 계층의 모든 퍼셉트론 쌍이 빠짐없이 서로 연결되는 방식으로만 허용된다. 이런 이유로 다층 퍼셉트론 신경망의 은닉 계층을 완전 연결 계층fully connected layer이라고 부른다. 출력 계층 역시 같은 방식으로 연결되므로 완전 연결 계층에 해당한다. 완전 연결 계층의 가중치 행렬 형태는 입력 벡터 크기와 출력 벡터 크기에 따라 결정되며 그 크 기는 두 벡터 크기의 곱이다. 많은 수의 픽셀로 구성된 이미지 데이터의 경우 입력 벡터 크기가 커지면서 완전 연결 계층의 가중치 파라미터가 엄청난 크기를 갖게 되기 쉽다. 이럴 경우 메모 리 부담도 문제지만 많은 파라미터 탓에 학습이 느려지기 쉬운 데다가 지나치게 많은 양의 데 이터가 필요할 수도 있다.
266 3부 합성곱 신경망(CNN)
예를 들면 이미지에서 야구공이 있는지 확인하는 것이 중요하다고 하자. 야구공은 이미지에서 온갖 위치에 나타날 수 있다. 하지만 왼쪽 상단에 나타난 야구공을 인식하는 것과 오른쪽 하단 에 나타난 야구공을 인식하는 것은 다층 퍼셉트론에서는 전혀 별개의 문제다. 따라서 퍼셉트론 들이 골고루 잘 학습되려면 학습 데이터 안에 온갖 위치에 나타난 야구공 이미지들이 모두 필 요하다. 따라서 데이터가 많이 필요하고 그만큼 학습 시간도 늘어난다. 합성곱 신경망은 이러한 문제의식에서 출발하여 고안된 구조다. 합성곱 신경망에서는 합성곱 계층에 있는 커널kernel이라는 작은 가중치 텐서를 이미지의 모든 영역에 반복 적용해 패턴을 찾 아 처리한다. 또한 풀링 계층은 처리할 이미지 해상도를 줄이는 기능을 제공해 다양한 크기의 패턴을 단계적으로 처리할 수 있게 한다. 이러한 처리 방식은 신경망의 파라미터 수를 획기적 으로 줄이면서도 각 구성 요소의 전문성을 높여 품질을 향상시킨다.
7.2 합성곱 계층 합성곱 계층은 합성곱 convolution이라는 수학 연산에 힌트를 얻어 고안된 처리 방식을 이용하는 은닉 계층이며 아래 그림과 같은 과정을 거쳐 출력을 얻는다. 그림 합성곱 연산
2 1 3 1 1 3 1 4 2 1 1 2 2 2 1 1 3 4 4 1 2 3 2 1 1 2 3 2 4 4
2 1 3 1
합성곱 커널
가중치
2 3
2 1 0
1×2 2×0 2×0 4×1 3×-1 4×0 2×0 3×-2 2×3 3 + -2 1
0 0
-1 0 -2 3
1 입력 픽셀 행렬
합성곱 커널 편향 -2
출력 픽셀 행렬
7장 간단한 합성곱 모델 : 꽃 이미지 분류 신경망 267
합성곱 계층은 커널이라는 작은 사각 영역 모양의 가중치 파라미터를 이용해 입력 픽셀값들로 부터 출력 픽셀값을 계산한다. 다층 퍼셉트론에서는 출력 픽셀 하나하나가 각각 입력 픽셀 전 체로부터 계산된다. 합성곱 계층에서는 이와 달리 작은 영역 안에 있는 입력 픽셀값들만 이용 해 출력 픽셀을 계산한다. 이 작은 영역은 커널 크기만큼의 크기를 가지며 중심 위치는 계산할 출력 픽셀의 위치이어야 한다. 출력 픽셀은 위의 그림에서처럼 이 영역의 입력 픽셀값들과 커 널의 가중치들을 짝지어 곱한 후 커널의 편향값과 합산해 구한다. 합성곱 계층의 연산에서 중요한 사실은 작은 커널이 반복 적용되면서 출력 픽셀 전체를 계산한 다는 점이다. 이는 계층이 갖는 파라미터 수를 크게 줄이는 효과가 있다. 위의 그림처럼 6 × 6 형태의 입력 픽셀값 36개로부터 같은 크기의 출력 픽셀을 생성할 때 완전 연결 계층을 이용하 려면 가중치 행렬과 편향 벡터까지 전체 파라미터 수는 36 × 36 + 36 = 1,332가 되어야 한 다. 하지만 위의 그림에서 합성곱 연산에 사용되는 파라미터 수는 커널 가중치 행렬과 커널 편 향을 합쳐 3 × 3 + 1 = 10개에 불과하다. 뒤에 채널 개념이 도입되면서 다시 좀 늘어나기는 하겠지만 이 작은 수의 파라미터만으로 같은 크기의 출력을 생성할 수 있다. 더욱 중요한 차이는 이미지 크기가 커질 때 나타난다. 완전 연결 계층의 가중치 크기는 대략 이 미지 픽셀 수의 제곱에 비례해 커진다. 하지만 합성곱 계층의 커널 크기는 이미지 픽셀 수와 관 계없이 정할 수 있으며 커널 크기를 바꾸지 않는 한 그 안의 파라미터 수는 변하지 않는다. 커널을 이용한 처리는 파라미터 수를 줄여 메모리 부담을 크게 덜어주는 동시에 다음과 같은 두 가지 장점도 있다. 1 커널의 반복 이용으로 커널에 대한 학습 횟수가 늘어나는 효과가 생겨서 학습이 빠르게 이루어진다. 2 같은 커널이 모든 위치에 적용되기 때문에 한 곳에서 포착된 패턴이 다른 곳에 이용될 수 있다.
말하자면 모든 위치에 야구공이 골고루 나타나는 무수히 많은 학습용 이미지 데이터가 없어도 된다.
268 3부 합성곱 신경망(CNN)
7.3 합성곱 연산의 패딩과 건너뛰기 합성곱 계층에서 출력 픽셀값을 계산하려고 입력 영역을 커널 크기로 확장시키다 보면 경계 부근 에서는 확장 영역이 실제 입력 범위를 벗어날 수 있다. 이런 문제를 해결하는 방법을 패딩padding 이라고 한다. 패딩은 SAME과 VALID 방식이 있다. 먼저 SAME 패딩 방식을 그림으로 나타내면 다음과 같다. 편의상 편향 부분은 생략했다. 그림 SAME 패딩 방식의 합성곱 연산
0 0 0 0 0 0 0 0
0 0 0 0 0 0 2 2 0 0 2 0 1 1 1 3 1 4 0 1 1 3 1 2 2 2 1 0 1 1 4 2 0 3 1 2 2 4 2 3 3 0 1 2 2 1 0 3 0 0 4 4 0 0 0 0
입력 픽셀 행렬
0×2 0×0 0×0 0×1 3×-1 1×0 + 0×0 1×-2 2×3 1
0 2 0 -1 0 1 3 0 -2
합성곱 커널
2 2 10 -7 -2 1 1 -2 16 5 -2 0 9 0 8 9 10 -1 7 3 2 3 16 -3 2 5 6 7 3 3 4 7 5 5 -4 2
출력 픽셀 행렬
SAME 패딩 방식에서는 출력 픽셀 계산에 문제가 없도록 전체 입력 행렬 주위를 0으로 둘러싸 확장한다. 예를 들어 3 × 3 커널의 경우 중심 위치로부터 상하좌우로 1칸씩 늘어난 확장 영역 이 필요하다. 커널 중심 위치가 가장자리에 올 때 문제가 생긴다는 점을 고려하면 상하좌우 1 칸씩 입력 이미지를 확장해 0으로 둘러싸면 된다. SAME 패딩 방식에서는 입력과 같은 크기의 출력이 만들어진다.
VALID 패딩 방식은 다음 그림과 같다.
7장 간단한 합성곱 모델 : 꽃 이미지 분류 신경망 269
그림 VALID 패딩 방식의 합성곱 연산
2 1 3 1 1 3 1 4 2 1 1 2 2 1 2 1 3 4 4 1 2 3 2 2 1 1 3 2 4 4
4×2 2×0 1×0 2×1 1×-1 2×0 + 2×0 1×-2 3×3 16
2 1 3
-2 16 9 5 0 8 3 9 10 2 5 3 16 6 4 7
1 0 2 0 - 0 1 1 - 3 0 2
2 3
입력 픽셀 행렬
합성곱 커널
출력 픽셀 행렬
VALID 패딩 방식에서는 커널이 실제 입력 범위를 벗어나지 않을 때만 출력 픽셀을 생성한 다. 예를 들어 3 × 3 크기 커널의 경우 상하좌우 1칸씩 늘어난 확장영역 때문에 가장자리로부 터 한 칸 이상 안쪽에 있는 위치에만 출력 픽셀을 생성할 수 있다. 이에 따라 6 × 6 크기의 입 력이 4 × 4 크기로 줄어들게 된다. VALID 패딩 방식에서는 출력 픽셀 계산에 유효한 입력 픽 셀들만 이용되지만 이처럼 출력 이미지의 크기가 입력 이미지보다 줄어들게 된다. 하지만 입출 력 형태가 똑같이 유지되는 편이 신경망 구조를 설계하기 쉽고 반복 적용에도 유리하기 때문에
VALID 패딩 방식보다는 SAME 패딩 방식이 더 널리 이용된다. 한편 합성곱 계층에서 출력을 생성할 때 아래 그림과 같이 일정한 간격으로 건너뛰면서 픽셀을 만들 수도 있다. 그림 건너뛰기에 의한 합성곱 출력 생성
0 0 0 0 0 0 0 2 2 0 2 0 0 1 1 1 1 4 0 3 0 2 1 1 3 2 0 1 0 1 2 2 1 4 0 1 0 4 3 1 2 2 0 2 3 0 2 3 2 1 0 1 0 3 4 0 0 0 0 4 0 0 0 0 입력 픽셀 행렬
270 3부 합성곱 신경망(CNN)
0 2 0 0 1 -1 3 0 -2 합성곱 커널
2 2 10 -7 -2 1 1 -2 16 5 -2 0 9 0 8 9 10 -1 7 3 2 3 16 -3 2 5 6 7 3 3 4 7 5 5 -4 2 출력 픽셀 행렬
건너뛰기보폭 [2, 3]
1 2 3 8 4 16
CHAPTER
8
다섯 가지 정규화 확장 : 꽃 이미지 분류 신경망
합성곱 신경망(CNN)
7장 다섯 가지 정규화 확장 : 꽃 이미지 분류 신경망 327
정규화 regularization1는 일부러 적당한 제약을 가해 학습을 방해하는 기법들을 통칭하는 말이다. 학습을 방해하는 이유는 신경망이 지나치게 학습 데이터에 맞추어지는 과적합 현상을 막기 위 해서다. 딥러닝 모델의 개발 목적은 실제 업무, 즉 정규화 단계에서 만나게 될 다양한 데이터를 처리하기 위해서다. 학습 데이터에 과도하게 익숙해지는 것은 오히려 정규화 단계의 성능을 떨 어뜨릴 위험이 크며 따라서 정규화 기법의 활용이 중요해진다. 이제부터 다섯 가지 중요한 정규화 기법의 원리와 구현 방법, 동작 방식 및 효과를 살펴본 후 앞에서 개발한 CnnBasicModel 클래스에 이들 기능을 추가하여 CnnRegModel 클래스로 확장 한다. 이 장에서 다루는 내용은 다음과 같다. ●●
부적합과 과적합
●●
L2 손실과 L1 손실
●●
드롭아웃, 잡음 주입, 배치 정규화
●●
다섯 가지 정규화 기법 도입을 위한 계층의 추가
●●
정규화 계층들을 확장한 CnnRegModel 클래스 구현과 실행
8.1 부적합과 과적합 딥러닝 모델을 학습시키다 보면 부적합 underfitting과 과적합 overfitting이라는 상반된 두 현상 가운데 하나가 나타나 학습에 실패하는 경우가 많다. 부적합은 학습용 예제 자체를 제대로 풀지 못하는 현상이다. 문제의 난도에 비해 모델 용량이 부족할
때 주로 발생한다. 부적합이 일어나면 학습 과정에서 정확도 향상이 제대로 이루어지지 않으며 당연히 평가에서도 좋은 결과를 기대할 수 없다. 학습 과정에서 부적합 현상이 나타난다면 모 델 용량을 키우고 학습 횟수를 늘리고 데이터양을 늘리거나 품질을 높이는 등의 조치가 필요하 다. 그런데 이들 조치는 주로 무언가를 늘려가는 방향이어서 하나하나가 간단치 않은 일일지 몰라도 어쨌든 어떻게 대처해야 할지 그 방향을 잡기는 비교적 쉬운 편이다. 반면에 과적합은 전체적인 문제 특성을 파악하지 못한 채 학습 데이터 자체의 지엽적 특성을 외워 버리는 1 일반화, 혹은 규제화라고도 한다.
328 3부 합성곱 신경망(CNN)
바람에 나타나는 현상이다. 학습 단계에서는 좋은 성과를 보이다가도 평가 단계로 넘어가면 정확
도가 크게 떨어지는 모습을 보인다. 과적합은 문제의 난도에 비해 모델 용량이 크면서 데이터 가 부족할 때 주로 발생한다. 일단 과적합이 발생하면 학습 횟수를 늘려도 새로운 데이터가 공 급되지 않는 한 성능 향상을 기대하기 어렵다. 어차피 이미 암기해 쉽게 푸는 문제들이 다시 주 어질 뿐이기 때문이다. 부적합은 모델 용량을 키우고 학습 횟수를 늘리는 등 대처하기가 상대적으로 쉽지만 과적합은 이런 방법으로만으로는 해소가 어렵다. 가장 좋은 방법은 양질의 데이터를 충분히 확보해 학습 에 이용하는 것이지만 데이터 구축은 많은 시간과 인력이 필요한 일이어서 그럴 형편이 안 되 는 경우가 많다. 이에 따라 학습 과정에 적당한 제약을 추가하여 학습용 예제 자체의 지엽적 특 성을 외워 버리기 어렵게 만드는 방법들이 고안되었다. 이 방법들이 바로 정규화 기법이다. 최근 들어 여러 정규화 기법이 소개되면서 적절한 활용 여부가 모델 개발 성공을 좌우하고 있 는 상황이다. 정규화 기법은 마치 빠르게 달려야 하는 육상 선수를 훈련시킬 때 일부러 모래주 머니를 차게 하는 것처럼 딥러닝 알고리즘에 일부러 학습을 방해하는 제약을 가하여 더 많은 실력을 쌓도록 유도하는 방법론이다. 학습 과정을 길고 힘들게 만드는 대신 궁극적으로 더 높 은 학습 성과를 얻어내기 위한 장치인 셈이다.
8장에서는 L2 손실, L1 손실, 드롭아웃, 잡음 주입, 배치 정규화 등 다섯 가지 정규화 기법을 소개할 것이다. 이들 가운데 L2 손실과 L1 손실은 기존 계층들의 순전파 및 역전파 처리 방식 을 살짝 변형시키는 형태로 처리될 것이며 나머지 세 기법은 새로운 계층으로 추가될 것이다. 또한 L2 손실이나 L1 손실은 학습 단계에만 영향을 미칠 것이며 드롭아웃이나 잡음 주입 역시 학습 단계에서만 의미 있는 동작을 할 것이다. 반면 배치 정규화 기법은 학습 단계와 평가 단계 에서 처리 방법이 달라진다. 참고로 정규화 기법은 정규화 단계에서의 성능 향상을 위한 것이 지만 신경망 개발 과정에서는 평가 단계가 정규화 단계에 대한 모의실험 역할을 한다.
8.2 L2 손실 학습을 거듭하다 보면 가중치 파라미터 절댓값 중 일부 혹은 전부가 과도하게 커지는 방향으로 치닫을 때가 있다. L2 손실과 L1 손실은 모두 절댓값이 큰 파라미터에 대해 불이익을 주어 값
8장 다섯 가지 정규화 확장 : 꽃 이미지 분류 신경망 329
의 폭주를 막고 기왕이면 작은 절댓값의 파라미터들로 문제를 풀도록 압박하는 정규화 기법이 다. 그렇다고 무조건 파라미터 절댓값을 줄이는 것은 아니며 본연의 문제를 푸는 능력을 높여 가는 과정에서 부수적으로 취하는 조치일 뿐이다. 이런 조치가 반드시 성능 향상으로 이어진다 는 보장은 없다. 하지만 이들 기법을 도입하고 나면 다양한 실험을 위한 선택의 폭이 넓어진다. L2 손실 기법은 L2 페널티값을 손실 함수에 더해주는 정규화 기법이다. 모델이 갖는 전체 가중치 파라
미터들을 W =w1, ..., wn이라 할 때 L2 페널티값 PL2와 L2 손실 기법이 적용된 새로운 손실 L' 은 아래와 같이 정의된다. 이 식에서 λ를 L2 손실률L2 decay이라 한다.
PL 2 =
1 n λ ∑ wi 2 2 i=1
1 n L ' = L + λ ∑ wi 2 2 i=1 손실 함수의 정의가 수정되었으니 역전파 처리도 이에 맞추어 수정되어야 한다. 그러나 전체적인 역전파 과정은 변경할 필요가 없으며 단지 각각의 파라미터 w i값이 수정될 때
L2 손실을 고려하지 않고 계산된 기존의 손실 기울기에 λw i값만 더해서 처리하면 된다. ∂L ' ∂L ∂L ' ∂PL 2 ∂L ∂L = + = + 1⋅ λ wi = + λ wi 이기 때문이다. ∂wi ∂wi ∂PL 2 ∂wi ∂wi ∂wi
이같은 처리는 각 파라미터가 한 번의 미니배치 학습 때마다 자기가 가진 값의 일부를 마치 고 정세율의 세금처럼 떼어내서 바쳐야 함을 의미한다. 이런 부담은 파라미터들의 절댓값을 줄이 는 방향으로 압박하여 지나치게 큰 값으로의 폭주를 막고 빈익빈 부익부 현상을 억제하여 값 사이의 지나친 격차를 방지한다. 그렇다고 L2 손실이 적용된다고 해서 모든 파라미터의 절댓값이 마냥 줄어드는 것은 아니다.
L2 손실이 파라미터값에 영향을 주면 기존의 신경망 학습 과정에 변화가 일어난다. L2 손실로 인하여 파라미터값이 문제 풀이에 필요한 값보다 줄어들면 기존의 학습 과정은 과도하게 줄어 든 파라미터값을 다시 키우는 방향으로 손실 기울기를 만든다. 즉 L2 손실로 인한 부담을 상 쇄하는 방향으로 학습 내용에 변화가 생긴다. 이런 경향이 L2 손실로 인한 파라미터값의 감소 와 균형을 이루면서 파라미터값들은 문제 풀이에 악영향을 미치지 않는 선에서 작은 값들로 모 인다.
330 3부 합성곱 신경망(CNN)
L2 손실이 가중칫값의 분포에 영향을 미치는 것은 확실하지만 어떻게 과적합 억제에 효과적인 지 명확히 설명하기는 쉽지 않다. 하지만 지나치게 목소리 큰 사람이 합리적 토론을 방해하듯 특정 파라미터로 값이 쏠리는 현상이 과적합의 원인이 될 수 있고 따라서 이를 막아주는 L2 손 실이 정규화 기법으로서 효과가 있는 것으로 보인다. 여기에서 말하는 가중치 파라미터에는 완전 연결 계층의 가중치 행렬은 물론 합성곱 계층의 커 널도 포함된다. 하지만 두 계층 모두에서 편향 성분은 이에 포함하지 않는다. 이는 편향 파라미 터에 L2 손실을 적용하지 않을 때 오히려 가중치의 L2 손실 효과가 향상되기 때문이다. 어느 정도의 크기가 나와야 하는 선형 출력이 있다고 할 때 값의 범위에 제약을 받지 않는 편향이 그 값의 대부분을 감당해 주면 가중치들은 단지 데이터에 따른 출력값의 차이를 적절히 만들어내 는 수준으로만 유지되기 때문이다.
L2 손실 기법은 모든 계층의 파라미터와 관련되어 있어서 하나의 계층으로 독립시키기에는 부 적절하다. 따라서 L2 손실 기법은 계층 형태로 나타나지 않고 숨어서 손실 함수 계산과 역전파 처리에만 영향을 미친다. 그런데 이들 두 작업은 학습 단계에서만 수행되고 평가 단계에서는 불필요한 처리다. 따라서 특별히 따로 신경쓰지 않아도 L2 손실 기법은 학습 단계의 처리에만 영향을 미치며 학습 단계를 벗어난 후에는 관여하지 않는다.
8.3 L1 손실 L1 손실 기법은 L1 페널티값을 손실 함수에 더해주는 정규화 기법이다. 모델이 갖는 전체 가중치 파라
미터들을 W =w1, ..., wn이라 할 때 L1 페널티값 PL1과 L1 손실 기법이 적용된 새로운 손실 L' 은 아래와 같이 정의된다. 이 식에서 α를 L1 손실률L1 decay이라 한다. n
PL1 = α ∑ wi i=1
n
L ' = L + α ∑ wi i=1
L2 손실과 마찬가지로 역전파의 전체적인 처리 과정은 손 댈 필요가 없으며 단지 각각의 파라
8장 다섯 가지 정규화 확장 : 꽃 이미지 분류 신경망 331
미터 wi값이 수정될 때 L1 손실을 고려하지 않고 계산된 기존의 손실 기울기에 α sign(wi)값만 더해서 처리하면 된다. 왜 그런지는 아래 글상자를 참고하기 바란다. 이같은 처리는 각 파라미터가 미니배치 학습 때마다 자신의 부호에 따라 일정한 크기의 값을 꼬박꼬박 바쳐야 함을 의미한다. L2 손실처럼 자기 값에서 일정한 비율을 덜어내는 것이 아니 라 일률적으로 정해진 값을 덜어내는 것인데 이는 큰 값을 갖는 파라미터에는 별 것 아닐지 몰 라도 작은 값을 가진 가난한 파라미터들에는 치명적이다. 따라서 이런 부담은 파라미터들의 절 댓값을 줄이는 수준을 넘어 파산을 유도하는 방향으로 압박하여 0 혹은 0에 가까운 파라미터 값을 양산하게 만든다. 물론 이 경우에도 파라미터값이 마냥 줄어드는 것만은 아니다. L2 손실 에서와 마찬가지로 L1 손실이 파라미터값에 영향을 주는 데 따라 기존의 신경망 학습 과정에 변화가 일어나기 때문이다. 이로 인해 문제 풀이에 꼭 필요한 일부 파라미터 성분에 대해서는
L1 손실로 인한 부담을 상쇄하는 방향으로 손실 기울기에 변화가 생겨 값이 유지된다. L1 손실 역시 L2 손실과 비슷하게 과적합 억제에 어느 정도의 효과는 있어 보이지만 그보다도 가중치 분포에 미치는 영향이 크다. 무슨 이유에서든 가중치들이 0 혹은 0에 가까운 원소를 많 이 포함하는 희소한 텐서가 되는 것이 바람직하다면 L1 손실을 이용하면 된다.
L1 손실 역시 L2 손실과 마찬가지로 별도의 계층 형태로 구현되지 않고 숨어서 손실 함수 계산 과 역전파 처리에 영향을 미치는 형태로만 이용된다. 또한 L2 손실과 마찬가지로 L1 손실 역시 가중치 파라미터에 대해서만 적용하고 편향 파라미터에는 적용하지 않는다.
L1 손실의 역전파 처리 ∂L ' = 1 이기 때문에 L값 생성에 참여한 기존의 신경망 성분들에 대한 역전파 처리는 따로 영향 ∂L
받지 않으며 PL1 생성에 참여한 가중치 파라미터값들에 대한 추가적인 처리만 필요하다. 그런 ∂L ' ∂L ∂L ' ∂LP1 ∂L ∂LP1 ∂L ∂L 이고 wi >0일 때 P1 = α , wi <0일 때 P1 = −α 이다. = + = + ∂wi ∂wi ∂PL1 ∂wi ∂wi ∂wi ∂wi ∂wi ∂LP1 다만 wi = 0일 때는 미분 불능이다. 하지만 이를 그냥 = 0 으로 간단히 처리해도 별문제가 ∂wi ∂LP1 없다. 따라서 전체적으로 ∂w = α sign ( wi ) 로 볼 수 있다. 이는 역전파 과정에서 각각의 wi값 i
데
이 수정될 때 그 손실 기울기에 α sign(wi)를 더해서 처리하면 된다는 이야기다.
332 3부 합성곱 신경망(CNN)
CHAPTER
9
인셉션 모델과 레스넷 모델 : 꽃 이미지 분류 신경망
8장 인셉션 모델과 레스넷 모델 : 꽃 이미지 분류 신경망 361
합성곱 신경망은 딥러닝 연구의 핵심적인 주제로서 하루가 멀다고 새로운 연구 결과가 쏟아져 나온다. 이들 연구는 전반적으로 거대하고 복잡한 구조, 특히 많은 계층을 켜켜이 쌓는 경향을 보인다. 이번 절에서는 지난 수년 간 발표된 주요 합성곱 신경망 모델 가운데 ‘거대 구조’의 대표적 사례 라고 할 수 있는 인셉션 모델과 ‘깊은 구조’의 대표적 사례라고 할 수 있는 레스넷 모델을 소개 한다. 이 장에서 다루는 내용은 다음과 같다. ●●
다양한 구조의 모델 지원에 필요한 다섯 가지 새로운 복합 계층
●●
커널 크기와 보폭에 제한이 없는 확장된 합성곱 계층과 풀링 계층
●●
인셉션(inception ) 모델과 레스넷(resnet ) 모델 구조 생성 및 간소화된 모델의 학습
9.1 인셉션 모델 인셉션 모델은 인셉션 모듈이라고 하는 병렬 처리 합성곱 신경망 구조를 반복적으로 활용하여 신경망의 규모를 크게 늘린 모델이다. 2012년 구글넷이 처음 고안한 인셉션 모듈은 이미지 인 식의 성능을 획기적으로 개선해 2014년 이미지넷 경진대회 우승의 원동력이 되었다.
2012년 토론토 대학 슈퍼비전팀은 합성곱 신경망 구조를 이용한 알렉스넷을 이용해 전 세계 인공지능 연구자들이 겨루는 이미지넷 경진대회에서 우승했다. 이전까지 우승팀의 정답률은
74% 선에 머물렀고 이 해에도 다른 모든 참가팀이 여기에서 다만 0.1%라도 높이기 위해 애쓰 던 상황에서 갑자기 84%라는 압도적인 성적을 보이며 우승해 더욱 놀라웠다. 하지만 불과 2년 후인 2014년 구글넷은 인셉션이라는 ‘거대 병렬 모델’을 성공적으로 학습시켜 정답률 93%를 넘기면서 이 대회 우승을 차지했다. 비록 다음 해인 2015년 마이크로소프트 리 서치가 개발한 레스넷이 95%의 정답률로 왕좌를 빼앗기는 했지만 구글넷은 꾸준히 성능이 개 선된 인셉션 모델을 선보이고 있다. 인셉션 모델의 구성은 인터넷 등에 자세히 공개되어 있지만 규모가 너무 커서 좀처럼 구현해 실험할 엄두가 나지 않는다. 하지만 막상 살펴보면 딱히 못 만들 구조도 아니거니와 구현을 위
362 3부 합성곱 신경망(CNN)
해 깊이 살펴보는 과정에서 신경망 구조에 대한 깊은 이해와 처리 방법에 대한 통찰을 얻을 수 있다. 여기에서는 일단 인셉션 모델에 대해 간단히 아래의 세 가지 사항만 소개하고 자세한 내용은 구현 과정에서 살펴보기로 하자. ●●
인셉션 모델과 인셉션 모듈
●●
합성곱 연산 과정의 변형을 이용한 계산량 절감
●●
인셉션-v3 (inception -v3 ) 모델의 구조
9.1.1 인셉션 모델과 인셉션 모듈 인셉션 모델은 다양한 병렬 구조를 이용하며 인셉션 모듈이라는 중간 구성단위를 둔다. 인셉션 모듈은 하나의 입력을 몇몇 분기branch에서 병렬 처리한 후 그 결과들을 한데 모아 다음 단계로 전달한다. 참고로 합성곱 신경망의 출력은 복수의 채널을 가지며 각 분기의 처리 결과들을 별 도의 채널로 나열해주면 되기 때문에 쉽게 결과를 한데 모을 수 있다. 인셉션 모듈은 다양한 형태로 구성이 가능하며 대표적인 두 가지는 다음과 같다. 먼저 초기 인 셉션 모델에 이용된 아래 그림과 같은 구조의 기본형 인셉션 모듈을 살펴보자. 그림 기본형 인셉션 모듈 합병 필터
1x1 합성곱
3x3 합성곱
5x5 합성곱
3x3 최대치 풀링
이전 계층
9장 인셉션 모델과 레스넷 모델 : 꽃 이미지 분류 신경망 363
이 기본형 인셉션 모듈은 [mb_size, xh, xw, xchn] 형태의 4차원 입력 텐서에 대해 4갈래의 병렬 처리를 거쳐 출력을 생성한다. 네 갈래 처리는 각각 1 × 1 합성곱, 3 × 3 합성곱, 5 × 5 합성곱, 3 × 3 최대치 풀링 계층으로서 합성곱 계층과 풀링 계층이 섞여 있으며 각기 다른 커 널 크기를 갖는다. 이는 어느 한 가지 분석 방법에 전적으로 의존하기보다 여러 방법으로 분석 하고 그 결과를 종합하는 편이 좋은 결과를 가져올 것이라는 믿음에 기반을 둔 접근 방법이다. 인공지능 분야에서는 이런 접근을 앙상블 ensemble 혹은 배깅bagging 기법이라 하며 적지 않은 인 기를 얻고 있다. 이들 네 갈래 처리 결과는 합병 필터에 의해 텐서 하나로 합쳐진다. 합병 필터의 처리는 네 갈 래 처리 결과들을 별도의 채널들로서 차례로 나열해 배치하는 단순한 방식으로 이루어진다. 따 라서 각 갈래의 처리 결과는 채널 축을 제외한 나머지 세 축에 대해 같은 형태를 가져야 한다. 이 조건은 각 갈래의 처리에 ‘SAME’ 방식으로 패딩 처리를 하면서 건너뛰기를 하지 않으면 쉽 게 만족된다. 이렇게 하는 경우 모든 갈래의 출력이 출력 채널 수만 제외하고는 입력과 같은 형 태를 갖게 되기 때문이다. 특히 풀링은 보통 이미지 해상도를 줄이는 용도로 이용되지만 인셉 션 모듈 안에서는 보폭을 [1,1]로 지정하여 이미지 크기를 줄이지 않으며 단지 이미지 픽셀들 을 합성곱과 다른 방식으로 처리하기 위해 이용될 뿐이다. 기본형의 첫 번째 갈래에 있는 1 × 1 합성곱이 도대체 무슨 소용인지 의문이 들 수 있다. 합성 곱 연산은 커널을 통해 어떤 픽셀에 대해 그 주변의 픽셀들까지 함께 고려하여 처리하는 연산이 기 때문에 입력 픽셀 하나만 보고 출력 픽셀을 만드는 1 × 1 커널은 아무런 역할을 하지 못할 것으로 오해하기 쉽다. 하지만 합성곱 연산에서 하나의 출력 픽셀을 계산하는 데 입력 채널 전 체가 반영된다는 점까지 생각하면 오해가 풀릴 것이다. 1 × 1 합성곱은 무의미한 픽셀 간의 일 대일 대응이 아니다. 1 × 1 합성곱은 픽셀별로 입력 채널 전체와 출력 채널 전체를 연결하는 구조로서 각 픽셀 위치에 대해 출력 채널별로 입력 채널 정보를 종합한 내용을 생성한다. 한편 채널 수가 표시되어 있지 않은 위의 그림만으로는 병렬구조 전체의 입출력 사이의 채널 수 관계를 알 수는 없다. 하지만 한 가지만은 확실하다. 네 번째 갈래가 채널 수 변화가 없는 풀 링 처리로서 입력과 같은 채널 수를 가질 것이며 따라서 여기에 나머지 세 갈래의 채널 수가 더 해질 것을 고려하면 전체 출력 채널 수는 무조건 입력 채널 수보다 커진다는 것이다.
364 3부 합성곱 신경망(CNN)
9.1.2 합성곱 연산 과정의 변형 그림 개선된 인셉션 모듈 합병 필터
3x3 합성곱
3x3 합성곱
1x1 합성곱
1x1 합성곱
3x3 합성곱
3x3 최대치 풀링
1x1 합성곱
이전 계층
개선된 인셉션 모듈은 기본형 인셉션 모듈과 마찬가지로 네 개의 분기를 가지며 각 분기에서 하는 일들도 각각 비슷하다. 그러면서도 처리의 전후에 1 × 1 합성곱 계층을 추가하거나 하나 의 5 × 5 합성곱 계층을 두 개의 3 × 3 합성곱 계층으로 대치하는 방법을 이용해 처리의 품질 을 높이면서도 전체적인 계산량을 줄여 처리 속도를 높이려고 노력하고 있다. 먼저 두 번째 분기에서 3 × 3 합성곱 계층 앞에 1 × 1 합성곱 계층을 추가한 것은 인접 픽셀 들에 대한 처리에 앞서 각 픽셀 위치별로 채널 정보를 종합하는 단계를 두어 품질을 높여보려는 것이다. 마지막 분기에서 3 × 3 최대치 풀링 계층 뒤에 추가된 1 × 1 합성곱 계층 역시 비슷하게 픽셀 별 채널 정보를 종합하는 의미가 있다. 하지만 이처럼 풀링 계층 전후에 1 × 1 합성곱 계층을 두는 것은 분기의 채널 수 변경을 가능하게 만든다는 의미도 있다. 추가된 합성곱 계층 덕분에 채널 수에 변화를 줄 수 없는 풀링 계층의 한계를 넘어설 수 있다. 한편 세 번째 분기에는 하나의 5×5 합성곱 계층 대신 두 3 × 3 합성곱 계층이 사용되고 있다. 기본형 인셉션 모듈과 개선된 인셉션 모듈의 세 번째 분기는 다음 그림에서 보듯 똑같이 5 × 5 영역의 입력 픽셀 정보를 종합해 출력 픽셀 하나를 만들어낸다.
9장 인셉션 모델과 레스넷 모델 : 꽃 이미지 분류 신경망 365
그림 5 × 5 합성곱 연산의 변형
ⓐ 기본형 인셉션 모듈의 5 × 5 합성곱 연산
ⓑ 개선된 인셉션 모듈의 2단계 3 × 3 합성곱 연산
위의 그림에서 ⓐ는 5 × 5 합성곱 연산에 5 × 5 = 25회 곱셈을 수행한다. 반면 ⓑ는 3 × 3 합성곱 연산 두 번은 (3 × 3) + (3 × 3) = 18회 곱셈을 수행한다. 이때 맨 위 계층의 한 픽셀 계산을 위해 중간 계층 아홉 개의 픽셀이 모두 바닥 계층으로부터 계산되어야 하기 때문에 필 요한 곱셈 수를 (3 × 3) + 9 × (3 × 3) = 90회로 착각할 수 있다. 하지만 중간 계층의 각 픽 셀은 바닥 계층으로부터 한 번 계산되면 맨 위 계층 아홉 픽셀의 계산에 반복적으로 활용된다 는 점을 잊지 말도록 하자. 합성곱 연산을 이처럼 변형시키는 주된 목적은 앞서의 1 × 1 합성곱 계층 추가와는 달리 학습 품질의 개선보다 계산량의 절감을 통한 학습 속도의 개선이라 할 수 있다. 이와 비슷한 변형으 로 1 × 7 합성곱 계층과 7 × 1 합성곱 계층을 연달아 배치하여 7 × 7 합성곱 계층을 대신하 는 방법도 있다. 이 방법은 7 × 7 영역의 정보를 종합하여 출력 픽셀을 만들어내면서도 픽셀 당 계산 부담을 7 × 7 = 49회에서 1 × 7 + 7 × 1 = 14회로 크게 줄인다.
9.1.3 인셉션-v3 모델의 구조 구글넷에서는 인셉션 모듈을 다양한 형태로 활용하여 인셉션-v1부터 인셉션-v4에 이르는 다 양한 인셉션 모델을 선보였다. 아래의 그림은 2014년 이미지넷 경진대회에서 우승을 차지한 인셉션-v3의 구조를 그림으로 나타낸 것이다.
366 3부 합성곱 신경망(CNN)
Part
IV
순환 신경망(RNN)
4부에서는 시계열 데이터 처리에 적합한 순환 신경망( recurrent neural network, RNN)을 소개한다. 다루는 내용 ●
순환 신경망의 기본 구조와 오토마타 패턴 검사기
●
LSTM 신경망과 도시 소음 분류기
●
시계열 입출력의 처리와 동영상 장면전환 검출기
9장 인셉션 모델과 레스넷 모델 : 꽃 이미지 분류 신경망 447
Part IV
순환 신경망(RNN)
10장 기본 셀 순환 신경망 : 오토마타 문장 판별 신경망 11장 LSTM 순환 신경망 : 도시 소음 분류 신경망 12장 CNN과 RNN의 결합 : 장면 전환 판별 신경망
448 4부 순환 신경망(RNN)
CHAPTER
10
기본 셀 순환 신경망 : 오토마타 문장 판별 신경망
10장 기본 셀 순환 신경망 : 오토마타 문장 판별 신경망 449
순환 신경망은 다층 퍼셉트론 신경망의 은닉 계층 가운데 일부를 순환 계층recurrent layer으로 대체 하여 만든 신경망이다. 순환 계층은 시계열 데이터를 시간대별로 반복 처리하면서 어떤 시간대 에 자신이 출력한 내용을 다음 시간대에 다시 입력의 일부로 활용한다. 순환 계층은 합성곱 계 층과 마찬가지로 완전 연결 계층에 비해 획기적으로 줄어든 규모의 파라미터를 반복 활용하여 학습 효과를 높인다. 이 절에서는 지금까지 만든 모델 클래스에 순환 계층 처리 기능이 추가된 RnnBasicModel 클 래스를 만들고 이를 이용해 오토마타 패턴 검사 신경망을 만든다. 이 장에서 다루는 내용은 다음과 같다. ●●
시계열 데이터와 그 데이터의 표현 방법
●●
순환 계층과 순환 벡터의 활용
●●
오토마타 데이터셋, 오토마타를 이용한 문장의 생성과 검사
10.1 시계열 데이터 시계열 데이터time series data란 일정 시간 간격으로 배치된 같은 형태 데이터들의 열sequence을 말한다. 시계 열 해석time series analysis은 이런 시계열 데이터들이 어떤 법칙에서 생성되어 나오는지를 파악하는 수학 분야 다. 시계열 예측 time series prediction은 한 발 더 나아가 주어진 시계열 데이터로부터 적절한 수학적 모델을 만 들고 이를 이용해 미래에 일어날 일들을 예측하고자 하는 연구 분야다. 시계열 데이터의 처리는 과학이
나 공학은 물론 금융시장에서의 주가 예측과 같은 경제학 분야까지 널리 이용된다. 같은 형식의 데이터들이 차례로 나타나는 시계열 데이터에는 시간대를 넘나드는 다양한 패턴 이 숨어있게 마련이다. 이러한 패턴 가운데는 가까운 인접 시간대 사이에서 형성되는 패턴도 있지만 멀리 떨어져 있는 시간대 사이에 나타나는 패턴도 있다. 한편 시간이 흐르면 반드시 엔 트로피가 증가한다는 물리적 법칙에 따라 시계열 데이터에 형성되는 패턴은 시간 축에 대해 비 대칭적이며 비가역적인 방향성을 갖게 되는 경우가 많다. 많은 연구에도 다양한 종류의 시계열 데이터에 대해 그 내용을 분석해서 이해하고 그 이해를 바탕으로 데이터의 분포 특성과 유용한 패턴을 찾아 활용하기란 쉬운 일이 아니다. 그런 가운 데 딥러닝의 순환 신경망이 이런 문제들을 풀어낼 대안으로 각광받게 되었다. 데이터만 충분히
450 4부 순환 신경망(RNN)
모아 학습시킨다면 왜 그런지를 굳이 설명하지 않아도 딥러닝 모델이 알아서 데이터의 분포 특 성을 파악하고 그 안에서 유용한 패턴을 발견해 다양한 문제를 해결해주기 때문이다. 시계열 데이터의 예로는 우선 음원 파일이나 동영상 파일 같은 멀티미디어 데이터가 있고 기후 나 천문 현상 혹은 주식 시장의 시세 등을 주기적으로 측정해 기록한 관측 데이터도 있다. 차량 이나 선박, 항공기의 운행 과정에서 수집되는 각종 로그 기록도 중요한 시계열 데이터다. 일정 한 시간 간격이라는 조건에 엄밀하게 들어맞지는 않지만 턴 방식으로 진행되는 게임의 진행 기 록도 일종의 시계열 데이터로 볼 수 있다. 대표적인 예로 바둑 기보를 들 수 있으며 엄격한 규칙 하에 작성된 야구 경기 기록표, 컴퓨터 게임의 진행 상황에 대한 로그 기록 등도 이에 해당한다. 말이나 글도 시계열 데이터다. 말이나 글은 음소나 알파벳이 시간의 흐름에 따라 일차원적으로 나열되어 표현되기 때문이다. 사람의 언어 행위는 기억이나 연상, 추론과 상상 등 각종 지능적 인 요소들이 끼어들면서 더욱 다양하고 복잡해진다. 자연어 처리는 인공지능이 인간의 지능에 가깝게 다가서려면 꼭 넘어서야 할 관문으로서 순환 신경망을 이용한 자연어 처리는 중요한 연 구 주제지만 그만큼 난도가 높다.
10.2 순환 계층과 순환 벡터의 활용 순환 신경망은 은닉 계층 안에 하나 이상의 순환 계층을 갖는 신경망 구조를 말한다. 순환 계층 은 시계열 데이터 처리에 알맞게 고안된 퍼셉트론 계층이다. 순환 계층의 동작 방식은 아래 그 림과 같이 표현할 수 있다. 그림 순환 계층의 동작 방식에 대한 두 가지 표현 방법
ⓐ 접어놓은 표현
ⓑ 펼쳐놓은 표현
10장 기본 셀 순환 신경망 : 오토마타 문장 판별 신경망 451
순환 계층의 구조는 기본적으로 ⓐ와 같다. 여기에서 A는 퍼셉트론 하나가 아닌 여러 퍼셉트론 으로 구성된 퍼셉트론 계층이며 이 A가 바로 순환 계층에 해당한다. ⓑ는 이해를 돕고자 그림 ⓐ를 시간대별로 따로 그려 펼쳐놓은 것이다. 순환 계층을 ⓐ처럼 표현한 것을 ‘접어놓은 표현’ 이라 하고 ⓑ처럼 표현한 것을 ‘펼쳐놓은 표현’이라 한다. 일반적으로 접어놓은 표현과 펼쳐놓은 표현은 같은 대상을 다른 방식으로 표현한 데 지나지 않 지만 텐서플로 같은 프레임워크에서는 이런 표현법의 차이가 실제 계산 그래프 구성에 반영되 기도 한다. 텐서플로는 동적 순환 계층dynamic RNN과 정적 순환 계층static RNN을 지원한다. 동적 순 환 계층은 ⓐ에 해당하는 간단한 계산 그래프를 구성해놓고 반복 이용하여 각 시간대를 처리한 다. 반면에 정적 순환 계층은 처음부터 ⓑ에 해당하는 거대한 형태로 계산 그래프를 구성해놓 고 반복 없이 여러 시간대를 한꺼번에 처리한다. 정적 순환 신경망은 동적 순환 신경망에 비해 학습과 테스트 과정에서 처리 속도가 빠르다는 장점이 있지만 처음에 계산 그래프를 구성하는 과정이 오래 걸리고 시계열 데이터의 길이에 대한 유연성이 떨어진다. 이 책의 예제들은 ⓐ 형태의 처리 과정을 각각의 시간대에 반복해 적용하는 방식으로 작성할 것이다. 순환 계층 A에서 나와 다시 A로 향하는 그림 ⓐ의 화살표는 A의 출력이 다시 A로 입력되는 것 을 표현한 것이다. 이를 순환 벡터recurrent vector라 한다. 단, 순환 벡터는 동일한 시점에 입출력이 동시에 이루어지는 되먹임feedback 입력이 아니라 어떤 시간대의 출력이 다음 시간대의 입력으 로 이용되는 지연 입력이다. 이런 지연 처리 효과는 그림 ⓐ보다 그림 ⓑ에 더욱 분명하게 표시 되어 있다. 입력 벡터 x0, x1, ..., xt는 시간대에 따라 내용은 변할지언정 벡터의 형태와 벡터 각 성분의 역 할은 같다. 따라서 시간대별로 별도의 처리 장치를 두지 않고 퍼셉트론 계층 A 하나를 이용해 반복해서 처리하는 것이 효율적일 뿐만 아니라 의미상으로도 타당하다. 한 장치를 반복적으로 이용하면 학습 효과를 이 장치에 집중시킬 수 있을뿐 아니라 데이터마다 시간대 길이가 달라질 수 있는 시계열 데이터셋을 유연하게 처리할 수 있다.
452 4부 순환 신경망(RNN)
10.3 순환 계층의 입출력 형태 순환 계층의 입출력 형태로 가장 먼저 떠오르는 구성은 아마도 입출력이 모두 시계열 데이터 형태인 경우일 것이다. 하지만 사실은 입력만 시계열 데이터이거나 출력만 시계열 데이터인 경 우가 더 흔하다. 입력만 시계열 데이터인 경우의 처리를 보통 시계열 데이터 분석이라고 하고, 출력만 시계열 데이터인 경우의 처리를 시계열 데이터 생성이라고 한다. 한편 입출력이 모두 시계열 데이터 형태인 응용에도 입출력 시간대 축이 서로 다른 의미라면 하나의 순환 계층에서 처리하기가 곤란하다. 순환 계층은 반복 처리 방식으로 동작하는데 이 반복 처리를 입출력 시간대 가운데 어느 하나에 맞추면 다른 쪽이 제대로 처리될 수 없기 때문 이다. 따라서 입력을 분석하는 순환 계층과 출력을 생성하는 순환 계층을 따로 만들어 연결해 야 하는데 이런 확장 구조는 14장 ‘인코더-디코더’에서 소개한다. 입출력의 시간대 축이 같은 의미일 때만 입출력이 모두 시계열 데이터 형태인 순환 계층을 이 용하는데 이는 주로 시계열 신호의 단순 변환이나 모니터링 용도다. 순환 계층에 주어지는 입력 형태가 시계열 데이터일 때 순환 계층 내의 반복 처리 부분에 주어 지는 시간대별 입력은 입력 데이터에서 해당 시간대 부분을 잘라낸 슬라이스 벡터에 순환 벡터 를 합친 확장 입력이어야 한다. 순환 계층 A의 출력은 여러 방법으로 만들 수 있다. 우선 위의 그림에는 순환 계층 A의 출력인 은닉 벡터와 다음 단계로 전달되는 순환 벡터가 서 로 구별되어 있다. 하지만 딱히 이 둘을 구분해야 할 이유가 없기 때문에 간단하게 벡터 하나만 만들어 두 역할을 겸하도록 하는 접근이 더 널리 이용된다. 이 경우 시계열 데이터 형태의 출력 은 모든 시간대에 대한 순환 벡터들을 모아 생성하면 된다. 또한 비시계열 형태의 출력은 이전 모든 시간대의 정보가 반영되어 만들어지는 최종 단계 때의 순환 벡터를 보고하면 된다. 특히 비시계열 출력의 경우 순환 벡터 역할을 하지 않는 은닉 벡터는 출력 말고는 쓸 데가 없다. 이 렇게 거의 이용되지도 않을 정보를 생성하는 부담을 줄이기 위해서라도 순환 벡터가 은닉 벡터 까지 겸하는 방법을 더욱 선호한다.
10장 기본 셀 순환 신경망 : 오토마타 문장 판별 신경망 453
10.4 순환 계층을 위한 시계열 데이터의 표현 순환 계층이 처리할 시계열 데이터는 지금까지 다룬 데이터들에 비해 시간 축 하나를 더 갖는 다. 이뿐만 아니라 시간 축에 대한 길이, 즉 시간대 수가 데이터마다 달라질 수 있다. 이런 길이 차이는 심지어 미니배치 데이터 안에서도 나타나기 때문에 데이터 표현과 처리 과정 설계에 각 별한 유의가 필요하다. 간단한 처리를 위해 시계열 데이터의 길이를 획일적으로 통일하는 경우 도 있지만 이는 문제의 성격에 따라 달라질 수 있어서 언제나 적용할 수 있는 방법은 아니다. 시계열 데이터를 전달할 때 텐서의 차원도 하나 늘어나야 하지만 각 데이터의 길이를 표현할 방법도 찾아야 한다. 미니배치 데이터에서 각 데이터의 길이, 즉 시간대 수를 나타내는 방법으로 우선 데이터 길이 정 보를 별도의 벡터로 담아 전달하는 방법을 생각할 수 있다. 이 경우 관련된 함수들의 인수 구조 를 변경할 필요가 있다. 순환 계층만 새로 프로그래밍하는 경우라면 이 방법이 간단할 것이다. 하지만 우리 프로그램은 전체적으로 같은 인터페이스를 유지하면서 인수 구조가 같은 세 가지 메서드(파라미터 생성, 순전파 처리, 역전파 처리)들로 각 계층을 처리하고 있어서 고칠 곳이 너 무 많아진다. 따라서 이 방법은 바람직하지 않다. 다양한 형식의 입력 데이터 구조를 유연하게 표현하는 구조체나 객체 클래스를 새로 고안해서 데이터 표현에 도입하는 방안도 생각할 수 있지만 역시 기존 함수의 인수 구조를 유지하면서는 처리가 곤란하다. 데이터가 끝났음을 표시하는 특별한 입력값을 정하여 길이를 넘어가는 부분에 넣는 방법도 가 능하지만 문제 성격에 따라 값의 설정이 달라져야 할 수도 있어서 코딩에 불편을 초래하기 쉽 다. 이 방법은 시간대별 데이터 내용이 숫자일 때는 적용하기가 다소 불편하지만 선택 분류을 위한 원-핫 벡터나 로짓값 벡터를 이용할 때는 선택 항목의 하나로 끝 표시를 정해서 이용할 수 있다. 또한 길이가 미리 정해져 있지 않은 경우를 쉽게 처리할 수 있기 때문에 이 방법은 순 환 계층이 생성하는 시계열 출력 데이터를 표현하는 데 적합하다. 시계열 데이터 생성에서의 이러한 처리는 14.1장 ‘인코더-디코더’ 단원에서 다룬다. 입력과 출력이 모두 시계열 데이터이면서 시간 축의 의미가 서로 다른 경우에는 순환 신경망만 으로 다루기가 쉽지 않다. 이런 경우의 처리 방법 역시 14장 ‘인코더-디코더’에서 살펴본다. 여 기에서는 입력과 출력 중 한쪽만 시계열 데이터인 경우 혹은 양쪽이 모두 시계열 데이터이더라
454 4부 순환 신경망(RNN)
CHAPTER
11
LSTM 순환 신경망 : 도시 소음 분류 신경망
10장 LSTM 순환 신경망 : 도시 소음 분류 신경망 489
LSTMLong Short-Term Memory은 시계열 데이터에 대한 새로운 처리 방식이다. 앞서 소개한 rnn 계 층에서는 순환 벡터나 그 기울기 정보에 정보의 소멸 및 폭주 현상이 나타났다. 그래서 정보의 장거리 전달이 어렵다. LSTM은 이 문제를 해결했다. 이 방식을 이용하는 계층을 lstm 계층,
lstm 계층을 이용하는 신경망을 LSTM 신경망이라고 부른다. RnnBasicModel 클래스에 lstm 계층을 추가한 파생 클래스(RnnLstmModel)를 만들어 도시 소
음 음원 분류 신경망 모델을 구성하고 동작을 실험해보자. 실습을 하기에 앞서 캐글의 도시 소음 분류 데이터셋을 내려받아두자. 용량 문제로 데이터를 이 책의 깃허브에 올리지 못했다. /data/chap11에 데이터를 다운받아 배치하는 방법을 적어 뒀으니 참고하기 바란다. ●●
도시 소음 분류 데이터셋 : www.kaggle.com/pavansanagapati/urban -sound -classification
이 장에서 다루는 내용은 다음과 같다. ●●
순환 벡터와 기울기 정보의 소멸 및 폭주 현상
●●
LSTM 셀의 구조와 동작 방식, 구현 방법
●●
주파수 스펙트럼 분석 기법과 도시 소음 데이터셋
11.1 순환 벡터와 기울기 정보의 소멸 및 폭주 딥러닝 분야에서 손실 기울기의 소멸 및 폭주 문제는 연구 초기부터 중요한 주제였다. 이 문제 는 딥러닝 신경망이 깊어져 점점 많은 계층을 갖게 될수록 더욱 심각해졌다. 손실 기울기의 소멸은 역전파 과정에서 계층을 거칠수록 손실 기울깃값이 점점 작아져 초반 계 층의 학습이 좀처럼 이루어지지 않는 현상이다. 반대로 손실 기울기의 폭주는 계층을 거칠수록 손실 기울기가 점점 커져 초반 계층의 학습이 엉망이 되어버리는 현상이다. 손실 기울기의 소 멸이 자주 일어나면 학습 진척이 어려워지는 정도의 문제가 일어난다. 반면 손실 기울기의 폭 주는 단 한 번만 일어나도 애써 학습한 파라미터값이 크게 훼손된다.
490 4부 순환 신경망(RNN)
그림 손실 기울기의 소멸과 폭주
x1 y1 x2 y2 x3 y3 x4
손실 기울기의 소멸
손실 기울기의 폭주 출처 : bit.ly/2vlQ8H8
깊은 신경망에서의 손실 기울기의 소멸 및 폭주 현상은 미니배치 데이터를 이용해 문제를 일으 킬 소지가 있는 특정 데이터를 다른 데이터와 혼합해 처리하면서 많이 완화되었다. 또한 편미 분을 이용한 손실 기울기 계산 과정을 정확히 이해하고 적용하면서 문제 자체가 많이 해소되었 다. 이에 따라 신경망이 깊어질수록 좀 더 많은 데이터와 학습 횟수를 필요로 할지언정 요즘은 손실 기울기의 소멸 및 폭주 현상 자체가 그다지 심각한 문제로 거론되지는 않는다. 비슷한 문제가 순환 신경망 내부에서 일어날 수 있다. 순환 신경망에서는 이전 시간대에서 전 달된 순환 벡터를 입력의 일부로 이용하면서 다음 시간대로 전달할 순환 벡터를 만든다. 이때 각 시간대 데이터에 대해 동일한 내용의 가중치 행렬이 반복적으로 선형 연산에 이용된다. 물 론 가중치 행렬 내용은 학습 진행에 따라 지속적으로 수정된다. 하지만 하나의 미니배치 데이 터를 처리하는 동안은 가중치가 변함없이 일정하게 유지되며 이 때문에 동일한 내용의 가중치 가 각 시간대에 대해 반복 이용되는 상황이 생겨난다.
11장 LSTM 순환 신경망 : 도시 소음 분류 신경망 491
이런 상황에서 순환 벡터의 각 원소에 대해 생각해보자. 순환 벡터 각 원소는 다음 시간대에 전 달할 새로운 순환 벡터를 계산하는 선형 연산에 참여한다. 그 가운데는 바로 자신의 위치에 해 당하는 원소도 있다. 즉, 순환 벡터의 각 원소는 시간대마다 자기 위치의 다음 값을 계산하는 데에 참여하는 것이다. 문제는 이 계산을 위해 순환 벡터 원소에 곱해지는 가중치 행렬의 원소 가 모든 시간대에 걸쳐 같은 위치의 원소라는 점이다. 그리고 하나의 미니배치 데이터를 처리 하는 동안, 즉 모든 시간대에 걸쳐 이 가중치 원솟값이 일정하게 유지된다는 점이다. 따라서 순 환 벡터 각 원소는 계속 같은 가중치와 곱해져 자신의 다음 값을 계산하는 데 이용되는 것이다. 물론 선형 연산에 순환 벡터와 시간대별 입력의 다른 원소들이 함께 이용되고 비선형 활성화 함수도 적용되면서 효과가 완화되는 측면이 있기는 하다. 하지만 이런 효과들이 서로 상쇄된다 고 치면 같은 가중치 원솟값이 계속 곱해지는 것은 값의 소멸이나 폭주를 초래할 수 있다. 절댓값이 1보다 큰 값을 어떤 값에 반복해 곱하면 기하급수적으로 증가해 폭주한다. 이때, 반 복해 곱해지는 값의 부호가 음수이면 값의 부호는 매번 바뀌지만 절댓값은 여전히 폭주한다. 반대로 절댓값이 1보다 작은 값이 반복해 곱해지면 값이 기하급수적으로 작아져 0으로 수렴하 면서 소멸한다. 그렇다고 1이 반복해 곱해지면 값에 변화가 없는 무의미한 계산이 되며 -1이 반복해 곱해지면 부호만 왔다 갔다 하는 역시 의미를 찾기 어려운 계산이 된다. 값의 소멸 및 폭주 현상은 동일한 가중치 행렬이 반복 이용되는 순환 계층의 특성상 순전파 과 정과 역전파 과정 모두에서 일어날 가능성이 있다. 순전파 과정에서 소멸 혹은 폭주의 대상은 순환 벡터값들이며 역전파 과정에서 소멸 혹은 폭주의 대상은 순환 벡터의 손실 기울깃값들이 라는 점이 다를 뿐이다. 이러한 정보의 소멸 및 폭주 현상은 학습을 어렵게 만든다. 또한 순환 벡터에 형성된 정보가 먼 시간대로 전달되기 어렵게 만든다. 사람의 기억에 해당하는 요소가 순환 계층에서는 제대로 작동하기 어려운 것이다. 비선형 활성화 함수의 영향과 주위의 다른 계산 결과가 합쳐져 상쇄되는 덕분에 어느 정도 완 화되기도 하지만, 이러한 벡터값의 소멸 및 폭주 현상 자체는 단순한 순환 신경망에서는 언제 나 일어날 수밖에 없다. 순환 신경망에서 정보의 소멸 및 폭주 현상은 시계열 데이터의 길이가 길어질수록 곱셈 횟수가 증가하면서 더욱 심해진다. 게다가 이로 인한 결과가 파라미터에 반영 되어 다음 미니배치 처리에 영향을 미치게 되는 경우 학습이 진행됨에 따라 더욱 심각한 폭주 현상을 일으킬 가능성마저 생긴다. 많은 시계열 데이터에는 ‘기억’ 효과가 반영되어 있다. 하지만 정보의 소멸 및 폭주 현상은 기억
492 4부 순환 신경망(RNN)
에 의해 형성된 먼 시간대 사이의 패턴을 포착하기 어렵게 만들어 순환 계층의 학습에 커다란 장애가 된다. 이에 대한 대안으로 순환 신경망을 구성하는 기본 단위를 기존의 간단한 퍼셉트론에서 좀 더 복잡한 구조로 바꾸는 방법이 모색되었다. 새로운 구조에서는 정보의 소멸 및 폭주 현상을 막 으려면 같은 가중치 행렬 원소가 같은 대상에 반복적으로 곱해지지 않도록 해야 한다. LSTM은 이런 방법 가운데 가장 대표적인 방법이다. LSTM에서는 입출력 및 망각을 제어하는 게이트 장 치를 추가하여 일정한 값을 갖는 가중치 행렬 대신 그때그때 새로 계산되는 값들을 선형 연산 에 이용한다. 또한 LSTM에서는 시간대를 관통하며 전달되는 정보로 순환 벡터 외에 상태 벡터 를 새로 추가했다. LSTM은 이런 방법으로 순환 벡터와 그 기울기 정보의 소멸 및 폭주 현상을 방지했고, 그 결과 학습 품질을 크게 개선시켜 순환 신경망의 대표주자 자리를 차지했다.
11.2 LSTM의 구조와 동작 방식 LSTM은 단순 구조의 순환 신경망과 마찬가지로 한 시간대에서 인접한 다음 시간대로만 정보 를 전달하면서도 값의 폭주나 소멸 현상 없이 멀리 떨어진 시간대로도 정보 전달이 가능한 새 로운 순환 신경망 구성 단위다. 전형적인 LSTM은 다음과 같은 구조다. 그림 LSTM 셀의 기본 구조
ht Ct-1
X
Ct
+
X
σ ht-1
σ
tanh
tanh
σ
X
ht
Xt 출처 : en.wikipedia.org/wiki/Long_short-term_memory
11장 LSTM 순환 신경망 : 도시 소음 분류 신경망 493
그림 왼쪽에 나타난 ct-1, ht-1는 각각 이전 시간대에 만들어진 상태 정보 및 순환 벡터 정보다. 또한 그림 오른쪽에 나타난 ct, ht는 다음 시간대로 전달될 상태 정보 및 순환 벡터 정보다.
LSTM에서 순환 벡터 정보는 내부에서 처리하는 과정이 달라질 뿐 바깥에 대해서는 단순 순환 계층에서와 똑같은 역할을 한다. 출력으로 이용되는 동시에 입력과 합쳐져 다음 시간대에 제공 될 확장 입력의 일부로 이용된다.
LSTM에서 새로 등장한 상태 정보는 가까이 혹은 멀리 전달될 정보를 다음 시간대로 전달한 다. 상태 정보는 마치 생산 라인을 관통하며 흘러가는 컨베이어 벨트처럼 시간대 순으로 흘러 가며 ‘기억’에 해당하는 정보를 관련 시간대로 전달하는 역할을 한다. LSTM에서 상태 정보는 순환 벡터와 같은 크기를 갖는데 이렇게 해야 여러 가지 텐서 계산이 간단해지기 때문이다. 순환 벡터 ht-1는 해당 시간대에 대한 입력 벡터 xt와 나란히 합쳐져 확장 입력을 형성한 후 장 치 네 개에 공통 입력으로 이용된다. 그림에서 회색 상자로 표시된 이들 장치 네 개는 σ 문자로 표시된 게이트 3개와 tanh 함수로 표시된 입력 블록이다. 이들은 확장 입력이라는 같은 입력 을 이용하기는 하지만 각각 별도의 학습 가능한 가중치와 편향 파라미터를 갖는 퍼셉트론 형태 의 독립된 장치다. 독자적인 선형 연산과 활성화 함수 적용을 거쳐 순환 벡터와 같은 크기의 벡 터를 출력으로 내어놓는다. 그리고 이들 네 장치의 처리 결과를 이용해 LSTM 셀의 나머지 동 작이 이루어진다. 가장 왼쪽의 게이트는 망각 게이트forget gate다. 이 게이트에서 만든 벡터는 상태 정보 ct-1와 성 분별로 곱해진다. 그런데 LSTM에서 세 게이트는 소문자 시그마(σ) 문자에서 알 수 있듯 모두 시그모이드 함수를 활성화 함수로 이용한다. 따라서 출력이 0에서 1 사이이고 학습이 잘 수행 되면 0이나 1로 수렴하는 경향을 보인다. 0과 1 사이의 값을 상태 정보에 곱한다는 의미는 상 태 정봇값의 일부만 이용한다는 의미다. 또한 학습이 잘 진행되어 시그모이드 함숫값이 0이나
1로 수렴하면 어중간한 처리보다는 0을 곱해 완전히 잊어버리거나 1을 곱해 완전히 보존하는 양극단의 처리를 선호한다는 의미가 된다. 물론 이런 선호는 벡터 성분별로 따로 적용된다. 이 런 효과는 대체로 상황에 따라 불필요한 기억을 지우고 필요한 기억을 보존하면서도 전반적으 로는 기억이 차츰 희미해져가는 하는 인간의 뇌에 비유될 수 있다. 이런 효과 때문에 이 게이트 는 망각 게이트라는 이름을 얻게 되었다. 이런 망각 효과가 확장 입력에 대한 퍼셉트론 처리의 결과로 제어된다. 따라서 항상 일정한 방 식으로 일어나는 것이 아니라 시간대마다 잊어야 할 기억과 보존해야 할 기억이 무엇인지 상황
494 4부 순환 신경망(RNN)
CHAPTER
12
CNN과 RNN의 결합 : 장면 전환 판별 신경망
2장 CNN과 RNN의 결합 : 장면 전환 판별 신경망 527
동영상은 초당 30장 정도의 프레임 이미지로 구성되는 대표적인 시계열 데이터다. 따라서 효 과적으로 동영상을 처리하려면 이미지 데이터를 처리하는 합성곱 신경망과 시계열 데이터를 처리하는 순환 신경망의 기능을 결합시킬 필요가 있다. 이 장에서는 RnnLstmModel 클래스의 파생 클래스 RnnExtModel을 만들어 동영상의 장면 전 환을 검출하는 신경망 모델을 구성한다. RnnExtModel 클래스에는 seqwrap 계층이라는 새로 운 복합 계층을 추가하여 시계열 데이터에 대해서도 합성곱 계층과 같은 비순환 계층의 처리를 가능하게 할 것이다. 실습에 mpeg4 포맷 동영상을 사용한다. 이 책에서는 저작권 만료로 누구나 자유롭게 이용할 수 있는 1937년 발표된 영화 <스타탄생A Star is Born > 파일을 이용한다. 원본 파일 용량이 지나치 게 커서 깃허브에 올릴 수 없다. 작은 용량의 캐시 파일을 이용해서 실습을 할 수 있도록 예제 프로그램을 구성했다. 이 장에서 다루는 내용은 다음과 같다. ●●
동영상을 처리하는 합성곱 신경망과 순환 신경망의 결합 방법
●●
비순환 계층, 출력 계층 및 후처리 단계에서의 시계열 데이터 처리 방법
●●
동영상에서의 장면 전환 검출 문제
●●
장면 전환 판별 신경망 실험
12.1 비순환 계층에서의 시계열 데이터 처리 동영상은 이미지를 시간대별 데이터로 하는 시계열 데이터다. 따라서 신경망 모델에서 동영상 데이터를 처리할 때 미니배치 데이터는 다음 그림과 같은 5차원 데이터가 될 것이다. 합성곱 계층에서는 2차원 이미지 데이터에 채널 축과 미니배치 축이 추가되어 4차원 데이터를 다뤘다. 그런데 이제 여기에 시간 축, 즉 프레임 번호가 더해져 [미니배치, 시간, 이미지행, 이 미지열, 채널]의 5차원 데이터 형태가 된 것이다. 채널은 다음 그림에서 컬러 영상을 저장하기 위해 사용되는 RGB 정보를 의미한다.
528 4부 순환 신경망(RNN)
그림 동영상 미니배치 데이터
프레임번호
B R
G
미니배치 데이터
그런데 이런 5차원 형태의 데이터를 우리가 작성해놓은 합성곱 계층에 제공하면 오류가 발생 할 것이다. 운 좋게 실행 오류로 프로그램이 중단되지 않는다고 해도 올바른 처리 결과는 기대 할 수 없다. 위의 그림에는 나타나 있지 않지만 시계열 데이터에서 각 데이터의 첫 칸, 즉 [:, 0,
0, 0, 0] 번지의 데이터에는 이미지 픽셀값이 아닌 데이터 길이가 저장된다. 그리고 데이터의 [:, 0, 1:, :, :] 번지는 보통 0으로 채워지기는 하지만 이용되지 말아야 할 의미 없는 값이 들어 있게 된다. 이런 부분들을 픽셀 정보로 착각해서 처리하다 보면 실행 오류를 비롯한 여러 가지 잘못된 처리가 이뤄진다. 이처럼 시계열 데이터는 순환 계층의 처리에 알맞게 확장된 데이터 형식을 갖고 있기 때문에 순환 계층이 아닌 다른 계층을 처리할 때는 여러 문제가 발생한다. 그렇다고 이미 작성한 많은 계층의 코드를 일일이 고쳐 작성하기도 힘든 노릇이다. 이에 대한 간단한 해결책으로 시계열 포장 계층sequential wrapping layer이라는 복합 계층을 추가하는 방법을 이용해보자. 복합 계층은 내부에 서브 신경망을 가지면서 외부에 하나의 계층인 것처럼 인터페이스를 제공하는 계층을 말한다. 우리는 이미 9.3절 ‘인셉션 모델과 레스넷 모델을 구현 하는 데 필요한 확장들’에서 다섯 가지 복합 계층(parallel, serial, add, loop, custom)을 구 현한 바 있다. 새로 추가되는 seqwrap 계층은 외부의 인접 계층들에 대해 시계열 데이터를 입력으로 받아 시계열 데이터 형태의 출력을 생성하는 인터페이스를 제공한다. 하지만 내부적으로는 시계열 데이터를 취급하지 않는 비순환 계층들을 서브 신경망으로 가지면서 시계열 데이터의 포장을 풀어 데이터 내부의 각 시간대별 데이터를 대상으로 처리가 이루어지도록 한다. 이런 내부 처
12장 CNN과 RNN의 결합 : 장면 전환 판별 신경망 529
리를 마친 후 seqwrap 계층은 서브 신경망의 처리 결과를 한데 모아 다시 시계열 데이터 형태 로 정리하여 출력을 생성한다. 시계열 포장 계층은 일단 동영상 처리에 필요한 기능만 제공하도록 최대한 간단한 형태로 정의 될 것이다. 하지만 시계열 포장 계층의 아이디어는 다양한 데이터 형식에 대하여 융통성 있는 대처가 가능하도록 프로그램을 확장하는 데 유용하게 이용될 수 있다.
12.2 동영상 처리를 위한 합성곱 신경망과 순환 신경망의 결합 뒤에 소개될 실습 예제 가운데 다음과 같은 구성 정보를 갖는 신경망 모델이 있다. conf = [['seqwrap', ['conv',{'ksize':1, 'chn':4}], ['max',{'stride':2}], ['conv',{'ksize':1, 'chn':8}], ['max',{'stride':3}], ['conv',{'ksize':1, 'chn':16}], ['avg',{'stride':5}], ['full', {'width':12}]], ['lstm', {'recur_size':8}]]
다음 그림은 이 신경망 구성 정보에 명시된 계층들의 처리 과정과 각 계층의 입출력 데이터 형 태를 함께 표현한 것이다. 이 신경망 모델에 제공되는 최초 입력은 [10, 101, 90, 120, 3] 형 태로 가정한다. 이 형태에서 첫 번째 차원의 크기 10은 미니배치 크기를, 두 번째 차원의 크 기 101은 시계열 데이터의 최대 길이 100에 길이 정보의 크기 1을 더한 값을 나타낸다. 또한 세 번째와 네 번째 차원의 크기 90과 120은 동영상 프레임 이미지의 크기다. 영화 원본 해상 도 1,440×1,080 그대로 처리하려면 부담이 크다. 그래서 전처리 작업으로 가로와 세로 크기 모두 1/12로 줄였다. 이때 관련 모듈과의 호환성을 고려해 이미지의 행에 해당하는 90을 열에 해당하는 120보다 먼저 배치했다. 끝으로 마지막 축의 크기 3은 색상을 표현하는 데 사용되는
3가지 채널 정보를 의미한다.
530 4부 순환 신경망(RNN)
그림 동영상 처리를 위한 신경망 모델의 계층 구조와 데이터 형태의 흐름 입력
[10,101,90,120,3]
은닉 계층 비시계열 포장 계층
미니배치 변형
합성곱 계층
최대치 풀링 계층
[1000,90,120,3] 채널 수 4 [1000,90,120,4] [ 10] 보폭 2 [1000,45,60,4]
합성곱 계층
길이 정보
채널 수 8 [1000,45,60,8]
최대치 풀링 계층
보폭 3 [1000,15,20,8]
합성곱 계층
채널 수 16 [1000,15,20,16]
평균치 풀링 계층
보폭 5 [1000,3,4,16] → [1000,192]
완전 연결 계층
완전 연결 [1000,12]
미니배치 복원
[10,101,12]
lstm 계층 [10,101,8] 출력 계층
[1000,8]
완전 연결 계층
출력
[1000,1]
순환 벡터 크기 8
미니배치 변형 [10] 길이 정보 미니배치 복원
[10,101,1]
전체적인 신경망 구성을 살펴보면 비시계열 포장(seqwrap) 계층 하나와 lstm 계층 하나로 은 닉 계층이 구성되며 신경망 구성 정보에 나타나지 않은 출력 계층이 은닉 계층 뒤에 숨어있다. [10, 101, 90, 120, 3] 형태의 동영상 미니배치 데이터를 처리해야 하는 seqwrap 계층은 내 부에 7개의 계층으로 구성되는 서브 신경망을 갖는 복합 계층이다. 이 서브 신경망은 합성
12장 CNN과 RNN의 결합 : 장면 전환 판별 신경망 531
곱 계층, 풀링 계층, 완전 연결 계층 등 비순환 계층으로만 구성되어 있어서 seqwrap 계층이 전달받은 5차원 데이터를 처리할 수 없다. 이에 따라 seqwrap 계층은 이들 계층에 비시계열 데이터를 공급하기 위하여 미니배치 축과 시간대 축을 한데 묶어 서브 신경망을 위한 변형된 형태의 미니배치 데이터를 만든다. 이때 길이는 따로 보존하고, 배치 처리 대상에서는 배제한 다. 결국 seqwrap 계층은 [10, 101, 90, 120, 3] 형태의 원래 미니배치 데이터를 [1000, 90,
120, 3] 형태로 변형시켜 내부 신경망에 제공한다. 시계열 포장 계층의 서브 신경망에서는 합성곱 계층이 채널을 늘리고 풀링 계층이 해상도를 줄 이는 처리를 반복한다. 이런 처리를 세 차례 거듭하면서 [1000, 90, 120, 3] 형태의 데이터는 [1000, 3, 4, 16] 형태로 변형된다. 완전 연결 계층은 이 데이터를 [1000, 192] 형태의 입력으 로 재해석한 후 [1000, 12] 형태의 출력을 생성한다. 즉, 10개의 미니배치 데이터가 갖는 100 개씩의 시간대별 이미지 데이터에 대해 서브 신경망의 처리 과정을 일괄 적용하여 모두 1,000 개의 이미지가 갖는 12 항목의 정보 벡터를 일괄적으로 만들어낸다. 끝으로 시계열 포장 계층 seqwrap에서는 크기가 12인 벡터 1,000개를 원래대로 미니배치 데 이터 10개의 100 시간대에 대한 벡터로 재구성하고 여기에 따로 보존했던 시간대 길이 정보를 추가하여 [10, 101, 12] 형태의 결과를 만든다. 이렇게 포장을 복원하여 만들어진 시계열 데이 터 형식의 출력을 다음 계층에 넘기면서 seqwrap 계층의 처리가 종료된다. 한편, seqwrap 계층의 처리 결과를 넘겨받을 lstm 계층은 출력 형태가 시계열 데이터 형태로 지정되어 있다. 이에 따라 시간대별로 만들어지는 크기가 8인 순환 벡터들을 모아 시계열 데이 터 형태의 출력을 구성하게 되므로 [10, 101, 12] 형태의 계층 입력으로부터 [10, 101, 8] 형 태의 출력이 만들어진다. 즉, 시계열 데이터를 처리하는 lstm 계층의 출력 역시 시계열 데이터 형태가 된다. 신경망 구성정보 conf에는 나타나 있지 않지만 실제 신경망에는 lstm 계층 뒤에 출력 계층이 배치된다. 출력 계층은 완전 연결 계층이며 이진 판단 문제의 성격상 데이터당 크기 1의 출력 을 낸다. 하지만 이런 기존의 출력 계층 처리 방식에 시계열 데이터가 입력으로 주어지면 문제 가 발생한다. 이 문제의 내용과 처리 방안은 다음 절에서 살펴보겠지만 출력 계층은 [10, 101,
8] 형태의 입력으로부터 [10, 101, 1] 형태의 최종 결과를 만들어 후처리 단계로 넘긴다.
532 4부 순환 신경망(RNN)
Part
V
고급 응용 신경망 구조들
5부에서는 지금까지 다룬 신경망 구조들을 이용하여 구성되는 세 가지 고급 응용 구조들을 소개한다. 다루는 내용 ●
오토인코더와 필기체 문자 분류기
●
인코더-디코더와 이미지 캡션 발생기
●
적대적 생성 신경망과 이미지 생성기
12장 CNN과 RNN의 결합 : 장면 전환 판별 신경망 565
Part V
고급 응용 신경망 구조들
13장 오토인코더 : 엠니스트 이미지 재현 및 분류 신경망 14장 인코더-디코더 : 엠니스트 이미지 숫자 읽기 신경망 15장 생성적 적대 신경망 : 회화 및 숫자 이미지 생성 신경망
566 4부 고급 응용 신경망 구조들
CHAPTER
13
오토인코더 : 엠니스트 이미지 재현 및 분류 신경망
2장 오토인코더 : 엠니스트 이미지 재현 및 분류 신경망 567
오토인코더autoencoder는 입력을 재현하는 방식의 비지도학습unsupervised learning으로 레이블 없이도 데이터의 분포 특성을 스스로 파악하는 신경망을 말한다. 오토인코더는 인코더와 디코더의 두 부분으로 구성되며 잘 학습된 오토인코더의 인코더는 적은 양의 레이블링된 데이터만을 이용 하는 지도학습, 미리 정해진 카테고리 없이 데이터 내용만으로 유사한 데이터를 찾는 시맨틱 해싱 등 다양한 용도로 이용될 수 있다. 실습을 하기에 앞서 엠니스트 데이터셋을 내려받아두자. ●●
엠니스트 데이터셋 : yann.lecun.com/exdb/mnist/
이 장에서 다루는 내용은 다음과 같다. ●●
오토인코더의 구조와 원리
●●
오토 인코더의 활용 : 준지도학습, 잡음 제거, 시맨틱 검색
●●
지도학습 기능과 시맨틱 해싱 기능이 추가된 확장 오토인코더 모델
●●
필기체 숫자 이미지 분류를 위한 엠니스트 데이터셋
13.1 오토인코더의 구조 오토인코더는 아래 그림과 같이 구성되는 신경망을 말한다. 그림 오토인코더의 기본 구조
h 더 인코
디코 더
코드
x
r MSE
입력
출력 (입력재현)
그림에서 보듯 오토인코더는 인코더encoder와 디코더decoder의 두 부분으로 구성되며 디코더의 출 력은 인코더의 입력과 같은 형태를 갖도록 설계된다. 오토인코더는 입력과 최대한 비슷한 출력
568 5부 고급 응용 신경망 구조들
을 만들어내는 것을 학습 목적으로 삼는다. 출력은 입력과 동일한 형태를 가질 뿐만 아니라 내 용까지도 최대한 비슷하게 재현representation해야 한다. 따라서 오토인코더에 정답을 따로 제공할 필요가 없으며 입력 자체가 출력이 지향해야 할 정답이다. 그래서 오토인코더는 보통 입력과 출력 사이의 평균제곱오차를 손실 함수로 삼아 학습을 수행한다. 오토인코더에서 인코더는 입력을 처리하여 입력의 내부 중간 표현으로 만들어내며 이 중간 표 현을 코드code라고 한다. 반대로 디코더는 인코더가 생성한 코드를 처리하여 출력을 만든다. 사 실 입력과 비슷한 출력을 만들어내는 것만이 목적의 전부라면 입력을 출력으로 복사해버리면 그만이다. 하지만 오토인코더의 실제 목적은 입력을 코드로 변환해주는 인코더를 쓸모있는 모 습으로 학습시키는 것이다. 코드의 형태는 신경망 설계자가 마음대로 정할 수 있지만 입력에 비해 작은 크기로 정하는 것 이 보통이고 또한 이렇게 해야 오토인코더가 의미를 갖는다. 코드가 입력과 같거나 더 큰 크기 를 갖는 형태라면 간단히 모든 입력 성분을 코드에 복사해둔 후 다시 출력에 복사하는 방식으 로 쉽게 입력을 재현할 수 있기 때문이다. 하지만 코드 형태가 입력 형태보다 작은 크기라면 인 코더는 어떤 방식으로든 입력 정보를 압축해야 한다. 바로 이 압축 과정에서 입력 데이터들이 갖는 유용하고 의미 있는 패턴들을 코드로 포착하는 것이 굳이 오토인코더를 이용해 중간 표현 을 만들어가면서 학습시키는 이유다.
13.2 지도학습과 비지도학습 오토인코더는 최대한 입력과 비슷한 출력을 만들어내려는 과정에서 입력 데이터 사이에 숨어 있는 유용한 패턴을 찾아내기 바라는 구조다. 오토인코더의 이러한 기대는 낭송이나 암송을 통 해 문장의 이치를 스스로 터득하기 바라는 전통적 서당에서의 학습 방식과도 유사하다. 딥러닝을 비롯한 머신러닝 분야에서 학습은 크게 지도학습supervised learning과 비지도학습으로 나 뉜다. 사람에 빗대면 지도학습은 교사에게 배우는 학습 방식이고 비지도학습은 혼자서 독학하 는 방식이겠지만, 머신러닝의 경우 학습 데이터마다 부착된 레이블label, 즉 정답 정보가 교사 역할을 한다. 학습 과정에서 레이블 정보를 이용하면 지도학습이고 그렇지 않으면 비지도학습 이다.
13장 오토인코더 : 엠니스트 이미지 재현 및 분류 신경망 569
학습용 데이터를 모으는 일에는 많은 인력과 비용이 든다. 하지만 수집된 데이터에 일일이 정 답 정보를 붙이는 레이블링 작업에는 더 많은 인력과 비용이 든다. 게다가 같은 데이터라도 신 경망 용도가 달라지면 그에 따라 부착해야 할 레이블 내용이 달라지기 때문에 새로운 레이블링 작업이 필요하다. 따라서 지도학습은 매우 많은 비용이 필요한 학습 방식이다. 이 책을 비롯해 많은 딥러닝 관련 서적과 사이트에서 공개된 무료 데이터셋을 실험에 이용하는 것도 이 때문이다. 딥러닝 기법을 이용해 문제를 해결할 때 데이터 수집과 레이블링에 적지 않은 비용이 든다. 하지만 오토인코더를 이용한 학습은 레이블링 작업이 따로 필요 없는 비지도학습이다. 입력 자 체가 정답 정보, 즉 레이블 정보의 역할을 하기 때문이다. 따라서 오토인코더의 가장 큰 강점은 바로 데이터만 수집하면 레이블링 작업 없이 바로 학습이 가능하다는 점이다. 그런데 충분히 학습시켰다고 해도 오토인코더 자체는 별 쓸모가 없다. 단순 복사로 충분한데 입력과 비슷한 출력을 얻으려 굳이 오토인코더를 돌릴 필요는 없기 때문이다. 비지도학습이 값 싼 학습 방법이긴 하지만 비지도학습만으로는 유용한 어떤 결과도 얻을 수 없다. 하지만 잘 학습된 오토인코더에서 인코더를 분리하여 활용 방안을 찾으면 이야기가 달라진다. 인코더는 입력을 더 적은 용량의 내부 코드로 변환해주는데 이 내부 코드에는 입력의 여러 유 용한 패턴이 압축되어 표현되어 있을 가능성이 높기 때문이다. 오토인코더 구조 속에서 잘 학습된 인코더를 활용하는 가장 대표적인 방법은 약간의 레이블링 된 데이터를 이용해 지도학습을 수행하는 것이다. 인코더가 만들어내는 내부 코드 속에 정말 입력의 유용한 패턴들이 압축 표현되어 있다면 적은 양의 레이블링된 데이터만으로도 높은 품 질의 학습 결과를 얻을 수 있으리라 기대하는 것이다. 이처럼 오토인코더의 인코더는 지도학습 신경망의 하부 구조로 이용될 수 있다. 이때 오토인코 더 속에서 학습되어 얻어진 인코더의 파라미터 내용을 고정된 값으로 삼아 지도학습 신경망의 파라미터만 학습시킬 수도 있고, 가변적인 파라미터 초깃값으로 간주하여 지도학습 과정에서 추가로 변경되게 할 수도 있다. 사실 오토인코더 학습에는 적지 않은 계산 시간이 소요된다. 목표가 명확하고 그에 따른 정답 데이터가 레이블로 주어지는 상황이 아니기 때문에 오토인코더를 잘 학습시킨다는 것이 말처 럼 쉽지 않다. 따라서 긴 시간을 거쳐 학습된 오토인코더를 한 용도로만 이용한다는 것은 사실
570 5부 고급 응용 신경망 구조들
아까운 일이다. 비지도학습과 지도학습의 결합은 다양한 용도의 지도학습이 필요할 때 더욱 효과적이다. 인코 더를 하나만 학습시켜 여러 분야의 지도학습에 다용도로 이용할 수 있기 때문이다. 물론 인코 더는 입력의 다양한 패턴을 잘 포착하도록 충분한 양의 데이터로 긴 시간을 들여서라도 잘 학 습시켜 놓아야 할 것이다. 이런 인코더가 준비되면 각각의 분야에서는 적은 양의 레이블링된 데이터만 준비해 지도학습을 시키면서도 우수한 성능을 보일 수 있다. 이는 다양한 분야에서의 레이블 부담을 줄여주는 동시에 많은 계산을 수행해 긴 시간이 드는 비지도학습 과정을 한 번 만 수행한다는 점에서 이중의 비용 절감 효과를 가져온다.
13.3 잡음 제거용 오토인코더 기본 구조의 오토인코더나 약간의 변형이 추가된 오토인코더를 다양한 용도로 활용할 수 있다. 오토인코더 전체를 활용하는 응용 분야로 잡음 제거 문제를 알아보자. 잡음 제거용 오토인코더를 학습시키려면 아래 그림과 같이 오토인코더의 기본 구조를 약간 변 형시켜 입력과 인코더 사이에 잡음 주입기를 추가하면 된다. 그림 잡음 제거용 오토인코더 코드
h 인코더
변형된 입력
디코더
xt
r
잡음주입기
출력 (입력 재현)
SE
M 입력
x
13장 오토인코더 : 엠니스트 이미지 재현 및 분류 신경망 571
인코더에는 잡음 주입기를 거친 변형된 입력이 주어진다. 잡음 주입기는 8.7절 ‘정규화 기법 도 입을 위한 계층의 추가’에서 소개된 noise 계층을 사용하면 된다. 이때 주의할 점은 디코더 출 력에 대한 손실 함수는 인코더에 주어지는 변형된 입력이 아니라 잡음 주입 이전의 원본 입력 과 비교하여 계산되어야 한다는 점이다. 이렇게 학습시켜야만 인코더와 디코더를 포함한 오토 인코더 부분이 변형된 입력에서 잡음을 제거해 원본 데이터로 회복시키는 기능을 갖게 된다. 잡음 제거용 오토인코더를 이용할 때 학습 시점이나 평가 시점에는 잡음 주입기를 가동하지만 개발된 신경망이 실제 용도에 사용되는 정규화 시점부터는 잡음 주입기의 동작을 중지시켜야 한다. 잡음 제거용 오토인코더의 사용 목적 자체가 실세계에서 접하게 되는 잡음으로 오염된 데이터로부터 학습 원본에 해당하는 깨끗한 데이터를 구해내는 것이기 때문이다.
13.4 유사 이진 코드 생성과 시맨틱 해싱 오토인코더가 활용될 수 있을 것으로 기대되는 또 다른 응용 분야는 시맨틱 해싱을 이용한 정 보 검색 분야다. 시맨틱 해싱이란 검색 대상 콘텐츠를 적당한 수의 비트 정보로 표현된 이진 벡 터 공간에 대응시켜 쉽고 빠르게 정보 검색을 하는 방법이다. 시맨틱 해싱의 원리를 간단히 그 림으로 표현해보면 다음과 같다. 그림 시맨틱 해싱의 원리 초식동물(xx0) 무척추동물(0xx) 척추동물(1xx)
육상동물(x1x)
해상동물(x0x)
572 5부 고급 응용 신경망 구조들
육식동물(xx1)
CHAPTER
14
인코더-디코더 : 엠니스트 이미지 숫자 읽기 신경망
2장 인코더-디코더 : 엠니스트 이미지 숫자 읽기 신경망 607
인코더-디코더encoder-decoder는 인코더와 디코더의 두 부분이 직렬 연결된 신경망 구조다. 인코 더는 입력 데이터를 분석하여 그 내용을 콘텍스트 벡터 형태로 추출하는 것이 목표다. 반면 디 코더는 콘텍스트 벡터로부터 원하는 형태의 출력을 생성하는 것이 목표다. 인코더-디코더는 자연어 처리에 특히 유용한 구조로 기대를 모으고 있다. 이 장에서 다루는 내용은 다음과 같다. ●●
인코더-디코더의 기본 구조
●●
인코더-디코더와 언어 처리
●●
필기체 숫자 이미지를 영어와 한글로 읽기
●●
인코더-디코더의 분리 학습 문제
●●
인코더-디코더 모델 클래스의 구현과 숫자 이미지 읽기 신경망 구현
14.1 인코더-디코더의 구조 인코더-디코더의 기본 구조는 다음과 같다. 그림 인코더-디코더의 기본 구조
x 입력
인코더
h 콘텍스트 벡터
디코더
y 출력
그림만 보면 오토인코더와 비슷해 보이지만 인코더-디코더는 오토인코더와는 전혀 다른 방식 으로 동작한다. 오토인코더는 13.1절 ‘오토인코더의 구조’에서 살펴본 것처럼 입력 재현을 학 습 목표로 삼기 때문에 정답 정보가 따로 필요 없는 비지도학습 방식 신경망이다. 반면 인코 더-디코더는 입력 형태와 무관한 형태로 출력을 생성하고, 이 출력을 따로 준비된 정답 정보와 비교하며 학습시키는 전형적인 지도학습 방식의 신경망이다. 인코더-디코더의 입출력으로 어떤 형태든 이용할 수 있지만 이미지 데이터나 시계열 데이터 같은 크고 복잡한 구조가 주로 이용된다. 이에 비해 콘텍스트 벡터는 보통 입출력에 비해 작고 간단한 형태로 설계된다. 인코더와 디코더 사이에 간단한 콘텍스트 벡터를 두는 이유는 첫째로
608 5부 고급 응용 신경망 구조들
정보의 압축 효과를 기대하기 때문이며, 둘째로 입력과 전혀 다른 형태의 출력을 쉽게 만들 수 있기 때문이다. 예를 들어 이미지를 보고 그 내용을 설명하는 캡션 문구를 만들거나, 문장을 다 른 언어로 번역하는 기능은 인코더-디코더 구조가 아니고서는 처리해내기가 어렵다. 입력과 출력이 모두 시계열 데이터 형태인 경우에 입출력 사이의 시간대가 일대일 대응 관계 혹은 이에 가까운 관계가 성립할 수도 있지만 그렇지 못한 경우도 많다. 예를 들어 12장 ‘합성곱 신경망과 순환 신경망의 결합’에서 살펴본 비디오에서 장면 전환 여부 를 검출하는 신경망은 입력 시계열 데이터를 구성하는 각 이미지 프레임에 대해 장면 전환 여 부를 나타내는 출력 시계열 데이터를 생성한다. 이 경우는 입출력 시계열 데이터의 시간대 사 이에 정확한 일대일 대응 관계가 있으므로 굳이 인코더-디코더 구조를 이용하지 않아도 순환 계층으로 간단하게 문제를 풀 수 있다. 장면 전환 프레임만 선별하여 압축된 출력 시계열 데이터를 구성하고 싶은 경우에는 입출력 시 계열 데이터 시간대 사이에 정확한 일대일 대응 관계가 성립하지는 않는다. 하지만 여전히 매 우 긴밀한 관계가 있다. 출력 시계열 데이터에 데이터 없음을 나타내는 값을 두어 장면 전환 프 레임 외에는 이 값을 출력하도록 신경망을 학습시킨 후 활용 과정에서 이들 값을 걸러내도록 하면 쉽게 문제 해결이 가능하기 때문에 여전히 인코더-디코더 구조를 이용할 필요가 없다. 하지만 주가 변동 상황을 담은 시계열 데이터를 분석해 시장 상황을 요약해 안내해주는 글을 생 성하거나, 한국어 문장을 영어로 번역할 때는 입출력 시계열 데이터가 갖는 형태나 의미가 너무 달라 순환 계층을 이용한 직접적인 처리가 곤란하다. 이런 경우에 인코더-디코더 구조가 이용 된다. 인코더는 입력 시계열 데이터를 분석해 그 속에 담긴 핵심 정보를 콘텍스트 벡터에 요약 해내며 디코더는 콘텍스트 벡터에 담긴 핵심 정보를 토대로 유용한 형태의 출력을 생성한다.
14.2 인코더-디코더와 언어 처리 인코더-디코더는 언어 처리, 특히 입력을 묘사하는 자연어를 출력으로 생성하는 경우에 매우 유용하다. 번역을 예로 들어보자. ‘Good morning’을 ‘안녕하세요’로 번역하거나 ‘I am studying deep
learning’을 ‘나는 딥러닝을 공부하고 있어’로 번역할 때 출력 문장은 길이나 순서가 입력 문장
14장 인코더-디코더 : 엠니스트 이미지 숫자 읽기 신경망 609
과 달라진다. 각 입력 시간대에 나타나는 알파벳 혹은 단어에 대해 일대일 대응 혹은 그에 준하 는 관계를 이용해 출력을 생성하면 번역이 거의 불가능하다. 사람도 문장 혹은 문단 정도는 읽고 내용을 충분히 파악한 후에야 번역을 진행한다. 그때 이 사 람의 머릿속에 정리된 문장 혹은 문단 내용이 바로 인코더-디코더의 콘텍스트 벡터에 해당한 다. 이 내용은 보통 시계열 데이터가 아니다. 이를테면 ‘Good morning’에서는 ‘인삿말’이라는 정보만 포착하는 반면 ‘I am studying deep learning’에서는 주어와 술어, 목적어 성분이 모 두 포착되고 여기에 ‘현재진행형’이라는 정보까지 머릿속에 얻어낸다면 충분할 것이다. 이런 정 보를 챙긴 번역자는 자신의 한국어 구사 능력을 이용하여 번역문을 만들어 낼 것이며, 이 번역 문의 길이와 어순은 입력 문장의 길이와 어순과 얼마든지 달라질 수 있다. 이때 번역자의 머릿 속에 떠오르는 여러 개념은 인코더-디코더에서는 콘텍스트 벡터의 내용으로 포착되어야 할 내 용들이다. 이런 이유로 자연어 처리는 인코더-디코더의 가장 중요한 응용 분야가 되고 있다.
14.3 필기체 숫자 이미지를 영어로 읽기 인코더-디코더의 응용 분야로 번역기가 가장 먼저 떠오르지만 지나치게 방대한 데이터와 복잡 한 코딩이 필요하다. 따라서 이 책에서는 엠니스트 데이터셋을 이용해 자연어 캡션을 생성하는 두 가지 신경망 예제를 작성해보기로 하자. 첫 번째 예제 신경망은 다음과 같이 동작할 것이다. 그림 숫자 이미지 영어로 읽기 신경망의 동작 인코더
입력
디코더 ?
four
?
zero
?
five
콘텍스트 벡터
610 5부 고급 응용 신경망 구조들
출력
이 신경망은 필기체 숫자 이미지를 입력으로 하며 해당 숫자값을 영어 수사로 출력한다. 28×
28 숫자 이미지가 입력으로 주어지면 ‘zero’부터 ‘nine’까지의 영어 단어로 답하는 것이다. 이 신경망의 출력은 다양한 길이를 갖는다. 열 가지 출력 가운데 ‘one’, ‘two’, ‘six’는 길이가 3 이며 ‘zero’, ‘four’, ‘five’, ‘nine’은 4, ‘three’, ‘seven’, ‘eight’은 길이가 5다. 이처럼 길이가 다른 여러 가지 출력을 생성하는 가장 간단한 방법은 최대 길이를 정해놓고 그 만큼의 출력을 생성하되 유효한 입력 뒤의 내용을 종료 표시로 채우는 것이다. 예를 들어 위 의 문제에서 시간대 최대 길이는 6이 적당하며 종료 표시를 ‘#’으로 나타낸다고 할 때 1은 ‘one###’, 4는 ‘four##’, 7은 ‘seven#’으로 나타내면 된다. 시계열 입력의 경우에 앞에 길이를 표현해 나타냈는데, 이와 달리 시계열 출력에는 이처럼 길이를 최대 길이로 통일하고 종료 표 시를 이용해 내용 속에 실제 길이를 나타내는 방법이 더 널리 쓰인다. 신경망에서는 이런 방식 의 출력 처리가 더 간단하기 때문이다. 따라서 이 문제를 풀려면, 시간대마다 26가지 영어 알파벳과 종료 표시 가운데 하나를 선택하 는 형태로 시간대 길이가 6인 출력을 내도록 신경망을 구성하면 된다. 인코더-디코더 구조에서 인코더 부분은 28 × 28 형태의 숫자 이미지로부터 콘텍스트 벡터를 만들어야 한다. 이 작업에는 다층 퍼셉트론이나 합성곱 신경망 등이 적당할 것이다. 입력이 시 계열 데이터가 아니므로 순환 신경망을 이용할 필요는 없다. 제대로 학습되면 콘텍스트 벡터에 는 입력 이미지가 ‘0’~’9’ 중 어느 것에 속하는지가 표현될 것이다. 하지만 콘텍스트 벡터의 표 현 방식에는 어떤 제약도 없고 예측할 수도 없으며 확인하기도 어렵다. 콘텍스트 벡터에 필요한 내용이 포착되면 일련의 알파벳을 생성하는 순환 신경망 형태로 구성 된 디코더가 이 내용을 영어 단어로 변환하여 출력할 수 있다. 이때 디코더가 이용하는 순환 계 층은 비시계열 데이터 형태의 콘텍스트 벡터를 입력으로 삼아 시계열 데이터 형태의 출력을 생 성하게 된다.
14.4 필기체 숫자 이미지열을 한글로 읽기 난도를 좀 더 높인 인코더-디코더의 활용 예제로 엠니스트 데이터셋 숫자 이미지 네 장으로 구 성된 시계열 입력 데이터 내용을 한글로 읽어내는 신경망을 작성해보기로 하자.
14장 인코더-디코더 : 엠니스트 이미지 숫자 읽기 신경망 611
예제 신경망은 다음과 같이 동작한다. 그림 숫자 이미지열 한글로 읽기 신경망의 동작 인코더
입력
디코더
?
삼십오
?
구백삼십육
?
철천오백이십
콘텍스트 벡터
출력
이 신경망은 연속으로 주어지는 네 장의 필기체 숫자 이미지들을 위의 그림처럼 한글 수사로 읽어주는 신경망이다. 이런 정답 문자열을 만드는 규칙은 다음과 같다. ●●
네 자리 숫자는 천의 자리, 세 자리 숫자는 백의 자리, 두 자리 숫자는 십의 자리부터 일의 자리까지 순서대로 읽는다.
●●
일의 자리를 제외한 앞의 자리는 예를 들어 3275의 경우 ‘삼천’, ‘이백’, ‘칠십’처럼 해당 자리 숫자와 자릿값을 조립해 읽는다.
●●
일의 자리는 ‘오’처럼 자릿값 없이 숫자만 읽는다.
●●
1111처럼 자리의 숫자가 1일 때는 ‘천’, ‘백’, ‘십’, ‘일’처럼 그냥 자릿값으로만 읽는다.
●●
해당 자리 숫자가 0이면 그 부분에 대해서는 출력을 생략하지만 예외적으로 전체가 0인 경우에만 전체를 ‘영’ 이라고 읽는다.
이런 규칙에 따르면 출력은 네 자리 숫자의 경우 종료 표시를 포함해 가장 긴 경우 ‘삼천이백칠 십오#’처럼 여덟 글자가 되며 가장 짧은 경우 ‘영#’, ‘일#’, ‘이#’처럼 두 글자가 된다. 또한 이 문 제에 사용할 문자 종류는 {#, 영, 일, 이 , 삼, 사, 오, 육, 칠, 팔, 구, 십, 백, 천}으로 충분하다. 시간대 최대길이는 8로 하면 모든 경우에 종료 표시까지 나타낼 수 있다. 예를 들어 3275 숫자 이미지열로부터는 ‘삼천이백칠십오#’이, 0000의 숫자 이미지열로부터는 ‘영#######’이 출력으 로 얻어져야 한다.
612 5부 고급 응용 신경망 구조들
CHAPTER
15
생성적 적대 신경망 : 회화 및 숫자 이미지 생성 신경망
14장 생성적 적대 신경망 : 회화 및 숫자 이미지 생성 신경망 649
적대적 생성기라고도 하는 생성적 적대 신경망GAN, generative adversarial networks은 생성기generator와 판 별기discriminator라는 두 신경망을 경쟁적으로 학습시켜 성능을 개선시키는 신경망 모델이다. 판 별기는 데이터셋으로부터 주어지는 원본 데이터와 생성기가 만들어내는 위조 데이터를 분간하 는 역할을 한다. 또한 생성기는 판별기가 원본 데이터로 착각하도록 만드는 정교한 위조 데이터 를 만들어내는 역할을 한다. 적대적 역할을 하는 두 구성 요소 때문에 생성적 적대 신경망이라 고 부른다. 생성적 적대 신경망 속에서 학습된 생성기는 데이터셋으로부터 주어지는 입력을 이 용하지 않고 새로운 데이터를 만들 수 있게 된다는 점에서 많은 주목을 받고 있다. 이 장에서 다루는 내용은 다음과 같다. ●●
생성적 적대 신경망의 기본 구조
●●
생성적 적대 신경망을 이용한 새로운 데이터의 생성
●●
생성적 적대 신경망의 순전파와 역전파 처리 방법
●●
생성적 적대 신경망 모델 클래스와 데이터셋의 구현 및 실행
15.1 생성적 적대 신경망의 구조 생성적 적대 신경망은 생성기와 판별기라는 서로 다른 두 신경망으로 구성된다. 생성기는 학습 데이터를 전혀 직접 살펴보지 못하는 상태에서 무작위로 주어지는 씨앗값과 파 라미터만을 이용하여 위조 데이터로 이용할 출력을 만들어낸다. 판별기는 주어진 데이터가 원 본 데이터인지 생성기가 만들어낸 위조 데이터인지를 가려낸다. 처음에 생성기는 원본 데이터와 무관한 출력들을 아무렇게나 만든다. 판별기 역시 원본 데이터 와 위조 데이터를 제대로 구별하지 못한다. 하지만 원본 데이터 여부를 가려내는 이진 판단 형 태의 문제를 풀어가는 학습 과정에서 판별기는 점차 둘을 구별하는 능력을 갖추게 된다. 구별 을 가능하게 하는 원본 이미지의 특성 또한 자신의 신경망 파라미터에 축적한다. 한편 생성기는 원본 이미지에 대한 직접적인 접근이 전혀 없는 상태에서 단지 판별기를 속이는 데 성공했는지 여부를 가려내는 이진 판단 문제에 대한 학습만을 수행한다. 이 과정에서 생성 기는 어떻게 하면 판별기를 속일 수 있는지 파악해 가면서 판별기가 갖고 있는 원본의 특성 정 보를 간접적으로 획득하게 된다.
650 5부 고급 응용 신경망 구조들
지속적인 학습을 거쳐 판별기는 점차 원본 데이터와 위조 데이터의 깊숙한 차이를 파악해 속지 않으려 애쓰고 생성기는 더 정교하게 위조해 판별기를 속이려고 애쓴다. 이 과정에서 생성기는 판별기를 통해 간접적이고 불완전한 방법으로나마 데이터 특성을 터득하게 된다. 생성기와 판 별기 품질이 이와 같은 적대적 경쟁 속에서 동반해 상승한다.
15.2 생성적 적대 신경망과 데이터 생성 생성적 적대 신경망의 생성기는 그동안 딥러닝 분야의 난제였던 데이터 생성 문제를 해결할 신 경망 구조로 주목받고 있다. 이제까지 살펴본 모든 신경망은 주로 데이터 분석을 위한 구조였다. 입력 데이터가 주어졌을 때 이를 분석하여 회귀 분석이나 이진 판단, 선택 분류에 해당하는 출력을 내는 방식으로 동작 했다. 생성적 적대 신경망에서도 판별기 부분은 여전히 데이터 분석 장치다. 생성적 적대 신경망의 등장 이전에 데이터 생성 목적으로 연구된 구조로는 오토인코더의 디코 더 정도가 있었다. 오토인코더 자체는 정답 데이터 없이 비지도학습을 수행한다는 점이 좀 특 별하기는 하지만 입력 데이터를 재현할 뿐이며 새로운 데이터를 생성하는 것은 아니다. 하지만 인코더가 생성하던 코드 벡터를 난수 함수가 발생시킨 값으로 대체해 디코더에 준다면 입력 없 는 데이터를 생성할 수 있다. 그러나 생성된 데이터의 품질을 끌어올리기가 생각보다 쉽지 않 아서 생성적 적대 신경망만큼 큰 관심을 모으고 있지는 못하다. 입력 데이터 없이 새로운 데이터를 생성한다고 하지만 그렇다고 정말 아무렇게나 만들면 아무 런 쓸모도 없을 것이다. 최소한 배우고 흉내 낼 학습 데이터는 필요하다. 생성적 적대 신경망은 판별기를 매개 삼아 생성기가 학습 데이터의 특성을 간접적으로 배우고 흉내 내게 하며 학습이 끝난 후에 생성기는 학습 데이터와 비슷한 데이터를 새로 만들게 된다. 그렇다고 생성기가 아무 입력 없이 동작할 수는 없다. 생성기를 구성하는 신경망 계층들은 어쨌 거나 입력을 받아 처리하고 그 결과를 출력으로 내보내는 장치들이기 때문이다. 또한 생성기가 매번 같은 내용의 데이터만 반복 생산해서는 안 된다. 일단 신경망 파라미터 내용이 학습을 거 쳐 고정되면 출력에 변화를 줄 가변 요소는 입력뿐이다. 이에 따라 생성기에는 난수 함수를 사 용해 생성된 적당한 크기의 씨앗값이 입력으로 제공된다. 이 씨앗값은 학습 시에도 주어지고 학
15장 생성적 적대 신경망 : 회화 및 숫자 이미지 생성 신경망 651
습이 끝난 후에도 주어지지만 학습 데이터와는 전혀 관계가 없다. 생성적 적대 신경망의 구조상 입력 데이터와 생성기의 동작 사이에는 어떤 직접적 관련성도 원천 봉쇄되어 있기 때문이다. 학습된 생성기는 난수 함수가 제공하는 씨앗값을 입력 삼아 다양한 데이터를 출력으로 생성하 며, 생성된 데이터들은 학습에 사용된 원본 데이터와 유사한 내용을 갖는다. 그렇다고 해서 생 성기가 원본 데이터의 분포 특성을 완벽하게 파악해서 데이터를 생성하는 것은 아니다. 학습 수준에 따라 매우 조잡한 수준으로 흉내 낼 가능성도 크다. 하지만 충분한 데이터를 이용한 많 은 학습을 거쳐 판별기가 사람 수준 이상으로 원본 데이터와 위조 데이터를 감별해내고 생성기 또한 사람이 알아채지 못할 만큼 원본에 가까운 위조 데이터를 만들어내게 하는 많은 연구가 진행되고 있다.
15.3 생성적 적대 신경망의 순전파와 역전파 처리 생성적 적대 신경망의 학습은 일반적으로 판별기와 생성기를 번갈아서 미니배치 크기 단위로 학습시킨다. 각각의 학습 과정에서는 해당 요소에 대한 학습, 즉 역전파를 통한 파라미터 수정 이 이루어지지만 그렇다고 다른 요소를 이용하지 않는 것은 아니다. 판별기는 생성기에 속지 않아야 하고 생성기는 판별기를 속여야 하므로 어느 쪽을 학습시키든 간에 생성기의 출력을 판 별기의 입력으로 이용할 수밖에 없다. 하지만 누구를 학습시키는가에 따라 구체적인 이용 방법 은 정반대의 모습을 띠게 된다. 판별기의 학습은 다음 그림과 같은 순서로 진행된다.
652 5부 고급 응용 신경망 구조들
그림 판별기 학습 과정 데이터셋
생성기
위조 데이터
원본 데이터
(0,0,0,…) (1,1,1,…) 확장 데이터
판별기
학습
로짓값 벡터 정답 벡터
로짓값 벡터 손실 기울기
이진 판단 후처리
처리 과정을 살펴보자. ➊ 학습에 사용할 미니배치 원본 데이터를 데이터셋에서 가져온다. ➋ 생성기의 순전파 과정을 실행시켜 원본 데이터와 같은 수의 위조 데이터를 생성한다. ➌ 원 본 데이터와 위조 데이터를 함께 묶어 확장된 미니배치 데이터로서 판별기에 주고, 순전파 과 정을 실행시켜 각 데이터가 원본일 가능성을 로짓값 벡터로 얻어낸다. ➍ 원본 데이터에는 1, 위조 데이터에는 0을 레이블 정보로 지정하여 정답 벡터를 구성한다. ➎ 로짓값 벡터와 정답 벡터 사이의 시그모이드 교차 엔트로피를 손실 함수로 구하고 로짓값 벡터 성분들에 대한 손실 기울기를 구한다. ➏ 얻어진 손실 기울기를 이용하여 판별기의 역전파 과정을 수행해 파라미터 를 학습시킨다. 판별기 학습 과정에서는 생성기 학습이 불필요하므로 여기에서 처리를 끝낸다. 생성기의 학습은 아래 그림과 같은 순서로 진행된다.
15장 생성적 적대 신경망 : 회화 및 숫자 이미지 생성 신경망 653
그림 생성기 학습 과정 학습
생성기
위조 데이터
(1,1,1,…)
생성기 출력 손실 기울기 로짓값 벡터 손실 기울기
판별기 비학습 역전파 처리 로짓값 벡터 정답 벡터
이진 판단 후처리
➊ 생성기의 순전파 과정을 실행시켜 판별기 학습에 사용된 미니배치 크기만큼의 위조 데이터 를 생성한다. ➋ 위조 데이터 묶음을 판별기에 주고 순전파 과정을 실행시켜 각 데이터가 원본 일 가능성을 로짓값 벡터로 얻어낸다. ➌ 생성된 모든 위조 데이터에 레이블 정보를 1로 지정 해 정답 벡터를 구성한다. 생성기의 목표는 판별기를 속여 원본으로 인정받는 것이므로 레이블 링 정봇값이 판별기 학습 때와 반대다. ➍ 로짓값 벡터와 정답 벡터 사이의 시그모이드 교차 엔 트로피를 손실 함수로 구하고 로짓값 벡터 성분들에 대한 손실 기울기를 구한다. ➎ 얻어진 손 실 기울기를 이용하여 판별기의 역전파 과정을 수행한다. 단, 이 과정에서 실제로 파라미터값 을 수정하는 학습이 이루어져서는 안 된다. 이 과정의 목적은 로짓값 벡터의 손실 기울기로부 터 위조 데이터, 즉 생성기 출력에 대한 손실 기울기를 얻는 것뿐이기 때문이다. ➏ 생성기 출 력에 대한 손실 기울기를 이용하여 생성기의 역전파 과정을 수행해 파라미터를 학습시킨다.
15.4 구현하기 : 생성적 적대 신경망 모델 클래스 판별기와 생성기를 경쟁적으로 학습시키는 생성적 적대 신경망 모델 클래스를 만들어보자. 구현 순서는 다음과 같다.
654 5부 고급 응용 신경망 구조들
믿고 보는 한빛미디어 인공지능 서적 거부할 수 없는 공전의 히트작
인공 신경망 원리와 응용을 파이썬 날코딩으로 깊이 이해하기
박살내야 게 하 벽 완 를 원리 내 것이 된다!
이 책은 딥러닝 알고리즘의 원리를 깊숙이 이해하고 이를 파이썬 코딩만으로 구현하는 데 주안점을 둔다. 이를 위해 가 장 간단한 신경망 구조부터 복잡한 응용 구조까지 다양한 딥러닝 신경망 예제의 실제 구현 과정을 소개한다. 그 과정에 서 독자는 딥러닝 알고리즘을 텐서플로 같은 프레임워크 없이도 개발하는 능력을 갖추게 된다. 딥러닝 알고리즘을 깊 이 이해하면 역설적으로 프레임워크를 이용할 때의 장단점을 더 확실히 알 수 있다. 나아가 자신만의 새로운 딥러닝 신
파이썬 날코딩으로 알고 짜는 딥러닝
경망을 개발하는 밑거름이 될 것이다.
3분 딥러닝 시리즈
이 책에서 파이썬 날코딩으로 구현하는 신경망
1. 단층 퍼셉트론(SLP)
5. 오토인코더
2. 다층 퍼셉트론(MLP)
6. 인코더-디코더
3. 합성곱 신경망(CNN)
7. 생성적 적대 신경망(GAN)
4. 순환 신경망(RNN)
지음 윤덕호
추천사 초보자를 위한 입문서
최근 심층학습(딥러닝) 기반의 기계학습 기술이 몇 가
수십 년간 개발된 기술들을 무용지물로 만드는 딥러닝
지 난제를 극복하면서 자동 번역, 음성 인식, 이미지 분
시대에도 변치 않는 사실이 있습니다. 바로 기초가 튼
류 등 다양한 인공지능 분야에 성공적으로 적용되어 획
튼해야 제대로 된 변화를 만들 수 있다는 것입니다. 딥
기적인 상용화를 이끌고 있습니다. 그런데 그 기술을 더
러닝 관련 책이 쏟아지고 있으나 깊이 있는 이해로 이
쉽게, 더 널리 활용하는 데 도움이 될 국내 책자는 전무
끄는 책을 찾기 어렵습니다. 이에 천재 전산학자로 소
해서 매우 아쉬웠습니다. 이 책은 이러한 측면에서 국내
문난 저자는 역시 기대를 저버리지 않고 딥러닝의 세
최초의 기초 이론 및 알고리즘 소개, 그리고 손쉬운 활
부 주제를 확실하게 소화시키는 비책을 내놓았습니다.
용을 위한 예제 기반 소프트웨어 해설서로 손색이 없습
_ 김형순 교수(부산대 전자공학과)
니다. 깊은 이론적 배경지식 없이도 쉽고 빠르게 인공지 윤덕호 지음
능 기술을 활용할 수 있는 도구로 적극 추천합니다. _ 김회린 교수(KAIST 전기및전자공학부)
프레임워크 없이 단층 퍼셉트론에서 GAN까지
관련 도서 인공지능 / 파이썬
밑바닥부터 시작하는 딥러닝 2
처음 배우는 딥러닝 수학
김기현의 자연어 처리 딥러닝 캠프 (파이토치 편)
정가 45,000원
‘코난아카데미’ 딥러닝 교재
지은이 윤덕호 dhyoon1225@gmail.com 서울대학교 컴퓨터공학과에서 공부하고 우리나라에 첫 번째 인공지능 바람이 휩쓸 무렵 석박사 과정을 거치면서 자연어 처리 분야를 연구했다. 10여 년간 한남대학교 정보통신공학 과 교수로 학생들을 가르쳤으며 2000년부터 지금까지 (주) 코난테크놀로지에 임원으로 재직하면서 각종 소프트웨어 개 발에 빠져 살았다. 현재 사내 교육 프로그램인 코난아카데미 를 운영하고 있다. 또한 인공지능 혁신성장동력 프로젝트 ‘비 디오 튜링 테스트(VTT) 연구 사업’의 제3세부 과제 책임자로 서 각종 딥러닝 연구에 이용될 학습용 멀티모달 메타데이터 를 구축하고 메타데이터의 초벌 자동 생성 딥러닝 기법을 연 구하고 있다. 그 외에 인문학과 축구, 커뮤니티 댄스 등으로 심신을 단련한 다. 가끔 배우로 변신하여 연극 무대에 오르기도 한다.