paint-brush
Por que as funções de custo quadráticas são ineficazes no treinamento de redes neuraispor@varunnakra1
2,637 leituras
2,637 leituras

Por que as funções de custo quadráticas são ineficazes no treinamento de redes neurais

por Varun Nakra6m2024/06/03
Read on Terminal Reader

Muito longo; Para ler

Uma das perguntas mais comuns feitas durante entrevistas de conhecimento de aprendizagem profunda é - “Por que não podemos usar uma função de custo quadrática para treinar uma rede neural?**” Iremos nos aprofundar na resposta para isso. Haverá muita matemática envolvida, mas nada maluco! e manterei as coisas simples, mas precisas.
featured image - Por que as funções de custo quadráticas são ineficazes no treinamento de redes neurais
Varun Nakra HackerNoon profile picture
0-item

Uma das perguntas mais comuns feitas durante entrevistas de conhecimento de aprendizagem profunda é: “ Por que não podemos usar uma função de custo quadrática para treinar uma rede neural? ”. Neste artigo, discutiremos a resposta a esta pergunta. Haverá muita matemática envolvida, mas nada maluco! Vou manter as coisas simples e precisas.


Vamos começar contemplando a arquitetura geral de uma rede neural


A arquitetura geral de uma rede neural

Arquitetura de rede neural para classificação binária


Temos uma série de entradas formando uma “camada de entrada”, uma série de neurônios na “camada oculta” e um neurônio formando uma “camada de saída” para um problema de classificação binária. Para esta questão, assumiremos que estamos lidando com um classificador binário, portanto temos apenas um valor de saída fora da rede.


Agora, observe a figura a seguir, onde destacamos a camada de entrada em verde, o neurônio de saída em vermelho e um neurônio da camada oculta em laranja. De todos os verdes ao laranja, vemos que todas as entradas estão conectadas ao neurônio laranja. Ou seja, a “ativação” do neurônio laranja acontece através da “agregação” de todos os neurônios verdes da camada de entrada. Este processo é replicado em todos os neurônios em todas as camadas até chegarmos ao neurônio de saída vermelho final.



E se substituirmos o neurônio laranja pelo neurônio vermelho, ou seja, removermos a camada oculta e conectarmos o neurônio vermelho diretamente aos neurônios verdes?



Obteremos o seguinte:

Para esta questão, assumiremos a já mencionada 'arquitetura simplista' e o resultado também poderá ser generalizado para a arquitetura completa.


Agora vamos apresentar um pouco de matemática passo a passo.


O que vemos acima é a equação básica de “atualização de peso” para uma rede neural. Eu removi os hiperparâmetros extras, como o fator de aprendizagem e a subamostragem (lote mínimo), etc. w_k é o vetor de pesos e os pesos são os 'parâmetros' do nosso modelo de rede neural. w_k compreende pesos individuais reunidos em um vetor coluna. Esses pesos estão associados às entradas do modelo (ou seja, os neurônios verdes em nossa arquitetura). Temos uma função de custo C_i onde i = 1 a n são o número de instâncias de dados em nossa amostra. A função de custo C é o “erro” entre a saída real y e a saída da rede neural (neurônio vermelho). Cada instância de dados produzirá uma saída prevista em relação a uma saída real; portanto, haverá um custo ou erro para cada instância de dados. O objetivo do modelo é minimizar esta função de custo em média em todo o conjunto de dados. E como sabemos, a etapa de minimização envolve derivar uma derivada em relação aos parâmetros do modelo (pesos). Fazemos isso usando a derivada parcial do vetor w_k. Tudo isso significa que o custo C será uma expressão/agregação dos pesos w_1 a w_q e iremos diferenciar cada peso w e coletá-lo em um vetor. Isso é chamado de “vetor gradiente” negativo. É usado para atualizar o vetor de peso da k-ésima iteração para a (k+1)ésima iteração. A metodologia é a descida do gradiente estocástico, mas deixaremos isso de fora neste artigo.


Resumindo, a rede neural aprende por meio de uma atualização dos pesos por meio do vetor gradiente negativo calculado em média sobre todas as amostras e calculado para w_k. Isso nos ajuda a avançar para a minimização da função de custo e ajuda a rede a aprender e melhorar sua precisão. É óbvio que se as atualizações dos pesos não estiverem acontecendo, porque o gradiente negativo está se aproximando de zero, o aprendizado foi interrompido. Isso não significa necessariamente que atingimos o mínimo! Porque a nossa função de custo é altamente complicada e precisamos de encontrar um mínimo num espaço multidimensional. Portanto, pode haver muitos mínimos locais onde o gradiente é zero e a rede para de aprender. De qualquer forma, não precisamos nos preocupar com isso para esse problema.


Vejamos a seguinte expressão:


Esta expressão define z_i como uma soma ponderada das entradas x_ji. Observe que essas entradas são os neurônios verdes em nossa arquitetura. Como não temos camada oculta, combinamos as entradas x_ji e os pesos w_j e adicionamos um termo de polarização para obter z_i que é o que é representado pelas setas de conexão dos neurônios verdes ao neurônio vermelho em nossa arquitetura. Como temos q entradas, temos x_j e w_j onde j = 1 para q

Mas não passamos z_i para o neurônio vermelho. Aplicamos uma “função de ativação” a ele. Esta função de ativação pode ser diferente para diferentes redes neurais. Para efeitos deste problema, assumimos que a função de ativação é “Sigmóide” ou “logística”. Assumirei aqui que o leitor está ciente dessa função e seguirei em frente.


A seguir vem a nossa principal declaração do problema - Como definimos a função Custo (C)? É bem sabido que para classificação binária, a função de custo é “Entropia cruzada”, mas a questão aqui é por que não pode ser “Quadrática”.


Vamos definir as expressões de ambas as funções de custo:


Função de custo quadrática – Função de custo de entropia cruzada -


Embora a função de custo quadrática seja direta (pense na minimização de mínimos quadrados entre a produção real y_i e a produção prevista a_i), podemos oferecer alguma explicação para a função de custo de entropia cruzada. Isso é semelhante à probabilidade logarítmica negativa em nossos modelos de regressão. Observe que existe um sinal negativo fora dos colchetes, que é usado para manter o custo positivo (porque a_i estará entre 0 e 1 - uma saída de sigmóide, portanto, o termo entre colchetes será sempre negativo). Observe também que quando a_i chega muito perto de y_i, o custo fica muito próximo de zero. Isso ocorre porque, quando y_i = 1 e a_i ~ 1, ln(a_i) será aproximadamente 0. Da mesma forma, quando y_i= 0 e a_i ~ 0, ln(1-a_i) será aproximadamente 0. Assim, esta função mantém o custo positivo e mínimo quando o modelo está prevendo bem. No entanto, o mesmo pode ser dito sobre a função de custo quadrática. Mas não usamos. Por que? Aí vem a explicação


Voltamos à equação básica de atualização de peso que vimos anteriormente e inserimos nela a função de custo quadrática. Obtemos o seguinte

Agora, para simplificar, consideraremos apenas um ponto de dados, ou seja, i=1 e n=1. E diferenciamos parcialmente para cada peso w_j. Obtemos o seguinte:

Lembre-se que como i = 1, temos

Substituindo o valor de z, obtemos

Esse é o nosso vetor gradiente responsável por atualizar os pesos da rede que terá uma derivada da função sigmóide quando usarmos uma função de custo quadrática.


Agora vamos dar uma olhada no comportamento da derivada da função sigmóide:


A partir do gráfico acima, fica claro que a derivada, que representa a inclinação da função sigmóide, se aproxima de 0 assim que a entrada z se torna grande! O que isto significa? Isso significa que o vetor gradiente será zero quando a entrada de ativação z for grande. Portanto, a rede irá parar de aprender porque os pesos não serão atualizados. Lembre-se de que isso não significa que atingimos o mínimo. Isso significa que estamos presos em um ponto indesejável e no espaço funcional que pode estar longe do valor mínimo. Isso é conhecido como “aprendizado lento”. No entanto, isso NÃO ocorre com uma função de custo de entropia cruzada.


Realizamos a mesma substituição usando a função de custo de entropia cruzada e obtemos o seguinte:

É interessante notar que o termo:

também ocorre no gradiente para custo quadrático. No entanto, existe um truque que usaremos para simplificá-lo. O gradiente da função sigmóide pode ser expresso da seguinte forma

Substituímos isso em nossa expressão original e obtemos o seguinte:

Esse é o nosso vetor gradiente responsável por atualizar os pesos da rede e não possui derivada da função sigmóide quando utilizamos uma função de custo de entropia cruzada. Portanto, não há desaceleração no aprendizado com esta função de custo.


Justapomos os gradientes novamente para uma visão melhor:

Isso responde à nossa pergunta original – não usamos a função de custo quadrática porque ela leva a uma desaceleração do aprendizado.


Observe que a análise acima foi feita apenas na camada de saída (de um neurônio), entretanto, também pode ser generalizada para uma rede neural geral!