神经网络的一些简单思考

简单来理解一个模型,其实就是一个转换器,或者说其实就充当了一个复杂函数的角色,能够将输入的数据转换成另外一种形式呈现,如果转换出来的数据形式对于相应的任务足够直观,那么就很容易实现相应的任务。 从现在来看,元学习跟起初的构想已经产生了一些差异,最初的元学习构想的是让机器学会如何学习,但这只是一个概念,实际上来看其实并没有真正的达到这一点。 一般的迁移学习中,通常是先针对一个任务训练出一个模型,然后假设目标分布与这个训练出来的模型是可以进行映射转换,因此可以寻找出一个函数,如果模型与相近任务比较近似,这样的转换函数显然会相对简单,因此通过一般的神经网络往往就可以拟合出来。 元学习所不同的是,将多个任务都加以训练,然后综合找出来一个适合各个任务的一个,这个值相当于是妥当了多个任务后所得到一个考虑了各方面所得到的协调值,然后将此作为基础模型。 简单来说,一般的神经网络,比如二分类形状时,可以学习什么是方形,什么是非方形,如果多分类时,则可以对非方形的结果,进行再次分类,比如分成三角形或圆形,这种往往可以获取比较好的效果。 另外还有一种就是输出可以是多个结果,但是采用softmax的结果,来表达输入的数据,分别可能是哪个形状的概率是多少,然后按最大概率进行取用,比如类似VGG16就是这样的方法。 而元学习里,则会训练出来一个可以粗略判断方、圆、三角的模型,这个模型是在已有的数据中推出来的,因此操作方法上与直接拟合有所区别,目的试图提升的模型的泛化能力。 1、采用两个网络组进行拟合 如果两个网络相同的时候,则称之为挛生网络(SNN),如果两个网络结构且不共享参数时,称为伪孪生神经网络(PSNN),其实也就是异构网络,这里的关键是损失函数的结果LOSS是分别两个网络生成结构共同计算出来的。 由于两个输入是不同的数据,通过loss来控制参数的更新,对于已经标注的数据,输出可以是0或1,表示相似或不相似。 这样设计的网络显然有一个很巧妙的特点就是,假如是进行图片分类的,那么可以将同一类数据作为组合输入,最终它能够很好提取出同类数据的特征。 比如数据是图片的话,对于新的数据,只需要比较与已有的图片相似度,便可知道是否是同一类图片。 进一步的改进则是关系网络,即Relation Network(RN),这个网络在上述基础上进一步改进在于,原本是将输入数据经过模型计算出来的结果数据,直接进行比较相似度,现在改成了用加入一个子网络来转换然后计算它们之间的距离。 直观的感受就是,只是用一个网络转换输入数据,程度仍然“不够深“,表达1-shot尚可,但需要更精细的进修,生成的数据,还需要加一个网络来进行转换,这样才“更可信” 从论文上列出来的数据来看: 当随机取20个样本,进行分类时,基本的卷积孪生网络效果有较大下降,但RN效果还比较稳定,另外在经典的MAML元学习算法中,效果也比较稳定。 这里需要提及一下比RN更早的Prototypical Net,它的思路比较有特点,而且极其简单,主要是对数据进行集中的随机采样,然后求出平均值。这里利用了布雷格曼散度(gular Bregman divergences),即:对于一些点满足任意的概率分布的情况下,这些点的平均值点(mean point)一定是空间中距离这些点的平均距离最小的点,然后将这些点构成一个矩阵,称作meta data vector,然后仅仅采用欧几里得距离计算相似度,便可以得到非常好的效果。 在2020年,Han-Jia Ye和Hexiang Hu将原始数据通过ResNet转换后,再通过这样的方式来进行分类,效果在miniImageNet数据集上的5way-1shot情景分类精度提高到了62.39%,5way-5shot情景分类精度提高到了80.53%,比使用Covnet4网络作为主干网络提高了接近20%的精度。 这些方法都有一个问题,如果数据少的话,基础数据都很难保证样本的特征是足够完整的,因此像元学习之类的,在试图最大程度的扩大泛化范围,但以目前的技术水平来说,是很难保证它的总是能正确的泛化。 因此它们通常都要大数据来进行支撑,才能收到不错的效果,到了如今又有更多的选择,例如可以使用data2vec,由于一般data2vec也就比bert高一两个点而已,如果是文本相关,那么显然使用BERT加上Prototypical Net也会是一个选择。…

Read More

小样本情况下使用SVM的思考

今日在验证测试数据时,发现当采用cross_val_score进行交叉验证时,对于随机分配的测试集比例越大,正确率便越高,而测试集越小,平均正确率就越有可能低。 使用svm推导模型时,有两个大坑,一个是train_test_split后,当数据量不够时,学习到的样本分布差异很大,极不稳定,如何才是最优的train_test_split分法,很难确定,然后就是模型的泛化能力的评估是否可靠,这一块又与train_test_split所划分的数据集相捆绑,这直接导致了,偶尔在测试集上拿了高分,也只是一种假象。 这是因为SVM实际上拟合的是数据分布,在样本中学习到的也是分布,而样本数量在随机抽样时,分布的所呈现的结构也是不同的。 当测试集小时,有时集中推断错误的数据会集中在一起,因此便会导致在测试集上的平均表现欠佳。 因此在卷积里在图像识别时,对于图像可以进行不同分辨率的采样,其实目换就是为了得到指向一个概念的不同分布,通过这样的训练能够提升神经网络的泛化能力。 SVM的过程是直接一次性fit的,因此很难进行调整与改善,因为它每一次fit的都是整个分布的情况,难以实现渐进式学习那样的调整。 随机森林相对来说,因为有分裂子树进行局部抽样的学习机制,所以相对更容易不过拟合,但整体效果是否会更好,也看数据的实际情况。 因此对于SVM拟合的数据集,应当做出一假设,即是在已有的数据中,如果能抽样出来的子分布集中,恰好有一个泛化性能很好的分布存在,那么通过网格搜索参数的方法,是能很有可能将它搜索出来的。 而更好的泛化性,意味着,比如在实际的推断任务中,假如存在有一个完整的数据分布话,这个泛化性能好的子集分布,整体上会与这个完整的数据空间分布更为相近。 因此,如果整个数据集合是G,而近似的这个子集为g,而从G中抽出来的其它集合,如果比较小的话,例如a,b,c,那么呈现出来的分布,便不一定会与g相似。 显然比如一个整体分布是{0,1,0,0,1,0,1,0,0,0},按0.33的比例抽取出来的分布可能是{0,0,0}与{1,1,1},这也就意味着如果数据集不大,并在例较小的测试集上,进行交叉验证,得出来的分数会出现不客观地偏低的情况。 因此交叉验证取K折的话,需要进行测试所取的数据的量,应当与原有训练集的量差不多才能更好地客观反映accuracy,roc,f1之类的评分。 根据实验来看,例如用0.8比例的数据作为训练集,如用随机森林达到90%正确率,而再用全集取随机抽取0.8的比例数据集做K折验证,结果会下降到78%左右,这与大多数时候,实验时数据模型效果看起来不错,但上线后会损失10%~20%的情况相近。

Read More