¿Cómo funciona la capa de convolución Keras 1d con incrustaciones de palabras – problema de clasificación de texto? (Filtros, tamaño del kernel, y todos los hiperparámetros)

Actualmente estoy desarrollando una herramienta de clasificación de texto usando Keras. Funciona (funciona bien y conseguí una precisión de validación de 98.7) pero no puedo comprender cómo funciona exactamente la capa de convolución 1D con datos de texto.

¿Qué hiper-parámetros debo usar?

Tengo las siguientes oraciones (datos de entrada):

  • Máximo de palabras en la oración: 951 (si es menos, se agregan los rellenos)
  • Tamaño del vocabulario: ~ 32000
  • Cantidad de oraciones (para entrenamiento): 9800
  • embedding_vecor_length: 32 (cuántas relaciones tiene cada palabra en incrustaciones de palabra)
  • batch_size: 37 (no importa para esta pregunta)
  • Número de tags (clases): 4

Es un modelo muy simple (he hecho estructuras más complicadas pero, curiosamente, funciona mejor, incluso sin usar LSTM):

model = Sequential() model.add(Embedding(top_words, embedding_vecor_length, input_length=max_review_length)) model.add(Conv1D(filters=32, kernel_size=2, padding='same', activation='relu')) model.add(MaxPooling1D(pool_size=2)) model.add(Flatten()) model.add(Dense(labels_count, activation='softmax')) model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) print(model.summary()) 

Mi pregunta principal es: ¿Qué hiper parámetros debo usar para la capa Conv1D?

 model.add(Conv1D(filters=32, kernel_size=2, padding='same', activation='relu')) 

Si tengo los siguientes datos de entrada:

  • Número máximo de palabras: 951
  • Dimensión de incrustaciones de palabras: 32

¿Significa que los filters=32 solo escanearán las primeras 32 palabras descartando completamente el rest (con kernel_size=2 )? ¿Y debería establecer filtros en 951 (cantidad máxima de palabras en la oración)?

Ejemplos en imágenes:

Entonces, por ejemplo, esto es un dato de entrada: http://joxi.ru/krDGDBBiEByPJA

Es el primer paso de una capa de convoulution (paso 2): http://joxi.ru/Y2LB099C9dWkOr

Es el segundo paso (paso 2): http://joxi.ru/brRG699iJ3Ra1m

¿Y si los filters = 32 , la capa lo repite 32 veces? ¿Estoy en lo correcto? Entonces, ¿no podré decir 156 palabras en la oración y, por lo tanto, esta información se perderá?

Intentaría explicar cómo se aplica 1D-Convolution en una secuencia de datos. Solo uso el ejemplo de una oración que consta de palabras, pero obviamente no es específica de los datos de texto y es igual con otros datos de secuencia y series de tiempo.

Supongamos que tenemos una oración que consta de m palabras donde cada palabra ha sido representada usando incrustaciones de palabras:

Datos de entrada

Ahora nos gustaría aplicar una capa de convolución 1D que consta de n filtros diferentes con el tamaño de kernel k en estos datos. Para ello, se extraen ventanas deslizantes de longitud k de los datos y luego se aplica cada filtro a cada una de esas ventanas extraídas. Aquí hay una ilustración de lo que sucede (aquí asumí que k=3 y quité el parámetro de sesgo de cada filtro para simplificar):

Filtros

Como puede ver en la figura anterior, la respuesta de cada filtro es equivalente al resultado de su producto puntual (es decir, multiplicación por elementos y luego sumndo todos los resultados) con la ventana extraída de longitud k (es decir, i -th a (i+k-1) -th palabras en la oración dada). Además, tenga en cuenta que cada filtro tiene el mismo número de canales que el número de funciones (es decir, la dimensión de incrustaciones de palabras) de la muestra de entrenamiento (por lo tanto, es posible realizar un producto de puntos). Esencialmente, cada filtro está detectando la presencia de una característica particular del patrón en una ventana local de datos de entrenamiento (por ejemplo, si existe un par de palabras específicas en esta ventana o no). Después de que todos los filtros se hayan aplicado en todas las ventanas de longitud k tendríamos una salida como esta que es el resultado de la convolución:

filtra la respuesta

Como puede ver, hay m-k+1 ventanas en la figura ya que hemos asumido que el padding='valid' y la stride=1 (comportamiento predeterminado de la capa Conv1D en Keras). El argumento de stride determina cuánto debe deslizarse la ventana (es decir, cambiar) para extraer la siguiente ventana (por ejemplo, en nuestro ejemplo anterior, una zancada de 2 extraería ventanas de palabras: (1,2,3), (3,4,5), (5,6,7), ... lugar). El argumento de padding determina si la ventana debe consistir completamente en las palabras en la muestra de capacitación o si debe haber espacios al principio y al final; de esta manera, la respuesta de convolución puede tener la misma longitud (es decir, m y no m-k+1 ) que la muestra de entrenamiento (por ejemplo, en nuestro ejemplo anterior, padding='same' extraería ventanas de palabras: (PAD,1,2), (1,2,3), (2,3,4), ..., (m-2,m-1,m), (m-1,m, PAD) ).

Puedes verificar algunas de las cosas que mencioné usando Keras:

 from keras import models from keras import layers n = 32 # number of filters m = 20 # number of words in a sentence k = 3 # kernel size of filters emb_dim = 100 # embedding dimension model = models.Sequential() model.add(layers.Conv1D(n, k, input_shape=(m, emb_dim))) model.summary() 

Resumen Modelo:

 _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= conv1d_2 (Conv1D) (None, 18, 32) 9632 ================================================================= Total params: 9,632 Trainable params: 9,632 Non-trainable params: 0 _________________________________________________________________ 

Como puede ver, la salida de la capa de convolución tiene una forma de (m-k+1,n) = (18, 32) y el número de parámetros (es decir, los pesos de los filtros) en la capa de convolución es igual a: num_filters * (kernel_size * n_features) + one_bias_per_filter = n * (k * emb_dim) + n = 32 * (3 * 100) + 32 = 9632 .