DNN训练中两种Pearson相关系数损失计算方法的差异分析
两种批次内Pearson相关系数计算方案的差异分析
问题背景
在深度神经网络(DNN)训练中,若使用Pearson相关系数作为损失函数,针对批次内预测值与标签的Pearson系数(p)计算,存在两种常见方案:
- 逐行计算每个样本的p值,求和后除以批次大小得到平均p;
- 将批次内所有预测值与标签分别展平为一维数组x和y,直接计算全局p值。
举个具体示例:
- 输入预测值
X = [[1,2],[3,4]],标签Y = [[-1,-2],[-3,-4]] - 方法1:计算每个样本的p值:
p1=pearson_loss([1,2],[-1,-2])、p2=pearson_loss([3,4],[-3,-4]),再取平均p=(p1+p2)/2 - 方法2:展平数组后计算
p=pearson_loss([1,2,3,4], [-1,-2,-3,-4])
附TensorFlow Keras中基于方法2实现的pearson_loss代码:
def pearson_loss(x, y): mx = K.mean(x) my = K.mean(y) xm, ym = x-mx, y-my r_num = K.sum(tf.multiply(xm,ym)) r_den = K.sqrt(tf.multiply(K.sum(K.square(xm)), K.sum(K.square(ym)))) r = r_num / r_den # ensure r is in range r = K.maximum(K.minimum(r, 1.0), -1.0) return -r
核心结论
这两种方法存在显著差异,仅在极少数特殊场景下结果会一致(比如每个样本的预测与标签都是完全线性相关且方向统一)。下面从数学原理和实际效果两方面展开说明:
1. 数学原理的本质区别
Pearson相关系数的核心公式是:r = cov(x,y) / (σ_x * σ_y)
其中cov(x,y)是协方差,σ_x、σ_y分别是x和y的标准差。
- 方法1:计算的是每个样本内部预测与标签的Pearson系数的平均值。它关注的是单个样本维度内,预测和标签的线性相关性,每个样本的计算独立于其他样本。
- 方法2:计算的是整个批次所有数据点的全局Pearson系数。它关注的是批次内所有预测值和标签值之间的整体线性趋势,会把所有样本的点混在一起计算均值、协方差和标准差。
2. 实际案例的结果差异
用一个非极端示例就能看出区别:
假设输入 X = [[1,3],[2,4]],标签 Y = [[1,2],[3,4]]
- 方法1:每个样本的Pearson系数都是1(因为每个样本内的预测和标签完全线性正相关),平均后结果为1。
- 方法2:展平后的x=[1,3,2,4],y=[1,2,3,4],计算得到的全局Pearson系数为0.8,和方法1的结果明显不同。
3. 对模型训练的影响
作为损失函数,两种方法会引导模型学习不同的目标:
- 方法1:要求模型对每个样本的预测都尽可能和标签线性相关,适合需要关注个体样本内部模式的任务。
- 方法2:要求模型让整个批次的预测值和标签值呈现整体线性趋势,适合需要捕捉全局数据分布相关性的任务。
内容的提问来源于stack exchange,提问作者Ke MA
相关产品推荐
相关产品推荐

