基于CNN的增量学习论文的读后感

最近在阅读几篇基于CNN的增量学习的论文。

《INCREMENTAL LEARNING WITH PRE-TRAINED CONVOLUTIONAL NEURAL NETWORKS AND BINARY ASSOCIATIVE MEMORIES》

09-19 阅读

第一篇论文是《INCREMENTAL LEARNING WITH PRE-TRAINED CONVOLUTIONAL NEURAL NETWORKS AND BINARY ASSOCIATIVE MEMORIES》,这篇论文的实现思路算是比较简单,利用预训练的CNN作为特征提取器,然后使用PQ对特征编码,然后使用 Binary associative memories 进行存储和分类。

首先是介绍了增量学习的四个定义:
1. 新样本可以学习新的信息;
2. 不需要旧的数据,减少内存使用;
3. 保留学过的信息,避免灾变性失忆;
4. 适应新类别数据。

而过去的工作主要使用的方法有:
1. 为新的数据训练新的分类器,比如 learn++方法;
2. 加入新数据后训练旧模型得到新的模型;
3. 结合SVMs和learn++的“SVMlearn++”方法,但每次有新数据仍然需要训练一个新的SVM,并且会丢失部分旧信息。

为了解决这些方法的固有问题,需要重新训练模型,并且会丢失部分信息,本文的方法就是利用预训练的CNN作为特征提取器,然后使用PQ对特征编码,然后使用 Binary associative memories 进行存储和分类。

整体实现如下图所示:

基于CNN的增量学习论文的读后感_第1张图片

这里比较关键的是第二步,即特征编码,作者使用的是PQ(Product Quantization)[1]方法,实现代码可以参考[2]和[3],这个方法应该是有个比最近邻搜索方法要更加高效的方法。

这个方法的做法是对于第一步提取的特征向量 xm ,用随机挑选的K个参考点,相互独立的量化成P个大小相等的子矩阵 xmp,1pP 。这里的参考点 Yp=yp1,yp2,......,ypK ,且有 xmX,xmp=yKp

第二步最终是将特征向量都通过一个字母表(也就是参考点的字母表)转换成一个固定长度的单词 qmp,1pP ,然后通过一个二进制稀疏的联合内存(binary sparse
associative memory)[4]将这些点一一联系到一个输出的类别,也就是需要将一个对应于 qmp 的神经元 npk 关联到对应输出类别 cm ηc,1cC ,C是类别的数量。这里就是对应上图中步骤三的步骤了。

这里第二步的特征编码方法,其实非常类似于Bag of Words,同样也是一种特征编码方法,使用的是kmeans方法,而kmeans需要设置k个中心,这个等同于K个参考点,最终将特征向量变成 mk 大小的矩阵,m是样本数量,而论文的方法,应该是得到 PK ,或者应该是P个大小为K的向量,但这只是根据上图和论文的表达猜测得到的。

此外,训练过程不会改变预训练的CNN网络,而联合内存会在得到新的样本或者新类别的样本后进行修改。

论文选择了Cifar10和两个ImageNet的子数据集进行实验,类别分别从0到10增加,然后也对比使用了最近邻搜索的方法,最近邻搜索的方法是比论文使用的PQ的结果要好一些,但是PQ计算更快,内存使用更少,实用性更高。

读后感:
大概了解整个方法的实现流程,但是还是有些疑惑,如何实现这个增量学习的步骤,训练部分肯定是按照上图来一遍的,但是出现新数据后,也是继续用CNN提取特征,然后特征编码,再用这个二进制联合内存来分类,或者是修改这个分类器,如果是这样的话,其实也就是重新训练模型了,还是说,修改的是一种映射关系呢,即 npk ηc 的对应关系。

参考文献:
1. Product Quantization for Nearest Neighbor Search
2. Product Quantization for Nearest Neighbor Search论文实验
3. Github-yahoo/lopq: Training of Locally Optimized Product Quantization (LOPQ) models for approximate nearest neighbor search of high dimensional data in Python and Spark.
4. Sparse Neural Networks With Large Learning Diversity

你可能感兴趣的:(论文阅读,深度学习)