Atención para dummies e implementación en Keras

Sobre artículos sobre inteligencia artificial en ruso


A pesar de que el mecanismo de Atención se describe en la literatura inglesa, todavía no he visto una descripción decente de esta tecnología en el sector de habla rusa. Hay muchos artículos sobre Inteligencia Artificial (IA) en nuestro idioma. Sin embargo, los artículos que se encontraron revelan solo los modelos de IA más simples, por ejemplo, redes de convolución, redes generativas. Sin embargo, según los últimos desarrollos de vanguardia en el campo de la IA, hay muy pocos artículos en el sector de habla rusa.

La falta de artículos en ruso sobre los últimos desarrollos se convirtió en un problema para mí cuando entré en el tema, estudié el estado actual de las cosas en el campo de la IA. Sé bien inglés, leí artículos en inglés sobre temas de IA. Sin embargo, cuando surge un nuevo concepto o un nuevo principio de IA, su comprensión en un idioma extranjero es dolorosa y prolongada. Saber inglés, penetrar en un objeto no nativo en un objeto complejo todavía vale mucho más tiempo y esfuerzo. Después de leer la descripción, te haces la pregunta: ¿cuánto porcentaje entiendes? Si hubiera un artículo en ruso, lo entendería al 100% después de la primera lectura. Esto sucedió con las redes generativas, para lo cual existe una excelente serie de artículos: después de leer todo se hizo claro. Pero en el mundo de las redes, hay muchos enfoques que se describen solo en inglés y que tuvieron que abordarse durante días.

Periódicamente escribiré artículos en mi idioma nativo, aportando conocimiento a nuestro campo de idiomas. Como sabes, la mejor manera de entender un tema es explicárselo a alguien. Entonces, ¿quién más sino yo debería comenzar una serie de artículos sobre la IA arquitectónica más moderna, compleja y avanzada? Al final del artículo, comprenderé un enfoque 100%, y será útil para alguien que lea y mejore su comprensión (por cierto, amo a Gesser, pero mejor ** Blanche de bruxelles **).

Cuando entiendes el tema, hay 4 niveles de comprensión:

  1. Usted comprende el principio y las entradas y salidas del Algoritmo / Nivel
  2. entiendes las salidas de reunión y, en términos generales, cómo funciona
  3. comprende todo lo anterior, así como el dispositivo de cada nivel de red (por ejemplo, en el modelo VAE entendió el principio y también entendió la esencia del truco de reparameterización)
  4. Entendí todo, incluso cada nivel, también entendí por qué todo se aprende y, al mismo tiempo, puedo seleccionar hiperparámetros para mi tarea, en lugar de copiar y pegar soluciones listas para usar.

Para las nuevas arquitecturas, la transición del nivel 1 al nivel 4 a menudo es difícil: los autores enfatizan que están describiendo más de cerca varios detalles importantes superficialmente (¿los entendieron ellos mismos?). O su cerebro no contiene ninguna construcción, por lo que incluso después de leer la descripción no descifró y no se convirtió en habilidades. Esto sucede si durante tus años de estudiante dormiste en la misma clase de matan, después de una fiesta nocturna  donde diste el tapete correcto. aparato. Y justo aquí necesitamos artículos en nuestro idioma nativo que revelen los matices y sutilezas de cada operación.

Atención concepto y aplicación


Lo anterior es un escenario de niveles de comprensión. Para analizar la Atención, comencemos en el nivel uno. Antes de describir las entradas y salidas, analizaremos la esencia: en qué conceptos básicos, comprensibles incluso para un niño, se basa este concepto. En el artículo usaremos el término en inglés Atención, porque en este formulario también es una llamada a la función de la biblioteca Keras (no se implementa directamente en él, se requiere un módulo adicional, pero más sobre eso a continuación). Para leer más, debe comprender las bibliotecas de Keras y Python, ya que se proporcionará el código fuente.

Atención se traduce del inglés como "atención". Este término describe correctamente la esencia del enfoque: si usted es automovilista y el general de policía de tránsito se muestra en la foto, intuitivamente le da importancia, independientemente del contexto de la foto. Es probable que eche un vistazo más de cerca al general. Tensa los ojos, mira las correas de los hombros con cuidado: cuántas estrellas tiene allí específicamente. Si el general no es muy alto, ignóralo. De lo contrario, considérelo como un factor clave en la toma de decisiones. Así es como funciona nuestro cerebro. En la cultura rusa, hemos sido entrenados por generaciones para prestar atención a los altos rangos, nuestro cerebro automáticamente asigna alta prioridad a dichos objetos.

La atención es una manera de decirle a la red a qué debe prestar más atención, es decir, informar la probabilidad de un resultado particular dependiendo del estado de las neuronas y los datos de entrada. La capa de Atención implementada en Keras identifica los factores basados ​​en el conjunto de entrenamiento, cuya atención reduce el error de red. La identificación de factores importantes se lleva a cabo a través del método de propagación inversa de errores, de forma similar a cómo se hace para las redes de convolución.

En el entrenamiento, Atención demuestra su naturaleza probabilística. El mecanismo en sí mismo forma una matriz de escalas de importancia. Si no hubiéramos entrenado la Atención, podríamos haber establecido la importancia, por ejemplo, empíricamente (lo general es más importante que la insignia). Pero cuando entrenamos una red en datos, la importancia se convierte en una función de la probabilidad de un resultado particular, dependiendo de los datos recibidos en la entrada de la red. Por ejemplo, si nos encontramos con un general que vive en la Rusia zarista, entonces la probabilidad de obtener guanteletes sería alta. Habiendo comprobado esto, sería posible a través de varias reuniones personales, recolectando estadísticas. Después de eso, nuestro cerebro pondrá el peso apropiado en el hecho de la reunión de este tema y colocará marcadores en las correas de los hombros y las rayas. Cabe señalar que el marcador establecido no es probable: ahora la reunión del general conllevará consecuencias completamente diferentes para usted que entonces, además, el peso puede ser más de uno. Pero, el peso puede reducirse a probabilidad normalizándolo.

La naturaleza probabilística del mecanismo de atención en el aprendizaje se manifiesta en las tareas de traducción automática. Por ejemplo, informemos a la red que al traducir del ruso al inglés, la palabra Amor se traduce en el 90% de los casos como Amor, en el 9% de los casos como Sexo, en el 1% de los casos como no. La red marca de inmediato muchas opciones, mostrando la mejor calidad de capacitación. Al traducir, le decimos a la red: "cuando traduzca la palabra amor, preste especial atención a la palabra inglesa Amor, también vea si todavía puede ser Sexo".

El enfoque de Atención se aplica para trabajar con texto, así como con series de sonido y tiempo. Para el procesamiento de texto, las redes neuronales recurrentes (RNN, LSTM, GRU) son ampliamente utilizadas. La atención puede complementarlos o reemplazarlos, moviendo la red a arquitecturas más simples y rápidas.

Uno de los usos más famosos de Attention es usarlo para abandonar la red de recurrencia y pasar a un modelo totalmente conectado. Las redes recurrentes tienen una serie de deficiencias: la incapacidad de proporcionar capacitación en la GPU, el reciclaje rápido. Usando el mecanismo de Atención, podemos construir una red capaz de aprender secuencias sobre la base de una red totalmente conectada, entrenarla en la GPU, usar droput.

La atención se usa ampliamente para mejorar el rendimiento de las redes de recurrencia, por ejemplo, en el campo de la traducción de un idioma a otro. Cuando se utiliza el enfoque de codificación / decodificación, que a menudo se usa en la IA moderna (por ejemplo, codificadores automáticos variacionales). Cuando se agrega una capa de Atención entre el codificador y el decodificador, el resultado de la operación de la red mejora notablemente.

En este artículo, no cito arquitecturas de red específicas usando Atención; esto será objeto de un trabajo separado. Una lista de todos los posibles usos de la atención es digna de un artículo separado.

Implementando la atención en Keras fuera de la caja


Cuando entiendes qué tipo de enfoque, es muy útil aprender el principio básico. Pero a menudo, la comprensión completa solo se obtiene al observar una implementación técnica. Si ve los flujos de datos que componen la función de la operación, queda claro qué se calcula exactamente. Pero primero debe ejecutarlo y escribir "Atención hola palabra".

Actualmente, la atención no está implementada en Keras. Pero ya hay implementaciones de terceros, como atención-keras, que se pueden instalar con github. Entonces su código será extremadamente simple:

from attention_keras.layers.attention import AttentionLayer attn_layer = AttentionLayer(name='attention_layer') attn_out, attn_states = attn_layer([encoder_outputs, decoder_outputs]) 

Esta implementación admite la función de visualización de la escala de Atención. Después de haber entrenado la Atención, puede obtener una señalización matricial que, según la red, es especialmente importante sobre este tipo (imagen de github de la página de la biblioteca de atención-keras).


Básicamente, no necesita nada más: incluya este código en su red como uno de los niveles y disfrute aprendiendo su red. Cualquier red, cualquier algoritmo está diseñado en las primeras etapas a nivel conceptual (como la base de datos, por cierto), después de lo cual la implementación se especifica en una representación lógica y física antes de la implementación. Este método de diseño aún no se ha desarrollado para redes neuronales (oh sí, este será el tema de mi próximo artículo). ¿No entiendes cómo funcionan las capas de convolución en el interior? El principio se describe, los usas.

Implementación de Keras de Atención baja


Para finalmente entender el tema, a continuación analizaremos en detalle la implementación de Atención bajo el capó. El concepto es bueno, pero ¿cómo funciona exactamente y por qué el resultado se obtiene exactamente como se indica?

La implementación más simple del mecanismo de Atención en Keras toma solo 3 líneas:

 inputs = Input(shape=(input_dims,)) attention_probs = Dense(input_dims, activation='softmax', name='attention_probs')(inputs) attention_mul = merge([inputs, attention_probs], output_shape=32, name='attention_mul', mode='mul' 

En este caso, la capa de entrada se declara en la primera línea, luego viene una capa completamente conectada con la función de activación softmax con el número de neuronas igual al número de elementos en la primera capa. La tercera capa multiplica el resultado de la capa completamente conectada por el elemento de datos de entrada por elemento.

A continuación se muestra toda la clase de Atención, que implementa un mecanismo de auto atención un poco más complejo, que se puede utilizar como un nivel completo en el modelo; la clase hereda la clase de capa Keras.

 # Attention class Attention(Layer): def __init__(self, step_dim, W_regularizer=None, b_regularizer=None, W_constraint=None, b_constraint=None, bias=True, **kwargs): self.supports_masking = True self.init = initializers.get('glorot_uniform') self.W_regularizer = regularizers.get(W_regularizer) self.b_regularizer = regularizers.get(b_regularizer) self.W_constraint = constraints.get(W_constraint) self.b_constraint = constraints.get(b_constraint) self.bias = bias self.step_dim = step_dim self.features_dim = 0 super(Attention, self).__init__(**kwargs) def build(self, input_shape): assert len(input_shape) == 3 self.W = self.add_weight((input_shape[-1],), initializer=self.init, name='{}_W'.format(self.name), regularizer=self.W_regularizer, constraint=self.W_constraint) self.features_dim = input_shape[-1] if self.bias: self.b = self.add_weight((input_shape[1],), initializer='zero', name='{}_b'.format(self.name), regularizer=self.b_regularizer, constraint=self.b_constraint) else: self.b = None self.built = True def compute_mask(self, input, input_mask=None): return None def call(self, x, mask=None): features_dim = self.features_dim step_dim = self.step_dim eij = K.reshape(K.dot(K.reshape(x, (-1, features_dim)), K.reshape(self.W, (features_dim, 1))), (-1, step_dim)) if self.bias: eij += self.b eij = K.tanh(eij) a = K.exp(eij) if mask is not None: a *= K.cast(mask, K.floatx()) a /= K.cast(K.sum(a, axis=1, keepdims=True) + K.epsilon(), K.floatx()) a = K.expand_dims(a) weighted_input = x * a return K.sum(weighted_input, axis=1) def compute_output_shape(self, input_shape): return input_shape[0], self.features_dim 

Aquí vemos más o menos lo mismo que se implementó anteriormente a través de una capa Keras totalmente conectada, solo realizada a través de una lógica más profunda en un nivel inferior. Se crea un nivel paramétrico (self.W) en la función, que luego se multiplica escalar (K.dot) por el vector de entrada. La lógica cableada en esta variante es un poco más complicada: desplazamiento (si se revela el parámetro de sesgo), tangente hiperbólica, exposición, máscara (si se especifica), la normalización se aplica al vector de entrada multiplicado por uno mismo. W, entonces el vector de entrada se vuelve a ponderar por El resultado obtenido. No tengo una descripción de la lógica establecida en este ejemplo; reproduzco las operaciones de lectura del código. Por cierto, escriba los comentarios si reconoce algún tipo de función matemática de alto nivel en esta lógica.

La clase tiene un parámetro "sesgo", es decir sesgo Si el parámetro está activado, luego de aplicar la capa Densa, el vector final se agregará al vector de los parámetros de la capa "self.b", lo que hará posible no solo determinar los "pesos" para nuestra función de atención, sino también cambiar el nivel de atención en un número. Ejemplo de vida: tenemos miedo a los fantasmas, pero nunca los hemos conocido. Por lo tanto, hacemos una corrección por miedo -100 puntos. Es decir, solo si el miedo se sale de la escala por 100 puntos, tomaremos decisiones sobre la protección contra los fantasmas, llamando a una agencia de caza fantasmas, comprando dispositivos repelentes, etc.

Conclusión


El mecanismo de atención tiene variaciones. La opción de Atención más simple implementada en la clase anterior se llama Auto-Atención. La auto atención es un mecanismo diseñado para procesar datos secuenciales, teniendo en cuenta el contexto de cada marca de tiempo. Se usa con mayor frecuencia para trabajar con información textual. La implementación de la auto-atención se puede sacar de la caja importando la biblioteca keras-self-atención. Hay otras variaciones de atención. Al estudiar materiales en inglés, fue posible contar más de 5 variaciones.

Al escribir incluso este artículo relativamente corto, estudié más de 10 artículos en inglés. Por supuesto, no pude descargar todos los datos de todos estos artículos en 5 páginas, solo hice un apretón para crear una "guía para tontos". Para comprender todos los matices del mecanismo de Atención, necesita un libro de páginas 150-200. Realmente espero haber podido revelar la esencia básica de este mecanismo para que aquellos que recién comienzan a entender el aprendizaje automático entiendan cómo funciona todo esto.

Fuentes


  1. Mecanismo de atención en redes neuronales con Keras
  2. Atención en redes profundas con Keras
  3. Secuencia a secuencia basada en la atención en Keras
  4. Clasificación de texto usando el mecanismo de atención en Keras
  5. Atención generalizada: redes neuronales convolucionales 2D para la predicción de secuencia a secuencia
  6. ¿Cómo implementar la capa de atención en Keras?
  7. Atencion Atencion
  8. Traducción automática neuronal con atención

Source: https://habr.com/ru/post/458992/


All Articles