首页 > 编程知识 正文

代码的种类,lmdi分解法原理

时间:2023-05-03 11:54:53 阅读:12573 作者:206

model-agnostic meta-learning-maml一,相关概念: 1、meta-leaning meta-leaning是指元学习,元学习是深度学习的分支,是良好的元模型(meta 但在神经网络中情况并非如此。 如果让小汽车分类网络识别另一辆卡车,效果肯定很差。 传统的CNN网络输入大量数据,进行分类学习。 但是,这样做的问题是,神经网络的通用性太低,达不到“智能”的标准。 而且,人类的认知系统可以从少量的数据中学习规律。 人类之所以能够有这样的智能,是因为人脑有“先验知识”。

2、现场学习把现场学习翻译成小样本学习,就是从少样本中学习一种模式。

N-way K-shot

这是小样本学习中常用的数据,用于描述任务。 包括n个分类,每个分类只有k张图像。

Support set and Query set

支持集是参考集,查询集是测试集。 人识别动物种类得分很大,有五种不同的动物,每种动物都有两张照片。 请像这样参考10张照片。 再拿出五张动物的照片,让它们判断各自是否属于该种类。 10张参考图像称为Support set,5张测试图像称为Query set。

二、什么是MAML? 论文地址

1、需要解决的问题小样本问题模型收敛太慢的普通分类、检测任务中,对物体进行分类、检测的类别是已知的,可以收集大量数据进行训练。 例如VOC、COCO等检测数据集,有上万张图像用于训练。 如果我们只有几张照片进行训练,这将对模型的预测造成很大的障碍。

在深度学习中,解决训练数据不足的常用技巧之一是“预训练-精细调整”(Pretraining-finetune )。 也就是说,在大数据集上预先训练模型,在小数据集上微调权重。 但是,当训练数据非常少时(只有一位训练图像时),这种技巧并不奏效。 而且,这种方式反而会使模型陷入局部最优。

2、MAML的关键点本文的思路是训练一组初始化参数,模型可以通过初始化参数,用少量的数据实现快速收敛效果。 为了实现这个目的,模型需要大量的先验知识,并且不断修改初始化参数以适应不同类型的数据。

3、MAML和预训练的区别预训练假设一个模型从任务1的数据中训练了一系列的权重,我们标记为1(theta11,这个1 ) theta11是图中深绿色的点,tasata 11 如果我们的模型使用 1 theta1 1作为task2的初始值,我们最终会到达浅绿色的点。 这一点只是task2局部的最大优点。 产生这种问题也很简单,因为模型在训练task1的数据时不需要考虑task2的数据。

MAML MAML必须同时考虑两个数据集的分布。 假设MAML经过训练后得到了一组权重,标记为 2 theta2 2。 从图中可以看出,这个权重对两个任务来说还没有达到全球最佳。 但很明显,经过训练以后可以让他们收敛到全球最佳。

因此,Pretraining每次都强调3358www.Sina.com/这一模型是否最佳,MAML强调3358www.Sina.com/或更高版本是否最佳。

三. MAML核心算法

MAML关注的是,模型使用了“高适应性”权重,可以在经过几次坡度下降后成功应用于新任务。 我们训练的目标将是“如何找到这个权重”。 MAML作为其实现方法之一,首先对一个batch内的各个任务进行一次训练,然后回到这个原始位置,综合判断这些任务的loss,选择适合所有任务的方向。

其中有监督学习的分类问题算法流程如下。

先决条件:

在任务中

为单位的数据集两个学习率 α 、 β alpha 、beta α、β

流程解析:

Step 1: 随机初始化一个权重

Step 2: 一个while循环,对应的是训练中的epochs(Step 3-10)

Step 3: 采样一个batch的task(假设为4个任务)

Step 4: for循环,用于遍历所有task(Step 5-8)

Step 5: 从support set中取出一批task图片和标签

Step 6-7: 对这一张图片进行前向传播,计算梯度后用 l r α lr_alpha lrα​反向传播,更新 θ ′ theta' θ′这个权重

Step 8: 从query set中取出所有task进行前向传播,但不更新模型

Step 10: 将所有用 θ ′ theta' θ′计算出来的损失求和,计算梯度后用 l r β lr_beta lrβ​进行梯度下降,更新 θ theta θ的权重

相关代码如下:

def train_on_batch(self, train_data, inner_optimizer, inner_step, outer_optimizer=None): """ MAML一个batch的训练过程 :param train_data: 训练数据,以task为一个单位 :param inner_optimizer: support set对应的优化器 :param inner_step: 内部更新几个step :param outer_optimizer: query set对应的优化器,如果对象不存在则不更新梯度 :return: batch query loss """ batch_acc = [] batch_loss = [] task_weights = [] # 用meta_weights保存一开始的权重,并将其设置为inner step模型的权重 meta_weights = self.meta_model.get_weights() meta_support_image, meta_support_label, meta_query_image, meta_query_label = next(train_data) for support_image, support_label in zip(meta_support_image, meta_support_label): # 每个task都需要载入最原始的weights进行更新 self.meta_model.set_weights(meta_weights) for _ in range(inner_step): with tf.GradientTape() as tape: logits = self.meta_model(support_image, training=True) loss = losses.sparse_categorical_crossentropy(support_label, logits) loss = tf.reduce_mean(loss) acc = tf.cast(tf.argmax(logits, axis=-1, output_type=tf.int32) == support_label, tf.float32) acc = tf.reduce_mean(acc) grads = tape.gradient(loss, self.meta_model.trainable_variables) inner_optimizer.apply_gradients(zip(grads, self.meta_model.trainable_variables)) # 每次经过inner loop更新过后的weights都需要保存一次,保证这个weights后面outer loop训练的是同一个task task_weights.append(self.meta_model.get_weights()) with tf.GradientTape() as tape: for i, (query_image, query_label) in enumerate(zip(meta_query_image, meta_query_label)): # 载入每个task weights进行前向传播 self.meta_model.set_weights(task_weights[i]) logits = self.meta_model(query_image, training=True) loss = losses.sparse_categorical_crossentropy(query_label, logits) loss = tf.reduce_mean(loss) batch_loss.append(loss) acc = tf.cast(tf.argmax(logits, axis=-1) == query_label, tf.float32) acc = tf.reduce_mean(acc) batch_acc.append(acc) mean_acc = tf.reduce_mean(batch_acc) mean_loss = tf.reduce_mean(batch_loss) # 无论是否更新,都需要载入最开始的权重进行更新,防止val阶段改变了原本的权重 self.meta_model.set_weights(meta_weights) if outer_optimizer: grads = tape.gradient(mean_loss, self.meta_model.trainable_variables) outer_optimizer.apply_gradients(zip(grads, self.meta_model.trainable_variables)) return mean_loss, mean_acc

四、论文作者源码 原作者TF1实现版本Keras实现版本 五、MAML存在的问题

MAML本身存在一些问题被发表在How to train your MAML中。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。