응용 딥러닝-파트 3:오토엔코더

응용 딥러닝 시리즈의 파트 3 에 오신 것을 환영합니다. 1 부 코드 예제 및 시각화의 많은 이론과 응용 프로그램을 모두 포함,인공 신경 네트워크에 대한 실습 소개했다. 2 부에서는 실제 데이터 세트에 딥 러닝을 적용하여 사례 연구로 가장 일반적으로 발생하는 3 가지 문제(이진 분류,다중 클래스 분류 및 회귀)를 다루었습니다.

이제 우리는 가장 단순한 오토 엔코더부터 시작하여 특정 딥 러닝 아키텍처로 다이빙을 시작할 것입니다.

  1. 소개
  2. 아키텍처
  3. 구현
  4. 스파스 오토 인코더
  5. 사용 사례
  6. 결론

이 문서의 코드는 주피터 노트북으로 여기에서 사용할 수 있습니다,다운로드하고 자신을 그것을 밖으로 시도 주시기 바랍니다.

소개

자동 인코더는 입력이 출력과 동일한 피드 포워드 신경망의 특정 유형입니다. 입력을 더 낮은 차원 코드로 압축 한 다음이 표현에서 출력을 재구성합니다. 이 코드는 잠재 공간 표현이라고도하는 입력의 컴팩트 한”요약”또는”압축”입니다.

자동 인코더는 인코더,코드 및 디코더의 3 가지 구성 요소로 구성됩니다. 인코더는 입력을 압축하고 코드를 생성 한 다음 디코더는이 코드를 사용하여 입력을 재구성합니다.

자동 인코더를 작성하려면 인코딩 방법,디코딩 방법 및 출력을 대상과 비교하는 손실 함수의 3 가지가 필요합니다. 우리는 다음 섹션에서 이것을 탐구 할 것입니다.

자동 인코더는 주로 몇 가지 중요한 속성을 가진 차원 감소(또는 압축)알고리즘입니다:

  • 데이터 관련:자동 인코더는 학습 된 것과 유사한 데이터 만 의미있게 압축 할 수 있습니다. 이것은 수학적으로 정확한 유형 계층구조인,강력한 타입을 정의합니다. 그래서 우리는 풍경 사진을 압축하기 위해 손으로 쓴 숫자에 대해 훈련 된 자동 인코더를 기대할 수 없습니다.
  • 손실: 오토인코더의 출력은 입력과 정확히 같지 않을 것이며,근접하지만 저하된 표현일 것이다. 당신이 무손실 압축을 원하는 경우에 그들은 갈 수있는 방법이 아니다.
  • 자율:자동 인코더를 훈련시키기 위해 우리는 멋진 것을 할 필요가 없으며 원시 입력 데이터를 던지십시오. 오토 엔코더는 훈련 할 명시 적 레이블이 필요하지 않기 때문에 자율 학습 기술로 간주됩니다. 그러나 더 정확하게 말하면 그들은 훈련 데이터에서 자신의 레이블을 생성하기 때문에 자체 감독됩니다.

아키텍처

인코더,코드 및 디코더의 세부 사항을 살펴 보겠습니다. 인코더와 디코더는 모두 완전히 연결된 피드 포워드 신경망이며,본질적으로 1 부에서 다룬 것입니다. 코드는 우리가 선택한 차원을 가진 앤의 단일 레이어입니다. 코드 계층의 노드 수(코드 크기)는 자동 인코더를 학습하기 전에 설정 한 하이퍼 매개 변수입니다.

이 자동 인코더의 더 자세한 시각화입니다. 먼저 입력은 인코더를 통과,이는 완전히 연결된 앤,코드를 생성하는. 유사한 앤 구조를 갖는 디코더는 코드 만 사용하여 출력을 생성합니다. 목표는 입력과 동일한 출력을 얻는 것입니다. 디코더 아키텍처는 인코더의 미러 이미지입니다. 이 요구 사항은 아니지만 일반적으로 경우입니다. 유일한 요구 사항은 입력의 차원이며 출력은 동일해야합니다. 중간에 있는 모든 것을 가지고 놀 수 있습니다.

자동 코더를 훈련하기 전에 설정해야 할 4 개의 하이퍼 매개 변수가 있습니다.:

  • 코드 크기:중간 계층의 노드 수입니다. 더 압축 크기가 작은 결과.
  • 레이어 수:자동 인코더는 우리가 원하는만큼 깊을 수 있습니다. 위의 그림에서 우리는 입력 및 출력을 고려하지 않고 인코더와 디코더 모두에 2 개의 레이어를 가지고 있습니다.
  • 레이어당 노드 수:레이어가 잇달아 쌓이기 때문에 우리가 작업 중인 오토엔코더 아키텍처를 스택 오토엔코더라고 합니다. 일반적으로 누적 된 자동 인코더는”샌드위치”처럼 보입니다. 레이어 당 노드 수는 인코더의 각 후속 레이어에 따라 감소하고 디코더에서 다시 증가합니다. 또한 디코더는 레이어 구조 측면에서 인코더와 대칭입니다. 이 위에서 언급 한 바와 같이 필요하지 않습니다 우리는 이러한 매개 변수를 완벽하게 제어 할 수 있습니다.
  • 손실 함수:평균 제곱 오차 또는 이진 교차 로피를 사용합니다. 입력 값이 범위에있는 경우 우리는 일반적으로 그렇지 않으면 우리는 평균 제곱 오류를 사용,크로스 엔트로피를 사용합니다. 자세한 내용은이 비디오를 체크 아웃.

오토 엔코더는 역전파를 통해 앤스와 동일한 방식으로 훈련됩니다. 신경 네트워크가 훈련되는 방법에 대한 자세한 내용은 파트 1 의 소개를 확인,그것은 직접 자동 인코더에 적용됩니다.

구현

이제 인코더 및 디코더에 숨겨진 계층 인 다음 아키텍처에 대한 자동 인코더를 구현하겠습니다.

우리는 매우 인기있는 미네소타 데이터 세트를 입력으로 사용할 것입니다. 그것은 손으로 쓴 숫자의 흑백 이미지가 포함되어 있습니다.

그리고 우리는 그것들을 784 개의 숫자 사이의 벡터로 사용합니다. 자세한 내용은 주피터 노트북을 확인하십시오.

이제 케라스와 함께 오토인코더를 구현할 것입니다. 하이퍼파라미터는 숨겨진 레이어의 노드 128 개,코드 크기는 32 개,이진 크로스엔트로피는 손실 함수입니다.

이 패키지에는 디버깅 심볼이 들어 있습니다. 자세한 내용은 이 가이드를 참조하십시오. 우리는 다음과 같이 순차적 인 응용 프로그램을 사용하여 레이어를 추가하는 데 사용하기 전에:

model.add(Dense(16, activation='relu'))
model.add(Dense(8, activation='relu'))

이 기능을 사용하면 다음과 같은 작업을 수행 할 수 있습니다:

layer_1 = Dense(16, activation='relu')(input)
layer_2 = Dense(8, activation='relu')(layer_1)

더 장황하지만 복잡한 모델을 정의하는 더 유연한 방법입니다. 우리는 쉽게 예를 들어,단지 디코더를 들어,우리 모델의 일부를 잡고,그와 함께 작업 할 수 있습니다. 밀도 메서드의 출력은 호출 가능한 계층입니다. 레이어의 출력은 다음 레이어의 입력이 됩니다. 추가 방법은 암시 적으로 우리를 위해이 처리.

모든 레이어는 딥 뉴럴 네트워크의 표준이기 때문에 렐루 활성화 기능을 사용합니다. 마지막 레이어는 시그 모이 드 활성화를 사용합니다. 입력 또한 동일한 범위에 있습니다.

또한 함수에 맞게 호출을 참고,전에 우리가 수행하는 데 사용:

model.fit(x_train, y_train)

하지만 이제 우리는:

model.fit(x_train, x_train)

자동 인코더의 대상은 입력과 동일하다는 것을 기억하십시오. 그래서 우리는 훈련 데이터를 대상으로 제공합니다.

시각화

이제 자동 인코더가 입력을 얼마나 잘 재구성하는지 시각화해 보겠습니다.

우리는 단순히 케라스의 예측 함수를 사용하여 테스트 세트에 자동 인코더를 실행합니다. 테스트 세트의 모든 이미지에 대해 자동 인코더의 출력을 얻습니다. 우리는 출력이 입력과 매우 유사 할 것으로 예상.

그들은 참으로 꽤 유사,하지만 정확히 동일하지. 마지막 숫자”4″에서 더 명확하게 알 수 있습니다. 이 간단한 작업 이었기 때문에 우리의 자동 인코더는 꽤 잘 수행.

조언

우리는 오토 인코더의 아키텍처를 완벽하게 제어 할 수 있습니다. 레이어 수,레이어 당 노드 및 가장 중요한 코드 크기를 늘려 매우 강력하게 만들 수 있습니다. 이러한 하이퍼 파라미터를 늘리면 자동 인코더가 더 복잡한 코딩을 배울 수 있습니다. 그러나 우리는 그것을 너무 강력하게 만들지 않도록 조심해야합니다. 그렇지 않으면 오토 엔코더는 의미있는 표현을 배우지 않고 단순히 입력을 출력에 복사하는 법을 배웁니다. 그것은 단지 신원 기능을 모방 할 것입니다. 오토 엔코더는 훈련 데이터를 완벽하게 재구성 할 것이지만,우리가 원하는 것이 아닌 새로운 인스턴스로 일반화 할 수 없다면 과적합 할 것입니다.

이것이 우리가”샌드위치”아키텍처를 선호하고 의도적으로 코드 크기를 작게 유지하는 이유입니다. 코딩 계층은 입력 데이터보다 차원이 낮기 때문에 자동 인코더는 완료되지 않은 것으로 알려져 있습니다. 그것은 직접 출력의 입력을 복사 할 수 없습니다,지능형 기능을 배울 강요 당할 것이다. 입력 데이터에 패턴이있는 경우,예를 들어 숫자”1″은 일반적으로 다소 직선을 포함하고 숫자”0″은 원형입니다.이 사실을 배우고보다 컴팩트 한 형태로 인코딩합니다. 입력 데이터가 내부 상관 관계 또는 종속성없이 완전히 무작위 인 경우 완료되지 않은 자동 인코더는 완벽하게 복구 할 수 없습니다. 그러나 다행히도 현실 세계에는 많은 의존성이 있습니다.

오토엔코더 노이즈 제거

코드 계층을 작게 유지함으로써 오토엔코더는 데이터의 지능적인 표현을 학습하게 되었습니다. 그 입력에 랜덤 노이즈를 추가하고 원래의 노이즈없는 데이터를 복구 만드는 유용한 기능을 배울 수있는 오토 엔코더를 강제하는 또 다른 방법이있다. 이 방법으로 자동 인코더는 입력에 랜덤 노이즈가 포함되어 있기 때문에 단순히 입력을 출력에 복사 할 수 없습니다. 우리는 노이즈를 빼고 근본적인 의미있는 데이터를 생성하도록 요구하고 있습니다. 이를 노이즈 제거 자동 인코더라고 합니다.

맨 위 행에는 원본 이미지가 포함되어 있습니다. 우리는 그들에게 임의의 가우스 노이즈를 추가하고 시끄러운 데이터는 자동 인코더에 대한 입력이됩니다. 자동 인코더는 원본 이미지를 전혀 볼 수 없습니다. 그러나 우리는 자동 인코더가 노이즈가없는 원본 이미지를 다시 생성 할 것으로 기대합니다.

노이즈 제거 자동 인코더의 구현과 일반 코드 사이에는 단 하나의 작은 차이가 있습니다. 아키텍처는 전혀 변경되지 않고 맞춤 함수 만 변경됩니다. 우리는 다음과 같이 정규 자동 인코더를 훈련 시켰습니다:

autoencoder.fit(x_train, x_train)

노이즈 제거 자동 인코더는 다음과 같이 훈련됩니다:

autoencoder.fit(x_train_noisy, x_train)

그 간단한,다른 모든 것은 정확히 동일합니다. 오토 엔코더에 대한 입력은 노이즈가있는 이미지이며 예상 대상은 원래의 노이즈가없는 이미지입니다.

시각화

이제 노이즈없는 이미지를 복구 할 수 있는지 여부를 시각화합시다.

꽤 좋아 보인다. 맨 아래 행은 자동 인코더 출력입니다. 컨볼 루션 오토 인코더와 같은 더 복잡한 오토 인코더 아키텍처를 사용하면 더 잘할 수 있습니다. 우리는 다가오는 기사에서 컨볼 루션을 다룰 것입니다.

스파스 오토 인코더

우리는 오토 인코더가 유용한 기능을 배우도록 강제하는 두 가지 방법을 도입했습니다:코드 크기를 작게 유지하고 오토 인코더를 노이즈 제거합니다. 세 번째 방법은 정규화를 사용하는 것입니다. 우리는 노드의 일부만이 활성 노드라고 불리는 0 이 아닌 값을 가질 수 있도록 희소성 제약 조건을 사용하여 자동 인코더를 정규화 할 수 있습니다.

특히,노드의 일부만 활성화되도록 손실 함수에 페널티 용어를 추가합니다. 이것은 자동 인코더가 각 입력을 소수의 노드의 조합으로 표현하도록 강제하고 데이터에서 흥미로운 구조를 발견 할 것을 요구합니다. 이 메서드는 코드 크기가 큰 경우에도 작동합니다.

단 하나의 매개 변수로 케라스에서이 작업을 수행하는 것은 매우 쉽습니다. 이전에 코드 계층을 다음과 같이 만들었습니다:

code = Dense(code_size, activation='relu')(input_img)

이제 정규화 강도를 지정하여 액티비티 _귤러라이저라는 다른 매개 변수를 추가합니다. 이 값은 일반적으로 범위의 값입니다. 여기에서 우리는 10 이자형-6 을 선택했다.

code = Dense(code_size, activation='relu', activity_regularizer=l1(10e-6))(input_img)

추가 된 정규화 항으로 인해 스파 스 모델의 최종 손실은 표준 모델보다 0.01 높습니다.

정규화 된 모델에 의해 생성 된 인코딩이 실제로 희소하다는 것을 보여 드리겠습니다. 테스트 집합에 있는 이미지에 대한 코드 값의 히스토그램을 보면 분포는 다음과 같습니다:

표준 모델의 평균은 6.6 이지만 정규화 된 모델의 경우 0.8 이며 꽤 큰 감소입니다. 우리는 정규화 된 모델의 코드 값의 큰 덩어리가 실제로 0 이라는 것을 볼 수 있으며,이는 우리가 원하는 것입니다. 정규화 된 모델의 차이 또한 상당히 낮습니다.

사용 사례

이제 다음과 같은 질문을 할 수 있습니다. 자동 인코더가 입력을 압축하는 데 얼마나 좋습니까? 그리고 그들은 일반적으로 사용되는 깊은 학습 기술입니까?

불행히도 오토 엔코더는 실제 애플리케이션에서 널리 사용되지 않습니다. 압축 방법으로,그들은 그것의 대안 보다 더 나은 수행 하지 않습니다. 그리고 오토 엔코더가 데이터에 특화되어 있다는 사실은 일반적인 기술로는 비실용적입니다. 그들은 3 가지 일반적인 사용 사례를 가지고 있습니다:

  • 데이터 노이즈 제거:우리는 이미지에 이것의 예를 보았다.
  • 차원 감소:고차원 데이터를 시각화하는 것은 어렵습니다. 티-스네는 가장 일반적으로 사용되는 방법이지만 많은 차원(일반적으로 32 이상)으로 어려움을 겪습니다. 그래서 오토인코더는 차원성을 줄이기 위한 전처리 단계로 사용되고,이 압축된 표현은 2 차원 공간에서 데이터를 시각화하는 데 사용됩니다. 티스네에 대한 훌륭한 기사는 여기와 여기를 참조하십시오.
  • 변이 오토엔코더:이것은 오토엔코더의 보다 현대적이고 복잡한 사용 사례이며 다른 기사에서 다룰 것입니다. 그러나 빠른 요약으로,배 대신 바닐라 오토 인코더의 경우 임의의 함수를 학습,입력 데이터를 모델링 확률 분포의 매개 변수를 배운다. 이 분포에서 포인트를 샘플링하여 우리는 또한 생성 모델로 배를 사용할 수 있습니다. 여기에 좋은 참조입니다.

결론

오토 엔코더는 매우 유용한 차원 감소 기술이다. 그들은 매우 인기 있는 교재로 서 입문 깊은 학습 과정,대부분 그들의 단순성 때문에. 이 문서에서 우리는 세부 사항에서 그들을 커버 하 고 당신이 그것을 즐길 바랍니다.

이 기사의 전체 코드는 직접 해킹하려는 경우 여기에서 확인할 수 있습니다. 당신이 어떤 의견이 있으면 트위터에 나에게 다가 주시기 바랍니다.

답글 남기기

이메일 주소는 공개되지 않습니다.

Previous post 뉴 잉글랜드 일기
Next post 외식 할 때 팁 글로벌 가이드