def backward(self, inputs, gy):
xp = cuda.get_array_module(*inputs)
x0, x1, y = inputs
x_dim = x0.shape[1]
y = xp.repeat(y[:, None], x_dim, axis=1)
alpha = gy[0] / y.shape[0]
dist = xp.repeat(self.dist[:, None], x_dim, axis=1)
# similar pair
gx0 = alpha * y * self.diff
# dissimilar pair
mdist = xp.repeat(self.mdist[:, None], x_dim, axis=1)
mdist_p = xp.array(mdist > 0, dtype=xp.int32)
gx0 += alpha * (1 - y) * mdist_p * mdist * -(self.diff / dist)
gx0 = gx0.astype(xp.float32)
return gx0, -gx0, None
评论列表
文章目录