前言
- DCC算法是用来解决深度网络自适应问题的算法,属于迁移学习与深度学习结合的产物。
- 从最开始的时候,通过微调(finetune)可以实现一定程度的深度自适应,但是它有一个致命缺点就是无法处理源数据(source)和目标数据(target)分布不一样的情况,然而在现实生活中这种情况的出现是十分频繁的,也就是说,要想进一步拓展迁移学习与深度学习的结合,必须克服这个问题。
- 有人在2014年提出了DaNN,它作为一个引子,后面人们在此基础上进行了很多改进,DCC是继承其思想的一种方法。
正文
- 本文主要介绍DCC的算法思路,有需要代码介绍的可以参考这篇博文,非常详细:https://blog.csdn.net/weixin_40585997/article/details/110939689,建议看一下,我也是看完代码之后才更加加深了对于DCC的理解。
- 好,言归正传,下面是DCC的产生背景
- 接着是DCC算法的示意图
意思就是说,拿到源数据(Labeled Images)和目标数据(Unlabeled Images)后,首先它们执行同样的操作,即依次通过前七层神经网络,然后呢,把得到的特征向量执行一个操作,就是求此时两类数据的数据分布差异,通常用MMD来衡量这个差异,并将其加入到最后的Loss中用于优化这个差异,所以说最后的Loss其实是由两部分组成的,一个是源数据经过训练后进行分类的交叉熵损失,还有一部分就是这里MMD求的差异,即:
其实DDC没有作什么特别神奇的事情,它只不过在最接近输出的前一层多计算了一个损失,用于优化源数据和目标数据的数据分布差异,试图克服前面提到的目标数据和源数据由于数据分布差异导致的无法使用finetune的问题。 - 那为何要在最后一层的前一层加入这个损失呢,为何不能在更前面计算?因为作者使用的是AlexNet网络作为模型,经过试验之后发现在最后一层的前一层加入得到的效果最好。其实这是符合我们认知的,在倒数第二层得到的是最终的特征,前几层都是对于特征的处理,我们当然是要在你处理完特征之后,对于得到的特征进行求损失才最好,这样优化的时候优化的参数就是前七层对于特征的处理过程中的参数,优化它们才能期望得到更小的损失,从而使得目标数据通过前七层后得到的特征和真正的源数据通过前七层后得到的特征的差异更小,不就相当于使源数据和目标数据的数据分布尽可能相同了嘛,然后后面的分类器根据特征分布更新参数,仅可能正确分类,从而降低分类的交叉熵损失。
- DCC算法貌似并没有那么复杂,更像是一种思想,后面很多算法都是根据这种思想来进行优化的。