ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 딥 러닝 튜토리얼 : 퍼셉트론에서부터 딥 네트워크까지
    MACHINE LEARNING 2017. 10. 29. 08:18
    반응형

    이 문서는 영문으로된 내용을 구글 번역기를 활용하여 번역한 내용입니다. 
    개인적인 공부 및 추후 다시 볼 수 있도록 하기 위해 개인 블로그에 번역 내용을 옮겨 놓았습니다.
    원문과 내용이 다를시 책임지지 않으며, 저작권 문제가 발생시 언제든 삭제 될 수 있습니다. 

    원문보기 : https://www.toptal.com/machine-learning/an-introduction-to-deep-learning-from-perceptrons-to-deep-networks





    퍼셉트론에서 딥 네트워크에 이르기까지

    최근 몇 년 동안 인공 지능 분야의 부활이 있었습니다. Google, Microsoft, Facebook과 같은 주요 업체가 자체 연구 팀을 구성하고 인상적인 인수합병을 통해 학계를 넘어 확산되었습니다.
    소셜 네트워크 사용자가 생성한 풍부한 원시 데이터 때문일 수 있습니다. 대부분의 데이터는 분석이 필요 합니다. 뿐만 아니라 GPGPU를 통해 사용 가능한 값싼 계산 능력도 영향을 미쳤습니다.
    그러나 이러한 현상을 넘어서는 AI의 새로운 추세, 특히 "딥 러닝 (Deep Learning)"으로 알려진 기계 학습에서 이러한 재기가 뒷받침되었습니다. 이 튜토리얼에서는 깊은 학습의 핵심 개념과 알고리즘을 소개합니다. 가장 간단한 구성 단위부터 시작하여 Java의 기계 학습 개념을 구축합니다.
    (완전한 공개를 위해 : 나는 여기에서 얻을 수 있는 자바 심화 학습 라이브러리의 저자이기도하며 이 기사의 예제는 위의 라이브러리를 사용하여 구현됩니다. 당신이 원한다면 GitHub에서 별을 제공함으로써 그것을 지원할 수있습니다. 나는 감사할 것입니다. 사용 방법은 홈페이지에서 이용 가능합니다.)

    기계 학습에 관한 30 초 튜토리얼

    다음에 익숙하지 않은 경우 기계 학습에 대한 소개를 확인하십시오.
    일반적인 절차는 다음과 같습니다.
    1. 몇 가지 알고리즘 예제가 있는데, 라벨 1(“개")의 개 이미지 10 개와 라벨 0("개가 아님")을 가진 다른 것들의 10 개 이미지를 말하십시오. — 우리가 주로 이 게시물에 대한 supervised 이진 분류(binary classification)에 집중하고 있음을 나타냅니다.
    2. 이 알고리즘은 개 이미지를 식별하기 위해 "학습"하고 새 이미지를 입력하면 올바른 라벨을 생성하기를 원합니다. (개 이미지라면 1, 그렇지 않으면 0)
    이 설정은 대단히 일반적입니다. 데이터가 증상일 수 있으며 라벨이 질병일 수 있습니다. 또는 데이터는 손으로 쓴 문자의 이미지일 수 있고 레이블은 실제 문자를 나타낼 수 있습니다.

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

    가장 초기에 감독된(supervised) 학습 알고리즘 중 하나는 기본 뉴럴 네트워크 빌딩 블록인 퍼셉트론(perceptron)의 알고리즘입니다.
    우리가 '0'과 '1'이라고 표시된 평면에 n 개의 점이 있다고 가정 해보십시오. 우리는 새로운 점을 얻었고 라벨을 추측 하려고 합니다. (위의 "개"및 "개가 아닌"시나리오와 유사함) 어떻게 해야 합니까?
    한 가지 방법은 가장 가까운 이웃을 보고 그 점의 레이블을 반환하는 것입니다. 그러나 좀 더 지능적인 방법은 분류된 데이터를 가장 잘 구분하는 선을 선택하여 이를 분류자(classifier)로 사용하는 것입니다.
    이 경우, 각 입력 데이터는 vector x = (x_1, x_2) 로 표현 될 것이고 우리의 함수는 라인 아래에 '0', 라인 위의 경우 '1'과 같은 형태가 될 것입니다.
    이것을 수학적으로 표현하기 위해 우리의 분리 기호를 가중치 w와 수직 오프셋(또는 바이어스) b로 정의합니다. 그러면 우리 함수는 입력과 가중치를 가중치 합계 전달 함수와 결합 합니다.
    이 전달 함수의 결과는 라벨을 생성하는 활성화 함수로 공급됩니다. 위의 예에서 활성화 기능은 임계 값입니다. (예 : 특정 값보다 큰 경우 1)

    퍼셉트론 학습

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

    단일 퍼셉트론 결점

    딥 러닝에 대한 단일 퍼셉트론 접근법은 선형 분리(linearly separable) 가능 함수만 배울 수 있다라는 중요한 단점을 가지고 있습니다. 이 단점은 얼마나 중요한가? 상대적으로 단순한 함수인 XOR을 사용하면 선형 분리 기호로 분류 할 수 없다는 것을 알 수 있습니다 (아래의 실패한 시도에 유의하십시오).
    이 문제를 해결하려면 피드 포워드 신경 네트워크 라고도 하는 다중 레이어 퍼셉트론을 사용해야합니다. 사실상 학습을 위한 더 강력한 메커니즘을 만들기 위해 이러한 퍼셉트론을 함께 구성 할 것입니다.

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

    신경망은 실제로 여러 가지 방식으로 연결되고 다른 활성화 기능으로 작동하는 퍼셉트론의 구성물입니다.
    우선, 다음과 같은 특성을 갖는 피드 포워드 신경망을 살펴 보겠습니다.
    • 입력, 출력 및 하나 이상의 숨겨진 레이어. 위의 그림은 3단위 입력 레이어, 4단위 은닉층 레이어 및 2단위 출력 레이어가(단위 및 뉴런은 상호 교환 가능) 있는 네트워크를 보여줍니다.
    • 각 단위는 위에서 설명한 것과 같은 단일 퍼셉트론입니다.
    • 입력 레이어의 단위는 은닉층 레이어 단위에 대한 입력으로 사용되며, 은닉층 레이어 단위는 출력 레이어에 대한 입력입니다.
    • 두 뉴런 간의 각 연결에는 가중치 w(perceptron weight와 유사)가 있습니다.
    • 레이어 t의 각 단위는 일반적으로 이전 레이어 t-1의 모든 단위에 연결됩니다 (가중치를 0으로 설정하여 연결을 끊을 수도 있음).
    • 입력 데이터를 처리하려면 입력 벡터를 입력 레이어에 "고정"하고 벡터의 값을 각 입력 단위의 "출력"으로 설정합니다. 이 경우에 네트워크는 3 차원 입력 벡터를 처리(3 개의 입력 단위로 인해) 할 수 있습니다. 예를 들어 입력 벡터가 [7, 1, 2]이면 상단 입력 단위의 출력을 7로 설정하고, 중간 단위는 1로 설정하는 등의 작업을 수행 할 수 있습니다. 그런 다음 이 값은 각 은닉층 유닛에 대한 가중 합계 전달 함수(따라서 순방향 전달이라는 용어) 를 사용하여 은닉층 유닛으로 전달됩니다. 그러면 전달 출력이 차례대로 계산(활성화 함수) 됩니다. 
    • 출력 레이어는 은닉층 레이어와 같은 방식으로 출력을 계산합니다. 출력 계층의 결과는 네트워크의 출력입니다.

    선형성 너머

    각 퍼셉트론이 선형 활성화 함수만 사용할 수 있다면 어떨까요? 그러면 네트워크의 최종 출력은 여전히 네트워크 전체에서 수집되는 다양한 가중치로 조정된 입력의 선형 함수입니다. 다시 말해, 일련의 선형 함수의 선형 구성은 여전히 단순한 선형 함수입니다. 선형 활성화 함수로 제한된다면 피드 포워드 신경망은 얼마나 많은 레이어를 가지고 있더라도 퍼셉트론보다 강력하지 않습니다.
    선형 함수 묶음의 선형 구성은 여전히 선형 함수이므로 대부분의 신경망은 비선형 활성화 함수를 사용합니다.
    이 때문에 대부분의 신경망은 logistic, tanh, binary 또는 rectifier와 같은 비선형 활성화 기능을 사용합니다. 이것들이 없으면 네트워크는 입력의 선형 조합인 기능만 학습 할 수 있습니다.

    학습 퍼셉트론

    다층 퍼셉트론의 감독 학습(supervised training)을 위한 가장 일반적인 심층 학습 알고리즘은 역전파(backpropagation)로 알려져 있습니다. 기본 절차 :
    1. 학습 샘플이 제시되고 네트워크를 통해 전달(propagate)됩니다.
    2. 일반적으로 평균 제곱 오차(MSE)를 사용하여 출력 오차가 계산됩니다.



      여기서 t는 목표 값이고 y는 실제 네트워크 출력입니다. 다른 오류 계산도 가능하지만 MSE가 좋은 선택입니다.
    3. Stochastic gradient descent라는 방법을 사용하여 네트워크 오류를 최소화합니다.


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

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

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



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

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

      대답은 역전파를 통해서 입니다. 오류는 공식이 매우 간단하고 (목표 값과 예측 값의 차이에 따라) 출력 단위에서 먼저 계산 된 다음 네트워크를 통해 현명한 방식으로 전파되어 학습 도중 가중치를 효율적으로 업데이트 할 수 있습니다. (잘하면) 최소에 도달합니다.

    은닉층 레이어

    숨겨진 레이어는 특히 중요합니다. 보편적 근사 정리에 의해, 유한 수의 뉴런을 갖는 단일 은닉층 네트워크는 임의의 함수를 근사화하도록 훈련 될 수 있습니다. 이 말은 하나의 은닉층 레이어는 모든 기능을 배우기에 충분히 강력하다 입니다. 즉, 우리는 종종 여러 개의 은닉층 레이어로(즉, 더 깊은 그물) 더 잘 학습 하게 합니다.
    은닉층 레이어는 네트워크가 학습한 데이터의 내부 추상 표현을 저장하는 곳입니다.
    은닉층 레이어는 네트워크가 학습 데이터를 내부 추상 표현으로 저장하는 곳으로, 인간의 뇌 (크게 단순화 된 유추)가 실제 세계의 내부 표현을 갖는 방식과 유사합니다. 튜토리얼에서 앞으로 은닉층 레이어를 가지고 놀 수 있는 다양한 방법을 살펴 보겠습니다.

    예제 네트워크

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

    대형 네트워크의 문제점

    신경망은 하나 이상의 은닉층 레이어를 가질 수 있습니다.이 경우 상위 레이어는 이전 레이어의 맨 위에 새로운 추상화를 "구축"합니다. 이전에 언급했듯이 대규모 네트워크의 경우 실제로 더 잘 학습 할 수 있습니다.
    그러나 은닉층 레이어의 수를 늘리면 두 가지 알려진 문제가 발생합니다.
    1. 사라지는 경사(Vanishing gradients) : 점점 더 숨겨진 레이어를 추가함에 따라 역전파는 정보를 하위 레이어로 전달하는 데 점점 덜 유용 해집니다. 결과적으로, 정보가 다시 전달되면, 경사는 사라지고 네트워크의 가중치에 비해 상대적으로 작아지기 시작합니다.
    2. 오버피팅(Overfitting) : 기계 학습의 핵심 문제입니다. 간단히 말하면, 오버피팅은 훈련 데이터를 너무 가깝게 맞추는 현상을 설명합니다. 아마도 너무 복잡한 가설을 가지고 있을 수 있습니다. 이 경우 학습자는 교육 데이터를 실제로 잘 맞추지만 실제 데이터는 잘 맞추지 못합니다. 
    이러한 문제를 해결하기 위한 몇 가지 딥 러닝 알고리즘을 살펴 보겠습니다.

    Autoencoders

    대부분의 입문 기계 학습 클래스는 피드 포워드 신경 네트워크로 멈추는 경향이 있습니다. 그러나 가능한 그물의 공간은 훨씬 더 풍부합니다. 그래서 계속하겠습니다.
    Autoencoder는 일반적으로 데이터 집합의 압축된(인코딩) 분산 표현을 학습하는 것을 목표로 하는 피드 포워드 신경망입니다.
    개념적으로, 네트워크는 입력을 "재생성"하도록, 즉 입력 및 목표 데이터가 동일하도록 학습됩니다. 다른 말로하면 : 당신이 입력했던 것과 똑같은 것을 출력 하려 하지만, 어떤식으로든 압축되었습니다. 이것은 혼란스러운 접근법이므로 예제를 살펴 보겠습니다.

    입력 압축 : 그레이스케일 이미지

    학습 데이터가 28x28 그레이스케일 이미지로 구성되어 있고 각 픽셀의 값이 하나의 입력 레이어 뉴런에 고정되어 있다고 가정 해 보겠습니다 (즉, 입력 레이어에는 784 개의 뉴런이 있음). 그 다음, 출력 레이어는 입력 레이어와 동일한 수의 유닛 (784)을 가지며 각 출력 유닛에 대한 목표 값은 이미지의 한 픽셀의 그레이 스케일 값이 됩니다.
    이 아키텍처는 네트워크가 교육 데이터와 해당 레이블 간의 "매핑"을 배우지 않지만 데이터 자체의 내부 구조와 기능을 배우게 된다는 것입니다. (숨겨진 레이어는 피쳐 감지기 라고도 합니다.) 일반적으로 숨겨진 유닛의 수가 입력/출력 레이어보다 작기 때문에 네트워크에서 가장 중요한 기능만 배우고 차원 감소를 가져옵니다.
    중간에 있는 작은 노드 몇 개가 개념적 수준에서 데이터를 학습하여 압축된 표현을 생성 하기를 바랍니다.
    사실상 중간에 있는 몇 개의 작은 노드가 개념적 수준에서 데이터를 실제로 배우고, 어떤식으로든 우리 입력의 핵심 기능을 포착하는 간결한 표현을 생성 하기를 원합니다.

    독감 질환

    Autoencoder를 더 설명하기 위해 하나 이상의 응용 프로그램을 살펴 보겠습니다.
    이 경우 독감 증상으로 구성된 간단한 데이터 세트를 사용합니다 (이 블로그 게시물의 아이디어에 대한 크레딧). 관심이 있다면,이 예제의 코드는 testAEBackpropagation 메소드에서 찾을 수 있습니다.
    Here’s how the data set breaks down:
    • 여섯 자리 이진 입력 기능이 있습니다.
    • 처음 세 가지는 질병의 증상입니다. 예를 들어, 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은 기침이 있는 독감 백신 접종 환자를 나타냅니다.
    처음 세 가지 기능 중 적어도 두 가지가 있을 때 환자는 아플 것이고, 두 번째 세 개 중 두 개 이상을 가지고 있으면 건강할 것이라고 생각합니다 (건강한 환자에게 호의를 보이는 관계). 예 :
    • 111000, 101000, 110000, 011000, 011100 = sick
    • 000111, 001110, 000101, 000011, 000110 = healthy
    우리는 6 개의 입력과 6 개의 출력 유닛을 가진 Autoencoder(backpropagation을 사용)로 학습 할 것입니다. 그러나, 숨겨진 유닛은 오직 두개입니다.
    수 백 회 반복 한 결과, 각 “sick” 샘플이 기계 학습 네트워크에 제공 될 때 숨겨진 두 단위 (각 “sick” 표본에 대해 동일한 단위) 중 하나가 항상 더 높은 활성화 값을 나타냅니다. 반대로, “healthy” 샘플이 제시 될 때, 다른 숨겨진 유닛이 더 높은 활성화 값을 가집니다.

    기계 학습으로 돌아와서

    본질적으로 두개의 숨겨진 유닛은 독감 증상 데이터 집합을 간결하게 나타냅니다. 이것이 학습과 어떻게 관련 되는지 보기 위해, 우리는 오버피팅 문제로 돌아갑니다. 데이터를 간결하게 표현하기 위해 우리의 네트워크를 학습함으로써, 우리는 학습 데이터에 과장되는 매우 복잡한 가설보다는 단순한 표현을 선호합니다.
    이러한 단순한 표현을 선호함으로써 우리는 보다 의미있는 데이터를 배우려고합니다.

    Restricted Boltzmann Machines

    다음 논리적 단계는 입력 집합에 대한 확률 분포를 배울 수있는 생성적 확률적 신경망인 제한된 볼츠만 기계(RBM)를 살펴 보는 것입니다.
    RBM은 hidden, visible 및 bias 레이어로 구성됩니다. 피드 포워드 네트워크와는 달리 가시적(visible) 레이어와 숨겨진(hidden) 레이어 간의 연결은 방향이 없습니다 (값은 보이는대로 숨겨지고 숨겨진 방향으로 전파 될 수 있음). 그리고, 완전히 연결되어 있습니다 (주어진 레이어의 각 유닛은 다음 레이어의 각 유닛에 연결됩니다.—어떤 레이어의 어떤 유닛이 다른 레이어에 연결하도록 허용했다면, 볼츠만을 가질 수 있습니다 (제한된 볼츠만이 아닌).)
    표준 RBM에는 이진 숨김 및 표시 단위가 있습니다. 즉, 베르누이 분포에서 단위 활성화가 0 또는 1이지만 다른 비선형성이 있는 변형이 있습니다.
    연구자들이 RBM에 대해 이미 알고있는 동안, 최근에 도입된 contrastive divergence 무감독(unsupervised) 훈련 알고리즘은 새로운 관심을 불러 일으켰습니다.

    Contrastive Divergence

    단일 단계 contrastive divergence 알고리즘 (CD-1)은 다음과 같이 작동합니다.
    1. Positive phase:
      • 입력 샘플 v는 입력 레이어에 고정됩니다.
      • v는 피드 포워드 네트워크와 유사한 방식으로 숨겨진 계층으로 전파됩니다. 숨겨진 계층 활성화의 결과는 h입니다.
    2. Negative phase:
      • 결과를 v'로 가시적 레이어에 전파하십시오 (가시적 레이어와 숨겨진 레이어 사이의 연결은 방향이 지정되지 않으므로 양방향으로 이동할 수 있음).
      • 활성화 결과 h'를 사용하여 새 v'를 숨겨진 레이어로 전파하십시오.
    알고리즘 뒤에있는 직감은 positive phase (h가 주어진 v)는 실제 데이터의 네트워크 내부 표현을 반영한다는 것입니다. 한편, negative phase는 이 내부 표현 (v’이 주어진  h)을 기반으로 데이터를 다시 작성하려는 시도를 나타냅니다. 주요 목표는 생성된 데이터를 가능한 한 실제 세계에 가깝게 하는 것이고 이것은 가중치 갱신 공식에 반영됩니다.
    즉, 네트워크는 입력 데이터가 어떻게 표현 될 수 있는지에 대한 인식을 가지고 있으므로, 이 인식에 기반하여 데이터를 재현하려고합니다. 그것의 재생산이 현실에 충분히 근접하지 않으면, 그것은 조정을 하고 다시 시도합니다.

    독감으로 돌아가서

    Contrastive Divergence을 입증하기 위해 이전과 동일한 증상 데이터 세트를 사용합니다. 테스트 네트워크는 6개의 가시적 유닛과 2개의 숨겨진 유닛이 있는 RBM입니다. 가시적 층에 고정된 증상과 함께 Contrastive Divergence을 사용하여 네트워크를 훈련 할 것입니다. 테스트하는 동안 증상은 다시 가시적 레이어에 표시됩니다. 그런 다음 데이터가 숨겨진 계층에 전파됩니다. 숨겨진 유닛은 sick/healthy 상태를 나타내며, autoencoder와 매우 유사한 아키텍처입니다 (보이는 레이어에서 숨겨진 레이어로 데이터 전파).
    수백 회 반복 한 후에는 autoencoder와 동일한 결과를 볼 수 있습니다. “healthy” 샘플에 대해 다른 샘플이 항상 활성화 되어 있는 동안 숨겨진 유닛 중 하나는 “sick” 샘플이 제시 될 때 활성화 값이 더 높습니다.
    이 예제는 testContrastiveDivergence 메소드에서 작동하는 것을 볼 수 있습니다.

    딥 네트워크

    이제 Autoencoder와 RBM의 숨겨진 계층이 효과적인 기능 감지기로 작동 함을 입증했습니다. 이러한 기능을 직접 사용할 수있는 경우는 거의 없습니다. 사실 위에 설정된 데이터는 규칙보다 예외입니다. 대신, 우리는 이러한 감지된 기능을 간접적으로 사용하는 방법을 찾아야합니다.
    다행히도 이러한 구조가 겹쳐져(stack) 딥 네트워크를 형성 할 수 있다는 것이 발견되었습니다. 이러한 네트워크는 한 번에 한 계층 씩 열심히 훈련 할 수 있으며, 고전적인 역전파와 관련된 사라지는 경사(vanishing gradient)오버피팅 문제를 극복하는 데 도움이됩니다.
    결과 구조물은 종종 매우 강력하고 인상적인 결과를 만들어냅니다. 예를 들어 레이블이 없는 데이터를 기반으로 사람과 고양이의 얼굴 탐지를 “배우는” 특별한 종류의 딥 오토인코더를 사용하는 Google의 유명한 “고양이” 페이퍼를 예로 들어 보겠습니다.
    좀 더 자세히 살펴 보겠습니다.

    겹쳐진 Autoencoder(Stacked Autoencoders)

    이름에서 알 수 있듯이 이 네트워크는 여러 개의 겹쳐진 Autoencoder로 구성됩니다.
    Autoencoder t의 숨겨진 레이어는 Autoencoder t + 1에 대한 입력 레이어로 작동합니다. 첫 번째 Autoencoder의 입력 레이어는 전체 네트워크에 대한 입력 레이어입니다. 욕심 많은 계층 별 교육 과정은 다음과 같이 작동합니다.
    1. 사용 가능한 모든 교육 데이터로 역전파 방법을 사용하여 첫 번째 Autoencoder (t=1 또는 위의 그림에서 빨간색 연결은 추가 출력 레이어가 있음)를 교육합니다.
    2. 두 번째 Autoencoder t=2 (녹색 연결)를 교육하십시오. t=2에 대한 입력 레이어가 t=1의 숨겨진 레이어이기 때문에 더 이상 t=1의 출력 레이어에 관심이 없고 네트워크에서 제거됩니다. 교육은 입력 샘플을 t=1의 입력 레이어에 고정시키는 것으로 시작되며,이 레이어는 t=2의 출력 레이어로 전달됩니다. 다음으로 t=2의 가중치 (입력 숨김 및 숨김 출력)가 역전파를 사용하여 업데이트됩니다. t=2는 t=1과 유사하게 모든 트레이닝 샘플을 사용합니다.
    3. 모든 레이어에 대해 이전 절차를 반복합니다 (예 : 이전 Autoencoder의 출력 레이어를 제거하고 다른 Autoencoder로 대체 한 후 역전파로 학습).
    4. 1 ~ 3 단계를 사전 교육(pre-training)이라고하며 가중치를 적절하게 초기화 된 상태로 두십시오. 그러나 입력 데이터와 출력 레이블 간에는 매핑이 없습니다. 예를 들어, 네트워크가 손으로 쓴 자릿수의 이미지를 인식하도록 훈련 된 경우, 마지막 특징 검출기 (즉, 마지막 Autoencoder의 숨겨진 층)에서 이미지의 자릿수 유형으로 유닛을 매핑 할 수 없습니다. 이 경우 가장 일반적인 해결책은 하나 이상의 완전히 연결된 레이어를 마지막 레이어에 추가하는 것입니다 (파란색 연결). 전체 네트워크는 이제 다중 레이어 퍼셉트론으로 볼 수 있으며 역전파를 사용하여 교육을 받습니다 (이 단계를 미세 조정이라고도 함).
    겹쳐진 Autoencoder는 네트워크의 가중치를 초기화하는 효과적인 사전 학습 방법을 제공하여 훈련 할 준비가 된 복잡한 다중 레이어 퍼셉트론을 제공합니다 (또는 미세 조정).

    Deep Belief Networks

    Autoencoder와 마찬가지로 볼츠만 (Boltzmann) 시스템을 겹쳐서 Deep Belief Networks(DBN)라고 하는 클래스를 만들 수 있습니다.
    이 경우 RBM t의 숨겨진 계층은 RBM t+1에 대한 가시적 계층으로 작동합니다. 첫 번째 RBM의 입력 레이어는 전체 네트워크의 입력 레이어이고 욕심 많은 레이어 방식의 사전 교육은 다음과 같이 작동합니다.
    1. 모든 훈련 표본과 함께 contrastive divergence을 사용하여 첫 번째 RBM t=1을 교육하십시오.
    2. 두 번째 RBM t=2를 훈련 시키십시오. t=2에 대한 보이는 레이어는 t=1의 숨겨진 레이어이므로 입력 샘플을 t=1의 가시적 인 레이어에 클램핑함으로써 시작되며, 이는 t=1의 숨겨진 레이어로 전달됩니다. 이 데이터는 t=2에 대한 contrastive divergence훈련을 시작하는 역할을합니다.
    3. 모든 레이어에 대해 이전 절차를 반복합니다.
    4. 겹쳐진 Autoencoder와 마찬가지로 사전 교육을 한 후 하나 이상의 완전 연결된 레이어를 최종 RBM 숨겨진 레이어에 연결하여 네트워크를 확장 할 수 있습니다. 이것은 다중 레이어 퍼셉트론을 형성하며, 이는 역전파를 사용하여 미세 조정될 수있습니다.
    이 절차는 겹쳐진 Autoencoder와 비슷하지만 Autoencoder를 RBM으로 대체하고 역전파를 contrastive divergence 알고리즘으로 대체했습니다.
    (참고 : 겹쳐진 Autoencoder 또는 Deep Belief Network를 구축하고 교육하는 방법에 대한 자세한 내용은 여기에서 샘플 코드를 확인하십시오.)

    Convolutional Networks

    최종 심화 학습 아키텍처로서 이미지 인식에 매우 적합한 피드 포워드 네트워크의 특히 흥미롭고 특별한 클래스인 Convolutional Network를 살펴 보겠습니다.
    Image via DeepLearning.net
    Convolutional Network의 실제 구조를 살펴보기 전에 먼저 이미지 필터 또는 관련 가중치가있는 사각형 영역을 정의합니다. 필터는 전체 입력 이미지에 적용되며 여러 필터를 적용하는 경우가 많습니다. 예를 들어 주어진 입력 이미지에 4개의 6x6 필터를 적용 할 수 있습니다. 그런 다음 좌표가 1,1 인 출력 픽셀은 왼쪽 위 모서리가 1,1,6 인 입력 픽셀의 6x6 제곱과 필터의 가중치 (또한 6x6 정사각형)의 가중치 합계입니다. 출력 픽셀 2,1은 왼쪽 위 구석 2,1과 같은 입력 사각형의 결과입니다.
    이 네트워크는 다음 특성으로 정의됩니다.
    • Convolutional layers는 많은 필터를 입력에 적용합니다. 예를 들어, 이미지의 첫 번째 Convolutional layer는 4개의 6x6 필터를 가질 수 있습니다. 이미지 전체에 적용된 하나의 필터 결과는 피쳐 맵 (feature map, FM)이라고 부르며 피쳐 맵의 수는 필터 수와 같습니다. 이전 레이어가 또한 convolutional이라면, 필터는 가중치가 다른 모든 FM에 걸쳐 적용되므로 각 입력 FM은 각 출력 FM에 연결됩니다. 이미지 전반에 걸쳐 공유 가중치의 직관력은 위치에 관계없이 기능이 감지되는 반면 필터의 다양성으로 인해 각기 다른 기능 세트를 감지 할 수 있다는 것입니다.
    • Subsampling layers는 입력 크기를 줄입니다. 예를 들어, 입력이 32x32 이미지로 구성되고 레이어의 서브 샘플링 영역이 2x2 인 경우, 출력 값은 16x16 이미지입니다. 즉, 입력 이미지의 4 픽셀 (각 2x2 제곱)이 단일 출력 픽셀로 결합됩니다. 서브 샘플링하는 방법은 여러 가지가 있지만 가장 많이 사용되는 방법은 최대 풀링, 평균 풀링확률적 풀링입니다.
    • 마지막 서브 샘플링 (또는 컨볼 루션) 레이어는 일반적으로 하나 이상의 완전히 연결된 레이어에 연결되며 마지막 레이어는 대상 데이터를 나타냅니다.
    • 학습은 서브 샘플링 레이어를 고려한 수정 된 역전파를 사용하여 수행되며 해당 필터가 적용되는 모든 값을 기반으로 convolutional 필터 가중치를 업데이트합니다.
    MNIST 데이터 세트 (손으로 쓴 글자의 회색 음영 이미지)에서 훈련 된 (뒤 전재와 함께) 컨벌루션 네트워크의 몇 가지 예를 볼 수 있으며, 특히 testLeNet* 메소드 (testLeNetTiny2는 비교적 짧은 기간 동안 약 2 %의 낮은 오류율을 달성 할 수 있으므로 권장합니다). 유사한 네트워크에 대한 훌륭한 자바 스크립트 시각화도 있습니다.

    이행

    이제 가장 일반적인 신경 회로망 변종에 대해 살펴 보았으므로 이러한 심층적인 학습 구조를 구현하는 과정에서 제기되는 문제점에 대해 간단히 설명하겠습니다.
    대체로, 딥 러닝 라이브러리를 만드는 나의 목표는 다음과 같은 기준을 충족시키는 신경망 기반 프레임 워크를 구축하는 것이 었습니다.
    • 다양한 모델을 표현할 수있는 공통 아키텍처 (예 : 위에서 본 신경망의 모든 변형).
    • 다양한 훈련 알고리즘 (역전파, contrastive divergence 등)을 사용할 수있는 능력.
    • 괜찮은 성능.
    이러한 요구 사항을 충족시키기 위해 소프트웨어 설계에 단계별 (또는 모듈식) 방식을 사용했습니다.

    구조

    기본 사항부터 살펴 보겠습니다.
    • NeuralNetworkImpl은 모든 신경망 모델의 기본 클래스입니다.
    • 각 네트워크에는 일련의 레이어가 있습니다.
    • 각 계층에는 연결 목록이 있습니다. 여기서 연결은 두 계층 간의 링크로, 네트워크는 비순환적으로 지정된 그래프입니다.
    이 구조는 RBMImageNet과 같은 보다 복잡한 아키텍처뿐만 아니라 고전적인 피드 포워드 네트워크에 사용하기에 충분할 정도로 민첩합니다.
    또한 레이어가 둘 이상의 네트워크의 일부가 될 수 있습니다. 예를 들어, Deep Belief Network의 계층도 해당 RBM의 계층입니다.
    또한 이 아키텍처는 프리 트레이닝 단계에서 DBN을 스택 RBM 목록으로, 미세 조정 단계에서 피드 포워드 네트워크로 볼 수 있습니다. 이는 직관적으로 뛰어나고 프로그래밍 방식으로 편리합니다.

    데이터 전파

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

    Aparapi로 GPU 계산

    앞에서 언급했듯이 신경 네트워크가 최근 몇 년간 부활 한 이유 중 하나는 교육 방법이 병렬 처리에 매우 도움이되므로 GPGPU를 사용하여 교육 속도를 크게 높일 수 있다는 것입니다. Aparapi 라이브러리를 사용하여 GPU지원을 추가하기로 결정했습니다.
    Aparapi는 connection calculator에 몇 가지 중요한 제한을 부과합니다.
    • 프리미티브 데이터 유형의 일차원 배열 (및 변수) 만 허용됩니다.
    • Aparapi Kernel 클래스의 멤버 메서드만 GPU 실행 코드에서 호출 할 수 있습니다.
    따라서 대부분의 데이터 (가중치, 입력 및 출력 배열)는 내부적으로 1 차원 플로트 배열을 사용하는 Matrix 인스턴스에 저장됩니다. 모든 Aparapi 연결 계산기는 AparapiWeightedSum (완전히 연결된 레이어 및 가중치 합계 입력 기능 용), AparapiSubsampling2D (서브 샘플링 레이어 용) 또는 AparapiConv2D (컨벌루션 레이어 용)를 사용합니다. 이러한 제한 사항 중 일부는 이기종 시스템 아키텍처 도입으로 해결할 수 있습니다. 또한 Aparapi는 CPU와 GPU 모두에서 동일한 코드를 실행할 수 있습니다.

    학습

    학습 모듈은 다양한 학습 알고리즘을 구현합니다. 이전 두 모듈을 사용합니다. 예를 들어 BackPropagationTrainer (모든 트레이너가 Trainer 기본 클래스를 사용하고 있음)는 피드 포워드 단계에 피드 포워드 레이어 계산기를 사용하고 오류를 전파하고 가중치를 업데이트하기위한 특수한 너비 우선 레이어 계산기를 사용합니다.
    나의 최근 작품은 Java 8 지원 및 기타 개선 사항에 있으며 곧 마스터로 병합됩니다.

    결론

    이 Java 심층 학습 튜토리얼의 목적은 깊은 학습 알고리즘 분야에 대한 간단한 소개를 제공하는 것입니다. 가장 기본적인 구성 단위 (퍼셉트론)부터 시작하여, 제한된 볼츠만 (Boltzmann) 머신과 같은 다양한 효과적이고 대중적인 아키텍처를 통해 진행됩니다.
    신경망의 아이디어는 오래 전부터 있었습니다. 하지만 오늘날에는 깊은 네트워크 또는 심층적 인 학습에 대한 정보가 없어도 기계 학습 커뮤니티에 발을 들여 놓을 수 없습니다. 과대 광고는 GPGPU 컴퓨팅의 진보와 Geoffrey Hinton, Yoshua Bengio, Yann LeCun 및 Andrew Ng와 같은 연구원이 이룩한 진보와 함께 많은 논점을 제시합니다. 친숙 해지고 현재와 같이 참여할 수있는 더 좋은 시기는 없습니다.

    Appendix: Resources

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

    About the author

    Ivan is an enthusiastic senior developer with an entrepreneurial spirit. His experiences range across a number of fields and technologies, but his primary focuses are in Java and JavaScript, as well as Machine Learning. [click to continue...]


    반응형
Designed by Tistory.