web-dev-qa-db-ja.com

Word2vec埋め込みのPCA

この論文の結果を再現しようとしています: https://arxiv.org/pdf/1607.06520.pdf

特にこの部分:

性別部分空間を識別するために、10個の性別ペアの差ベクトルを取得し、その主成分(PC)を計算しました。図6に示すように、これらのベクトルの分散の大部分を説明する単一の方向があります。最初の固有値は他の固有値よりも大幅に大きくなります。

enter image description here

著者と同じWordベクトルのセット(Google News Corpus、300次元)を使用しており、Word2vecに読み込みます。

著者が参照する「10の性別ペア差分ベクトル」は、次のWordペアから計算されます。

enter image description here

次の方法で各正規化ベクトル間の差を計算しました。

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])

次に、得られたマトリックスに対して、論文のとおり10個のコンポーネントを使用してPCAを実行します。

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])

またはチャート付き:

enter image description here

最初のコンポーネントは、分散の60%を超える場合、分散の30%未満を占めます!

ランダムに選択されたベクトルに対してPCAを実行しようとしたときに得られる結果と似た結果が得られるため、何か間違ったことをしなければなりませんが、何がわかるのかわかりません。

注:ベクトルを正規化せずに試しましたが、同じ結果が得られます。

18
user2969402

彼らはgithubで論文のコードをリリースしました: https://github.com/tolga-b/debiaswe

具体的には、PCAプロットを作成するためのコードを this ファイルで確認できます。

そのファイルの関連するコードスニペットを次に示します。

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

コードに基づいて、彼らはペアの各単語とペアの平均ベクトルの差を取っているように見えます。私にとって、これが彼らがこの論文で意味したことは明らかではありません。ただし、このコードをペアで実行し、ペーパーからグラフを再作成できました。

enter image description here

7
oregano

Oreganoの答えを拡張するには:

各ペアaおよびbについて、中心c =(a + b)/ 2を計算し、両方向a-cおよびb-cを指すベクトルを含めます。

これが重要な理由は、PCAが最も多くの分散が発生するベクトルを提供するためです。すべてのベクトルは同じ方向を向いているので、明らかにしようとしている方向の変動はほとんどありません。

そのセットには、性別部分空間で両方向を指すベクトルが含まれているため、PCAは性別の変化を明確に示します。

3
jnaf