【重点来了】
那么怎么对比学习呢?
理想来说,你是一个阅剧无数的人,那么从这个电视剧后面的真实剧情 的感情走向 和你预测的感情走向 应该是极为相似的。
如果此时有人谈到另一个电视剧 (你看的电视剧叫 ) 的感情走向 ,那你一定能判断出他在谈的不是你在看的电视剧
可是如果你是一个小孩(初始化的神经网络,你可能就无法分辨不同剧的感情走向是不是对应的)
就像很多人模仿某作家的文风会被专业人士看出,却能欺骗过大众。
所以,正样本对和负样本对的定义是这样的:
(这里的k可以取1, 2, …, K), K是你认为最多能预测的timestep
那么网络到底是怎么进行学习的呢??
对不起,下面不得不有个公式:
定义对于单独一个样本j的NCE Loss:
这里f是一个相似度衡量函数,可以直接用exp(内积( ))。 (之所以不用MSE是因为CPC并不想要element wise的一致,而希望更全局的slowly changed 信息一致,希望mutual information一致)
这里分母的m=1,…, N 是采样的不是j的个体的embedding,通常取一个batch里的所有样本(包括样本j)。这样做比较方便写代码和计算。(不过Kaiming He最近有paper提出从batch之外采样效果更好。)
现在我们来看,对于牛逼的神经网络,分子的相似度应该很高,值会很大。
而分母的每一项,除了m=j的时候,其他项都应该非常小,甚至接近于0。
那么整个loss就会
而对于什么都不会的神经网络,假如是random guess,那么
所以,我们的只要minimize这个L,就是在优化这个神经网络,让它越来越能辨识正负样本对。
三、总结
这就是CPC的整个学习过程,通过这个正负样本对的loss来更新网络的所有参数。你可以理解为,逼着它更新特征提取器来学会辨识正负样本对。
更广一点contrastive learning的工作的思想也是这样的,只是正负样本对的构建方式不一样。