Gostaria de propor um tipo diferente de desafio de golfe a esta comunidade:
As redes neurais (artificiais) são modelos de aprendizado de máquina muito populares que podem ser projetados e treinados para aproximar qualquer função (geralmente desconhecida). Eles costumam ser usados para resolver problemas altamente complexos que não sabemos como resolver algoritmicamente, como reconhecimento de fala, certos tipos de classificações de imagens, várias tarefas em sistemas de direção autônomos ... Para uma cartilha em redes neurais, considere isso excelente Artigo da Wikipedia .
Como este é o primeiro do que espero ser uma série de desafios de golfe de aprendizado de máquina, gostaria de manter as coisas o mais simples possível:
Na linguagem e estrutura de sua escolha, design e treinar uma rede neural que, dado calcula seu produto para todos os inteiros entre (e incluindo) e .
Objetivo de desempenho
Para se qualificar, seu modelo não pode se desviar em mais de do resultado correto em qualquer uma dessas entradas.
Regras
Seu modelo
- deve ser uma rede neural 'tradicional' (o valor de um nó é calculado como uma combinação linear ponderada de alguns dos nós de uma camada anterior seguida por uma função de ativação),
- só pode usar as seguintes funções de ativação padrão:
- ,
- ,
- ,
- ,
- ,
- ,
- ,
- ,
- deve tomar como um tupel / vetor / lista / ... de números inteiros ou flutuar como sua única entrada,
- retorne a resposta como um número inteiro, float (ou um contêiner adequado, por exemplo, um vetor ou lista, que contenha essa resposta).
Sua resposta deve incluir (ou vincular a) todo o código necessário para verificar seus resultados - incluindo os pesos treinados do seu modelo.
Pontuação
A rede neural com o menor número de pesos (incluindo pesos de viés) vence.
Desfrutar!
fonte
f(x) = x
para encaminhar sua entrada?Respostas:
21 13 119 pesosIsso se baseia na identidade de polarização de formas bilineares que, no caso real unidimensional, se reduz à identidade polinomial:
Então,
y1
apenas calcula[x+y, x-y]
usando uma transformação linear, ey3
é apenas o valor absolutoy1
como etapa de pré-processamento para a próxima: A parte "difícil" é computar os quadrados que explicarei abaixo e, depois, apenas calcular a diferença e o dimensionamento que é novamente uma operação linear.W2
0.02
Experimente online!
fonte
abs
. Mas está tudo bem de qualquer maneira.y0
precisa 4,y1
precisa 2,y3
precisa 2,y4
precisa 1,y5
precisa 1 ey6
precisa 2. São 12?7 pesos
Experimente online!
eps
c
fonte
C = -B
(1 peso) e, em seguida, ter[e_s, e_d] = conv([A,B,C], [eps, eps])
(2 pesos) para economizar um peso :) (BTW: abordagem muito inteligente!)exp
)3331 pesosExperimente online!
Isso faz multiplicação longa em (sorta) binário e, portanto, retorna o resultado exato. Deveria ser possível aproveitar a janela de erro 0,5 para jogar mais um pouco, mas não sei como.
As camadas 1 a 6 decompõem a primeira entrada em 5 "bits". Por razões de golfe, não usamos binário real. O "bit" mais significativo tem peso -15 em vez de 16, e quando a entrada é 0, todos os "bits" são 0,5 (o que ainda funciona bem, pois preserva a identidade
inputA = -15*a15 + 8*a8 + 4*a4 + 2*a2 + 1*a1
).fonte
43 pesos
As duas soluções postadas até agora têm sido muito inteligentes, mas suas abordagens provavelmente não funcionarão para tarefas mais tradicionais no aprendizado de máquina (como OCR). Por isso, gostaria de enviar uma solução 'genérica' (sem truques inteligentes) para esta tarefa que, esperançosamente, inspira outras pessoas a melhorar e ser sugada para o mundo do aprendizado de máquina:
Meu modelo é uma rede neural muito simples com 2 camadas ocultas construídas no TensorFlow 2.0 (mas qualquer outra estrutura também funcionaria):
Como você pode ver, todas as camadas são densas (o que certamente não é o ideal), a função de ativação é tanh (o que pode realmente ser bom para esta tarefa), exceto a camada de saída que, devido à natureza dessa tarefa, possui uma função de ativação linear.
Existem 43 pesos:
Em seguida, eu os afinei - otimizando para o desvio máximo em qualquer uma das tarefas de multiplicação de números inteiros. Infelizmente, minhas anotações não mostram muita afinação que acabei fazendo, mas foi bem menor. Nas proximidades de 100 épocas nessas 441 amostras de treinamento, com um tamanho de lote de 441.
Estes são os pesos que acabei com:
Meu modelo pode ser encontrado aqui e você também pode experimentá-lo online! em um ambiente do Google Colab.
fonte
2 pesos
Como fugir com apenas 1 peso (!)
(Talvez devamos modificar a forma como os pesos reutilizados são pontuados em futuros desafios do golfe na rede neural.)
fonte