Diferença de funções de ativação em redes neurais em geral

15

Estudei os tipos de função de ativação para redes neurais. As funções em si são bastante diretas, mas a diferença de aplicação não é totalmente clara.

É razoável que se diferencie entre as funções do tipo lógico e linear, dependendo da saída binária / contínua desejada, mas qual é a vantagem da função sigmóide em relação à linear simples?

ReLU é especialmente difícil de entender para mim, por exemplo: qual é o sentido de usar uma função que se comporta como linear em caso de entradas positivas, mas é "plana" em caso de negativas? Qual é a intuição por trás disso? Ou é apenas uma coisa simples de tentativa e erro, nada mais?

Hendrik
fonte

Respostas:

15

Uma pergunta semelhante foi feita no CV: lista abrangente de funções de ativação em redes neurais com prós / contras .

Copio abaixo uma das respostas:

Uma dessas listas, embora não seja muito exaustiva: http://cs231n.github.io/neural-networks-1/

Funções de ativação comumente usadas

Toda função de ativação (ou não linearidade ) pega um único número e executa uma certa operação matemática fixa nela. Existem várias funções de ativação que você pode encontrar na prática:

insira a descrição da imagem aquiinsira a descrição da imagem aqui

Esquerda: a não linearidade sigmóide esmaga os números reais para variar entre [0,1] Direita: A não linearidade tanh esmaga os números reais para variar entre [-1,1].

Sigmoide. A não linearidade sigmóide tem a forma matemática e é mostrada na imagem acima à esquerda. Como mencionado na seção anterior, ele pega um número com valor real e o "esmaga" na faixa entre 0 e 1. Em particular, grandes números negativos se tornam 0 e grandes números positivos se tornam 1. A função sigmoide tem sido frequentemente usada historicamente uma vez que tem uma boa interpretação como a taxa de disparo de um neurônio: de não disparar (0) a disparo totalmente saturado em uma frequência máxima assumida (1). Na prática, a não linearidade sigmóide caiu recentemente em desuso e raramente é usada. Ele tem duas desvantagens principais:σ(x)=1 1/(1 1+e-x)

  • Os sigmóides saturam e matam gradientes . Uma propriedade muito indesejável do neurônio sigmóide é que, quando a ativação do neurônio satura na cauda de 0 ou 1, o gradiente nessas regiões é quase zero. Lembre-se de que durante a retropropagação, esse gradiente (local) será multiplicado pelo gradiente da saída desse gate para todo o objetivo. Portanto, se o gradiente local for muito pequeno, ele efetivamente "matará" o gradiente e quase nenhum sinal fluirá através do neurônio para seus pesos e recursivamente para seus dados. Além disso, é preciso ter cuidado extra ao inicializar os pesos dos neurônios sigmóides para evitar a saturação. Por exemplo, se os pesos iniciais forem muito grandes, a maioria dos neurônios ficará saturada e a rede mal aprenderá.
  • As saídas sigmóides não são centralizadas em zero . Isso é indesejável, uma vez que neurônios em camadas posteriores de processamento em uma rede neural (mais sobre isso em breve) receberiam dados que não são centralizados em zero. Isso tem implicações na dinâmica durante a descida do gradiente, porque se os dados que entram no neurônio são sempre positivos (por exemplo, elementwise em )), então o gradiente nos pesos durante a retropropagação se torna: todos são positivos ou todos negativos (dependendo do gradiente de toda a expressão f = w T x + b w fx>0 0f=WTx+bWf) Isso poderia introduzir uma dinâmica indesejável de zigue-zague nas atualizações de gradiente para os pesos. No entanto, observe que, depois que esses gradientes são somados em um lote de dados, a atualização final dos pesos pode ter sinais variáveis, mitigando um pouco esse problema. Portanto, isso é um inconveniente, mas tem consequências menos graves em comparação com o problema de ativação saturada acima.

Tanh. A não linearidade tanh é mostrada na imagem acima à direita. Ele comprime um número com valor real no intervalo [-1, 1]. Como o neurônio sigmóide, suas ativações saturam, mas, diferentemente do neurônio sigmóide, sua produção é centrada em zero. Portanto, na prática, a não linearidade de tanh é sempre preferida à não linearidade sigmóide. Observe também que o neurônio tanh é simplesmente um neurônio sigmóide em escala, em particular o seguinte: .tanh(x)=2σ(2x)-1 1

insira a descrição da imagem aquiinsira a descrição da imagem aqui

Esquerda: Função de ativação da Unidade Linear Retificada (ReLU), que é zero quando x <0 e, em seguida, linear com a inclinação 1 quando x> 0. Direita: Um gráfico de Krizhevsky et al. (pdf) documento indicando a melhoria de 6x na convergência com a unidade ReLU em comparação com a unidade tanh.

ReLU. A Unidade Linear Retificada se tornou muito popular nos últimos anos. Ele calcula a função . Em outras palavras, a ativação é simplesmente limiar a zero (veja a imagem acima à esquerda). Existem vários prós e contras no uso das ReLUs:f(x)=max(0 0,x)

  • (+) Verificou-se que acelera bastante (por exemplo, um fator de 6 em Krizhevsky et al. ) A convergência da descida do gradiente estocástico em comparação com as funções sigmóide / tanh. Argumenta-se que isso se deve à sua forma linear e não saturante.
  • (+) Comparado aos neurônios tanh / sigmóides que envolvem operações caras (exponenciais, etc.), a ReLU pode ser implementada simplesmente limitando uma matriz de ativações a zero.
  • (-) Infelizmente, as unidades ReLU podem ser frágeis durante o treinamento e podem "morrer". Por exemplo, um grande gradiente que flui através de um neurônio ReLU pode fazer com que os pesos sejam atualizados de forma que o neurônio nunca seja ativado novamente em nenhum ponto de dados novamente. Se isso acontecer, o gradiente que flui através da unidade será para sempre zero a partir desse ponto. Ou seja, as unidades ReLU podem morrer irreversivelmente durante o treinamento, pois podem ser eliminadas do coletor de dados. Por exemplo, você pode achar que até 40% da sua rede pode estar "morta" (por exemplo, neurônios que nunca são ativados em todo o conjunto de dados de treinamento) se a taxa de aprendizado estiver muito alta. Com uma configuração adequada da taxa de aprendizado, isso é menos frequente.

ReLU com vazamento. ReLUs com vazamento são uma tentativa de corrigir o problema "ReLU que está morrendo". Em vez de a função ser zero quando x <0, uma ReLU com vazamento terá uma pequena inclinação negativa (de 0,01 ou mais). Ou seja, a função calcula que é uma constante pequena. Algumas pessoas relatam sucesso com essa forma de função de ativação, mas os resultados nem sempre são consistentes. A inclinação na região negativa também pode ser transformada em um parâmetro de cada neurônio, como visto nos neurônios PReLU, introduzidos em Delving Deep into Rectifiers , por Kaiming He et al., 2015. No entanto, atualmente, a consistência do benefício entre as tarefas é atualmente claro.f(x)=1 1(x<0 0)(αx)+1 1(x> =0 0)(x)α

insira a descrição da imagem aqui

Maxout . Outros tipos de unidades foram propostos que não possuem a forma funcional onde uma não linearidade é aplicada no produto escalar entre os pesos e os dados. Uma escolha relativamente popular é o neurônio Maxout (introduzido recentemente por Goodfellow et al. ) Que generaliza o ReLU e sua versão com vazamento. O neurônio Maxout calcula a função . Observe que ReLU e Leaky ReLU são um caso especial desse formulário (por exemplo, para ReLU, temosf(WTx+b)max(W1 1Tx+b1 1,W2Tx+b2)W1 1,b1 1=0 0) O neurônio Maxout, portanto, desfruta de todos os benefícios de uma unidade ReLU (regime linear de operação, sem saturação) e não tem suas desvantagens (ReLU moribundo). No entanto, diferentemente dos neurônios da ReLU, ele dobra o número de parâmetros para cada neurônio, levando a um número total alto de parâmetros.

Isso conclui nossa discussão sobre os tipos mais comuns de neurônios e suas funções de ativação. Como último comentário, é muito raro misturar e combinar diferentes tipos de neurônios na mesma rede, mesmo que não haja nenhum problema fundamental em fazê-lo.

TLDR : " Que tipo de neurônio devo usar? " Use a não linearidade da ReLU, tenha cuidado com suas taxas de aprendizado e, possivelmente, monitore a fração de unidades "mortas" em uma rede. Se isso lhe interessar, experimente o Leaky ReLU ou o Maxout. Nunca use sigmóide. Tente tanh, mas espere que funcione pior que ReLU / Maxout.


Licença:


A Licença MIT (MIT)

Copyright (c) 2015 Andrej Karpathy

A permissão é concedida, gratuitamente, a qualquer pessoa que obtenha uma cópia deste software e dos arquivos de documentação associados (o "Software"), para negociar no Software sem restrições, incluindo, sem limitação, os direitos de uso, cópia, modificação, fusão , publicar, distribuir, sublicenciar e / ou vender cópias do Software e permitir que as pessoas a quem o Software é fornecido o façam, sob as seguintes condições:

O aviso de direitos autorais acima e este aviso de permissão devem ser incluídos em todas as cópias ou partes substanciais do Software.

O SOFTWARE É FORNECIDO "TAL COMO ESTÁ", SEM GARANTIA DE QUALQUER TIPO, EXPRESSA OU IMPLÍCITA, INCLUINDO MAS NÃO SE LIMITANDO A GARANTIAS DE COMERCIALIZAÇÃO, ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA E NÃO INFRACÇÃO. EM NENHUM CASO OS AUTORES OU TITULARES DE DIREITOS AUTORAIS SERÃO RESPONSÁVEIS POR QUALQUER REIVINDICAÇÃO, DANOS OU OUTRA RESPONSABILIDADE, SEJA EM AÇÃO DE CONTRATO, TORT OU OUTRA FORMA, proveniente, fora ou em conexão com o software ou o uso ou outros acordos no PROGRAMAS.*

Franck Dernoncourt
fonte
Obrigado, este resumo fornece algumas informações, mas, francamente, ainda não consigo compreender alguns detalhes intuitivamente (por exemplo, por que o ReLU "acelera bastante a convergência do SGD") e, acima de tudo: qual escolher? Com base na conclusão, Maxout é o melhor e é o fim disso. Mas, além do fato de o Maxout não ser implementado nos pacotes mais populares (em Keras, por exemplo), parece-me razoável que pelo menos na última camada outros tipos sejam colocados (sigmoide para biclassificação, por exemplo).
Hendrik