def compute_loss_of_similarity(self, inputs, mask=None): _, _, y_pred, _ = inputs y_true = self.get_labels_of_similarity(y_pred) # 构建标签 y_pred = K.l2_normalize(y_pred, axis=1) # 句向量归一化 similarities = K.dot(y_pred, K.transpose(y_pred)) # 相似度矩阵 similarities = similarities - K.eye(K.shape(y_pred)[0]) * 1e12 # 排除对角线 similarities = similarities * 30 # scale loss = K.categorical_crossentropy(y_true, similarities, from_logits=True) return loss
def compute_loss_of_similarity(self, inputs, mask=None): _, _, y_pred, _ = inputs y_true = self.get_labels_of_similarity( y_pred) # 构建标签 (btz,btz) 左右两个btz互为true y_pred = K.l2_normalize(y_pred, axis=1) # 句向量归一化 (?, 768) similarities = K.dot(y_pred, K.transpose(y_pred)) # 相似度矩阵 (btz,btz) similarities = similarities - K.eye(K.shape( y_pred)[0]) * 1e12 # 排除对角线,因为对角线的是自己跟自己比 (btz,btz) 对角线上的值会变得无穷小 similarities = similarities * 30 # scale (btz,btz) loss = K.categorical_crossentropy( y_true, similarities, from_logits=True) # (?,) 由此可以计算一个btz内的句子相似度 return loss