Costumamos falar sobre tecnologias e bibliotecas que se originaram e se formaram no Yandex. De fato, pelo menos aplicamos e desenvolvemos soluções de terceiros.
Hoje vou contar à comunidade Habr sobre um desses exemplos. Você aprenderá por que ensinamos a rede neural BERT a encontrar erros de digitação nas manchetes das notícias e não utilizou o modelo pronto, por que você não pode executar e executar o BERT em várias placas de vídeo e como usamos o recurso principal dessa tecnologia - o mecanismo de atenção.

Desafio
O Yandex.News é um serviço que coleta notícias de publicações conectadas a nós. Esta não é apenas a notícia de mídia mais lida e citada na página principal, mas também seções
temáticas ou até seleções pessoais de todas as publicações. De qualquer forma, são milhares de sites e milhões de títulos, dos quais a máquina deve formar uma seleção a cada poucos minutos.
É a máquina, porque nunca intervimos na foto do dia: não adicionamos notícias lá manualmente, não as removemos de lá (não importa o quanto gostaríamos), não editamos as manchetes. Em torno disso já foram quebradas muitas cópias. Uma abordagem totalmente algorítmica tem prós e contras. Algo que podemos melhorar com a tecnologia, algo que não. Mesmo se houver erros ortográficos ou erros de digitação nos títulos, não os corrigimos. Adicionamos os favicons das publicações às manchetes, para que fique claro de onde vêm as notícias. Em parte, isso ajudou, mas não chegamos a um acordo com os erros e começamos a procurar uma maneira de nos livrar deles sem fazer alterações no texto.
Se for impossível corrigir o erro, você poderá treinar a máquina para encontrar cabeçalhos que, devido a erros, não são adequados para a parte superior. Além disso, a Yandex se especializou em morfologia russa desde o momento em que o nome ainda não havia sido inventado. Parece que adotamos uma rede neural - e o ponto está no chapéu.
As ferramentas
A Yandex possui a tecnologia
Speller para encontrar e corrigir erros. Graças à
biblioteca de aprendizado de máquina
CatBoost, o Speller pode descriptografar palavras irreconhecíveis ("adjetivos" → "colegas de classe") e levar em conta o contexto ao pesquisar erros de digitação ("falta de música" → "baixar música"). Pode parecer que Speller é ideal para a nossa tarefa, mas não.
O verificador ortográfico (conhecido internamente como responsável pela pesquisa) já está aprimorado no nível da arquitetura para resolver uma tarefa completamente diferente: ajudar os usuários a restaurar o formulário de solicitação correto. Na Pesquisa, não é tão importante se o caso está selecionado corretamente, se há uma letra maiúscula ou uma vírgula. Lá, é mais importante para a consulta de pesquisa "Haminguel" supor que a pessoa tinha em mente Hemingway.
Os erros nas manchetes são cometidos por pessoas relativamente alfabetizadas que dificilmente escreverão Haminguel. Mas a aprovação incorreta ("o voo atrasou"), falta de palavras ("o jovem experimentou o carro") e letras maiúsculas extras ("Presidente do Banco") são comuns. Finalmente, há uma frase formalmente correta: "Repararei a Gorky Street em Pskov", à qual um guardião normal não se apega (bem, e se isso for uma promessa do autor?), Mas essa é obviamente uma manchete de notícias mimada. Além disso, no News, a tarefa não era a mesma da Pesquisa: não para corrigir erros de digitação e erros, mas para detectá-los.
Tínhamos outras opções, por exemplo, modelos baseados no DSSM (se interessante, falamos brevemente sobre essa abordagem em um post sobre
o algoritmo de Palekh ), mas eles também tiveram limitações. Por exemplo, a ordem das palavras não foi perfeitamente levada em consideração.
Em geral, as ferramentas prontas ou não eram adequadas para a nossa tarefa ou eram limitadas. Então, você precisa criar o seu próprio - para treinar seu modelo. E esse foi um bom motivo para trabalhar com a tecnologia BERT, que ficou disponível para os desenvolvedores em 2018 e mostrou resultados impressionantes.
Apresentando o BERT
O principal problema dos problemas modernos de processamento de linguagem natural (PNL) é encontrar exemplos suficientes marcados por pessoas para treinar uma rede neural. Se você precisar de um crescimento de qualidade, a amostra de treinamento deve ser muito grande - milhões e bilhões de exemplos. Ao mesmo tempo, há muitas tarefas na PNL e todas são diferentes. A coleta de dados em volumes semelhantes para cada tarefa é longa, cara e muitas vezes impossível. Mesmo para as maiores empresas do mundo.
Mas há uma opção para contornar esse problema - com a ajuda do treinamento em duas etapas. Inicialmente, a rede neural recebe uma estrutura de linguagem por um tempo longo e caro em um enorme corpo de bilhões de palavras (isso é pré-treinamento). Em seguida, a rede é alterada de maneira rápida e barata para uma tarefa específica - por exemplo, dividir as análises em boas e ruins (isso é ajuste fino). Chega de cerca de 10 mil exemplos marcados em
Tolok .
A tecnologia BERT (Representações do codificador bidirecional dos transformadores) é baseada nessa idéia. A ideia em si não é nova e já foi aplicada antes, mas há uma diferença significativa. Transformer é uma arquitetura de rede neural que permite que você leve em consideração todo o contexto de uma só vez, incluindo o outro extremo da frase e a rotatividade de particulados em algum lugar no meio. E essa é a diferença das arquiteturas da moda anteriores, que levaram em conta o contexto. Por exemplo, em uma rede neural LSTM, o comprimento do contexto é no máximo dezenas de palavras, e aqui todas as 200.
No
GitHub , o código fonte do TensorFlow e até um modelo universal pré-treinado em 102 idiomas estão disponíveis, do russo ao volapyuk. Pegue, ao que parece, a solução pronta para uso - e obtenha o resultado imediatamente. Mas não.
Descobriu-se que o modelo universal em textos russos mostrava significativamente menos qualidade que o modelo em inglês, quebrando recordes em textos em inglês (o que, como você vê, é lógico). Nos textos em russo, ela perdeu para nossos modelos internos no DSSM.
Ok, você pode se pré-educar - felizmente, o Yandex tem textos e experiência em russo suficientes em aprendizado de máquina. Mas há uma nuance. Demora um ano para aprender!
O fato é que o BERT é voltado para processadores de tensores (TPUs) do Google; portanto, pronto para uso, ele pode funcionar com apenas uma placa de vídeo (GPU). E é impossível paralelizar a testa com qualquer
horovod : transferir 400 megabytes de dados de um cartão para outro a cada passo é muito caro, a paralelização se torna inútil. O que fazer
Otimização
Eles começaram a procurar idéias e soluções que pudessem acelerar significativamente o assunto. Antes de tudo, percebemos que cada número em nosso modelo ocupava 32 bits de memória (a flutuação padrão para números no computador). Parece ser pequeno, mas quando você tem 100 milhões de pesos, isso é crítico. Como não precisávamos de tanta precisão em todos os lugares, decidimos converter parcialmente os números para o formato de 16 bits (isso é chamado de treinamento de precisão mista).
Ao longo do caminho, com a ajuda de muitos arquivos e muletas, estragamos a compilação do XLA, contando com o
comprometimento ainda cru da NVIDIA. Graças a isso, nossas placas NVIDIA Tesla V100 (um pequeno servidor delas fica como um apartamento em uma área barata de Moscou) foram capazes de revelar completamente seu potencial devido à aritmética de 16 bits nos núcleos tensores.
Estávamos interessados apenas nas manchetes em russo, mas o modelo multilíngue, que tomamos como base, foi treinado em centenas de idiomas, incluindo até um volapuk artificial. Palavras de todas as línguas traduzidas para o espaço vetorial foram armazenadas no modelo. Além disso, você não pode pegá-los e removê-los de lá - tive que suar para reduzir o tamanho do dicionário.
E mais uma coisa. Se você é um cientista e seu computador está embaixo da mesa, é possível reconfigurar tudo o que existe para cada tarefa específica. Mas em uma nuvem de computação real, onde milhares de máquinas são configuradas da mesma maneira, é bastante problemático, por exemplo, reconstruir o kernel para cada novo recurso do TensorFlow. Portanto, dedicamos muito esforço na coleta dessas versões de pacotes que todos os chips novos podem executar, e não exigem atualização e reconfiguração radicais das placas de vídeo na nuvem.
Em geral, espremiam todos os sucos sempre que podiam. E nós fizemos isso. O ano se transformou em uma semana.
Treinamento
Construir o conjunto de dados correto geralmente é a parte mais difícil do trabalho. Primeiro, aprendemos o classificador em três milhões de títulos marcados com tolokers. Parece ser muito, mas apenas 30 mil deles - com erros de digitação. Onde obter mais exemplos?
Decidimos ver quais títulos a própria mídia estava correta. Existem mais de 2 milhões na história da Yandex.News. Bingo! Embora fosse muito cedo para se alegrar.
Aconteceu que muitas vezes a mídia refaz as manchetes não por causa de erros. Novos detalhes vieram à tona - e o editor substituiu uma redação correta por outra. Portanto, nos limitamos a correções com uma diferença entre versões de até três letras (embora ainda houvesse algum ruído aqui: foi "encontrado duas" - tornou-se "encontrado três"). Então, marcamos um milhão de erros de digitação. Estudamos primeiro nesta grande seleção com ruído e, depois, em uma pequena marcação de tolker sem ruído.
Qualidade
Em tais tarefas, é habitual medir a precisão e a integridade. No nosso caso, precisão é a proporção de veredictos corretos entre todos os veredictos sobre um erro no cabeçalho. Completude - a proporção de cabeçalhos de erro que capturamos entre todos os cabeçalhos de erro. Tanto isso como outro no mundo ideal devem aspirar a 100%. Mas nas tarefas de aprendizado de máquina, esses indicadores tendem a entrar em conflito. Ou seja, quanto mais distorcemos a precisão, mais a integridade cai. E vice-versa.
Em nossa abordagem anterior baseada no DSSM, já alcançamos 95% de precisão (ou seja, 5% de veredictos falsos positivos). Este já é um indicador bastante alto. Portanto, decidimos manter o mesmo nível de precisão e ver como a integridade muda com o novo modelo. E ela saltou de 21 para 78%. E é definitivamente um sucesso.
Aqui seria possível acabar com isso, mas lembro-me da promessa de falar sobre atenção.
Rede neural com caneta de feltro
É geralmente aceito que uma rede neural é uma caixa preta. Alimentamos algo na entrada e obtemos algo na saída. Por que e como é um mistério.
Essa limitação tem como objetivo contornar redes neurais interpretadas. O BERT é um deles. Sua interpretabilidade reside no mecanismo de atenção. Grosso modo, em cada camada da rede neural repetimos a mesma técnica: olhamos para as palavras vizinhas com “atenção” diferente e levamos em conta a interação com elas. Por exemplo, quando uma rede neural processa o pronome "ele", "olha atentamente" para o substantivo ao qual "ele" se refere.
A figura abaixo mostra em diferentes tons de vermelho quais palavras o token “olha”, o que acumula informações sobre o título inteiro da camada final do classificador. Se um erro de digitação na palavra - atenção o destaca, se as palavras forem inconsistentes -, então ambas (e, possivelmente, dependem delas).

Nesse lugar, a propósito, pode-se discernir todo o potencial das redes neurais. Em nenhum estágio do treinamento, nosso modelo sabe exatamente onde está localizado o erro de digitação no exemplo: ele sabe apenas que todo o título está incorreto. E ainda assim ela aprende que “uma escola para 1224 vagas” é incorreta ao escrever por causa de um número inconsistente e destaca especificamente o número 4.
Não paramos com erros de digitação e começamos a aplicar uma nova abordagem não apenas para procurar erros, mas também para identificar cabeçalhos obsoletos. Mas esta é uma história completamente diferente com a qual esperamos retornar a Habr em um futuro próximo.
Links úteis para quem deseja se aprofundar no tópico