当前位置: 代码迷 >> 综合 >> 课程笔记: stanford cs330 deep muti-task learning and meta-learning -- multitask_transfer_1
  详细解决方案

课程笔记: stanford cs330 deep muti-task learning and meta-learning -- multitask_transfer_1

热度:35   发布时间:2023-10-20 20:31:39.0

本节课程内容包括:

  • 多任务学习

- 问题陈述

- 模型,目标,优化

- 挑战

- 现实世界多任务学习的案例研究

  • 迁移学习

- 预训练和微调 3个目标

  • 课程的目标是:

- 了解构建多任务学习系统时的关键设计决策

- 了解多任务学习和迁移学习之间的区别

- 了解迁移学习的基础知识

由于课程内容较多,分为两个视频,所以笔记也是按照视频来写,第一小节的内容包含了多任务的所有内容。

符号定义

首先介绍符号意义,在后面的学习中也是用到的。

课程笔记: stanford cs330 deep muti-task learning and meta-learning -- multitask_transfer_1

符号 意义
x 输入
y 输出,即标签
超参数,通过网络学习得来
课程笔记: stanford cs330 deep muti-task learning and meta-learning -- multitask_transfer_1 f代表网络模型,整个表达式是给定输入x的标签y的求函数
课程笔记: stanford cs330 deep muti-task learning and meta-learning -- multitask_transfer_1 输入、输出对的数据集
课程笔记: stanford cs330 deep muti-task learning and meta-learning -- multitask_transfer_1 损失函数是关于数据集和的,目的更新,使尽可能小,典型的

损失函数可以定义为负对数似然函数:

课程笔记: stanford cs330 deep muti-task learning and meta-learning -- multitask_transfer_1

课程笔记: stanford cs330 deep muti-task learning and meta-learning -- multitask_transfer_1  某个任务,泛指第i个
课程笔记: stanford cs330 deep muti-task learning and meta-learning -- multitask_transfer_1 第i个任务输入的概率分布
课程笔记: stanford cs330 deep muti-task learning and meta-learning -- multitask_transfer_1 第i个任务给定输入的输出的概率分布
课程笔记: stanford cs330 deep muti-task learning and meta-learning -- multitask_transfer_1 第i个任务的训练数据集、测试数据集
课程笔记: stanford cs330 deep muti-task learning and meta-learning -- multitask_transfer_1 作为训练数据集简写

单任务

单任务(监督)学习就是已知训练数据集情况下,要尽可能地让损失函数小,最后输出标签y的概率分布,一个任务等价于三部分的内容,x的分布,给定x的y的分布,损失函数。

课程笔记: stanford cs330 deep muti-task learning and meta-learning -- multitask_transfer_1

多任务是怎么样的?

多任务可以分为两种类型。

  • 第一种:多任务分类;
  • 第二种是多标签学习。

多任务分类就是有多个任务,每个任务共用相同的损失函数,但是它们的数据集是不同的,即x的分布、y的分布是不同的。

举例一:不同语种的手写数字识别,每个语种的字符(输入)形状都是不同的,并且对应类别(标签)也是不同的。比如英语和汉字的形状明显不同,且英语只有26个字母,汉字常用的有5000+。

课程笔记: stanford cs330 deep muti-task learning and meta-learning -- multitask_transfer_1

举例二:个性化垃圾邮件识别,不同人对垃圾邮件的定义是不同的,比如运动员可能一些运动赛事的邮件对他们来说是重要邮件,但是对于一个不喜欢运动的人来说,就是垃圾邮件。

多标签学习就是同一个数据集,进行多个标签的学习,每个任务共用共用相同的损失函数、x的分布,但是y的分布是不同的。

举例一:名人特征的识别,比如一个标签是判断人是否戴了眼镜,这是一个任务;另一个标签是判断人是否戴了耳环,这是另外的任务。

举例二:场景理解,比如理解一个场景的图片,预测深度,或者预测表面法线。

课程笔记: stanford cs330 deep muti-task learning and meta-learning -- multitask_transfer_1

也有跨任务的损失函数不同的情况:

多任务中一些数据是离散的、一些数据是连续的;或者你关心不同的指标,对一个视频可能关心用户对它的满意度,另一个可能关心用户观看视频的时长。

多任务的损失函数是每个任务的损失函数的累加:

课程笔记: stanford cs330 deep muti-task learning and meta-learning -- multitask_transfer_1

模型

一个模型如何知道当前训练的任务是哪个任务?

课程笔记: stanford cs330 deep muti-task learning and meta-learning -- multitask_transfer_1

 对于一个模型,此时需要一个任务描述符 z, 来告诉模型执行的是哪个任务。

比如我们的模型是对一个论文标题做一些任务训练,任务一是预测论文的长度,任务二是给出论文摘要,任务三是给出论文的评审,则可以用分别表示这三个任务的描述,z可以是one-hot vector形式,也可以是一些元数据,比如用户的信息或者特征或者属性,或者任务的语言描述“告诉我论文有几页”“给我一篇论文的摘要”“写一篇论文的评价”,或者是一些任务的正式规范。

任务描述符是如何加入到模型的?有哪些模型的参数是需要被共享?

假设z是one-hot vector。

一种极端的情况是:每个任务不共享参数单独训练,在最后标签预测的时候加入z。如下图所示,有三个完全独立的网络,每个网络代表训练一个任务,并使用 one-hot 任务标识符来决定希望输出的是哪个神经网络。然后做乘法门控(0表示不起作用,1表示起作用)。

课程笔记: stanford cs330 deep muti-task learning and meta-learning -- multitask_transfer_1

 另一种极端的情况是:每个任务都共享参数,只有在加入z之后的参数不共享。z可以加入在某个激活函数之后,可以在前面,可以在中间,也可以在后面。

课程笔记: stanford cs330 deep muti-task learning and meta-learning -- multitask_transfer_1

 加入z之后的参数不共享的原因是,我们假定的z是one-hot vector,从下图可看出,在z拼接到激活函数的输出神经元,与权值矩阵w参与乘积运算时,权值矩阵w的一部分参数用于与输出神经元计算,一部分用于与z计算,那显然与z计算那部分参数就是用来控制特定任务的,是不共享的。

课程笔记: stanford cs330 deep muti-task learning and meta-learning -- multitask_transfer_1

 这种类型的多任务架构,可以找到一种替换的方案。

将权值分离为两部分,一部分是共享的权值,另一部分是特定任务的权值,因此目标函数变为:

课程笔记: stanford cs330 deep muti-task learning and meta-learning -- multitask_transfer_1

 选择如何以为条件调节  等价于  选择如何并在哪里共享权值。

常用的一些权值调节设计

第一种是基于拼接,第二种是基于附加,如图所示,思考:这两种方式本质上是等效的!为什么?

课程笔记: stanford cs330 deep muti-task learning and meta-learning -- multitask_transfer_1

 原因是,将两种方式都应用到接下来的全连接层之后,就会得到同样的结果,这是由乘积的计算过程导致的,矩阵的每一行与向量乘积后累计得到的都是一个数,基于拼接的方式中每一行乘积是一次性得到一个结果,基于附加的方式中是分了两步,先得到两个部分结果,在累加得到最后结果。

课程笔记: stanford cs330 deep muti-task learning and meta-learning -- multitask_transfer_1

 Diagram sources: distill.pub/2018/feature-wise-transformations/

第三种是基于多头的,第四种是基于乘法的。

课程笔记: stanford cs330 deep muti-task learning and meta-learning -- multitask_transfer_1基于乘法的方法是比较好的一种,这是因为对于每一层,它能获得更多的表现力,在某些方面, 乘法条件泛化了独立网络、独立头等。

其他更为复杂的选择,如下图。

课程笔记: stanford cs330 deep muti-task learning and meta-learning -- multitask_transfer_1

权值调节设计,就像神经网络的微调一样:

-- 往往相当依赖问题
-- 通常主要由直觉问题的特定领域知识指导
-- 在许多方面, 它们目前更像是一门艺术而不是一门科学

目标函数

目标函数应该如何形成?

通常会给每个任务加上权重来区分他们的重要程度。

课程笔记: stanford cs330 deep muti-task learning and meta-learning -- multitask_transfer_1

 如何实际选择这些任务权重?

方法1:手工选择权重。可以基于人为定义的重要程度或者优先级,这显示不是一种很好的选择。

方法2:在训练过程中动态调整权重。这种方式有一个关键的问题是,如何在整个动态训练过程中调整?有以下几种方式。

  • 各种启发性方法。比如在文献中相当流行的一种启发式方法,是鼓励梯度具有相似的幅度。这是 2018 年毕业规范论文中提出的内容。它相当受欢迎, 而且似乎运作良好。一种直觉的指导是,如果梯度具有相似的幅度,那么没有一项任务会占主导地位。
  • 使用任务不确定性。如果希望不确定的任务的权重更高,则减少对这些任务的不确定性。有一种公式表达,如下公式(1)所示,假设对于每个任务 i,在给定 x 的情况下,你基本上有一个 y 的分布。如果进行回归,y的分布会设置为等于高斯分布,均值等于神经网络的输出,方差是每个任务的学习向量。这就是任务不确定性

                                              (1)

        这里的方差称同方差不确定性。这与神经网络可能具有的典型不确定性形成对比,神经网络会为每个数据点输出不同的不确定性。这就是所谓的异方差不确定性

       公式中是同方差不确定性,因为它对于任务中的所有数据点都是相同的。并且这里要代表特定任务的不确定性,所以引入一个索引 i 。事实证明,如果最小化每个任务的每个数据点的负对数似然,如下公式(2)所示,基本上可以证明 ,这与公式(3)成正比。

                                                   (2)

                                                                (3)

         所以这就是说,完全对应于。对于任务来说,标准差或方差越高,不确定性就会越高,因此应该对它们进行不同的加权。更小的不确定性应该设置更高的任务权重;更多的不确定性应该设置更小的任务权重。

  • 将多目标优化单调改进为帕累托最优解。

    课程笔记: stanford cs330 deep muti-task learning and meta-learning -- multitask_transfer_1

  • 针对最坏情况的任务类别进行优化。i指的是情况最坏的任务。

课程笔记: stanford cs330 deep muti-task learning and meta-learning -- multitask_transfer_1

优化

课程笔记: stanford cs330 deep muti-task learning and meta-learning -- multitask_transfer_1

优化的基本过程如下:

  1. 从任务集中抽取一小批任务课程笔记: stanford cs330 deep muti-task learning and meta-learning -- multitask_transfer_1,如果任务数量相对较少,那么可以对所有任务进行抽样。
  2. 为每个任务采样一小批数据点课程笔记: stanford cs330 deep muti-task learning and meta-learning -- multitask_transfer_1,获取该任务的训练数据,并从该数据集中抽取一个小批量样本。
  3. 使用损失函数计算该小批量的损失课程笔记: stanford cs330 deep muti-task learning and meta-learning -- multitask_transfer_1
  4. 将每个小批量的损失反向传播到以计算梯度课程笔记: stanford cs330 deep muti-task learning and meta-learning -- multitask_transfer_1
  5. 有了梯度,就可以使用最喜欢的神经网络优化器,比如 Adam,来更新你的神经网络。

这样做的目的是 ,本质上鼓励模型在每个小批量中考虑来自多个不同任务的数据,无论一项任务的数据是否多于另一项任务的数据,这种方式能够保证数据的统一采样。

此外,对于回归问题,要确保任务标签处于相同的规模。如果它们不在同一个范围内,则需要对损失函数加权,即对规模更大的损失进行加权。 

挑战

1.负迁移 -- 在一个单一架构中进行多任务训练时,它的训练效果比训练独立网络时表现更差。

举个例子,查看 CIFAR-100 基准测试的多任务版本并查看最近的一些方法,如图所示,训练一个独立的网络得到 67.7,其他的架构,包括两种多头架构、十字绣架构,都比独立网络训练差。这三种架构都发生了负迁移。

课程笔记: stanford cs330 deep muti-task learning and meta-learning -- multitask_transfer_1为什么会这样?

这可能由于几个不同的原因引起的。可能是不同梯度之间的干扰引起的优化问题;也可能是有限的表征能力问题,不同的任务可能以不同的速度学习引起,可能一个任务学习得更快,并且在学习另一个任务之前就耗尽了很多容量,这是一种能力有限的问题。通常情况下,多任务网络需要比其单任务对应更多的容量。这也可能与优化问题有关,因为如果有一个更大的网络,它可能更容易优化。

如何改变?

一是增加容量。二是改变优化,或者以某种方式改变架构,这两种方式都可以缓解负迁移的问题。
具体来说,可以减少跨任务共享。或者是进行软参数共享。可以用不同的特定于任务的参数,鼓励这些特定于任务的参数彼此更相似,这样可以最小化不同任务的参数差异范式。

课程笔记: stanford cs330 deep muti-task learning and meta-learning -- multitask_transfer_1

 2.过拟合

当发生过度拟合时,实际上时没有共享足够的网络权重。多任务学习本质上可以被视为一种正则化形式,其中任务在进行正则化学习 ,学习另一个任务。

可以共享更多参数解决这个问题。

现实世界多任务学习的案例研究

略。


 

  相关解决方案