Redes neurais: qual função de custo usar?


49

Estou usando o TensorFlow para experimentos principalmente com redes neurais. Embora eu tenha feito algumas experiências (XOR-Problem, MNIST, algumas coisas de Regressão, ...) agora, luto com a escolha da função de custo "correta" para problemas específicos, porque no geral eu poderia ser considerado um iniciante.

Antes de vir para o TensorFlow, codifiquei alguns MLPs totalmente conectados e algumas redes recorrentes por conta própria com Python e NumPy, mas principalmente tive problemas em que bastava um erro ao quadrado simples e uma simples descida de gradiente.

No entanto, como o TensorFlow oferece muitas funções de custo em si, além de criar funções de custo personalizadas, eu gostaria de saber se existe algum tipo de tutorial, talvez especificamente para funções de custo em redes neurais? (Eu já fiz metade dos tutoriais oficiais do TensorFlow, mas eles não estão realmente explicando por que funções específicas de custo ou alunos são usados ​​para problemas específicos - pelo menos não para iniciantes)

Para dar alguns exemplos:

cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(y_output, y_train))

Eu acho que aplica a função softmax em ambas as entradas para que a soma de um vetor seja igual a 1. Mas o que exatamente é entropia cruzada com logits? Eu pensei que resume os valores e calcula a entropia cruzada ... então alguma medida métrica ?! Isso não seria o mesmo se eu normalizasse a saída, resumisse e aceitasse o erro quadrado? Além disso, por que isso é usado, por exemplo, para MNIST (ou problemas ainda mais difíceis)? Quando eu quero classificar como 10 ou talvez 1000 classes, a soma dos valores não destrói completamente nenhuma informação sobre qual classe realmente foi a saída?

cost = tf.nn.l2_loss(vector)

Para que serve isso? Eu pensei que a perda de l2 é praticamente o erro ao quadrado, mas a API do TensorFlow diz que sua entrada é apenas um tensor. Não entendeu a ideia ?!

Além disso, eu vi isso para entropia cruzada com bastante frequência:

cross_entropy = -tf.reduce_sum(y_train * tf.log(y_output))

... mas por que isso é usado? Não é matematicamente a perda na entropia cruzada:

-1/n * sum(y_train * log(y_output) + (1 - y_train) * log(1 - y_output))

Onde está a (1 - y_train) * log(1 - y_output)parte na maioria dos exemplos do TensorFlow? Não está faltando?


Respostas: Eu sei que essa pergunta é bastante aberta, mas não espero ter 10 páginas com cada função de problema / custo listada em detalhes. Eu só preciso de um breve resumo sobre quando usar qual função de custo (em geral ou no TensorFlow, não me interessa muito) e algumas explicações sobre este tópico. E / ou alguma fonte (s) para iniciantes;)


11
Boa pergunta. Bem-vindo ao site :)
Dawny33

2
Normalmente, o MSE é utilizado para regressão e a entropia cruzada para classificação. A Figura de Classificação do Mérito (CFM) foi introduzida em "Uma nova função objetiva para melhorar o reconhecimento de fonemas usando redes neurais com atraso de tempo" por Hampshire e Waibel. Se bem me lembro, eles também explicam por que eles criaram o CFM como eles fizeram.
Martin Thoma

11
Eu acho que reduza_sum (y_train * tf.log (y_output)) é muito usado porque é um exemplo bastante comum de "caso simples". Ele será executado somando o erro de cada lote, o que significa que seu erro dobrará o custo (e a magnitude do gradiente) se o tamanho do lote dobrar. Fazer a alteração simples para reduzir_mean tornará, no mínimo, a depuração e a reprodução de configurações mais compreensíveis na minha opinião.
neurônio

Respostas:


34

Essa resposta está no lado geral das funções de custo, não relacionadas ao TensorFlow, e abordará principalmente a parte "alguma explicação sobre este tópico" da sua pergunta.

Na maioria dos exemplos / tutoriais que eu segui, a função de custo usada era um tanto arbitrária. O objetivo era mais apresentar ao leitor um método específico, não a função de custo especificamente. Não deve impedir você de seguir o tutorial para se familiarizar com as ferramentas, mas minha resposta deve ajudá-lo a escolher a função de custo para seus próprios problemas.

Se você deseja respostas sobre entropia cruzada, normas Logit, L2 ou qualquer outra coisa específica, recomendamos que você publique várias perguntas mais específicas. Isso aumentará a probabilidade de alguém com conhecimento específico ver sua pergunta.


Escolher a função de custo certa para alcançar o resultado desejado é um ponto crítico dos problemas de aprendizado de máquina. A abordagem básica, se você não sabe exatamente o que deseja do seu método, é usar o Erro do quadrado médio (Wikipedia) para problemas de regressão e a Porcentagem de erro para problemas de classificação. No entanto, se você deseja obter bons resultados com seu método, precisa definir bom e, assim, definir a função de custo adequada. Isso vem do conhecimento do domínio (quais são seus dados, o que você está tentando alcançar) e do conhecimento das ferramentas à sua disposição.

Não acredito que possa guiá-lo pelas funções de custo já implementadas no TensorFlow, pois tenho muito pouco conhecimento da ferramenta, mas posso dar um exemplo de como escrever e avaliar diferentes funções de custo.


Para ilustrar as várias diferenças entre funções de custo, vamos usar o exemplo do problema de classificação binária, onde queremos, para cada amostra , a classe .xnf(xn){0,1}

Começando com propriedades computacionais ; como duas funções que medem a "mesma coisa" podem levar a resultados diferentes. Execute a seguinte função de custo simples; a porcentagem de erro. Se você tiver amostras, é a classe prevista e a classe verdadeira, você deseja minimizarNf(yn)yn

  • 1Nn{1 if f(xn)yn0 otherwise=nyn[1f(xn)]+[1yn]f(xn) .

Essa função de custo tem o benefício de ser facilmente interpretável. No entanto, não é suave; se você tiver apenas duas amostras, a função "pula" de 0 para 0,5 e para 1. Isso resultará em inconsistências se você tentar usar a descida gradiente nessa função. Uma maneira de evitá-lo é alterar a função de custo para usar probabilidades de atribuição; . A função se tornap(yn=1|xn)

  • 1Nnynp(yn=0|xn)+(1yn)p(yn=1|xn) .

Essa função é mais suave e funcionará melhor com uma abordagem de descida gradiente. Você obterá um modelo 'mais refinado'. No entanto, tem outro problema; se você tiver uma amostra ambígua, digamos que você não tenha informações suficientes para dizer algo melhor que . Então, o uso da descida gradiente nessa função de custo levará a um modelo que aumenta essa probabilidade o máximo possível e, portanto, talvez super ajuste.p(yn=1|xn)=0.5

Outro problema dessa função é que, se enquanto , você certamente está certo, mas está errado. Para evitar esse problema, você pode obter o log da probabilidade, . Como e , a seguinte função não tem o problema descrito no parágrafo anterior:p(yn=1|xn)=1yn=0logp(yn|xn)log(0)=log(1)=0

  • 1Nnynlogp(yn=0|xn)+(1yn)logp(yn=1|xn) .

Isso deve ilustrar que, para otimizar a mesma coisa , a porcentagem de erro, definições diferentes podem gerar resultados diferentes se forem mais fáceis de entender, computacionalmente.

É possível para funções de custo e para medir o mesmo conceito , mas pode levar o seu método para melhores resultados do que .ABAB


Agora vamos ver como os diferentes custos funcionam podem medir diferentes conceitos. No contexto da recuperação de informações, como na pesquisa do Google (se ignorarmos a classificação), queremos que os resultados retornados sejam

  • tenha alta precisão , não retorne informações irrelevantes
  • com alto recall , retorne o máximo de resultados relevantes possível
  • Precisão e recall (Wikipedia)

Observe que, se seu algoritmo retornar tudo , ele retornará todos os resultados relevantes possíveis e, portanto, terá alta recuperação, mas terá uma precisão muito baixa. Por outro lado, se retornar apenas um elemento, o que é mais certo é relevante, terá alta precisão, mas baixa recordação.

Para julgar tais algoritmos, a função de custo comum é o escore (Wikipedia) . O caso comum é o escore , que atribui peso igual à precisão e ao recall, mas o caso geral é o escore , e você pode ajustar para obterFF1Fββ

  • Recordação mais alta, se você usarβ>1
  • Maior precisão, se você usar .β<1

Nesse cenário, escolher a função de custo é escolher o trade-off que seu algoritmo deve fazer .

Outro exemplo frequentemente mencionado é o caso do diagnóstico médico; você pode escolher uma função de custo que puna mais falsos negativos ou falsos positivos, dependendo do que for preferível:

  • Pessoas mais saudáveis ​​sendo classificadas como doentes (mas, então, podemos tratar pessoas saudáveis, o que é caro e pode prejudicá-las se na verdade não estiverem doentes)
  • Mais pessoas doentes sendo classificadas como saudáveis ​​(mas podem morrer sem tratamento)

Em conclusão, definir a função de custo é definir o objetivo do seu algoritmo. O algoritmo define como chegar lá.


Nota lateral: Algumas funções de custo têm boas formas de algoritmo para atingir seus objetivos. Por exemplo, existe uma boa maneira de minimizar a perda de dobradiça (Wikipedia) , resolvendo o problema duplo no SVM (Wikipedia)


10

Para responder sua pergunta sobre entropia cruzada, você notará que o que você mencionou é a mesma coisa.

1n(y_trainlog(y_output)+(1y_train)log(1y_output))

que você mencionou é simplesmente a perda de entropia cruzada binária, na qual você supõe que o é um escalar 0/1 e que a saída de é novamente um escalar indicando a probabilidade de a saída ser 1.y_trainy_output

A outra equação que você mencionou é uma variante mais genérica da que se estende a várias classes

-tf.reduce_sum(y_train * tf.log(y_output)) é a mesma coisa que escrever

ntrain_problog(out_prob)

onde o somatório é sobre as várias classes e as probabilidades são para cada classe. Claramente, no caso binário, é exatamente a mesma coisa que foi mencionada anteriormente. O termo é omitido, pois não contribui de forma alguma para a minimização de perdas, pois é uma constante.n


4

BLUF: tentativa e erro iterativo com subconjunto de dados e matplotlib.

Resposta longa:

Minha equipe estava lutando com essa mesma pergunta não faz muito tempo. Todas as respostas aqui são ótimas, mas eu gostaria de compartilhar com vocês a minha "resposta do iniciante" para o contexto e como ponto de partida para as pessoas que são novas no aprendizado de máquina.

Você deseja buscar uma função de custo suave e convexa para sua escolha específica de algoritmo e conjunto de dados. Isso porque você deseja que seu algoritmo seja capaz de ajustar com confiança e eficiência os pesos para, eventualmente, atingir o mínimo global dessa função de custo. Se a sua função de custo for "irregular" com máximos e mínimos locais e / ou não tiver um mínimo global, o seu algoritmo poderá ter dificuldade em convergir; seus pesos podem saltar por todo o lado, deixando de fornecer previsões precisas e / ou consistentes.

Por exemplo, se você estiver usando regressão linear para prever o peso de alguém (número real, em libras) com base em sua altura (número real, em polegadas) e idade (número real, em anos), a função de custo médio do erro ao quadrado deve ser uma curva agradável, suave e convexa. Seu algoritmo não terá problemas para convergir.

Mas digamos que você esteja usando um algoritmo de regressão logística para um problema de classificação binária, como prever o sexo de uma pessoa com base em se ela comprou fraldas nos últimos 30 dias e se ela comprou cerveja nos últimos 30 dias. Nesse caso, o erro quadrático médio pode não fornecer uma superfície convexa lisa, o que pode ser ruim para o treinamento. E você diria isso por experimentação.

Você pode começar executando uma avaliação usando o MSE e uma amostra pequena e simples dos seus dados ou com dados simulados que você gerou para esta experiência. Visualize o que está acontecendo com o matplotlib (ou qualquer outra solução de plotagem que você preferir). A curva de erro resultante é suave e convexa? Tente novamente com uma variável de entrada adicional ... a superfície resultante ainda é lisa e convexa? Através desse experimento, você pode descobrir que, embora o MSE não se encaixe no seu problema / solução, a entropia cruzada fornece uma forma convexa suave que melhor se adapta às suas necessidades. Portanto, você pode tentar isso com um conjunto de dados de amostra maior e ver se a hipótese ainda se mantém. E se isso acontecer, você poderá experimentá-lo com seu conjunto completo de treinamento algumas vezes e ver como ele se comporta e se ele oferece consistentemente modelos semelhantes. Caso contrário, escolha outra função de custo e repita o processo.

Esse tipo de processo de tentativa e erro altamente iterativo tem funcionado muito bem para mim e minha equipe de cientistas de dados iniciantes, e nos concentramos em encontrar soluções para nossas perguntas sem precisar nos aprofundar na teoria matemática por trás da seleção de funções de custo e otimização de modelo.

Obviamente, muitas dessas tentativas e erros já foram cometidos por outras pessoas, por isso também aproveitamos o conhecimento público para nos ajudar a filtrar nossas escolhas de quais podem ser boas funções de custo no início do processo. Por exemplo, a entropia cruzada geralmente é uma boa opção para problemas de classificação, seja classificação binária com regressão logística como o exemplo acima ou uma classificação multiquadro mais complicada com uma camada de softmax como saída. Considerando que o MSE é uma boa primeira opção para problemas de regressão linear em que você está procurando uma previsão escalar em vez da probabilidade de pertencer a uma categoria conhecida de um conjunto conhecido de categorias possíveis; nesse caso, em vez de uma camada softmax como sua saída, você ' d poderia ter apenas uma soma ponderada das entradas mais o viés sem uma função de ativação.

Espero que esta resposta ajude outros iniciantes por aí sem ser excessivamente simplista e óbvio.


3

Regenerando sua pergunta

Onde está a parte (1 - y_train) * log (1 - y_output) na maioria dos exemplos do TensorFlow? Não está faltando?

A resposta é que a maioria das funções de saída são softmax. Isso significa que você não precisa necessariamente reduzir todas as probabilidades em casos errados, pois elas serão reduzidas automaticamente quando você aumentar a probabilidade da correta.

Por exemplo:

antes da otimização

y_output = [0.2, 0.2, 0.6] e y_train = [0, 0, 1]

após otimização

y_output = [0.15, 0.15, 0.7] e y_train = [0, 0, 1]

observe aqui que, embora tenhamos aumentado o terceiro mandato, todos os outros termos reduziram automaticamente

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.