TensorFlow ANN 예제를 사용한 인공 신경망 튜토리얼

인공 신경망이란 무엇입니까?

An 인공 신경망 (ANN)은 인공 뉴런이라는 연결된 단위의 집합을 기반으로 인공 두뇌를 만들기 위해 생물학적 신경 네트워크에서 영감을 얻은 컴퓨터 시스템입니다. 인간으로서 정보를 분석하고 처리하도록 설계되었습니다. 인공 신경망은 더 많은 데이터를 사용할 수 있을수록 더 나은 결과를 생성할 수 있는 자체 학습 기능을 갖추고 있습니다.

인공 신경망
인공 신경망

인공 신경망(ANN)은 네 가지 주요 개체로 구성됩니다.

  • 레이어: 모든 학습은 레이어에서 발생합니다. 3) 입력 1) 숨김 2) 출력 3개의 레이어가 있습니다.
  • 기능 및 라벨: 네트워크(특성)에 데이터를 입력하고 네트워크(레이블)에서 출력합니다.
  • 손실 기능: 학습단계의 성과를 추정하는데 사용되는 Metric
  • 최적화: 네트워크의 지식을 업데이트하여 학습을 향상시킵니다.

신경망은 입력 데이터를 가져와서 레이어 앙상블로 푸시합니다. 네트워크는 손실 함수를 사용하여 성능을 평가해야 합니다. 손실 함수는 네트워크가 지식을 마스터하기 전에 취해야 할 경로에 대한 아이디어를 네트워크에 제공합니다. 네트워크는 최적화 프로그램의 도움으로 지식을 향상시켜야 합니다.

위의 그림을 보면 기본 메커니즘을 이해할 수 있습니다.

프로그램은 일부 입력 값을 가져와 두 개의 완전히 연결된 레이어로 푸시합니다. 수학 문제가 있다고 상상해 보세요. 가장 먼저 해야 할 일은 문제를 해결하기 위해 해당 장을 읽는 것입니다. 문제를 해결하기 위해 새로운 지식을 적용합니다. 점수가 잘 나오지 않을 확률이 높습니다. 네트워크에서도 마찬가지입니다. 처음 데이터를 보고 예측할 때는 실제 데이터와 완벽하게 일치하지 않습니다.

지식을 향상시키기 위해 네트워크는 최적화 프로그램을 사용합니다. 우리의 비유에서 옵티마이저는 장을 다시 읽는 것으로 생각할 수 있습니다. 다시 읽으면 새로운 통찰력과 교훈을 얻을 수 있습니다. 마찬가지로 네트워크는 최적화 프로그램을 사용하고, 지식을 업데이트하고, 새로운 지식을 테스트하여 아직 학습해야 할 부분이 얼마나 되는지 확인합니다. 프로그램은 가능한 가장 낮은 오류를 만들 때까지 이 단계를 반복합니다.

수학 문제 비유에서, 이는 교과서 장을 여러 번 읽어서 과정 내용을 완전히 이해한다는 것을 의미합니다. 여러 번 읽은 후에도 계속 오류가 발생하면 현재 자료로 지식 용량에 도달했다는 것을 의미합니다. 점수를 개선하려면 다른 교과서를 사용하거나 다른 방법을 테스트해야 합니다. 신경망의 경우에도 동일한 프로세스입니다. 오류가 100%에 훨씬 못 미치지만 곡선이 평평하다면 현재 아키텍처로는 다른 것을 배울 수 없다는 것을 의미합니다. 지식을 개선하려면 네트워크를 더 잘 최적화해야 합니다.

뉴럴 네트워크 Archi강의

인공 신경망 Archi구조는 다음과 같은 구성요소로 구성되어 있습니다.

  • 레이어
  • 활성화 기능
  • 손실 기능
  • 최적화

레이어

레이어는 모든 학습이 이루어지는 곳입니다. 레이어 내부에는 무한한 양의 가중치(뉴런)가 있습니다. 일반적인 신경망은 종종 조밀하게 연결된 레이어(완전 연결 레이어라고도 함)에 의해 처리됩니다. 이는 모든 입력이 출력에 연결되어 있음을 의미합니다.

일반적인 신경망은 입력 벡터와 레이블이 포함된 스칼라를 사용합니다. 가장 편안한 설정은 0과 1이라는 두 가지 클래스만 있는 이진 분류입니다.

네트워크는 입력을 받아 연결된 모든 노드에 보내고 다음과 같은 신호를 계산합니다. 활성화 기능.

뉴럴 네트워크 Archi강의
뉴럴 네트워크 Archi강의

위의 그림은 이 아이디어를 보여줍니다. 첫 번째 레이어는 숨겨진 레이어라고 불리는 두 번째 레이어의 입력 값이며 이전 레이어로부터 가중치 입력을 받습니다.

  1. 첫 번째 노드는 입력 값입니다.
  2. 뉴런은 입력부분과 활성화함수로 분해됩니다. 왼쪽 부분은 이전 레이어의 모든 입력을 받습니다. 오른쪽 부분은 활성화 함수에 전달된 입력의 합계입니다.
  3. 숨겨진 레이어에서 계산되어 예측에 사용되는 출력 값입니다. 분류의 경우 클래스 수와 동일합니다. 회귀의 경우 하나의 값만 예측됩니다.

활성화 기능

노드의 활성화 함수는 일련의 입력이 주어지면 출력을 정의합니다. 네트워크가 비선형 패턴을 학습할 수 있도록 하려면 활성화 함수가 필요합니다. 일반적인 활성화 함수는 다음과 같습니다. Relu, 정류된 선형 장치. 이 함수는 모든 음수 값에 대해 XNUMX을 제공합니다.

활성화 기능

다른 활성화 기능은 다음과 같습니다:

  • 조각별 선형
  • 시그 모이 드
  • 리키 렐루

신경망을 구축할 때 내려야 할 중요한 결정은 다음과 같습니다.

  • 신경망의 레이어 수
  • 각 레이어의 숨겨진 유닛 수

많은 계층과 은닉 유닛으로 구성된 신경망은 데이터의 복잡한 표현을 학습할 수 있지만, 신경망의 계산 비용이 매우 많이 듭니다.

손실 기능

은닉층과 활성화 함수를 정의한 후에는 손실 함수와 최적화 프로그램을 지정해야 합니다.

이진 분류의 경우 이진 교차 엔트로피 손실 함수를 사용하는 것이 일반적입니다. 선형 회귀에서는 평균 제곱 오차를 사용합니다.

손실 함수는 옵티마이저의 성능을 추정하는 중요한 지표입니다. 훈련 중에는 이 측정항목이 최소화됩니다. 다루고 있는 문제의 유형에 따라 이 수량을 신중하게 선택해야 합니다.

최적화

손실 함수는 모델 성능의 척도입니다. 옵티마이저는 손실을 줄이기 위해 네트워크의 가중치를 향상시키는 데 도움이 됩니다. 다양한 최적화 프로그램이 있지만 가장 일반적인 것은 확률적 경사하강법(Stochastic Gradient Descent)입니다.

기존 최적화 프로그램은 다음과 같습니다.

  • Momentum 최적화,
  • 네스테로프 가속 그래디언트,
  • 아다그라드,
  • 아담 최적화

신경망의 한계

신경망의 한계는 다음과 같습니다.

피팅

복잡한 신경망의 일반적인 문제는 보이지 않는 데이터를 일반화하는 데 어려움이 있다는 것입니다. 많은 가중치를 가진 신경망은 훈련 세트에서 특정 세부 사항을 매우 잘 식별할 수 있지만 종종 과적합으로 이어집니다. 그룹 내에서 데이터가 불균형한 경우(즉, 일부 그룹에서 사용 가능한 데이터가 충분하지 않은 경우) 네트워크는 훈련 중에 매우 잘 학습하지만 이러한 패턴을 전에 본 적이 없는 데이터로 일반화할 수 있는 능력이 없습니다.

기계 학습에는 최적화와 일반화 사이에 균형이 있습니다.

모델을 최적화하려면 훈련 세트의 손실을 최소화하는 최상의 매개변수를 찾아야 합니다.

그러나 일반화는 보이지 않는 데이터에 대해 모델이 어떻게 작동하는지 알려줍니다.

모델이 훈련 데이터의 특정 세부 사항이나 원치 않는 패턴을 포착하지 못하도록 하려면 다양한 기술을 사용할 수 있습니다. 가장 좋은 방법은 충분한 양의 데이터가 있는 균형 잡힌 데이터 세트를 갖는 것입니다. 과적합을 줄이는 기술을 과적합 감소라고 합니다. 정규화. 몇 가지 기존 기술을 검토해 보겠습니다.

네트워크 크기

너무 많은 레이어와 숨겨진 유닛이 있는 신경망은 매우 정교하다고 알려져 있습니다. 모델의 복잡성을 줄이는 간단한 방법은 크기를 줄이는 것입니다. 레이어 수를 정의하는 모범 사례는 없습니다. 적은 양의 레이어로 시작해서 모델이 과적합한 것을 발견할 때까지 크기를 늘려야 합니다.

가중치 정규화

과적합을 방지하는 표준 기술은 네트워크의 가중치에 제약 조건을 추가하는 것입니다. 제약 조건으로 인해 네트워크 크기가 작은 값만 취하도록 강제됩니다. 제약 조건은 오류의 손실 함수에 추가됩니다. 정규화에는 두 가지 종류가 있습니다.

L1: 올가미: 비용은 가중치 계수의 절대값에 비례합니다.

L2: Ridge: 비용은 중량계수 값의 제곱에 비례함

탈락

드롭아웃은 이상하지만 유용한 기술입니다. 드롭아웃이 있는 네트워크는 일부 가중치가 무작위로 0.1으로 설정된다는 의미입니다. 가중치 [1.7, 0.7, 0.9, -0.1] 배열이 있다고 상상해 보세요. 신경망에 드롭아웃이 있으면 무작위로 분포된 0으로 [0, 0.9, 0, -0.2]가 됩니다. 드롭아웃을 제어하는 ​​매개변수는 드롭아웃 비율입니다. 비율은 0.5으로 설정할 가중치 수를 정의합니다. XNUMX에서 XNUMX 사이의 비율을 갖는 것이 일반적입니다.

TensorFlow의 신경망 예

인공 신경망의 예를 통해 신경망이 일반적인 분류 문제에 어떻게 작동하는지 살펴보겠습니다. 두 개의 입력 x1과 x2가 있으며, 여기에는 랜덤 값이 있습니다. 출력은 이진 클래스입니다. 목표는 두 가지 특징을 기반으로 레이블을 분류하는 것입니다. 이 작업을 수행하기 위해 신경망 아키텍처는 다음과 같이 정의됩니다.

  • 두 개의 숨겨진 레이어
    • 첫 번째 레이어에는 XNUMX개의 완전히 연결된 뉴런이 있습니다.
    • 두 번째 계층에는 두 개의 완전히 연결된 뉴런이 있습니다.
  • 활성화 함수는 Relu입니다.
  • 학습률이 2인 L0.003 정규화를 추가합니다.

TensorFlow의 신경망

네트워크는 배치 크기가 180인 10 에포크 동안 가중치를 최적화합니다. 아래 ANN 예제 비디오에서 가중치가 어떻게 진화하고 네트워크가 분류 매핑을 어떻게 개선하는지 확인할 수 있습니다.

우선, 네트워크는 모든 가중치에 임의의 값을 할당합니다.

  • 즉, 최적화가 없는 임의 가중치를 사용하면 출력 손실은 0.453입니다. 아래 그림은 다양한 색상으로 네트워크를 나타냅니다.
  • 일반적으로 주황색은 음수 값을 나타내고 파란색은 양수 값을 나타냅니다.
  • 데이터 포인트는 동일한 표현을 갖습니다. 파란색은 양수 레이블이고 주황색은 음수 레이블입니다.

TensorFlow의 신경망

두 번째 숨겨진 레이어 내부에서 선은 가중치의 부호에 따라 색칠됩니다. 주황색 ​​선은 음수 가중치를 할당하고 파란색 선은 양수 가중치를 할당합니다.

보시다시피, 출력 매핑에서 네트워크는 상당히 많은 실수를 범하고 있습니다. 최적화 후 네트워크가 어떻게 작동하는지 살펴보겠습니다.

아래 ANN 예시 그림은 최적화된 네트워크의 결과를 보여줍니다. 우선, 네트워크가 데이터 포인트를 분류하는 방법을 성공적으로 학습했다는 것을 알 수 있습니다. 이전 사진을 보면 알 수 있습니다. 초기 가중치는 -0.43이었지만 최적화 후 가중치는 -0.95가 되었습니다.

TensorFlow의 신경망

이 아이디어는 숨겨진 레이어와 뉴런이 더 많은 네트워크에 대해 일반화될 수 있습니다. 안에서 놀 수 있어요 링크.

TensorFlow를 사용하여 신경망을 훈련하는 방법

다음은 API 추정기 DNNClassifier를 사용하여 TensorFlow ANN으로 신경망을 훈련하는 방법에 대한 단계별 프로세스입니다.

MNIST 데이터세트를 사용하여 첫 번째 신경망을 훈련하겠습니다. 신경망 훈련 TensorFlow 별로 복잡하지 않습니다. 전처리 단계는 이전 튜토리얼과 완전히 동일합니다. 다음과 같이 진행하게 됩니다:

  • 1단계: 데이터 가져오기
  • 2단계: 데이터 변환
  • 3단계: 텐서 구성
  • 4단계: 모델 구축
  • 5단계: 모델 학습 및 평가
  • 6단계: 모델 개선

1단계) 데이터 가져오기

우선, 필요한 라이브러리를 가져와야 합니다. 아래 TensorFlow 신경망 예시와 같이 scikit learn을 사용하여 MNIST 데이터세트를 가져올 수 있습니다.

MNIST 데이터 세트는 새로운 기술이나 알고리즘을 테스트하는 데 일반적으로 사용되는 데이터 세트입니다. 이 데이터 세트는 28에서 28까지의 손으로 쓴 숫자가 있는 0×9 픽셀 이미지 모음입니다. 현재 테스트에서 가장 낮은 오류는 0.27개의 합성곱 신경망 위원회를 사용하여 7%입니다.

import numpy as np
import tensorflow as tf
np.random.seed(1337)

이 주소에서 임시로 scikit learn을 다운로드할 수 있습니다. 데이터 세트를 복사하여 편리한 폴더에 붙여넣습니다. 데이터를 Python으로 가져오려면 scikit learn에서 fetch_mldata를 사용할 수 있습니다. fetch_mldata 안에 파일 경로를 붙여넣어 데이터를 가져옵니다.

from sklearn.datasets import fetch_mldata
mnist = fetch_mldata(' /Users/Thomas/Dropbox/Learning/Upwork/tuto_TF/data/mldata/MNIST original')
print(mnist.data.shape)
print(mnist.target.shape)

그런 다음 데이터를 가져오고 두 데이터세트의 모양을 가져옵니다.

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(mnist.data, mnist.target, test_size=0.2, random_state=42)
y_train  = y_train.astype(int)
y_test  = y_test.astype(int)
batch_size =len(X_train)

print(X_train.shape, y_train.shape,y_test.shape )

2단계) 데이터 변환

이전 튜토리얼에서는 이상치의 영향을 제한하기 위해 데이터를 변환해야 한다는 것을 배웠습니다. 이 신경망 튜토리얼에서는 최소-최대 스케일러를 사용하여 데이터를 변환합니다. 공식은 다음과 같습니다.

(X-min_x)/(max_x - min_x)

Scikit은 이미 MinMaxScaler()에 대한 기능을 학습합니다.

## resclae
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
# Train
X_train_scaled = scaler.fit_transform(X_train.astype(np.float64))
# test
X_test_scaled = scaler.fit_transform(X_test.astype(np.float64))

3단계) ​​텐서 구성

이제 Tensorflow에서 텐서를 생성하는 방법에 익숙해졌습니다. 열차 세트를 숫자 열로 변환할 수 있습니다.

feature_columns = [tf.feature_column.numeric_column('x', shape=X_train_scaled.shape[1:])]

4단계) 모델 구축

신경망의 아키텍처는 첫 번째 층에 2개의 유닛, 두 번째 층에 300개의 유닛이 있는 100개의 숨겨진 층을 포함합니다. 우리는 우리의 경험에 따라 이 값을 사용합니다. 이러한 값을 조정하고 그것이 네트워크의 정확도에 어떤 영향을 미치는지 볼 수 있습니다.

모델을 구축하려면 추정기 DNNClassifier를 사용합니다. feature_columns 인수에 레이어 수를 추가할 수 있습니다. 훈련 세트에는 10개의 클래스가 있으므로 클래스 수를 300으로 설정해야 합니다. 당신은 이미 추정기 객체의 구문에 익숙합니다. 인수 기능 열, 클래스 수 및 model_dir은 이전 튜토리얼과 정확히 동일합니다. 새로운 인수 Hidden_unit은 레이어 수와 신경망에 연결할 노드 수를 제어합니다. 아래 코드에는 두 개의 숨겨진 레이어가 있으며 첫 번째 레이어는 100개의 노드를 연결하고 두 번째 레이어는 XNUMX개의 노드를 연결합니다.

추정기를 빌드하려면 다음 매개변수와 함께 tf.estimator.DNNClassifier를 사용합니다.

  • feature_columns: 네트워크에서 사용할 열을 정의합니다.
  • Hidden_units: 숨겨진 뉴런의 수를 정의합니다.
  • n_classes: 예측할 클래스 수를 정의합니다.
  • model_dir: TensorBoard의 경로를 정의합니다.
estimator = tf.estimator.DNNClassifier(
    feature_columns=feature_columns,
    hidden_units=[300, 100], 
    n_classes=10, 
    model_dir = '/train/DNN')

5단계) 모델 학습 및 평가

numpy 메서드를 사용하여 모델을 훈련하고 평가할 수 있습니다.

# Train the estimator
train_input = tf.estimator.inputs.numpy_input_fn(
    x={"x": X_train_scaled},
    y=y_train,
    batch_size=50,
    shuffle=False,
    num_epochs=None)
estimator.train(input_fn = train_input,steps=1000) 
eval_input = tf.estimator.inputs.numpy_input_fn(
    x={"x": X_test_scaled},
    y=y_test, 
    shuffle=False,
    batch_size=X_test_scaled.shape[0],
    num_epochs=1)
estimator.evaluate(eval_input,steps=None) 

출력:

{'accuracy': 0.9637143,
 'average_loss': 0.12014342,
 'loss': 1682.0079,
 'global_step': 1000}

현재 아키텍처는 평가 세트의 정확도를 96%로 높였습니다.

6단계) 모델 개선

정규화 매개변수를 추가하여 모델을 개선할 수 있습니다.

우리는 드롭아웃 비율이 0.3인 Adam 옵티마이저, X의 L1, y의 L2를 사용할 것입니다. TensorFlow Neural Network에서 옵티마이저 이름 뒤에 오는 객체 train을 사용하여 옵티마이저를 제어할 수 있습니다. TensorFlow Proximal AdaGrad 최적화 프로그램을 위한 내장 API입니다.

딥 신경망에 정규화를 추가하려면 다음 매개변수와 함께 tf.train.ProximalAdagradOptimizer를 사용할 수 있습니다.

  • 학습률: learning_rate
  • L1 정규화: l1_regularization_strength
  • L2 정규화: l2_regularization_strength
estimator_imp = tf.estimator.DNNClassifier(
    feature_columns=feature_columns,
    hidden_units=[300, 100],
    dropout=0.3, 
    n_classes = 10,
    optimizer=tf.train.ProximalAdagradOptimizer(
      learning_rate=0.01,
      l1_regularization_strength=0.01, 
      l2_regularization_strength=0.01
    ),
    model_dir = '/train/DNN1')
estimator_imp.train(input_fn = train_input,steps=1000) 
estimator_imp.evaluate(eval_input,steps=None) 

출력:

{'accuracy': 0.95057142,
 'average_loss': 0.17318928,
 'loss': 2424.6499,
 'global_step': 2000}

과적합을 줄이기 위해 선택한 값은 모델 정확도를 향상시키지 못했습니다. 첫 번째 모델의 정확도는 96%인 반면, L2 정규화가 적용된 모델의 정확도는 95%입니다. 다양한 값을 사용해 보고 정확도에 어떤 영향을 미치는지 확인할 수 있습니다.

요약

이 튜토리얼에서는 신경망을 구축하는 방법을 배웁니다. 신경망에는 다음이 필요합니다.

  • 숨겨진 레이어 수
  • 완전히 연결된 노드 수
  • 활성화 기능
  • 최적화
  • 수업 수

TensorFlow ANN에서는 다음을 사용하여 분류 문제에 대한 신경망을 훈련할 수 있습니다.

  • tf.estimator.DNNClassifier

추정기는 다음을 지정해야 합니다.

  • feature_columns=feature_columns,
  • Hidden_units=[300, 100]
  • n_classes=10
  • 모델_디렉터리

다양한 최적화 프로그램을 사용하여 모델을 개선할 수 있습니다. 이 튜토리얼에서는 Adam Grad 최적화 프로그램을 학습률과 함께 사용하고 과적합을 방지하기 위한 컨트롤을 추가하는 방법을 배웠습니다.