A rede, e o que se mexe nela

A tarefa é a do artigo: y = Σ tanh²(aₖ·x) − 1 com três termos, entrada de dimensão 8, lote cheio. Um bloco é camada, normalização, ReLU, camada, normalização — e, se o atalho estiver ligado, a soma entra antes da última ReLU. Tudo é sorteado pelo splitmix64 da série, e nada aqui depende do relógio: mesma configuração, mesmos números.

A escala aqui é menor que a do artigo, e vale dizer por quê: largura 12 e lote 32, contra 16 e 64 lá, porque a rede treina no seu navegador a cada mexida no controle. Os valores absolutos não batem com os das tabelas; o que bate é a forma — a perda subindo com a profundidade sem atalho, e não subindo com ele. Rodado na configuração do artigo, este mesmo código em JavaScript reproduz as seis linhas da tabela de gradientes nos sete dígitos impressos, e é o que IL21_lab_cross.py confere.

Ajuste os controles: a rede treina sozinha a cada mudança.

A perda de treino

Escala logarítmica. A linha tracejada é a perda que a testemunha alcança — a rede rasa de quatro camadas copiada para dentro desta profundidade, com identidades no resto. Ela é um ponto do espaço de parâmetros desta rede, e o que a curva fizer acima dela é o otimizador não achando o que está lá.

perda final
testemunha
razão

Norma do gradiente, camada a camada, na inicialização

Uma barra por camada, da entrada à saída, em escala logarítmica. Ligue e desligue o atalho na mesma profundidade: o perfil da rede simples abre em leque, e o da residual não. É a forma da Seção 7 do artigo — em escala menor, com razões menores — e repare no que importa: o gradiente da primeira camada é o maior, não o menor.

camada 1
última camada
razão