ruta de aprendizaje del modelo transformador

Ruta de aprendizaje transformador

No entiendo nada de transformador, recientemente vine a comenzar con él, aquí está mi ruta de aprendizaje. ¡Transformer y CNN son dos ramas! ! Por lo tanto, debemos aprender por separado
que Transformer es un modelo Seq2seq, y que el modelo Seq2seq usa el mecanismo de autoatención, y el mecanismo de autoatención está en Encoder y Decode.
Entonces el aprendizaje comenzará desde la atención propia->Seq2seq->Encoder-Decode->Transformer

1. Antecedentes del problema:

En la actualidad, lo que ingresamos es un vector, y la categoría o valor de salida final (como una tarea de clasificación o detección de imágenes)
asume que la entrada ahora se convierte en una fila de vectores y la longitud cambiará al mismo tiempo. para solucionarlo?
Insertar descripción de la imagen aquí

El primer ejemplo:
conversión de secuencia de vocabulario: una palabra corresponde a un vector y una oración es una fila de vectores de diferentes longitudes ¿Cómo representar una palabra como un vector?
Hay dos métodos: codificación one-hot e incrustación de palabras.
La desventaja de la codificación one-hot es que no podemos ver ninguna conexión entre cada palabra. En
Word Embedding, cada vector de palabras tiene un orden semántico. Cuando se dibujan, los animales aparecerán juntos (perro, gato, conejo), plantas juntas (árbol, flor), etc.
Insertar descripción de la imagen aquí

El segundo ejemplo:
un fragmento de sonido es en realidad una fila de vectores. Tomamos un fragmento de señal de voz como una ventana y describimos la información que contiene como un vector (cuadro). Deslizamos esta ventana para obtener todos los vectores de este fragmento. de voz, hay 6000 en un vector de sonido de un minuto
Insertar descripción de la imagen aquí

El tercer ejemplo:
la teoría de grafos y el gráfico de conocimiento también son una fila de vectores. Cada nodo de la red social es una persona y la relación entre los nodos está conectada por líneas. Todo el mundo es un vector.
Insertar descripción de la imagen aquí

La entrada puede ser un texto, un discurso o una imagen, entonces, ¿cuál es el resultado?

La salida se divide en tres tipos:

  • Una palabra/un pequeño segmento del habla corresponde a una etiqueta (la primera línea en la figura siguiente)
  • Una oración/discurso completo corresponde a una etiqueta (la segunda línea en la figura siguiente)
  • La cantidad a generar está determinada por la propia máquina (la tercera línea en la figura siguiente)
    Insertar descripción de la imagen aquí

El primer tipo: uno a uno (etiquetado de secuencia)

Insertar descripción de la imagen aquí
Procesamiento de textos: Etiquetado de secuencias Etiquetado POS, cada palabra ingresada genera la parte correspondiente del discurso
Procesamiento del habla: Hay una cadena de vectores en una señal de sonido, cada vector corresponde a un símbolo fonético
Procesamiento de imágenes: En las redes sociales, recomienda a un usuario producto (posiblemente lo compraré o no)

Problema de etiquetado de secuencia

Cada palabra de entrada genera la parte correspondiente del discurso, ¡pero! ! ! Cuando la misma palabra tiene diferentes partes de la oración, es necesario considerar la semántica del contexto (por ejemplo: vi una sierra. Vi una sierra) Solución: use una ventana
deslizante y cada vector observe las propiedades de otros adyacentes. vectores en la ventana. (Por ejemplo, la ventana en el cuadro rojo)
Sin embargo, si la declaración es larga, este método no puede resolver el problema de análisis de la declaración completa, es decir, el análisis semántico.
Esto conduce a la tecnología de autoatención.
Insertar descripción de la imagen aquí

Tipo 2: muchos a uno

Insertar descripción de la imagen aquí
Análisis semántico: evaluación positiva y negativa de una oración completa.
Reconocimiento de voz: un fragmento de discurso se utiliza para identificar el timbre de alguien en su conjunto.
Imagen: Dada la estructura de la molécula, determine su hidrofilicidad.

Tipo 3: Personalizado por el modelo (seq2seq)

No se sabe cuántas etiquetas se deben generar, la máquina decide por sí sola.
Traducción: del idioma A al idioma B, el número de caracteres de las palabras es diferente.
Reconocimiento de voz, etc.


2.Autoatención

La mayor diferencia con la ventana deslizante es que todas las palabras consideran la semántica de la oración completa a través de la Autoatención.
Insertar descripción de la imagen aquí

principio:

¿Qué es lo que en última instancia quiere la autoatención?
El problema esencial es dar una entrada y la salida puede ver toda la información de la muestra de entrada y luego calcular la correlación (diferentes pesos) para seleccionar su propio punto de atención.
Principio: Ingrese una matriz I (puedo contener múltiples vectores a1, a2, a3, a4), multiplíquela por Wq, Wv, Wk respectivamente para obtener tres matrices QKV, cada vector a1, a2, a3, a4 se realiza por separado. *K calcula el grado de correlación A y luego lo convierte al peso A' mediante softmax. A' se multiplica por V para calcular la suma ponderada y obtener el resultado final. El resultado final es un número (peso de correlación).

(Aquí I equivale a una oración, y a1, a2, a3, a4 equivalen a cada palabra de la oración)
Insertar descripción de la imagen aquí
Insertar descripción de la imagen aquí
Insertar descripción de la imagen aquí

Referencia de pasos específicos: autoatención

¿Cómo calcular la correlación?
Dos métodos: 1. Hacer producto interno (el más utilizado) 2. Aditivo
Insertar descripción de la imagen aquí

Derivación matemática: derivación práctica de la autoatención


3. Autoatención de múltiples cabezas

Multi-head es equivalente al procesamiento paralelo de dos entradas ai y aj, algo similar al mapa de características multicanal en CNN

Después de dividir los segmentos, calcúlelos individualmente y luego resúmalos. El qkv de head1 se calcula como el de head1. Las cabezas no interfieren entre sí al calcular la similitud. Cada segmento se calcula de forma independiente y luego se agrega.

La ventaja de los cabezales múltiples es la diversidad: en términos simples, en el cálculo de cabezales múltiples, cada cabezal puede tener diferentes preocupaciones de cálculo y ver cosas diferentes.
Insertar descripción de la imagen aquí
Insertar descripción de la imagen aquí


4. Codificación posicional

Para la atención propia, no hay información sobre la posición del personaje en la secuencia. Por ejemplo, es poco probable que un verbo aparezca al comienzo de una oración, por lo que se puede reducir la posibilidad de que un verbo esté al comienzo de una oración, pero el mecanismo de autoatención no tiene esta capacidad. Por lo tanto, es necesario agregar tecnología de codificación posicional para marcar la información de posición de cada palabra en la oración.
Principio: solo necesita agregar un ei a la entrada ai
Insertar descripción de la imagen aquí
Entonces, ¿cómo obtener la codificación posicional?
1. La codificación posicional se puede aprender mediante entrenamiento de datos, que es similar al entrenamiento para aprender vectores de palabras. La codificación posicional de Goole en el bert posterior se obtiene mediante entrenamiento. 2.
Codificación posicional seno y coseno. La codificación posicional se genera utilizando funciones seno y coseno de diferentes frecuencias y luego se agrega al vector de palabras de la posición correspondiente. La dimensión del vector de posición debe ser coherente con la dimensión del vector de palabras.
Insertar descripción de la imagen aquí
pos representa la posición absoluta de la palabra en la oración, pos = 0, 1, 2 ..., por ejemplo: Jerry's pos = 2 en "Tom Chase Jerry"; dmodel representa la dimensión del vector de palabras, aquí dmodel = 512 ; 2i y 2i +1 representan paridad, i representa la dimensión en la palabra vector, por ejemplo, aquí dmodel=512, entonces i=0, 1, 2...255.


Comparar con aplicaciones anteriores sin atención propia

  • En términos de voz,
    se utilizó el método de ventana deslizante para leer el discurso completo. O un segmento de voz corresponde a una etiqueta, o todo el segmento de voz corresponde a una etiqueta. Si el segmento de voz es muy largo, la ventana deslizante El método no es adecuado para una gran cantidad de parámetros, por lo que se introduce la atención propia.
    Ponga cada segmento del discurso en Auto-Atención para aprender la semántica de los segmentos del discurso anterior y siguiente.38e48eba9154f2af7632f62.png)

- en la imagen

Una imagen en CNN puede considerarse como un vector muy largo. También se puede ver como un conjunto de vectores: una imagen RGB de 5*10 se puede ver como tres matrices (de canales) de 5*10, y la misma posición de los tres canales se puede considerar como un vector tridimensional.
Insertar descripción de la imagen aquí

Insertar descripción de la imagen aquí
- Teoría de grafos GNN
Insertar descripción de la imagen aquí

La desventaja del mecanismo de autoatención es que la cantidad de cálculo es muy grande, por lo que cómo optimizar su cantidad de cálculo es el foco de investigaciones futuras.

5. Autoatención versus CNN

La autoatención encuentra píxeles relevantes a nivel mundial, al igual que la ventana (campo de recepción) en CNN se aprende automáticamente.

Por ejemplo: el píxel de 1 genera una consulta y cada uno de los demás píxeles genera una clave. Al fabricar productos internos, lo que consideramos no es una pequeña gama, sino una imagen completa.
Insertar descripción de la imagen aquí

La autoatención es una CNN complicada. Al hacer CNN, solo considera la información en el cuadro rojo salvaje, y el rango y el tamaño del campo receptivo están determinados por las personas, pero la autoatención encuentra píxeles relevantes a través de la atención. que el rango y el tamaño del campo receptivo se aprenden automáticamente.Documento
Insertar descripción de la imagen aquí
de referencia: Sobre la relación entre las capas de autoatención y convolución

Si se utilizan diferentes cantidades de datos para entrenar CNN y la autoatención, aparecerán resultados diferentes.
Utilice CNN si la cantidad de datos es pequeña y utilice la autoatención si la cantidad de datos es grande.


6. Autoatención versus RNN

RNN no tiene forma de procesarlo en paralelo. Solo se puede almacenar en la memoria y pasar de un lado a otro paso a paso. Sin embargo, la
autoatención realiza QKV en cada vector. Solo necesita hacer coincidir diferentes vectores entre sí, y cuatro Las salidas se pueden procesar en paralelo.
Insertar descripción de la imagen aquí

 
 
 
 
 

------------------------------------------------Actualizar transformación ----- abajo ----------------------------------

1.Seq2seq

Transformer es un modelo Seq2seq (Secuencia a secuencia)

Seq2seq pertenece a la tercera categoría de salida: ingresa una secuencia, genera una secuencia (la longitud de salida está determinada por el modelo) ingresa una fila de vectores y la longitud de salida la determina la propia máquina

1.1 Antecedentes

El primer ejemplo
es el reconocimiento de voz. La señal de voz de entrada es una serie de vectores y la salida es el texto correspondiente a la señal de voz. Sin embargo, no existe una relación directa entre la longitud de la señal de voz y el número de palabras emitidas, por lo que la máquina debe decidir por sí sola. Lo mismo ocurre con la traducción automática y la traducción de voz. Al mismo
Insertar descripción de la imagen aquí
tiempo, seq2seq también puede entrenar robots de chat. Introduzca un "Hola" y Seq2seq generará una frase larga "¡Hola!". ¿Cómo estás hoy?
Insertar descripción de la imagen aquíTodo tipo de preguntas de PNL a menudo pueden considerarse preguntas de control de calidad, como el sistema de respuesta a preguntas (QA), que permite que la máquina lea un artículo, lea una pregunta y genere una respuesta. Este problema se puede resolver utilizando el modelo Seq2seq:
Insertar descripción de la imagen aquí

El segundo ejemplo
es el análisis gramatical:
ingresamos un fragmento de texto, lo que tiene que hacer la máquina es generar una estructura de árbol, diciéndonos qué combinaciones de texto o palabras son sustantivos, qué combinaciones son adjetivos, etc.
Insertar descripción de la imagen aquí

El tercer ejemplo es
la Clasificación multietiqueta,
cada cosa puede corresponder a muchas categorías
, por ejemplo, ingresa un artículo y la máquina te ayudará a decidir a cuántas clases pertenece (clase9, clase7, clase13).
Insertar descripción de la imagen aquí

2. Principio seq2seq (Codificador-Decodificador)

Generalmente, Seq2seq se dividirá en dos partes: codificador y decodificador.

2.1 Parte del codificador:

Lo que tiene que hacer el codificador es dar una fila de vectores y generar una fila de vectores.
La parte de codificación se puede implementar utilizando una variedad de modelos, como CNN, RNN, etc. (Imagen en la esquina superior izquierda)
Este artículo solo habla sobre el codificador en Transformer. Bert es el codificador de Transformer , que se compone de múltiples bloques para ingresar y generar continuamente una fila de vectores (Imagen en la esquina superior derecha)

Mi propio resumen simple es: (Imágenes de abajo a la izquierda y abajo a la derecha)
Ingrese una fila de vectores e información de posición de codificación posicional------>Envíelo a Atención de múltiples cabezales----->La fila de entrada de vectores no atención propia (tome una cabeza como ejemplo) y la entrada se usa para hacer el residual y la norma de capa---->envíelo a FC----->luego use la entrada y salida de FC para hacer el residual y Norma de capa --- ---> Finalmente genere una fila de vectores (repita el Bloque varias veces para obtener el resultado)

El flujo completo de la imagen es el siguiente: ¡ Las imágenes son muy importantes! ! ! ! ! ! !Insertar descripción de la imagen aquí

Los pasos específicos de cada bloque en Transformer Encode son los siguientes:
1. Ingrese una fila del vector B y envíela a Self-Attention para obtener una fila de salida del vector A, y haga el residuo A+B entre los dos
. Haga que el resultado de A+B obtenga la norma de capa (la diferencia entre LN y BN: BN se calcula por dimensión, LN se calcula por fila)

Insertar descripción de la imagen aquí
3. Envíe el resultado de la normalización de LN a la capa FC y también haga el residual, y envíe el resultado de FC a la capa LN, el resultado final de la salida de LN es el resultado de la salida final de Encode
Insertar descripción de la imagen aquí
Consejos:
1. La estructura residual es para resolver el problema de la desaparición del gradiente, lo que puede aumentar la complejidad del modelo.
2. Batchnorm es normalizar un lote de muestras y Layernorm es normalizar cada muestra una vez 3. La
entrada del codificador contiene dos, que es una secuencia + incrustación posicional, y las funciones seno y coseno se utilizan para la secuencia Las posiciones son calculado (el seno se usa para posiciones pares y el coseno se usa para posiciones impares)

LN y BN: uno por fila, el otro por columna
Insertar descripción de la imagen aquí

Documento de referencia: ¿Por qué utilizar LN en lugar de BN? PowerNorm finalmente propuesto
PowerNorm: repensar la normalización de lotes en transformadores


2.2 Parte del decodificador:

Primero suponga que Decoder es un bloque independiente y estudie su entrada y salida.

La entrada del decodificador se divide en dos: una es la salida de la parte del codificador y la otra es el token de inicio (similar al bit de bandera, representado por one-hot). La salida es: la probabilidad de la palabra de salida
. en el puesto correspondiente.

Decoder se divide en dos modos: autorregresión (AT) / no autorregresión (NAT), mientras que Transformer usa autorregresión (AT). Puede optar por no ver la parte NAT.

1. Autoregresivo (Autoregresivo)
Si el decodificador se considera como una caja negra, esta caja negra primero acepta un inicio de símbolo especial, primero lee la salida del codificador, ingresa los vectores al decodificador a su vez, genera un vector a través del decodificador, y obtiene un vector a través de la puntuación softmax, selecciona la salida con la puntuación más alta, y luego la entrada del Decodificador será su salida anterior (algo similar a que RNN recuerde la información anterior) y finalmente genera un símbolo de terminación del Token final.

Entrada: una es la salida de la parte del codificador y la otra es la
salida del token de inicio: la probabilidad de que la palabra de salida corresponda a la posición.
Insertar descripción de la imagen aquí
Pero cuando hay un error de salida de texto, el Decodificador utilizará el resultado de este error [un paso en falso, un paso en falso]: El
Insertar descripción de la imagen aquí
problema más común causado por el Forzado del Profesor es el sesgo de exposición, y la solución está en el cuarto punto.

2. No autorregresivo (NAT no autorregresivo)
Autoregresivo significa ingresar uno por uno y emitir uno por uno.
No autorregresivo significa ingresar una fila de inicios y finalmente generar una oración completa directamente.
Entonces, ¿cómo determinar la longitud de salida de NAT? ¿descifrador?
1. Puede usar una red de predicción para predecir la longitud de la salida y luego generar la oración.
2. También puede seguir generando y luego truncar la oración hasta el final.
Insertar descripción de la imagen aquí
Ventajas de NAT: procesamiento paralelo (se pueden ingresar juntos y luego salen juntos) , rápido; La longitud de salida es controlable.
Desventajas: el rendimiento de NAT suele ser inferior al de AT: problema multimodal.
 

Se puede considerar que AT y NAT son exactamente iguales en el lado del codificador, pero son diferentes en el lado del decodificador. AT usa los resultados de todos los momentos anteriores para predecir las palabras generadas en el siguiente momento en el decodificador, mientras que NAT usa una variable oculta para generar cada palabra en el Decodificador. El resultado en un momento hace que todo el proceso de decodificación sea independiente y paralelo. La clave está en cómo definir esta variable oculta.

 
De hecho, el Decodificador no es un bloque independiente, está conectado con el Codificador. Estudiemos cómo está conectado en el Transformador. Consulte la atención cruzada en el segundo punto a continuación.


3. Cómo conectar Codificador y Decodificador en Transformer

La siguiente figura muestra la estructura específica del Transformador. La diferencia entre el Decodificador y el Codificador del Transformador que usa la arquitectura Codificador-Decodificador radica en dos lugares: 1. La autoatención se convierte en Autoatención enmascarada 2. El decodificador tiene una capa adicional de atención cruzada
Insertar descripción de la imagen aquí


1. La autoatención se ha convertido en autoatención enmascarada.
 
La autoatención ordinaria consiste en enviar la fila completa de vectores y la salida es la fila completa de vectores, mientras que la entrada de autoatención enmascarada se ingresa uno por uno, y la la salida solo puede considerar la entrada anterior. Los vectores, independientemente de los posteriores, se
generan uno por uno.
Insertar descripción de la imagen aquí

2. El decodificador tiene una capa más: ¿
 
Cómo se conectan entre sí el codificador y el decodificador de atención cruzada?
 
Cross Attention está ubicado en el Decodificador y es el puente que conecta el Codificador y el Decodificador.Tiene tres entradas, dos de las cuales provienen del Codificador y una del Decodificador.
La salida de dos codificadores + la entrada de un decodificador se envían a la autoatención de múltiples cabezales. La
Insertar descripción de la imagen aquí
atención cruzada cruza la atención
. El mecanismo de atención cruzada no es Transformer. Apareció antes de Transformer. Más tarde apareció la autoatención y solo entonces apareció Transformer.
Entrada del decodificador. Comience a generar una Q en la autoatención enmascarada. Esta Q se correlaciona con la K generada después de realizar la autoatención en la parte del codificador para obtener α. El resultado obtenido después de que α se multiplica por puntos con v se envía a FC.
Insertar descripción de la imagen aquí


4. Entrenamiento e inferencia

El decodificador de Transformer debe dividirse en una parte de capacitación y una parte de razonamiento para la discusión.

El proceso de ejecución del módulo Encoder es el mismo. El codificador se puede calcular en paralelo y codificar al mismo tiempo. El proceso de ejecución
del módulo Decoder es diferente. El proceso de entrenamiento consiste en generar los resultados de predicción de todas las palabras en secuencias b en a la vez, mientras que el proceso de razonamiento consiste en generar b secuencias a la vez. La predicción de una palabra en la secuencia requiere varios pasos para predecir todas las palabras de la secuencia.

Mi propio entendimiento es que la entrada durante el entrenamiento es Ground Truth, y la entrada prevista es la salida en el momento anterior. El entrenamiento utiliza Teacher Forcing para el entrenamiento paralelo y la inferencia es en serie.
 

1. La parte de entrenamiento
Decoder ingresará Groud Truth durante el entrenamiento, que se llama Teacher Forcing
Train. Es similar a la clasificación: genera la categoría más grande e introduce entropía cruzada para registrar las palabras predichas y las etiquetas reales.
Insertar descripción de la imagen aquí

2. Parte de inferencia:
el decodificador ingresará la salida del último decodificador durante el razonamiento.
El razonamiento del decodificador no resuelve todas las secuencias a la vez, sino que las resuelve una por una, porque la salida de la posición anterior se utiliza como Q de atención.

Por ejemplo:
Insertar descripción de la imagen aquí
Paso 1 de la fase de entrenamiento e inferencia:
Entrada inicial: Inicio del símbolo de inicio + Codificación posicional (codificación posicional)
Entrada intermedia: Incrustación del codificador
Salida final: Generar una "máquina" de predicción

Paso 2:
Entrada inicial: inicio del carácter + "máquina" + codificación posicional
Entrada intermedia: codificador Incrustación
de salida final: generar "dispositivo" de predicción

Paso 3:
Entrada inicial: inicio del símbolo + “máquina” + “dispositivos” + Codificación posicional
Entrada intermedia: Codificador Incrustación
salida final: generar predicción “aprendizaje”

Paso 4:
Entrada inicial: inicio del símbolo inicio + “máquina” + “herramienta” + “aprender” + Codificación posicional
Entrada intermedia: Incrustación del codificador
Salida final: generar predicción “aprender”

La fase de capacitación equivale a los pasos 1 a 4, que se pueden realizar al mismo tiempo, porque sabemos que el resultado final es "aprendizaje automático", mientras que la fase de inferencia solo se puede realizar paso a paso, y la siguiente El paso solo se puede predecir en función del paso anterior, porque no sabemos cuál será el resultado final.

Insertar descripción de la imagen aquí

Referencia detallada: ¿Qué maestro explica la entrada y salida del decodificador de Transformer? ¿Puedes explicar qué es cada parte?


5. Consejos

1. Mecanismo de copia
Para muchas tareas, es posible que Decoder no necesite generar resultados o puede "copiar" algo de los resultados.
Por ejemplo, en un robot de chat, la máquina no necesita procesar el nombre de una persona ingresado por el usuario, sino que puede generarlo directamente (como Kurolo); o repetir un fragmento de texto irreconocible; o extraer resúmenes de un gran número de artículos Documento de referencia
Insertar descripción de la imagen aquí
: Vaya al grano: resumen con redes generadoras de punteros

2. Reconocimiento de voz con atención guiada
A menudo se utiliza en
máquinas de reconocimiento de voz y síntesis de voz para leer cuatro palabras seguidas. Puede que no haya ningún problema en la pronunciación. Leer una sola palabra puede provocar errores de lectura. Por lo tanto, se requiere atención guiada, lo que requiere La máquina debe tener un método fijo al prestar atención. Por
ejemplo: cuando se requiere síntesis de voz, la máquina procede de izquierda a derecha en lugar de estar desordenada.
Insertar descripción de la imagen aquí
Métodos específicos: Atención monótona, Atención consciente de la ubicación.

3. Búsqueda por haz.
Cada vez que encuentres la puntuación más alta, la ruta roja conectada se llama Decodificación codiciosa.
Si pierdes un poco de la entrada inicial, pero el resultado final es que la ruta verde es mejor que la roja, entonces esta La tecnología se llama Beam Search.
Insertar descripción de la imagen aquí

4. Sesgo de exposición
forzado por el profesor El problema más común es el sesgo de exposición
. Cuando entrena, el decodificador ve la verdad fundamental, y cuando prueba, el decodificador ve algo incorrecto. Este fenómeno inconsistente se llama sesgo de exposición.
Insertar descripción de la imagen aquí

¿Cómo solucionar los problemas causados ​​por el Teacher Forceing?
——Muestreo programado
Simplemente agregue algunos errores en el tren, que es similar a "agregar perturbaciones" para resolverlo: muestreo programado (muestreo programado), este método afectará la paralelización de Transformer.

Artículo principal:
1. Muestreo programado para predicción de secuencias con redes neuronales recurrentes
2. Muestreo programado para transformadores
3. Cerrar la brecha entre el entrenamiento y la inferencia para la traducción automática neuronal

Relacionado:

1. "Aprendizaje profundo" de Li Hongyi: mecanismo de autoatención
2. Tres artículos que le ayudarán a comprender la consulta, la clave y el valor en Transformer
3. Derivación práctica de la autoatención
4. Explicación detallada del transformador más simple de la historia
5 Vision Transformer, Vision MLP Interpretación súper detallada (Análisis de principios + Interpretación de código) (Tabla de contenido) 6. Pensamientos aleatorios sobre
el sesgo de exposición y el forzamiento del maestro
7. ¿Qué maestro puede explicar cuáles son la entrada y la salida del decodificador de Transformer? ¿Puedes explicar qué es cada parte?

Supongo que te gusta

Origin blog.csdn.net/qq_42740834/article/details/124943826
Recomendado
Clasificación