신경망에서 입력을 변환하고 유용한 출력을 추출하는 방법은 무엇입니까?


9

그래서 기계 학습에 관한 Adam Geitgey의 블로그를 찾은 이후 신경망을 이해하려고 노력했습니다 . 나는 주제에 관해 가능한 한 많이 읽었으며 (나를 이해할 수있는) 모든 넓은 개념과 일부 작용 (수학에는 매우 약하지만), 뉴런, 시냅스, 무게, 비용 함수, 역 전파를 이해한다고 믿는다 그러나 실제 문제를 신경망 솔루션으로 변환하는 방법을 알 수 없었습니다.

예를 들어, Adam Geitgey는 침실 수 , Sq. 피트 , 이웃판매 가격 주택의 가격을 예측할 수 있도록 신경 네트워크를 훈련시킬 수 있습니다. 그러나 코드에서 가능한 솔루션을 실제로 구현하는 데 부족함이 없습니다. 예를 들어, 가장 가까운 것은 가중치를 구현하는 방법을 보여주는 기본 함수입니다.

def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood):
  price = 0

  # a little pinch of this
  price += num_of_bedrooms * 1.0

  # and a big pinch of that
  price += sqft * 1.0

  # maybe a handful of this
  price += neighborhood * 1.0

  # and finally, just a little extra salt for good measure
  price += 1.0

  return price 

다른 리소스는 수학에 더 중점을 두는 것 같습니다. 내가 이해할 수있는 유일한 기본 코드 예제 (즉, 모든 노래, 춤 이미지 분류 코드베이스가 아님)는 신경망을 XOR로 훈련시키는 구현입니다. 1과 0 만 다루는 게이트.

내 지식에는 다리를 놓을 수없는 틈이 있습니다. 주택 가격 예측 문제로 돌아 가면 어떻게 신경망에 데이터를 공급하기에 적합한가? 예를 들면 다음과 같습니다.

  • 침실 수 : 3
  • 제곱 발 : 2000
  • 인근 지역 : 노멀 타운
  • 판매가 : $ 250,000

32000 은 숫자이기 때문에 신경망에 직접 공급할 수 있습니까? 아니면 다른 것으로 바꿔야합니까? 마찬가지로 Normaltown 값은 문자열입니다. 신경망이 이해할 수있는 값으로 변환하는 방법은 무엇입니까? 데이터 전체에서 일관된 한 인덱스와 같은 숫자를 선택할 수 있습니까?

레이어 사이를 통과하는 숫자가 0에서 1 또는 -1에서 1로 보인 대부분의 신경망 예제는 처리가 끝날 때 어떻게 출력 값을 $ 185,000 와 같은 유용한 값으로 변환 합니까?

나는 주택 가격 예측 예제가 단지 세 개의 데이터 포인트로 크게 단순화되어 있다는 점에서 특히 유용한 문제는 아니라는 것을 알고 있습니다. 그러나 나는이 장애물을 극복하고 의사 현실 데이터를 사용하여 훈련하고 의사 현실 생활 답변을 내 뱉어 버릴 수있는 매우 기본적인 앱을 작성할 수 있다고 생각합니다. 머신 러닝에 대해 자세히 알아보십시오.

답변:


10

이것은 ANN을 처음 코딩 할 때 나 자신과 씨름 한 좋은 질문입니다.

아래는 좋은 범용 솔루션이며, 잘 작동하는 수치 데이터를 예측하기 위해 코드에서 구현 한 솔루션입니다. 데이터가 제대로 작동하지 않으면 (즉, 특이 치가 많은 경우) 입력 및 출력을 정규화하기 위해 더 많은 작업을 수행해야 할 수도 있습니다. 고급 방법 중 일부는 여기 에 설명되어 있습니다 .

참고 : 활성화 함수로 f (x) = tanh (x)를 사용한다고 가정합니다. 그렇지 않은 경우에도 데이터를 읽은 후 데이터를 정규화하는 방법을 계속 추론 할 수 있어야합니다.

입력 데이터를 준비하는 방법 :

기본 아이디어는 입력이 공급되는 뉴런의 활성화에 상당한 변화가 반영되도록 각 입력 매개 변수의 상당한 변화를 원한다는 것입니다. tanh (x) 활성화 함수의 도함수의 도표를 보면, 중요한 기울기 영역이 원점에서 1 또는 2의 거리 내에 있음을 알 수 있습니다. 이것은 활성화 함수에 대한 입력이 2000인지 3000인지 (미분 값이 무시할 정도로 작은 x의 값), 활성화의 출력이 거의 동일하다는 것을 의미합니다. 따라서 뉴런의 상태는 2000 및 3000을 사용하면 네트워크는 해당 범위의 값에서 예측력을 생성하지 않습니다.

따라서 집의 제곱 푸티지를 뉴런에 입력하려면 네트워크가 2000과 3000의 차이를 알 수 있도록 제곱 푸티지를 정규화 해야합니다. 이를 수행하는 한 가지 방법은 데이터는 뉴런에 의해 '알려진' 입력 값을 z- 점수 정규화하는 것 입니다.

  • (훈련 세트에서) 모든 제곱 푸티 지 값을 수집하고 평균 및 표준 편차를 계산하십시오. 평균 및 표준 편차를 저장합니다 . 테스트 할 때 새로운 제곱 푸티 지 값을 정규화하려면이 정보가 필요합니다.

  • 평균을 빼고 결과를 표준 편차 (물론 요소 별 모든 연산) 로 나눠서 제곱 푸티 지 값으로 구성된 벡터를 정규화합니다 . 평균을 빼면 데이터가 원점에 중심을두고 표준 편차로 나눠서 대부분의 데이터가 -1과 1 사이에있게되며 뉴런의 출력이 입력에 가장 민감합니다. 각 입력 값이 z-score로 대체되므로이를 z- 점수 정규화라고 합니다.

  • 각 입력 변수에 대해 위의 작업을 수행하십시오.

이제 각 입력 값을 뉴런을 통해 넣을 때 뉴런의 출력은 -1과 1 사이의 활성화입니다 (tanh (x)의 이미지를보십시오). 이것은 이미 활성화 기능의 '민감한'범위에 있기 때문에 입력 레이어 뉴런의 출력을 첫 번째 숨겨진 레이어로 보내기 전에 출력 레이어를 변경하는 것에 대해 걱정할 필요가 없습니다. 그냥 어떤 숨겨진 레이어 뉴런에 직접 이전 층의 출력을 제공 --- 그들은 잘 그들을 처리 할 수있을 것입니다.

마지막 층 (출력 뉴런)에 도달하면 다시 얻는 것은 -1과 1 사이의 또 다른 활성화 입니다.이 값을 다음으로 사용할지 여부 를 해당 주택의 값으로 다시 변환해야합니다 테스트 세트의 예측 또는 훈련 중 오류를 계산합니다. 그러나 이렇게하면 일관되고 훈련 및 테스트에서 동일한 비정규 화 절차를 사용해야합니다. 생각하는 한 가지 방법은 출력 뉴런이 1을 반환하면 네트워크가 가능한 최대 하우스 값 을 예측으로 반환한다는 의미 입니다. 네트워크가 추정 할 수있는 가장 높은 가치는 무엇입니까? 올바른 접근 방식은 단순히 응용 프로그램에 따라 다릅니다. 이것이 내가 한 일입니다.

  • [/ 각] 출력 변수의 평균을 계산하여 저장하십시오.
  • 평균에서 출력 변수의 최대 편차를 계산하십시오. 파이썬 :MaxDev = max([abs(DataPoint-numpy.mean(TrainingData)) for DataPoint in TrainingData])
  • 네트워크가 -1과 1 사이의 출력을 반환하면 출력에 곱을 곱하여 MaxDev평균에 더합니다.

정규화-정규화 체계가 적합한 지 확인하기 위해 수행 할 수있는 두 가지 기본 빠른 검사 (필요하지만 조건이 충분하지 않음) :

  1. 모든 입력 값이 평균 인 경우 (예 : 평균 침실 수, 평균 평방 피트 등) 네트워크의 출력이 출력 변수의 평균 (예 : 하우스 값)과 동일합니까? (그것은해야한다.)
  2. 모든 입력 값이 비정상적으로 높거나 낮 으면 네트워크의 출력도 비정상적으로 높거나 낮습니까? (이것은 모든 입력이 출력과 긍정적으로 관련되어있는 경우에만 작동합니다. 일부 입력이 반대로 관련되어 있다면 조금 더 생각해야합니다).

여기에 제시된 계획이이 두 가지 조건을 충족하는지 확인하십시오.

이 체계를 사용하면 네트워크 에서 훈련 데이터 세트의 집 값 범위 내의 집 값만 예측할 수 있습니다 . 응용 프로그램에 따라이 동작은 바람직하거나 바람직하지 않을 수 있습니다.

예를 들어 : 네트워크에서 마이너스 하우스 값을 예측하지 못하게 할 수 있습니다. 어떻게 할 것인지 생각해보십시오. -1이 0에 매핑되도록 출력을 비정규 화하십시오.

네트워크가 예측할 수있는 값에 제한을 설정하지 않으려면 [-1,1] 범위를 arctanh (x)와 같은 모든 실수로 매핑하는 기능을 통해 네트워크 출력을 실행할 수 있습니다! 훈련하는 동안이 작업을 수행하는 한 네트워크는이를 수용하도록 가중치를 조정합니다.

도움이 되었기를 바랍니다. 더 궁금한 점이 있으면 알려주세요. 내 ANN 모듈은 파이썬으로되어 있으므로 언어 ​​별 조언이있을 수 있습니다.


이것은 매우 유용했습니다! 내가 접하는 모든 블로그 / 튜토리얼은이 과정을 (거의 고의적으로) 설명하지 않는 것처럼 보이지만 모든 것이 합리적입니다. 제대로 소화하는 데 시간이 걸리지 만 후속 질문이 있으면 돌아올 것입니다. 감사합니다!
David

몇 가지 질문이 있습니다. 내 스퀘어 발 훈련 데이터는 {2000, 800, 850, 550, 2000}이었고 {1900, 1500, 600}에 대한 내 z- 점수 입력은 (정확하게 계산 된 경우) {1.0496, 0.4134, -1.0177}입니다. 따라서 그 값 중 하나는> 1이고 하나는 <-1입니다. 그 값으로 어떻게해야합니까? 입력 레이어 노드에 입력하거나 1 & -1로 반올림합니까? 1900 & 600이 550-2000 범위에있을 때 왜 이러한 값을 생성합니까? 작은 데이터 세트가 있기 때문에 데이터의 트릭입니까?
David

출력 레이어 재 정규화와 관련하여 출력을 최소값과 최대 값으로 플롯하는 것이 올바르게 있습니까? 최소값이0h이자형미디엄엑스나는미디엄미디엄100과 출력은 0이고 (-1에서 1로 가정) $ 50으로 변환됩니까?
David

입력은 1과 -1 사이 일 필요는 없습니다. 입력에 필요한 것은 대부분의 데이터가 해당 범위에 있다는 것입니다. 하나보다 크거나 작은 값은 해당 점이 평균에서 하나 이상의 표준 편차로부터 멀어 지므로 해당 점이 데이터의 상위에 더 가깝습니다. 데이터가 [-1, 1] 외부로 나가는 경우는 드물고, [-2, 2] 외부로 나가는 경우와 [-3, 3] 외부로 나가는 경우는 매우 드 rare니다. tanh (x)를 보면 민감한 범위가 엄격하게 -1과 1 사이가 아니라 그보다 약간 더 먼 것을 볼 수 있습니다.
Marko Bakić

출력 비정규 화와 관련하여 최소-최대 비정규 화가 구현에서 한 것이므로 해석이 정확하지만 반드시 그렇게 할 필요는 없습니다. 1이 최대 주택 가치의 두 배에 해당하도록 만들 수 있습니다. 이렇게하면 네트워크에서 훈련 한 것보다 주택 가치를 예측할 수 있습니다.
Marko Bakić
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.