一、什么是迁移学习 迁移学习指的是利用预训练模型(神经网络的权重和参数都已经被其他人利用更大规模的数据集训练好了)并用自己的数据集将模型「微调」的过程。这种思路中预训练模型扮演着特征提取器的角色。你将移除网络的最后一层并用你自有的分类器置换(取决于你的问题空间)。然后冻结其他所有层的权重并正常训练该网络(冻结这些层意味着在梯度下降/最优化过程中保持权值不变)。 二、人的大脑神经元同时处于激活状态的比例是多少 从脑神经科学的角度来看,大脑神经元只有1%~4%的部分同时处于激活状态,这是大脑在表现丰富性和能量消耗之间做的一个平衡,所以说大脑中神经元的激活其实是处于一种稀疏状态的。(摘抄自:《Deep Sparse Rectifier Neural Networks》) 三、残差连接是什么 网络层数增加了,根据导数的链式法则,就容易出现梯度消散或爆炸等问题。例如,如果各网络层激活函数的导数都比较小,那么在多次连乘后梯度可能会越来越小,这就是常说的梯度消散。对于深层网络来说,传到浅层,梯度几乎就没了。
在解决这类问题时,除了采用合适的激活函数外,还有一个重要技巧,即使用残差连接。
如上图所示,每一个导数都加上了一个恒等项1,dh/dx = d(f + x)/dx = 1 + df/dx。此时就算原来的导数df/dx很小,误差仍然能够有效地反向传播,这也是残差连接的核心思想。 四、迁移学习和微调是啥关系 其实 “Transfer Learning” 和 “Fine-tune” 并没有严格的区分,含义可以相互交换,只不过后者似乎更常用于形容迁移学习的后期微调中。 我个人的理解,微调应该是迁移学习中的一部分。微调只能说是一个trick。 五、如何微调 对于不同的领域微调的方法也不一样,比如语音识别领域一般微调前几层,图片识别问题微调后面几层,这个原因我这里也只能讲个大概,具体还要大神来解释:
- 对于图片来说,我们CNN的前几层学习到的都是低级的特征,比如,点、线、面,这些低级的特征对于任何图片来说都是可以抽象出来的,所以我们将他作为通用数据,只微调这些低级特征组合起来的高级特征即可,例如,这些点、线、面,组成的是圆还是椭圆,还是正方形,这些代表的含义是我们需要后面训练出来的。
- 对于语音来说,每个单词表达的意思都是一样的,只不过发音或者是单词的拼写不一样,比如 苹果,apple,apfel(德语),都表示的是同一个东西,只不过发音和单词不一样,但是他具体代表的含义是一样的,就是高级特征是相同的,所以我们只要微调低级的特征就可以了。
另外, 1.新数据集和原始数据集合类似,那么直接可以微调一个最后的FC层或者重新指定一个新的分类器 2.新数据集比较小和原始数据集合差异性比较大,那么可以使用从模型的中部开始训练,只对最后几层进行fine-tuning 3.新数据集比较小和原始数据集合差异性比较大,如果上面方法还是不行的化那么最好是重新训练,只将预训练的模型作为一个新模型初始化的数据 4.新数据集的数据尺寸大小一定要与原始数据集相同,比如CNN中输入的图片大小一定要相同,才不会报错
六、如何对推理做加速
- onnx
- tensorRT
- 模型蒸馏
参考文献:
- https://www.zhihu.com/question/52668301
- 《Deep Sparse Rectifier Neural Networks》
- https://www.51cto.com/article/667563.html
- https://blog.csdn.net/weixin_40852935/article/details/115461422 (讲述finetune相关)
|