Resolução de problemas com o “concurso global AI AI Challenger”

Experiência de participação em competição de visão computacional hospedada pela plataforma chinesa de ciência de dados AI Challenger

Ilya Boytsov Blocked Unblock Seguir Seguindo 31 de dezembro

Neste artigo, compartilharei minha experiência na solução de um problema de classificação de vídeo em uma competição chinesa de aprendizado de máquina.

Existem muitas plataformas de dados científicos para os concorrentes. Nós costumávamos pensar em Kaggle – o mais popular. De qualquer forma, há uma série de outras plataformas que fornecem aos cientistas de dados tarefas desafiadoras, e é um bom momento para explorá-las. É por isso que eu e meu colega de equipe Alexey Grigorev participaram da competição chinesa de classificação em tempo real AI Challenger. Muito obrigado ao grande mestre Kaggle, Artur Kuzin, que se tornou nosso mentor nesta competição. Ele estava nos ajudando com idéias criativas e nos forneceu um servidor de GPU.

Descrição da competição

O conjunto de dados de vídeos tinha cerca de 2 TB de tamanho e foi dividido em conjuntos de treinamento e validação. Havia dois conjuntos de testes: teste A e teste B. Os vídeos podiam ter de 1 a 3 rótulos cada, então era uma classificação multi-rótulo. Por exemplo, abaixo está um quadro de um vídeo que tem duas classes: piano e bebê

E aqui está uma lista completa de possíveis tags:

Esta competição teve uma métrica complexa para avaliação. Além disso, a restrição de tempo de precisão foi adicionada como uma métrica de avaliação. Você pode pensar nisso como o tempo total de entrada de um único vídeo para gerar uma única previsão.

Finalmente, levando em conta essas duas fórmulas, a métrica composta foi calculada como a distância ponderada entre os resultados enviados e o ponto de referência. Você pode ler mais sobre essa métrica aqui .

A idéia principal é que os organizadores queriam da comunidade de ciência de dados um aplicativo de alta velocidade que pudesse ser usado na indústria. Para as propostas, os competidores tinham que carregar o pacote docker de imagens.

Treinamento de rede neural

Usamos uma mistura de redes neurais e modelos mais simples para criar um conjunto de previsões finais. Nós tentamos arquiteturas diferentes para redes. O melhor resultado foi com o se_resnet50. O bloco “Squeeze and Excitation” melhora a qualidade ou o modelo de resnet com o mínimo custo computacional. Você pode ler mais sobre essa arquitetura nesta publicação . Como linha de base para treinar o modelo, começamos a extrair o primeiro quadro. A taxa de aprendizagem foi de 0,001 e decaída de 10 a cada 30 épocas. O número total de épocas foi de 150. Como um otimizador, a descida de gradiente estocástica com decaimento de peso e momento foi usada para convergência mais rápida. Curiosamente, apesar do fato de termos problemas com vários rótulos e várias classes, obtivemos resultados ruins com o BCE com a perda de tráfego. Em vez disso, usamos a perda de entropia cruzada, que melhorou a precisão de longe. A razão para o hiato de qualidade pode ser a falta de exemplos de vários rótulos nos dados. Passamos algum tempo pensando em como prever vários rótulos. Por exemplo, treinamos um classificador binário para prever se um exemplo possui um ou mais rótulos. Mais um problema era com limites para classes. Analisamos a distribuição de classes e calculamos os pesos para as classes. A ideia era adicionar algum coeficiente para pesar se um classificador binário previsse que um exemplo tem mais de um rótulo. Nesse caso, poderíamos alcançar os limites para algumas classes que anteriormente não considerávamos.

De qualquer forma, não usamos limites para classes porque, de acordo com a métrica, entendemos que, dado um exemplo com mais de um rótulo, é melhor prever apenas um deles em vez de prever um redundante. Ainda há muito espaço para experimentar esses métodos para tornar mais estáveis os modelos de predição de múltiplas classes.

Tentando algoritmos ML clássicos para agrupar

A outra parte da solução é que estávamos extraindo recursos das redes neurais após o pool global e usamos esses recursos como uma entrada para classificadores mais simples, como aumento de gradiente, regressão logística e máquina de vetor de suporte. O conjunto final consistia nos quatro melhores modelos individuais (rede neural, log reg, SVM, catboost) combinados com um classificador de votação majoritária. Este modelo nos deu 0.76 no teste A, mas infelizmente não foi o suficiente para progredir.

Agregando quadros de vídeo e enfrentando novos problemas

O próximo passo foi adicionar agregação ao treinamento da rede neural. Agora extraímos cinco quadros aleatórios de cada vídeo e usamos o rótulo mais frequente como uma única previsão. Fizemos o mesmo para extrair novas funcionalidades para modelos clássicos, funcionou muito bem e conseguimos 0.91 na validação. Ficamos felizes com esses resultados. Uma semana antes do prazo decidimos enviá-lo, mas agora enfrentamos um problema com o tempo. Os modelos eram rápidos, mas de acordo com as regras, o tempo para o pré-processamento de vídeo também precisava ser considerado. Notamos que leva de 0,03 a 0,05ms para extrair um quadro. Infelizmente, isso não nos permitiu comparar as restrições de envio.

Então decidimos treinar o modelo com agregação, mas predizemos um quadro aleatório. Isso funcionou um pouco melhor que nosso modelo anterior sem qualquer agregação. A pontuação foi de 0,81 na validação e 0,79 no teste A com tempo de aproximadamente 0,11ms para uma única previsão. Tivemos uma ideia para decodificar vídeos na GPU para acelerar o processo, mas não tivemos tempo suficiente para gerenciar como fazer isso com o docker. É assim que o nosso pipeline se parece:

Atmosfera de competição

Deixe-me adicionar algumas palavras sobre a organização da concorrência. O AIChallenger finge ser uma plataforma global de ciência de dados, mas tem muito trabalho antes de chegar lá. Enfrentamos problemas técnicos ao participar, principalmente com o envio do docker. Este Desafio foi organizado pela empresa MeiTu (??). Por exemplo, a competição começou em 3 de setembro, mas as informações sobre as instruções do docker apareceram no site somente até o dia 12 de outubro. Todas as instruções estavam no idioma chinês. Nós acidentalmente ficamos sabendo que os organizadores estavam ajudando os participantes no mensageiro chinês WeChat, mas também em chinês e não ajudaram os concorrentes estrangeiros. O engraçado é que até o botão de envio estava em chinês. Certa vez, escrevemos um comentário no fórum para encorajar os organizadores a resolver problemas técnicos, mas ajudou apenas parcialmente. No futuro, espero ver um melhor nível de organização e suporte técnico.

Observações conclusivas

É assim que a competição terminou para nós. Apesar do fato de não termos conseguido apresentar nosso melhor modelo, valeu a pena tentar. Entendemos como resolver essa classe de problemas de aprendizado de máquina. Além disso, depois de quase 3 meses trabalhando neste projeto, agora temos um bom pipeline que você pode encontrar no github aqui .

No entanto, uma boa tendência é que as regras de competição forçada desafiam o pensamento de projetar um algoritmo para uso em produção. Então, além de modelagem, ajudou a melhorar as habilidades de otimização de código e a criação de um pipeline reutilizável. Por fim, gostaria de encorajar todos a explorar novas plataformas de ciência de dados e continuar participando de competições para melhorar esses desafios.