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
- 1N∑n{10 if f(xn)≠yn otherwise=∑nyn[1−f(xn)]+[1−yn]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)
- 1N∑nynp(yn=0|xn)+(1−yn)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
- 1N∑nynlogp(yn=0|xn)+(1−yn)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)