论文阅读《Representation learning with contrastive predictive coding 》(CPC)对比预测编码

论文地址:Representation Learning with Contrastive Predictive Coding

目录

一、Background(背景)

二、Motivation and Intuitions(动机)

三、Constrastive Predictive Coding(对比预测编码)

1、网络整体架构

2、对比学习核心思想

四、Mutual Informatica&Info NCE(互信息和信息熵损失)

1、互信息

2、InfoNCE

五、result(实验结果)


论文地址:https://arxiv.org/pdf/1807.03748.pdf

一、Background(背景)

       虽然监督学习在许多应用中取得了巨大的进展,但无监督学习尚未得到如此广泛的采用,仍然是人工智能领域的一个重要和具有挑战性的工作。这篇文章是自监督学习领域的一篇挺不错的文章,非常值得阅读。

       这篇文章基于对比学习的思想,在视频序列上做自监督学习。在文章中,作者提出一种通用的无监督学习框架,其目的是从高维序列数据中提取有用的表征信息(Representation),将在上下文中提取到的表征信息和未来时刻样本的表征信息进行对比学习,获得最能预测未来的关键表征信息,称之为CPC (Contrastive Predictive Coding)

       算法核心:1、通过自回归模型来预测未来的隐变量表示。2、通过优化InfoNCE Loss来最大化上下文信息和预测时刻序列的互信息,提取历史信息和未来信息互相依赖的部分,这样的表征能贯穿整个序列,具有较强的语义性和全局鲁棒性。

       在文中证明了该方法能够学习有用的特征表示,并在语音、图像、文本和3D环境中的强化学习中都取得不错的效果。


二、Motivation and Intuitions(动机)

       从信息瓶颈理论的角度来讲,CPC是为了保留任务相关的有用信息,目的是丢弃底层噪声和任务无关的无用信息。这样的任务往往很难实现,因为通常任务相关的信息和噪声很难解耦,想要从信息中分离出有用信息,剔除任务无关的噪声信息,也是本文最主要的目的。

       在模型学习中,如果直接预测未来样本的全部信息,用一个强大的生成模型对未来预测样本的的每个细节进行重建,需要很大的计算量,往往也会忽略样本中上下文关系,这样的做法也是没必要的,因为要识别一张钞票是不是一张钞票,并不需要我们可以完全画出一张一模一样的钞票,我们只需要记住钞票的一些关键性特征就可以识别一张钞票。

       因此,只是为了提取x与c之间的共享信息,直接建模p(x|c)并不是最优的,直接建模会导致计算量过大,模型过多关注于噪声信息和任务无关信息,比如图片的背景。在文章中,用当前的信息预测未来信息时,将预测目标x和上下文c编码成一个紧凑的分布向量表示,最大化x与上下文c之间的互信息(mutual Information)。下面是互信息的表达式:

       互信息可以表示两个随机变量之间的相互依赖程度,从下面的公式中可以看出,X与Y的互信息就是观察到Y之后,X的不确定性的减少,也就是给定Y之后X信息量的减少,互信息可以描述随机变量之间高阶的相关程度。


三、Constrastive Predictive Coding(对比预测编码)

 网络整体架构

       上图是本文最重要的结构图,首先将视频或者音频序列切分为合适的序列片段(下面用视频序列为例讲解),首先将视频片段用非线性编码器Auto EncoderCNN映射到隐空间z中。

       得到历史片段的编码之后,使用自回归模型GRU或者LSTM来融合历史时序信息z,得到历史信息的特征融合向量c

         仔细观察互信息的表达式,可以发现互信息的表达式中含有x和c的联合分布,实际上预测样本和上下文信息c的联合分布无法获得,作者用神经网络来拟合互信息函数,具体的讲解在后面。

      最后作者使用InfoNCE作为损失函数,来优化模型,使得x与c之间的互信息最大。


对比学习核心思想

       这篇文章是基于对比学习的思想来做时序预测,对比学习的核心就是找到一个合适的编码,将原始特征编码到隐藏空间,使得正样本对之间的距离近,负样本对之间的距离远。对比学习会选用一个anchor,一个正样本和anchor形成正样本对,一个负样本和anchor形成负样本对。在这篇文章中,anchor为历史的时序编码经过自回归模型的输出c,正样本为该视频的未来一个采样序列的编码z_{t},负样本为随机从其他视频采样的一个序列片段的编码z^{*}

       模型的目标是拉进c与z_{t}的距离,推远c与z^{*}的距离,为何通过这样的做法就等价于最大化c 与z_{t} 之间的互信息呢,后面会有讲解,这里先记住这个概念。


四、Mutual Informatica&Info NCE(互信息和信息熵损失)

互信息

    互信息(mutual information)就是表示两个变量之间的相关性,I(X;Y)表示XY的互信息。

    XY的互信息表示由于Y的引入而导致X熵的减小,也就是X的不确定度的减小的量。在论文中,作者通过最大化I(x|c)来使得模型充分学习现在上下文c的信息来使得未来x的不确定性减小,从而起到预测效果。

      如果用当前的c去预测k个时刻之后的z_{t+k},作者没有采用生成模型P(x_{t+k}|c)来预测未来的样本,而是最大化x_{t+k}c之间的互信息,从而使得预测的\hat{z}_{t+k}与真实值z_{t+k}尽可能相似。

       从互信息的表达式中可以看出,计算互信息需要得到xc之间的联合分布概率,实际中很难计算这个联合分布,为此,将互信息看作是关于联合分布p(x,c)\tiny log(\frac{p(x|c)}{p(x)})的期望,最大化互信息,也就是最大化\tiny log(\frac{p(x|c)}{p(x)})关于联合分布p(x,c)的期望值。


      为何对比学习的做法可以等价于优化互信息(噪声对比估计(NCE))

      可以这样理解:通过对比学习的方式来训练,这个模型现在做的事是,给定一个batch为N个样本,其中只有第i个样本为正样本,其余N-1个都为负样本,模型能分辨出哪个样本是正样本,也就是公式左边的给定X和\tiny c_{t},模型能正确将第i个样本是正样本,我们要使得这个概率最大化。右式分子代表采样N个样本,其中第i个为正样本,其余为负样本的概率。右式分母表示随机一个为正样本的概率之和。为此,右式的分子就是互信息中的\tiny log(\frac{p(x|c)}{p(x)})项。为此模型能正确分辨出第i个样本是正样本,就是在最大化分子,也就是最大化互信息。

       为此,只要找到一个函数来衡量 \frac{p(x_{t+k}|c_{t})}{p(x_{t+k})} 的大小,就可以间接衡量了xc之间的互信息的大小,直观上,xc之间的互信息越大,代表从p(x_{t+k}|c_{t})采样得到x_{t+k}的概率大于从一个随机分布p(x)中采样x_{t+k}的概率,在文章中作者采用线性矩阵W乘以c_{t}作为预测值,而 z_{t+k}为真实值,即用以下式子来衡量相似度,代码实现中是采用神经网络来拟合互信息函数。


InfoNCE

        通过上面的分析,已经建立了最大化互信息,就可以使得样本正确识别出正样本,如何证明优化损失函数InfoNCE就是在优化互信息。

        作者对互信息的公式进行分析,得到了互信息的下界,互信息的下界的相反数为InfoNCE Loss,也就是最小化InfoNCE Loss来最大化互信息的下界,从而使得互信息最大。从下面式子中也可以看出,想要得到更好的优化效果,需要N的值尽量大,也就是batch_szie尽量大。

       
     从另外一个角度看,损失函数实际上也可以看作一个二分类交叉熵损失,其中X=(x_{1},x_{1},x_{1}, x_{1}...x_{N})是一组样本,其中有一对正样本对和 N-1对负样本对,分子视为是计算正样本对之间的相似度,分母视为计算所有样本对之间的相似度。
       为了优化改损失,希望分子越大,分母越小,也就符合了对x与 c 之间互信息最大化的要求,即正样本对之间的互信息更大,负样本对之间的互信息更小。


五、result(实验结果)

       CPC网络应用于语音、文本,通过不同的步长来采样正样本,负样本从不同的序列中随机采样得到。图二表示的是CPC经过学习之后得到的特征分布,能够很好地将不同类样本分开,图三表示预测不同步长的语音结果,从图中可以看出预测的值越远,准确率越低。

从表格1可以看出,CPC的性能,在不同数据集上可以很接近有监督学习的效果。

CPC应用于图像任务中,采用overlap的形式对图像进行切分,然后用前面几个patch来预测后面几个patch的信息,相对视频和语音数据集而言,图片预测的效果并没有那么好,个人觉得可能是图片切分之后,有些patch含有的噪声过多,而前面patch和后面patch之间的互信息很难最大化。

以上就是这篇CPC的分享内容,第一次写博客,如果有错误的地方,烦请大家指正,谢谢。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/58973.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

论文阅读和分析: “How Attentive are Graph Attention Networks?”

下面所有博客是个人对EEG脑电的探索,项目代码是早期版本不完整,需要完整项目代码和资料请私聊。 数据集 1、脑电项目探索和实现(EEG) (上):研究数据集选取和介绍SEED 相关论文阅读分析: 1、EEG-SEED数据集作者的—基线论文阅读和…

论文阅读和分析:Graph Attention Networks

Graph Attention Networks 图注意力网络(GAT) 通过堆叠节点能够关注其邻域特征的层,能够(隐式地)为邻域中的不同节点指定不同的权重,而不需要任何类型的代价高昂的矩阵运算(例如矩阵转置&…

chatgpt赋能python:Python实现屏蔽多行的方法

Python 实现屏蔽多行的方法 作为一位有10年 Python 编程经验的工程师,我深知在实际开发过程中,屏蔽多行代码常常是必须的。在此,我将介绍几种 Python 屏蔽多行代码的方法,希望对读者有所帮助。 方法一:使用注释 在 …

chatgpt赋能python:Python圆柱体的体积计算代码

Python圆柱体的体积计算代码 作为一名具有10年Python编程经验的工程师,今天我来为大家分享Python圆柱体的体积计算代码。在这篇文章中,我将介绍如何使用Python编写一个简单的程序来计算圆柱体的体积,并解释一些关于圆柱体及如何计算其体积的…

让ChatGTP来为我们写一个计算任意位数圆周率的程序

最近在学习python,突然想编写一个计算圆周率pi的程序,可是对python库不是很熟悉,又不会手撸pi的计算函数所以就想起了ChatGPT,想让他来帮帮忙,顺便学习学习,废话不多说,看聊效! &am…

chatgpt赋能python:Python编程教程:如何计算小数点后1000位

Python编程教程:如何计算小数点后1000位 Python是一种高级编程语言,被广泛应用于数据科学、人工智能、Web开发等领域。今天我们来学习如何使用Python计算小数点后1000位。 为什么需要计算小数点后1000位? 在实际应用中,有时需要…

chatgpt赋能python:Python求面积计算的实现方法

Python求面积计算的实现方法 介绍 Python是一种高级编程语言,由于其简单易学,易于编写和调试,以及广泛的功能库,使其成为许多领域中的流行语言。 Python被广泛用于科学计算,数据分析,Web开发,…

chatgpt赋能python:Python计算圆柱体的表面积和体积

Python计算圆柱体的表面积和体积 Python是一种经典的动态编程语言,由于其易学易用,逐渐成为了众多程序员喜爱的语言之一。Python在科学计算领域也非常流行,因为其具有强大且易于使用的数学和统计函数库。在本文中,我们将介绍如何…

chatgpt赋能python:Python数学计算利器-Math库

Python数学计算利器 - Math库 Python作为一种高级编程语言,自然也包含了许多与数学计算相关的库。而其中最为常用的库之一便是Math库。 Math库主要用于执行基本的数学运算,如三角函数、指数函数、对数函数等等。使用Math库可以使Python编程更加方便和高…

chatgpt赋能python:Python计算圆柱侧面积的方法

Python计算圆柱侧面积的方法 圆柱是常见的几何体之一,其侧面积的计算是学习数学和物理时的重要部分。在计算侧面积时,Python是一种常用的编程语言之一,本文将向您介绍使用Python计算圆柱侧面积的方法。 圆柱侧面积的定义 圆柱侧面积是指圆…

chatgpt赋能python:Python如何计算圆的面积和体积

Python如何计算圆的面积和体积 在工程和科学领域中,经常需要计算圆形物体的面积和体积。Python是一种流行的编程语言,可以使用它来编写计算圆形物体面积和体积的程序。接下来,让我们深入探讨如何使用Python计算圆形物体的面积和体积。 圆形…

chatgpt赋能python:Python计算圆的面积方法

Python计算圆的面积方法 作为一门非常受欢迎的编程语言,Python已经被广泛应用于各个领域。在数学计算方面,通过Python可以快速准确地计算一系列的数学问题,比如计算圆的面积。本文将介绍Python计算圆面积的方法。 什么是圆的面积&#xff1…

chatgpt赋能python:Python计算圆面积方法教程

Python计算圆面积方法教程 你是否想过如何用Python计算圆面积?圆形是一个基本的几何形状,计算圆的面积是一个必要的技能。Python作为一种流行的编程语言,可以帮助我们更轻松地计算圆的面积。本教程将介绍如何使用Python计算圆的面积。 什么…

chatgpt赋能python:Python计算球体表面积和体积

Python计算球体表面积和体积 如果您需要计算球体的表面积和体积,那么Python可以成为您的助手。Python在科学计算领域中越来越受欢迎,因为它是一个灵活且易于使用的语言。Python拥有大量的科学计算库,其中一些专用于计算几何体的表面积和体积…

chatgpt赋能python:如何用Python计算球的表面积和体积

如何用Python计算球的表面积和体积 球体是数学中的常见图形,计算球的表面积和体积是科学研究和应用中的重要问题。Python作为一种高效、易学、广泛使用的编程语言,可以很方便地用于计算球的表面积和体积。 本篇文章将会介绍如何用Python计算球的表面积…

chatgpt赋能python:用Python计算圆柱体面积和体积

用Python计算圆柱体面积和体积 如果你正在寻找一种简单而有效的方法来计算圆柱体的面积和体积,那么Python编程语言可以成为你的得力助手。Python是一种简单易用且功能强大的编程语言,非常适合用于处理数学问题。 什么是圆柱体? 圆柱体是一…

chatgpt赋能python:Python计算圆的周长

Python计算圆的周长 Python是一种简单易学的编程语言,被广泛应用于各种领域,包括科学、数据分析、网站开发等等。在本文中,我们将介绍如何使用Python计算圆的周长。 什么是圆的周长 圆的周长是指圆周的长度,也就是圆内任意两点…

chatgpt赋能python:Python计算圆的半径

Python计算圆的半径 Python是一种流行的编程语言,其语法简单易懂,使其成为了很多编程初学者的选择。在编程中,计算圆的半径是一项非常基本的任务,本文将重点介绍使用Python计算圆的半径的方法。 圆的半径是什么? 在…

chatgpt赋能python:用Python计算pi的方法及其优势

用Python计算pi的方法及其优势 Python是一款易学易用且功能强大的编程语言。其广泛的应用范围涵盖数据科学、网络编程、后端开发等多个领域。其中,Python还可以被用来计算数学常数,比如圆周率pi。本文将介绍Python计算pi的方法及其优势。 Python计算pi…

chatgpt赋能python:Python计算圆柱体体积

Python计算圆柱体体积 圆柱体是一种常见的几何体,其体积的计算十分重要。Python作为一种高效便捷的编程语言,可以很好地完成圆柱体体积的计算。 什么是圆柱体 圆柱体是由两个平行圆面和它们之间的曲面组成的几何体。其中,底面圆面的半径称…