关于word2vec嵌入的PCA

use*_*402 17 python nlp pca scikit-learn word2vec

我试图重现本文的结果:https://arxiv.org/pdf/1607.06520.pdf

特别是这部分:

为了识别性别子空间,我们采用了十个性别对差异向量并计算了其主要成分(PC).如图6所示,有一个方向可以解释这些向量中的大部分方差.第一个特征值明显大于其余特征值.

在此输入图像描述

我使用与作者相同的单词向量集(Google News Corpus,300维度),我将其加载到word2vec中.

作者引用的"十个性别对差异向量"是根据以下单词对计算得出的:

在此输入图像描述

我用以下方式计算了每个规范化向量之间的差异:

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])
Run Code Online (Sandbox Code Playgroud)

然后我根据论文在得到的矩阵上执行PCA,包含10个组件:

from sklearn.decomposition import PCA
pca = PCA(n_components=10)
pca.fit(difference_matrix)
Run Code Online (Sandbox Code Playgroud)

但是当我看到时,我得到了非常不同的结果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])
Run Code Online (Sandbox Code Playgroud)

或用图表:

在此输入图像描述

当应该超过60%时,第一个组件占差异的不到30%!

我得到的结果类似于当我尝试在随机选择的向量上进行PCA时得到的结果,所以我一定做错了,但我无法弄清楚是什么.

注意:我试过没有规范化向量,但我得到了相同的结果.

ore*_*ano 6

他们在github上发布了该论文的代码:https//github.com/tolga-b/debiaswe

具体来说,您可以在文件中看到他们用于创建PCA图的代码。

这是该文件中的相关代码片段:

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
Run Code Online (Sandbox Code Playgroud)

根据代码,看起来他们正在采用一对中的每个单词与该对中的平均向量之间的差。对我来说,不清楚这就是论文中的意思。但是,我将这些代码与它们的对一起运行,并能够从纸上重新创建图形:

在此处输入图片说明


小智 6

扩展牛至的答案:

对于每一对 a 和 b,它们计算中心 c = (a + b) / 2,然后包括指向两个方向 a - c 和 b - c 的向量。

这一点至关重要的原因是 PCA 为您提供了发生最大方差的向量。所有向量都指向同一方向,因此您试图揭示的方向几乎没有变化。

他们的集合包括指向性别子空间中两个方向的向量,因此 PCA 清楚地揭示了性别变化。