Como ajudei Alice a não responder a outros nomes. Estágio Yandex

Oi Habr. Meu nome é Aleksey Rak, sou desenvolvedor da assistente de voz Alice no escritório de Yandex em Minsk. Eu consegui essa posição indo para a mesma equipe para um estágio de três meses no ano passado. Eu vou falar sobre ela. Se você quiser tentar você mesmo, aqui está um link para o estágio de 2019 .



Como eu me acomodei


Sou estudante do 4º ano da BSU, em 2018 me formei na Escola de Análise de Dados, vivo e moro em Minsk.

Primeiro, eu, como outros graduados da SHAD, recebi um link para um estágio em 2018. Dentro de uma semana após o envio do questionário, era necessário alocar tempo, 6 horas seguidas, para concluir o concurso on-line. Continha tarefas sobre a teoria das probabilidades, a capacidade de codificar e criar algoritmos. Foi possível escrever o código no idioma em que você sabe. Escrevi várias tarefas em C ++, várias em Python, escolhi a linguagem dependendo da facilidade de uso para uma tarefa específica.

Quando você envia uma decisão, um veredicto chega imediatamente, após o qual a tarefa pode ser resolvida novamente para obter uma resposta mais correta. Demorei algumas horas para concluir todas as tarefas. Não resolvi alguns dos problemas na primeira tentativa.

Alguns dias depois, os recrutadores entraram em contato comigo e pediram uma primeira entrevista presencial no escritório de Minsk. Foi com Alexei Kolesov - o chefe da equipe de modelos acústicos e biométricos, onde eu tive que trabalhar. A entrevista consistiu em resolver problemas em um pedaço de papel ou em um quadro negro e responder a perguntas sobre teoria das probabilidades, algoritmos e aprendizado de máquina. Penso que os antecedentes da programação da Olimpíada me permitiriam lidar com o concurso online, mesmo que eu não tivesse estudado no ShAD, mas na entrevista, a experiência do ShAD foi realmente útil para mim.

Alguns dias depois, ocorreu a segunda reunião, onde me pediram mais duas tarefas sobre o conhecimento de algoritmos: aquecimento e básico. Em cada tarefa, era assim: propus uma solução, respondi a várias perguntas sobre essa solução e depois escrevi o código em um pedaço de papel.

Alguns dias depois, fui informado de que havia sido aceito para um estágio. Ela deveria durar três meses completos (como resultado, aconteceu). Eles não prometeram mudar para uma posição permanente, mas disseram que essa opção é possível.

Introdução


No primeiro dia, tendo resolvido as questões organizacionais e adquirido um laptop, fui almoçar com meus colegas. Conversamos, então montei um repositório de equipe e assumi a primeira tarefa - compilando um script Python simples para começar a executar um programa já concluído em vários threads e, assim, acelerar sua execução. No processo de criação do script, eu me familiarizei com o sistema de revisão de código - quando outros funcionários da equipe verificam seu código. Sabendo que seus colegas mais próximos irão lidar com ele primeiro e, no futuro, com outros desenvolvedores, você tenta escrever com mais clareza. Na programação das olimpíadas, tudo é um pouco diferente: a velocidade com a qual você programa é importante e, provavelmente, você nem precisará olhar o que escreveu. Por outro lado, quando tive que enfrentar uma situação antes do Yandex de que ainda precisava ler o código, também tentei torná-lo mais ou menos claro.

Durante o estágio, resolvi várias vezes problemas semelhantes a esse script, mas meu tempo principal foi gasto em um projeto muito maior - um novo decodificador para a observadora Alice.

Para dispositivos e aplicativos Yandex em que o assistente pode ser chamado por voz, tudo funciona como o usuário espera, você precisa de um observador de alta qualidade - um mecanismo de ativação por voz. Na maioria das vezes, a frase de ativação (que você precisa pronunciar para iniciar Alice) contém a palavra "Alice".

O Spotter inclui a preparação de recursos (recursos para aprendizado de máquina), uma rede neural e um decodificador.

Decodificador anterior


A versão anterior do decodificador trabalhava processando vetores de probabilidade. Existe um modelo acústico - uma rede neural, que para cada quadro (um fragmento de fala com duração de 10 a 20 milissegundos) retorna a probabilidade de que agora ele foi pronunciado. Os quadros podem se sobrepor. O decodificador continha uma matriz com probabilidades para os últimos 100 quadros "ouvidos" pelo dispositivo. O som de cada letra corresponde a um certo vetor de probabilidades. No vetor da letra A, o algoritmo encontrou o elemento com a maior probabilidade, após o qual considerou apenas a parte direita da matriz em relação a esse elemento. Em seguida, a operação foi repetida para as letras L, I, C e A - cada vez que a matriz era "cortada" pelo elemento encontrado. Os sons de A no início e no final da palavra são realmente diferentes - o segundo deles é geralmente chamado Shva, parece A, E e O ao mesmo tempo.

Se a probabilidade final for maior que o valor limite, o algoritmo considerou que a palavra foi realmente falada e ativou Alice para o usuário.



Esse esquema levou ao fato de que o assistente às vezes ligava espontaneamente não apenas quando as pessoas diziam "Alice", mas também quando ouvia outras palavras, por exemplo, "Alexander". Os sons na primeira parte desta palavra ("Alex") seguem na mesma ordem e basicamente coincidem com os sons da palavra "Alice". A diferença está apenas nas letras E e K, mas E em seu som está muito próximo de I, e o algoritmo não levou em consideração a presença da letra K.



Em teoria, você pode pesquisar no discurso proferido não apenas a palavra "Alice", mas também palavras semelhantes. Não existem muitos deles: "Alexander", "Alexa", "preso", "escada", "aristarco". Se o algoritmo acreditasse que o usuário com alta probabilidade dissesse um deles, seria possível proibir a ativação, independentemente do resultado do decodificador principal.

No entanto, a ativação por voz deve funcionar mesmo sem a Internet. Portanto, o decodificador é um mecanismo local. Ele funciona graças a uma rede neural, que sempre é executada diretamente no dispositivo do usuário (por exemplo, no telefone), sem se comunicar com os servidores Yandex. E como tudo acontece localmente, o desempenho (do mesmo telefone em comparação com todo o data center) deixa muito a desejar. Reconhecer não apenas a palavra "Alice" significaria complicar significativamente o trabalho dessa pequena rede neural e exceder os limites de desempenho. A ativação começaria a funcionar mais lentamente, o assistente responderia com um longo atraso.

Era necessário um decodificador fundamentalmente diferente. Os colegas sugeriram que eu implementasse a ideia do Modelo Markov Oculto, HMM: no início do meu estágio, ele já era bem descrito pela comunidade e também encontrou aplicação no assistente Alexa da Amazon.

Novo decodificador HMM


O decodificador HMM constrói um gráfico de 6 vértices: um para cada som na palavra "Alice", mais um para todos os outros sons - outro discurso ou ruído. As probabilidades de transições entre vértices são estimadas em uma amostra de fala gravada e anotada. Para cada som ouvido, são consideradas 6 probabilidades: coincidir com cada uma das cinco letras e com o sexto vértice (ou seja, com qualquer som que não seja o encontrado na palavra "Alice"). Se o usuário disser "Alexander", o decodificador cairá em K: a probabilidade de o som falado não fazer parte da frase de ativação será muito grande e o assistente não funcionará.



Em um futuro próximo, essas alterações estarão disponíveis para todos os usuários da biblioteca Alice e SpeechKit.

Conclusão do estágio e transição para um emprego permanente


Dos três meses de estágio, levei um ano e meio para escrever um decodificador HMM. No final desses meses e meio, o gerente me disse que a transição para uma posição permanente e um contrato perpétuo seria possível (embora não garantida) se eu continuasse trabalhando de maneira produtiva. Na mesma época, tirei férias de duas semanas para ir ao campo de programação da Olimpíada. Quando voltei, iniciei uma nova tarefa - treinando observadores para vários dispositivos: Yandex.Phone, computador de bordo com o Yandex.Auto e outros.

Depois de algumas semanas, cerca de um mês antes do final do estágio, minha primeira entrevista foi realizada sobre uma posição permanente e, alguns dias depois - a segunda, final. Conversei com os líderes de equipes relacionadas. Na primeira entrevista, foram feitas perguntas teóricas: sobre aprendizado de máquina, redes neurais, regressão logística, métodos de otimização. Além disso, eles perguntaram sobre a regularização, isto é, sobre a redução do grau de reciclagem de um determinado algoritmo e sobre quais algoritmos os quais métodos de regularização são aplicados. A segunda entrevista foi prática: conversamos no Skype com um colega de Moscou e, no processo, digitei o código em um simples editor online.

Por minha própria iniciativa, não consegui um emprego em período integral, mas em "- o fato é que meus estudos na BSU ainda não terminaram. Em uma posição constante, também estou envolvido na seleção automática de valores-limite e outros hiperparâmetros. A todo momento, o sistema ganha a probabilidade de a palavra-chave "Alice" ter sido pronunciada. O classificador final compara essa probabilidade com um valor limite e, se o limite for superado, ativa Alice. Anteriormente, o limite era selecionado pelos desenvolvedores, a tarefa atual é aprender como fazer isso automaticamente.

Então cheguei ao Yandex, mantendo meu lugar no time de Alice.

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


All Articles