web-dev-qa-db-fra.com

PCA sur les intégrations Word2vec

J'essaie de reproduire les résultats de cet article: https://arxiv.org/pdf/1607.06520.pdf

Plus précisément cette partie:

Pour identifier le sous-espace de genre, nous avons pris les dix vecteurs de différence de paire de genre et calculé ses principales composantes (PC). Comme le montre la figure 6, il existe une seule direction qui explique la majorité de la variance de ces vecteurs. La première valeur propre est significativement plus grande que les autres.

enter image description here

J'utilise le même ensemble de vecteurs Word que les auteurs (Google News Corpus, 300 dimensions), que je charge dans Word2vec.

Les "dix vecteurs de différence de paire de genre" auxquels les auteurs se réfèrent sont calculés à partir des paires de mots suivantes:

enter image description here

J'ai calculé les différences entre chaque vecteur normalisé de la manière suivante:

model = gensim.models.KeyedVectors.load_Word2vec_format('GoogleNews-vectors-
negative300.bin', binary = True)
model.init_sims()

pairs = [('she', 'he'),
('her', 'his'),
('woman', 'man'),
('Mary', 'John'),
('herself', 'himself'),
('daughter', 'son'),
('mother', 'father'),
('gal', 'guy'),
('girl', 'boy'),
('female', 'male')]

difference_matrix = np.array([model.Word_vec(a[0], use_norm=True) - model.Word_vec(a[1], use_norm=True) for a in pairs])

J'exécute ensuite PCA sur la matrice résultante, avec 10 composants, selon le papier:

from sklearn.decomposition import PCA
pca = PCA(n_components=10)
pca.fit(difference_matrix)

Cependant, j'obtiens des résultats très différents quand je regarde pca.explained_variance_ratio_:

array([  2.83391436e-01,   2.48616155e-01,   1.90642492e-01,
         9.98411858e-02,   5.61260498e-02,   5.29706681e-02,
         2.75670634e-02,   2.21957722e-02,   1.86491774e-02,
         1.99108478e-32])

ou avec un graphique:

enter image description here

La première composante représente moins de 30% de la variance alors qu'elle devrait être supérieure à 60%!

Les résultats que j'obtiens sont similaires à ce que j'obtiens lorsque j'essaie de faire le PCA sur des vecteurs sélectionnés au hasard, donc je dois faire quelque chose de mal, mais je ne peux pas comprendre quoi.

Remarque: J'ai essayé sans normaliser les vecteurs, mais j'obtiens les mêmes résultats.

18
user2969402

Ils ont publié le code du document sur github: https://github.com/tolga-b/debiaswe

Plus précisément, vous pouvez voir leur code pour créer le tracé PCA dans le fichier this .

Voici l'extrait de code pertinent de ce fichier:

def doPCA(pairs, embedding, num_components = 10):
    matrix = []
    for a, b in pairs:
        center = (embedding.v(a) + embedding.v(b))/2
        matrix.append(embedding.v(a) - center)
        matrix.append(embedding.v(b) - center)
    matrix = np.array(matrix)
    pca = PCA(n_components = num_components)
    pca.fit(matrix)
    # bar(range(num_components), pca.explained_variance_ratio_)
    return pca

Sur la base du code, il semble qu'ils prennent la différence entre chaque mot d'une paire et le vecteur moyen de la paire. Pour moi, ce n'est pas clair que c'est ce qu'ils voulaient dire dans le document. Cependant, j'ai exécuté ce code avec leurs paires et j'ai pu recréer le graphique à partir du papier:

enter image description here

7
oregano

Pour développer la réponse de l'origan:

Pour chaque paire, a et b, ils calculent le centre, c = (a + b)/2, puis incluent des vecteurs pointant dans les deux directions, a - c et b - c.

La raison pour laquelle cela est critique est que l'ACP vous donne le vecteur le plus varié. Tous vos vecteurs pointent dans la même direction, il y a donc très peu d'écart dans la direction précise que vous essayez de révéler.

Leur ensemble comprend des vecteurs pointant dans les deux directions dans le sous-espace de genre, donc l'ACP révèle clairement la variation de genre.

3
jnaf