リストである入力があり、出力はinput-listの要素の最大値です。
機械学習は、入力に存在する入力要素の最大値を常に選択するような関数を学習できますか?
これは非常に基本的な質問のように思えるかもしれませんが、機械学習が一般的に何ができるかを理解できるかもしれません。ありがとう!
リストである入力があり、出力はinput-listの要素の最大値です。
機械学習は、入力に存在する入力要素の最大値を常に選択するような関数を学習できますか?
これは非常に基本的な質問のように思えるかもしれませんが、機械学習が一般的に何ができるかを理解できるかもしれません。ありがとう!
回答:
たぶん、しかし、これは機械学習が答えではない場合の一つであることに注意してください。本当に、沼地の標準的なルールベースのソリューションがより速く、よりシンプルで、一般的に正しい選択である場合に機械学習を試してみる傾向があります:P
できるからといって、すべきだという意味ではありません
編集:私はもともとこれを「はい、しかし注意してください...」と書いていましたが、それを見たことがないので自分を疑い始めました。私は今日の午後にそれを試してみました、それは確かに実行可能です:
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()
(ラベル付きデータから)のような関数を見つける(/ learn / infer)ことができるかどうかを尋ねました。彼らは、「言わなかったあなたが既に持っていることを考えれば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
フィードフォワードニューラルネットワークによって実行される計算としての関数を学習する代わりに、サンプルデータからアルゴリズムを学習することに関する研究領域全体があります。たとえば、ニューラルチューリングマシンや、アルゴリズムの実行がその決定点での機械学習によって制御される他の方法のようなものを使用する場合があります。最大値を見つける、リストを並べ替える、リストを逆にする、リストをフィルタリングするなどの玩具アルゴリズムは、アルゴリズム学習研究の例として一般的に使用されています。
教育を受けたデザインを回答から除外します。いいえ、ボックスマシン学習(ML)アプローチを使用して、任意のリストの最大関数を任意の精度で完全に表すことはできません。MLはデータベースの方法であり、データポイントがない領域では関数を近似できないことは明らかです。したがって、可能な観測の空間(無限)は、有限の観測ではカバーできません。
私の声明は、Cybekoのニューラルネットワークの普遍近似定理の理論的基礎を持っています。ウィキペディアの定理を引用します。
観測空間がコンパクトな場合、有限データセットで最大関数を近似できる場合があります。トップ投票の答えが明らかになったので、車輪を再発明するべきではありません!
これが私のコメントの拡張です。序文として、@ DanScallyは、リストの最大値を見つけるためにMLを使用する理由がないことは絶対に正しいことです。しかし、あなたの「機械学習が一般的に何ができるかを理解してくれるかもしれない」はこれを掘り下げる十分な理由だと思います。
ソートされたリスト内。argmaxを完了するには、このレイヤーのしきい値を設定します。
この時点で、乗算できれば、実際の最大値を簡単に取得できます。この論文の解決策は、数値のバイナリ表現を使用することです。この時点で、バイナリ乗算はしきい値加算と同じです。argmaxを取得するには、番目のインジケーターにを乗算して加算する単純な線形関数で十分です。 i i
最後に、次の質問:NNをこの状態にトレーニングできますか。@DanScallyで始めました。理論的なアーキテクチャを知っていれば、解決策をごまかすことができますか?(上記の特定の重みセットを学習/概算できる場合、ネットは実際にトレーニングサンプルの範囲外で十分に機能することに注意してください。)
少し変更すると、より良いテストスコア(0.838)が得られ、元のトレーニング範囲外のサンプルでテストしても、まともなスコア(0.698)が得られます。スケーリングされた入力を使用する0.958までのテストスコアを取得します。範囲外のスコアは0.758です。しかし、私は@DanScallyと同じ方法でスコアリングしていますが、これは少し不誠実に思えます。恒等関数はこのメトリックで完全にスコアリングします。また、いくつかの係数を出力して、上記の正確な近似に近いものが表示されるかどうかを確認します(実際には表示されません)。そして、いくつかの生の出力は、モデルが最大値を予測するのがあまりにもti病であることを示唆しており、入力値のいずれも最大値ではないと予測する側が間違っています。目標を変更することで解決できるかもしれませんが、この時点ですでに多くの時間を費やしています。誰かがアプローチを改善したい場合は、気軽にプレイしてください(必要に応じてColabで)教えてください。
はい、巧妙さを適用すれば、通常の線形最小二乗のような単純な機械学習でもこれを行うことができます。
(しかし、ほとんどの人はこれを非常に恐ろしい過剰と見なします)。
(入力ベクトルの絶対値の最大値を見つけたいと仮定します):