Um guia rápido sobre o aprendizado de transferência e como aplicá-lo à sua rede neural

Exemplos de classificação de imagens e processamento de linguagem natural

Também disponível em espanhol | También disponible en español

Os grandes avanços recentemente alcançados no mundo do Deep Learning não poderiam ser explicados sem a união de vários fatores, como a evolução e a democratização das ferramentas de processamento, a introdução de novas plataformas e estruturas ou a chegada de várias técnicas para melhorar o desempenho neural. treinamento em rede. Mas em termos de eficácia ou precisão, encontramos um fator-chave que revolucionou os campos de Visão Computacional ou Processamento de Linguagem Natural. Neste artigo, explicarei o que é o Transfer Learning e alguns casos de uso.

Foto de Doug Linstedt no Unsplash

Nota: A maior parte do que digo aqui foi aprendida no curso Deep Learning for Coders, ministrado por Jeremy Howard, da Universidade de São Francisco.

Quando enfrentamos um problema que requer a aplicação do Machine Learning para sua resolução e optamos por usar uma rede neural profunda, como primeira tarefa, teremos que escolher a arquitetura mais apropriada para o nosso caso específico. Depois que essa decisão de projeto é tomada, enfrentamos o problema de inicializar seus parâmetros (pesos e viés) para cada camada em nossa rede. Até recentemente, o procedimento mais usual era inicializar aleatoriamente esses parâmetros dentro de um pequeno intervalo, para ajudar de alguma forma o algoritmo encarregado de ajustar esses valores no processo de treinamento. Como ponto de partida, não é ruim (sempre melhor do que inicializá-los para zero), mas sempre foi um assunto com espaço suficiente para melhorias.

Primeiro grande beneficiário: Visão Computacional

Imagine por um momento que estamos enfrentando um problema de classificação de imagens, tendo que diferenciar entre raças de gatos.

The Brady Bunch, versão gato

E se, em vez de inicializar aleatoriamente os parâmetros de nossa rede, começarmos usando os valores obtidos após o treinamento da mesma arquitetura básica com um enorme conjunto de imagens rotuladas onde os gatos já existiam (entre outras coisas)? Dessa forma, transferiríamos o conhecimento adquirido em uma tarefa mais genérica para o nosso caso específico, e não começaríamos completamente do zero.

É isso que obtemos ao adotar modelos previamente treinados no imenso conjunto de dados do ImageNet, que atualmente possui mais de 14 milhões de imagens e quase 22.000 rótulos diferentes. Talvez o caso mais conhecido seja a arquitetura ResNet, vencedora da competição de reconhecimento de imagem realizada pela ImageNet em 2015. O fato de usar a mesma arquitetura com os mesmos parâmetros do modelo pré-treinado dará à nossa rede a capacidade de reconhecer muitas coisas desde o início, o que também implicará um tempo de treinamento muito curto. Esse uso dos dados do ImageNet como ponto de partida significou um tremendo salto no campo Visão Computacional.

Uma amostra dos dados do ImageNet

Como já mencionado, o que faremos em primeiro lugar é escolher a arquitetura base, que depende do problema específico a ser resolvido e do nosso conhecimento das melhores técnicas existentes para o cenário específico (mais sobre este assunto mais adiante). artigos). Inicializaremos essa arquitetura com os valores dos parâmetros do modelo pré-treinado, para que nossos resultados finais sejam melhores e alcançados muito antes. O que vem a seguir é remover a camada de saída da arquitetura base e, em vez disso, anexar camadas adicionais, para que possamos retocar o modelo original para adaptá-lo ao nosso caso específico.

No exemplo das raças de gatos, usaremos um modelo ResNet pré-treinado nos dados do ImageNet como ponto de partida; em seguida, remova a camada de saída responsável por decidir se temos um gato ou um peixe (ou outra coisa) e, finalmente, acrescente um par de camadas finais para reorientar a tarefa do modelo inicial, focando na classificação das raças de gatos de acordo com as diferenças observadas entre eles.

Exemplo (Mathworks)

Um truque que aprendi com o curso Fast.ai: ao aplicar os resultados do aprendizado por transferência, pode-se melhorar bastante se primeiro treinarmos nosso modelo com versões reduzidas das imagens originais e depois treinarmos com imagens maiores. Os resultados foram aprimorados porque, aos olhos da nossa rede, parece um conjunto de dados diferente. Essa técnica é conhecida como redimensionamento progressivo e funciona para um tamanho mínimo de imagem de 64x64 pixels.

Estratégia de treinamento para a rede neural com aprendizado de transferência

Podemos seguir um procedimento quase genérico ao treinar qualquer rede usando o aprendizado de transferência. Aplicaremos uma estratégia em duas etapas:

No primeiro estágio, congelaremos os parâmetros pertencentes à arquitetura base. Seria um pouco absurdo reajustar os parâmetros das primeiras camadas da mesma maneira que os das novas adicionadas, já que dificilmente melhoraremos a capacidade do modelo básico de detectar formas simples, como diagonais ou gradientes (algo já alcançado pela primeira camada). Escolheremos uma taxa de aprendizado apropriada para o ajuste dos parâmetros nas camadas adicionais (não muito alta para evitar oscilações, nem muito baixa para evitar a espera eterna). O tempo de treinamento será pequeno porque não há muitos parâmetros para ajustar; algumas épocas (iterações completas em todos os dados) devem ser suficientes.

No segundo estágio, tentaremos melhorar o modelo executando um ajuste fino. A primeira coisa que faremos é descongelar os parâmetros das camadas base para ajustar levemente seus valores. Escolheremos um intervalo para a taxa máxima de aprendizado através das diferentes camadas, para que os pesos das camadas base mal mudem, enquanto os pesos finais têm uma margem de modificação maior (embora seja menor do que no primeiro estágio). Treinaremos nossa rede por mais épocas; basicamente até o erro de validação piorar constantemente.

Transferência de aprendizado para processamento de linguagem natural

A principal causa por trás das melhorias drásticas alcançadas há alguns anos atrás no campo Processamento de linguagem natural (PNL) também foi o Transfer Learning.

Começamos com uma premissa: geralmente nosso conjunto de dados será limitado dentro de um assunto específico e não será grande o suficiente para nos permitir entender a complexidade por trás do idioma.

Em 2018, Jeremy Howard e Sebastian Ruder publicaram um artigo apresentando o ULMFiT (Universal Language Model Fine-Tuning), um método genérico para aplicar o Transfer Learning a qualquer problema de PNL, trazendo para esse campo os avanços alcançados anteriormente na área de Visão Computacional. A conseqüência: os melhores resultados vistos até o momento (com uma melhoria de precisão de 18 a 24%) em vários conjuntos de dados clássicos, como o usado para classificar as críticas de filmes do IMDB em positivas e negativas.

O processamento de linguagem natural não é tão simples

As etapas seguidas para este exemplo e outros problemas semelhantes seriam os seguintes:

1. Escolha um modelo pré-treinado (ou crie e treine um novo) em uma tarefa de texto mais genérica como ponto de partida. Na PNL, usaremos o que é conhecido como modelo de linguagem, que tenta, por exemplo, prever a próxima palavra em uma frase, como podemos ver nos teclados preditivos. Essa tarefa requer um profundo conhecimento da língua e do mundo ao nosso redor; trabalhar com n-gramas (palavras que geralmente aparecem juntas) como antes não é suficiente para adquirir a capacidade necessária para continuar as frases. Mas ... e se aplicarmos o Deep Learning usando um conjunto de dados maior, como uma grande pilha de artigos extraídos da Wikipedia? Parece uma boa ideia! Prever a próxima palavra não será muito útil para nossa tarefa final de classificação, mas, ao conseguir isso, adquiriremos um conhecimento muito valioso do idioma e da realidade em que ele é aplicado. Muito melhor do que começar com parâmetros aleatórios, não é?

Este primeiro passo não será repetido, mesmo se o nosso problema ou domínio mudar, desde que o mesmo idioma seja usado.

2. Refine o modelo de idioma aplicando o Transfer Learning, a fim de criar um novo que seja bom em prever a próxima palavra, mas dentro de nosso domínio específico; neste caso, críticas de filmes. Vamos alimentar a rede com nosso conjunto de dados, também chamado corpus de destino, e aplicaremos a tokenização (segmentação do texto em unidades ou tokens mínimos), normalização e numerização (tomando cuidado com tokens especiais). É recomendável usar todos os dados disponíveis, incluindo amostras de teste; já que seus rótulos (que serão usados ​​para classificação) não são necessários para prever a próxima palavra. Juntamos todas as amostras e reservamos, por exemplo, 10% do total para validar o modelo.

Não há necessidade de manter o modelo completo; basta com o codificador, que é a parte que aprendeu o idioma (e não a que gera a próxima palavra).

Até agora, temos o que é conhecido como aprendizado auto-supervisionado, sem a necessidade de usar amostras rotuladas por humanos, pois o próprio conjunto de dados já as inclui. O modelo em nosso caso aprenderá como as resenhas de filmes são escritas, mesmo sem saber se são positivas ou negativas.

3. Crie o classificador específico para nossa tarefa específica (para diferenciar entre revisões positivas e negativas), transferindo o que o modelo anterior aprendeu (esse modelo também seria válido para qualquer outro classificador com base nos mesmos dados).

Imagem transferida do fast.ai

Numa primeira fase, treinaremos apenas as camadas anexadas. Continuaremos treinando em uma segunda fase, mas sem descongelar toda a rede de uma só vez, como fizemos na classificação de imagens; primeiro descongelaremos as últimas camadas da arquitetura base e treiná-loemos por um tempo ... depois, desbloquearemos mais algumas camadas e treinaremos outro pouco ... e assim por diante, até descongelar completamente e treiná-lo pela última vez.

O modelo resultante após esse ponto já poderá discernir se uma revisão é positiva ou negativa :)

Conclusão

Quando trabalhamos em um problema de aprendizado de máquina relacionado a imagens ou texto, é sempre conveniente considerar o Transfer Learning para a inicialização de nossos parâmetros de rede neural.

Para resolver problemas enquadrados nesses campos, contamos com muitos modelos pré-treinados que serão muito úteis para nós; só precisamos escolher o caminho certo:

  • Computer Vision: modelos para PyTorch, Keras
  • Processamento de linguagem natural: transformadores ([*] BERT, GPT-2,…), ULMFiT, etc.
Ernie, Elmo e Bert

O Transfer Learning é uma técnica relativamente nova, com espaço para melhorias nos campos anteriores (novos modelos aparecem toda semana), e ainda deve ser explorada e explorada em alguns outros. Definitivamente, é um tópico a seguir de perto e vale a pena investigar se você trabalha com redes neurais :)

PS - Dê uma olhada nestes notebooks Python para obter exemplos completos usando fastai: Classificação de imagem + classificação de revisão do IMDB.

Espero que tenhas gostado! Inscreva-se em #yottabytes para não perder artigos como este :)