O aprendizado de máquina pode aprender uma função como encontrar o máximo de uma lista?

26

Eu tenho uma entrada que é uma lista e a saída é o máximo dos elementos da lista de entrada.

O aprendizado de máquina pode aprender uma função que sempre seleciona o máximo de elementos de entrada presentes na entrada?

Isso pode parecer uma pergunta bastante básica, mas pode me dar uma compreensão do que o aprendizado de máquina pode fazer em geral. Obrigado!

user78739
fonte
11
Eu acho que você pode tentar isso como um problema de série, ou seja, usando a Rede Neural Recorrente. Alimente dados classificados para a rede.
vipin bansal 31/07
2
Consulte também datascience.stackexchange.com/q/22242 , datascience.stackexchange.com/q/29345 ; redes neurais podem classificar uma lista de entrada, portanto, certamente podem extrair um máximo.
Ben Reiniger 31/07
3
@ TravisBlack: na verdade, esse é definitivamente o tipo de função que você não pode aprender com redes neurais padrão. Como um exemplo, suponha que você simplesmente conecte um vetor com um valor para prever que era maior do que qualquer valor em seu conjunto de treinamento. Você acha que a rede neural treinada lhe devolverá o maior valor?
Cliff AB
10
@TravisBlack NOOO! As redes neurais não podem aprender "basicamente qualquer" função matemática. Em termos de cardinalidade, quase todas as funções são patológicas em quase todos os lugares, descontínuas. O que você provavelmente quer dizer é que muitas das funções nas quais os matemáticos realmente se interessam são bem-comportadas o suficiente para que as redes neurais possam aproximar -se arbitrariamente bem. Mas isso não é o mesmo que ser capaz de aprender qualquer função .
leftaroundabout
6
@leftaroundabout e Cliff: É bom ver que alguém permanece no chão no recente hype de ML / DL. As pessoas estão usando NNs e, quando você mergulha um nível mais fundo, percebe que elas geralmente não têm a menor idéia do que estão realmente fazendo lá - além de ajustar cegamente os parâmetros de alguns exemplos keras de "Hello World" até ver algum padrão. O xkcd acertou exatamente: xkcd.com/1838 . Espero que alguém ainda possa adicionar aqui uma resposta mais profunda do que as atuais. (Sem ofensa a ninguém, mas a falta comum de entendimento dos NNs me incomoda ...)
Marco13

Respostas:

35

Talvez , mas observe que este é um daqueles casos em que o aprendizado de máquina não é a resposta . Há uma tendência de tentar aprender o aprendizado de máquina em casos em que as soluções baseadas em regras padrão são mais rápidas, mais simples e geralmente a escolha certa: P

Só porque você pode, não significa que você deveria

Edit : Eu originalmente escrevi isso como "Sim, mas note que ...", mas comecei a duvidar de mim mesmo, nunca tendo visto isso. Eu tentei esta tarde e é certamente factível:

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())

A saída é 0.74576, por isso está localizando corretamente o máximo de 74,5% do tempo. Não tenho dúvidas de que isso poderia ser melhorado, mas, como digo, esse não é um caso que eu recomendaria para o ML.

EDIT 2 : Na verdade, eu re-executei esta manhã usando o RandomForestClassifier do sklearn e o desempenho foi significativamente melhor:

# 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())

E a pontuação aqui é de 94,4% das amostras com o máximo identificado corretamente, o que é realmente muito bom.

Dan Scally
fonte
11
@ TravisBlack, sim, eu comecei originalmente como "Sim, mas ...", mas depois duvidei de mim mesmo e equivocou. Eu melhorei a resposta agora :).
Dan Scally
16
Ao treinar e testar a coisa toda com vetores que contêm valores em [0,100], a pontuação é de cerca de 0,95. Bem. Mas ao treiná-lo com valores em [0,100] e testá-lo com valores em [100,200], a pontuação é praticamente zero . Você já deu um passo atrás com sua edição. Mas para deixar isso inequivocamente claro para aqueles que veem o ML cegamente como a arma milagrosa que pode resolver todos os problemas: o que quer que você esteja aprendendo lá: NÃO é 'a função máxima'! .
Marco13 01/08
2
(Observação: para notificar outras pessoas sobre as respostas aos seus comentários, use @, como em @Marco13). Com relação à pergunta: acho que sua afirmação "aprendizado de máquina não é a resposta" deixa claro. Receio principalmente que muitas pessoas não apliquem o escrutínio apropriado ao usar ML / DL / NNs e, principalmente, quando encontram algo que parece "resolver seu problema", sem entender por que parece fazê-lo. e, portanto, sem reconhecer quando uma "solução" é apenas um artefato de um processo não tão bem compreendido.
Marco13 01/08
2
@aroth sure; na melhor das hipóteses, é uma aproximação de max () aplicável ao escopo dos dados de treinamento que são vistos. Eu estava brincando com o problema, mas não pretendo diminuir o sentimento primário da minha resposta, que é não usar o ML para esse tipo de problema .
Dan Scally
11
@BradyGilg Padronizando os dados de entrada ... uhhm ... enquanto você provavelmente está certo de que isso produziria resultados "melhores", os resultados ainda não fariam muito sentido, porque o NN não está "aprendendo a função máxima" . E o argumento é, de certa forma, obviamente muito acadêmico - eu diria "acadêmico demais": você deseja calcular / prever o máximo de alguns vetores e, para calcular o máximo, primeiro você precisa calcular o mínimo / max para fazer uma normalização (ou significa / stdDev para uma padronização, que também não parece muito sensata).
Marco13
26

Sim. Muito importante, você decide a arquitetura de uma solução de aprendizado de máquina. Arquiteturas e procedimentos de treinamento não se escrevem; eles devem ser projetados ou modelados e o treinamento segue como um meio de descobrir uma parametrização da arquitetura adequada a um conjunto de pontos de dados.

Você pode construir uma arquitetura muito simples que realmente inclua uma função máxima:

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

onde um e b são aprendidas parâmetros.

Dadas amostras de treinamento suficientes e uma rotina de treinamento razoável, essa arquitetura muito simples aprenderá muito rapidamente a definir a como 1 eb para zero para sua tarefa.

O aprendizado de máquina geralmente assume a forma de entreter várias hipóteses sobre caracterização e transformação de pontos de dados de entrada e aprender a preservar apenas as hipóteses correlacionadas com a variável de destino. As hipóteses são codificadas explicitamente na arquitetura e subfunções disponíveis em um algoritmo parametrizado ou como as suposições codificadas em um algoritmo "sem parâmetros".

Por exemplo, a escolha de usar produtos pontuais e não linearidades, como é comum na rede neural de baunilha ML, é um tanto arbitrária; ele expressa a hipótese abrangente de que uma função pode ser construída usando uma estrutura de rede composicional predeterminada de transformações lineares e funções de limite. Diferentes parametrizações dessa rede incorporam diferentes hipóteses sobre quais transformações lineares usar. Qualquer caixa de ferramentas pode ser usada e o trabalho de um aprendiz de máquina é descobrir através de diferenciação ou tentativa e erro ou algum outro sinal repetível que funções ou recursos em sua matriz minimizem melhor uma métrica de erro. No exemplo dado acima, a rede aprendida simplesmente se reduz à função máxima em si, enquanto uma rede indiferenciada poderia "aprender" uma função mínima. Essas funções podem ser expressas ou aproximadas por outros meios, como na função de regressão da rede linear ou neural em outra resposta. Em suma, depende realmente de quais funções ou peças LEGO você possui em sua caixa de ferramentas de arquitetura ML.

pygosceles
fonte
4
+1 ML nada mais é do que equações de regressão sofisticadas e exige a escolha certa de equações.
aidan.plenert.macdonald
4
@ aidan.plenert.macdonald, no entanto, o impacto e o apelo da ML é que não há uma escolha certa de equações. Suas equações escolhidas precisam ser membros do conjunto de equações adequadas, mas acontece que, para uma ampla gama de problemas, esse conjunto contém equações muito mais generalizadas do que uma solução cuidadosamente projetada, mas produz parâmetros que resolvem o problema. problema muito mais rapidamente do que colocar no esforço de projeto adicional. Esta pergunta é um bom exemplo de como isso não elimina completamente as considerações de design do modelo.
Será
Essa nunca foi a questão. O OP perguntou se ML pode encontrar (/ aprender / inferir) uma função como max()(a partir de dados rotulados). Eles não disseram " Dado que você já tem max()um bloco de construção"
smci
@smci Não existe um "universal" prévio para arquiteturas ou funções de aprendizado de máquina. Como mencionado na minha resposta, você pode aproximar uma função máxima usando funções lineares intercaladas com não linearidades - mas não existe uma regra universal que diga que todo ML deve usar esse conjunto específico de transformações em sua caixa de ferramentas. As redes neurais geralmente (mas nem sempre) têm uma função máxima à sua disposição através das não-linearidades de Max Pooling ou ReLU. O número de funções possíveis é ilimitado, e é por isso que enfatizo o papel da escolha e do viés predisposto na arquitetura do ML.
pygosceles
7

Sim - o aprendizado de máquina pode aprender a encontrar o máximo em uma lista de números.

Aqui está um exemplo simples de aprender a encontrar o índice do máximo:

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
Brian Spiering
fonte
Realmente está aprendendo a função "máxima"? Um conjunto de treinamento de 10.000 listas de cinco elementos é uma aproximação razoável ao espaço de entrada completo.
Mark
2
Disclaimer: Eu não sou um especialista em ML / DL. Mas tenho certeza de que isso não faz sentido. Quero dizer: não faz sentido. A meu ver, você não está aprendendo a função máxima. Você está aprendendo os índices dos elementos máximos do conjunto de treinamento. Se você inserir um vetor que contém dois números maiores do que o conjunto de treinamento, provavelmente falhará. Sem mencionar o caso em que você não possui um vetor 5D, mas um vetor 10D. Jogar alguns dados em uma biblioteca que não se entende e ver um determinado resultado NÃO significa que "funciona".
Marco13
Quero dizer, depende do que "funciona" deve significar. Uma árvore de decisão em particular apenas produzirá uma função constante por partes, sendo as peças caixas retangulares alinhadas ao eixo. No exemplo max, treinando em um hipercubo sólido, a função max real é constante por partes em alguns tipos triangulares de regiões. Dados exemplos e profundidade de treinamento suficientes, a árvore aproximará essas regiões triangulares com precisão arbitrária. Mas, como em muitos outros modelos, qualquer amostra de teste fora do intervalo das amostras de treinamento é bastante inútil.
Ben Reiniger
Isso não prova nada. O OP perguntou "o máximo em uma lista de números" . Você assumiu que eles devem ser flutuadores no intervalo de 0..1. Tente inserir um 2 (ou -1 ou 1,5) e ele falhará.
smci 03/08
4

Algoritmos de aprendizagem

Em vez de aprender uma função como um cálculo feito por uma rede neural de feed-forward, existe todo um domínio de pesquisa sobre algoritmos de aprendizagem a partir de dados de amostra. Por exemplo, pode-se usar algo como uma máquina de Tural Neural ou algum outro método em que a execução de um algoritmo é controlada pelo aprendizado de máquina em seus pontos de decisão. Algoritmos de brinquedo, como encontrar um máximo, classificar uma lista, reverter uma lista ou filtrar uma lista, são comumente usados ​​como exemplos na pesquisa de aprendizado de algoritmos.

Peter é
fonte
2

Excluirei designs educados da minha resposta. Não, não é possível usar um fora da abordagem de aprendizagem máquina de caixa (ML) para totalmente representar a função máxima para arbitrárias listas com precisão arbitrária. O ML é um método baseado em dados e é claro que você não poderá aproximar uma função em regiões onde não possui nenhum ponto de dados. Portanto, o espaço de possíveis observações (que é infinito) não pode ser coberto por observações finitas.

Minhas declarações têm uma base teórica com o Teorema Universal de Aproximação de Cybeko para redes neurais. Vou citar o teorema da Wikipedia:

Rn

RnxR

Se o seu espaço de observações for compacto, você poderá aproximar a função máxima com um conjunto de dados finitos. Como a resposta mais votada deixou claro, você não deve reinventar a roda!

MachineLearner
fonte
1

Aqui está uma expansão no meu comentário. Para prefácio, absolutamente @DanScally está certo que não há razão para usar o ML para encontrar o máximo de uma lista. Mas acho que o seu "pode ​​me dar uma compreensão do que o aprendizado de máquina pode fazer em geral" é razão suficiente para se aprofundar nisso.

maxmax


maxmaxmax

n n

argmaxn(n2)δij=1(xi<xj)i<jxjxinxij<iδji+j>i(1δij)jxi>xjxi
ii


Finalmente, para a pergunta subsequente: podemos treinar um NN para esse estado. A @DanScally nos iniciou; talvez conhecer a arquitetura teórica possa nos ajudar a trapacear na solução? (Observe que, se pudermos aprender / aproximar o conjunto específico de pesos acima, a rede terá um desempenho realmente fora do intervalo das amostras de treinamento.)

Caderno no github / Colab

[1,1]obtém a pontuação do teste em 0,961, com uma pontuação fora da faixa de 0,758. Mas, estou pontuando com o mesmo método que o @DanScally, o que parece um pouco desonesto: a função de identidade terá uma pontuação perfeita nessa métrica. Também imprimi alguns coeficientes para ver se algo próximo ao ajuste exato descrito acima aparece (não realmente); e algumas saídas brutas, que sugerem que o modelo é muito tímido na previsão de um máximo, errando ao prever que nenhuma das entradas é a máxima. Talvez modificar o objetivo possa ajudar, mas neste ponto já dediquei muito tempo; se alguém quiser melhorar a abordagem, sinta-se à vontade para jogar (em Colab, se quiser) e me avise.

Ben Reiniger
fonte
Ainda não envolvi minha cabeça no papel (que é pesado em matemática ... e surpreendentemente antigo ...), mas mesmo que seja apenas o termo ambíguo "rede" que trouxe essa associação à minha mente, eu perguntou-se se alguém poderia projetar uma rede neural que essencialmente "emula" uma rede de classificação ...
Marco13
@ Marco13, claro, acho que usar esse papel para produzir NNs como comparadores produziria uma emulação de NN da rede de classificação. Seria muito mais profundo do que o papel, mas a largura pode diminuir ao tamanho linear?
Ben Reiniger
É certo que não estou tão profundamente envolvido com a NN quanto precisava dizer algo profundo. Mas coisas como ~ "você pode emular tudo com duas camadas" soa um pouco como os resultados do projeto de circuito de baixo nível, onde você diz que pode "implementar todas as funções com duas camadas de portas NAND" ou outras coisas. Eu acho que alguns dos NNs examinados recentemente são apenas versões sofisticadas de coisas que as pessoas já descobriram há 50 anos, mas talvez isso seja um equívoco ...
Marco13
0

Sim, mesmo que o aprendizado de máquina simples como os mínimos quadrados lineares comuns possa fazer isso se você usar alguma inteligência aplicada.

(Mas a maioria consideraria esse exagero bastante horrível).

(Assumirei que queremos encontrar o máximo de abs do vetor de entrada):

  1. f(x)=1x2
  2. f(r)Cr
  3. S
  4. (ϵI+103StS+Cr)1(103St)
  5. p
    pi=pik|pi|k
  6. Basta calcular o produto escalar com vetor de índice e redondo.
mathreadler
fonte