-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Mesclar estratégias de pré-treino do SOTA 2020 com perda contrastiva #39
Comments
Dataset usado por Shadrikov (2020) é MS1M_v2: MS1M-ArcFace (cito em #18 (comment)). Encontramos-o aqui; precisamente, nesse link. |
Foram 1h47min para terminar o processo. 5822653 amostras divididas em 85741 classes. Apenas ao fim lembrei/percebi que o pessoal do deepinsight disponibilizam os modelos pré-treinados. Todavia, para o modelo em PyTorch, o pré-treino foi realizado no MS1MV2, cujo modelo mxnet usado pelo Shadrikov foi pré-treinado. Mais detalhes sobre os datasets: Vou resgatar os códigos do ano passado para completar essa tarefa. |
CLI
Modificações
Problemas
Resultados
Similar aos resultados originais com mxnet Próximo passo é revisar a #24 e continuar com roadmap dessa issue. |
Some adjustments were needed: add `tm.Accuracy` arguments Ref.: #39
Na #24, temos
Sendo assim, creio que usar o modelo pré-treinado é válido. Posso, então, pular o primeiro roadmap: MS-Celeb-1M fine-tuning. Antes de continuar para o segundo, no entanto, vou usar o modelo como está (pré-treinado em reconhecimento facial) para tarefa de verificação de parentesco com perda contrastiva (SOTA 2021). A hipótese é que as features aprendidas no reconhecimento facial vão aumentar a acurácia reportada pelo trabalho #26. |
Já começou bem. AUC tem que passar de 0.865929 (#26). |
Não melhorou no treinamento. Nem no conjunto de validação para computação do limiar
Usando o modelo original obtivemos AUC = 0.8671 e threshold = 0.1155. Ainda assim, a média subiu 0.0023
Em detalhes, essas são as diferenças
É importante salientar que mantive os mesmos hparams, inclusive a lr. Talvez o próximo passo seja tuná-los, especialmente se considerarmos que o modelo não melhora a partir da época ~40. |
Also fixed the dataset `__getitem__` label definition. Ref.: #39
Tratei de avaliar o que precisava ser feito para realizar o ajuste fino em classificação de família. Basicamente, complementar o Precisamos, também, verificar
Próximo passo é revisar Shadrikov em busca de saber como ele preparou os dados para essa etapa. |
Ontem revisei o paper e código. Descobri que o SOTA 2020 tem uma família a mais no train set. Nada tão problemático. Agora a noite eu adaptei o código de treino do Shadrikov. Estou conseguindo treinar. Todavia não dei muita atenção aos hparams usados. Só queria o código funcional.
Serão 20 épocas. É apenas um teste. Amanhã busco deixar o script 100% igual para de fato treinarmos o modelo. |
Tal treinamento durou menos de 1h. Ontem falei que era apenas um teste. Mesmo assim, vou agora realizar treinamento em verificação de parentesco. É bom que já esquematizo todo o pipeline. Acontece que não há treinamento em verificação de parentesco. Segue minhas anotações de agora a noite
|
Antes de adaptar o
|
Shadrikov (2020) used
Originally posted by @vitalwarley in #18 (comment) Meus resultados atuais cujo objetivo é apenas validar minha adaptação do treinamento e verificação É, meio que esperado. Não reproduzi os treinamentos com os mesmos hparams e afins. |
Considerando os resultados acima, penso que posso continuar com mesclagem das estratégias apenas após reproduzir o primeiro gráfico do comentário anterior. Isso é, a estratégia de classificação precisa alcançar AUC = 0.7762 e a estratégia com adição de normalização das features precisa alcançar AUC = 0.7912. Note que usei o mesmo dataset de Shadrikov. |
`val_fiw_clf.py` was adapted from `fit2020/verification.py`. Ref.: #39
- Also created a new directory with hybrid approach, while preserving my last year reproduction trial of Shadrikov.. Ref.: #39
Teste do script OK. Vamos agora treinar de verdade. |
- Added `update_lr` function - Added `log` function - Set seed Ref.: #39
- Added `update_lr` function - Added `log` function - Set seed Ref.: #39
- Added `update_lr` function - Added `log` function - Set seed Ref.: #39
Treinamento de ontem
Provavelmente a causa foi o clip_grad
que é definido como 1. Antes de adicioná-lo, a acurácia estava subindo rapidamente
Os detalhes de implementação de Shadrikov foram esses
embora em seu Treinamentos de hojeDesativei gradient clipping. Classificação (20231115091006)Classificação com normalização (20231115095948)
Investigarei a causa. Talvez aqui que de fato precise haver gradient clipping, dado que as features agora são normalizadas, isso é, assume valores em [-1, 1]? |
Validação (20231115152543)Modelos 20231115091006 e 20231115095948.
|
Como que um treinamento em classificação de famílias que não converge é melhor do que um que converge?
AUC da estratégia com normalização não mudou, no entanto. |
- Also added scaling by 32 in normalization (seems like ArcFace scale). Ref.: #39
Reproduzi a estratégia de classificação, embora tenha faltado alguns centésimos. A solução foi inicializar corretamente a camada de classificação. Isso tinha sido feito nos meus códigos antigos, algo que deixei passar despercebido. Próximo passo é entender a não-convergência da estratégia de normalização. |
Adapted ChatGPT summary from week report Here's a revised table that includes separate columns for the AUC results of the classification and normalization strategies, as well as columns for loss and accuracy for each strategy:
This table now provides a more detailed breakdown of the AUC results, loss, and accuracy for both the classification and normalization strategies across your various experiments. It highlights the dynamic nature of model training and the impact of different changes on these metrics. Analyzing the table of your experiments, several key insights emerge:
These insights indicate that while there's progress, achieving the desired balance between stability, convergence, and high AUC requires further experimentation and perhaps more fundamental changes in approach, such as revisiting the model architecture or data preprocessing methods. Importante lembrar que a taxa de aprendizado no passo N depende do total de épocas. Sendo assim, os experimentos 3 e 4 de ontem tem uma taxa de aprendizado diferente depois da época 20 -- o cooldown é feito nos 400 passos finais. São 330 passos por época com um batch_size = 48 (o autor relata tamanho 64). Além disso, em épocas pré-definidas há uma escala da taxa por 0.75. |
Vou usar guildai e reproduzir alguns experimentos para facilitar análise. |
Usei as ideias aqui, especialmente o último comentário. Em alguns experimentos, verifiquei que o máximo Planejei 2 * 3 * 3 * 3 = 54 experimentos com o comando abaixo.
Incerto quando vai acabar, mas são 6 experimentos sendo executados simultaneamente, então talvez não demore tanto. Com um `batch-size=46', uma época (incluindo a validacão) levou 5 minutos. Logo, ChatGPT nos diz que... Para calcular o tempo total necessário para completar os 54 experimentos, podemos usar as seguintes informações:
Vamos assumir que o tempo para uma única época é mais ou menos constante, independente do número de épocas. Este é um ponto importante, pois se o tempo por época variar significativamente com diferentes Cálculo do Tempo
Vamos fazer esses cálculos. Os cálculos indicam que serão necessárias aproximadamente 2550 minutos para completar todos os 54 experimentos, o que corresponde a cerca de 42.5 horas. Portanto, você pode esperar que todos os experimentos sejam concluídos em aproximadamente 1.8 dias, assumindo que os experimentos são executados continuamente e que o tempo por época é constante para diferentes configurações de Essa é uma estimativa, e o tempo real pode variar com base em fatores como a eficiência da CPU/GPU, a complexidade dos dados e a carga de trabalho do sistema. Atualmente o script salva sempre o melhor modelo de acordo com AUC. Abaixo alguns experimentos ainda em curso |
Há três experimentos rodando ainda. Boa parte daqueles com
Interessante esses dois grupos de experimentos onde em uns o AUC sobe rapidamente, enquanto noutros não. Segue abaixo minha interpretação, que escrevi ontem
Conclusões parciais sobre os hiper-parâmetros (considerando que avaliei apenas alguns)
|
Conclusões atualizadas: não está mais tão claro que hparams são melhores, exceto que Ontem havia agendado mais experimentos para
QuestõesQue experimentos são esses que tem um rápido crescimento comparado aos demais?Aparentemente são aqueles que têm |
Consegui obter os dados do tensorboard e avaliar precisamente aqueles experimentos com rápido crescimento e posterior decrescimento Relativo aos experimentos cujo crescimento é rápido e estável ao longo do treinamento |
Ganho em AUC (discriminação entre parentes ou não) não necessariamente segue ganho em ACC (discriminação entre famílias), mas pode ser falta de exploração. É bom lembrar que até o momento eu variei apenas 4 hparams. Peek.2023-11-21.16-05.mp4 |
Recapitulando os meus objetivos...
A razão para esse 3o objetivo (principal objetivo) é a seguinte. O SOTA2020 aprende a discriminar parentesco usando, em parte, atributos úteis à classificação de famílias. Em parte, pois, como podemos ver no gráfico 2, a acurácia de classificação de famílias ( Em outras palavras, podemos dizer que há uma combinação de features para reconhecimento facial (aprendido pelo modelo baseline) e reconhecimento de parentesco (aprendido estratégia do SOTA2020), que acaba culminando nas features para verificação de parentesco. Nesse sentido, o SOTA2021 vem à calhar: a perda contrastiva compara uma amostra com outras A minha estratégia, portanto, visa responder: é possível combinar as features do modelo SOTA2020 (reconhecimento facial, reconhecimento de famílias, reconhecimento de parentesco indireto) com as features do modelo SOTA2021 (reconhecimento de parentesco direto)? Para o primeiro objetivo, foram mais de 200 experimentos com diferentes variações em alguns hparams
Enquanto que não consegui reproduzir fielmente o melhor resultado do SOTA2020 (0.7912), ao menos cheguei perto em alguns casos. Próximos passos
GráficosGráfico 1: melhor experimento com
|
Resultados com diferentes modelos: R101 sem pré-treino, R101 pré-treinada no MS1MV3, R101 após pré-treino na MS1MV3 (reconhecimento facial) e FIW (classificação de famílias). Esse último modelo não foi o melhor que consegui, mas o melhor que eu tinha disponível no notebook -- os demais estão na RIG1. Mantive todos os outros hparams iguais (bs, lr, beta, passos por época), exceto número de épocas, que foram 20 em vez de 80, para ter um feedback mais rápido, todavia, implementação da validação completa (para encontrar o limiar) e do teste adicionaram 8min por época. Os resultados anteriores, com script original, estão descritos aqui. Resultados publicados
Resultados obtidos via reprodução com scripts originais
Resultados obtidos via reprodução com meus scripts
Podemos ver que |
É importante notar que o conjunto de dados usado para AUC obtida pelo SOTA2020 difere daquele do SOTA2021. Assim que a RIG1 ficar online, resgatarei o melhor modelo relativo ao SOTA2020 para um novo experimento. Vou desativar a computação das métricas |
Resgatei o melhor modelo treinado no esquema do SOTA2020 (classificação de famílias) e o usei em alguns experimentos variando tamanho do batch e taxa de aprendizado.
O objetivo é AUC > 0.864550. |
Nada melhor. |
Despachando mais alguns experimentos.
Fico pensando na |
|
De fato, um Por outro lado, o treino é mais estável, isso é, AUC não decresce drasticamente ao longo do treino. |
Achieving Better Kinship Recognition Through Better Baseline
Tal pré-treino é a primeira estratégia abaixo.
Há mais detalhes sobre os hiperparâmetros e augmentações, todavia vou manter simples por agora.
Supervised Contrastive Learning for Facial Kinship Recognition
where
O poder dessa perda provavelmente vem da grande quantidade de exemplos negativos: 2 * (batch_size^2 - batch_size) pares negativos.
Basicamente, a diferença do SOTA 2021 para o 2020 é que aquele usou apenas a mesma rede (ArcFace, pré-treinada no ImageNet) com perda contrastiva. Isso é, não houve pré-treino em reconhecimento facial no MS-Celeb-1M, nem posterior ajuste fino na tarefa de classificação de famílias no FIW.
Roadmap
MS-Celeb-1M fine-tuning
FRClassification
que retorne (face, id)FRClassifier
que extenda a rede original para classificação de indivíduosFIW Family fine-tuning
KinFamilyClassification
que retorne (face, family_id)KinFamilyClassifier
que extenda a rede original para classificação de famíliasThe text was updated successfully, but these errors were encountered: