Inicialización del peso del modelo Pytroch

Tabla de contenido

1 concepto

2 Método de inicialización de peso

2.1 Inicialización constante

2.2 Inicialización de distribución uniforme

2.3 Inicialización de distribución normal

2.4 Distribución uniforme de Xavier

2.5 Distribución normal de Xavier

2.6 Distribución uniforme de Kaiming

2.7 Distribución normal de Kaiming

2.8 Inicialización de la matriz de identidad

2.9 Inicialización ortogonal

2.10 Inicialización dispersa

2.11 Inicialización de la función delta de Dirac

3 ejemplos de pitón


1 concepto

        La inicialización del peso se refiere al proceso de inicialización de los pesos y sesgos de cada nodo antes del entrenamiento del modelo de red. La inicialización correcta acelerará la convergencia del modelo, lo que acelerará la velocidad de entrenamiento del modelo. La inicialización incorrecta puede hacer que el gradiente desaparezca. O el gradiente explota y, finalmente, el modelo no se puede entrenar.

        Una estructura de red CNN básica como se muestra en la figura anterior, cuando los datos fluyen en la estructura de la red, habrá la siguiente fórmula (sin sesgo por defecto):

 

        En el proceso de retropropagación, debido a la derivación de la función compuesta, de acuerdo con la regla de derivación en cadena, habrá dos conjuntos de derivadas, una es la derivada de la función de pérdida Costo a Z, y la otra es la derivada de la función de pérdida a W,

1. El gradiente de la función de pérdida con respecto al estado Z:

2. El gradiente de la función de pérdida con respecto a W:

        Se puede observar que en la estructura de la red, la inicialización de un parámetro está relacionada con si la red puede entrenar un buen resultado o qué tan rápido puede converger. Por lo tanto, la inicialización del peso tiene los siguientes requisitos:

  1. Los parámetros no se pueden inicializar todos a 0 o todos a 1, ni se pueden inicializar todos al mismo valor; (el valor de actualización del gradiente durante la retropropagación es el mismo)
  2. El valor de inicialización del parámetro no puede ser demasiado grande; (porque la función de activación es sigmoide y tanh, si el parámetro es demasiado grande, el gradiente desaparecerá)
  3. El valor de inicialización del parámetro no puede ser demasiado pequeño; (porque la función de activación es relu y sigmoid, si el parámetro es demasiado pequeño, el gradiente desaparecerá)

1. Todos los parámetros se inicializan a 0 o al mismo número

        El método de inicialización más simple es inicializar todos los parámetros a 0 o una constante, pero el uso de esta función hará que todas las neuronas de la red aprendan la misma función.
Suponiendo que solo hay una capa oculta con 2 neuronas en la red neuronal, el parámetro de sesgo ahora se inicializa en: sesgo = 0, y la matriz de peso se inicializa en una constante α. La entrada de la red es (x1, x2), y la función de activación utilizada en la capa oculta es ReLU, por lo que la salida de cada neurona en la capa oculta es relu(αx1+αx2). Esto lleva a que para el valor de la función de pérdida, la influencia de las dos neuronas sea la misma, y ​​el valor del gradiente del parámetro correspondiente en el proceso de retropropagación también sea el mismo, es decir, durante el entrenamiento. proceso, las dos neuronas Los parámetros son siempre consistentes, y las características aprendidas son las mismas, lo que equivale a una sola neurona en toda la red.

2. Inicialización demasiado grande o demasiado pequeña

        Si el valor inicial del peso es demasiado grande, hará que el gradiente explote y la red no converja; si el valor inicial del peso es demasiado pequeño, el gradiente desaparecerá, lo que hará que la red converja lentamente o convergen a un mínimo local. Si el valor inicial del valor de peso es demasiado grande, el valor de gradiente de la función de pérdida en relación con el parámetro de peso es muy grande.Cada vez que el parámetro se actualiza por descenso de gradiente, la magnitud de la actualización del parámetro también será grande, lo que conduce al valor de la función de pérdida en su Oscilación cerca del valor mínimo. Por otro lado, si el valor inicial es demasiado pequeño, el gradiente de la pérdida con respecto al parámetro de peso es muy pequeño, y cada vez que se actualiza el parámetro, el rango de actualización también es muy pequeño, lo que hará que la pérdida sea menor. converger muy lentamente, o antes de que converja al valor mínimo Ha convergido un mínimo local.

2 Método de inicialización de peso

2.1 Inicialización constante

        Rellena el tensor o variable de entrada con el valor de val

torch.nn.init.constant_(tensor, val)

parámetro:

tensor – antorcha n-dimensional.Tensor o autograd.Variable
val – el valor para llenar el tensor con

usar:

w = antorcha.vacío(3, 5)
nn.init.constant_(w, 0.3)

2.2 Inicialización de distribución uniforme

        Genera valores a partir de una distribución uniforme U(a, b), rellenando tensores de entrada o variables

antorcha.nn.init.uniform_(tensor, a=0, b=1)

parámetro:

tensor - antorcha n-dimensional.Tensor
a - el límite inferior de la distribución uniforme
b - el límite superior de la distribución uniforme

2.3 Inicialización de distribución normal

        Generar valores a partir de una distribución normal N(mean, std) con media y desviación estándar dadas, rellenando tensores o variables de entrada

antorcha.nn.init.normal_(tensor, media=0, std=1)

parámetro:

tensor – antorcha n-dimensional.Tensor
mean – la media de la distribución normal
std – la desviación estándar de la distribución normal

2.4 Distribución uniforme de Xavier

        Generar valores a partir de una distribución uniforme para rellenar el tensor o variable de entrada. Los valores en el tensor resultante se muestrean de U(-a, a), donde a= ganancia * sqrt( 2/(fan_in + fan_out))* sqrt(3). Este método también se conoce como inicialización de Glorot

torch.nn.init.xavier_uniform_(tensor, ganancia=1)

parámetro:

tensor: antorcha n-dimensional.
Ganancia del tensor: factor de escala opcional

2.5 Distribución normal de Xavier

        Genera valores a partir de una distribución normal para rellenar el tensor o variable de entrada. Los valores en el tensor resultante se muestrean a partir de una distribución normal con media 0 y ganancia de desviación estándar * sqrt(2/(fan_in + fan_out)). También conocida como inicialización de Glorot.

torch.nn.init.xavier_normal_(tensor, ganancia=1)

parámetro:

tensor: antorcha n-dimensional.
Ganancia del tensor: factor de escala opcional

2.6 Distribución uniforme de Kaiming

        Generar valores a partir de una distribución uniforme para rellenar el tensor o variable de entrada. Los valores en el tensor resultante se muestrean a partir de U(-bound,bound), donde

torch.nn.init.kaiming_uniform_(tensor, a=0, mode='fan_in', nonlinearity='leaky_relu')

parámetro:

tensor: antorcha n-dimensional. Tensor
a: el coeficiente de pendiente negativa del rectificador utilizado después de esta capa (el valor predeterminado de ReLU es 0
) retropropagación Predeterminado: fan_in
no linealidad: se recomienda la función de no linealidad, relu y leaky_relu, por defecto leaky_relu

2.7 Distribución normal de Kaiming

        Genera valores a partir de una distribución normal para rellenar el tensor o variable de entrada. La distribución normal de la que se muestrean los valores en el tensor resultante.

torch.nn.init.kaiming_normal_(tensor, a=0, mode='fan_in', nonlinearity='leaky_relu')

parámetro:

tensor: antorcha n-dimensional. Tensor
a: el coeficiente de pendiente negativa del rectificador utilizado después de esta capa (el valor predeterminado de ReLU es 0
) retropropagación Predeterminado: fan_in
no linealidad: se recomienda la función de no linealidad, relu y leaky_relu, por defecto leaky_relu

2.8 Inicialización de la matriz de identidad

        Rellena el tensor de entrada 2D o la variable con la matriz de identidad. Conserve tantas entidades de entrada como sea posible en la capa lineal.

antorcha.nn.init.eye_(tensor)

parámetro:

tensor – antorcha 2D.Tensor

2.9 Inicialización ortogonal

        Rellena el tensor de entrada o la variable con una matriz (semi)ortogonal.

torch.nn.init.orthogonal_(tensor, ganancia=1)

parámetro:

tensor – antorcha n-dimensional.Tensor o autograd.Variable, donde n>=2
ganancia - opcional

2.10 Inicialización dispersa

        Rellena el tensor de entrada bidimensional o la variable como una matriz dispersa, donde los elementos distintos de cero se generan de acuerdo con una distribución normal con media 0 y desviación estándar estándar.

torch.nn.init.sparse_(tensor, escasez, std=0.01)

parámetro:

tensor: antorcha n-dimensional. Tensor o autograd.
Dispersión variable: la proporción de elementos en cada columna que deben establecerse en cero.
std: la desviación estándar de la distribución normal utilizada para generar valores distintos de cero.

2.11 Inicialización de la función delta de Dirac

Llena la antorcha de entrada. Tensor con la función delta de Dirac.

antorcha.nn.init.dirac_(tensor)

parámetro:

tensor – antorcha. Tensor de {3, 4, 5} dimensiones

3 ejemplos de pitón

import torch.nn as nn
import torch

class Net(nn.Module):
    def __init__(self):
        super().__init__()
        self.conv1 = nn.Conv2d(3, 3, (3, 3), stride=(1, 1), padding=1)
        self.bn1 = nn.BatchNorm2d(3)
        self.relu = nn.ReLU()
    def forward(self, x):
        x = self.relu(self.bn1(self.conv1(x)))

        return x
# init.uniform  a, b均值分布的上下限
class model_param_init(nn.Module):
    def __init__(self, model):
        super().__init__()
        assert isinstance(model, nn.Module), 'model not a class nn.Module'
        self.net = model
        self.initParam()
    def initParam(self):
        for param in self.net.parameters():
            # nn.init.zeros_(param)
            # nn.init.ones_(param)
            # nn.init.normal_(param, mean=0, std=1)
            # nn.init.uniform_(param, a=0, b=1)
            # nn.init.constant_(param, val=1)   # 将所有权重初始化为1
            # nn.init.eye_(param)  # 只能将二维的tensor初始化为单位矩阵
            # nn.init.xavier_uniform_(param, gain=1)  # Glorot初始化  得到的张量是从-a——a中采用的
            # nn.init.xavier_normal_(param, gain=1)   # 得到的张量是从0-std采样的
            nn.init.kaiming_normal_(param, a=0, mode='fan_in', nonlinearity='leaky_relu') # he初始化方法
            # nn.init.kaiming_uniform_(param)

if __name__ == '__main__':
    net = Net()
    net = model_param_init(net)
    for param in net.parameters():
        print(param)
    # 按照参数更改权重
    for name, param in net.named_parameters():
        if name == net.conv1.weight:  # 指定更改某层的权重值
            nn.init.dirac_(param, groups=1) # 保留卷积层通道的值
        print(param)

Once métodos de inicialización de peso para PyTorch learning_51CTO Blog_inicialización de peso de pytorch

 Pytroch realiza inicialización de peso del modelo_inicialización de peso de pytorch_Blog de Xiao Zhou, tan gratis como el blog de wind-CSDN

 Estudio de Pytorch Notas Nueve: Inicialización del peso_Blog de Dear_Lin-CSDN Blog

Supongo que te gusta

Origin blog.csdn.net/weixin_39910711/article/details/130743178
Recomendado
Clasificación