Classificar com uma rede neural


15

Os desafios anteriores do golfe na rede neural ( isso e aquilo ) me inspiraram a apresentar um novo desafio:

O desafio

Encontre a menor rede neural de avanço de forma que, dado qualquer vetor de entrada quadridimensional (a,b,c,d) com entradas inteiras em [10,10] , a rede produza a sort(a,b,c,d) com um erro coordenado estritamente menor que 0.5 .

Admissibilidade

Para esse desafio, uma rede neural feedforward é definida como uma composição de camadas . Uma camada é uma função L:RnRm que é especificada por uma matriz ARm×n de pesos , um vector bRm de viés , e uma função de activação f:RR que é aplicada coordinate- sensato:

L(x):=f(Ax+b),xRn.

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. f(t)=t

  • ReLU. f(t)=max(t,0)

  • Softplus. f(t)=ln(et+1)

  • Tangente hiperbólica. f(t)=tanh(t)

  • Sigmoide. f(t)=etet+1

Em geral, uma rede neural admissível toma a forma LkLk1L2L1 para alguns k , onde cada camada Li é especificada por pesos Ai , polarizações bi , e uma função de activação fi da lista acima. Por exemplo, a seguinte rede neural é admissível (embora não satisfaça a meta de desempenho desse desafio, pode ser um gadget útil):

[min(a,b)max(a,b)]=[111212111212]ReLU[121212121111][ab]

Este exemplo exibe duas camadas. Ambas as camadas têm viés zero. A primeira camada usa a ativação ReLU, enquanto a segunda usa a ativação de identidade.

Pontuação

Your score is the total number of nonzero weights and biases.

(E.g., the above example has a score of 16 since the bias vectors are zero.)


2
@Close-voter: What exactly is unclear? I don't think either of the previous NN challenges was so well specified.
flawr

1
No - skip connections are not allowed.
Dustin G. Mixon

1
@ DustinG.Mixon Na verdade, eu só encontrei uma abordagem para a / min max que utiliza apenas 15 pesos em vez de 16, mas é consideravelmente menos elegante :)
flawr

3
Esse é um desafio bem especificado que eu acho que poderia servir de modelo para futuros desafios da rede neural.
xnor

1
Pessoalmente, acho difícil otimizar sem ignorar as conexões. Isso ocorre porque um NN de classificação é necessário para gerar números próximos o suficiente das entradas. Portanto, parece necessário 'lembrar' / 'reconstruir' as entradas entre as camadas. Eu não vejo como isso poderia ser feito facilmente uma vezetestá envolvido, pois não há inversões dessas funções permitidas como ativações. Portanto, ficamos apenas com as ReLUs para as quais a linha de base (com pequenas melhorias, como mostrado na resposta de flawr) já está quase ideal.
Joel

Respostas:


13

Oitava , 96 88 87 84 76 54 50 pesos e desvios

Essa rede neural de 6 camadas é essencialmente uma rede de classificação em três etapas , construída a partir de uma rede min/ muito simples maxcomo um componente. É basicamente o exemplo de rede da wikipedia, como mostrado abaixo, com uma pequena modificação: As duas primeiras comparações são feitas em paralelo. Para ignorar números negativos através da ReLU, adicionamos 100 primeiro e subtraímos 100 novamente no final.

Portanto, isso deve ser considerado apenas uma linha de base, pois é uma implementação ingênua. No entanto, classifica todos os números possíveis que não possuem uma magnitude muito grande perfeitamente. (Podemos ajustar o intervalo substituindo 100 por outro número.)

Experimente online!

componente max / min

Existe um ( consideravelmente menos elegante e mais elegante agora, obrigado @xnor!) Para encontrar o mínimo e o máximo de dois números usando menos parâmetros:

min=uma-Reeuvocê(uma-b)max=b+Reeuvocê(uma-b)

Isso significa que temos que usar muito menos pesos e preconceitos.

Obrigado @Joel por salientar que é suficiente tornar todos os números positivos na primeira etapa e revertê-la na última, que produz pesos -8. Obrigado @xnor por apontar um método max / min ainda mais curto que faz com que -22 pesos! Obrigado @ DustinG.Mixon pela dica de combinar certas matrizes que resultam em outros -4 pesos!

function z = net(u)
a1 = [100;100;0;100;100;0];
A1 = [1 0 0 0;0 0 1 0;1 0 -1 0;0 1 0 0;0 0 0 1;0 1 0 -1];
B1 = [1 0 -1 0 0 0;0 0 0 1 0 -1;0 1 1 0 0 0;0 0 0 0 1 1];
A2 = [1 0 0 0;0 1 0 0;1 -1 0 0;0 0 1 0;0 0 0 1;0 0 1 -1];
A3 = [1 0 -1 0 0 0;0 1 1 0 0 0;0 0 0 1 0 -1;0 1 1 -1 0 1;0 0 0 0 1 1];
B3 = [1 0 0 0 0;0 1 0 -1 0;0 0 1 1 0;0 0 0 0 1];
b3 = -[100;100;100;100];
relu = @(x)x .* (x>0);
id = @(x)x;
v = relu(A1 * u + a1);
w = id(B1 * v) ;
x = relu(A2 * w);
y = relu(A3 * x);
z = id(B3 * y + b3);
% disp(nnz(a1)+nnz(A1)+nnz(B1)+nnz(A2)+nnz(A3)+nnz(B3)+nnz(b3)); %uncomment to count the total number of weights
end

Experimente online!


1
As compensações constantes são basicamente usadas para tornar as entradas não negativas. Uma vez feitas na primeira camada, todas as saídas intermediárias dos blocos de comparação não são negativas e basta alterá-las novamente na última camada.
Joel

1
Você consegue um gadget min-max mais curto (a - relu(a-b), b + relu(a-b))?
xnor

@ Joel Oh agora eu vejo, que faz muito sentido :)
flawr

@xnor Muito obrigado que faz uma enorme diferença !!!!
flawr

1
Nitpick inconseqüente: a pontuação para o primeiro viés é nnz (A1 * a0), não nnz (a0). (Ou então devemos pagar o preço de uma matriz de identidade.) Esses números são os mesmos neste caso.
Dustin G. Mixon
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.