딥 러닝 튜토리얼: 퍼셉트론에서 딥 네트워크까지

게시 됨: 2022-03-11

최근 몇 년 동안 인공 지능 분야에서 부활이 있었습니다. Google, Microsoft 및 Facebook과 같은 주요 업체가 자체 연구 팀을 만들고 인상적인 인수를 함으로써 학계를 넘어 확산되었습니다.

그 중 일부는 소셜 네트워크 사용자가 생성한 풍부한 원시 데이터(그 중 많은 부분을 분석해야 함), 고급 데이터 과학 솔루션의 부상, GPGPU를 통해 사용할 수 있는 저렴한 계산 능력 때문일 수 있습니다.

그러나 이러한 현상 외에도 이러한 부활은 AI, 특히 "딥 러닝"으로 알려진 머신 러닝의 새로운 추세에 의해 거의 동력을 얻었습니다. 이 튜토리얼에서는 가장 단순한 구성 단위부터 시작하여 Java의 기계 학습 개념을 구축하는 딥 러닝의 핵심 개념과 알고리즘을 소개합니다.

(전체 공개: 저는 Java 딥 러닝 라이브러리의 저자이기도 합니다. 여기에서 볼 수 있으며 이 기사의 예제는 위의 라이브러리를 사용하여 구현됩니다. 마음에 들면 GitHub에서 별표를 주어 지원할 수 있습니다. , 감사합니다. 사용 지침은 홈페이지에 있습니다.)

기계 학습에 대한 30초 자습서

익숙하지 않은 경우 기계 학습에 대한 다음 소개를 확인하세요.

일반적인 절차는 다음과 같습니다.

  1. 레이블 1("개")이 있는 개의 이미지 10개와 레이블 0("개가 아님")이 있는 다른 사물의 이미지 10개와 같이 레이블이 지정된 몇 가지 예제가 제공되는 알고리즘이 있습니다. 이 게시물에 대한 감독된 이진 분류.
  2. 알고리즘은 개의 이미지를 식별하도록 "학습"하고 새 이미지가 제공되면 올바른 레이블을 생성하기를 희망합니다(개 이미지이면 1, 그렇지 않으면 0).

이 설정은 매우 일반적입니다. 데이터는 증상일 수 있고 레이블은 질병일 수 있습니다. 또는 데이터는 손으로 쓴 문자의 이미지와 레이블이 나타내는 실제 문자일 수 있습니다.

퍼셉트론: 초기 딥 러닝 알고리즘

가장 초기의 지도 학습 알고리즘 중 하나는 기본 신경망 구성 요소인 퍼셉트론의 알고리즘입니다.

평면에 '0'과 '1'로 표시된 n개의 점이 있다고 가정합니다. 새로운 포인트가 주어지고 그 레이블을 추측하려고 합니다(위의 "Dog" 및 "Not dog" 시나리오와 유사함). 어떻게 합니까?

한 가지 접근 방식은 가장 가까운 이웃을 보고 해당 지점의 레이블을 반환하는 것입니다. 그러나 조금 더 지능적인 방법은 레이블이 지정된 데이터를 가장 잘 구분하는 라인을 선택하고 이를 분류기로 사용하는 것입니다.

선형 분류기와 관련된 입력 데이터의 묘사는 딥 러닝에 대한 기본 접근 방식입니다.

이 경우, 입력 데이터의 각 조각은 벡터 x = ( x_1, x_2 )로 표현되고 우리의 함수는 "라인 아래에 있으면 '0', 위에 있으면 '1'과 같을 것입니다.

이것을 수학적으로 나타내기 위해 우리의 구분 기호는 가중치 w 와 수직 오프셋(또는 편향) b 의 벡터로 정의됩니다. 그런 다음 우리의 함수는 입력과 가중치를 가중치 합 전달 함수와 결합합니다.

가중 합계 전달 함수

이 전달 함수의 결과는 레이블링을 생성하기 위해 활성화 함수에 입력됩니다. 위의 예에서 활성화 함수는 임계값 컷오프였습니다(예: 어떤 값보다 크면 1).

이 전달 함수의 결과

퍼셉트론 훈련

퍼셉트론의 훈련은 여러 훈련 샘플을 제공하고 각각에 대한 출력을 계산하는 것으로 구성됩니다. 각 샘플 후에 가중치 w원하는 (목표) 출력과 실제 출력 간의 차이로 정의되는 출력 오류 를 최소화하는 방식으로 조정됩니다. 평균 제곱 오차와 같은 다른 오차 함수가 있지만 훈련의 기본 원칙은 동일하게 유지됩니다.

단일 퍼셉트론 단점

딥 러닝에 대한 단일 퍼셉트론 접근 방식에는 선형으로 분리 가능한 함수만 학습할 수 있다는 한 가지 주요 단점이 있습니다. 이 단점이 얼마나 중요한가요? 비교적 간단한 함수인 XOR을 사용하여 선형 구분 기호로 분류할 수 없음을 확인합니다(아래에서 실패한 시도 참고).

이 딥 러닝 접근 방식의 단점은 일부 기능을 선형 구분 기호로 분류할 수 없다는 것입니다.

이 문제를 해결하려면 피드포워드 신경망이라고도 하는 다층 퍼셉트론을 사용해야 합니다. 실제로 이러한 퍼셉트론 무리를 함께 구성하여 더 강력한 학습 메커니즘을 만들 것입니다.

딥 러닝을 위한 피드포워드 신경망

신경망은 실제로 다른 방식으로 연결되고 다른 활성화 기능에서 작동하는 퍼셉트론의 구성일 뿐입니다.

피드포워드 중립 네트워크 딥 러닝은 단일 퍼셉트론보다 더 복잡한 접근 방식입니다.

우선 다음과 같은 속성을 가진 피드포워드 신경망을 살펴보겠습니다.

  • 입력, 출력 및 하나 이상의 숨겨진 레이어. 위의 그림은 3단위 입력 레이어, 4단위 은닉 레이어 및 2단위 출력 레이어가 있는 네트워크를 보여줍니다(단위와 뉴런이라는 용어는 서로 바꿔 사용할 수 있습니다).
  • 각 단위는 위에서 설명한 것과 같은 단일 퍼셉트론입니다.
  • 입력층의 단위는 은닉층의 단위에 대한 입력 역할을 하고, 은닉층의 단위는 출력층의 입력으로 사용됩니다.
  • 두 뉴런 간의 각 연결에는 가중치 w 가 있습니다(퍼셉트론 가중치와 유사).
  • 레이어 t 의 각 단위는 일반적으로 이전 레이어 t - 1모든 단위에 연결됩니다(비록 가중치를 0으로 설정하여 연결을 끊을 수 있지만).
  • 입력 데이터를 처리하려면 입력 벡터를 입력 레이어에 "고정"하고 벡터 값을 각 입력 단위에 대한 "출력"으로 설정합니다. 이 특별한 경우에 네트워크는 3차원 입력 벡터를 처리할 수 있습니다(3개의 입력 단위로 인해). 예를 들어, 입력 벡터가 [7, 1, 2]인 경우 상단 입력 단위의 출력을 7로, 중간 단위를 1로 설정하는 식입니다. 그런 다음 이러한 값은 각 은닉 유닛에 대한 가중 합계 전달 함수를 사용하여 은닉 유닛으로 전달되고(따라서 순방향 전파라는 용어), 차례로 출력(활성화 함수)을 계산합니다.
  • 출력 레이어는 은닉 레이어와 같은 방식으로 출력을 계산합니다. 출력 레이어의 결과는 네트워크의 출력입니다.

선형성을 넘어서

각 퍼셉트론이 선형 활성화 함수만 사용할 수 있다면 어떻게 될까요? 그런 다음 네트워크의 최종 출력은 입력의 선형 함수 될 것이며 네트워크 전체에서 수집되는 다양한 가중치로 조정됩니다. 다시 말해, 선형 함수 묶음의 선형 구성은 여전히 ​​선형 함수일 뿐입니다. 선형 활성화 함수로 제한되는 경우 피드포워드 신경망은 레이어 수에 관계없이 퍼셉트론보다 강력하지 않습니다.

많은 선형 함수의 선형 구성은 여전히 ​​선형 함수이므로 대부분의 신경망은 비선형 활성화 함수를 사용합니다.

이 때문에 대부분의 신경망은 로지스틱, tanh, 이진 또는 정류기와 같은 비선형 활성화 함수를 사용합니다. 그것들이 없으면 네트워크는 입력의 선형 조합인 기능만 학습할 수 있습니다.

학습 퍼셉트론

다층 퍼셉트론의 지도 학습을 위한 가장 일반적인 딥 러닝 알고리즘은 역전파(backpropagation)로 알려져 있습니다. 기본 절차:

  1. 훈련 샘플이 제시되고 네트워크를 통해 앞으로 전파됩니다.
  2. 출력 오차는 일반적으로 평균 제곱 오차로 계산됩니다.

    평균 제곱 오차

    여기서 t 는 목표 값이고 y 는 실제 네트워크 출력입니다. 다른 오류 계산도 허용되지만 MSE가 좋은 선택입니다.

  3. 확률적 경사하강법(stochastic gradient descent)이라는 방법을 사용하여 네트워크 오류를 최소화합니다.

    경사하강법

    경사하강법은 보편적이지만 신경망의 경우 입력 매개변수의 함수로 훈련 오차의 그래프가 됩니다. 각 가중치에 대한 최적 값은 오류가 전역 최소값 에 도달하는 값입니다. 훈련 단계에서 가중치는 항상 전역 최소값에 도달하려고 시도하는 방식으로 작은 단계로 업데이트됩니다(각 훈련 샘플 또는 여러 샘플의 미니 배치 후). 그러나 이것은 쉬운 작업이 아닙니다. 종종 오른쪽과 같이 극소값으로 끝납니다. 예를 들어 가중치 값이 0.6이면 0.4로 변경해야 합니다.

    이 그림은 오류가 단일 매개변수에 의존하는 가장 단순한 경우를 나타냅니다. 그러나 네트워크 오류는 모든 네트워크 가중치에 따라 달라지며 오류 기능은 훨씬 훨씬 더 복잡합니다.

    고맙게도 역전파는 출력 오류와 관련하여 두 뉴런 간의 각 가중치를 업데이트하는 방법을 제공합니다. 파생 자체는 매우 복잡하지만 주어진 노드에 대한 가중치 업데이트는 다음과 같은 (단순한) 형식을 갖습니다.

    예시 양식

    여기서 E 는 출력 오류이고 w_i 는 뉴런에 대한 입력 i 의 가중치입니다.

    기본적으로 목표는 가중치 i 에 대한 기울기 방향으로 이동하는 것입니다. 물론 핵심 용어는 오류의 미분이며 항상 계산하기 쉽지는 않습니다. 대규모 네트워크 한가운데에 있는 임의의 숨겨진 노드의 임의 가중치에 대해 이 미분을 어떻게 찾을 수 있습니까?

    답: 역전파를 통해. 오류는 먼저 공식이 매우 간단한 출력 단위에서 계산된 다음(목표 값과 예측 값의 차이를 기반으로 함) 영리한 방식으로 네트워크를 통해 다시 전파되어 훈련 및 학습 중에 가중치를 효율적으로 업데이트할 수 있습니다. (바라건대) 최소에 도달하십시오.

은닉층

숨겨진 레이어가 특히 중요합니다. 보편적인 근사 정리에 의해, 유한한 수의 뉴런을 가진 단일 은닉층 네트워크는 임의의 랜덤 함수를 근사하도록 훈련될 수 있습니다. 즉, 하나의 은닉층은 어떤 기능도 학습할 수 있을 만큼 강력합니다. 즉, 우리는 여러 은닉층(즉, 더 깊은 네트)을 사용하여 실제로 더 잘 학습하는 경우가 많습니다.

은닉층은 네트워크가 훈련 데이터의 내부 추상 표현을 저장하는 곳입니다.

은닉층은 네트워크가 훈련 데이터의 내부 추상 표현을 저장하는 곳입니다. 이는 인간의 두뇌(매우 단순화된 비유)가 실제 세계의 내부 표현을 갖는 방식과 유사합니다. 앞으로 튜토리얼에서 우리는 숨겨진 레이어를 가지고 놀 수 있는 다양한 방법을 살펴볼 것입니다.

네트워크의 예

여기에서 testMLPSigmoidBP 메소드를 통해 Java로 구현된 IRIS 데이터셋을 분류하는 간단한(4-2-3 레이어) 피드포워드 신경망을 볼 수 있습니다. 데이터 세트에는 꽃받침 길이, 꽃잎 길이 등과 같은 특징을 가진 붓꽃 식물의 세 가지 클래스가 포함되어 있습니다. 네트워크에는 클래스당 50개의 샘플이 제공됩니다. 기능은 입력 단위에 고정되고 각 출력 단위는 데이터 세트의 단일 클래스에 해당합니다. "1/0/0"은 식물이 Setosa 클래스임을 나타내고, "0/1/0"은 Versicolour를 나타내고, " 0/0/1"은 버지니아를 나타냄). 분류 오류는 2/150입니다(즉, 150개 중 2개 샘플을 잘못 분류함).

대규모 네트워크의 문제

신경망에는 하나 이상의 숨겨진 레이어가 있을 수 있습니다. 이 경우 상위 레이어는 이전 레이어 위에 새로운 추상화를 "구축"합니다. 그리고 이전에 언급했듯이 더 큰 네트워크를 사용하면 실제로 더 잘 배울 수 있습니다.

그러나 숨겨진 레이어의 수를 늘리면 두 가지 알려진 문제가 발생합니다.

  1. 그라디언트 소실: 은닉층을 더 많이 추가함에 따라 하위 계층으로 정보를 전달하는 데 역전파가 점점 덜 유용해집니다. 실제로 정보가 다시 전달됨에 따라 기울기가 사라지기 시작하고 네트워크의 가중치에 비해 작아집니다.
  2. 과적합: 아마도 기계 학습의 핵심 문제일 것입니다. 간단히 말해서, 과적합은 너무 복잡한 가설로 훈련 데이터를 너무 가깝게 맞추는 현상을 설명합니다. 이러한 경우 학습자는 훈련 데이터를 정말 잘 맞추게 되지만 실제 예제에서는 훨씬 더 낮은 성능을 보입니다.

이러한 문제를 해결하기 위한 몇 가지 딥 러닝 알고리즘을 살펴보겠습니다.

오토인코더

대부분의 기계 학습 입문 수업은 피드포워드 신경망으로 끝나는 경향이 있습니다. 그러나 가능한 네트의 공간은 훨씬 더 풍부하므로 계속합시다.

자동 인코더는 일반적으로 데이터 세트의 압축된 분산 표현(인코딩) 학습을 목표로 하는 피드포워드 신경망입니다.

오토인코더는 데이터 세트의 특정 표현을 학습하는 것을 목표로 하는 신경 딥 러닝 네트워크입니다.

개념적으로 네트워크는 입력을 "재생성"하도록 훈련됩니다. 즉, 입력과 대상 데이터가 동일합니다. 다시 말해, 입력한 것과 동일한 것을 출력하려고 하지만 어떤 방식으로든 압축됩니다. 이것은 혼란스러운 접근 방식이므로 예를 살펴보겠습니다.

입력 압축: 회색조 이미지

훈련 데이터가 28x28 그레이스케일 이미지로 구성되고 각 픽셀의 값이 하나의 입력 레이어 뉴런에 고정되어 있다고 가정합니다(즉, 입력 레이어에는 784개의 뉴런이 있음). 그런 다음 출력 레이어는 입력 레이어와 동일한 수(784)의 단위를 가지며 각 출력 단위의 목표 값은 이미지의 한 픽셀의 회색조 값이 됩니다.

이 아키텍처 이면의 직관은 네트워크가 훈련 데이터와 해당 레이블 간의 "매핑"을 학습하지 않고 대신 데이터 자체의 내부 구조 와 기능을 학습한다는 것입니다. (이 때문에 은닉층을 특징 검출기( feature detector )라고도 한다.) 일반적으로 은닉 유닛의 개수는 입/출력 레이어보다 적기 때문에 네트워크가 가장 중요한 특징만을 학습하게 하고 차원 축소를 달성하게 된다.

중간에 있는 몇 개의 작은 노드가 개념적 수준에서 데이터를 학습하여 간결한 표현을 생성하기를 원합니다.

실제로 우리는 중간에 있는 몇 개의 작은 노드가 개념적 수준에서 데이터를 실제로 학습하여 입력의 핵심 기능을 어떤 방식으로든 캡처하는 간결한 표현을 생성하기를 원합니다.

독감 질병

오토인코더를 추가로 시연하기 위해 애플리케이션을 하나 더 살펴보겠습니다.

이 경우 독감 증상으로 구성된 간단한 데이터세트를 사용합니다(이 블로그 게시물에 대한 아이디어 제공). 관심이 있는 경우 이 예제의 코드는 testAEBackpropagation 메서드에서 찾을 수 있습니다.

데이터 세트가 분해되는 방식은 다음과 같습니다.

  • 6개의 바이너리 입력 기능이 있습니다.
  • 처음 세 가지는 질병의 증상입니다. 예를 들어, 1 0 0 0 0 0 은 이 환자가 고열을 나타내고, 0 1 0 0 0 0 은 기침을, 1 1 0 0 0 0 은 기침 고열 등을 나타냅니다.
  • 마지막 세 가지 특징은 "반대" 증상입니다. 환자가 이들 중 하나를 가지고 있으면 환자가 아플 가능성이 적습니다. 예를 들어, 0 0 0 1 0 0 은 이 환자가 독감 백신을 맞았음을 나타냅니다. 두 가지 기능 세트의 조합을 가질 수 있습니다. 0 1 0 1 0 0 은 기침이 있는 백신 환자를 나타냅니다.

환자가 처음 3가지 특징 중 2가지 이상을 갖고 있으면 환자가 아프고 두 번째 3가지 특징 중 2가지 이상이 있으면 환자로 간주합니다(건강한 환자에게 유리한 관계가 끊어짐). 예:

  • 111000, 101000, 110000, 011000, 011100 = 아프다
  • 000111, 001110, 000101, 000011, 000110 = 건강

우리는 6개의 입력 유닛과 6개의 출력 유닛을 가진 오토인코더(역전파 사용)를 훈련할 것입니다. 그러나 은닉 유닛은 2개뿐입니다 .

수백 번의 반복 후에 우리는 각각의 "아픈" 샘플이 기계 학습 네트워크에 표시될 때 두 개의 숨겨진 유닛(각 "아픈" 샘플에 대해 동일한 유닛) 중 하나가 항상 더 높은 활성화 값을 나타내는 것을 관찰했습니다. 다른. 반대로 "건강한" 샘플이 제시되면 다른 은닉 유닛의 활성화가 더 높습니다.

머신 러닝으로 돌아가기

기본적으로 두 개의 은닉 유닛은 독감 증상 데이터 세트의 간결한 표현을 학습 했습니다. 이것이 학습과 어떻게 관련되는지 보기 위해 과적합 문제로 돌아갑니다. 데이터의 간결한 표현을 배우도록 네트를 훈련함으로써 훈련 데이터를 과적합하는 매우 복잡한 가설보다 단순한 표현을 선호합니다.

어떤 면에서는 이러한 단순한 표현을 선호함으로써 보다 진정한 의미에서 데이터를 학습하려고 합니다.

제한된 Boltzmann 기계

다음 논리적 단계는 입력 집합에 대한 확률 분포를 학습할 수 있는 생성 확률적 신경망 인 제한된 볼츠만 기계(RBM)를 살펴보는 것입니다.

기계 학습에서 제한된 Botlzmann 기계는 보이는 단위와 숨겨진 단위로 구성됩니다.

RBM은 은닉층, 가시층, 편향층으로 구성된다. 피드포워드 네트워크와 달리 보이는 레이어와 숨겨진 레이어 사이의 연결은 방향이 없으며(값은 가시에서 숨김 및 숨김에서 가시 방향으로 전파될 수 있음) 완전 연결(주어진 레이어의 각 단위가 다음으로 연결됩니다. 다음의 각 유닛 - 만약 우리가 어떤 레이어의 어떤 유닛이 다른 레이어에 연결되도록 허용한다면, 우리는 ( 제한된 Boltzmann 기계가 아니라) Boltzmann을 갖게 될 것입니다.

표준 RBM에는 이진 숨김 및 가시 단위가 있습니다. 즉, 단위 활성화는 베르누이 분포에서 0 또는 1이지만 다른 비선형성을 가진 변형이 있습니다.

연구자들은 RBM에 대해 얼마 동안 알고 있었지만 최근 대조 발산 비지도 학습 알고리즘의 도입으로 새로운 관심이 생겼습니다.

대조적 발산

단일 단계 대조 발산 알고리즘(CD-1)은 다음과 같이 작동합니다.

  1. 긍정적인 단계 :
    • 입력 샘플 v 는 입력 레이어에 고정됩니다.
    • v 는 피드포워드 네트워크와 유사한 방식으로 은닉층으로 전파됩니다. 은닉층 활성화의 결과는 h 입니다.
  2. 부정적인 위상 :
    • 결과 v' 를 사용하여 h 를 가시 레이어로 다시 전파합니다(보이는 레이어와 숨겨진 레이어 사이의 연결은 방향이 없으므로 양방향으로 이동할 수 있습니다).
    • 새로운 v' 를 활성화 결과 h' 와 함께 은닉층으로 다시 전파합니다.
  3. 무게 업데이트 :

    체중 업데이트

    여기서 a 는 학습률이고 v , v' , h , h'w 는 벡터입니다.

알고리즘 이면의 직관은 양의 위상( v 주어진 h )이 실제 데이터에 대한 네트워크의 내부 표현을 반영한다는 것입니다. 한편, 음의 단계는 이 내부 표현( v' 주어진 h )을 기반으로 데이터를 재생성하려는 시도를 나타냅니다. 주요 목표는 생성된 데이터실제 세계 에 최대한 가깝게 하는 것이며 이는 가중치 업데이트 공식에 반영됩니다.

즉, 네트는 입력 데이터가 어떻게 표현될 수 있는지에 대한 인식이 어느 정도 있으므로 이러한 인식을 기반으로 데이터를 재생하려고 합니다. 재현이 현실에 충분히 가깝지 않으면 조정하고 다시 시도합니다.

독감으로 돌아가기

대조적 발산을 보여주기 위해 이전과 동일한 증상 데이터 세트를 사용합니다. 테스트 네트워크는 6개의 보이는 유닛과 2개의 숨겨진 유닛이 있는 RBM입니다. 우리는 보이는 레이어에 고정된 증상 v 로 대조 발산을 사용하여 네트워크를 훈련할 것입니다. 테스트하는 동안 증상이 다시 보이는 레이어에 표시됩니다. 그런 다음 데이터가 숨겨진 계층으로 전파됩니다. 은닉 유닛은 자동 인코더(가시 영역에서 은닉 레이어로 데이터 전파)와 매우 유사한 아키텍처인 아픈/건강한 상태를 나타냅니다.

수백 번의 반복 후에 우리는 자동 인코더와 동일한 결과를 관찰할 수 있습니다. 숨겨진 유닛 중 하나는 "병든" 샘플이 제시될 때 더 높은 활성화 값을 갖고 다른 하나는 "건강한" 샘플에 대해 항상 더 활성화됩니다.

이 예제는 testContrastiveDivergence 메서드에서 작동하는 것을 볼 수 있습니다.

딥 네트워크

우리는 이제 autoencoder와 RBM의 숨겨진 레이어가 효과적인 특징 탐지기 역할을 한다는 것을 보여주었습니다. 그러나 이러한 기능을 직접 사용할 수 있는 경우는 드뭅니다. 사실, 위의 데이터 세트는 규칙보다 더 예외적입니다. 대신 이러한 감지된 기능을 간접적으로 사용할 수 있는 방법을 찾아야 합니다.

운 좋게도 이러한 구조를 쌓아서 깊은 네트워크를 형성할 수 있다는 것이 발견되었습니다. 이러한 네트워크는 한 번에 한 계층씩 탐욕스럽게 훈련되어 고전적인 역전파와 관련된 과적합소실 기울기 문제를 극복하는 데 도움이 될 수 있습니다.

결과 구조는 종종 매우 강력하여 인상적인 결과를 생성합니다. 예를 들어, 레이블이 지정되지 않은 데이터를 기반으로 사람과 고양이 얼굴 감지를 "학습"하기 위해 특수한 종류의 딥 오토인코더를 사용하는 Google의 유명한 "고양이" 논문을 예로 들어 보겠습니다.

자세히 살펴보겠습니다.

스택형 자동 인코더

이름에서 알 수 있듯이 이 네트워크는 여러 개의 스택형 자동 인코더로 구성됩니다.

Stacked Autoencoder에는 기계 학습 결과에 기여하는 일련의 입력, 출력 및 숨겨진 레이어가 있습니다.

오토인코더 t 의 은닉층은 오토인코더 t + 1 에 대한 입력 레이어 역할을 합니다. 첫 번째 오토인코더의 입력 계층은 전체 네트워크에 대한 입력 계층입니다. greedy layer-wise 훈련 절차는 다음과 같이 작동합니다.

  1. 사용 가능한 모든 훈련 데이터와 함께 역전파 방법을 사용하여 첫 번째 자동 인코더( t=1 또는 위 그림의 빨간색 연결이지만 추가 출력 레이어가 있음)를 개별적으로 훈련합니다.
  2. 두 번째 자동 인코더 t=2 (녹색 연결)를 훈련합니다. t=2 에 대한 입력 레이어는 t=1 의 은닉 레이어이기 때문에 더 이상 t=1 의 출력 레이어에 관심이 없으며 네트워크에서 제거합니다. 훈련은 입력 샘플을 t=1 의 입력 계층에 고정하는 것으로 시작되며, 이는 t=2 의 출력 계층으로 전파됩니다. 다음으로, 역전파를 사용하여 t=2 의 가중치(input-hidden 및 hidden-output)를 업데이트합니다. t=2t=1 과 유사하게 모든 훈련 샘플을 사용합니다.
  3. 모든 레이어에 대해 이전 절차를 반복합니다(즉, 이전 자동 인코더의 출력 레이어를 제거하고 다른 자동 인코더로 교체하고 역전파로 학습).
  4. 1-3단계를 사전 훈련 이라고 하며 가중치는 적절히 초기화된 상태로 둡니다. 그러나 입력 데이터와 출력 레이블 사이에는 매핑이 없습니다. 예를 들어, 네트워크가 손으로 쓴 숫자의 이미지를 인식하도록 훈련된 경우 마지막 특징 탐지기(즉, 마지막 자동 인코더의 숨겨진 레이어)에서 이미지의 숫자 유형으로 단위를 매핑하는 것은 여전히 ​​불가능합니다. 이 경우 가장 일반적인 솔루션은 하나 이상의 완전히 연결된 레이어를 마지막 레이어(파란색 연결)에 추가하는 것입니다. 이제 전체 네트워크를 다층 퍼셉트론으로 볼 수 있으며 역전파를 사용하여 훈련됩니다(이 단계를 미세 조정 이라고도 함).

스택형 자동 인코더는 네트워크 가중치를 초기화하기 위한 효과적인 사전 훈련 방법을 제공하여 훈련(또는 미세 조정 )할 준비가 된 복잡한 다층 퍼셉트론을 남깁니다.

깊은 믿음 네트워크

오토인코더와 마찬가지로 Boltzmann 머신을 스택하여 DBN(Deep Belief Networks) 이라고 하는 클래스를 생성할 수도 있습니다.

깊은 믿음 네트워크는 Boltzmann 기계 스택으로 구성됩니다.

이 경우 RBM t 의 은닉층은 RBM t +1 에 대한 가시층 역할을 합니다. 첫 번째 RBM의 입력 레이어는 전체 네트워크의 입력 레이어이며 greedy layer-wise pre-training은 다음과 같이 작동합니다.

  1. 모든 훈련 샘플과 대조 발산을 사용하여 첫 번째 RBM t=1 을 훈련합니다.
  2. 두 번째 RBM t=2 를 훈련시킵니다. t=2 에 대한 가시 레이어는 t=1 의 은닉 레이어이므로 훈련은 입력 샘플을 t=1 의 가시 레이어에 고정하는 것으로 시작되며, 이는 t=1 숨겨진 레이어로 전파됩니다. 그런 다음 이 데이터는 t=2 에 대한 대조 발산 훈련을 시작하는 역할을 합니다.
  3. 모든 레이어에 대해 이전 절차를 반복합니다.
  4. 스택형 오토인코더와 유사하게 사전 훈련 후 네트워크는 하나 이상의 완전 연결 계층을 최종 RBM 은닉 계층에 연결하여 확장할 수 있습니다. 이것은 역전파를 사용하여 미세 조정할 수 있는 다층 퍼셉트론을 형성합니다.

이 절차는 스택형 자동 인코더의 절차와 유사하지만 자동 인코더가 RBM으로 대체되고 역전파가 대조 발산 알고리즘으로 대체됩니다.

(참고: stacked autoencoder 또는 deep belief network의 구성 및 훈련에 대한 자세한 내용은 여기에서 샘플 코드를 확인하십시오.)

컨볼루션 네트워크

최종 딥 러닝 아키텍처로 이미지 인식에 매우 적합한 특히 흥미롭고 특별한 종류의 피드포워드 네트워크인 컨볼루션 네트워크를 살펴보겠습니다.

컨볼루션 네트워크는 딥 러닝 피드포워드 네트워크의 특수 클래스입니다.
DeepLearning.net을 통한 이미지

컨볼루션 네트워크의 실제 구조를 보기 전에 먼저 이미지 필터 또는 연관된 가중치가 있는 정사각형 영역을 정의합니다. 필터는 전체 입력 이미지에 적용되며 종종 여러 필터를 적용합니다. 예를 들어, 주어진 입력 이미지에 4개의 6x6 필터를 적용할 수 있습니다. 그러면 좌표가 1,1인 출력 픽셀은 왼쪽 상단 모서리가 1,1인 입력 픽셀의 6x6 정사각형과 필터의 가중치(6x6 정사각형이기도 함)의 가중치 합입니다. 출력 픽셀 2,1은 왼쪽 상단 모서리가 2,1 등인 입력 정사각형의 결과입니다.

이를 통해 이러한 네트워크는 다음 속성으로 정의됩니다.

  • 컨볼루션 레이어 는 입력에 여러 필터 를 적용합니다. 예를 들어, 이미지의 첫 번째 컨볼루션 레이어에는 4개의 6x6 필터가 있을 수 있습니다. 이미지 전체에 적용된 하나의 필터 결과를 기능 맵 (FM)이라고 하며 기능 맵의 수는 필터의 수와 같습니다. 이전 레이어도 convolutional이면 필터가 가중치가 다른 모든 FM에 적용되므로 각 입력 FM은 각 출력 FM에 연결됩니다. 이미지 전체에 걸쳐 공유된 가중치 이면의 직관은 기능이 위치에 관계없이 감지되는 반면 필터의 다양성으로 인해 각각이 서로 다른 기능 세트를 감지할 수 있다는 것입니다.
  • 서브샘플링 레이어 는 입력의 크기를 줄입니다. 예를 들어, 입력이 32x32 이미지로 구성되고 레이어에 2x2의 서브샘플링 영역이 있는 경우 출력 값은 16x16 이미지가 됩니다. 즉, 입력 이미지의 4픽셀(각 2x2 정사각형)이 단일 출력으로 결합됩니다. 픽셀. 서브샘플링에는 여러 가지 방법이 있지만 가장 널리 사용되는 방법은 최대 풀링, 평균 풀링 및 확률적 풀링입니다.
  • 마지막 서브샘플링(또는 컨볼루션) 레이어는 일반적으로 하나 이상의 완전히 연결된 레이어에 연결되며, 마지막 레이어는 대상 데이터를 나타냅니다.
  • 훈련은 서브샘플링 레이어를 고려하고 해당 필터가 적용된 모든 값을 기반으로 컨볼루션 필터 가중치를 업데이트하는 수정된 역전파를 사용하여 수행됩니다.

여기에서 MNIST 데이터 세트(손으로 쓴 글자의 회색조 이미지)에 대해 훈련된(역전파로) 컨볼루션 네트워크의 몇 가지 예를 볼 수 있습니다. 특히 testLeNet* 방법(저는 약 2%의 낮은 오류율을 달성하므로 testLeNetTiny2 를 권장합니다. 비교적 짧은 시간에). 여기에 유사한 네트워크의 멋진 JavaScript 시각화도 있습니다.

구현

이제 가장 일반적인 신경망 변형을 다루었으므로 이러한 딥 러닝 구조를 구현하는 동안 발생하는 문제에 대해 조금 작성해 보겠습니다.

대체로 말하면, 딥 러닝 라이브러리를 만드는 제 목표는 다음 기준을 충족하는 신경망 기반 프레임워크를 구축하는 것이었습니다.

  • 다양한 모델을 표현할 수 있는 공통 아키텍처(예를 들어 위에서 본 신경망의 모든 변형).
  • 다양한 훈련 알고리즘(역전파, 대조 발산 등)을 사용할 수 있는 능력.
  • 괜찮은 성능.

이러한 요구 사항을 충족하기 위해 저는 소프트웨어 설계에 대해 계층적(또는 모듈식) 접근 방식을 취했습니다.

구조

기본 사항부터 시작하겠습니다.

  • NeuralNetworkImpl은 모든 신경망 모델의 기본 클래스입니다.
  • 각 네트워크에는 레이어 집합이 포함되어 있습니다.
  • 각 계층에는 연결 목록이 있습니다. 여기서 연결은 두 계층 간의 연결이므로 네트워크는 방향성 비순환 그래프입니다.

이 구조는 기존 피드포워드 네트워크와 RBM 및 ImageNet과 같은 보다 복잡한 아키텍처에 사용하기에 충분히 민첩합니다.

또한 계층이 둘 이상의 네트워크에 속할 수 있도록 합니다. 예를 들어, Deep Belief Network의 계층은 해당 RBM의 계층이기도 합니다.

또한 이 아키텍처를 통해 DBN은 사전 훈련 단계에서는 누적된 RBM 목록으로, 미세 조정 단계에서는 피드포워드 네트워크를 볼 수 있으므로 직관적으로 좋고 프로그래밍 방식으로 편리합니다.

데이터 전파

다음 모듈은 2단계 프로세스인 네트워크를 통한 데이터 전파를 처리합니다.

  1. 레이어의 순서를 결정합니다. 예를 들어, 다층 퍼셉트론에서 결과를 얻으려면 데이터가 입력 레이어에 "클램프"되고(따라서 이것이 계산될 첫 번째 레이어임) 출력 레이어까지 계속 전파됩니다. 역전파 동안 가중치를 업데이트하려면 출력 오류가 출력 계층에서 시작하여 너비 우선 순서로 모든 계층에 전파되어야 합니다. 이것은 다양한 그래프 탐색 방법을 사용하여 네트워크의 그래프 구조를 활용하는 LayerOrderStrategy 의 다양한 구현을 사용하여 달성됩니다. 몇 가지 예에는 너비 우선 전략과 특정 계층의 타겟팅이 포함됩니다. 순서는 실제로 계층 간의 연결에 의해 결정되므로 전략은 순서가 지정된 연결 목록을 반환합니다.
  2. 활성화 값을 계산합니다. 각 계층에는 연결 목록(이전 단계에서)과 입력 값(다른 계층에서)을 가져와 결과 활성화를 계산하는 연결된 ConnectionCalculator 가 있습니다. 예를 들어, 간단한 시그모이드 피드포워드 네트워크에서 은닉층의 ConnectionCalculator 는 입력 및 바이어스 레이어의 값(각각 입력 데이터와 1 의 배열)과 단위 사이의 가중치(완전히 연결된 경우)를 취합니다. 레이어에서 가중치는 실제로 완전 연결 연결에 Matrix 로 저장됨), 가중치 합을 계산하고 결과를 시그모이드 함수에 제공합니다. 연결 계산기는 다양한 전달(예: 가중 합, 컨볼루션) 및 활성화(예: 다층 퍼셉트론의 경우 로지스틱 및 tanh, RBM의 경우 이진) 기능을 구현합니다. 대부분 Aparapi를 사용하여 GPU에서 실행할 수 있으며 미니 배치 교육으로 사용할 수 있습니다.

Aparapi를 사용한 GPU 계산

앞서 언급했듯이 최근 몇 년 동안 신경망이 부활한 이유 중 하나는 신경망의 훈련 방법이 병렬 처리에 매우 도움이 되기 때문에 GPGPU를 사용하여 훈련 속도를 크게 높일 수 있기 때문입니다. 이 경우 GPU 지원을 추가하기 위해 Aparapi 라이브러리와 함께 작업하기로 결정했습니다.

Aparapi는 연결 계산기에 몇 가지 중요한 제한 사항을 부과합니다.

  • 기본 데이터 유형의 1차원 배열(및 변수)만 허용됩니다.
  • Aparapi Kernel 클래스 자체의 멤버 메서드만 GPU 실행 코드에서 호출할 수 있습니다.

따라서 대부분의 데이터(가중치, 입력 및 출력 배열)는 내부적으로 1차원 부동 배열을 사용하는 Matrix 인스턴스에 저장됩니다. 모든 Aparapi 연결 계산기는 AparapiWeightedSum (완전 연결 계층 및 가중 합 입력 함수용), AparapiSubsampling2D (서브샘플링 계층용) 또는 AparapiConv2D (컨볼루션 계층용)를 사용합니다. 이러한 제한 사항 중 일부는 이기종 시스템 아키텍처의 도입으로 극복할 수 있습니다. Aparapi는 또한 CPU와 GPU 모두에서 동일한 코드를 실행할 수 있습니다.

훈련

교육 모듈은 다양한 교육 알고리즘을 구현합니다. 이전 두 모듈에 의존합니다. For example, BackPropagationTrainer (all the trainers are using the Trainer base class) uses feedforward layer calculator for the feedforward phase and a special breadth-first layer calculator for propagating the error and updating the weights.

My latest work is on Java 8 support and some other improvements, will soon be merged into master.

결론

The aim of this Java deep learning tutorial was to give you a brief introduction to the field of deep learning algorithms, beginning with the most basic unit of composition (the perceptron) and progressing through various effective and popular architectures, like that of the restricted Boltzmann machine.

The ideas behind neural networks have been around for a long time; but today, you can't step foot in the machine learning community without hearing about deep networks or some other take on deep learning. Hype shouldn't be mistaken for justification, but with the advances of GPGPU computing and the impressive progress made by researchers like Geoffrey Hinton, Yoshua Bengio, Yann LeCun and Andrew Ng, the field certainly shows a lot of promise. There's no better time to get familiar and get involved like the present.

Appendix: Resources

If you're interested in learning more, I found the following resources quite helpful during my work:

  • DeepLearning.net: a portal for all things deep learning. It has some nice tutorials, software library and a great reading list.
  • An active Google+ community.
  • Two very good courses: Machine Learning and Neural Networks for Machine Learning, both offered on Coursera.
  • The Stanford neural networks tutorial.
Related: Schooling Flappy Bird: A Reinforcement Learning Tutorial