나는 목록 인 입력을 가지고 있으며 출력은 입력 목록의 요소의 최대 값입니다.
기계 학습은 항상 입력에 존재하는 최대 입력 요소를 선택하는 기능을 배울 수 있습니까?
이것은 매우 기본적인 질문처럼 보이지만 기계 학습이 일반적으로 할 수있는 일에 대한 이해를 줄 수 있습니다. 감사!
나는 목록 인 입력을 가지고 있으며 출력은 입력 목록의 요소의 최대 값입니다.
기계 학습은 항상 입력에 존재하는 최대 입력 요소를 선택하는 기능을 배울 수 있습니까?
이것은 매우 기본적인 질문처럼 보이지만 기계 학습이 일반적으로 할 수있는 일에 대한 이해를 줄 수 있습니다. 감사!
답변:
어쩌면 머신 러닝이 답이 아닌 경우 중 하나입니다 . 실제로 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 %이며, 이는 실제로 꽤 좋습니다.
@
를 @Marco13
) 사용하십시오.) 질문과 관련하여 : "머신 러닝이 답이 아닙니다"라는 말이 명확 해집니다. 나는 때 너무 많은 사람들이 적절한 조사를 적용하지 않는 것이 주로 두려워 하여 ML / DL /의 NN을, 특히 그들이 뭔가가 발생하는 경우, 외모 가 그렇게 나타납니다 이유를 이해하지 않고, 그것과 같은이 "자신의 문제를 해결"수를 따라서 "솔루션"이 잘 알려지지 않은 프로세스의 인공물 일 때를 인식하지 못한다.
예. 매우 중요한 것은 머신 러닝 솔루션의 아키텍처를 결정하는 것입니다. 아키텍처와 교육 절차는 스스로 작성하지 않습니다. 그것들은 디자인되거나 템플릿 화되어야하며 훈련은 일련의 데이터 포인트에 맞는 아키텍처의 매개 변수화를 발견하는 수단으로 수행됩니다.
실제로 최대 기능을 포함하는 매우 간단한 아키텍처를 구성 할 수 있습니다.
net(x) = a * max(x) + b * min(x)
여기서 a 와 b 는 학습 된 매개 변수입니다.
충분한 교육 샘플과 합리적인 교육 루틴이 주어지면이 매우 간단한 아키텍처는 작업에 대해 a를 1로, b를 0으로 설정하는 방법을 매우 빠르게 학습합니다.
기계 학습은 종종 입력 데이터 포인트의 특성화 및 변환에 대한 여러 가설을 즐겁게하는 것과 종종 대상 변수와 상관 된 가설 만 보존하는 학습의 형태를 취합니다. 가설은 매개 변수화 된 알고리즘에서 사용 가능한 아키텍처 및 하위 기능에서 명시 적으로 인코딩되거나 "매개 변수없는"알고리즘으로 인코딩 된 가정으로 제공됩니다.
예를 들어, 바닐라 신경망 ML에서 공통적 인 도트 제품 및 비선형 성을 사용하는 선택은 다소 임의적입니다. 그것은 선형 변환 및 임계 값 함수의 미리 결정된 구성 네트워크 구조를 사용하여 함수가 구성 될 수 있다는 포괄적 인 가설을 표현한다. 해당 네트워크의 서로 다른 매개 변수는 사용할 선형 변환에 대한 서로 다른 가설을 구현합니다. 모든 기능 도구 상자를 사용할 수 있으며 기계 학습자의 임무는 차별화 또는 시행 착오를 통해 또는 배열의 기능 또는 기능이 오류 메트릭을 가장 최소화하는 다른 반복 가능한 신호를 통해 발견하는 것입니다. 상기 주어진 예에서, 학습 된 네트워크는 단순히 최대 기능 자체로 감소하는 반면, 미분화 된 네트워크는 대안 적으로 최소 기능을 "학습"할 수있다. 이 함수들은 다른 답에서 선형 또는 신경 순 회귀 함수에서와 같이 다른 수단을 통해 표현되거나 근사화 될 수 있습니다. 요컨대, ML 아키텍처 도구 상자에있는 기능 또는 LEGO 조각에 따라 다릅니다.
max()
(라벨 된 데이터로부터 ) 같은 기능을 찾을 수 있는지 (/ 학습 / 추론 할 수 있는지) 물었다 . 그들은 " 당신은 이미 max()
빌딩 블록으로 가지고
예-기계 학습은 숫자 목록에서 최대 값을 찾는 법을 배울 수 있습니다.
다음은 최대 지수를 찾는 학습의 간단한 예입니다.
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
피드 포워드 신경망에 의해 수행 된 계산으로서 함수를 학습하는 대신, 샘플 데이터로부터 학습 알고리즘 에 관한 전체 연구 영역이 있습니다. 예를 들어 신경 튜링 머신 (Neural Turing Machine) 또는 알고리즘 실행이 결정 지점에서 머신 러닝에 의해 제어되는 다른 방법 과 같은 것을 사용할 수 있습니다 . 최대 값 찾기, 목록 정렬 또는 목록 반전 또는 목록 필터링과 같은 장난감 알고리즘은 일반적으로 알고리즘 학습 연구의 예로 사용됩니다.
교육받은 디자인을 답변에서 제외하겠습니다. 임의의 기계로 학습 (ML) 방식을 사용 하여 임의의 정밀도를 갖는 임의 의 목록에 대한 최대 기능 을 완전히 나타내는 것은 불가능 합니다 . ML은 데이터 기반 방법이며 데이터 포인트가없는 지역에서는 함수를 근사 할 수 없다는 것이 분명합니다. 따라서, 가능한 관측 공간 (무한)은 유한 관측으로 덮을 수 없습니다.
저의 진술은 신경망에 대한 Cybeko의 범용 근사 정리 (Universal Approximation Theorem)와 이론적 기초를 가지고 있습니다. Wikipedia에서 정리를 인용하겠습니다.
관측 공간이 콤팩트 한 경우 유한 데이터 세트로 최대 기능을 추정 할 수 있습니다. 가장 많이 투표 된 답변에서 알 수 있듯이 바퀴를 재발 명해서는 안됩니다!
내 의견에 대한 확장입니다. 서문에서 @DanScally는 ML을 최대 목록을 찾는 데 사용할 이유가 없다는 것이 절대적으로 옳습니다. 그러나 당신의 "기계 학습이 일반적으로 할 수있는 일에 대한 이해를 줄 수있을 것"이라고 생각합니다.
신경 각각 나타내는 표시기 변수를 들면,따라서 위치
마지막으로, 다음 질문에 대해 : NN을이 상태로 훈련시킬 수 있습니까? @DanScally는 우리를 시작했습니다. 이론적 아키텍처를 아는 것이 솔루션 속임수에 도움이 될 수 있습니까? (위의 특정 무게 세트를 배우거나 근사 할 수 있다면, 그물은 실제로 훈련 샘플 범위 밖에서 잘 수행됩니다.)
사물을 조금만 변경하면 테스트 점수가 더 좋아지고 (0.838) 원래 훈련 범위를 벗어난 샘플을 테스트해도 괜찮은 점수 (0.698)를 얻습니다. 조정 된 입력 사용범위를 벗어난 점수 0.758로 최대 0.961의 테스트 점수를 얻습니다. 그러나 @DanScally와 동일한 방법으로 점수를 매겼습니다. 약간 부정직 한 것으로 보입니다. 항등 함수는이 지표에서 완벽하게 점수를 매 깁니다. 또한 위에서 설명한 정확한 맞춤에 가까운 것이 나타나는지 (실제로는 아님) 확인하기 위해 몇 가지 계수를 인쇄했습니다. 그리고 일부 원시 출력은 모델이 최대 값을 예측하는 데 너무 소심하다는 것을 암시하며 입력 중 최대 값이 없음을 예측하는 측면에서 오류가 발생합니다. 목표를 수정하면 도움이 될 수 있지만이 시점에서 이미 너무 많은 시간을 투자했습니다. 누군가 접근 방식을 개선하려는 경우 자유롭게 Colab에서 플레이하고 알려주십시오.