Closed vitalwarley closed 11 months ago
╔╡[warley]:[vital-strix]➾[~/dev/research/kinship] | [on branch main]
╚═╡(kinship) [10:53] λ python rfiw2021/Track1/check_families_per_batch.py --file-path rfiw2021/Track1/sample0/train_sort.txt --chunk-size 10
Not all chunks have unique families.
Number of chunks with unique families: 0.9950555089094132
First non-unique chunk: 4328
╔╡[warley]:[vital-strix]➾[~/dev/research/kinship] | [on branch main]
╚═╡(kinship) [10:53] λ python rfiw2021/Track1/check_families_per_batch.py --file-path rfiw2021/Track1/sample0/train_sort.txt --chunk-size 20
Not all chunks have unique families.
Number of chunks with unique families: 0.9694029850746269
First non-unique chunk: 28
╔╡[warley]:[vital-strix]➾[~/dev/research/kinship] | [on branch main]
╚═╡(kinship) [10:53] λ python rfiw2021/Track1/check_families_per_batch.py --file-path rfiw2021/Track1/sample0/train_sort.txt --chunk-size 40
Not all chunks have unique families.
Number of chunks with unique families: 0.8645522388059701
First non-unique chunk: 14
Em alguns batches há mais que um par pertencentes a mesma família. Vale lembrar que todos os pares são positivos, no entanto.
Em um novo treinamento após adicionar inicialização para camada de classificação, consegui apenas 0.856719 de AUC.
Resultados não melhoraram.
Usei um lambda = 0.8
, assim
loss = lambda_factor * c_loss + (1 - lambda_factor) * ce_loss
Próximo passo é a partir de agora usar meus scripts com modelo backbone do SOTA2021 tal que eu consegui realizar busca de hiperparâmetros, além de facilitar o gerenciamento dos experimentos.
╔╡[warley]:[vital-strix]➾[~/dev/research/kinship] | [on branch main] ╚═╡(kinship) [10:53] λ python rfiw2021/Track1/check_families_per_batch.py --file-path rfiw2021/Track1/sample0/train_sort.txt --chunk-size 10 Not all chunks have unique families. Number of chunks with unique families: 0.9950555089094132 First non-unique chunk: 4328 ╔╡[warley]:[vital-strix]➾[~/dev/research/kinship] | [on branch main] ╚═╡(kinship) [10:53] λ python rfiw2021/Track1/check_families_per_batch.py --file-path rfiw2021/Track1/sample0/train_sort.txt --chunk-size 20 Not all chunks have unique families. Number of chunks with unique families: 0.9694029850746269 First non-unique chunk: 28 ╔╡[warley]:[vital-strix]➾[~/dev/research/kinship] | [on branch main] ╚═╡(kinship) [10:53] λ python rfiw2021/Track1/check_families_per_batch.py --file-path rfiw2021/Track1/sample0/train_sort.txt --chunk-size 40 Not all chunks have unique families. Number of chunks with unique families: 0.8645522388059701 First non-unique chunk: 14
Em alguns batches há mais que um par pertencentes a mesma família. Vale lembrar que todos os pares são positivos, no entanto.
Isso é um erro. A perda contrastiva assume batches provindos de famílias únicas, como cito aqui. Em breve realizo um treinamento com batch de 10 para avaliar se isso é significativo.
m breve realizo um treinamento com batch de 10 para avaliar se isso é significativo.
Aproveitando para avaliar outros hiper-parâmetros
$ guild run train-kv root-dir=rfiw2021/Track1 train-dataset-path=rfiw2021/Track1/sample0/train_sort.txt val-dataset-path=rfiw2021/Track1/sample0/val_choose.txt output-dir=exp insightface-weights=models/ms1mv3_arcface_r100_fp16.pth 'beta=[0.2, 0.4, 0.6, 0.8]' 'num-epoch=[80, 100, 105]' steps-per-epoch=100 batch-size=10 'normalize=[yes, no]' -t baseline -t ms1mv3 -t sota2021 -t myself
You are about to run train-kv as a batch (24 trials)
batch-size: 10
beta: [0.2, 0.4, 0.6, 0.8]
device: '0'
insightface-weights: models/ms1mv3_arcface_r100_fp16.pth
lr: 0.0001
normalize: [yes, no]
num-classes: 570
num-epoch: [80, 100, 105]
output-dir: exp
root-dir: rfiw2021/Track1
steps-per-epoch: 100
train-dataset-path: rfiw2021/Track1/sample0/train_sort.txt
val-dataset-path: rfiw2021/Track1/sample0/val_choose.txt
Continue? (Y/n)
A ideia é avaliar um batch menor (10), mas isso implica precisar de mais passos por época (100). Tecnicamente, precisamos de 107 épocas para passar por todo o dataset, mas acabei escolhendo outras também.
Os experimentos não iniciam por algum motivo que não entendo ainda. Tentarei em breve. Há outro experimento de outro projeto rodando que pode ser a causa (sem sentido, no entanto).
Os experimentos não iniciam por algum motivo que não entendo ainda. Tentarei em breve. Há outro experimento de outro projeto rodando que pode ser a causa (sem sentido, no entanto).
Tanto na RIG2 quanto na RIG1 não consigo. Na RIG1 obtenho
➜ hybrid git:(main) ✗ guild cat --output 1
guild: /home/warley/.guild/runs/177d8228819c4998b1bbf7208498d032/.guild/output does not exist
Os experimentos não iniciam por algum motivo que não entendo ainda. Tentarei em breve. Há outro experimento de outro projeto rodando que pode ser a causa (sem sentido, no entanto).
Tanto na RIG2 quanto na RIG1 não consigo. Na RIG1 obtenho
➜ hybrid git:(main) ✗ guild cat --output 1 guild: /home/warley/.guild/runs/177d8228819c4998b1bbf7208498d032/.guild/output does not exist
Era erro de config. Experimentos em curso.
You are about to run train-kv as a batch (2 trials)
batch-size: 20
beta: 0.08
device: '0'
insightface-weights: models/ms1mv3_arcface_r100_fp16.pth
lr: 0.0001
normalize: [no, yes]
num-classes: 12
num-epoch: 105
output-dir: exp
root-dir: rfiw2021/Track1
scl: yes
scl-lambda: 0.8
steps-per-epoch: 50
train-dataset-path: rfiw2021/Track1/sample0/train_sort.txt
val-dataset-path: rfiw2021/Track1/sample0/val_choose.txt
Continue? (Y/n) y
Adicionei esquema SCL de #45 no meus scripts.
Todos os experimentos tendem a perder AUC em troca de ACC, embora alguns iniciem com ganhos em AUC. Seria a taxa de aprendizado? Outro padrão interessante é que o relacionamento entre o peso de cada perda (via scl-lambda
) parece seguir um U, onde pequenos valores enfatizam a perda contrastiva e acabam resultando em melhor AUC.
Resolvi atualizar a taxa de aprendizado como feito no SOTA2020, isso é, permitir warmup, cooldown, decaimento dos pesos, bem como uso de MultiStepLR
usando as mesmas épocas lá.
Em ambos os casos, com ou sem SCL, podemos ver um decrescimento bem menor da AUC e creio que por causa dessas adições. Na verdade, ao contrário do que notamos antes, com SCL há uma maior estabilidade da AUC ao passo que ACC cresce, embora bem pouco. É bom lembrar que o esquema do SOTA2021 permite apenas uma passada no dataset.
Aqui temos o mesmo experimento que o gráfico cinza, exceto que não há ajustes na LR.
Mudanças no modelo
Mudanças no treinamento
Usei os scripts originais porque os meus não foram capazes de reproduzir os resultados do SOTA2021.
Abaixo as perdas e métricas ao longo do treinamento
Em minha primeira reprodução do SOTA2021, consegui 0.864550, logo os resultados acima (0.864300) não foram melhores. Uma das razões, eu creio, é que no conjunto de treinamento há apenas amostras positivos. A perda contrastiva constrói os pares negativos por necessidade de sua formulação. Talvez devamos treinar para classificação de família, à lá SOTA2020? Cada batch contém apenas famílias únicas; essa é a ideia do SOTA2021. De certa forma, eu tentei algo semelhante na #39, todavia fiz dois treinamentos separados.