Python 딥 러닝-퀵 가이드

심층 구조 학습 또는 계층 적 학습 또는 간단히 말해서 심층 학습은 더 넓은 인공 지능 분야의 하위 집합 인 기계 학습 방법 제품군의 일부입니다.

딥 러닝은 특징 추출 및 변환을 위해 여러 계층의 비선형 처리 장치를 사용하는 기계 학습 알고리즘 클래스입니다. 각 연속 레이어는 이전 레이어의 출력을 입력으로 사용합니다.

심층 신경망, 심층 신념 네트워크 및 반복 신경망은 컴퓨터 비전, 음성 인식, 자연어 처리, 오디오 인식, 소셜 네트워크 필터링, 기계 번역 및 생물 정보학과 같은 분야에 적용되어 비슷한 결과를 생성했습니다. 인간 전문가보다 낫습니다.

딥 러닝 알고리즘과 네트워크 −

  • 데이터의 여러 수준의 특징 또는 표현에 대한 비지도 학습을 기반으로합니다. 상위 레벨 기능은 하위 레벨 기능에서 파생되어 계층 적 표현을 형성합니다.

  • 훈련을 위해 어떤 형태의 경사 하강 법을 사용합니다.

이 장에서는 Python Deep Learning을위한 환경 설정에 대해 알아 봅니다. 딥 러닝 알고리즘을 만들기 위해서는 다음과 같은 소프트웨어를 설치해야합니다.

  • Python 2.7 이상
  • Numpy와 Scipy
  • Matplotlib
  • Theano
  • Keras
  • TensorFlow

Python, NumPy, SciPy 및 Matplotlib는 Anaconda 배포판을 통해 설치하는 것이 좋습니다. 모든 패키지와 함께 제공됩니다.

다양한 유형의 소프트웨어가 제대로 설치되었는지 확인해야합니다.

명령 줄 프로그램으로 이동하여 다음 명령을 입력합니다.

$ python
Python 3.6.3 |Anaconda custom (32-bit)| (default, Oct 13 2017, 14:21:34)
[GCC 7.2.0] on linux

다음으로 필요한 라이브러리를 가져 와서 버전을 인쇄 할 수 있습니다.

import numpy
print numpy.__version__

산출

1.14.2

Theano, TensorFlow 및 Keras 설치

Theano, TensorFlow 및 Keras 패키지 설치를 시작하기 전에 pip설치됩니다. Anaconda의 패키지 관리 시스템을 pip라고합니다.

pip 설치를 확인하려면 명령 줄에 다음을 입력하십시오.

$ pip

pip 설치가 확인되면 다음 명령을 실행하여 TensorFlow 및 Keras를 설치할 수 있습니다.

$pip install theano $pip install tensorflow
$pip install keras

다음 코드 줄을 실행하여 Theano의 설치를 확인하십시오-

$python –c “import theano: print (theano.__version__)”

산출

1.0.1

다음 코드 줄을 실행하여 Tensorflow의 설치를 확인하십시오.

$python –c “import tensorflow: print tensorflow.__version__”

산출

1.7.0

다음 코드 줄을 실행하여 Keras 설치를 확인하십시오.

$python –c “import keras: print keras.__version__”
Using TensorFlow backend

산출

2.1.5

인공 지능 (AI)은 컴퓨터가 인간의인지 행동이나 지능을 모방 할 수 있도록하는 모든 코드, 알고리즘 또는 기술입니다. 기계 학습 (ML)은 통계적 방법을 사용하여 기계가 경험을 통해 학습하고 개선 할 수 있도록하는 AI의 하위 집합입니다. 딥 러닝은 머신 러닝의 하위 집합으로 다층 신경망의 계산을 가능하게합니다. 기계 학습은 얕은 학습으로 간주되는 반면 딥 학습은 추상화를 통한 계층 적 학습으로 간주됩니다.

기계 학습은 다양한 개념을 다룹니다. 개념은 다음과 같습니다.

  • supervised
  • unsupervised
  • 강화 학습
  • 선형 회귀
  • 비용 함수
  • overfitting
  • under-fitting
  • 초 매개 변수 등

지도 학습에서는 레이블이 지정된 데이터에서 값을 예측하는 방법을 배웁니다. 여기서 도움이되는 ML 기법 중 하나는 분류이며, 여기서 대상 값은 이산 값입니다. 예를 들어, 고양이와 개. 도움이 될 수있는 기계 학습의 또 다른 기술은 회귀입니다. 회귀는 목표 값에서 작동합니다. 목표 값은 연속 값입니다. 예를 들어 주식 시장 데이터는 회귀를 사용하여 분석 할 수 있습니다.

비지도 학습에서는 레이블이 지정되거나 구조화되지 않은 입력 데이터에서 추론합니다. 백만 개의 의료 기록이 있고이를 이해하고, 기본 구조, 이상 값을 찾거나 이상 값을 감지해야하는 경우 클러스터링 기술을 사용하여 데이터를 광범위한 클러스터로 나눕니다.

데이터 세트는 훈련 세트, 테스트 세트, 검증 세트 등으로 나뉩니다.

2012 년 획기적인 발전으로 딥 러닝 개념이 눈에 띄게되었습니다. 알고리즘은 2 개의 GPU와 빅 데이터와 같은 최신 기술을 사용하여 1 백만 개의 이미지를 1000 개의 범주로 성공적으로 분류했습니다.

딥 러닝과 전통적인 머신 러닝의 관계

전통적인 기계 학습 모델에서 직면하는 주요 과제 중 하나는 특성 추출이라는 프로세스입니다. 프로그래머는 구체적이어야하며 컴퓨터에주의해야 할 기능을 알려야합니다. 이러한 기능은 의사 결정에 도움이됩니다.

알고리즘에 원시 데이터를 입력하는 것은 거의 작동하지 않으므로 특징 추출은 전통적인 기계 학습 워크 플로의 중요한 부분입니다.

이것은 프로그래머에게 막대한 책임을 주며 알고리즘의 효율성은 프로그래머가 얼마나 창의적인지에 크게 의존합니다. 물체 인식이나 필기 인식과 같은 복잡한 문제의 경우 이것은 큰 문제입니다.

다중 표현 계층을 학습 할 수있는 딥 러닝은 자동 특징 추출에 도움이되는 몇 안되는 방법 중 하나입니다. 하위 계층은 프로그래머의 지침이 거의 또는 전혀 필요하지 않은 자동 기능 추출을 수행한다고 가정 할 수 있습니다.

인공 신경망 또는 간단히 신경망은 새로운 아이디어가 아닙니다. 그것은 약 80 년 동안 존재했습니다.

2011 년이 되어서야 Deep Neural Networks가 새로운 기술, 방대한 데이터 세트 가용성 및 강력한 컴퓨터 사용으로 인기를 얻었습니다.

신경망은 수상 돌기, 핵, 축삭 및 말단 축삭을 가진 뉴런을 모방합니다.

네트워크의 경우 두 개의 뉴런이 필요합니다. 이 뉴런은 하나의 수상 돌기와 다른 하나의 말단 축삭 사이의 시냅스를 통해 정보를 전달합니다.

인공 뉴런의 가능한 모델은 다음과 같습니다.

신경망은 아래와 같이 보일 것입니다.

원은 데이터에 대한 기능을 가진 뉴런 또는 노드이며 이들을 연결하는 선 / 가장자리는 전달되는 가중치 / 정보입니다.

각 열은 레이어입니다. 데이터의 첫 번째 레이어는 입력 레이어입니다. 그러면 입력 레이어와 출력 레이어 사이의 모든 레이어가 히든 레이어가됩니다.

히든 레이어가 하나 또는 몇 개있는 경우 얕은 신경망이 있습니다. 숨겨진 레이어가 많으면 심층 신경망이 있습니다.

이 모델에는 입력 데이터가 있고 가중치를 부여한 다음 임계 값 함수 또는 활성화 함수라고하는 뉴런의 함수를 통해 전달합니다.

기본적으로 특정 값과 비교하여 모든 값의 합계입니다. 신호를 발동하면 결과는 (1) 출력되거나 아무것도 해제되지 않은 경우 (0)입니다. 그런 다음 가중치가 부여되고 다음 뉴런으로 전달되고 동일한 종류의 기능이 실행됩니다.

활성화 함수로 시그 모이 드 (s 자형) 함수를 가질 수 있습니다.

가중치는 무작위로 시작할 뿐이며 노드 / 뉴런에 대한 입력마다 고유합니다.

가장 기본적인 유형의 신경망 인 일반적인 "피드 포워드"에서 정보를 생성 한 네트워크를 통해 직접 전달하고 출력이 샘플 데이터를 사용했을 것으로 기대했던 출력과 비교합니다.

여기에서 원하는 출력과 일치하도록 출력을 얻을 수 있도록 가중치를 조정해야합니다.

신경망을 통해 직접 데이터를 전송하는 행위를 feed forward neural network.

우리의 데이터는 입력에서 레이어로, 순서대로 출력으로 이동합니다.

뒤로 돌아가서 손실 / 비용을 최소화하기 위해 가중치를 조정하기 시작할 때 이것을 back propagation.

이것은 optimization problem. 신경망을 사용하면 실제로는 수십만 개 또는 수백만 개 이상의 변수를 처리해야합니다.

첫 번째 해결책은 최적화 방법으로 확률 적 경사 하강 법을 사용하는 것이 었습니다. 이제 AdaGrad, Adam Optimizer 등과 같은 옵션이 있습니다. 어느 쪽이든 이것은 엄청난 계산 작업입니다. 그렇기 때문에 신경망은 대부분 반세기 이상 선반에 남아있었습니다. 우리는 이러한 작업을 고려할 수있는 능력과 아키텍처를 시스템에 갖고 있고 적절한 크기의 데이터 세트를 일치시킬 수있는 것은 아주 최근의 일이었습니다.

간단한 분류 작업의 경우 신경망은 K Nearest Neighbors와 같은 다른 간단한 알고리즘과 성능면에서 비교적 유사합니다. 신경망의 진정한 유용성은 우리가 훨씬 더 큰 데이터와 훨씬 더 복잡한 질문을 가질 때 실현되며, 두 가지 모두 다른 기계 학습 모델을 능가합니다.

심층 신경망 (DNN)은 입력 레이어와 출력 레이어 사이에 여러 숨겨진 레이어가있는 ANN입니다. 얕은 ANN과 유사하게 DNN은 복잡한 비선형 관계를 모델링 할 수 있습니다.

신경망의 주요 목적은 일련의 입력을 받고, 점진적으로 복잡한 계산을 수행하고, 분류와 같은 실제 문제를 해결하기 위해 출력을 제공하는 것입니다. 우리는 신경망을 전달하도록 제한합니다.

우리는 딥 네트워크에 입력, 출력 및 순차적 데이터 흐름이 있습니다.

신경망은지도 학습 및 강화 학습 문제에 널리 사용됩니다. 이러한 네트워크는 서로 연결된 계층 집합을 기반으로합니다.

딥 러닝에서는 대부분 비선형 인 은닉층의 수가 많을 수 있습니다. 약 1000 개의 층을 말하십시오.

DL 모델은 일반 ML 네트워크보다 훨씬 더 나은 결과를 생성합니다.

우리는 주로 네트워크를 최적화하고 손실 함수를 최소화하기 위해 경사 하강 법을 사용합니다.

우리는 Imagenet는 데이터 세트를 고양이와 개와 같은 카테고리로 분류하기위한 수백만 개의 디지털 이미지 저장소입니다. DL 넷은 정적 이미지와는 별도로 동적 이미지와 시계열 및 텍스트 분석에 점점 더 많이 사용됩니다.

데이터 세트 훈련은 딥 러닝 모델의 중요한 부분을 형성합니다. 또한 역전 파는 DL 모델 훈련의 주요 알고리즘입니다.

DL은 복잡한 입력 출력 변환으로 대규모 신경망 훈련을 다룹니다.

DL의 한 가지 예는 소셜 네트워크에서하는 것처럼 사진에있는 사람의 이름에 사진을 매핑하는 것이며, 구문으로 사진을 설명하는 것은 DL의 또 다른 최근 응용 프로그램입니다.

신경망은 x1, x2, x3…와 같은 입력이있는 함수로, z1, z2, z3 등과 같은 출력으로 변환되어 2 개 (얕은 네트워크) 또는 여러 중간 작업 (딥 네트워크)이라고도합니다.

가중치와 편향은 레이어마다 변경됩니다. 'w'와 'v'는 신경망 계층의 가중치 또는 시냅스입니다.

딥 러닝의 가장 좋은 사용 사례는지도 학습 문제입니다. 여기에는 원하는 출력 세트가있는 대규모 데이터 입력 세트가 있습니다.

여기서 우리는 정확한 출력 예측을 얻기 위해 역 전파 알고리즘을 적용합니다.

딥 러닝의 가장 기본적인 데이터 세트는 손으로 쓴 숫자의 데이터 세트 인 MNIST입니다.

Keras를 사용하여 심층 컨볼 루션 신경망을 훈련하여이 데이터 세트에서 손으로 쓴 숫자의 이미지를 분류 할 수 있습니다.

신경망 분류기의 실행 또는 활성화는 점수를 생성합니다. 예를 들어 환자를 아프고 건강한 것으로 분류하기 위해 키, 체중 및 체온, 혈압 등과 같은 매개 변수를 고려합니다.

높은 점수는 환자가 아프다는 것을 의미하고 낮은 점수는 그가 건강하다는 것을 의미합니다.

출력 및 히든 레이어의 각 노드에는 자체 분류자가 있습니다. 입력 레이어는 추가 활성화를 위해 입력을 받아 다음 은닉 레이어로 점수를 전달하며 출력에 도달 할 때까지 계속됩니다.

입력에서 출력으로 왼쪽에서 오른쪽으로 순방향으로 진행하는 과정을 forward propagation.

신경망의 CAP (크레딧 할당 경로)는 입력에서 출력으로 시작하는 일련의 변환입니다. CAP는 입력과 출력 사이의 가능한 인과 관계를 자세히 설명합니다.

주어진 피드 포워드 신경망에 대한 CAP 깊이 또는 CAP 깊이는 숨겨진 계층의 수에 출력 계층이 포함됨에 따라 1을 더한 것입니다. 신호가 계층을 통해 여러 번 전파 될 수있는 순환 신경망의 경우 CAP 깊이는 잠재적으로 무한 할 수 있습니다.

깊은 그물과 얕은 그물

얕은 학습과 딥 러닝을 구분하는 명확한 깊이 임계 값은 없습니다. 그러나 여러 비선형 계층이있는 딥 러닝의 경우 CAP가 2보다 커야한다는 데 대부분 동의합니다.

신경망의 기본 노드는 생물학적 신경망의 뉴런을 모방 한 인식입니다. 그런 다음 다중 계층 인식 또는 MLP가 있습니다. 각 입력 세트는 가중치 및 편향 세트에 의해 수정됩니다. 각 에지에는 고유 한 가중치가 있고 각 노드에는 고유 한 편향이 있습니다.

예측 accuracy 신경망의 weights and biases.

신경망의 정확도를 높이는 과정을 training. 전방 소품 망의 출력은 올바른 것으로 알려진 값과 비교됩니다.

그만큼 cost function or the loss function 생성 된 출력과 실제 출력의 차이입니다.

훈련의 요점은 수백만 개의 훈련 예제에서 훈련 비용을 가능한 한 작게 만드는 것입니다.이를 위해 네트워크는 예측이 올바른 출력과 일치 할 때까지 가중치와 편향을 조정합니다.

잘 훈련되면 신경망은 매번 정확한 예측을 할 수 있습니다.

패턴이 복잡해지고 컴퓨터가이를 인식하도록하려면 신경망을 사용해야합니다. 이러한 복잡한 패턴 시나리오에서는 신경망이 다른 경쟁 알고리즘보다 성능이 뛰어납니다.

이제 그 어느 때보 다 빠르게 훈련 할 수있는 GPU가 있습니다. 심층 신경망은 이미 AI 분야를 혁신하고 있습니다.

컴퓨터는 반복적 인 계산을 수행하고 자세한 지침을 따르는 데 능숙 함이 입증되었지만 복잡한 패턴을 인식하는 데는 그다지 능숙하지 않습니다.

단순 패턴 인식에 문제가있는 경우 SVM (Support Vector Machine) 또는 로지스틱 회귀 분류 기가 작업을 잘 수행 할 수 있지만 패턴의 복잡성이 증가함에 따라 심층 신경망으로 갈 수밖에 없습니다.

따라서 사람의 얼굴과 같은 복잡한 패턴의 경우 얕은 신경망은 실패하고 더 많은 계층이있는 심층 신경망으로 이동하는 것 외에는 대안이 없습니다. 딥넷은 복잡한 패턴을 더 간단한 패턴으로 분할하여 작업을 수행 할 수 있습니다. 예를 들어, 인간의 얼굴; adeep net은 가장자리를 사용하여 입술, 코, 눈, 귀 등과 같은 부분을 감지 한 다음 다시 결합하여 사람의 얼굴을 만듭니다.

정확한 예측의 정확성이 너무 정확 해져 최근 Google 패턴 인식 챌린지에서 딥넷이 사람을 이겼습니다.

레이어드 퍼셉트론의 웹에 대한이 아이디어는 한동안 존재 해 왔습니다. 이 영역에서 깊은 그물은 인간의 뇌를 모방합니다. 그러나 이것의 한 가지 단점은 훈련하는 데 오랜 시간이 걸린다는 것입니다.

그러나 최근의 고성능 GPU는 1 주일 이내에 이러한 딥넷을 훈련 할 수있었습니다. 빠른 CPU는 동일한 작업을 수행하는 데 몇 주 또는 몇 달이 걸렸을 수 있습니다.

딥넷 선택

깊은 그물을 선택하는 방법? 분류기를 만들고 있는지 아니면 데이터에서 패턴을 찾고 있는지, 그리고 비지도 학습을 사용할 것인지 결정해야합니다. 레이블이 지정되지 않은 데이터 세트에서 패턴을 추출하기 위해 제한된 Boltzman 기계 또는 자동 인코더를 사용합니다.

깊은 그물을 선택할 때 다음 사항을 고려하십시오.

  • 텍스트 처리, 정서 분석, 구문 분석 및 이름 엔티티 인식을 위해 우리는 순환 네트워크 또는 순환 신경 텐서 네트워크 또는 RNTN을 사용합니다.

  • 문자 수준에서 작동하는 모든 언어 모델에 대해 반복 네트워크를 사용합니다.

  • 이미지 인식을 위해 심층 신념 네트워크 DBN 또는 컨볼 루션 네트워크를 사용합니다.

  • 물체 인식을 위해 RNTN 또는 컨볼 루션 네트워크를 사용합니다.

  • 음성 인식을 위해 우리는 recurrent net을 사용합니다.

일반적으로 수정 된 선형 단위 또는 RELU가있는 심층 신념 네트워크와 다층 퍼셉트론은 모두 분류를위한 좋은 선택입니다.

시계열 분석의 경우 항상 recurrent net을 사용하는 것이 좋습니다.

신경망은 50 년 이상 사용되어 왔습니다. 하지만 이제야 그들은 눈에 띄게 떠 올랐습니다. 그 이유는 훈련하기가 어렵 기 때문입니다. 역 전파 (back propagation)라는 방법으로 그들을 훈련 시키려고하면 소멸 또는 폭발 경사라는 문제에 부딪 히게되는데, 그럴 경우 훈련에 더 많은 시간이 걸리고 정확도가 뒤처지게됩니다. 데이터 세트를 학습 할 때 예측 출력과 레이블이 지정된 학습 데이터 세트의 실제 출력의 차이 인 비용 함수를 지속적으로 계산하고, 가중치 및 편향 값을 최저값까지 조정하여 비용 함수를 최소화합니다. 획득됩니다. 훈련 프로세스는 가중치 또는 편향 값의 변화와 관련하여 비용이 변경되는 비율 인 기울기를 사용합니다.

제한된 Boltzman 네트워크 또는 오토 인코더-RBN

2006 년에는 그라디언트가 사라지는 문제를 해결하는 데 돌파구를 마련했습니다. Geoff Hinton은 새로운 전략을 고안하여Restricted Boltzman Machine - RBM, 얕은 두 층 그물.

첫 번째 레이어는 visible 레이어와 두 번째 레이어는 hidden층. 보이는 레이어의 각 노드는 히든 레이어의 모든 노드에 연결됩니다. 네트워크는 동일한 계층 내의 두 계층이 연결을 공유 할 수 없기 때문에 제한된 것으로 알려져 있습니다.

오토 인코더는 입력 데이터를 벡터로 인코딩하는 네트워크입니다. 원시 데이터의 숨김 또는 압축 표현을 만듭니다. 벡터는 차원 감소에 유용합니다. 벡터는 원시 데이터를 더 적은 수의 필수 차원으로 압축합니다. 오토 인코더는 디코더와 쌍을 이루어 숨겨진 표현을 기반으로 입력 데이터를 재구성 할 수 있습니다.

RBM은 양방향 번역기와 수학적 동등합니다. 정방향 패스는 입력을 받아 입력을 인코딩하는 숫자 집합으로 변환합니다. 한편 역방향 패스는이 숫자 세트를 가져와 재구성 된 입력으로 다시 변환합니다. 잘 훈련 된 네트는 높은 정확도로 백 프롭을 수행합니다.

두 단계에서 가중치와 편향은 중요한 역할을합니다. RBM이 입력 간의 상호 관계를 디코딩하고 패턴을 감지하는 데 필수적인 입력을 결정하는 데 도움이됩니다. 전진 및 후진 패스를 통해 RBM은 입력 및 구성이 가능한 한 가까워 질 때까지 다른 가중치와 편향으로 입력을 재구성하도록 훈련됩니다. RBM의 흥미로운 점은 데이터에 레이블을 지정할 필요가 없다는 것입니다. 이것은 사진, 비디오, 음성 및 센서 데이터와 같은 실제 데이터 세트에 매우 중요한 것으로 밝혀졌으며 모두 레이블이 지정되지 않은 경향이 있습니다. 사람이 수동으로 데이터에 레이블을 지정하는 대신 RBM은 데이터를 자동으로 정렬합니다. 가중치와 편향을 적절히 조정함으로써 RBM은 중요한 특징을 추출하고 입력을 재구성 할 수 있습니다. RBM은 데이터의 고유 한 패턴을 인식하도록 설계된 기능 추출기 신경망 제품군의 일부입니다. 이들은 자체 구조를 인코딩해야하기 때문에 자동 인코더라고도합니다.

Deep Belief Networks-DBN

DBN (딥 신념 네트워크)은 RBM을 결합하고 영리한 훈련 방법을 도입하여 형성됩니다. 마침내 그라디언트가 사라지는 문제를 해결하는 새로운 모델이 있습니다. Geoff Hinton은 역 전파의 대안으로 RBM과 Deep Belief Net을 발명했습니다.

DBN은 MLP (Multi-layer perceptron)와 구조가 유사하지만 훈련에 있어서는 매우 다릅니다. DBN이 얕은 상대를 능가 할 수있는 훈련입니다.

DBN은 하나의 RBM의 숨겨진 계층이 그 위에있는 RBM의 가시적 계층 인 RBM의 스택으로 시각화 될 수 있습니다. 첫 번째 RBM은 입력을 최대한 정확하게 재구성하도록 훈련되었습니다.

첫 번째 RBM의 숨겨진 계층은 두 번째 RBM의 가시적 계층으로 간주되고 두 번째 RBM은 첫 번째 RBM의 출력을 사용하여 훈련됩니다. 이 프로세스는 네트워크의 모든 계층이 훈련 될 때까지 반복됩니다.

DBN에서 각 RBM은 전체 입력을 학습합니다. DBN은 카메라 렌즈가 천천히 사진의 초점을 맞추는 것처럼 모델이 천천히 향상됨에 따라 전체 입력을 연속적으로 미세 조정하여 전역 적으로 작동합니다. 다중 레이어 퍼셉트론 MLP가 단일 퍼셉트론보다 성능이 뛰어 나기 때문에 RBM 스택은 단일 RBM보다 성능이 뛰어납니다.

이 단계에서 RBM은 데이터에서 고유 한 패턴을 감지했지만 이름이나 레이블은 없습니다. DBN 교육을 마치려면 패턴에 레이블을 도입하고지도 학습으로 네트워크를 미세 조정해야합니다.

특징과 패턴이 이름과 연결될 수 있도록 매우 작은 레이블이 지정된 샘플 세트가 필요합니다. 이 작은 레이블이 지정된 데이터 세트는 학습에 사용됩니다. 이 레이블이 지정된 데이터 세트는 원래 데이터 세트와 비교할 때 매우 작을 수 있습니다.

가중치와 편향이 약간 변경되어 패턴에 대한 네트의 인식에 약간의 변화가 발생하고 종종 전체 정확도가 약간 증가합니다.

훈련은 또한 GPU를 사용하여 얕은 그물에 비해 매우 정확한 결과를 제공함으로써 합리적인 시간 내에 완료 할 수 있으며, 그라디언트 문제가 사라짐에 대한 해결책도 있습니다.

생성 적 적대 네트워크-GAN

생성 적 적대적 네트워크는 두 개의 네트로 구성된 심층 신경망으로, 서로 대항하여 "적대적"이름입니다.

GAN은 2014 년 몬트리올 대학의 연구자들이 발표 한 논문에서 소개되었습니다. Facebook의 AI 전문가 Yann LeCun은 GAN을 언급하며 적대적 훈련을 "ML에서 지난 10 년 동안 가장 흥미로운 아이디어"라고 불렀습니다.

네트워크 스캔이 데이터 배포를 모방하는 방법을 배우기 때문에 GAN의 잠재력은 엄청납니다. GAN은 이미지, 음악, 연설, 산문 등 모든 영역에서 우리와 놀랍도록 유사한 평행 세계를 만들도록 가르 칠 수 있습니다. 그들은 어떤면에서 로봇 예술가이며 그들의 결과물은 매우 인상적입니다.

GAN에서 생성기라고하는 하나의 신경망은 새로운 데이터 인스턴스를 생성하고 다른 하나 인 판별자는 진위 여부를 평가합니다.

실제 세계에서 가져온 MNIST 데이터 세트에있는 것과 같은 손으로 쓴 숫자를 생성하려고한다고 가정 해 보겠습니다. 진정한 MNIST 데이터 세트의 인스턴스를 표시 할 때 판별 자의 작업은이를 진품으로 인식하는 것입니다.

이제 GAN의 다음 단계를 고려하십시오-

  • 생성기 네트워크는 난수 형식으로 입력을 받아 이미지를 반환합니다.

  • 이 생성 된 이미지는 실제 데이터 세트에서 가져온 이미지 스트림과 함께 판별 기 네트워크에 대한 입력으로 제공됩니다.

  • 판별 기는 실제 이미지와 가짜 이미지를 모두 가져와 0과 1 사이의 숫자로 확률을 반환합니다. 1은 진위에 대한 예측을 나타내고 0은 가짜를 나타냅니다.

  • 따라서 이중 피드백 루프가 있습니다.

    • 판별자는 우리가 알고있는 이미지의 실제와 함께 피드백 루프에 있습니다.

    • 생성기는 판별 자와 함께 피드백 루프에 있습니다.

순환 신경망-RNN

RNN데이터가 어떤 방향 으로든 흐를 수있는 신경망. 이러한 네트워크는 언어 모델링 또는 자연어 처리 (NLP)와 같은 애플리케이션에 사용됩니다.

RNN의 기본 개념은 순차 정보를 활용하는 것입니다. 정상적인 신경망에서는 모든 입력과 출력이 서로 독립적이라고 가정합니다. 문장에서 다음 단어를 예측하려면 그 앞에 오는 단어를 알아야합니다.

RNN은 시퀀스의 모든 요소에 대해 동일한 작업을 반복하므로 반복이라고하며 출력은 이전 계산을 기반으로합니다. 따라서 RNN은 이전에 계산 된 정보를 캡처하는 "메모리"를 가지고 있다고 말할 수 있습니다. 이론적으로 RNN은 매우 긴 시퀀스의 정보를 사용할 수 있지만 실제로는 몇 단계 만 되돌아 볼 수 있습니다.

장단기 기억 네트워크 (LSTM)는 가장 일반적으로 사용되는 RNN입니다.

컨볼 루션 신경망과 함께 RNN은 라벨이없는 이미지에 대한 설명을 생성하는 모델의 일부로 사용되었습니다. 이것이 얼마나 잘 작동하는지 놀랍습니다.

컨볼 루션 심층 신경망-CNN

더 깊게 만들기 위해 신경망의 계층 수를 늘리면 네트워크의 복잡성이 증가하고 더 복잡한 함수를 모델링 할 수 있습니다. 그러나 가중치와 편향의 수는 기하 급수적으로 증가 할 것입니다. 사실 이러한 어려운 문제를 배우는 것은 정상적인 신경망에서는 불가능해질 수 있습니다. 이것은 솔루션 인 컨볼 루션 신경망으로 이어집니다.

CNN은 컴퓨터 비전에서 광범위하게 사용됩니다. 자동 음성 인식을위한 음향 모델링에도 적용되었습니다.

컨볼 루션 신경망 뒤에있는 아이디어는 이미지를 통과하는 "움직이는 필터"의 아이디어입니다. 이 이동 필터 또는 컨볼 루션은 예를 들어 픽셀 일 수있는 특정 인접 노드에 적용됩니다. 여기서 적용된 필터는 노드 값의 0.5 x-

유명한 연구원 Yann LeCun은 컨볼 루션 신경망을 개척했습니다. 얼굴 인식 소프트웨어로서 Facebook은 이러한 네트워크를 사용합니다. CNN은 머신 비전 프로젝트를위한 솔루션이었습니다. 컨볼 루션 네트워크에는 많은 계층이 있습니다. Imagenet 챌린지에서 기계는 2015 년에 물체 인식에서 사람을 이길 수있었습니다.

간단히 말해서 CNN (Convolutional Neural Network)은 다층 신경망입니다. 레이어는 때때로 최대 17 개 이상이며 입력 데이터를 이미지라고 가정합니다.

CNN은 조정해야하는 매개 변수의 수를 크게 줄입니다. 따라서 CNN은 원시 이미지의 높은 차원을 효율적으로 처리합니다.

이 장에서 우리는 파이썬 딥 러닝의 기초를 살펴볼 것입니다.

딥 러닝 모델 / 알고리즘

이제 다양한 딥 러닝 모델 / 알고리즘에 대해 알아 보겠습니다.

딥 러닝 내에서 인기있는 모델 중 일부는 다음과 같습니다.

  • 컨볼 루션 신경망
  • 순환 신경망
  • 깊은 신념 네트워크
  • 생성 적 적대 네트워크
  • 자동 인코더 등

입력과 출력은 벡터 또는 텐서로 표현됩니다. 예를 들어, 신경망은 이미지의 개별 픽셀 RGB 값이 벡터로 표현되는 입력을 가질 수 있습니다.

입력 계층과 출력 계층 사이에있는 뉴런 계층을 은닉 계층이라고합니다. 이것은 신경망이 문제를 해결하려고 할 때 대부분의 작업이 이루어지는 곳입니다. 히든 레이어를 자세히 살펴보면 네트워크가 데이터에서 추출하는 방법을 배운 기능에 대해 많은 것을 알 수 있습니다.

신경망의 다른 아키텍처는 다음 계층의 다른 뉴런에 연결할 뉴런을 선택하여 형성됩니다.

출력 계산을위한 의사 코드

다음은 출력을 계산하기위한 의사 코드입니다. Forward-propagating Neural Network

  • # node [] : = 토폴로지 정렬 된 노드 배열
  • # a에서 b까지의 모서리는 a가 b의 왼쪽에 있음을 의미합니다.
  • # 신경망에 R 입력과 S 출력이있는 경우
  • # 첫 번째 R 노드는 입력 노드이고 마지막 S 노드는 출력 노드입니다.
  • # incoming [x] : = 노드 x에 연결된 노드
  • # weight [x] : = x로 들어오는 가장자리의 가중치

각 뉴런 x에 대해 왼쪽에서 오른쪽으로 −

  • 만약 x <= R : 아무것도하지 않음 # 입력 노드
  • inputs [x] = [output [i] for i in incoming [x]]
  • weighted_sum = dot_product (weights [x], inputs [x])
  • output [x] = Activation_function (weighted_sum)

이제 신경망을 훈련시키는 방법을 배웁니다. 또한 Python Deep Learning에서 역 전파 알고리즘과 역방향 전달을 학습합니다.

원하는 결과를 얻기 위해서는 신경망 가중치의 최적 값을 찾아야합니다. 신경망을 훈련시키기 위해 우리는 반복적 경사 하강 법을 사용합니다. 처음에는 가중치의 무작위 초기화로 시작합니다. 무작위 초기화 후, 우리는 순 전파 과정을 통해 데이터의 일부 부분 집합을 예측하고, 해당 비용 함수 C를 계산하고, 각 가중치 w를 dC / dw에 비례하는 양, 즉 비용 함수 wrt의 미분으로 업데이트합니다. 무게. 비례 상수는 학습률로 알려져 있습니다.

역 전파 알고리즘을 사용하여 기울기를 효율적으로 계산할 수 있습니다. 역방향 전파 또는 역방향 소품의 주요 관찰은 미분의 사슬 규칙으로 인해 신경망의 각 뉴런의 기울기가 뉴런의 기울기를 사용하여 계산 될 수 있으며 나가는 가장자리가 있다는 것입니다. 따라서 우리는 기울기를 거꾸로 계산합니다. 즉, 먼저 출력 레이어의 기울기를 계산 한 다음 최상위 은닉 레이어, 선행 은닉 레이어 등 입력 레이어에서 끝나는 식으로 계산합니다.

역 전파 알고리즘은 대부분 계산 그래프의 개념을 사용하여 구현됩니다. 여기서 각 뉴런은 계산 그래프의 많은 노드로 확장되고 덧셈, 곱셈과 같은 간단한 수학적 연산을 수행합니다. 계산 그래프에는 가장자리에 가중치가 없습니다. 모든 가중치가 노드에 할당되므로 가중치가 자체 노드가됩니다. 그런 다음 역 전파 알고리즘이 계산 그래프에서 실행됩니다. 계산이 완료되면 가중치 노드의 기울기 만 업데이트에 필요합니다. 나머지 그라디언트는 버릴 수 있습니다.

경사 하강 법 최적화 기법

발생하는 오류에 따라 가중치를 조정하는 일반적으로 사용되는 최적화 기능 중 하나는 "경사 하강 법"입니다.

Gradient는 기울기의 또 다른 이름이며, xy 그래프에서 기울기는 두 변수가 서로 어떻게 관련되어 있는지를 나타냅니다. 즉, 런에 따른 상승, 시간 변화에 따른 거리 변화 등입니다.이 경우 기울기는 다음과 같습니다. 네트워크의 오류와 단일 가중치 사이의 비율; 즉, 무게가 변함에 따라 오차가 어떻게 변하는가.

더 정확하게 말하면 어떤 가중치가 가장 적은 오류를 생성하는지 찾고 싶습니다. 입력 데이터에 포함 된 신호를 올바르게 나타내는 가중치를 찾고이를 올바른 분류로 변환하려고합니다.

신경망이 학습함에 따라 신호를 의미에 올바르게 매핑 할 수 있도록 많은 가중치를 천천히 조정합니다. 네트워크 오류와 각 가중치 간의 비율은 미분, dE / dw로 가중치의 약간의 변화가 오차의 약간의 변화를 유발하는 정도를 계산합니다.

각 가중치는 많은 변환을 포함하는 심층 네트워크에서 하나의 요소 일뿐입니다. 가중치의 신호는 여러 계층에 걸쳐 활성화 및 합계를 통과하므로 미적분의 연쇄 규칙을 사용하여 네트워크 활성화 및 출력을 통해 다시 작업합니다. 이는 문제의 가중치 및 전체 오류와의 관계로 이어집니다.

오차와 가중치라는 두 변수가 세 번째 변수에 의해 매개되는 경우 activation, 가중치가 전달됩니다. 먼저 활성화의 변화가 오류의 변화에 ​​어떤 영향을 미치는지, 가중치의 변화가 활성화의 변화에 ​​어떤 영향을 미치는지 계산하여 가중치의 변화가 오류의 변화에 ​​어떤 영향을 미치는지 계산할 수 있습니다.

딥 러닝의 기본 아이디어는 그 이상입니다. 오류를 더 이상 줄일 수 없을 때까지 모델이 생성하는 오류에 대한 응답으로 모델의 가중치를 조정하는 것입니다.

딥넷은 기울기 값이 작 으면 느리고 값이 높으면 빠르게 학습됩니다. 훈련의 부정확성은 부정확 한 결과로 이어집니다. 출력에서 다시 입력으로 네트를 훈련시키는 과정을 역 전파 또는 역 전파라고합니다. 순방향 전파는 입력에서 시작하여 앞으로 진행된다는 것을 알고 있습니다. Back prop은 오른쪽에서 왼쪽으로 그라디언트를 계산하는 역 / 반대를 수행합니다.

그라디언트를 계산할 때마다 해당 지점까지 이전의 모든 그라디언트를 사용합니다.

출력 레이어의 노드에서 시작하겠습니다. 가장자리는 해당 노드에서 그라디언트를 사용합니다. 히든 레이어로 돌아 가면 더 복잡해집니다. 0과 1 사이의 두 숫자의 곱은 더 작은 숫자를 제공합니다. 그래디언트 값은 계속 작아지고 결과적으로 back prop은 훈련하는 데 많은 시간이 걸리고 정확도가 떨어집니다.

딥 러닝 알고리즘의 과제

과적 합 및 계산 시간과 같은 얕은 신경망과 심층 신경망에는 특정 문제가 있습니다. DNN은 훈련 데이터에서 드문 종속성을 모델링 할 수있는 추가 된 추상화 계층을 사용하기 때문에 과적 합의 영향을받습니다.

Regularization탈락, 조기 중지, 데이터 증가, 전이 학습과 같은 방법은 과적 합을 방지하기 위해 훈련 중에 적용됩니다. 드롭 아웃 정규화는 훈련 중에 숨겨진 계층에서 단위를 무작위로 생략하므로 드문 종속성을 피하는 데 도움이됩니다. DNN은 크기, 즉 레이어 수 및 레이어 당 단위 수, 학습률 및 초기 가중치와 같은 여러 훈련 매개 변수를 고려합니다. 최적의 매개 변수를 찾는 것은 시간과 계산 리소스의 높은 비용 때문에 항상 실용적이지는 않습니다. 일괄 처리와 같은 몇 가지 해킹으로 계산 속도를 높일 수 있습니다. GPU의 큰 처리 능력은 필요한 행렬 및 벡터 계산이 GPU에서 잘 실행되기 때문에 훈련 프로세스에 크게 도움이되었습니다.

드롭 아웃

드롭 아웃은 신경망에 널리 사용되는 정규화 기술입니다. 심층 신경망은 특히 과적 합되는 경향이 있습니다.

이제 드롭 아웃이 무엇이며 어떻게 작동하는지 살펴 보겠습니다.

Deep Learning의 선구자 중 한 명인 Geoffrey Hinton의 말에 따르면, '깊은 신경망이 있고 과적 합이 아니라면 아마도 더 큰 것을 사용하고 드롭 아웃을 사용해야합니다.'

드롭 아웃은 경사 하강 법을 반복 할 때마다 무작위로 선택된 노드 세트를 드롭하는 기술입니다. 즉, 존재하지 않는 것처럼 무작위로 일부 노드를 무시합니다.

각 뉴런은 q 확률로 유지되고 확률 1-q로 무작위로 삭제됩니다. 값 q는 신경망의 각 계층마다 다를 수 있습니다. 히든 레이어의 경우 값 0.5, 입력 레이어의 경우 0은 다양한 작업에서 잘 작동합니다.

평가 및 예측 중에는 드롭 아웃이 사용되지 않습니다. 각 뉴런의 출력에 q를 곱하여 다음 계층에 대한 입력이 동일한 예상 값을 갖도록합니다.

드롭 아웃의 배경은 다음과 같습니다. 드롭 아웃 정규화가없는 신경망에서 뉴런은 서로 간의 상호 의존성을 개발하여 과적 합을 초래합니다.

구현 트릭

Dropout은 임의로 선택된 뉴런의 출력을 0으로 유지하여 TensorFlow 및 Pytorch와 같은 라이브러리에서 구현됩니다. 즉, 뉴런이 존재하더라도 출력을 0으로 덮어 씁니다.

조기 중지

경사 하강 법이라는 반복 알고리즘을 사용하여 신경망을 훈련합니다.

조기 중지의 개념은 직관적입니다. 오류가 증가하기 시작하면 훈련을 중단합니다. 여기서 오류 란 하이퍼 파라미터를 조정하는 데 사용되는 학습 데이터의 일부인 유효성 검사 데이터에서 측정 된 오류를 의미합니다. 이 경우 하이퍼 매개 변수가 중지 기준입니다.

데이터 증대

보유한 데이터의 양을 늘리거나 기존 데이터를 사용하고 일부 변환을 적용하여 데이터를 늘리는 프로세스입니다. 사용되는 정확한 변환은 우리가 달성하려는 작업에 따라 다릅니다. 또한 신경망을 돕는 변환은 아키텍처에 따라 다릅니다.

예를 들어, 객체 분류와 같은 많은 컴퓨터 비전 작업에서 효과적인 데이터 증대 기술은 원본 데이터의 잘 리거나 번역 된 버전의 새로운 데이터 포인트를 추가하는 것입니다.

컴퓨터가 이미지를 입력으로 받아들이면 픽셀 값의 배열을받습니다. 전체 이미지가 왼쪽으로 15 픽셀 이동했다고 가정 해 보겠습니다. 우리는 서로 다른 방향으로 많은 다른 이동을 적용하여 원래 데이터 세트 크기의 몇 배나 증가 된 데이터 세트를 만듭니다.

전이 학습

사전 훈련 된 모델을 가져와 자체 데이터 세트로 모델을 "미세 조정"하는 프로세스를 전이 학습이라고합니다. 이를 수행하는 방법에는 여러 가지가 있습니다. 아래에 몇 가지 방법이 설명되어 있습니다.

  • 대규모 데이터 세트에서 사전 훈련 된 모델을 훈련합니다. 그런 다음 네트워크의 마지막 계층을 제거하고 임의 가중치를 가진 새 계층으로 교체합니다.

  • 그런 다음 다른 모든 계층의 가중치를 고정하고 네트워크를 정상적으로 훈련시킵니다. 여기서 레이어를 동결해도 경사 하강 법 또는 최적화 중에 가중치가 변경되지 않습니다.

그이면의 개념은 사전 학습 된 모델이 기능 추출기 역할을하고 마지막 레이어 만 현재 작업에 대해 학습된다는 것입니다.

역전 파는 계산 그래프를 사용하여 Tensorflow, Torch, Theano 등과 같은 딥 러닝 프레임 워크에서 구현됩니다. 더 중요한 것은 계산 그래프에서 역 전파를 이해하면 여러 가지 알고리즘과 시간을 통한 역 전파 및 공유 가중치와 역전 파와 같은 변형을 결합합니다. 모든 것이 계산 그래프로 변환되면 여전히 동일한 알고리즘입니다. 계산 그래프에서 역전 파일뿐입니다.

계산 그래프 란?

계산 그래프는 노드가 수학적 연산에 해당하는 방향 그래프로 정의됩니다. 계산 그래프는 수학적 표현을 표현하고 평가하는 방법입니다.

예를 들어, 다음은 간단한 수학 방정식입니다.

$$p = x+y$$

위 방정식의 계산 그래프를 다음과 같이 그릴 수 있습니다.

위의 계산 그래프에는 두 개의 입력 변수 x와 y와 하나의 출력 q가있는 더하기 노드 ( "+"기호가있는 노드)가 있습니다.

약간 더 복잡한 또 다른 예를 들어 보겠습니다. 다음 방정식이 있습니다.

$$g = \left (x+y \right ) \ast z $$

위의 방정식은 다음 계산 그래프로 표시됩니다.

계산 그래프와 역 전파

계산 그래프와 역전 파는 모두 신경망 훈련을위한 딥 러닝의 중요한 핵심 개념입니다.

포워드 패스

정방향 패스는 계산 그래프로 표현 된 수학적 표현의 값을 평가하는 절차입니다. 정방향 전달을한다는 것은 출력이있는 왼쪽 (입력)에서 오른쪽으로 정방향으로 변수의 값을 전달한다는 것을 의미합니다.

모든 입력에 일부 값을 부여하여 예를 고려해 보겠습니다. 모든 입력에 다음 값이 제공된다고 가정합니다.

$$x=1, y=3, z=−3$$

이러한 값을 입력에 제공하면 순방향 전달을 수행하고 각 노드의 출력에 대해 다음 값을 얻을 수 있습니다.

먼저 x = 1 및 y = 3의 값을 사용하여 p = 4를 얻습니다.

그런 다음 p = 4 및 z = -3을 사용하여 g = -12를 얻습니다. 우리는 왼쪽에서 오른쪽으로 앞으로 이동합니다.

역방향 패스의 목적

역방향 패스에서 우리의 의도는 최종 출력과 관련하여 각 입력에 대한 기울기를 계산하는 것입니다. 이러한 기울기는 기울기 하강 법을 사용하여 신경망을 훈련하는 데 필수적입니다.

예를 들어 다음과 같은 그라디언트가 필요합니다.

원하는 그라디언트

$$\frac{\partial x}{\partial f}, \frac{\partial y}{\partial f}, \frac{\partial z}{\partial f}$$

역방향 전달 (역 전파)

최종 출력 (자체!)에 대한 최종 출력의 미분을 찾아서 역방향 패스를 시작합니다. 따라서 ID 파생이 발생하고 값은 1과 같습니다.

$$\frac{\partial g}{\partial g} = 1$$

우리의 계산 그래프는 이제 아래와 같이 보입니다.

다음으로 "*"연산을 통해 역방향 패스를 수행합니다. p와 z에서 기울기를 계산합니다. g = p * z이므로-

$$\frac{\partial g}{\partial z} = p$$

$$\frac{\partial g}{\partial p} = z$$

우리는 이미 정방향 패스에서 z와 p의 값을 알고 있습니다. 따라서 우리는-

$$\frac{\partial g}{\partial z} = p = 4$$

$$\frac{\partial g}{\partial p} = z = -3$$

우리는 x와 y에서 기울기를 계산하고 싶습니다-

$$\frac{\partial g}{\partial x}, \frac{\partial g}{\partial y}$$

그러나 우리는이 작업을 효율적으로 수행하고 싶습니다 (이 그래프에서 x와 g는 두 홉 거리에 불과하지만 실제로 서로 멀리 떨어져 있다고 상상해보십시오). 이러한 값을 효율적으로 계산하기 위해 미분의 체인 규칙을 사용합니다. 체인 규칙에서 우리는-

$$\frac{\partial g}{\partial x}=\frac{\partial g}{\partial p}\ast \frac{\partial p}{\partial x}$$

$$\frac{\partial g}{\partial y}=\frac{\partial g}{\partial p}\ast \frac{\partial p}{\partial y}$$

그러나 우리는 p가 x와 y에 직접적으로 의존하기 때문에 dg / dp = -3, dp / dx 및 dp / dy가 쉽다는 것을 이미 알고 있습니다. 우리는-

$$p=x+y\Rightarrow \frac{\partial x}{\partial p} = 1, \frac{\partial y}{\partial p} = 1$$

따라서 우리는-

$$\frac{\partial g} {\partial f} = \frac{\partial g} {\partial p}\ast \frac{\partial p} {\partial x} = \left ( -3 \right ).1 = -3$$

또한 입력 y −

$$\frac{\partial g} {\partial y} = \frac{\partial g} {\partial p}\ast \frac{\partial p} {\partial y} = \left ( -3 \right ).1 = -3$$

이 작업을 거꾸로 수행하는 주된 이유는 x에서 기울기를 계산해야 할 때 이미 계산 된 값과 dq / dx (동일한 노드의 입력에 대한 노드 출력의 미분) 만 사용했기 때문입니다. 우리는 지역 정보를 사용하여 글로벌 가치를 계산했습니다.

신경망 훈련 단계

신경망을 훈련하려면 다음 단계를 따르십시오.

  • 데이터 세트의 데이터 포인트 x에 대해 x를 입력으로 전달하고 비용 c를 출력으로 계산합니다.

  • c에서 시작하여 역방향 패스를 수행하고 그래프의 모든 노드에 대한 기울기를 계산합니다. 여기에는 신경망 가중치를 나타내는 노드가 포함됩니다.

  • 그런 다음 W = W-학습률 * 기울기를 수행하여 가중치를 업데이트합니다.

  • 중지 기준이 충족 될 때까지이 프로세스를 반복합니다.

딥 러닝은 컴퓨터 비전, 언어 번역, 이미지 캡션, 오디오 전사, 분자 생물학, 음성 인식, 자연어 처리, 자율 주행 자동차, 뇌종양 감지, 실시간 음성 번역, 음악과 같은 몇 가지 애플리케이션에 대해 좋은 결과를 가져 왔습니다. 구성, 자동 게임 플레이 등.

딥 러닝은 더 발전된 구현을 통해 머신 러닝에 이어 큰 도약입니다. 현재는 비정형 데이터를 처리 할 때 게임 체인저가 될 것이라는 강력한 약속을 제공하는 업계 표준이되고 있습니다.

딥 러닝은 현재 다양한 실제 문제에 대한 최고의 솔루션 제공 업체 중 하나입니다. 개발자는 이전에 주어진 규칙을 사용하는 대신 예제를 통해 복잡한 작업을 해결하는 AI 프로그램을 구축하고 있습니다. 많은 데이터 과학자들이 딥 러닝을 사용함에 따라 심층 신경망은 더욱 정확한 결과를 제공합니다.

아이디어는 각 네트워크에 대한 훈련 계층의 수를 증가시켜 심층 신경망을 개발하는 것입니다. 기계는 데이터가 최대한 정확해질 때까지 데이터에 대해 더 많이 학습합니다. 개발자는 딥 러닝 기술을 사용하여 복잡한 기계 학습 작업을 구현하고 AI 네트워크가 높은 수준의 지각 인식을 갖도록 훈련 할 수 있습니다.

딥 러닝은 컴퓨터 비전에서 인기를 얻고 있습니다. 여기서 달성되는 작업 중 하나는 주어진 입력 이미지가 고양이, 개 등으로 분류되거나 이미지를 가장 잘 설명하는 클래스 또는 레이블로 분류되는 이미지 분류입니다. 인간으로서 우리는 삶의 초기에이 작업을 수행하는 방법을 배우고 패턴을 빠르게 인식하고, 사전 지식을 일반화하고, 다양한 이미지 환경에 적응하는 이러한 기술을 가지고 있습니다.

이 장에서는 다양한 라이브러리 및 프레임 워크에 딥 러닝을 연관시킬 것입니다.

딥 러닝과 Theano

심층 신경망 코딩을 시작하려면 Theano, TensorFlow, Keras, PyTorch 등과 같은 다양한 프레임 워크가 어떻게 작동하는지 아는 것이 좋습니다.

Theano는 머신에서 빠르게 훈련하는 딥넷을 구축하기위한 함수 세트를 제공하는 파이썬 라이브러리입니다.

Theano는 캐나다 몬트리올 대학교에서 심층 네트워크 개척자 인 Yoshua Bengio의지도 아래 개발되었습니다.

Theano를 사용하면 숫자의 직사각형 배열 인 벡터와 행렬로 수학적 표현을 정의하고 평가할 수 있습니다.

기술적으로 말하면 신경망과 입력 데이터는 모두 행렬로 표현 될 수 있으며 모든 표준 그물 연산은 행렬 연산으로 재정의 될 수 있습니다. 이것은 컴퓨터가 매트릭스 연산을 매우 빠르게 수행 할 수 있기 때문에 중요합니다.

여러 행렬 값을 병렬로 처리 할 수 ​​있으며이 기본 구조로 신경망을 구축하면 GPU가있는 단일 시스템을 사용하여 적절한 시간 창에서 거대한 그물을 훈련 할 수 있습니다.

그러나 Theano를 사용한다면 처음부터 깊은 그물을 만들어야합니다. 라이브러리는 특정 유형의 딥넷을 생성하기위한 완전한 기능을 제공하지 않습니다.

대신 모델, 계층, 활성화, 훈련 방법 및 과적 합을 막기위한 특수 방법과 같은 딥넷의 모든 측면을 코딩해야합니다.

그러나 좋은 소식은 Theano가 고도로 최적화 된 솔루션을 제공하는 벡터화 된 함수 위에 구현을 구축 할 수 있다는 것입니다.

Theano의 기능을 확장하는 다른 많은 라이브러리가 있습니다. TensorFlow 및 Keras는 Theano와 함께 백엔드로 사용할 수 있습니다.

TensorFlow를 사용한 딥 러닝

Google의 TensorFlow는 Python 라이브러리입니다. 이 라이브러리는 상업용 수준의 딥 러닝 애플리케이션을 구축하는 데 적합합니다.

TensorFlow는 Google Brain Project의 일부인 다른 라이브러리 DistBelief V2에서 성장했습니다. 이 라이브러리는 연구 모델을 상용 등급 애플리케이션에 적용 할 수 있도록 기계 학습의 이식성을 확장하는 것을 목표로합니다.

Theano 라이브러리와 매우 유사하게 TensorFlow는 노드가 영구 데이터 또는 수학 연산을 나타내고 에지는 다차원 배열 또는 텐서 인 노드 간의 데이터 흐름을 나타내는 계산 그래프를 기반으로합니다. 따라서 이름 TensorFlow

작업 또는 작업 집합의 출력은 다음 작업에 입력으로 제공됩니다.

TensorFlow는 신경망 용으로 설계되었지만 계산을 데이터 흐름 그래프로 모델링 할 수있는 다른 네트워크에서는 잘 작동합니다.

TensorFlow는 또한 공통 및 하위 표현 제거, 자동 차별화, 공유 및 기호 변수와 같은 Theano의 여러 기능을 사용합니다.

Convolutional net, Autoencoders, RNTN, RNN, RBM, DBM / MLP 등과 같은 TensorFlow를 사용하여 다양한 유형의 딥 넷을 구축 할 수 있습니다.

그러나 TensorFlow에서는 하이퍼 매개 변수 구성을 지원하지 않으며이 기능을 위해 Keras를 사용할 수 있습니다.

딥 러닝과 케 라스

Keras는 딥 러닝 모델을 개발하고 평가하기위한 강력하고 사용하기 쉬운 Python 라이브러리입니다.

그것은 우리가 층별로 그물을 만들 수있는 미니멀 한 디자인을 가지고 있습니다. 그것을 훈련하고 실행하십시오.

효율적인 수치 계산 라이브러리 Theano 및 TensorFlow를 래핑하고 몇 줄의 짧은 코드로 신경망 모델을 정의하고 훈련 할 수 있습니다.

높은 수준의 신경망 API로 딥 러닝과 인공 지능을 폭넓게 활용할 수 있습니다. TensorFlow, Theano 등을 포함한 여러 하위 수준 라이브러리 위에서 실행됩니다. Keras 코드는 이식 가능합니다. 코드 변경없이 Theano 또는 TensorFlow를 백엔드로 사용하여 Keras에서 신경망을 구현할 수 있습니다.

이 딥 러닝 구현에서 우리의 목표는 고객이이 은행 서비스를 떠날 가능성이있는 특정 은행의 고객 이탈 또는 이탈 데이터를 예측하는 것입니다. 사용 된 데이터 세트는 상대적으로 작고 14 개의 열이있는 10000 개의 행을 포함합니다. 우리는 Anaconda 배포판과 Theano, TensorFlow 및 Keras와 같은 프레임 워크를 사용하고 있습니다. Keras는 백엔드로 작동하는 Tensorflow 및 Theano를 기반으로 구축되었습니다.

# Artificial Neural Network
# Installing Theano
pip install --upgrade theano

# Installing Tensorflow
pip install –upgrade tensorflow

# Installing Keras
pip install --upgrade keras

1 단계 : 데이터 전처리

In[]:

# Importing the libraries
   import numpy as np
   import matplotlib.pyplot as plt
   import pandas as pd
 
# Importing the database
   dataset = pd.read_csv('Churn_Modelling.csv')

2 단계

데이터 세트의 특성과 "종료 됨"이라는 레이블이 붙은 14 열인 대상 변수의 행렬을 만듭니다.

데이터의 초기 모습은 다음과 같습니다.

In[]:
X = dataset.iloc[:, 3:13].values
Y = dataset.iloc[:, 13].values
X

산출

3 단계

Y

산출

array([1, 0, 1, ..., 1, 1, 0], dtype = int64)

4 단계

문자열 변수를 인코딩하여 분석을 더 간단하게 만듭니다. ScikitLearn 함수 'LabelEncoder'를 사용하여 0에서 n_classes-1 사이의 값으로 열의 다른 레이블을 자동으로 인코딩합니다.

from sklearn.preprocessing import LabelEncoder, OneHotEncoder
labelencoder_X_1 = LabelEncoder() 
X[:,1] = labelencoder_X_1.fit_transform(X[:,1]) 
labelencoder_X_2 = LabelEncoder() 
X[:, 2] = labelencoder_X_2.fit_transform(X[:, 2])
X

산출

위의 출력에서 ​​국가 이름은 0, 1 및 2로 대체됩니다. 남성과 여성은 0과 1로 대체됩니다.

5 단계

Labelling Encoded Data

우리는 같은 것을 사용합니다 ScikitLearn 라이브러리 및 OneHotEncoder 더미 변수를 생성하는 열 번호를 전달합니다.

onehotencoder = OneHotEncoder(categorical features = [1])
X = onehotencoder.fit_transform(X).toarray()
X = X[:, 1:]
X

이제 처음 2 개 열은 국가를 나타내고 4 번째 열은 성별을 나타냅니다.

산출

우리는 항상 데이터를 교육 및 테스트 부분으로 나눕니다. 훈련 데이터에서 모델을 훈련시킨 다음 모델의 효율성을 평가하는 데 도움이되는 테스트 데이터에서 모델의 정확성을 확인합니다.

6 단계

우리는 ScikitLearn의 train_test_split데이터를 훈련 세트와 테스트 세트로 분할하는 함수입니다. 학습-테스트 분할 비율을 80:20으로 유지합니다.

#Splitting the dataset into the Training set and the Test Set
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2)

일부 변수에는 수천 개의 값이 있고 일부는 수십 또는 1의 값이 있습니다. 데이터가 더 대표적 이도록 데이터를 확장합니다.

7 단계

이 코드에서는 다음을 사용하여 훈련 데이터를 맞추고 변환합니다. StandardScaler함수. 스케일링을 표준화하여 테스트 데이터를 변환 / 스케일링하는 데 동일한 적합 방법을 사용합니다.

# Feature Scaling
fromsklearn.preprocessing import StandardScaler 
sc = StandardScaler() 
X_train = sc.fit_transform(X_train) 
X_test = sc.transform(X_test)

산출

이제 데이터의 크기가 적절하게 조정되었습니다. 마지막으로 데이터 전처리가 완료되었습니다. 이제 모델부터 시작하겠습니다.

8 단계

여기에서 필요한 모듈을 가져옵니다. 신경망을 초기화하기위한 Sequential 모듈과 히든 레이어를 추가하기위한 조밀 모듈이 필요합니다.

# Importing the Keras libraries and packages 
import keras 
from keras.models import Sequential 
from keras.layers import Dense

9 단계

고객 이탈을 분류하는 것이 목표이므로 모델 이름을 분류 자 ​​(Classifier)로 지정하겠습니다. 그런 다음 초기화를 위해 Sequential 모듈을 사용합니다.

#Initializing Neural Network 
classifier = Sequential()

10 단계

고밀도 기능을 사용하여 숨겨진 레이어를 하나씩 추가합니다. 아래 코드에서 많은 인수를 볼 수 있습니다.

첫 번째 매개 변수는 output_dim. 이 레이어에 추가하는 노드의 수입니다.initStochastic Gradient Decent의 초기화입니다. 신경망에서는 각 노드에 가중치를 할당합니다. 초기화시 가중치는 0에 가까워 야하며 uniform 함수를 사용하여 무작위로 가중치를 초기화합니다. 그만큼input_dim모델이 입력 변수의 수를 알지 못하기 때문에 매개 변수는 첫 번째 계층에만 필요합니다. 여기서 입력 변수의 총 개수는 11 개입니다. 두 번째 레이어에서 모델은 첫 번째 은닉 레이어의 입력 변수 개수를 자동으로 인식합니다.

다음 코드 줄을 실행하여 입력 레이어와 첫 번째 숨겨진 레이어를 추가합니다.

classifier.add(Dense(units = 6, kernel_initializer = 'uniform', 
activation = 'relu', input_dim = 11))

두 번째 숨겨진 레이어를 추가하려면 다음 코드 줄을 실행하십시오.

classifier.add(Dense(units = 6, kernel_initializer = 'uniform', 
activation = 'relu'))

다음 코드 줄을 실행하여 출력 레이어를 추가하십시오.

classifier.add(Dense(units = 1, kernel_initializer = 'uniform', 
activation = 'sigmoid'))

11 단계

Compiling the ANN

지금까지 분류기에 여러 레이어를 추가했습니다. 이제 다음을 사용하여 컴파일합니다.compile방법. 최종 컴파일 제어에 추가 된 인수는 신경망을 완성하므로이 단계에서주의해야합니다.

다음은 인수에 대한 간략한 설명입니다.

첫 번째 주장은 Optimizer최적의 가중치 집합을 찾는 데 사용되는 알고리즘입니다. 이 알고리즘을Stochastic Gradient Descent (SGD). 여기서는 'Adam Optimizer'라는 여러 유형 중 하나를 사용합니다. SGD는 손실에 따라 달라 지므로 두 번째 매개 변수는 손실입니다. 종속 변수가 이진이면 다음과 같은 로그 손실 함수를 사용합니다.‘binary_crossentropy’, 종속 변수에 출력에 세 개 이상의 범주가있는 경우 다음을 사용합니다. ‘categorical_crossentropy’. 우리는 다음을 기반으로 신경망의 성능을 향상시키고 싶습니다.accuracy, 그래서 우리는 metrics 정확성으로.

# Compiling Neural Network 
classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])

12 단계

이 단계에서 여러 코드를 실행해야합니다.

ANN을 교육 세트에 맞추기

이제 훈련 데이터에서 모델을 훈련합니다. 우리는fit우리 모델에 맞는 방법. 또한 가중치를 최적화하여 모델 효율성을 개선합니다. 이를 위해 가중치를 업데이트해야합니다.Batch size 가중치를 업데이트 한 후 관측 값의 수입니다. Epoch총 반복 횟수입니다. 배치 크기 및 에포크 값은 시행 착오 방법으로 선택됩니다.

classifier.fit(X_train, y_train, batch_size = 10, epochs = 50)

모델 예측 및 평가

# Predicting the Test set results
y_pred = classifier.predict(X_test)
y_pred = (y_pred > 0.5)

하나의 새로운 관찰 예측

# Predicting a single new observation
"""Our goal is to predict if the customer with the following data will leave the bank:
Geography: Spain
Credit Score: 500
Gender: Female
Age: 40
Tenure: 3
Balance: 50000
Number of Products: 2
Has Credit Card: Yes
Is Active Member: Yes

13 단계

Predicting the test set result

예측 결과는 고객이 회사를 떠날 확률을 제공합니다. 이 확률을 이진수 0과 1로 변환합니다.

# Predicting the Test set results 
y_pred = classifier.predict(X_test) 
y_pred = (y_pred > 0.5)
new_prediction = classifier.predict(sc.transform
(np.array([[0.0, 0, 500, 1, 40, 3, 50000, 2, 1, 1, 40000]])))
new_prediction = (new_prediction > 0.5)

14 단계

이것이 모델 성능을 평가하는 마지막 단계입니다. 이미 독창적 인 결과가 있으므로 모델의 정확성을 확인하기 위해 혼동 행렬을 만들 수 있습니다.

Making the Confusion Matrix

from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred)
print (cm)

산출

loss: 0.3384 acc: 0.8605
[ [1541 54]
[230 175] ]

혼동 행렬에서 모델의 정확도는 다음과 같이 계산할 수 있습니다.

Accuracy = 1541+175/2000=0.858

We achieved 85.8% accuracy, 어느 것이 좋니.

순방향 전파 알고리즘

이 섹션에서는 간단한 신경망에 대해 순방향 전파 (예측)를 수행하는 코드를 작성하는 방법을 배웁니다.

각 데이터 포인트는 고객입니다. 첫 번째 입력은 보유한 계정 수이고 두 번째 입력은 보유한 자녀 수입니다. 이 모델은 사용자가 내년에 얼마나 많은 트랜잭션을 수행하는지 예측합니다.

입력 데이터는 입력 데이터로 미리로드되고 가중치는 가중치라는 사전에 있습니다. 히든 레이어의 첫 번째 노드에 대한 가중치 배열은 가중치 [ 'node_0']에 있고 히든 레이어의 두 번째 노드에 대한 가중치 배열은 각각 가중치 [ 'node_1']에 있습니다.

출력 노드에 공급되는 가중치는 가중치로 사용할 수 있습니다.

정류 된 선형 활성화 기능

"활성화 기능"은 각 노드에서 작동하는 기능입니다. 노드의 입력을 일부 출력으로 변환합니다.

정류 된 선형 활성화 함수 ( ReLU )는 고성능 네트워크에서 널리 사용됩니다. 이 함수는 단일 숫자를 입력으로 사용하여 입력이 음수이면 0을 반환하고 입력이 양수이면 출력으로 입력합니다.

다음은 몇 가지 예입니다.

  • relu (4) = 4
  • relu (-2) = 0

relu () 함수의 정의를 채 웁니다.

  • max () 함수를 사용하여 relu ()의 출력 값을 계산합니다.
  • relu () 함수를 node_0_input에 적용하여 node_0_output을 계산합니다.
  • relu () 함수를 node_1_input에 적용하여 node_1_output을 계산합니다.
import numpy as np
input_data = np.array([-1, 2])
weights = {
   'node_0': np.array([3, 3]),
   'node_1': np.array([1, 5]),
   'output': np.array([2, -1])
}
node_0_input = (input_data * weights['node_0']).sum()
node_0_output = np.tanh(node_0_input)
node_1_input = (input_data * weights['node_1']).sum()
node_1_output = np.tanh(node_1_input)
hidden_layer_output = np.array(node_0_output, node_1_output)
output =(hidden_layer_output * weights['output']).sum()
print(output)

def relu(input):
   '''Define your relu activation function here'''
   # Calculate the value for the output of the relu function: output
   output = max(input,0)
      # Return the value just calculated
   return(output)
# Calculate node 0 value: node_0_output
node_0_input = (input_data * weights['node_0']).sum()
node_0_output = relu(node_0_input)

# Calculate node 1 value: node_1_output
node_1_input = (input_data * weights['node_1']).sum()
node_1_output = relu(node_1_input)

# Put node values into array: hidden_layer_outputs
hidden_layer_outputs = np.array([node_0_output, node_1_output])

# Calculate model output (do not apply relu)
odel_output = (hidden_layer_outputs * weights['output']).sum()
print(model_output)# Print model output

산출

0.9950547536867305
-3

많은 관측치 / 데이터 행에 네트워크 적용

이 섹션에서는 predict_with_network ()라는 함수를 정의하는 방법을 배웁니다. 이 함수는 위의 네트워크에서 input_data로 가져온 여러 데이터 관찰에 대한 예측을 생성합니다. 위의 네트워크에 주어진 가중치가 사용됩니다. relu () 함수 정의도 사용됩니다.

두 개의 인수 (input_data_row 및 weights)를 받아들이고 네트워크에서 예측값을 출력으로 반환하는 predict_with_network ()라는 함수를 정의 해 보겠습니다.

각 노드의 입력 및 출력 값을 계산하여 node_0_input, node_0_output, node_1_input 및 node_1_output으로 저장합니다.

노드의 입력 값을 계산하기 위해 관련 배열을 곱하고 합계를 계산합니다.

노드의 출력 값을 계산하기 위해 노드의 입력 값에 relu () 함수를 적용합니다. input_data를 반복하기 위해 'for 루프'를 사용합니다.

또한 우리는 input_data-input_data_row의 각 행에 대한 예측을 생성하기 위해 predict_with_network ()를 사용합니다. 또한 각 예측을 결과에 추가합니다.

# Define predict_with_network()
def predict_with_network(input_data_row, weights):
   # Calculate node 0 value
   node_0_input = (input_data_row * weights['node_0']).sum()
   node_0_output = relu(node_0_input)
   
   # Calculate node 1 value
   node_1_input = (input_data_row * weights['node_1']).sum()
   node_1_output = relu(node_1_input)
   
   # Put node values into array: hidden_layer_outputs
   hidden_layer_outputs = np.array([node_0_output, node_1_output])
   
   # Calculate model output
   input_to_final_layer = (hidden_layer_outputs*weights['output']).sum()
   model_output = relu(input_to_final_layer)
# Return model output
   return(model_output)

# Create empty list to store prediction results
results = []
for input_data_row in input_data:
   # Append prediction to results
   results.append(predict_with_network(input_data_row, weights))
print(results)# Print results

산출

[0, 12]

여기에서는 relu (26) = 26이고 relu (-13) = 0 등등 인 relu 함수를 사용했습니다.

심층 다층 신경망

여기에서는 두 개의 은닉 계층이있는 신경망에 대한 순방향 전파를 수행하는 코드를 작성합니다. 각 숨겨진 레이어에는 두 개의 노드가 있습니다. 입력 데이터는 다음과 같이 미리로드되었습니다.input_data. 첫 번째 숨겨진 레이어의 노드는 node_0_0 및 node_0_1이라고합니다.

가중치는 각각 가중치 [ 'node_0_0'] 및 가중치 [ 'node_0_1']로 미리로드됩니다.

두 번째 은닉층의 노드는 node_1_0 and node_1_1. 무게는 다음과 같이 미리로드됩니다.weights['node_1_0']weights['node_1_1'] 각기.

그런 다음 미리로드 된 가중치를 사용하여 숨겨진 노드에서 모델 출력을 생성합니다. weights['output'].

가중치 가중치 [ 'node_0_0']와 주어진 input_data를 사용하여 node_0_0_input을 계산합니다. 그런 다음 relu () 함수를 적용하여 node_0_0_output을 가져옵니다.

node_0_1_input에 대해 위와 동일하게 node_0_1_output을 얻습니다.

가중치 가중치 [ 'node_1_0']와 첫 번째 숨겨진 레이어의 출력 인 hidden_0_outputs를 사용하여 node_1_0_input을 계산합니다. 그런 다음 relu () 함수를 적용하여 node_1_0_output을 얻습니다.

node_1_1_input에 대해 위와 동일하게 node_1_1_output을 얻습니다.

weights [ 'output']과 두 번째 은닉층 hidden_1_outputs 배열의 출력을 사용하여 model_output을 계산합니다. 이 출력에 relu () 함수를 적용하지 않습니다.

import numpy as np
input_data = np.array([3, 5])
weights = {
   'node_0_0': np.array([2, 4]),
   'node_0_1': np.array([4, -5]),
   'node_1_0': np.array([-1, 1]),
   'node_1_1': np.array([2, 2]),
   'output': np.array([2, 7])
}
def predict_with_network(input_data):
   # Calculate node 0 in the first hidden layer
   node_0_0_input = (input_data * weights['node_0_0']).sum()
   node_0_0_output = relu(node_0_0_input)
   
   # Calculate node 1 in the first hidden layer
   node_0_1_input = (input_data*weights['node_0_1']).sum()
   node_0_1_output = relu(node_0_1_input)
   
   # Put node values into array: hidden_0_outputs
   hidden_0_outputs = np.array([node_0_0_output, node_0_1_output])
   
   # Calculate node 0 in the second hidden layer
   node_1_0_input = (hidden_0_outputs*weights['node_1_0']).sum()
   node_1_0_output = relu(node_1_0_input)
   
   # Calculate node 1 in the second hidden layer
   node_1_1_input = (hidden_0_outputs*weights['node_1_1']).sum()
   node_1_1_output = relu(node_1_1_input)
   
   # Put node values into array: hidden_1_outputs
   hidden_1_outputs = np.array([node_1_0_output, node_1_1_output])
   
   # Calculate model output: model_output
   model_output = (hidden_1_outputs*weights['output']).sum()
      # Return model_output
   return(model_output)
output = predict_with_network(input_data)
print(output)

산출

364