vitalwarley / research

3 stars 0 forks source link

Extender perda contrastiva com informações de diferença de idade #35

Closed vitalwarley closed 1 year ago

vitalwarley commented 1 year ago

Contexto sobre o funcionamento da perda está em https://github.com/vitalwarley/research/issues/33#issuecomment-1705631136.

Minha ideia:

def contrastive_loss(x1, x2, ages_x1, ages_x2, kinship_relations, beta=0.08):

Vamos obter um age_diff entre todos os indivíduos, computar cada probabilidade em relação a uma PDF pré-definida (e.g., power-law para bb), determinar uma penalidade (e.g. via a multiplicação dessa probabilidade com cosine_mat) e adicioná-la à perda.

vitalwarley commented 1 year ago

Lembrando que

    cosine_mat = torch.cosine_similarity(torch.unsqueeze(x1x2, dim=1),
                                         torch.unsqueeze(x1x2, dim=0), dim=2) / beta

em cosine_mat temos majoritariamente pares negativos -- qualquer par (i, j) onde i != j ou j != i + batch_size, para i < batch_size.

Como saber o tipo de relacionamento entre o par (i, j) na matriz cosine_mat? Eu sei, por exemplo, o parentesco de (i, i + batch_size), mas não sei os demais.

Uma solução é combinar o título parcial do primeiro indivíduo (e.g., father de father-son) mais o título parcial do segundo indivíduo (e.g., grandson de grandfather-grandson). Mas os indivíduos seguem essa ordem mesmo, isso é, em todo par father-son temos x1 provindo do father e x2 provindo do son? Se não, podemos usar ages_x1 e ages_x2 para definir isso.

Além da idade, parece que o gênero também é necessário. ms pode ser (male, female) ou (female, male). Combinar os indivíduos do par com os indivíduos do par fs precisa respeitar a ordem (female, male).

vitalwarley commented 1 year ago

Após usar as estimativas de idade e gênero, temos uma questão a resolver sobre a combinação dos termos do parentesco

is_kin = 1

x1 x2 age_x1 age_x2 gender_x1 gender_x2 kinship_type is_kin age_diff
N33 N21 82 40 female female md 1 42
P80 P50 45 19 female male gmgs 1 26
L66 L30 20 22 male male bb 1 2
D53 D30 55 58 male male bb 1 3
D94 D87 63 30 male male gfgs 1 33

is_kin = 0

x1 x2 age_x1 age_x2 gender_x1 gender_x2 kinship_type is_kin age_diff
A97 B30 73 39 male male father-grandson 0 34
Z90 J100 37 44 male female father-daughter 0 7
N33 Q71 82 73 female male mother-grandson 0 9
Z21 Q71 99 73 male male brother-grandson 0 26
S63 K43 85 63 female male siblings-grandson 0 22

Para qual parentesco mapear os novos tipos: father-grandson, father-daughter, etc?

vitalwarley commented 1 year ago

Para qual parentesco mapear os novos tipos: father-grandson, father-daughter, etc?

kinship_type define qual PDF usar para extrair a probabilidade de age_diff.

vitalwarley commented 1 year ago

father-grandson pode ser mapeado para: gfgs, fs, bb. A escolha define a probabilidade de se obter age_diff. No caso de (A97, B30), temos age_diff = 34, que é menos provavável para bb, enquanto que mais provável para fs.