Aprendizado profundo | 3 | A maneira correta de abrir o perceptron multicamadas

perceptron de camada única

insira a descrição da imagem aqui
A diferença essencial entre perceptron e regressão linear: a saída é diferente

  • A saída da regressão linear é um valor real contínuo

  • A saída do perceptron é uma classe discreta {0, 1} ou {-1, 1}

Portanto, o perceptron pode ser considerado um classificador para classificação binária: quando a saída for 0, indica a primeira categoria, e quando a saída for 1, indica a segunda categoria .

Método de Treinamento Perceptron

  1. Inicializar w e b
  2. ciclo:
  3.    ~~  如果yi × ( < wi , xi > + b ) ≤ 0 y_i \times (<w_i, x_i> + b) \leq 0yeu×( <ceu,xeu>+ b )0 , então:
  4.      ~~~~    w ← w + yixi , b ← b + yiw \leftarrow w + y_ix_i, b \leftarrow b + y_icc+yeuxeu,bb+yeu
  5. Até que todas as categorias sejam classificadas corretamente

No processo acima, a função de perda pode ser escrita como:

l = max ( 0 , − y < w , x > ) \mathcal{l}=\text{max}(0, -y<\pmb{w, x}>)eu=máx ( 0 ,y<w ,x>)

A primeira crise da IA: o problema XOR

Perceptrons não podem resolver o problema XOR: é difícil dividir o problema XOR com uma função linear.

Nesse momento, o perceptron multicamadas entra em ação para resolver o problema.

perceptron multicamadas

insira a descrição da imagem aqui
Um dos propósitos propostos pelo perceptron multicamadas é permitir que ele resolva o problema XOR.

Para vários recursos, alguns recursos são primeiro classificados e outra parte é classificada. O resultado da classificação em duas partes e, em seguida, classificar, pode resolver o problema XOR.
Intuitivamente, a maior característica do perceptron multicamadas é que ele possui mais uma camada oculta.

Dada uma entrada de dim=m, é necessário finalmente produzir um vetor de saída (categoria) de dim=n, então uma maneira intuitiva de alcançá-lo é:

[ h 1 ⋮ hk ] = [ w 1 1 ( 0 ) ⋯ w 1 m ( 0 ) ⋮ ⋱ ⋮ wk 1 ( 0 ) ⋯ wnm ( 0 ) ] ⋅ [ x 1 ⋮ xm ] + [ b 1 ( 0 ) ⋮ bk ( 0 ) ] \left[\begin{matriz} h_1 \\ \vdots \\ h_k\\ \end{matriz}\right]=\left[\begin{matriz} w_11^{(0)} & \cdots & w_1m^{(0)} \\ \vdots & \ddots & \vdots \\ w_k1^{(0)} & \cdots & w_nm^{(0)} \\ \end{matriz}\direita]\cdot \left[\begin{matrix} x_1 \\ \vdots \\ x_m\\ \end{matrix}\right] + \left[\begin{matrix} b_1^{(0)} \\ \vdots \\ b_k^ {(0)}\\ \end{matriz}\direita] h1hk = c11( 0 )ck1( 0 )c1m( 0 )cnm( 0 ) x1xm + b1( 0 )bk( 0 )

[ o 1 ⋮ on ] = [ w 1 1 ( 1 ) ⋯ w 1 k ( 1 ) ⋮ ⋱ ⋮ wn 1 ( 1 ) ⋯ wnk ( 1 ) ] ⋅ [ h 1 ⋮ hk ] + [ b 1 ( 1 ) ⋮ bn ( 1 ) ] \left[\begin{matriz} o_1 \\ \vdots \\ o_n\\ \end{matriz}\right]=\left[\begin{matriz} w_11^{(1)} & \cdots & w_1k^{(1)} \\ \vdots & \ddots & \vdots \\ w_n1^{(1)} & \cdots & w_nk^{(1)} \\ \end{matriz}\direita]\cdot \left[\begin{matrix} h_1 \\ \vdots \\ h_k\\ \end{matrix}\right] + \left[\begin{matrix} b_1^{(1)} \\ \vdots \\ b_n^ {(1)}\\ \end{matriz}\direita] o1on = c11( 1 )cn1( 1 )c1k( 1 )cnk( 1 ) h1hk + b1( 1 )bn( 1 )

Escrito em forma de matriz, o acima é

h = W ( 0 ) x + b ( 0 ) \pmb{h=W^{(0)}x+b^{(0)}}h=C( 0 ) x+b( 0 )

o = W ( 1 ) h + b ( 1 ) \pmb{o=W^{(1)}h+b^{(1)}}o=C( 1 ) horas+b( 1 )

Mas, na verdade, ainda é uma rede de camada única.
Depois que a fórmula acima for introduzida, ela ficará da seguinte forma:

o = W ( 1 ) ( W ( 0 ) x + b ( 0 ) ) + b ( 1 ) \pmb{o=W}^{(1)}(\pmb{W}^{(0)}\pmb {x+b}^{(0)})+\pmb{b}^{(1)}o=C( 1 ) (W( 0 ) x+b( 0 ) )+b( 1 )

Então, após a expansão, pode ser escrito como:

o = W ( 1 ) W ( 0 ) x + W ( 1 ) b ( 0 ) + b ( 1 ) \pmb{o=W}^{(1)}\pmb{W}^{(0)}\ pmb{x+W}^{(1)}\pmb{b}^{(0)}+\pmb{b}^{(1)}o=C( 1 ) W( 0 ) x+C( 1 ) b( 0 )+b( 1 )

其中,W ( 0 ) ∈ R k × m , W ( 1 ) ∈ R k × n , b ( 0 ) ∈ R k × 1 , b ( 1 ) ∈ R n × 1 \pmb{W}^{(0 )}\in\mathbb{R}^{k\vezes m}, \pmb{W}^{(1)}\in\mathbb{R}^{k\vezes n}, \pmb{b}^{ (0)}\in\mathbb{R}^{k\vezes 1}, \pmb{b}^{(1)}\in\mathbb{R}^{n\vezes 1}C( 0 )Rk × m ,C( 1 )Rk × n ,b( 0 )Rk × 1 ,b( 1 )Rn × 1

那么,W = W ( 1 ) × W ( 0 ) ∈ R n × m , b = W ( 1 ) b ( 0 ) + b ( 1 ) ∈ R n × 1 \pmb{W}=\pmb{W} ^{(1)}\times\pmb{W}^{(0)}\in\mathbb{R}^{n\times m}, \pmb{b}=\pmb{W}^{(1) }\pmb{b}^{(0)}+\pmb{b}^{(1)}\in\mathbb{R}^{n\vezes 1}C=C( 1 )×C( 0 )Rn × m ,b=C( 1 ) b( 0 )+b( 1 )Rn × 1

Essencialmente, a fórmula pode ser escrita como

o = W x + b \pmb{o=Wx+b}o=L x+b

Portanto, ainda é uma rede neural de camada única em essência.

A maior razão para os problemas acima é a falta de não linearidade no processo de transmissão dos neurônios .

Uma entrada, multiplicada por várias matrizes, é essencialmente equivalente a multiplicada por uma matriz.

Porque a multiplicação de matrizes é um processo linear: após a transformação, ela pode ser transformada de volta.

A forma básica de uma transformação linear:

y = W x \pmb{y}=\pmb{Wx}y=L x

A maneira de mudar essa situação é adicionar transformações não lineares ao modelo.

Adicionar transformação não linear, função de ativação

Função Sigmod

x = 1 1 + exp ( − x ) \text{x}=\frac{1}{1 + \text{exp}(-x)}x=1+exp ( x )1
desenhe a imagem

import os
os.environ["KMP_DUPLICATE_LIB_OK"]="TRUE"

import torch
import matplotlib.pyplot as plt

plt.figure(figsize=(2, 2))

x = torch.arange(-5, 5, 0.1, requires_grad=True)
y = x.sigmoid()
plt.scatter(x.detach().numpy(), y.detach().numpy())
plt.show()

insira a descrição da imagem aqui

Em que circunstâncias é apropriado usar a função de ativação Sigmoid?

A saída da função sigmóide varia de 0 a 1. Ele normaliza a saída de cada neurônio, pois o valor de saída é limitado de 0 a 1;
para modelos que têm probabilidades previstas como saída. Como a probabilidade varia de 0 a 1, a função Sigmoid é muito adequada;
o gradiente é suave para evitar valores de saída "saltos";
a função é diferenciável. Isso significa que a inclinação da curva sigmóide para quaisquer dois pontos pode ser encontrada;
uma previsão clara, ou seja, muito próxima de 1 ou 0.

As deficiências da função de ativação Sigmoid:

Desaparecimento do gradiente: Observação: a taxa de variação torna-se plana à medida que a função Sigmóide se aproxima de 0 e 1, ou seja, o gradiente do Sigmóide se aproxima de 0. Quando a rede neural usa a função de ativação Sigmoid para retropropagação, o gradiente do neurônio cuja saída é próxima de 0 ou 1 tende a 0. Esses neurônios são chamados de neurônios de saturação. Portanto, os pesos desses neurônios não são atualizados. Além disso, os pesos dos neurônios conectados a esses neurônios são atualizados muito lentamente. Este problema é chamado de gradiente de fuga. Então imagine se uma grande rede neural contiver neurônios sigmoides, muitos dos quais estão saturados, a rede não pode realizar retropropagação.
Não centrado em zero: Se a saída Sigmoid não estiver centrada em zero, a saída será sempre maior que 0, e a saída do centro diferente de zero fará com que a entrada dos neurônios na próxima camada seja polarizada (Bias Shift) e Além disso, isso diminui a taxa de convergência da descida do gradiente.
Computacionalmente caro: A função exp() é computacionalmente cara e lenta para ser executada em um computador em comparação com outras funções de ativação não linear.

y.sum().backward()
plt.figure(figsize=(3, 3))
plt.scatter(x.detach().numpy(), x.grad.detach().numpy())
plt.show()

insira a descrição da imagem aqui

função Tanh

x = 1 − exp ( − 2 x ) 1 + exp ( − 2 x ) \text{x}=\frac{1-\text{exp}(-2x)}{1 + \text{exp}(-2x )}x=1+exp ( 2 x )1exp ( 2 x )

y = x.tanh()
plt.figure(figsize=(3, 3))
plt.scatter(x.detach().numpy(), y.detach().numpy())
plt.show()

insira a descrição da imagem aqui

As deficiências de tanh:

Semelhante ao sigmóide, a função Tanh também tem o problema do desaparecimento do gradiente, portanto, também "matará" o gradiente quando estiver saturado (quando x for grande ou pequeno).
Nota: Em problemas gerais de classificação binária, a função tanh é usada para a camada oculta e a função sigmoide é usada para a camada de saída, mas isso não é fixo e precisa ser ajustado para o problema específico.

x.grad.zero_()
y.sum().backward()
plt.figure(figsize=(3, 3))
plt.scatter(x.detach().numpy(), x.grad.detach().numpy())
plt.show()

insira a descrição da imagem aqui

Função ReLU

relu ( x ) = { 0 , x ≤ 0 x , x > 0 \text{relu}(x)= \begin{cases} 0, & \text{x} \leq0 \\ x, & \text{x > 0} \end{casos}releia ( x )={ 0 ,x ,x0x > 0

y = x.relu()
plt.figure(figsize=(3, 3))
plt.scatter(x.detach().numpy(), y.detach().numpy())
plt.show()

insira a descrição da imagem aqui

x.grad.zero_()
y.sum().backward()
plt.figure(figsize=(3, 3))
plt.scatter(x.detach().numpy(), x.grad.detach().numpy())
plt.show()

insira a descrição da imagem aqui
Na prática, a função relu tem uma expressão mais concisa:

relu ( x ) = max ( x , 0 ) \text{relu}(x)=\text{max}(x, 0)releia ( x )=máx ( x ,0 )

A função ReLU é uma função de ativação popular em aprendizado profundo. Em comparação com a função sigmóide e a função tanh, ela apresenta as seguintes vantagens:

Quando a entrada é positiva, a derivada é 1, o que melhora o problema do desaparecimento do gradiente até certo ponto e acelera a velocidade de convergência da descida do gradiente; a
velocidade de cálculo é muito mais rápida. Existem apenas relações lineares na função ReLU, portanto, ela pode ser calculada mais rapidamente do que sigmoide e tanh.
Considerado como tendo plausibilidade biológica (Plausibilidade Biológica), como inibição unilateral, amplo limite de excitação (ou seja, o grau de excitação pode ser muito alto)

Desvantagens da função ReLU:

Problema de ReLU morto. ReLU falha completamente quando a entrada é negativa, o que não é um problema durante a propagação direta. Algumas áreas são sensíveis e outras não. Mas no processo de retropropagação, se um número negativo for inserido, o gradiente será completamente zero;
[Problema Dead ReLU] Os neurônios ReLU são relativamente fáceis de "morrer" durante o treinamento. Durante o treinamento, se um neurônio ReLU na primeira camada oculta não puder ser ativado em todos os dados de treinamento após uma atualização de parâmetro inadequada, o gradiente dos próprios parâmetros do neurônio será sempre 0, nunca poderá ser ativado durante o processo de treinamento subsequente. Esse fenômeno é chamado de problema ReLU morto e também pode ocorrer em outras camadas ocultas.
Não centrado em zero: Semelhante à função de ativação Sigmoid, a saída da função ReLU não é centrada em zero e a saída da função ReLU é 0 ou um número positivo. Introduzindo um desvio de viés para a rede neural da próxima camada afetará a eficiência da descida do gradiente.

Para cada neurônio, há uma função de ativação configurada.

Seu significado físico é: quando seu limite for grande o suficiente, ele será ativado (passado para a camada inferior), caso contrário, não será passado.

Na verdade, esse significado físico tem uma explicação da neurociência.

Portanto, a forma geral de um perceptron multicamada é:

h = δ ( W ( 0 ) x + b ( 0 ) ) \pmb{h}=\delta(\pmb{W}^{(0)}\pmb{x+b}^{(0)})h=d ( W( 0 ) x+b( 0 ) )

o = softmax ( W ( 1 ) h + b ( 1 ) ) \pmb{o}=\text{softmax}(\pmb{W}^{(1)}\pmb{h+b}^{(1) })o=softmax ( W( 1 ) horas+b( 1 ) )

Resumir

Um perceptron multicamada é um modelo de classificação multicamada baseado em redes neurais .

Sua saída é a saída após softmax, ou seja, a saída é uma probabilidade;

Suas múltiplas camadas vêm da não linearidade da função de ativação.

A função de ativação mais comumente usada é a função Relu porque é a mais conveniente de calcular.

Acho que você gosta

Origin blog.csdn.net/weixin_51672245/article/details/131128833
Recomendado
Clasificación