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
dydx=2x−4=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=x2−4x+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=2x−4
ν=0.1
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
x n e w = 5,84 - 0,1 ( 2 ∗ 5,84 - 4 ) = 5,07 x n e w = 5,07 - 0,1xnew=6.8−0.1(2∗6.8−4)=5.84
xnew=5.84−0.1(2∗5.84−4)=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.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
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.25−0.1(2∗3.25−4)=3.00
x n e w = 2,80 - 0,1 ( 2 ∗ 2,80 - 4 ) = 2,64 x n e w =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
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.51−0.1(2∗2.51−4)=2.41
xnew=2.41−0.1(2∗2.41−4)=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.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
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(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
x n e w = 2,05 - 0,1 ( 2 ∗ 2,05 - 4 ) = 2,04 2,02 x n e w =xnew=2.06−0.1(2∗2.06−4)=2.05
xnew=2.05−0.1(2∗2.05−4)=2.04
x n e w = 2,03 - 0,1 ( 2 ∗ 2,03 - 4 ) =xnew=2.04−0.1(2∗2.04−4)=2.03
xnew=2.03−0.1(2∗2.03−4)=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.02−0.1(2∗2.02−4)=2.02
x n e w = 2,01 - 0,1 ( 2 ∗ 2,01 - 4 ) = 2,01 x n e w = 2,01xnew=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
x n e w = 2,00 - 0,1 ( 2 ∗ 2,00 -xnew=2.00−0.1(2∗2.00−4)=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.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
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=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 .CN
C=12N∑Ni(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
.∂C∂w=∂C∂y^∂y^∂w
∂C∂y^=y^−y
e nós temos y^=σ(wTx)∂σ(z)∂z=σ(z)(1−σ(z))
∂y^∂w=11+exp(wTx+b)(1−11+exp(wTx+b))
Assim, podemos atualizar os pesos através da descida do gradiente conforme
wnew=wold−η∂C∂w
η