关于CPC
你好,感谢你的贡献,关于Cross_CPC,我有几个问题: 1、关于nce损失的计算,nce算的是2.2倍batchsize(CPC.py中的第88-91行),但是最后却只除了1个batchsize。我想知道nce的值是很大的吗?因为,我在自己的数据集上验证,发现初始时这个值很大。 2、由于我自己的数据集没有时间这一维度,因此,我是将A模态的vq作为predictor的输入,预测B模态的vq,然后计算nce。请问这样计算是可行的吗?有别的方法使它们的互信息最大吗?
- NCE的初始值是很大的
- 如果你的数据没有时间维度,我建议你换成InfoNCE来做对比学习,它相当于没有时间维度的CPC,CPC和InfoNCE的最大区别主要就在于时间维度上的预测。
请问是直接使用vq计算InfoNCE吗?InfoNCE是这样计算吗: lsoftmax = nn.LogSoftmax(dim=0) total1 = torch.mm(a_vq, torch.transpose(b_vq, 0, 1)) nce += torch.sum(torch.diag(self.lsoftmax(total1)))
你可以试试直接用别人实现的库:https://github.com/RElbers/info-nce-pytorch
下面是我举的一个例子,不一定正确,你可以参考一下,或者去看上面那个库里面的例子: pip install info-nce-pytorch from info_nce import InfoNCE infonce = InfoNCE() infonce_loss = infonce(x, y) 其中x, y的shape是[B, D]
好的,感谢!
你好!请教如下几个问题: 1)请问使用cross-CPC实现从模态A预测模态B,是在VQ之前还是之后?从论文的Fig.2中看,是先Cross-CPC,然后才是Multi-Modal VQ;但是从代码来看,Encoder的输出好像是已经对fetures进行了VQ
你好!请教如下几个问题: 1)请问使用cross-CPC实现从模态A预测模态B,是在VQ之前还是之后?从论文的Fig.2中看,是先Cross-CPC,然后才是Multi-Modal VQ;但是从代码来看,Encoder的输出好像是已经对fetures进行了VQ
你好,论文里的Fig.2是一个思路图,不是对代码的完整复述。从代码的实现上,我们是先进行了VQ再进行Cross-CPC,参与Cross-CPC的并不是vq,而且semantic_result,所以vq并不会影响Cross-CPC,具体的代码你可以参考https://github.com/haihuangcode/CMG/blob/master/code/src/pretrain.py 的597-613行。
你好!请教如下几个问题: 1)请问使用cross-CPC实现从模态A预测模态B,是在VQ之前还是之后?从论文的Fig.2中看,是先Cross-CPC,然后才是Multi-Modal VQ;但是从代码来看,Encoder的输出好像是已经对fetures进行了VQ
你好,论文里的Fig.2是一个思路图,不是对代码的完整复述。从代码的实现上,我们是先进行了VQ再进行Cross-CPC,参与Cross-CPC的并不是vq,而且semantic_result,所以vq并不会影响Cross-CPC,具体的代码你可以参考https://github.com/haihuangcode/CMG/blob/master/code/src/pretrain.py 的597-613行。
谢谢您的回复。又重新看了代码,有如下问题,请帮忙分析下: 1)通过CLUB-based MI Minization进行feature disentanglement时,在mi_first_forward()中,使用的是semantic results的VQ后的特征与encoder_results,为什么不是semantic_results与encoder_results?此外,为什么将输入的results均detach(),这样岂不是不更新所有对应的encoders?那计算loss有什么用处呢?如何实现disentanglement?mi_first_forward()的作用是什么?同时,mi_second_forward()中的audio_class, video_class, text_class为什么没有加在总loss中进行backward? 2)最终的unified codebook应该是融合所有模态特征后的codebook吧?而非每种模态都有自己对应的codebook? 3)论文framework中的Multi-modal Vector Quantization模块是否对应着Multi-modal Exponential Moving Average (MM-EMA),实现两个模态的vq的对齐?MM-EMA的输出是一个vq feature还是两个或三个vq features?从论文的“Given a code vector ei, we can obtain nai semantic vectors of modality A and nbi semantic vectors of modality B”来看,获取的unified codebooks中的每个向量应该是融合了所有模态的feature吧? 4)推理阶段可否仅有一种模态,如仅audio,实现多模态的下游任务?尤其是当codebooks中是融合力所有模态feature的假设下。若可以,具体步骤是否为如下:audio输入至Audio Semantic Encoder提取到audio semantic features,随后输入至Cross-CPC预测video semantic features;接着,audio与video semantic features分别进行VQ,得到audio-vq和预测的video-vq;最后,输入到下游任务网络?
问题较多,期待您的回复!
你好!请教如下几个问题: 1)请问使用cross-CPC实现从模态A预测模态B,是在VQ之前还是之后?从论文的Fig.2中看,是先Cross-CPC,然后才是Multi-Modal VQ;但是从代码来看,Encoder的输出好像是已经对fetures进行了VQ
你好,论文里的Fig.2是一个思路图,不是对代码的完整复述。从代码的实现上,我们是先进行了VQ再进行Cross-CPC,参与Cross-CPC的并不是vq,而且semantic_result,所以vq并不会影响Cross-CPC,具体的代码你可以参考https://github.com/haihuangcode/CMG/blob/master/code/src/pretrain.py 的597-613行。
1)你好!意思是Encoder编码后既输出了semantic_result,也输出了vq。semantic_result输入到Cross-CPC进行基于时序的跨模态预测,vq用于更新每个模态对应的codebook,这样理解对吗? 2)最终的unified codebook是所有模态融合后的codebook,还是每种模态都有自己对应的codebook? 3)论文framework中的Multi-modal Vector Quantization模块是否对应着Multi-modal Exponential Moving Average (MM-EMA),实现两个模态的vq的对齐?MM-EMA的输出是一个vq feature还是两个或三个vq features?从论文的“Given a code vector ei, we can obtain nai semantic vectors of modality A and nbi semantic vectors of modality B”来看,获取的unified codebooks中的每个向量应该是融合了所有模态的feature吧? 4)推理阶段可否仅有一种模态,如仅audio,实现多模态的下游任务?尤其是当codebooks中是融合力所有模态feature的假设下。若可以,具体步骤是否为如下:audio输入至Audio Semantic Encoder提取到audio semantic features,随后输入至Cross-CPC预测video semantic features;接着,audio与video semantic features分别进行VQ,得到audio-vq和预测的video-vq;最后,输入到下游任务网络?
期待您的回复
1) 是的 2) unified codebook是所有模态融合后的codebook,只有一个 3) Multi-modal Vector Quantization模块对应MM-EMA,帮助不同模态的vq更进一步的在unified codebook里对齐; MM-EMA的部分建议你看代码更清楚,https://github.com/haihuangcode/CMG/blob/master/code/src/model/main_model_2.py 的第1000行的Cross_VQEmbeddingEMA类对应2个模态的MM-EMA,而569行的Cross_VQEmbeddingEMA_AVT类对应3个模态的MM-EMA; 4) 推理时可以只输入一种模态,但是我并不是使用Cross-CPC预测的,在本文中Cross-CPC只是训练时帮助不同模态对齐的手段,而实际在我们提出的 Cross Modal Generalization (CMG) 这个任务中,是直接以输入的模态进入unified codebook得到的vq作为不同模态的general语义信息,可以直接作为其他模态下游的输入,以本文CMG的AVE分类任务(tab.1)为例,即在下游时微调一个线性层(即linear probe),其余部分冻结(包括encoder以及codebook),如果微调 训练 时的模态是视频,测试 时可以是音频或文本等其他模态,以此判断模型的跨模态泛化能力,从而体现不同模态的对齐程度,当然也可以下游微调的训练模态是音频,测试是视频。
你好!请教如下几个问题: 1)请问使用cross-CPC实现从模态A预测模态B,是在VQ之前还是之后?从论文的Fig.2中看,是先Cross-CPC,然后才是Multi-Modal VQ;但是从代码来看,Encoder的输出好像是已经对fetures进行了VQ
你好,论文里的Fig.2是一个思路图,不是对代码的完整复述。从代码的实现上,我们是先进行了VQ再进行Cross-CPC,参与Cross-CPC的并不是vq,而且semantic_result,所以vq并不会影响Cross-CPC,具体的代码你可以参考https://github.com/haihuangcode/CMG/blob/master/code/src/pretrain.py 的597-613行。
1)你好!意思是Encoder编码后既输出了semantic_result,也输出了vq。semantic_result输入到Cross-CPC进行基于时序的跨模态预测,vq用于更新每个模态对应的codebook,这样理解对吗? 2)最终的unified codebook是所有模态融合后的codebook,还是每种模态都有自己对应的codebook? 3)论文framework中的Multi-modal Vector Quantization模块是否对应着Multi-modal Exponential Moving Average (MM-EMA),实现两个模态的vq的对齐?MM-EMA的输出是一个vq feature还是两个或三个vq features?从论文的“Given a code vector ei, we can obtain nai semantic vectors of modality A and nbi semantic vectors of modality B”来看,获取的unified codebooks中的每个向量应该是融合了所有模态的feature吧? 4)推理阶段可否仅有一种模态,如仅audio,实现多模态的下游任务?尤其是当codebooks中是融合力所有模态feature的假设下。若可以,具体步骤是否为如下:audio输入至Audio Semantic Encoder提取到audio semantic features,随后输入至Cross-CPC预测video semantic features;接着,audio与video semantic features分别进行VQ,得到audio-vq和预测的video-vq;最后,输入到下游任务网络? 期待您的回复
1) 是的 2) unified codebook是所有模态融合后的codebook,只有一个 3) Multi-modal Vector Quantization模块对应MM-EMA,帮助不同模态的vq更进一步的在unified codebook里对齐; MM-EMA的部分建议你看代码更清楚,https://github.com/haihuangcode/CMG/blob/master/code/src/model/main_model_2.py 的第1000行的Cross_VQEmbeddingEMA类对应2个模态的MM-EMA,而569行的Cross_VQEmbeddingEMA_AVT类对应3个模态的MM-EMA; 4) 推理时可以只输入一种模态,但是我并不是使用Cross-CPC预测的,在本文中Cross-CPC只是训练时帮助不同模态对齐的手段,而实际在我们提出的 Cross Modal Generalization (CMG) 这个任务中,是直接以输入的模态进入unified codebook得到的vq作为不同模态的general语义信息,可以直接作为其他模态下游的输入,以本文CMG的AVE分类任务(tab.1)为例,即在下游时微调一个线性层(即linear probe),其余部分冻结(包括encoder以及codebook),如果微调 训练 时的模态是视频,测试 时可以是音频或文本等其他模态,以此判断模型的跨模态泛化能力,从而体现不同模态的对齐程度,当然也可以下游微调的训练模态是音频,测试是视频。
感谢您的回复!仍有如下问题,请您帮忙分析: 1)通过CLUB-based MI Minization进行feature disentanglement时,在mi_first_forward()中,使用的是semantic results的VQ后的特征与encoder_results,为什么不是semantic_results与encoder_results?此外,为什么将输入的results均detach(),这样岂不是不更新所有对应的encoders?那计算loss有什么用处呢?如何实现disentanglement?mi_first_forward()的作用是什么?同时,mi_second_forward()中的audio_class, video_class, text_class为什么没有加在总loss中进行backward? 2) 下游任务只输入一个模态的流程:若推理仅输入video,则此video首先进入Encoder,从unified codebook中找到最近邻的表征;之后冻结Encoder,并使用此表征微调下游任务的线性层,即可。请问以上流程有问题吗?此外,若对,如何保证仅输入video至Encoder得到的unified codebook表征是正确的呢?CMG预训练时,并没有对仅输入单一模态时获取的unified codebook表征进行约束?举一个不太贴切的例子,赌王和他的四房太太有多个儿子,当输入赌王和x房太太时,能够确定其儿子是哪个;但当把x房太太遮挡住、仅输入赌王时,就无法确切的知道对应的准确儿子是哪个。不知道此例子和仅输入单个模态时,从unified cokebook中找索引是否贴切,是否会出现同样的问题?
再次感谢您的分析!
感谢您的回复!仍有如下问题,请您帮忙分析: 1)通过CLUB-based MI Minization进行feature disentanglement时,在mi_first_forward()中,使用的是semantic results的VQ后的特征与encoder_results,为什么不是semantic_results与encoder_results?此外,为什么将输入的results均detach(),这样岂不是不更新所有对应的encoders?那计算loss有什么用处呢?如何实现disentanglement?mi_first_forward()的作用是什么?同时,mi_second_forward()中的audio_class, video_class, text_class为什么没有加在总loss中进行backward? 2) 下游任务只输入一个模态的流程:若推理仅输入video,则此video首先进入Encoder,从unified codebook中找到最近邻的表征;之后冻结Encoder,并使用此表征微调下游任务的线性层,即可。请问以上流程有问题吗?此外,若对,如何保证仅输入video至Encoder得到的unified codebook表征是正确的呢?CMG预训练时,并没有对仅输入单一模态时获取的unified codebook表征进行约束?举一个不太贴切的例子,赌王和他的四房太太有多个儿子,当输入赌王和x房太太时,能够确定其儿子是哪个;但当把x房太太遮挡住、仅输入赌王时,就无法确切的知道对应的准确儿子是哪个。不知道此例子和仅输入单个模态时,从unified cokebook中找索引是否贴切,是否会出现同样的问题?
再次感谢您的分析!
1) vq是经过Straight-through estimator的结果,带有semantic result的梯度,直接用semantic result也行,与Cross-CPC不一样,那边是考虑到早期vq还没法较高程度的代表semantic result,所有Cross-CPC是用semantic result而不是vq,这里的mi_first_forward互信息分离在每个大的整体forward里会执行多次(mi_iter)所有用vq也能收敛;detach()是以为mi_first_forward不是为了更新encoders,而是更新互信息分离部分的参数,这里使用的optimizer都是单独设置的,你仔细看看代码就知道了,更新encoders是mi_second_forward()的事;audio_class, video_class, text_class这些是有监督才需要的,我这里对比学习是无监督,所以没用。 2)上述流程没问题;你举得的这个例子属于模态缺失领域的问题,我在设计本工作时只是为了讨论更高程度的统一表征,对标的是类似CLIP的操作,所以如果你想解决模态缺失的问题,需要关注那个领域的工作。