Trucos básicos para el entrenamiento de redes neuronales

En el artículo anterior, presenté cómo usar la función de optimización para actualizar los parámetros de peso y acercarme continuamente al valor mínimo de la función de pérdida, para lograr el propósito de aprender. La idea básica de la función de optimización es el método de descenso del gradiente, y la actualización del parámetro de peso necesita calcular el gradiente de todos los pesos en relación con la función de pérdida. Del artículo anterior sobre la introducción de redes neuronales, podemos saber que los factores de gradiente que afectan el peso incluyen la derivada de la función de pérdida, la derivada de la función de activación, el valor de entrada del nodo y el valor de peso .

A continuación, este artículo presentará los conceptos de desaparición de gradientes y explosión de gradientes, así como algunos trucos para evitar la desaparición y explosión de gradientes durante el entrenamiento de redes neuronales.

Gradientes que desaparecen y gradientes explosivos

Cuando se entrenan redes neuronales, especialmente redes neuronales profundas, un gran problema es que el gradiente desaparece o el gradiente explota, es decir, la derivada del peso a la función de pérdida se vuelve muy grande o muy pequeña. El problema de la desaparición o explosión del gradiente generalmente se vuelve más y más obvio a medida que aumenta el número de capas de la red.

simular gradiente de desaparición

Como se muestra en la siguiente figura, se supone que cada capa tiene solo una neurona, y cada capa se puede expresar mediante la siguiente fórmula, donde σ \sigmaσ es una función vigorosa, por ejemplo sigmoide aquí.
ai = σ ( zi ) = σ ( wi ∗ xi ) , donde xi = ai − 1 a_i = \sigma{(z_i)} = \sigma{(w_i * x_i)}, donde x_i = a_{i-1}ayo=s ( zyo)=s ( wyoXyo) ,donde xyo=ayo 1
imagen.png
Entonces puedes derivar la siguiente fórmula:
α L α w 1 = α L α a 4 ∗ α a 4 α z 4 ∗ α z 4 α a 3 ∗ α a 3 α z 3 ∗ α z 3 α a 2 ∗ α a 2 α z 2 ∗ α z 2 α un 1 ∗ α un 1 α z 1 ∗ α z 1 α w 1 \frac{\alpha{L}}{\alpha{w_1}} = \frac{\alpha{L} } {\alpha{a_4}}*\frac{\alpha{a_4}}{\alpha{z_4}}*\frac{\alpha{z_4}}{\alpha{a_3}}*\frac{\alpha{a_3 } }{\alpha{z_3}}*\frac{\alpha{z_3}}{\alpha{a_2}}*\frac{\alpha{a_2}}{\alpha{z_2}}*\frac{\alpha{ z_2 }}{\alpha{a_1}}*\frac{\alpha{a_1}}{\alpha{z_1}}*\frac{\alpha{z_1}}{\alpha{w_1}}una w1α L=α un4α Luna z4α un4α un3una z4una z3α un3α un2una z3una z2α un2α un1una z2una z1α un1una w1una z1
= α L α un 4 ∗ σ ′ z 4 ∗ w 4 ∗ σ ′ z 3 ∗ w 3 ∗ σ ′ z 2 ∗ w 2 ∗ σ ′ z 1 ∗ x 1 =\frac{\alpha{L}}{\ alfa{a_4}}*{\sigma'{z_4}}*w_4*{\sigma'{z_3}}*w_3*{\sigma'{z_2}}*w2*{\sigma'{z_1}}*x_1=α un4α Lpag' z4w4pag' z3w3pag' z22 _pag' z1X1
La derivada de la función sigmoidea se muestra en la siguiente figura:
imagen.png
Visible, σ ′ ( x ) \sigma'(x)pagEl valor máximo de ′ (x)es1 4 \frac{1}{4}41, mientras que en el entrenamiento general de redes se utiliza una distribución gaussiana con media 0 y desviación estándar 1 para inicializar los pesos de la red, es decir, los valores de peso inicializados suelen ser menores a 1, por lo que σ′(x) ∗ w ≤ 1 4 \ sigma '(x)*w ≤ \frac{1}{4}pag (x)w41. Por lo tanto, para la derivación en cadena en la fórmula anterior, cuando el número de capas es mayor, el resultado de la derivación es más pequeño, lo que eventualmente conduce a la desaparición del gradiente.

explosión de gradiente

σ ′ ( x ) ∗ w > 1 \sigma'(x)*w > 1pag (x)w>1 en punto, es decir,wwEl caso donde w es relativamente grande. Luego, el gradiente de la capa oculta cercana a la capa de entrada cambia mucho, lo que provoca el problema de la explosión del gradiente.

entrada normalizada

Al entrenar una red neuronal, una de las formas de acelerar el entrenamiento es normalizar la entrada. La normalización de la entrada consta de los siguientes dos pasos:

  • Media cero: calcula la media de todas las muestras μ = 1 m ∑ i = 1 mxi \mu=\frac{1}{m}\sum_{i=1}^m{x^{i}}metro=metro1yo = 1mXi , luego cada muestra resta la mediaxi = xi − μ x^i = x^i - \muXi=Ximetro
  • Varianza normalizada: calcula la varianza σ 2 = 1 m ∑ i = 1 m ( xi ) 2 \sigma^2 = \frac{1}{m}\sum_{i=1}^m(x^i)^2pag2=metro1yo = 1m( Xyo )2 , y cada muestra se divide por la mediaxi = xi σ 2 + ϵ x^i = \frac{x^i}{\sqrt{\sigma^2 + \epsilon}}Xi=pag2 +ϵ Xyo

imagen.png

inicialización de peso

Por qué inicializar pesos

Del cálculo del gradiente de peso anterior, podemos saber que el valor del peso también participa en el cálculo del gradiente, es decir, el propósito de la inicialización del peso es evitar que la red neuronal profunda sea inválida durante el proceso de propagación hacia adelante debido a que es demasiado grande o demasiado grande. pequeños pesos, y el proceso de retropropagación desaparece o explota gradientes .

propagación hacia adelante

Tomando como ejemplo una red neuronal simple de 100 capas sin una función de activación, use torch.randn para generar datos de distribución normal estándar para inicializar la entrada x y ponderar la matriz a para la propagación directa: x = x 1 ∗ w 1 + x 2 ∗
w 2 + . . . + x 100 ∗ w 100 x = x_1*w_1 + x_2*w_2 + ... + x_{100}*w_{100}X=X1w1+X2w2+...+X100w100

>>> x = torch.randn(512)
>>> for i in range(100):
...     a = torch.randn(512, 512)
...     x = a @ x
...
>>> x.mean()
tensor(nan)
>>> x.std()
tensor(nan)

Se puede ver que después de 100 multiplicaciones de matrices, en cierta operación, la salida de la capa se vuelve tan grande que la computadora no puede reconocer su desviación estándar y media. Es decir, hay una explosión de gradiente.
Cuando los pesos se inicializan usando una distribución normal con media 0 y varianza 0.01, se realiza la propagación hacia adelante:

>>> x = torch.randn(512)
>>> for i in range(100):
...     a = torch.randn(512, 512) * 0.01
...     x = a @ x
...
>>> x.mean()
tensor(0.)
>>> x.std()
tensor(0.)

Se puede ver que el valor de salida de la capa es infinitamente cercano a 0 en este momento. Es decir, si el valor inicial del peso es demasiado grande o demasiado pequeño, el modelo no puede aprender bien.

Método de inicialización del peso

Hay tres métodos comunes de inicialización de peso: inicialización de Xavier, inicialización de Kaimming He e inicialización a 0.

Inicialización de Xavier

La inicialización de Xavier es un método clásico de inicialización de peso. De acuerdo con las dimensiones de entrada y salida, el valor inicial del parámetro de peso se establece de forma adaptativa, y el peso de cada capa se establece en una distribución uniforme aleatoria limitada. La expresión es la siguiente : W
∼ U [ − 6 ni + ni + 1 , 6 ni + ni + 1 ] W\sim{U[-\frac{\sqrt{6}}{\sqrt{n_i + n_{i+1}}}, \ fracción {\sqrt{6}}{\sqrt{n_i + n_{i+1}}}]}Wtu [ -norteyo+ norteyo + 1 6 ,norteyo+ norteyo + 1 6 ]
Queni n_inorteyoIndica el número de conexiones de entrada de la neurona, ni + 1 n_{i+1}norteyo + 1Indica el número de conexiones de salida. La inicialización del peso de Xavier garantiza que la variación de la función de activación y el gradiente de retropropagación se propague hacia arriba o hacia abajo a cada capa de la red neuronal.

Inicialización de Kaimming He

Similar a la inicialización de Xavier, la inicialización de He también establece de forma adaptativa el valor inicial de los parámetros de peso de acuerdo con las dimensiones de la entrada y la salida. La diferencia es que el método de inicialización de He está diseñado para adaptarse mejor a la función de activación de ReLU. La función de activación Xavier es adecuada para: funciones de activación simétricas y lineales alrededor de 0, mientras que la función de activación ReLU no cumple estas condiciones.

inicializado a 0

Tome la red neuronal simple de dos capas en la siguiente figura como ejemplo para simular el proceso de propagación hacia adelante y hacia atrás con el peso inicializado en 0.

Propagación directa:
z 1 [ 1 ] = w 11 [ 1 ] ∗ x 1 + w 21 [ 1 ] ∗ x 2 = 0 ; a 1 [ 1 ] = σ ( z 1 [ 1 ] ) = 0,5 z_1^{[ 1 ]} = w_{11}^{[1]} * x_1 + w_{21}^{[1]} * x_2 = 0;a_1^{[1]}=\sigma(z_1^{[1]} ) =0.5z1[ 1 ]=w11[ 1 ]X1+w21[ 1 ]X2=0 ;a1[ 1 ]=s ( z1[ 1 ])=0,5
z 2 [ 1 ] = 0 ; a 2 [ 1 ] = 0.5 z_2^{[1]}=0;a_2^{[1]}=0.5z2[ 1 ]=0 ;a2[ 1 ]=0,5
z 3 [ 1 ] = 0 ; a 3 [ 1 ] = 0,5 z_3^{[1]}=0;a_3^{[1]}=0,5z3[ 1 ]=0 ;a3[ 1 ]=0,5
z 1 [ 2 ] = 0 ; a 1 [ 2 ] = 0,5 z_1^{[2]}=0;a_1^{[2]}=0,5z1[ 2 ]=0 ;a1[ 2 ]=0.5
Cuando todos los pesos se inicializan a 0, los valores de salida de las neuronas son todos iguales. A continuación, simule la retropropagación:
α L α w 11 [ 2 ] = α L α a 1 [ 2 ] ∗ α a 1 [ 2 ] α z 1 [ 2 ] ∗ a 1 [ 1 ] = α L α a 1 [ 2 ] ∗ σ ( z 1 [ 2 ] ) ( 1 − σ ( z 1 [ 2 ] ) ) ∗ 0.5 = α L α a 1 [ 2 ] ∗ ( 0.5 ) 3 \frac{\alpha{L}}{\ alpha{w_ {11}^{[2]}}}=\frac{\alpha{L}}{\alpha{a_{1}^{[2]}}}*\frac{\alpha{a_1^{ [2] }}}{\alfa{z_{1}^{[2]}}}*a_1^{[1]}=\frac{\alfa{L}}{\alfa{a_{1}^{ [2] }}}*\sigma(z_1^{[2])}(1-\sigma(z_1^{[2])})*0.5 = \frac{\alpha{L}}{\alpha{a_ {1} ^{[2]}}}*(0.5)^3una w11[ 2 ]α L=α un1[ 2 ]α Luna z1[ 2 ]α un1[ 2 ]a1[ 1 ]=α un1[ 2 ]α Ls ( z1[ 2 ] )( 1s ( z1[ 2 ] ))0.5=α un1[ 2 ]α L( 0.5 )3
α L α w 21 [ 2 ] = α L α a 1 [ 2 ] ∗ ( 0.5 ) 3 \frac{\alpha{L}}{\alpha{w_{21}^{[2]}}}=\ fracción{\alfa{L}}{\alfa{a_{1}^{[2]}}}*(0,5)^3una w21[ 2 ]α L=α un1[ 2 ]α L( 0.5 )3
α L α w 31 [ 2 ] = α L α a 1 [ 2 ] ∗ ( 0.5 ) 3 \frac{\alpha{L}}{\alpha{w_{31}^{[2]}}}=\ fracción{\alfa{L}}{\alfa{a_{1}^{[2]}}}*(0,5)^3una w31[ 2 ]α L=α un1[ 2 ]α L( 0.5 )3
y contraw 11 [ 1 ] , w 21 [ 1 ] , w 31 [ 1 ] w_{11}^{[1]},w_{21}^{[1]},w_{31}^{[1 ]}w11[ 1 ],w21[ 1 ],w31[ 1 ]La derivada parcial de , porque el valor multiplicado contiene el valor de peso, por lo que es todo 0.
En resumen, cuando todos los pesos se inicializan en 0, cada capa de neuronas tiene el mismo valor de salida en la primera propagación directa, mientras que en Cuando backpropagation actualiza los pesos, solo se actualizan los pesos de la última capa, lo que hace que la red no pueda aprender.

decaimiento de la tasa de aprendizaje

En el método de descenso de gradiente de minilotes, dado que el cálculo del gradiente de la función de pérdida depende de un pequeño número de muestras, la aleatoriedad de las muestras puede conducir a una gran variación de la fluctuación del gradiente. Al reducir continuamente la tasa de aprendizaje, puede convergen gradualmente al valor mínimo .

Método de disminución de la tasa de aprendizaje

Hay cuatro métodos comunes de decaimiento de la tasa de aprendizaje: decaimiento exponencial, decaimiento de paso fijo, decaimiento de varios pasos y decaimiento de recocido de coseno. Las reglas cambiantes se muestran en la siguiente figura:
imagen.png

Decrecimiento exponencial

Decaer exponencialmente la tasa de aprendizaje es una estrategia común. El método de uso en pytorch es el siguiente:

ExpLR = torch.optim.lr_scheduler.ExponentialLR(optimizer_ExpLR, gamma=0.98)

El parámetro gamma representa la base de la atenuación, y se pueden obtener diferentes curvas de atenuación seleccionando diferentes valores de gamma , de la siguiente manera:
imagen.png
cuanto menor sea el valor de gamma, más rápido decaerá la tasa de aprendizaje.

Decaimiento de paso fijo

Es decir, la tasa de aprendizaje se reduce a una parte de la gamma original cada cierto número de pasos (o época).

StepLR = torch.optim.lr_scheduler.StepLR(optimizer_StepLR, step_size=step_size, gamma=0.65)

Entre ellos, el parámetro gamma indica el grado de atenuación y el parámetro step_size indica el ajuste de la tasa de aprendizaje cada cuántos pasos.
imagen.png

decaimiento de varios pasos

Aunque la atenuación del tamaño de paso fijo puede actualizar la tasa de aprendizaje de acuerdo con la duración del intervalo fijo, la ventaja es que esperamos que diferentes intervalos usen diferentes frecuencias de actualización.

torch.optim.lr_scheduler.MultiStepLR(optimizer, milestones=[200, 300, 320, 340, 200], gamma=0.8)

El parámetro de hitos es el intervalo inicial y final de la actualización de la tasa de aprendizaje. Lo anterior significa que la tasa de aprendizaje no se actualiza en el intervalo [0, 200], y los intervalos posteriores se actualizan una vez.
imagen.png

recocido de coseno

Estrictamente hablando, la estrategia de recocido de coseno no debería ser una estrategia de disminución de la tasa de aprendizaje, porque hace que la tasa de aprendizaje cambie periódicamente.

CosineLR = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer_CosineLR, T_max=150, eta_min=0)

Donde T_max representa el periodo de la función coseno, eta_min representa el valor mínimo de la tasa de aprendizaje.
imagen.png

BatchNorm

BatchNorm es una técnica de regularización de uso común para redes neuronales diseñada para acelerar el entrenamiento y mejorar el rendimiento del modelo.

Por qué usar BatchNorm

El papel de BatchNorm es hacer que la entrada de cada capa de la red neuronal sea más estable durante , mejorando así la velocidad de entrenamiento de la red.

Problema de cambio de covariable interno

En una red neuronal profunda, la distribución de datos de entrada de cada capa suele cambiar a medida que avanza el entrenamiento , es decir, la distribución de entrada de cada capa siempre cambia, lo que dificulta que la red estabilice la ley del aprendizaje . Durante el proceso de entrenamiento, debido a que los parámetros de cada capa cambian constantemente, la distribución de entrada de la capa oculta siempre cambia , que es el llamado problema de "desplazamiento de covariable interno".
La idea básica de BatchNorm: dejar que la entrada de activación zz de cada nodo ocultoLa distribución z es fija, por lo que se evita el problema del "desplazamiento interno de la covariable". Dado que la distribución del valor de entrada de activaciónde la red neuronal profunda antes de la transformación no lineal sedesplaza o cambia gradualmente durante el proceso de entrenamiento, la distribución general se acerca gradualmente a lossuperiore inferior del rango de valores de la función no lineal (sigmoide como ejemplo). ).la desaparición del gradiente de la red neuronal de bajo niveldurante la retropropagación, y la convergencia de la red neuronal se vuelve cada vez más lenta.
BN esde cada neuronade vuelta a la distribución normal estándar con una media de 0 y una varianza de 1 a través de los medios de normalización,de modo que el valor de entrada de activaciónzzz cae en el área con una gran tasa de cambio de la función de activación no lineal, una pequeña transformación de entrada puede causar un gran cambio en la función de pérdida,evitando el problema de la desaparición del gradientey, al mismo tiempo,el área sensible del La función de activación no lineal puede causar un gran cambio en el gradiente, es decir, acelerar su entrenamiento.
Al mismo tiempo, cuando todas las distribuciones regresan a la distribución normal estándar, cada capa de la red neuronal multicapa se convierte en una expresión fija, es decir, la capacidad expresiva de la red disminuye y el significado de profundidad no existe. Para resolver este problema, BN realiza operaciones de cambio y escala en la distribución normal estándar transformada Estos dos parámetros escala y cambio se aprenden a través del entrenamiento.

¿Qué es BatchNorm?

Para el entrenamiento de mini lotes, un proceso de entrenamiento contiene m instancias de entrenamiento. El proceso de operación específico de BN es el siguiente:

Primero, lleve el valor de activación de entrada de la neurona a una distribución estándar con una media de 0 y una varianza de 1. En Para evitar que la red se exprese, la capacidad disminuye y se agregan dos parámetros de ajuste (escala y cambio) a cada neurona para mejorar la capacidad de ajuste de la red.

fase de entrenamiento

En la fase de entrenamiento, BN estandarizará cada valor de entrada (muestra) y utilizará el método de promedio móvil ponderado exponencialmente para guardar la media y la varianza, y aproximar la media y la varianza de todo el conjunto de muestras. En todo el conjunto de muestras, (número total de muestras/Tamaño del lote) se generará el grupo γ \gammacb \betasegundo _

def bn_simple_for_train(x, gamma, beta, bn_params):
    '''
    X : 输入数据
    gamma:缩放因子
    beta:平移因子
    bn_params: batch norm所需要的一些参数
    running_mean: 滑动平均的方式计算新的均值,训练时计算,为测试数据做准备
    running_var: 滑动平均的方式计算新的方差,训练时计算,为测试数据做准备
    '''
    running_mean = bn_params["running_mean"]       # shape = [B]
    running_var = bn_params["running_var"]
    
    x_mean = x.mean(axis=0)
    x_var = x.var(axis=0)
    # 归一化
    x_normalized = (x - x_mean) / np.sqrt(x_var + eps)
    # bn
    res = gamma * x_normalized + beta
    
    # 滑动平移方式
    running_mean = momentum * running_mean + (1- momentum) * x_mean
    running_var = momentum * running_var + (1 - momentum) * x_var
    
    # 记录新的参数值
    bn_params["running_mean"] = running_mean
    bn_params["running_var"] = running_var
    
    return res, bn_params

etapa de razonamiento

Dado que solo hay una muestra de entrada durante la prueba, la media y la varianza no se pueden calcular, es decir, las estadísticas globales obtenidas en la fase de entrenamiento se utilizan para predecir.

def bn_simple_for_test(x, gamma, beta, bn_params):
    '''
    X : 输入数据
    gamma:缩放因子
    beta:平移因子
    bn_params: batch norm所需要的一些参数
    running_mean: 滑动平均的方式计算新的均值,训练时计算,为测试数据做准备
    running_var: 滑动平均的方式计算新的方差,训练时计算,为测试数据做准备
    '''
    running_mean = bn_params["running_mean"]      
    running_var = bn_params["running_var"]

    # 归一化
    x_normalized = (x - running_mean) / np.sqrt(running_var + eps)
    # bn
    res = gamma * x_normalized + beta

    return res, bn_params

función de activación

En el aprendizaje automático y el aprendizaje profundo, las funciones de activación se utilizan a menudo para introducir factores no lineales en las redes neuronales, lo que permite que la red construya relaciones complejas y no lineales en los datos de entrada y salida. La función de activación debe tener las siguientes propiedades:

  1. No linealidad: la función de activación debe ser no lineal para que exista una relación no lineal entre los datos de entrada y salida;
  2. Continuidad: la función de activación debe ser continua y diferenciable, porque la derivada de la función de activación debe calcularse cuando se actualiza el gradiente;
  3. Alta eficiencia computacional: las funciones de activación computacionalmente intensivas pueden ralentizar significativamente el proceso de entrenamiento;

¿Por qué necesitamos una función de activación?

Si no se usa la función de activación, la función de activación es f ( x ) = xf(x)=xf ( x )=x , en este momento, la entrada de cada nodo es una función lineal de la salida de la capa superior, entonces, no importa cuántas capas tenga la red neuronal, la salida es una combinación lineal de entradas, que no puede manejar relaciones no lineales, y la capacidad expresiva de la red es limitada. Al introducir la función de activación y aumentar las características no lineales de la red, la capacidad expresiva de la red es más poderosa y se puede ajustar cualquier función. Además, la función de activación también puede hacer que la red neuronal tenga cierta inmunidad al ruido y pueda manejar datos ruidosos.

La diferencia y las características de las diferentes funciones de activación.

Las funciones de activación comunes incluyen la función sigmoidea, la función tanh, la función ReLU, etc.

  1. función sigmoidea

Sigmoid es una función de activación no lineal de uso común, la forma matemática es la siguiente:
f ( x ) = 1 1 + e − zf(x)=\frac{1}{1 + e^{-z}}f ( x )=1 + miz1
La imagen geométrica es la siguiente:
sigmoide.png
la expresión de su derivada es la siguiente:
f ′ ( x ) = σ ( x ) ( 1 − σ ( x ) ) f'(x) = \sigma(x)(1-\sigma (X))F (x)=σ ( x ) ( 1σ ( x ))
la imagen geométrica es la siguiente:
sigmoide.png
Ventajas:

  • El rango de salida de la función sigmoide está entre [0,1] y la salida se puede limitar a un rango específico;
  • La derivada de la función sigmoidea se puede expresar por sí misma, lo cual es conveniente para el cálculo;
  • La función sigmoidea tiene una continuidad suave, lo que puede garantizar la continuidad de la red neuronal;

defecto:

  • El gradiente de la función sigmoidea es cercano a 0 en valores de entrada grandes o pequeños, lo que provocará el problema de la desaparición del gradiente, haciendo que la red neuronal no pueda seguir aprendiendo;
  • La salida de la función sigmoidea no está centrada en cero con 0 como centro, por lo que durante la retropropagación, la dirección del gradiente estará sesgada hacia un lado, en lugar de distribuirse uniformemente en ambos lados, lo que puede causar inestabilidad en el proceso de entrenamiento.
  • El cálculo de la función sigmoidea es más lento que el de las funciones ReLU y tanh porque se requieren operaciones exponenciales;
  1. funcion tanh

Tanh es una función de activación de uso común con un rango de salida de [-1,1]. Similar a la función sigmoidea, la función tanh también es una función de tipo S, pero su rango de salida es más amplio. Su expresión matemática es la siguiente:
tanh ( x ) = ex − e − xex + e − x tanh(x) = \frac{e^x- e^{-x}}{e^x+e^{-x } }t inglés ( x )=mix +exmix -e x
La imagen geométrica se ve así:
sigmoide.png
La derivada de la función tanh es:
ddxtanh ( x ) = 1 − ( tanh ( x ) ) 2 \frac{d}{dx}tanh(x) = 1- {(tanh(x) )}^ 2d xret inglés ( x )=1( el ( x ) )A continuación se muestran 2
imágenes geométricas:
sigmoide.png
Ventajas:

  • El rango de salida es [-1, 1], que puede normalizar los datos a un rango más pequeño, lo que es útil para la estabilidad y la velocidad de convergencia del modelo;
  • Con características de centro cero, se integra en el entrenamiento y optimización del modelo;

defecto:

  • Es propenso al problema de la desaparición del gradiente;
  • La cantidad de cálculo es grande y la cantidad de cálculo de la función tanh es el doble de la función sigmoide, lo que afecta la velocidad de entrenamiento del modelo;
  • Para datos de entrada grandes o pequeños, la función tanh aparecerá saturada y también hay un problema de saturación de gradiente, que afecta la eficiencia de entrenamiento del modelo;
  1. Función ReLU

La función de activación ReLU es una función de activación no lineal de uso común y su expresión es la siguiente:
relu ( x ) = max ( 0 , x ) relu(x) = max(0, x)leer de nuevo ( x ) _=máx ( 0 , _x )
cuya imagen geométrica es la siguiente:
sigmoide.png
Ventajas:

  • velocidad de cálculo rápida;
  • Resuelto el problema de la desaparición del gradiente;
  • La velocidad de convergencia es rápida, porque la derivada de la función de activación de ReLU es 0 o 1, y no hay un área de transición suave, por lo que es más fácil converger durante el entrenamiento;

defecto:

  • Algunas neuronas pueden estar "muertas", es decir, la salida siempre es 0, lo que hace que estas neuronas no puedan participar en el entrenamiento del modelo;
  • Se requiere preprocesamiento de datos para normalizar o estandarizar los datos de entrada para evitar entradas negativas;
  1. ReLU con fugas (2013)

La función de activación de Leaky ReLU se define como:
leakyrelu ( x ) = max ( x , α x ) leaky_relu(x) = max(x, \alpha{x})fuga _ _ _re l u ( x )=máximo x ( x ,α x )
donde α es una constante positiva muy pequeña, normalmente establecida en 0,01. Su imagen geométrica se muestra en la siguiente figura:
sigmoide.png
Ventajas:

  • Resuelto el problema de la posible "muerte" de las neuronas;
  • Alta eficiencia computacional;
  1. Softplus(2010)

La función de activación de Softplus se define de la siguiente manera:
softplus ( x ) = ln ( 1 + ex ) softplus(x)=ln(1+e^x)así que f tpl u s ( x )=n ( 1 _+mix )
Su imagen geométrica se muestra en la siguiente figura:
sigmoide.png
La función de activación softplus se puede aproximar como una función ReLU suave, continua y en todas partes. En comparación con la función ReLU, tiene las siguientes características.
ventaja:

  • Continuidad: La función softplus es una función con derivada continua de primer orden, lo que facilita las actualizaciones de gradiente;
  • Distinto de cero: a diferencia del valor de salida producido por la función ReLU que es 0 o positivo, la función softplus produce un valor de salida positivo;
  • Gradiente distinto de cero: la función softplus tiene un gradiente distinto de cero para valores de entrada negativos, lo que puede evitar problemas de muerte de ReLU;

defecto:

  • El valor de salida de softplus no está centrado en 0;
  • Su derivada es a menudo menor que 1 y puede haber un problema de desaparición del gradiente;
  1. Silbido (2017)

La función de activación de Swish se define de la siguiente manera:
S wish ( x ) = x ∗ σ ( β ∗ x ) Swish(x)=x*\sigma(\beta*x)Sw i s h ( x )=Xs ( segundox )
en la queβ \betaβ es un parámetro aprendible,σ \sigmaσ es la función sigmoidea.

  1. SILU(2017)

La función de activación SiLU (Unidad lineal sigmoidea) combina elementos de función de activación lineal y sigmoidea, que se definen de la siguiente manera:
S i LU ( x ) = x 1 + e − x SiLU(x)=\frac{x}{1+e ^{-x}}S yo LU ( x )=1 + mixx
Su imagen geométrica es la siguiente:

sigmoide.png
ventaja:

  • gradientes suaves: la función SiLU tiene derivadas suaves, que pueden evitar el problema de la desaparición del gradiente;
  • No monotonicidad: las funciones SiLU no son monotónicas, tienen valores tanto positivos como negativos, lo que permite que las funciones SiLU capturen patrones complejos en los datos de entrada;
  • Alta eficiencia computacional;
  1. HardSwish(2019)

La función de activación HardSwish es una función de activación lineal por partes , que es una versión simplificada de la función Swish. Se define de la siguiente manera:
hardswish ( x ) = { 0 , if ( x ≤ − 3 ) x , if ( x ≥ 3 ) x ( x + 3 ) 6 , de lo contrario hard_swish(x) = \begin{cases} 0, \quad if(x\le-3) \\x, \quad if(x\ge3) \\ \frac{x( x+3) {6}, \quad de lo contrario \end{casos}duro _ _sdeseo ( x ) _ _ _= 0 ,yo f ( x3 )x ,yo f ( x3 )6x ( x + 3 ),o t h er v i se
Su imagen geométrica es la siguiente: La
sigmoide.png
función de activación hardswish es una mejora de la función de activación swish. La función de activación swish puede mejorar la precisión de la red neuronal hasta cierto punto, pero no es adecuada para su uso en dispositivos móviles integrados porque el Función de tipo "S" El costo computacional en dispositivos móviles integrados es alto y la derivación es más complicada.
ventaja:

  • velocidad de cálculo rápida;
  • Comparado con ReLU, puede aliviar efectivamente el problema de la desaparición del gradiente;

defecto:

  • Bajo grado de no linealidad: en comparación con las funciones de activación Swish y Mish, HardSwish tiene un grado relativamente bajo de no linealidad y es posible que no pueda aprovechar al máximo las características no lineales de los datos;
  1. Mish(2019)

La función de activación de Mish tiene las cuatro ventajas de ** sin límite superior, límite inferior, derivada suave y no monótona **, y su expresión matemática es la siguiente:
f ( x ) = x ∗ tanh ( softplus ( x ) ) = x ∗ tanh ( ln ( 1 + exp ( x ) ) ) f(x)=x*tanh(softplus(x)) = x * tanh(ln(1+exp(x)))f ( x )=Xt anh ( so f tpl u s ( x ))=Xt inglés ( l n ( 1+e x p ( x )))
la geometría es la siguiente:
sigmoide.png
Características:

  • No monotonicidad (no linealidad): A través de la derivada, se puede obtener que la función Mish pueda aumentar o disminuir monótonamente en diferentes intervalos, pudiendo capturar patrones complejos en los datos de entrada;
  • Continuidad: la función de activación de Mish tiene buena continuidad y es diferenciable en todas partes, lo que puede actualizar mejor el modelo;
  • Sin límite superior ni límite inferior: ningún límite superior puede evitar el problema de saturación y el límite inferior puede ayudar a lograr un fuerte efecto de regularización;

Cómo elegir una función de activación adecuada

Se pueden considerar los siguientes puntos al elegir una función de activación adecuada:

  • Intente elegir una función de activación que utilice características centradas en cero para acelerar la convergencia del modelo;
  • Considere el problema de la desaparición del gradiente y elija una función de activación que no sea propensa a la desaparición del gradiente, como ReLU, Leaky ReLU, etc.;
  • Considere la eficiencia computacional;

Link de referencia

Supongo que te gusta

Origin blog.csdn.net/hello_dear_you/article/details/129432976
Recomendado
Clasificación