【问题标题】:PCA on word2vec embeddingsword2vec 嵌入上的 PCA
【发布时间】:2018-06-09 17:33:27
【问题描述】:

我正在尝试重现这篇论文的结果:https://arxiv.org/pdf/1607.06520.pdf

具体这部分:

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

我使用与作者相同的词向量集(Google 新闻语料库,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])

然后我根据论文对生成的矩阵执行 PCA,其中包含 10 个组件:

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

但是,当我查看 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])

或用图表:

第一个分量在应该高于 60% 的情况下占方差的不到 30%!

我得到的结果与我尝试对随机选择的向量进行 PCA 时得到的结果相似,所以我一定做错了什么,但我不知道是什么。

注意:我尝试过不对向量进行归一化,但得到了相同的结果。

【问题讨论】:

  • 你的意思是你标准化了 difference_matrix 向量吗?如果我这样做,我会得到更均匀的方差......奇怪的是,如果我计算平均值的方差而不是差异,我得到的东西看起来更像我们正在寻找的东西
  • 通过“计算方差”,我的意思是看 PCA 之后的解释_方差_比率_
  • 阅读图描述,他们似乎计算了差异,然后对结果向量进行归一化。在您的代码中,您首先对两个向量进行归一化,然后相减。通过这样做,您基本上可以防止嵌入算法工作,并且您的 PCA 输入也不会被归一化,因为单位向量的差异不必具有单位范数
  • 只是出于好奇 - 你能找到答案吗?我已经尝试过你的代码有和没有差异规范化 - 它不会显着改变图片。

标签: python scikit-learn nlp pca word2vec


【解决方案1】:

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

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

这是该文件中相关的sn-p代码:

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

根据代码,看起来他们正在获取一对中的每个单词与该对的平均向量之间的差异。对我来说,不清楚这就是他们在论文中的意思。但是,我用他们的配对运行了这段代码,并且能够从论文中重新创建图表:

【讨论】:

    【解决方案2】:

    扩展牛至的答案:

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

    这很关键的原因是 PCA 为您提供了出现最大方差的向量。您的所有向量都指向同一个方向,因此在您试图显示的方向上几乎没有差异。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-20
      • 2020-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-02
      • 1970-01-01
      相关资源
      最近更新 更多