機械学習はリストから最大値を見つけるなどの機能を学習できますか?


26

リストである入力があり、出力はinput-listの要素の最大値です。

機械学習は、入力に存在する入力要素の最大値を常に選択するような関数を学習できますか?

これは非常に基本的な質問のように思えるかもしれませんが、機械学習が一般的に何ができるかを理解できるかもしれません。ありがとう!


1
これは、リカレントニューラルネットワークを使用して、シリーズの問題として試すことができると思います。ソートされたデータをネットワークにフィードします。
vipin bansal

2
参照してくださいdatascience.stackexchange.com/q/22242datascience.stackexchange.com/q/29345を。ニューラルネットワークは入力リストをソートできるため、確実に最大値を抽出できます。
ベンレイニガー

3
@TravisBlack:実際、これは間違いなく標準のニューラルネットワークで学習できないタイプの関数です。例として、トレーニングセットに含まれていたどの値よりも大きい値を予測するためのベクトルを単純に接続するとします。訓練されたニューラルネットワークがその最大の価値をもたらすと思いますか?
クリフAB

10
よろしくお願いします!ニューラルネットワークは、「基本的には」数学関数を学習できません。カーディナリティに関しては、ほとんどすべての機能はほぼどこでも不連続な病理学的です。おそらくあなたが意味するのは、数学者が実際に興味を持っている多くの関数は、ニューラルネットワークがそれらを任意にうまく近似できるほど十分に振る舞うことです。しかし、それは機能学ぶことができるということとまったく同じではありません。
8:15の

6
@leftaroundaboutとCliff:最近のML / DLの誇大広告で誰かが地面に留まっているのを見るのは良いことです。人々はNNを使用しており、1レベル深く掘り下げると、彼らが実際にそこで何をしているのかをほとんど把握していないことに気付きます。xkcdはこれを正確に正しくしました:xkcd.com/1838。誰かが、現在の答えよりも深い答えをここに追加できることを願っています。(誰にも違反はありませんが、NNの一般的な理解不足が私を
悩ま

回答:


35

たぶん、しかし、これは機械学習が答えではない場合の一つであることに注意してください。本当に、沼地の標準的なルールベースのソリューションがより速く、よりシンプルで、一般的に正しい選択である場合に機械学習を試してみる傾向があります: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%であり、最大値が正しく識別されています。


1
@TravisBlackええ、私はもともと「はい、しかし...」として始めましたが、自分を疑って曖昧になりました。私は今答えを改善しました:)。
ダン・スカリー

16
[0,100]の値を含むベクトルを使用して全体をトレーニングおよびテストする場合、スコアは約0.95です。いいよ しかし、[0,100]の値でトレーニングし、[100,200]の値でテストすると、スコアは実質的にゼロになります。あなたはすでにあなたの編集で一歩後退しました。しかし、MLをすべての問題を解決できる奇跡の武器であると盲目的に見ている人々のために、これを明白に明確にするために:あなたがそこで学んでいることは何でも:それは「最大の機能」ではありません!
Marco13

2
(余談:コメントへの応答について他の人に通知するには@、のようにを使用します@Marco13)。質問に関して:あなたの「機械学習は答えではない」という声明はそれを明確にしていると思います。私は主に ML / DL / NN を使用するとき、特になぜ「問題を解決できる」ように見える何かに遭遇したとき、なぜそうするように見えるのかを理解せずに、適切な精査を適用しない人が多いのではないかと心配しています、したがって、「解決策」があまりよく理解されていないプロセスの成果物にすぎないことを認識せずに。
Marco13

2
@aroth sure; せいぜい、これは見られるトレーニングデータの範囲に適用可能なmax()の近似値です。私は問題をいじっていましたが、この種の問題にMLを使用しないという私の答えの主要な感情を損なうつもりはありません
ダン・スカリー

1
@BradyGilg入力データの標準化...えーと...おそらく正しい結果が得られるという点では正しいでしょうが、NNは「最大関数を学習していない」ため、結果はあまり意味をなさないでしょう。 。そして、引数は明らかにいくつかの点で非常に学術的なものです-私も「あまりにも学術的」と言うだろう:あなたは計算したい/いくつかのベクトルの最大の予測、および最大を計算するために、あなたは最初の分を計算しなければなりません/ maxで正規化を行います(または標準化の場合はmean / 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の影響と魅力は、しかし、方程式の正しい選択が1つではないということです。選択した方程式は、適切な方程式のセットのメンバーである必要がありますが、慎重に設計されたソリューションよりもはるかに一般化された方程式を含む広範な問題では、慎重に設計されたソリューションよりも追加の設計作業を行うよりもはるかに迅速に問題を解決できます。この質問は、これがモデル設計の考慮事項を完全に排除しない方法の良い例です。
ウィル

それは問題ではありませんでした。OPは、MLがmax()(ラベル付きデータから)のような関数を見つける(/ learn / infer)ことができるかどうかを尋ねました。彼らは、「言わなかったあなたが既に持っていることを考えればmax()ビルディング・ブロックとして」
SMCI

@smci機械学習のアーキテクチャまたは機能には、「ユニバーサル」なものはありません。私の答えで述べたように、非線形性が点在する区分的線形関数を使用して最大関数を近似できますが、すべてのMLがそのツールボックスで特定の変換セットを使用する必要があるという普遍的なルールはありません。ニューラルネットワークは、多くの場合(常にではありません)、最大プーリングまたは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の専門家ではありません。しかし、これは意味をなさないと確信しています。つまり、まったく意味がありません。私が見るように、あなたは最大関数を学んでいません。トレーニングセットの最大要素のインデックスを学習しています。両方ともトレーニングセットよりも大きい2つの数値を含むベクトルを入力すると、失敗する可能性があります。5D-ベクターではなく10D-ベクターがない場合は言うまでもありません。理解できないライブラリにいくつかのデータを投げて、特定の結果を見るということは、それが「機能する」という意味ではありません
Marco13

つまり、「機能する」とはどういう意味かによって異なります。特に決定木は、ピース単位で一定の関数を生成するだけであり、ピースは軸に合わせた長方形のボックスです。ソリッドハイパーキューブでトレーニングするmaxの例では、実際のmax関数は一部の三角形の領域で区分的に一定です。十分なトレーニングの例と深さが与えられると、ツリーはこれらの三角形領域を任意の精度で近似します。しかし、他の多くの(ほとんどの?)モデルと同様に、トレーニングサンプルの範囲外のテストサンプルはほとんど絶望的です。
ベンレイニガー

これは何も証明しません。OPは「数字のリストの最大値」を尋ねました。あなたはそれらが範囲0.1.1のフロートでなければならないと仮定しました。2(または-1、または1.5)を入力しようとすると、失敗します。
smci

4

学習アルゴリズム

フィードフォワードニューラルネットワークによって実行される計算としての関数を学習する代わりに、サンプルデータからアルゴリズムを学習することに関する研究領域全体があります。たとえば、ニューラルチューリングマシンや、アルゴリズムの実行がその決定点での機械学習によって制御される他の方法のようなものを使用する場合があります。最大値を見つける、リストを並べ替える、リストを逆にする、リストをフィルタリングするなどの玩具アルゴリズムは、アルゴリズム学習研究の例として一般的に使用されています。


2

教育を受けたデザインを回答から除外します。いいえ、ボックスマシン学習(ML)アプローチを使用して、任意のリストの最大関数を任意の精度で完全に表すことはできません。MLはデータベースの方法であり、データポイントがない領域では関数を近似できないことは明らかです。したがって、可能な観測の空間(無限)は、有限の観測ではカバーできません。

私の声明は、Cybekoのニューラルネットワークの普遍近似定理の理論的基礎を持っています。ウィキペディアの定理を引用します。

Rn

RnxR

観測空間がコンパクトな場合、有限データセットで最大関数を近似できる場合があります。トップ投票の答えが明らかになったので、車輪を再発明するべきではありません!


1

これが私のコメントの拡張です。序文として、@ DanScallyは、リストの最大値を見つけるためにMLを使用する理由がないことは絶対に正しいことです。しかし、あなたの「機械学習が一般的に何ができるかを理解してくれるかもしれない」はこれを掘り下げる十分な理由だと思います。

maxmax


maxmaxmax

n n

argmaxn(n2)δij=1(xi<xj)i<jxjxinxij<iδji+j>i(1δij)jxi>xjxiソートされたリスト内。argmaxを完了するには、このレイヤーのしきい値を設定します。 この時点で、乗算できれば、実際の最大値を簡単に取得できます。この論文の解決策は、数値のバイナリ表現を使用することです。この時点で、バイナリ乗算はしきい値加算と同じです。argmaxを取得するには、番目のインジケーターにを乗算して加算する単純な線形関数で十分です。 i i
ii


最後に、次の質問:NNをこの状態にトレーニングできますか。@DanScallyで始めました。理論的なアーキテクチャを知っていれば、解決策をごまかすことができますか?(上記の特定の重みセットを学習/概算できる場合、ネットは実際にトレーニングサンプルの範囲外で十分に機能することに注意してください。)

github / Colabのノートブック

少し変更すると、より良いテストスコア(0.838)が得られ、元のトレーニング範囲外のサンプルでテストしても、まともなスコア(0.698)が得られます。スケーリングされた入力を使用する[1,1]0.958までのテストスコアを取得します。範囲外のスコアは0.758です。しかし、私は@DanScallyと同じ方法でスコアリングしていますが、これは少し不誠実に思えます。恒等関数はこのメトリックで完全にスコアリングします。また、いくつかの係数を出力して、上記の正確な近似に近いものが表示されるかどうかを確認します(実際には表示されません)。そして、いくつかの生の出力は、モデルが最大値を予測するのがあまりにもti病であることを示唆しており、入力値のいずれも最大値ではないと予測する側が間違っています。目標を変更することで解決できるかもしれませんが、この時点ですでに多くの時間を費やしています。誰かがアプローチを改善したい場合は、気軽にプレイしてください(必要に応じてColabで)教えてください。


私はまだ紙に頭を包みませんでした(数学的に重い...そして驚くほど古い...)が、それがこの連想を思い起こさせた曖昧な用語 "ネットワーク"であったとしても、ソーティングネットワークを本質的に「エミュレート」するニューラルネットワークを設計できるかどうか疑問に思いました...
Marco13

@ Marco13、確かに、コンパレーターとしてNNを作成するためにその論文を使用すると、ソートネットワークのNNエミュレーションが作成されると思います。それは紙よりもかなり深いでしょうが、幅は線形サイズに縮小される可能性がありますか?
ベンレイニガー

確かに、私はNNに深く関わっているわけではなく、何か深遠なことを言う必要がありました。しかし、「2層ですべてをエミュレートできる」などのことは、「2層のNANDゲートですべての機能を実装できる」などと言う低レベルの回路設計の結果に少し似ています。私はと思い、いくつかの最近検査されたNNの人々はすでに50年前に発見されていること、物事の単なる空想のバージョンですが、多分これは誤解です...
Marco13

0

はい、巧妙さを適用すれば、通常の線形最小二乗のような単純な機械学習でもこれを行うことができます。

(しかし、ほとんどの人はこれを非常に恐ろしい過剰と見なします)。

(入力ベクトルの絶対値の最大値を見つけたいと仮定します):

  1. 絶対値の単調減少関数を選択します。たとえば、
    f(x)=1x2
  2. 対角行列を作成します。それをと呼びましょうf(r)Cr
  3. 1で満たされたベクトルを構築します。S
  4. 方程式システムの構築と解決(ϵI+103StS+Cr)1(103St)
  5. 結果ベクトル呼び出して、それは確率測度(合計1)になります。たとえば、ように非線形に再重み付けできますp
    pi=pik|pi|k
  6. インデックスベクトルとラウンドでスカラー積を計算するだけです。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.