기계 학습이 목록에서 최대 값을 찾는 것과 같은 기능을 배울 수 있습니까?


26

나는 목록 인 입력을 가지고 있으며 출력은 입력 목록의 요소의 최대 값입니다.

기계 학습은 항상 입력에 존재하는 최대 입력 요소를 선택하는 기능을 배울 수 있습니까?

이것은 매우 기본적인 질문처럼 보이지만 기계 학습이 일반적으로 할 수있는 일에 대한 이해를 줄 수 있습니다. 감사!


1
나는 이것을 Recurrent Neural Network와 같은 직렬 문제로 시도 할 수 있다고 생각합니다. 정렬 된 데이터를 네트워크에 공급하십시오.
vipin bansal

2
datascience.stackexchange.com/q/22242 , datascience.stackexchange.com/q/29345 도 참조하십시오 . 신경망 은 입력 목록을 정렬 할 수 있으므로 확실히 최대 값을 추출 할 수 있습니다.
벤 레이니 거

3
@TravisBlack : 사실, 이것은 표준 신경망으로는 배울 수없는 기능 유형입니다 . 예를 들어, 훈련 세트에있는 값보다 큰 값을 예측하기 위해 값을 가진 벡터를 간단히 연결한다고 가정합니다. 훈련 된 신경망이 가장 큰 가치를 되 찾을 것이라고 생각하십니까?
Cliff AB

10
@TravisBlack NOOO! 신경망은 "기본적으로 어떤"수학적 기능을 배울 수 없습니다. 카디널리티 측면에서 거의 모든 기능은 거의 모든 곳에서 불연속적인 기능입니다. 당신이 아마 의미하는 것은, 수학자들이 실제로 관심을 가지고 있는 많은 기능 들이 신경망이 그것들을 임의로 근사 있을 정도로 충분히 행동하는 것입니다. 그러나 그것은 어떤 기능배울 수있는 것과 같은 것이 아닙니다 .
leftaroundabout

6
@leftaroundabout과 Cliff : 최근 ML / DL 과대 광고에서 누군가가 계속 자리를 잡는 것이 좋습니다. 사람들은 NN을 사용하고 있으며, 한 단계 더 깊이 파고들 때, 그들은 어떤 패턴을 볼 때까지 일부 케 라스 "Hello World"예제에서 맹목적으로 매개 변수를 조정하는 것 외에는 실제로 그들이 실제로 무엇을하고 있는지를 조금도 알지 못합니다 . xkcd는 이것을 정확하게 얻었습니다 : xkcd.com/1838 . 현재 답변보다 더 깊은 답변을 여기에 추가 할 수 있기를 바랍니다. (누구에게도
악의는 없지만

답변:


35

어쩌면 머신 러닝이 답이 아닌 경우 중 하나입니다 . 실제로 bog 표준 규칙 기반 솔루션이 더 빠르고 간단하며 일반적으로 올바른 선택 인 경우에 머신 러닝을 시도하는 경향이 있습니다 .P

당신이 할 수 있다고해서

편집 : 나는 원래 이것을 "Yes, but that ..."이라고 썼지 만 결코 본 적이없는 자신을 의심하기 시작했습니다. 나는 오늘 오후에 그것을 시험해 보았고 확실히 가능하다.

import numpy as np
from keras.models import Model
from keras.layers import Input, Dense, Dropout
from keras.utils import to_categorical
from sklearn.model_selection import train_test_split
from keras.callbacks import EarlyStopping

# Create an input array of 50,000 samples of 20 random numbers each
x = np.random.randint(0, 100, size=(50000, 20))

# And a one-hot encoded target denoting the index of the maximum of the inputs
y = to_categorical(np.argmax(x, axis=1), num_classes=20)

# Split into training and testing datasets
x_train, x_test, y_train, y_test = train_test_split(x, y)

# Build a network, probaly needlessly complicated since it needs a lot of dropout to
# perform even reasonably well.

i = Input(shape=(20, ))
a = Dense(1024, activation='relu')(i)
b = Dense(512, activation='relu')(a)
ba = Dropout(0.3)(b)
c = Dense(256, activation='relu')(ba)
d = Dense(128, activation='relu')(c)
o = Dense(20, activation='softmax')(d)

model = Model(inputs=i, outputs=o)

es = EarlyStopping(monitor='val_loss', patience=3)

model.compile(optimizer='adam', loss='categorical_crossentropy')

model.fit(x_train, y_train, epochs=15, batch_size=8, validation_data=[x_test, y_test], callbacks=[es])

print(np.where(np.argmax(model.predict(x_test), axis=1) == np.argmax(y_test, axis=1), 1, 0).mean())

출력은 0.74576이므로 시간의 최대 74.5 %를 올바르게 찾습니다. 나는 그것이 향상 될 수 있다는 것은 의심의 여지가 없지만 이것이 유스 케이스가 아니라고 ML에 권장합니다.

편집 2 : 실제로 오늘 아침에 sklearn의 RandomForestClassifier를 사용하여 다시 실행하여 크게 성능이 향상되었습니다.

# instantiation of the arrays is identical

rfc = RandomForestClassifier(n_estimators=1000, verbose=1)
rfc.fit(x_train, y_train)

yhat_proba = rfc.predict_proba(x_test)


# We have some annoying transformations to do because this .predict_proba() call returns the data in a weird format of shape (20, 12500, 2).

for i in range(len(yhat_proba)):
    yhat_proba[i] = yhat_proba[i][:, 1]

pyhat = np.reshape(np.ravel(yhat_proba), (12500,20), order='F')

print(np.where(np.argmax(pyhat, axis=1) == np.argmax(y_test, axis=1), 1, 0).mean())

그리고 여기의 점수는 최대가 올바르게 식별 된 샘플의 94.4 %이며, 이는 실제로 꽤 좋습니다.


1
@TravisBlack yeah 나는 원래 "Yes, but ..."로 시작했지만 나 자신을 의심하고 혼란 스러웠다. 나는 지금 대답을 향상시켰다 :).
Dan Scally

16
[0,100]의 값을 포함하는 벡터로 전체를 훈련시키고 테스트 할 때 점수는 약 0.95입니다. 벌금. 그러나 [0,100]의 값으로 훈련하고 [100,200]의 값으로 시험하면 실제로 점수는 0 입니다. 이미 편집 한 단계로 되돌아갔습니다. 그러나 ML을 맹목적으로 모든 문제를 해결할 수있는 기적의 무기로보고있는 사람들에게 분명하게 보이기 위해서 : 당신이 무엇을 배우고 있든지간에 : 그것은 '최대 기능'이 아닙니다! .
Marco13

2
(제외 : 의견에 대한 답변을 다른 사람에게 알리려면을 ( @@Marco13) 사용하십시오.) 질문과 관련하여 : "머신 러닝이 답이 아닙니다"라는 말이 명확 해집니다. 나는 때 너무 많은 사람들이 적절한 조사를 적용하지 않는 것이 주로 두려워 하여 ML / DL /의 NN을, 특히 그들이 뭔가가 발생하는 경우, 외모 가 그렇게 나타납니다 이유를 이해하지 않고, 그것과 같은이 "자신의 문제를 해결"수를 따라서 "솔루션"이 잘 알려지지 않은 프로세스의 인공물 일 때를 인식하지 못한다.
Marco13

2
확실히 @aroth; 기껏해야 이것은 훈련 데이터의 범위에 적용 가능한 max () 의 근사치 입니다. 나는 그 문제와 관련이 있었지만 이런 종류의 문제에 ML을 사용하지 않는 나의 대답에 대한 주된 감정에서 벗어나지 않을 것이다 .
Dan Scally

1
@BradyGilg 입력 데이터를 표준화하는 중 ... uhhm ... 아마도 "더 나은"결과가 나올 것입니다. NN이 "최대 기능을 배우지"않기 때문에 결과는 여전히 의미가 없습니다. . 그리고 그 주장은 어떤면에서는 매우 학문적 인 것입니다. 심지어 "너무 학문적"이라고 말하고 싶습니다. 일부 벡터의 최대 값을 계산 / 예측하고 싶고 최대 값을 계산하려면 먼저 최소값을 계산해야합니다 / max를 사용하여 정규화를 수행합니다 (또는 표준화에 대한 평균 / stdDev도 매우 합리적이지 않은 것으로 보입니다).
Marco13

26

예. 매우 중요한 것은 머신 러닝 솔루션의 아키텍처를 결정하는 것입니다. 아키텍처와 교육 절차는 스스로 작성하지 않습니다. 그것들은 디자인되거나 템플릿 화되어야하며 훈련은 일련의 데이터 포인트에 맞는 아키텍처의 매개 변수화를 발견하는 수단으로 수행됩니다.

실제로 최대 기능을 포함하는 매우 간단한 아키텍처를 구성 할 수 있습니다.

net(x) = a * max(x) + b * min(x)

여기서 ab 는 학습 된 매개 변수입니다.

충분한 교육 샘플과 합리적인 교육 루틴이 주어지면이 매우 간단한 아키텍처는 작업에 대해 a를 1로, b를 0으로 설정하는 방법을 매우 빠르게 학습합니다.

기계 학습은 종종 입력 데이터 포인트의 특성화 및 변환에 대한 여러 가설을 즐겁게하는 것과 종종 대상 변수와 상관 된 가설 만 보존하는 학습의 형태를 취합니다. 가설은 매개 변수화 된 알고리즘에서 사용 가능한 아키텍처 및 하위 기능에서 명시 적으로 인코딩되거나 "매개 변수없는"알고리즘으로 인코딩 된 가정으로 제공됩니다.

예를 들어, 바닐라 신경망 ML에서 공통적 인 도트 제품 및 비선형 성을 사용하는 선택은 다소 임의적입니다. 그것은 선형 변환 및 임계 값 함수의 미리 결정된 구성 네트워크 구조를 사용하여 함수가 구성 될 수 있다는 포괄적 인 가설을 표현한다. 해당 네트워크의 서로 다른 매개 변수는 사용할 선형 변환에 대한 서로 다른 가설을 구현합니다. 모든 기능 도구 상자를 사용할 수 있으며 기계 학습자의 임무는 차별화 또는 시행 착오를 통해 또는 배열의 기능 또는 기능이 오류 메트릭을 가장 최소화하는 다른 반복 가능한 신호를 통해 발견하는 것입니다. 상기 주어진 예에서, 학습 된 네트워크는 단순히 최대 기능 자체로 감소하는 반면, 미분화 된 네트워크는 대안 적으로 최소 기능을 "학습"할 수있다. 이 함수들은 다른 답에서 선형 또는 신경 순 회귀 함수에서와 같이 다른 수단을 통해 표현되거나 근사화 될 수 있습니다. 요컨대, ML 아키텍처 도구 상자에있는 기능 또는 LEGO 조각에 따라 다릅니다.


4
+1 ML은 공상 회귀 방정식에 지나지 않으며 올바른 방정식 선택을 요구합니다.
aidan.plenert.macdonald

4
@ aidan.plenert.macdonald ML의 영향과 매력은 올바른 방정식 선택이 없다는 것입니다. 선택한 방정식은 적합한 방정식 세트의 구성원이어야하지만, 광범위한 문제의 경우 세트가 신중하게 설계된 솔루션보다 훨씬 더 일반화 된 방정식을 포함하지만 추가 설계 노력보다 훨씬 빨리 문제를 해결할 수 있습니다. 이 질문은 이것이 모델 설계 고려 사항을 완전히 제거하지 않는 방법에 대한 좋은 예입니다.
것입니다

그것은 결코 질문이 아닙니다. OP는 ML이 max()(라벨 된 데이터로부터 ) 같은 기능을 찾을 수 있는지 (/ 학습 / 추론 할 수 있는지) 물었다 . 그들은 " 당신은 이미 max()빌딩 블록으로 가지고
smci

@smci 머신 러닝 아키텍처 나 기능에는 "범용"이 없습니다. 내 대답에서 언급했듯이 비선형 성이 산재 된 조각 선형 함수를 사용하여 최대 함수를 근사 할 수는 있지만 모든 ML이 도구 상자에서 특정 변환 세트를 사용해야한다는 보편적 인 규칙은 없습니다. 신경망은 종종 Max Pooling 또는 ReLU 비선형 성을 통해 최대의 기능을 갖습니다 (항상 그런 것은 아님). 가능한 기능 기능의 수는 제한이 없으므로 ML 아키텍처에서 선택의 역할과 선입견 바이어스를 강조합니다.
pygosceles

7

예-기계 학습은 숫자 목록에서 최대 값을 찾는 법을 배울 수 있습니다.

다음은 최대 지수를 찾는 학습의 간단한 예입니다.

import numpy as np
from sklearn.tree import DecisionTreeClassifier

# Create training pairs where the input is a list of numbers and the output is the argmax
training_data = np.random.rand(10_000, 5) # Each list is 5 elements; 10K examples
training_targets = np.argmax(input_data, axis=1)

# Train a descision tree with scikit-learn
clf = DecisionTreeClassifier()
clf.fit(input_data, targets)

# Let's see if the trained model can correctly predict the argmax for new data
test_data = np.random.rand(1, 5)
prediction = clf.predict(test_data)
assert prediction == np.argmax(test_data) # The test passes - The model has learned argmax

실제로 "최대"기능을 배우고 있습니까? 10,000 개의 5 요소 목록으로 구성된 교육 세트는 전체 입력 공간에 대한 합리적인 근사치입니다.
마크

2
면책 조항 : 저는 ML / DL 전문가가 아닙니다. 그러나 나는 이것이 의미가 없다는 것을 확신합니다. 내 말은 : 전혀 말도 안돼. 내가 알다시피, 당신은 최대 기능을 배우지 않습니다. 훈련 세트의 최대 요소에 대한 지수를 배우고 있습니다. 훈련 세트보다 큰 두 개의 숫자가 포함 된 벡터를 입력하면 실패 할 수 있습니다. 5D가 아닌 10D 벡터가있는 경우는 말할 것도 없습니다. 이해할 수없는 일부 데이터를 라이브러리에 던지고 특정 결과를 보더라도 "작동"한다는 의미 는 아닙니다 .
Marco13

내 말은, "작동"이 무엇을 의미하는지에 달려 있습니다. 특히 의사 결정 트리는 축 정렬 된 사각형 상자 인 조각 별 상수 함수 만 생성합니다. max 예제에서, 고체 하이퍼 큐브에 대한 훈련에서, 실제 max 함수는 일부 삼각형 종류의 영역에서 부분적으로 상수입니다. 충분한 훈련 예제와 깊이가 주어지면 트리는 이러한 삼각형 영역을 임의의 정확도로 근사합니다. 그러나 많은 (대부분의) 다른 모델과 마찬가지로 훈련 샘플 범위를 벗어난 테스트 샘플은 거의 희망이 없습니다.
벤 레이니 거

이것은 아무것도 증명하지 못합니다. OP는 "숫자 목록의 최대 값"을 물었습니다 . 0..1 범위의 부동 소수점이어야한다고 가정했습니다. 2 (또는 -1 또는 1.5)를 입력하면 실패합니다.
smci

4

학습 알고리즘

피드 포워드 신경망에 의해 수행 된 계산으로서 함수를 학습하는 대신, 샘플 데이터로부터 학습 알고리즘 에 관한 전체 연구 영역이 있습니다. 예를 들어 신경 튜링 머신 (Neural Turing Machine) 또는 알고리즘 실행이 결정 지점에서 머신 러닝에 의해 제어되는 다른 방법 과 같은 것을 사용할 수 있습니다 . 최대 값 찾기, 목록 정렬 또는 목록 반전 또는 목록 필터링과 같은 장난감 알고리즘은 일반적으로 알고리즘 학습 연구의 예로 사용됩니다.


2

교육받은 디자인을 답변에서 제외하겠습니다. 임의의 기계로 학습 (ML) 방식을 사용 하여 임의의 정밀도를 갖는 임의 목록에 대한 최대 기능 을 완전히 나타내는 것은 불가능 합니다 . ML은 데이터 기반 방법이며 데이터 포인트가없는 지역에서는 함수를 근사 할 수 없다는 것이 분명합니다. 따라서, 가능한 관측 공간 (무한)은 유한 관측으로 덮을 수 없습니다.

저의 진술은 신경망에 대한 Cybeko의 범용 근사 정리 (Universal Approximation Theorem)와 이론적 기초를 가지고 있습니다. Wikipedia에서 정리를 인용하겠습니다.

아르 자형

아르 자형엑스아르 자형

관측 공간이 콤팩트 한 경우 유한 데이터 세트로 최대 기능을 추정 할 수 있습니다. 가장 많이 투표 된 답변에서 알 수 있듯이 바퀴를 재발 명해서는 안됩니다!


1

내 의견에 대한 확장입니다. 서문에서 @DanScally는 ML을 최대 목록을 찾는 데 사용할 이유가 없다는 것이 절대적으로 옳습니다. 그러나 당신의 "기계 학습이 일반적으로 할 수있는 일에 대한 이해를 줄 수있을 것"이라고 생각합니다.

최대최대


최대최대최대

argmax(2) 신경 각각 나타내는 표시기 변수δ나는j=1(엑스나는<엑스j)를 들면,나는<j엑스j엑스나는엑스나는j<나는δj나는+j>나는(1δ나는j)j엑스나는>엑스j따라서 위치 엑스나는
나는나는


마지막으로, 다음 질문에 대해 : NN을이 상태로 훈련시킬 수 있습니까? @DanScally는 우리를 시작했습니다. 이론적 아키텍처를 아는 것이 솔루션 속임수에 도움이 될 수 있습니까? (위의 특정 무게 세트를 배우거나 근사 할 수 있다면, 그물은 실제로 훈련 샘플 범위 밖에서 잘 수행됩니다.)

github / Colab의 노트북

사물을 조금만 변경하면 테스트 점수가 더 좋아지고 (0.838) 원래 훈련 범위를 벗어난 샘플을 테스트해도 괜찮은 점수 (0.698)를 얻습니다. 조정 된 입력 사용[1,1]범위를 벗어난 점수 0.758로 최대 0.961의 테스트 점수를 얻습니다. 그러나 @DanScally와 동일한 방법으로 점수를 매겼습니다. 약간 부정직 한 것으로 보입니다. 항등 함수는이 지표에서 완벽하게 점수를 매 깁니다. 또한 위에서 설명한 정확한 맞춤에 가까운 것이 나타나는지 (실제로는 아님) 확인하기 위해 몇 가지 계수를 인쇄했습니다. 그리고 일부 원시 출력은 모델이 최대 값을 예측하는 데 너무 소심하다는 것을 암시하며 입력 중 최대 값이 없음을 예측하는 측면에서 오류가 발생합니다. 목표를 수정하면 도움이 될 수 있지만이 시점에서 이미 너무 많은 시간을 투자했습니다. 누군가 접근 방식을 개선하려는 경우 자유롭게 Colab에서 플레이하고 알려주십시오.


나는 아직 논문에 머리를 감아 놓지 않았다. 하나를 디자인 할 수 있는지 궁금 정렬 네트워크 를 본질적으로 "모방" 신경망을 .
Marco13

@ Marco13, 필자는이 논문을 사용하여 비교기가 NN을 생성 할 때 정렬 네트워크의 NN 에뮬레이션을 생성한다고 생각합니다. 용지보다 훨씬 깊지 만 너비가 선형 크기로 줄어들 수 있습니까?
벤 레이니 거

분명히, 나는 NN에 깊이 관여하지 않았으며, 뭔가 심오한 말을해야했습니다. 그러나 "두 개의 레이어로 모든 것을 에뮬레이트 할 수 있습니다"와 같은 것은 "두 개의 NAND 게이트 레이어로 모든 기능을 구현할 수있다"고 말하는 저수준 회로 설계의 결과와 비슷합니다. 내가 생각 몇 가지 최근에 조사 된의 NN의 사람들이 이미 50 년 발견 한 것들 중 단지 멋진 버전입니다,하지만 어쩌면 이것은 오해는 ...
Marco13을

0

예, 적용되는 영리함을 사용하는 경우 일반 선형 최소 제곱만큼 간단한 머신 러닝도 가능합니다.

(그러나 대부분은이 끔찍한 과잉이라고 생각합니다).

(입력 벡터의 최대 abs를 찾으려고 가정합니다).

  1. 에프(엑스)=1엑스2
  2. 에프(아르 자형)기음아르 자형
  3. 에스
  4. 방정식 시스템 구축 및 해결 (ϵ나는+10에스에스+기음아르 자형)1(10에스)
  5. 나는=나는케이|나는|케이
  6. 인덱스 벡터와 라운드로 스칼라 곱을 계산하십시오.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.