向量的平衡算法
用于NLP领域的消除性别等偏见。问题表征如下:
为了使得e_w1 and e_w2对bia_orth有同样的距离
(扩充:nlp为了消除字词的语义偏见,比如,
给定“工程师”首先想到man而不是woman,即“工程师”和“man”的“距离”更近,
给定“服装设计师”首先想到woman而不是man,即“服装设计师”和“woman”的“距离”更近,
所以做了这样的工作:
(1):计算bia = "man" - "woman"。
(2):把产生偏见的词,放在bia_orth方向上 -----》更新的向量=向量-向量在bia方向的投影
(3):使得woman和man与bia_orth的距离一样
本片文章做得是第3步的介绍工作)
示例图片:
算法的思想:
核心代码:
import numpy as np
def equalize(e_w1,e_w2,bias_axis):
mu = (e_w1 + e_w2) / 2.0
#mu在bias_axis方向的投影
mu_b = np.dot(mu,bias_axis) / np.sum(bias_axis*bias_axis) * bias_axis
#mu在bias_axis垂直方向的投影
mu_orth = mu - mu_b
e_w1b = np.dot(e_w1,bias_axis) / np.sum(bias_axis*bias_axis) * bias_axis
e_w2b = np.dot(e_w2, bias_axis) / np.sum(bias_axis * bias_axis) * bias_axis
corrected_e_w1b = np.sqrt(np.abs(1-np.sum(mu_orth))) *\
(e_w1b - mu_b) / np.square(np.linalg.norm(e_w1-mu_orth-mu_b))
corrected_e_w2b = np.sqrt(np.abs(1 - np.sum(mu_orth))) * \
(e_w2b - mu_b) / np.square(np.linalg.norm(e_w2 - mu_orth - mu_b))
e1 = corrected_e_w1b + mu_orth
e2 = corrected_e_w2b + mu_orth
return e1,e2