Tarjeta perforada Deep Eye Pytorch (17): componentes de redes neuronales recurrentes: capa RNN y RNN (análisis detallado del principio y la implementación de RNN)

Prefacio


  La red neuronal recurrente (RNN), como la red neuronal convolucional, juega un papel muy importante en el aprendizaje profundo. Aunque las redes totalmente conectadas y las redes neuronales convolucionales mencionadas en las notas anteriores ya tienen fuertes capacidades de representación, debido a las limitaciones de la estructura de la red, solo pueden manejar datos de entrada de longitud fija y , debido a las características de acíclico dirigido , La salida se predice solo por los datos de entrada actuales , independientemente del orden de los datos de entrada y si los datos anteriores y posteriores están relacionados. Sin embargo, los datos secuenciales, como texto, voz y video, a menudo tienen una longitud variable, y los datos anteriores y posteriores están altamente correlacionados. Una vez que se cambia la secuencia, la información original a menudo se pierde . Por lo tanto, se necesita una red que considere el orden de los datos de entrada y pueda memorizar información de datos pasados: una red neuronal cíclica. Esta nota aprenderá el principio de la red neuronal recurrente más simple RNN y la capa RNN de Pytorch .

  Esta nota se refiere principalmente al curso Deep Eyes Pytorch , los documentos oficiales de la antorcha , la Introducción al aprendizaje profundo y el combate práctico de PyTorch de Sun Yulin, y los Principios del algoritmo de la red neuronal (CNN / RNN / GAN) + Cursos prácticos de aprendizaje profundo . Los datos utilizados son de Internet, y el texto está escrito en base a la comprensión superficial del autor de muchos cursos.Si un amigo encuentra un error, espero señalarlo. Además, se encontró que alguien copió las notas del autor en otras plataformas, no solo no indicó la fuente, sino que algunos incluso lo usaron como un artículo de pago. Por lo tanto, el autor insertará una marca de identificación en cualquier parte del artículo. Si afecta la lectura, espero perdonarme.

  Vea la capa lineal: Tarjeta perforada de Pytorch Eye of Depth (13): Componentes de red neuronal completamente conectados de Pytorch: capa lineal, capa de activación no lineal y capa de abandono


RNN en comparación con otras redes


  Las redes neuronales totalmente conectadas y las redes neuronales convolucionales son adecuadas para tareas de clasificación y detección. Tienen solo una entrada, o una imagen , o un grupo de características , y solo una salida, o un valor previsto o una categoría. Vector . Debido a las limitaciones de la estructura de la red (la multiplicación de matrices requiere una dimensión correspondiente ), deben ingresarse resizeal tamaño especificado, siempre que se determine la arquitectura de la red, se determinará el tamaño de salida, una vista esquemática de la estructura mostrada en la Figura 1, adaptada de la fuente de la FIG .

  No hay una diferencia esencial entre la red neuronal cíclica y las dos anteriores, y la entrada y salida de la unidad modelo también son de longitud fija . La razón por la cual la red neuronal cíclica tiene longitudes de entrada y salida variables y "memoria" los datos pasados es que es cíclica . La unidad de modelo se utiliza para procesar la secuencia de entrada de longitud variable llamando cíclicamente a la unidad de modelo. En cada ciclo, la unidad de modelo procesa un elemento de secuencia de longitud fija , como un carácter en una cadena, y el número de ciclos se determina por el número de elementos en la secuencia de datos de entrada . Cada vez que se llama a la unidad modelo, se producen dos salidas: el valor actual predicho y el valor de estado . El valor de estado actual se pondera para participar en la generación del siguiente valor de estado, es decir, el elemento de entrada actual afectará el valor de estado del siguiente elemento de entrada. A su vez, tendrá un impacto en su valor de salida predicho. RNN utiliza el valor de estado para lograr la llamada "memoria" . Cuántas veces los ciclos de la unidad del modelo, cuántos valores de predicción de salida se generarán y, finalmente, se seleccionarán varias de las secuencias constituyentes de acuerdo con los requisitos de la tarea como salida del modelo, y se realizará la longitud variable de la secuencia de salida. El diagrama de estructura se muestra en la Figura 1, modificado de la fuente del gráfico De acuerdo con las diferentes tareas, la red neuronal cíclica puede ajustar de manera flexible su tamaño de entrada y salida.

Comparación de redes neuronales recurrentes con otras redes y campos de aplicación de redes neuronales recurrentes

Figura 1. Comparación de la red neuronal recurrente con otras redes y campos de aplicación de la red neuronal recurrente

Principio RNN y aplicación de ejemplo simple


  • Principio RNN

  La unidad del modelo RNN generalmente se compone de tres capas lineales y dos capas de activación no lineales , como se muestra en la Figura 2. Los lados izquierdo y derecho de la figura son la relación entre el plegado y desplegado cíclicos , modificado de la fuente de la figura . La salida de Ouna capa activa no lineal antes f2del valor de estado Stiene una capa activa no lineal antes f1. Entrada para f1comprender entre una capa lineal, matriz de peso de la U- , el valor de estado para f1comprender una capa entre lineal, matriz de peso W es . El valor de estado actual Spara contener una capa no lineal lineal entre la capa activa, la matriz de ponderación V . Cuando está en uso, el número de veces que se llama a la unidad modelo se determina de acuerdo con el número de unidades de datos contenidas en la entrada, y el valor de estado generado cada vez se ponderará y luego se transmitirá. La expresión de la unidad del modelo se muestra en la fórmula (1) y la fórmula (2).

Oficial RNN
Oficial RNN

Principio RNN

Figura 2. Principio de RNN
  • Aplicación de ejemplo simple RNN

  Utilice un método de entrada muy común, la siguiente predicción de caracteres de entrada , entrenamiento de modelo súper simplificado para un mayor aprendizaje. Ahora suponga que todas las muestras contienen solo 4 caracteres diferentes (en realidad deben contarse) h、e、l、o, y el modelo solo predice estos 4 caracteres (en realidad 128), es decir, divididos en 4 categorías. El diagrama de flujo se muestra en la Figura 3, modificado a partir de la fuente del gráfico .

  Con un vector de longitud 4, se pueden representar 4 caracteres ortogonalmente . Sea o=[1 0 0 0], h=[0 1 0 0]、e=[0 0 1 0],l=[0 0 0 1]4 el tamaño de entrada de la unidad del modelo, es decir, el tamaño de entrada de la capa lineal 1 , y un solo carácter es la entrada de la unidad del modelo. En aplicaciones prácticas, f1 en las fórmulas (1) y (2) se usa comúnmente como tanh , que es una clasificación multivariante, y f2 es softmax . Puede verse en la figura que el tamaño de entrada de la unidad del modelo es (4,1), la forma de la matriz de peso U de la capa lineal 1 es (3,4) y la forma de la matriz de peso W de la capa lineal 2 es (3, 3). 4, por lo que el tamaño de salida es 4, la forma de la matriz de peso V de la capa lineal fácil de obtener 3 es (4, 3), y la estructura básica de la unidad modelo se puede definir mediante el tamaño y la función de activación antes mencionados. La unidad de modelo se llama cíclicamente para procesar los caracteres en la secuencia de entrada. Cada vez que se procesa un carácter, se puede obtener una predicción sobre el siguiente carácter y se puede "recordar" el valor de estado que contiene información actual y pasada. Minimizar la diferencia entre el valor predicho y la etiqueta La distancia puede establecer la relación de mapeo entre el carácter de entrada y el siguiente carácter que se espera que aparezca La esencia es la relación de mapeo entre vectores.

Proceso de implementación de RNN

Figura 3. Proceso de implementación de RNN

  La suma de la pérdida entre cada salida de predicción y la etiqueta es la pérdida total, que se utiliza en el descenso de gradiente. Vale la pena señalar que U, V y W permanecen sin cambios durante el proceso de llamada de bucle de la unidad modelo . Por lo tanto, cuando se obtiene la derivación del descenso del gradiente de retropropagación, la función que se ha compuesto muchas veces está sesgada contra U, V y W. Derivada, usando una estructura de reglas de derivación en forma de cadena similar a la que se muestra en la Figura 4, fuente del gráfico .

La función compuesta encuentra la estructura de la regla de la cadena de derivada parcial

Figura 4. La estructura de la regla de la cadena para funciones compuestas

  El proceso anterior se puede implementar con el siguiente código: La clave es construir tres capas lineales y la transferencia de valores de estado en el proceso de bucle. Para la simple tarea de China, no es necesario repetirlo muchas veces para predecirlo completamente correctamente.

import torch
import torch.nn as nn

# 数据
input_data = (
    ([0, 1, 0, 0], 'h'),
    ([0, 0, 1, 0], 'e'),
    ([0, 0, 0, 1], 'l'),
    ([0, 0, 0, 1], 'l'),
    ([1, 0, 0, 0], 'o')
)

# 类别与向量的映射关系
class_data = (
    ([1, 0, 0, 0], 'o'),
    ([0, 1, 0, 0], 'h'),
    ([0, 0, 1, 0], 'e'),
    ([0, 0, 0, 1], 'l')

)
S = torch.tensor([0, 0, 0], dtype=torch.float)
loss = 0
U_Linear = nn.Linear(4, 3, bias=True)
V_Linear = nn.Linear(3, 4, bias=True)
W_Linear = nn.Linear(3, 3, bias=True)
tanh = nn.Tanh()
softMax = nn.Softmax()

Loss_function = nn.MSELoss()

# 三个线性层各一个优化器
optimizer = torch.optim.SGD(U_Linear.parameters(), lr=0.5)
optimizer1 = torch.optim.SGD(V_Linear.parameters(), lr=0.5)
optimizer2 = torch.optim.SGD(V_Linear.parameters(), lr=0.5)
# print(input_data[2][0])
for n in range(1000):
    for i in range(len(input_data)-1):     # 循环读取输入列表中元素

        # RNN模型单元前向传播
        U_out = U_Linear(torch.tensor(input_data[i][0], dtype=torch.float))
        W_out = W_Linear(S)
        S = tanh(U_out + W_out)
        # print(S)
        V_out = V_Linear(S)
        outputs = softMax(V_out)

        # 标签就是当前输入字符的下一个字符
        targets = torch.tensor(input_data[i+1][0], dtype=torch.float)

        # 计算总的损失
        loss = loss + Loss_function(outputs, targets)
        predicts = list(torch.round(outputs.data).numpy())
        if n%10 == 0:
            idx = predicts.index(max(predicts))
            print('Outputs', outputs.detach().numpy(), 'Predict:', class_data[idx][1])
    if n%10 == 0:
        print('inters:', n, 'Loss:', loss.detach().numpy(),)
    optimizer.zero_grad()
    optimizer1.zero_grad()
    optimizer2.zero_grad()

    # 误差反向传播加优化模型
    loss.backward(retain_graph=True)
    optimizer.step()
    optimizer1.step()
    optimizer2.step()

    loss = 0

# (CSDN意疏原创笔记:https://blog.csdn.net/sinat_35907936/article/details/107833112)
inters: 110 Loss: 0.014474688
Outputs [0.03512129 0.01285427 0.9469078  0.00511664] Predict: e
Outputs [0.02170071 0.01946862 0.00924533 0.9495853 ] Predict: l
Outputs [0.08608606 0.01253206 0.00805425 0.8933276 ] Predict: l
Outputs [0.88951653 0.00719438 0.01199281 0.0912962 ] Predict: o

# (CSDN意疏原创笔记:https://blog.csdn.net/sinat_35907936/article/details/107833112)

Capa RNN


Supongo que te gusta

Origin blog.csdn.net/sinat_35907936/article/details/108276948
Recomendado
Clasificación