Atenção para manequins e implementação em Keras

Sobre artigos sobre inteligência artificial em russo


Apesar do mecanismo de atenção estar descrito na literatura inglesa, ainda não vi uma descrição decente dessa tecnologia no setor de língua russa. Existem muitos artigos sobre Inteligência Artificial (IA) em nosso idioma. No entanto, os artigos encontrados revelam apenas os modelos mais simples de IA, por exemplo, redes de convolução, redes generativas. No entanto, de acordo com os mais recentes desenvolvimentos de ponta no campo da IA, existem muito poucos artigos no setor de língua russa.

A falta de artigos em russo sobre os últimos desenvolvimentos se tornou um problema para mim quando entrei no tópico, estudei o estado atual das coisas no campo da IA. Eu sei inglês bem, leio artigos em inglês sobre tópicos de IA. No entanto, quando um novo conceito ou um novo princípio de IA sai, seu entendimento em uma língua estrangeira é doloroso e longo. Saber inglês, penetrar em um objeto não-nativo em um objeto complexo ainda vale muito mais tempo e esforço. Depois de ler a descrição, você se pergunta: quantos por cento você entende? Se houvesse um artigo em russo, eu entenderia 100% após a primeira leitura. Isso aconteceu com redes generativas, para as quais há uma excelente série de artigos: depois de ler tudo ficou claro. Mas no mundo das redes, existem muitas abordagens descritas apenas em inglês e que precisavam ser tratadas por dias.

Escreverei periodicamente artigos em meu idioma nativo, trazendo conhecimento para o nosso campo de idioma. Como você sabe, a melhor maneira de entender um tópico é explicá-lo a alguém. Então, quem mais, além de eu, deveria começar uma série de artigos sobre a IA de arquitetura mais moderna, complexa e avançada. No final do artigo, eu mesmo entenderei uma abordagem 100%, e será útil para alguém que lê e melhora sua compreensão (a propósito, eu amo Gesser, mas melhor ** Blanche de bruxelles **).

Quando você entende o assunto, existem 4 níveis de entendimento:

  1. você entende o princípio e as entradas e saídas do algoritmo / nível
  2. você entende as saídas de coleta e, em termos gerais, como funciona
  3. você entende tudo o que foi dito acima, bem como o dispositivo de cada nível de rede (por exemplo, no modelo VAE, você entendeu o princípio e também a essência do truque de reparameterização)
  4. Entendi tudo, incluindo todos os níveis, também entendi por que tudo aprende e, ao mesmo tempo, sou capaz de selecionar hiper parâmetros para minha tarefa, em vez de copiar e colar soluções prontas.

Para novas arquiteturas, a transição do nível 1 para o nível 4 é muitas vezes difícil: os autores enfatizam que estão mais próximos descrevendo superficialmente vários detalhes importantes (eles os entenderam?). Ou seu cérebro não contém nenhuma construção, portanto, mesmo depois de ler a descrição, ele não decifrou e não se transformou em habilidades. Isso acontece se durante os anos de estudante você dormiu na mesma lição de matemática, depois de uma festa noturna, onde deu o tapete certo. aparelho. E aqui precisamos de artigos em nossa língua nativa que revelem as nuances e sutilezas de cada operação.

Atenção conceito e aplicação


O exposto acima é um cenário de níveis de entendimento. Para analisar Atenção, vamos começar no nível um. Antes de descrever as entradas e saídas, analisaremos a essência: em que conceitos básicos, compreensíveis até para uma criança, esse conceito se baseia. No artigo, usaremos o termo em inglês Atenção, pois, neste formulário, também é uma chamada para a função de biblioteca Keras (não é implementada diretamente nela, é necessário um módulo adicional, mas mais sobre isso abaixo). Para ler mais, você deve entender as bibliotecas Keras e python, porque o código-fonte será fornecido.

Atenção traduz do inglês como "atenção". Esse termo descreve corretamente a essência da abordagem: se você é motorista e o general da polícia de trânsito é mostrado na foto, você atribui importância a ela de forma intuitiva, independentemente do contexto da foto. É provável que você dê uma olhada mais de perto no general. Você força os olhos, olha atentamente as tiras dos ombros: quantas estrelas ele tem lá especificamente. Se o general não for muito alto, ignore-o. Caso contrário, considere-o como um fator-chave na tomada de decisões. É assim que nosso cérebro funciona. Na cultura russa, fomos treinados por gerações para prestar atenção a altos escalões; nosso cérebro automaticamente atribui alta prioridade a esses objetos.

Atenção é uma maneira de informar à rede o que você deve prestar mais atenção, ou seja, relatar a probabilidade de um resultado específico, dependendo do estado dos neurônios e dos dados de entrada. A camada de atenção implementada no próprio Keras identifica fatores com base no conjunto de treinamento, cuja atenção reduz o erro de rede. A identificação de fatores importantes é realizada através do método de propagação reversa de erros, semelhante à maneira como isso é feito para redes de convolução.

No treinamento, a Atenção demonstra sua natureza probabilística. O mecanismo em si forma uma matriz de escalas de importância. Se não tivéssemos treinado a Atenção, poderíamos ter dado importância, por exemplo, empiricamente (o general é mais importante que o alferes). Mas quando treinamos uma rede em dados, a importância se torna uma função da probabilidade de um resultado específico, dependendo dos dados recebidos na entrada da rede. Por exemplo, se encontrássemos um morador em geral na Rússia czarista, a probabilidade de conseguir manoplas seria alta. Tendo verificado isso, seria possível através de várias reuniões pessoais, coletando estatísticas. Depois disso, nosso cérebro colocará o peso apropriado no fato de conhecer esse assunto e colocará marcadores nas tiras e listras nos ombros. Deve-se notar que o marcador definido não é provável: agora a reunião do general acarretará consequências completamente diferentes para você do que então; além disso, o peso pode ser mais do que um. Mas, o peso pode ser reduzido à probabilidade normalizando-o.

A natureza probabilística do mecanismo Atenção na aprendizagem se manifesta nas tarefas de tradução automática. Por exemplo, informe à rede que, ao traduzir do russo para o inglês, a palavra Amor é traduzida em 90% dos casos como Amor, em 9% dos casos como Sexo, em 1% dos casos. A rede marca imediatamente muitas opções, mostrando a melhor qualidade de treinamento. Ao traduzir, dizemos à rede: "ao traduzir a palavra amor, preste atenção especial à palavra inglesa Amor, veja também se ainda pode ser Sexo".

A abordagem Atenção é aplicada ao trabalho com texto, bem como a séries de sons e temporais. Para o processamento de texto, redes neurais recorrentes (RNN, LSTM, GRU) são amplamente utilizadas. A atenção pode complementá-los ou substituí-los, movendo a rede para arquiteturas mais simples e rápidas.

Um dos usos mais famosos do Attention é usá-lo para abandonar a rede de recorrências e mudar para um modelo totalmente conectado. As redes recorrentes têm uma série de deficiências: a incapacidade de fornecer treinamento sobre a GPU, reciclagem rápida. Usando o mecanismo Atenção, podemos construir uma rede capaz de aprender seqüências com base em uma rede totalmente conectada, treiná-la na GPU, usar droput.

A atenção é amplamente usada para melhorar o desempenho das redes de recorrência, por exemplo, no campo da tradução de um idioma para outro. Ao usar a abordagem de codificação / decodificação, que é frequentemente usada na IA moderna (por exemplo, auto-codificadores variacionais). Quando uma camada de atenção é adicionada entre o codificador e o decodificador, o resultado da operação de rede melhora visivelmente.

Neste artigo, não cito arquiteturas de rede específicas usando Atenção; este será o assunto de um trabalho separado. Uma lista de todos os usos possíveis da atenção vale um artigo separado.

Implementando Atenção em Keras Out of the Box


Quando você entende que tipo de abordagem, é muito útil aprender o princípio básico. Mas, muitas vezes, o entendimento completo ocorre apenas olhando para uma implementação técnica. Você vê os fluxos de dados que compõem a função da operação, fica claro o que exatamente é calculado. Mas primeiro você precisa executá-lo e escrever "Atenção, olá, palavra".

Atualmente, a atenção não é implementada no próprio Keras. Mas já existem implementações de terceiros, como o kera-atenção, que pode ser instalado com o github. Então seu código se tornará extremamente simples:

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

Esta implementação suporta a função de visualização da escala de atenção. Após treinar a Atenção, você pode obter uma sinalização matricial, que, de acordo com a rede, é especialmente importante sobre esse tipo (foto do github na página da biblioteca de atenção-keras).


Basicamente, você não precisa de mais nada: inclua esse código na sua rede como um dos níveis e aproveite para aprender sua rede. Qualquer rede, qualquer algoritmo é projetado nos primeiros estágios em um nível conceitual (como o banco de dados, a propósito), após o qual a implementação é especificada em uma representação lógica e física antes da implementação. Esse método de design ainda não foi desenvolvido para redes neurais (ah, sim, esse será o tópico do meu próximo artigo). Você não entende como as camadas de convolução funcionam por dentro? O princípio é descrito, você os usa.

Keras implementação de Atenção baixa


Para finalmente entender o tópico, analisaremos detalhadamente abaixo a implementação do Attention under the hood. O conceito é bom, mas como exatamente funciona e por que o resultado é obtido exatamente como indicado?

A implementação mais simples do mecanismo de atenção no Keras leva apenas 3 linhas:

 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' 

Nesse caso, a camada de entrada é declarada na primeira linha e, em seguida, vem uma camada totalmente conectada com a função de ativação softmax com o número de neurônios igual ao número de elementos na primeira camada. A terceira camada multiplica o resultado da camada totalmente conectada pelo elemento de dados de entrada por elemento.

Abaixo está toda a classe Attention, que implementa um mecanismo de auto-atenção um pouco mais complexo, que pode ser usado como um nível completo no modelo; a classe herda a classe da camada 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 

Aqui vemos aproximadamente a mesma coisa que foi implementada acima através de uma camada Keras totalmente conectada, realizada apenas através de uma lógica mais profunda em um nível inferior. Um nível paramétrico (self.W) é criado na função, que é multiplicada escalarmente (K.dot) pelo vetor de entrada. A lógica com fio dessa variante é um pouco mais complicada: deslocamento (se o parâmetro de viés é divulgado), tangente hiperbólica, exposição, máscara (se especificada), normalização são aplicadas ao vetor de entrada vezes self.W, então o vetor de entrada é ponderado novamente por o resultado obtido. Não tenho descrição da lógica estabelecida neste exemplo; reproduzo as operações de leitura do código. A propósito, escreva nos comentários se reconhecer algum tipo de função matemática de alto nível nessa lógica.

A classe possui um parâmetro "viés", isto é, preconceito. Se o parâmetro estiver ativado, depois de aplicar a camada Densa, o vetor final será adicionado ao vetor dos parâmetros da camada "self.b", o que permitirá não apenas determinar os "pesos" para a nossa função de atenção, mas também mudar o nível de atenção por um número. Exemplo de vida: temos medo de fantasmas, mas nunca os encontramos. Assim, fazemos uma correção para o medo -100 pontos. Ou seja, somente se o medo diminuir de 100 pontos, tomaremos decisões sobre a proteção contra fantasmas, ligando para uma agência de captura de fantasmas, comprando dispositivos repelentes etc.

Conclusão


O mecanismo de atenção possui variações. A opção mais simples de atenção implementada na classe acima é chamada de auto-atenção. A atenção pessoal é um mecanismo projetado para processar dados seqüenciais, levando em consideração o contexto de cada registro de data e hora. É usado com mais frequência para trabalhar com informações de texto. A implementação da atenção pessoal pode ser retirada da caixa importando a biblioteca de atenção pessoal do keras. Existem outras variações de atenção. Estudando materiais em inglês, foi possível contar mais de 5 variações.

Ao escrever este artigo relativamente curto, estudei mais de 10 artigos em inglês. Obviamente, não consegui baixar todos os dados de todos esses artigos em cinco páginas; fiz apenas um aperto para criar um "guia para manequins". Para entender todas as nuances do mecanismo Atenção, você precisa de um livro das páginas 150-200. Eu realmente espero que eu tenha sido capaz de revelar a essência básica desse mecanismo, para que aqueles que estão começando a entender o aprendizado de máquina entendam como tudo isso funciona.

Fontes


  1. Mecanismo de atenção em redes neurais com Keras
  2. Atenção em redes profundas com Keras
  3. Sequência-sequência-baseada na atenção em Keras
  4. Classificação de texto usando o mecanismo de atenção em Keras
  5. Atenção Pervasiva: Redes Neurais Convolucionais 2D para Previsão de Sequência a Sequência
  6. Como implementar a camada de atenção no Keras?
  7. Atenção? Atenção!
  8. Tradução automática neural com atenção

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


All Articles