O desafio
Encontre a menor rede neural de avanço de forma que, dado qualquer vetor de entrada tridimensional com entradas inteiras em , a rede produz a maior raiz (ou seja, "mais positiva") da polinômio com erro estritamente menor que .
Admissibilidade
A noção de admissibilidade no meu desafio anterior sobre golfe na rede neural parecia um pouco restritiva; portanto, para esse desafio, estamos usando uma definição mais liberal de rede neural feedforward:
Um neurônio é uma função especificada por um vetor de pesos , um viés e uma função de ativação da seguinte maneira: b ∈ R f : R → R
Uma rede neural de feedforward com nós de entrada é uma função de que pode ser criada a partir de uma sequência de neurônios, em que cada recebe entradas de e gera um escalar . Dado um conjunto especificado de nós de saída , a saída da rede neural é o vetor .(
Como as funções de ativação podem ser ajustadas para qualquer tarefa, precisamos restringir a classe de funções de ativação para manter esse desafio interessante. As seguintes funções de ativação são permitidas:
Identidade.
ReLU.
SoftPlus.
Sigmoide.
Sinusóide.
No geral, uma rede neural admissível é especificada por nós de entrada, uma sequência de neurônios e nós de saída, enquanto cada neurônio é especificado por um vetor de pesos, um viés e uma função de ativação da lista acima. Por exemplo, a seguinte rede neural é admissível, embora não atenda à meta de desempenho desse desafio:
Nós de entrada:
Neurônios: para
Nós de saída:
Essa rede consiste em 8 neurônios, cada um com viés zero e ativação de identidade. Em palavras, essa rede calcula a sequência generalizada de Fibonacci gerada por e e, em seguida, gera os números 5, 9 e 10 dessa sequência, nessa ordem.
Pontuação
Dado um número real com expansão decimal final, seja o menor número inteiro não negativo para o qual e seja o menor número inteiro não negativo para qual é um número inteiro. Então dizemos que é a precisão de .x
Por exemplo, tem uma precisão de , enquanto tem uma precisão de .
Sua pontuação é a soma das precisões dos pesos e desvios na sua rede neural.
(Por exemplo, o exemplo acima tem uma pontuação de 16.)
Verificação
Embora as raízes possam ser expressas em termos da fórmula cúbica , a maior raiz talvez seja mais facilmente acessada por meios numéricos. Seguindo a sugestão do @ xnor, calculei a maior raiz para todas as opções de números inteiros , e os resultados podem ser encontrados aqui . Cada linha desse arquivo de texto é do formulário . Por exemplo, a primeira linha informa que a maior raiz de é aproximadamente .x 3 - 10 x 2 - 10 x - 10 10,99247140445449a,b,c,root
Editar: o arquivo original que publiquei teve erros nos casos em que o polinômio exibia uma raiz múltipla. A versão atual deve estar livre de tais erros.
fonte
a=0
e o quadrático tem duas raízes complexas?a
diferente de zero, ou mesmo apenas 1. Além disso, eu recomendo colocar alguns casos de teste, dando as raízes à alta precisão para que possamos verificar se os nossos estão dentro de 0,1. Também seria bom ter saídas para todas as entradas possíveis, provavelmente em um link, já que isso é muito para o post.x -> a * sin(b * softplus(x) + c)
pode super-ajustar qualquer número finito de pontos de dados comx
precisão de número inteiro a arbitrário usando uma frequência extremamente grande e precisa.Respostas:
146740006675.436.0505.403.44810.3855.9944.4473.806 total precisão
Para uma linha de base, investiguei a seguinte abordagem: Selecione , para que, se amostrarmos o polinômio emM,δ,ϵ>0 p(x)=x3+ax2+bx+c
então o maior ponto de amostra satisfazendo necessariamente existe e reside necessariamente dentro de da maior raiz de . Pode-se mostrar que, para nossa coleção de polinômios, pode-se usar , e .s⋆∈S p(s⋆)<ϵ 0.1 p M=11 δ=0.1 ϵ=10−4
Para projetar uma rede neural que implementa essa lógica, começamos com uma camada de neurônios que amostra o polinômio em . Para cada , tomamosS s∈S
A seguir, identificamos quais são menores que . Acontece que para , sustenta que somente se . Como tal, podemos usar as ativações relu para identificar exatamente nossas amostras:ϵ=10−4 s∈S p(s)<10−4 p(s)≤0
Implementamos isso com algumas camadas de neurônios:
Neste ponto, temos quando e, caso contrário, . Lembre-se de que procuramos a maior para a qual . Para esse fim, rotulamos como (por conveniência de notação) e, para cada , definimos iterativamentex4,s=1 p(s)<10−4 x4,s=0 s⋆ x4,s⋆=1 x4,M x5,M k≥1
Graças a essa transformação, todo é um número inteiro não negativo e é o exclusivo para o qual . Agora podemos identificar por outra aplicação de ativações relu:x5,s s⋆ s x5,s=1 s⋆
Explicitamente, definimos neurônios por
Então se e, caso contrário, . Nós os combinamos linearmente para produzir nosso nó de saída:x8,s=1 s=s⋆ x8,s=0
Para a pontuação, cada camada possui neurônios com diferentes níveis de precisão: (1) , (2) , (3) , (4) , (5) , (6) , (7) , (8) , (9). Além disso, todas as camadas, exceto duas, possuem neurônios; a camada 5 possui neurônios e a camada 9 possui neurônio.6+3+1+9=19 1+4=5 1 5+5=10 1+1=2 1+1=2 1+1=2 1+1+1=3 3|S| |S|=221 |S|−1 1
Edit: Improvements: (1) Podemos amostrar o polinômio com muito mais eficiência usando diferenças finitas. (2) Podemos ignorar as camadas 2 a 4 usando uma ativação sigmóide. (3) Os problemas de transbordamento na camada 5 podem ser evitados (e as camadas subseqüentes podem ser combinadas) aplicando com mais cuidado as ativações relu. (4) A soma final é mais barata com a soma por partes .
O que se segue é o código MATLAB. Para ser claro,
prec
é uma função (encontrada aqui ) que calcula a precisão de um vetor de pesos ou vieses.fonte
53.26829.59629.306 precisão totalA comunicação privada com @ A.Rex levou a esta solução, na qual construímos uma rede neural que memoriza as respostas. A idéia central é que toda função de em um conjunto finito desfruta da decomposiçãof:S→R S
Como tal, pode-se construir uma implementação de rede neural de , primeiro transformando a entrada em uma função indicadora da entrada e, em seguida, combinando linearmente usando as saídas desejadas como pesos. Além disso, as ativações relu tornam essa transformação possível:f
O que se segue é uma implementação MATLAB dessa abordagem. Para ficar claro,
roots.txt
é o arquivo raiz postado acima (encontrado aqui ) eprec
é uma função (encontrada aqui ) que calcula a precisão total de um vetor de pesos ou vieses.Edit 1: Duas melhorias em relação ao original: (1) eu considerei alguns neurônios dos loops for. (2) Eu implementei a " integração de Lebesgue " na soma final, combinando primeiro termos do mesmo nível definido. Dessa forma, pago pelo valor de maior precisão de uma saída apenas uma vez a cada nível definido. Além disso, é seguro arredondar as saídas para o quinto mais próximo pelo teorema da raiz racional .
Edit 2: Melhorias menores adicionais: (1) eu considerei mais neurônios de um loop for. (2) Não me incomodo em calcular o termo na soma final para a qual a saída já é zero.
fonte