Papel derivado da função sigmóide em redes neurais

18

Eu tento entender o papel da derivada da função sigmóide nas redes neurais. insira a descrição da imagem aqui

Primeiro, planto a função sigmóide e derivada de todos os pontos da definição usando python. Qual é exatamente o papel desse derivado? insira a descrição da imagem aqui

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()
lukassz
fonte
2
Se você tiver mais perguntas, não hesite em perguntar
JahKnows

Respostas:

23

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=1Ni=0N(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=x24x+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

dydx=2x4=0

.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

y=x24x+6

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.xyxx=8

xnew=xoldνdydx

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.ν

dydx=2x4

ν=0.1

Iteração 1:

x n e w = = 3,25 x n e w = 3,25 - 0,1 ( 2 3,25xnew=80.1(284)=6.8
x n e w = 5,84 - 0,1 ( 2 5,84 - 4 ) = 5,07 x n e w = 5,07 - 0,1xnew=6.80.1(26.84)=5.84
xnew=5.840.1(25.844)=5.07
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 )xnew=5.070.1(25.074)=4.45
xnew=4.450.1(24.454)=3.96
xnew=3.960.1(23.964)=3.57
xnew=3.570.1(23.574)=3.25
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 -xnew=3.250.1(23.254)=3.00
x n e w = 2,80 - 0,1 ( 2 2,80 - 4 ) = 2,64 x n e w =xnew=3.000.1(23.004)=2.80
xnew=2.800.1(22.804)=2.64
xnew=2.640.1(22.644)=2.51
x n e w = 2.41 - 0.1 ( 2 2.41 - 4 ) = 2.32 x n e w = 2,32 - 0,1 ( 2 2,32xnew=2.510.1(22.514)=2.41
xnew=2.410.1(22.414)=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 nxnew=2.320.1(22.324)=2.26
xnew=2.260.1(22.264)=2.21
xnew=2.210.1(22.214)=2.16
xnew=2.160.1(22.164)=2.13
x n e w =2,10-0,1(22,10-4)=2,08 x n e w =2,08-0,1(22,08-4)=2,06 x n e w =2,06-0,1(xnew=2.130.1(22.134)=2.10
xnew=2.100.1(22.104)=2.08
xnew=2.080.1(22.084)=2.06
x n e w = 2,05 - 0,1 ( 2 2,05 - 4 ) = 2,04 2,02 x n e w =xnew=2.060.1(22.064)=2.05
xnew=2.050.1(22.054)=2.04
x n e w = 2,03 - 0,1 ( 2 2,03 - 4 ) =xnew=2.040.1(22.044)=2.03
xnew=2.030.1(22.034)=2.02
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,00xnew=2.020.1(22.024)=2.02
x n e w = 2,01 - 0,1 ( 2 2,01 - 4 ) = 2,01 x n e w = 2,01xnew=2.020.1(22.024)=2.01
xnew=2.010.1(22.014)=2.01
xnew=2.010.1(22.014)=2.01
xnew=2.010.1(22.014)=2.00
x n e w = 2,00 - 0,1 ( 2 2,00 -xnew=2.000.1(22.004)=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,00xnew=2.000.1(22.004)=2.00
xnew=2.000.1(22.004)=2.00
xnew=2.000.1(22.004)=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óidexy^

σ(z)=11+exp(z)

y^(wTx)=11+exp(wTx+b)

onde é o peso associado a cada entrada x e temos um viés b . Em seguida, queremos minimizar nossa função de custowxb

.C=12Ni=0N(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 .CN

C=12NiN(y^y)2

é 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^yw

.Cw=Cy^y^w

Cy^=y^y

e nós temos y^=σ(wTx)σ(z)z=σ(z)(1σ(z))

y^w=11+exp(wTx+b)(111+exp(wTx+b))

Assim, podemos atualizar os pesos através da descida do gradiente conforme

wnew=woldηCw

η

JahKnows
fonte
2
por favor me diga por que esse processo não é tão bem descrito nos livros? você tem um blog? Quais materiais para aprender redes neurais você recomenda? Eu tenho dados de teste e quero treiná-los. Posso desenhar uma função que minimizarei? Eu gostaria de visualizar esse processo para entendê-lo melhor.
Lukassz
Você pode explicar a retropropagação dessa maneira simples?
Lukassz 23/04/19
1
Resposta incrível ... (+ 1)
Aditya
1
O Backprop também é semelhante ao que o JahKnows explicou acima ... É apenas o gradiente carregado até as entradas desde as saídas. Uma rápida pesquisa no Google deixará isso claro. O mesmo vale para todas as outras funções de ativação. .. #
Aditya
1
Cw=(y^y)derivative of sigmoidy^yy^y
2

XWX+bσ(WX+b)

y^y L(y,y^)=L(y,σ(WX+b))Wb

Wb

Uma das razões pelas quais a função sigmóide é popular nas redes neurais é porque sua derivada é fácil de calcular .

M Sef
fonte
1

Em palavras simples:

Derivada mostra a capacidade do neurônio de aprender sobre informações específicas.

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, o neurônio sempre produzirá resultados incorretos - isso significa que o neurônio está saturado (mudo) e não melhora.
  • 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.

VeganHunter
fonte
0

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

SmallChess
fonte