Eu tento entender o papel da derivada da função sigmóide nas redes neurais.
Primeiro, planto a função sigmóide e derivada de todos os pontos da definição usando python. Qual é exatamente o papel desse derivado?
import numpy as np
import matplotlib.pyplot as plt
def sigmoid(x):
return 1 / (1 + np.exp(-x))
def derivative(x, step):
return (sigmoid(x+step) - sigmoid(x)) / step
x = np.linspace(-10, 10, 1000)
y1 = sigmoid(x)
y2 = derivative(x, 0.0000000000001)
plt.plot(x, y1, label='sigmoid')
plt.plot(x, y2, label='derivative')
plt.legend(loc='upper left')
plt.show()
machine-learning
neural-network
lukassz
fonte
fonte
Respostas:
O uso de derivadas em redes neurais é para o processo de treinamento chamado backpropagation . Essa técnica usa descida gradiente para encontrar um conjunto ideal de parâmetros do modelo para minimizar uma função de perda. No seu exemplo, você deve usar a derivada de um sigmóide, porque essa é a ativação que seus neurônios individuais estão usando.
A função de perda
A essência do aprendizado de máquina é otimizar uma função de custo para que possamos minimizar ou maximizar alguma função de destino. Isso geralmente é chamado de função de perda ou custo. Normalmente, queremos minimizar essa função. A função de custo, , associa alguma penalidade com base nos erros resultantes ao passar dados pelo seu modelo como uma função dos parâmetros do modelo.C
Vejamos o exemplo em que tentamos rotular se uma imagem contém um gato ou um cachorro. Se tivermos um modelo perfeito, podemos dar uma imagem ao modelo e ele nos dirá se é um gato ou um cachorro. No entanto, nenhum modelo é perfeito e cometerá erros.
Quando treinamos nosso modelo para poder inferir o significado dos dados de entrada, queremos minimizar a quantidade de erros cometidos. Portanto, usamos um conjunto de treinamento, esses dados contêm muitas fotos de cães e gatos e temos o rótulo de verdade associado a essa imagem. Cada vez que executamos uma iteração de treinamento do modelo, calculamos o custo (a quantidade de erros) do modelo. Queremos minimizar esse custo.
Existem muitas funções de custo, cada uma servindo a seu próprio propósito. Uma função de custo comum usada é o custo quadrático, definido como
.C=1N∑Ni=0(y^−y)2
Esse é o quadrado da diferença entre o rótulo previsto e o rótulo de verdade das imagens que treinamos. Queremos minimizar isso de alguma forma.N
Minimizando uma função de perda
De fato, a maior parte do aprendizado de máquina é simplesmente uma família de estruturas capazes de determinar uma distribuição, minimizando algumas funções de custo. A pergunta que podemos fazer é "como podemos minimizar uma função"?
Vamos minimizar a seguinte função
.y=x2−4x+6
Se traçarmos isso, podemos ver que há um mínimo em . Para fazer isso analiticamente, podemos tomar a derivada dessa função comox=2
.x=2
No entanto, muitas vezes encontrar um mínimo global analiticamente não é viável. Então, em vez disso, usamos algumas técnicas de otimização. Aqui também existem muitas maneiras diferentes, tais como: Newton-Raphson, pesquisa em grade, etc. Entre elas está a descida em gradiente . Essa é a técnica usada pelas redes neurais.
Gradiente descendente
Vamos usar uma analogia famosa para entender isso. Imagine um problema de minimização 2D. Isso é equivalente a estar em uma caminhada montanhosa no deserto. Você quer voltar para a vila que você sabe que está no ponto mais baixo. Mesmo se você não souber as direções cardeais da vila. Tudo o que você precisa fazer é seguir continuamente o caminho mais íngreme e, eventualmente, você chegará à vila. Então, desceremos a superfície com base na inclinação da encosta.
Vamos assumir a nossa função
determinaremos o para o qual y é minimizado. O algoritmo de descida gradiente primeiro diz que escolheremos um valor aleatório para x . Vamos inicializar em x = 8 . Em seguida, o algoritmo fará o seguinte iterativamente até alcançarmos a convergência.x y x x=8
onde é a taxa de aprendizado, podemos definir isso para qualquer valor que desejarmos. No entanto, existe uma maneira inteligente de escolher isso. Grande demais e nunca alcançaremos nosso valor mínimo, e grande demais perderemos muito tempo antes de chegarmos lá. É análogo ao tamanho das etapas que você deseja descer a ladeira íngreme. Pequenos degraus e você morrerá na montanha, nunca descerá. Um passo muito grande e você corre o risco de atirar na vila e acabar do outro lado da montanha. A derivada é o meio pelo qual percorremos esta encosta em direção ao nosso mínimo.ν
Iteração 1:
x n e w = = 3,25 x n e w = 3,25 - 0,1 ( 2 ∗ 3,25xnew=8−0.1(2∗8−4)=6.8 xnew=6.8−0.1(2∗6.8−4)=5.84
xnew=5.84−0.1(2∗5.84−4)=5.07 xnew=5.07−0.1(2∗5.07−4)=4.45
xnew=4.45−0.1(2∗4.45−4)=3.96
xnew=3.96−0.1(2∗3.96−4)=3.57
xnew=3.57−0.1(2∗3.57−4)=3.25 xnew=3.25−0.1(2∗3.25−4)=3.00 xnew=3.00−0.1(2∗3.00−4)=2.80
xnew=2.80−0.1(2∗2.80−4)=2.64
xnew=2.64−0.1(2∗2.64−4)=2.51 xnew=2.51−0.1(2∗2.51−4)=2.41
xnew=2.41−0.1(2∗2.41−4)=2.32 xnew=2.32−0.1(2∗2.32−4)=2.26
xnew=2.26−0.1(2∗2.26−4)=2.21
xnew=2.21−0.1(2∗2.21−4)=2.16
xnew=2.16−0.1(2∗2.16−4)=2.13 xnew=2.13−0.1(2∗2.13−4)=2.10
xnew=2.10−0.1(2∗2.10−4)=2.08
xnew=2.08−0.1(2∗2.08−4)=2.06 xnew=2.06−0.1(2∗2.06−4)=2.05
xnew=2.05−0.1(2∗2.05−4)=2.04 xnew=2.04−0.1(2∗2.04−4)=2.03
xnew=2.03−0.1(2∗2.03−4)=2.02 xnew=2.02−0.1(2∗2.02−4)=2.02 xnew=2.02−0.1(2∗2.02−4)=2.01
xnew=2.01−0.1(2∗2.01−4)=2.01
xnew=2.01−0.1(2∗2.01−4)=2.01
xnew=2.01−0.1(2∗2.01−4)=2.00 xnew=2.00−0.1(2∗2.00−4)=2.00 xnew=2.00−0.1(2∗2.00−4)=2.00
xnew=2.00−0.1(2∗2.00−4)=2.00
xnew=2.00−0.1(2∗2.00−4)=2.00
x n e w = 5,84 - 0,1 ( 2 ∗ 5,84 - 4 ) = 5,07 x n e w = 5,07 - 0,1
x n e w = 4,45 - 0,1 ( 2 ∗ 4,45 - 4 ) = 3,96 x n e w = 3,96 - 0,1 ( 2 ∗ 3,96 - 4 ) = 3,57 x n e w = 3,57 - 0,1 ( 2 ∗ 3,57 - 4 )
x n e w 2,64 - 0,1 ( 2 ∗ 2,64 - 4 ) = 2,51 x n e w = 2,51 - 0,1 ( 2 ∗ 2,51 -
x n e w = 2,80 - 0,1 ( 2 ∗ 2,80 - 4 ) = 2,64 x n e w =
x n e w = 2.41 - 0.1 ( 2 ∗ 2.41 - 4 ) = 2.32 x n e w = 2,32 - 0,1 ( 2 ∗ 2,32
x n e w = 2,26 - 0,1 ( 2 ∗ 2,26 - 4 ) = 2,21 x n e w = 2,21 - 0,1 ( 2 ∗ 2,21 - 4 ) = 2,16 x n e w = 2,16 - 0,1 ( 2 ∗ 2,16 - 4 ) = 2,13 x n
x n e w =2,10-0,1(2∗2,10-4)=2,08 x n e w =2,08-0,1(2∗2,08-4)=2,06 x n e w =2,06-0,1(
x n e w = 2,05 - 0,1 ( 2 ∗ 2,05 - 4 ) = 2,04 2,02 x n e w =
x n e w = 2,03 - 0,1 ( 2 ∗ 2,03 - 4 ) =
x n e w = 2,02 - 0,1 ( - 0,1 ( 2 ∗ 2,01 - 4 ) = 2,01 x n e w = 2,01 - 0,1 ( 2 ∗ 2,01 - 4 ) = 2,00
x n e w = 2,01 - 0,1 ( 2 ∗ 2,01 - 4 ) = 2,01 x n e w = 2,01
x n e w = 2,00 - 0,1 ( 2 ∗ 2,00 -
x n e w = 2,00 - 0,1 ( 2 ∗ 2,00 - 4 ) = 2,00 x n e w = 2,00 - 0,1 ( 2 ∗ 2,00 - 4 ) = 2,00
E vemos que o algoritmo converge em ! Nós encontramos o mínimo.x=2
Aplicado a redes neurais
As primeiras redes neurais só tinha um único neurônio que teve em algumas entradas e, em seguida, fornecer uma saída y . Uma função comum usada é a função sigmóidex y^
onde é o peso associado a cada entrada x e temos um viés b . Em seguida, queremos minimizar nossa função de custow x b
.C=12N∑Ni=0(y^−y)2
Como treinar a rede neural?
Usaremos gradiente descendente para treinar os pesos com base na saída da função sigmóide e usaremos alguma função custo e trem em lotes de dados de tamanho N .C N
é a classe predito obtido a partir da função sigmóide eyé o rótulo verdade chão. Usaremos a descida gradiente para minimizar a função de custo em relação aos pesosw. Para facilitar a vida, dividiremos a derivada da seguinte formay^ y w
.∂C∂w=∂C∂y^∂y^∂w
e nós temosy^=σ(wTx) ∂σ(z)∂z=σ(z)(1−σ(z))
Assim, podemos atualizar os pesos através da descida do gradiente conforme
fonte
Uma das razões pelas quais a função sigmóide é popular nas redes neurais é porque sua derivada é fácil de calcular .
fonte
Em palavras simples:
Por exemplo, se a entrada for 0 ou 1 ou -2 , a derivada (a "capacidade de aprendizado") é alta e a propagação traseira melhorará drasticamente o peso dos neurônios para esta amostra.
Por outro lado, se a entrada for 20 , a derivada estará muito próxima de 0 . Isso significa que a propagação traseira nesta amostra não "ensinará" esse neurônio a produzir um resultado melhor.
Os itens acima são válidos para uma única amostra.
Vejamos a foto maior, para todas as amostras no conjunto de treinamento. Aqui temos várias situações:
Se a derivada for 0 para todas as amostras em seu conjunto de treinamento E o neurônio sempre produzirá resultados corretos - isso significa que o neurônio está estudando muito bem e já é o mais inteligente possível (observação: esse caso é bom, mas pode indicar um potencial ajuste excessivo, o que não é bom)
Se a derivada for 0 em algumas amostras, não 0 em outras amostras E o neurônio produzir resultados mistos - isso indica que esse neurônio está fazendo um bom trabalho e pode potencialmente melhorar com o treinamento adicional (embora não necessariamente, pois depende de outros neurônios e dados de treinamento que você ter)
Portanto, quando você olha para o gráfico derivado, pode ver quanto o neurônio se preparou para aprender e absorver o novo conhecimento, dada uma entrada específica.
fonte
A derivada que você vê aqui é importante nas redes neurais. É a razão pela qual as pessoas geralmente preferem algo mais, como unidade linear retificada .
Você vê a queda da derivada para as duas extremidades? E se a sua rede estiver do lado esquerdo, mas precisar passar para o lado direito? Imagine que você está em -10.0, mas você quer 10.0. O gradiente será muito pequeno para a sua rede convergir rapidamente. Não queremos esperar, queremos uma convergência mais rápida. RLU não tem esse problema.
Chamamos esse problema de " saturação da rede neural ".
Consulte https://www.quora.com/What-is-special-about-rectifier-neural-units-used-in-NN-learning
fonte