페이지

2022년 7월 23일 토요일

3.2 케라스 소개

 이 책에서는 코드 예제를 위해 케라스(https://keras.io)를 사용합니다. 케라스틑 거의 모든 종류의 딥러닝 모델을 간편하게 만들고 훈련시킬 수 있는 파이썬을 위한 딥러닝 프레임워크입니다. 첨음에 케라스는 신속하게 실험을 해야 하는 연구자들을 위해 개발되었습니다.

케라스의 특징은 다음과 같습니다.

1) 동일한 코드로 CPU와 GPU에서 실행할 수 있습니다.

2) 사용하기 쉬운 API를 가지고 있어 딥러닝 모델의 프로토타입을 빠르게 만들 수 있습니다.

3) (컴퓨터 비전을 위한)합성곱 신경망, (시퀀스 처리를 위한)순환 신경망을 지원하며 이 둘을 자유롭게 조합하여 사용할 수 있습니다.

4) 다중 입력이나 다중 출력 모델, 층의 공유, 모델 공유 등 어떤 네트워크 구조도 만들 수 있습니다. 이 말은 적대적 생성 신경망(Generative Adversrial Network, GAN)부터 뉴럴 튜링 머신(Neural Turing Machine)까지 케라스는 기본적으로 어떤 딥러닝 모델에도 적합하다는 뜻입니다.


케라스는 MIT라이선스를 따르므로 상업적인 프로젝트에도 자유롭게 사용할 수 있습니다(2018년 중반 현재) 파이썬 2.7에서 3.6까지의 어떤 버전과도 호환됩니다.

학술적인 연구원이나 스타트업과 대기업의 기술자에서 대학원생과 아마추어 연구자까지 20만명의 사람들이 케라스를 사용합니다. 구글, 넷플릭스(Netfilx),우버(Uber), 썬(CERN), 엘프(Yelp), 스퀘어(Square)그리고 다양한 분야의 스타트업 수백 개가 케라스를 사용합니다. 머신 러닝 경연 웹사이트인 캐글(Kaggle)에서도 케라스의 인기가 높습니다. 최근에 거의 모든 딥러닝 경연 대회의 우승자들이 케라스 모델을 사용하고 있습니다.


3.1.3 손실 함수와 옵티마이저: 학습 과정을 조절하는 열쇠

 네트워크 구조를 정의하고 나면 두 가지를 더 선택해야 합니다.

1) 손실 함수(loss function)(목적 함수(objective function)): 훈련하는 동안 최소화될 값입니다. 주어진 문제에 대한 성공 지표가 됩니다.

2) 옵티마이저(optimizer):손실 함수를 기반으로 네트워크가 어떻게 업데이트될지 결정합니다.

특정 종류의 확률적 경사 하강법(SGD)을 구현합니다.


여러 개의 출력을 내는 신경망은 여러 개의 손실 함수를 가질 수 있습니다(출력당 하나씩). 하지만 경사 하강법 과정은 하나의 스칼라 손실 값을 기준으로 합니다. 따라서 손실이 여러 개인 네트워크에서는 모든 손실이(평균을 내서) 하나의 스칼라 양으로 합쳐집니다.

문제에 맞는 올바른 목적 함수를 선택하는 것은 아주 중요합니다. 네트워크가 손실을 최소화하기 위해 편법을 사용할 수 있기 때문입니다. 목적 함수가 주어진 문제의 성곡과 전혀 관련이 없다면 원하지 않는 일을 수행하는 모델이 만들어질 것 입니다. "모든 인류의 평균 행복 지수를 최대화하기" 같은 잘못된 목적 함수에서 SGD로 훈련된 멍청하지만 전지전능한 AI가 있다고 가정하시다 이문제를 쉽게 해결하려고 이 AI가 몇 사람을 남기고 모든 인류를 죽여서 남은 사람들의 행복에 초점을 맞출지도 모릅니다. 왜냐하면 평균적인 행복은 얼마나 많은 사람이 남겨지 있는지와 상관없기 때문입니다. 이는 의도한 바가 아닐 것입니다! 우리가 만든 모든 신경망은 단지 손실 함수를 최소화하기만 한다는 것을 기억하세요. 목적 함수를 현명하게 선택하지 않으면 원하지 않는 부수효과가 발생할 것입니다.

다행히 분류, 회귀와 시퀀스 예측 같은 일반적인 문제에서는 올바른 손실 함수를 선택하는 것 간단한 지침이 있습니다. 예를 들어 2개의 클래스가 있는 분류 문제에는 이진 크로스앤트로피(binary crossentropy), 여러 개의 클래스가 있는 분류 문제에는 범주형 크로스엔트로피(categorical crossentropy), 회귀 문제에는 평균 제곱 오차, 시퀀스 학습 문제에는 CTS(Connection Temporal Classification) 등을 사용합니다. 완전히 새로운 연구를 할 때만 독자적인 목적 함수를 만들게 됩니다. 이어지는 장들에서 여러 분야의 통상적인 작업에 어떤 손실 함수를 선택하는지 자세히 설명합니다.

3.1.2 모델: 층의 네크워크

 딥러닝 모델은 층으로 만든 비순환 유형 그래프(Directed Acyclic Graph, DAG)입니다. 가장 일반적인 예가 하나의 입력을 하나의 출력으로 매핑하는 층을 순서대로 쌓는 것입니다.

앞으로 공부하다 보면 아주 다양한 네트워크 구조를 보게 될 것입니다. 자주 등장하는 것들은 다음과 같습니다.

1) 가지(branch)가 2개인 네트워크

2) 출력이 여러 개인 네트워크

3) 인셉션(Inception) 블럭

네트워크 구조는 가설공간(hypothesis space)을 정의합니다. 1장에서머신 러닝을 '가능성 있는 관을 사전에 저의하고 피드백 신호의 도움을 받아 입ㅂ력 데이터에 대한 유용한 변환을 찾는 것'으로 정의했는데 기억날지 모르겠습니다. 네트워크 구조를 선택함으로써 가능성 있는 공간(가설 공간)을 입력 데이터에서 출력 데이터로 매핑하는 일련의 특정 텐서 연산으로 제한하게 됩니다. 우리가 찾아야 할 것은 이런 텐서 연산에 프홈된 가중치 텐서의 좋은 값입니다.

딱 맞는 네트워크 구조를 찾아내는 것은 과학보다는 예술에 가깝습니다. 신뢰할 만한 모범적인 사례와 원칙이 있지만 연습을 해야만 적절한 신경망을 설계할 수 있는 기술을 갖추게 될 것입니다.

다음 몇 개의 장에서 신경망을 만드는 원리를 배우고 특정 문제에 적용 가능한 것과 그렇지 않은 것에 대한 직관을 길러 봅시다.

3.1.1 층: 딥러닝의 구성 단위

 신경망의 핵심적인 데이터 구조는 2장에서 소개한 층입니다. 층은 하나 이상의 텐서를 입력으로 받아 하나 이상의 텐서를 출력하는 데이터 처리 모듈입니다. 어떤 종류의 층은 상태가 없지만 대부분의 경우 가중치라는 층의 상태를 가집니다. 가중치는 확률적 경사 하강버버에 의해 학습되는 하나 이상의 텐서이며 여기에 네트워크가 학습한 지식이 담겨 있습니다.

층마다 적절한 텐서 포맷과 데이터 처리 방식이 다릅니다. 예를 들어 (samples, features)크기의 2D 텐서가 저장된 간단한 벡터 데이터는 완전 연결 층(fully connected layer)이나 밀집 층(clense layer)이라고도 불리는 밀집 연결 층(densely connected layer)에 의해 처리되는 경우가 많습니다(케라스에서는 Dense클래스입니다). (samples, timesteps, features) 크기의 3D 텐서로 저장된 시퀸스 데이터는 보통 LSTM 같은 순환 층(recurrent layer)에 의해 처리됩니다. 4D 텐서로 저장되어 있는 이미지 데이터는 일반적으로 2D 합성곱 층(convolution layer)에 의해 처리됩니다(conv2D클래스). 층을 딥러닝의 레고 블록처럼 생각할 수 있습니다. 이런 비유는 케라스 같은 프레임워크 때문에 생겼습니다. 케라스에서는 호환 가능한 충들을 엮어 데이터 변환 파이프라인(pipeline)을 구성함으로써 딥러닝 모델을 만듭니다. 여기에는 층 호환성(layer compatibility)은 각 층의 특정 크기의 입력 텐서만 받고 특정 크기의 출력 텐서를 반환한다는 사실을 말합니다. 다음 예를 살펴보죠.

from keras import layers

layer = layers.Dense(32, input_shape=(784,))  ..... 32개의 유닛으로 된 밀집 층

첫 번째 차원이 784인 2D 텐서만 입력으로 받는 층을 만들었습니다(배치 차원인 0번째 축은 지정하지 않기 때문에 어떤 배치 크기도 입력으로 받을 수 있습니다). 이 층은 첫 번째 차원 크기가 32로 변환된 텐서를 출력할 것입니다.

따라서 이 층에서는 32차원의 벡터를 입력으로 받는 하위 층이 연결되어야 합니다. 케라스에는 모델에 추가된 층을 자동으로 상위 층의 크기에 맞추어 주기 때문에 호환성을 걱정하지 않아도 됩니다. 예를 들어 다음과 같이 작성했다고 가정합시다.

from keras import models

from keras import layers


model = model.Sequential()

model.add(layers.Dense(32, input_shape=(784, )))

model.add(layers.Dense(10))

두 번째 층에는 input_shape 매개변수를 지정하지 ㅇ낳았습니다. 그 대신 앞선 층의 출력 크기를 입력 크기로 자동으로 채택합니다.


3.1 신경망의 구조

 이전 장에서 본 것처럼 신경망 훈련에는 다음 요소들이 과련되어 있습니다.

1) 네트워크(또는 모델)를 구성하는 층

2) 입력 데이터와 그에 상응하는 타깃

3) 학습에 사용할 피드백 신호를 정의하는 손실 함수

4) 학습 진행 방식을 결정하는 옵티마이저

이들 간의 상호 작용을 그림 3-1에 나타냈습니다. 연속된 층으로 구성된 네트워크가 입력 데이터를 예측으로 매핑합니다. 손실 함수는 예측과 타깃을 비교하여 네트워크의 예측이 기댓값에 얼마나 잘 맞는지를 측정하는 손실 값을 만듭니다. 옵티마이저는 손실 값을 사용하여 네트워크 가중치를 업데이트 합니다. 층, 네트워크, 손실 함수, 옵티마이저에 대해 자세히 살펴보겠습니다.

2022년 7월 22일 금요일

3. 신경만 시작하기

 이 장에서는 신경망을 사요ㅕㅇ하여 실제 문제를 풀어 봅니다. 2장의 첫 번째 예제에서 얻은 지식을 정리하고, 신경망이 가장 많이 사용되는 세 종류의 문제인 이진 분류, 다중 분류, 스칼라 값을 예측하는 회귀에 배운 것을 적용해 봅니다.

또 2장에서 소개했던 층, 네트워크, 목적함수, 옵티마이저 같은 신경망의 핵심 구성 요소들을 자세히 살펴봅니다. 이 책에서 사용할 파이썬 딥러닝 라이브러리인 케라스(Keras)도 간략히 소개하며, 텐서플로, 케라스, GPU를 사용한 딥러닝을 실행하기 위해 컴퓨터를 셋팅합니다. 실전 문제를 해결하는데 신경망을 어떻게 사용하는지 세 가지 기본 예제로 자세히 살펴봅니다.

1) 영화 리뷰를 긍정 또는 부정으로 분류하기(이진 분류)

2) 신문 기사를 토픽으로 분류하기(다중 분류)

3) 부동산 데이터를 바탕으로 주택 가격을 예측하기(회귀)

이장이 끝에 다다르면 신경망으로 벡터 데이터를 사용한 분류나 회귀 같은 간단한 머신 러닝 문제를 해결할 수 있고, 4장에서는 머신러닝의 원리와 이론을 더 깊게 이해할 수 있을 것입니다.

2.6 요약

 1) 학습(Learning)은 훈련 데이터 샘플과 그에 상응하는 타깃이 주어졌을 때 손실 함수를 최소화하는 모델 파라미터의 조합을 찾는 것을 의미합니다.

2) 데이터 샘플과 타깃의 배치를 랜덤하게 뽑고 이 배치에서 손실에 대한 파라미터의 그ㄹ디언트를 계산함으로써 학습이 진행 됩니다. 네트워크의 파라미터는 그래디언트의 반대 방향으로 조금식(학습률에 의해 정의된 크기만큼) 움직입니다.

3) 전체 학습 과정은 신경망이 미분 가능한 텐서 연산으로 연결되어 있기 때문에 가능합니다. 현재 파라미터와 배치 데이터를 그래디언트 값에 매핑해 주는 그래디언트 함수를 구성하기 위해 미분의 연쇄 법칙을 사용합니다.

4) 이어지는 장에서 자주 보게 될 두 가지 핵심 개념은 손실과 옵티마이저입니다. 이 두가지는 네트워크에 데이터를 주입하기 전에 정의되어야 합니다.

5) 손실은 훈련하는 동안 최소화해야 할 양이므로 해결하려는 문제의 성공을 측정하는 데 사용합니다.

6) 욥티마이저는 손실에 대한 그래디언트가 파라미터를 업데이트하는 정확한 방식을 정의합니다. 예를 들어 RMSProp옵티마이저, 모멘텀을 사용한 SGD등입니다.