haihuangcode / CMG

The official implementation of Achieving Cross Modal Generalization with Multimodal Unified Representation (NeurIPS '23)
167 stars 2 forks source link

关于训练过程中的lld_loss和mi_loss #6

Open cwzhang98 opened 6 months ago

cwzhang98 commented 6 months ago

您好,我尝试follow您的工作,并迁移到其它领域,但是在训练过程中主要遇到了如下几个问题:

  1. lld_loss不收敛,导致互信息上界估计不准确,影响训练过程
  2. 使用mi_loss之后,模型参数中出现nan
  3. mi_loss随着训练过程越来越大

我尝试了调整mi_net的层数和学习率等方法,但是问题依然存在。

想请教您模型训练中的更多细节:

  1. 您的模型在训练过程中,lld_loss是否是逐渐收敛的,还是稳定在一个范围?
  2. 在mi_loss的反向传播中,mi_net的参数是否更新?
  3. mi_loss的训练过程大概如何,是否收敛?
haihuangcode commented 6 months ago

您的模型在训练过程中,lld_loss是否是逐渐收敛的,还是稳定在一个范围?

lld_loss是逐渐收敛的,如果我没记错的话,video的lld_loss会收敛到-256,text和audio的lld_loss会收敛到-128,这应该会随着您模型的改变而有区别,但是只要能到具体的某个值应该就是正常的。

在mi_loss的反向传播中,mi_net的参数是否更新?

lld_loss影响mi_net,mi_loss影响其他部分的模型,2边是独立的。所以在mi_loss的反向传播中,mi_net的参数不会更新。

mi_loss的训练过程大概如何,是否收敛?

mi_loss会逐渐收敛至接近0

我在进行一些尝试时也出现过mi_loss非常大的情况,这通常意味着互信息分离失败。可能是当前的编码器不够强,也可能是互信息分离的次数不够多(即代码里的mi_iters),或者(您所尝试的)模型设计有问题。

当然!如果您有任何其他问题或需要更详细的解释,请随时回复我。我会尽量帮助您解决问题。

makimon123 commented 5 months ago

您好,关于mi_loss我有一个相反的问题。在使用自己的数据集之后,从训练开始mi_loss的值就一直在0附近,在整个训练过程中变化很小,最后做跨模态匹配的效果不太理想。不知道您在前期实验过程中是否遇到过这样的问题,非常感谢您能为我答疑解惑!

haihuangcode commented 5 months ago

您好,关于mi_loss我有一个相反的问题。在使用自己的数据集之后,从训练开始mi_loss的值就一直在0附近,在整个训练过程中变化很小,最后做跨模态匹配的效果不太理想。不知道您在前期实验过程中是否遇到过这样的问题,非常感谢您能为我答疑解惑!

只要lld_loss和mi_loss都正常的话,说明模态自身的分离应该是成功的,但跨模态匹配的效果还取决于对齐部分的情况,你的模型和这边是类似的吗?如果是的话,会不会是模态对齐部分没有训练好?你可以提供更多细节,以方便我们进一步讨论。

makimon123 commented 5 months ago

您好,关于mi_loss我有一个相反的问题。在使用自己的数据集之后,从训练开始mi_loss的值就一直在0附近,在整个训练过程中变化很小,最后做跨模态匹配的效果不太理想。不知道您在前期实验过程中是否遇到过这样的问题,非常感谢您能为我答疑解惑!

只要lld_loss和mi_loss都正常的话,说明模态自身的分离应该是成功的,但跨模态匹配的效果还取决于对齐部分的情况,你的模型和这边是类似的吗?如果是的话,会不会是模态对齐部分没有训练好?你可以提供更多细节,以方便我们进一步讨论。

非常感谢您的回复,模型的总体架构是类似的,现在看来应该是对齐部分在训练中没有有效收敛,我再尝试一下不同的对齐方法,希望能有提升,再次感谢!

RIU-13 commented 2 months ago

您好,在我的训练过程中mi_loss和lld_loss会变成负值,这正常吗?按理说CLUB的loss应该都是正值?具体来说,我有两个模态,一个模态的mi_loss会越来越大(正值),一个模态的mi_loss会越来越小(负值)

haihuangcode commented 2 months ago

您好,在我的训练过程中mi_loss和lld_loss会变成负值,这正常吗?按理说CLUB的loss应该都是正值?具体来说,我有两个模态,一个模态的mi_loss会越来越大(正值),一个模态的mi_loss会越来越小(负值)

lld_loss是负值是正常的,mi_loss的话如果是非常接近0应该也算正常?如果是绝对值很大的负数那肯定是不正常的。主要看loss是不是收敛至某个值,mi_loss最好能接近0,lld_loss的话接近某个值(这个和模型有关)就行。 mi_loss如果是绝对值很大的负数,那它和很大的正数应该是类似的问题,这通常意味着互信息分离失败。可能是当前的编码器不够强,也可能是互信息分离的次数不够多(即代码里的mi_iters),或者(您所尝试的)模型设计有问题。

RIU-13 commented 2 months ago

您好,在我的训练过程中mi_loss和lld_loss会变成负值,这正常吗?按理说CLUB的loss应该都是正值?具体来说,我有两个模态,一个模态的mi_loss会越来越大(正值),一个模态的mi_loss会越来越小(负值)

lld_loss是负值是正常的,mi_loss的话如果是非常接近0应该也算正常?如果是绝对值很大的负数那肯定是不正常的。主要看loss是不是收敛至某个值,mi_loss最好能接近0,lld_loss的话接近某个值(这个和模型有关)就行。 mi_loss如果是绝对值很大的负数,那它和很大的正数应该是类似的问题,这通常意味着互信息分离失败。可能是当前的编码器不够强,也可能是互信息分离的次数不够多(即代码里的mi_iters),或者(您所尝试的)模型设计有问题。

感谢您的回答!是lld_loss为绝对值很大的负数和正数。mi_loss确实在0附近,也是一正一负。现在问题是acc很低,只有0.01,有的甚至是0。正在排错中