Zhangzhe's Blog

The projection of my life.

0%

一个现代经济寓言

3.png

  • 根据 “人们面临权衡取舍” 原理可知,生产者生产存在生产可能性边界,上图蓝色的直线表示生产可能性边界。
  • Frank 每 8 小时可生产 8 oz 肉或者 32 oz 土豆。
  • Ruby 每 8 小时可生产 24 oz 肉或者 48 oz 土豆。
  • 没有贸易时,Frank 按照点 A 进行生产,每天可收货 4 oz 肉和 16 oz 土豆,Ruby 按照点 B 进行生产,每天可收货 12 oz 肉和 24 oz 土豆。

2.png

  • 当存在贸易时,Frank 只生产土豆,每天可获得 32 oz 土豆;Ruby 每天生产 18 oz 肉和 12 oz 土豆。
  • Frank 使用 15 oz 土豆换取 Ruby 5 oz 肉,则 Frank 每天可收货 5 oz 肉和 17 oz 土豆;Ruby 每天可收货 13 oz 肉和 27 oz 土豆。
  • “贸易可以使每个人情况变得更好”,Frank 和 Ruby 通过贸易都变得更好。

比较优势:专业化的动力

  • 贸易使每个人都变得更好的原因:专业化

  • 专业化的动力:比较优势

  • 绝对优势和比较优势:

    • 绝对优势 :一个生产者比另一个生产者更少的投入生产某种商品的能力。Ruby 在生产土豆和肉的方面相较于 Frank 都有绝对优势。
    • 比较优势:一个生产者以低于另一个生产者的 机会成本 生产某种物品的能力。由下表可知,Ruby 在生产肉方面相较于 Frank 有比较优势,Frank 在生产土豆方面相较于 Ruby 有相对优势。

    机会成本:为了得到某种东西所必须放弃的东西。

1.png

贸易可以使参与贸易的每个人都获益,因为它使人们可以专门从事他们具有比较优势的活动。

对于在贸易中获益的双方而言,贸易的价格一般在两种机会成本之间。

  • 由此根据上表可知:Ruby 和 Frank 肉的贸易应该在 2 ~ 4 oz 土豆之间。

作为科学家的经济学家

  • 科学方法:观察、理论和进一步观察

  • 假设的作用:假设可以使复杂的世界简单化,从而使解释这个世界变得更为容易。

  • 经济模型:经济学家使用经济模型来解释经济行为。

2-1.png

循环流量图模型: 上图阐述了企业和家庭相互交易的经济行为,绿色箭头表示货币流向,红色箭头表示商品和服务流向。

2-2.png

  • 生产可能性边界:表示在可能的生产要素与生产技术既定时,一个经济所能生产的产品数量的各种组合的图形。
  • 上图 生产边界模型 中的任何一点都表示电脑和汽车的产量组合。阴影部分是可以达到的生产效率。
  • F、A、B、E 都是以可以达到的最高效率生产产量。
  • D 是低效率的生产方式。由于某种原因(例如:大规模失业),该经济的产量小于他可以获得的资源中所能得到的最大产量。
  • C 是无法达到的生产效率。

2-3.png

上图表示由于某种原因(例如:电脑生产技术的升级),导致生产可能性边界向上移动。
最终导致的结果是:电脑和汽车的产量都可以提高。

  • 微观经济学:研究家庭和企业如何做出决策,以及它们如何在市场上相互交易的学科。

  • 宏观经济学:研究整体经济现象,包括通货膨胀、失业和经济增长的学科。

作为政策顾问的经济学家

  • 实证表述:试图描述世界是什么样子的观点。

  • 规范表述:试图描述世界应该是什么样子的观点。

例如:

“最低工资法引起了失业” 是一句实证表述。
“政府应该提高最低工资” 是一句规范表述。

  • 凯恩斯的观点:经济学家和政治哲学家的思想,无论正确与否,实际上都要比一般所想象的更有力量。事实上,这个世界就是由他们统治的。那些自认为能够免受经济学家思想影响的实干家往往只是某些已故经济学家的俘虏。那些当权狂人信奉的其实也不过是若干年前某些末流学者的狂妄思想。

经济学家意见分歧的原因

有两个基本原因:

  • 实证分析角度:经济学家可能对世界如何运行的不同实证理论哪一种正确有着不同的看法。
  • 规范分析角度:经济学家可能有不同的价值观,因此对政策应该努力实现的目标有不同的规范观点。

具体来说有三种可能的原因:

  • 科学判断不同
  • 价值观不同
  • 感觉与现实

基本概念

  • 稀缺性:社会资源是有限的。

  • 经济学:研究社会如何管理自己的稀缺资源。

十大原理

1. 人们面临权衡取舍

  • 效率:社会能从其稀缺资源中得到最大利益的特性。

  • 平等:经济成员在社会成员中平均分配的特性。

在某种程度上,效率平等 是互斥的,平等会损害社会效率。

2. 某种东西的成本是为了得到它所放弃的东西

  • 机会成本:为了得到某种东西必须放弃的东西。

例如:上大学的 机会成本 不只是学费、生活费,还有四年时光。

3. 理性人考虑边际量

  • 理性人:系统而有目的地尽最大努力实现其目标的人。

  • 边际变动:对行动计划的微小增量调整。

简单理解就是需要更关注变化量而不是价值本身。例如:航空公司一趟航行的总成本均摊到每个座位上是 500 美元,如果起飞前还有十个座位,那么以 100 美元 / 座位的价格卖出也是合理的,原因是:此时增加的飞行成本远低于卖出价格。

4. 人们会对激励做出反应

  • 激励:引起一个人做出行动的某种东西。

5. 贸易可以使每个人的状况都变得更好

6. 市场通常是组织经济活动的一种好方法

  • 市场经济:当许多企业和家庭在物品和服务市场上相互交易时,通过他们的分散决策配置资源的经济。也就是亚当斯密口中的 “看不见的手”。

7. 政府有时可以改善市场结果

  • 产权:个人拥有并控制稀缺资源的能力。

  • 市场失灵:市场本身不能有效配置资源的情况。

  • 外部性:一个人的行为对旁观者的福利产生了影响。例如:环境污染。

  • 市场势力:单个经济活动者(或某个经济活动小群体)对市场价格有显著影响到能力。例如:垄断。

政府在经济中的作用包括:实施产权制度;在市场失灵时重新配置资源。

8. 一国的生活水平取决于它生产物品和服务的能力

  • 生产率:每单位劳动投入所生产的物品和服务数量。

9. 当政府发行了过多货币时,物价上升

  • 通货膨胀:经济中物价总水平的上升。

10. 社会面临通货膨胀与失业之间的短期权衡取舍

  • 经济周期:就业和生产等经济活动的波动。

分类

  • 人们如何做出决策
    1. 人们面临权衡取舍
    2. 某种东西的成本是为了得到它所放弃的东西
    3. 理性人考虑边际量
    4. 人们会对激励做出反应
  • 人们如何相互影响
    5. 贸易可以使每个人的状况都变得更好
    6. 市场通常是组织经济活动的一种好方法
    7. 政府有时可以改善市场结果
  • 整体经济如何运行
    8. 一国的生活水平取决于它生产物品和服务的能力
    9. 当政府发行了过多货币时,物价上升
    10. 社会面临通货膨胀与失业之间的短期权衡取舍

URL

TL;DR

  • 典型量化算法(如:DoReFaPACTLSQ)对 feature 的量化通常使用无符号量化(负半轴量化到零点):
    • 这种量化算法适用于使用 Relu 激活函数的网络。
    • 但对使用新式激活函数(如:swish, H-swish, Mish, Leaky-ReLU)的网络(如:EfficientNetMixNet)会造成较大的量化误差。
    • LSQ+ 作为一种非对称量化算法可以学习 scaleoffset,去适应需要负数激活函数的网络。
  • 量化网络训练收敛较难,所以 LSQ+ 提出了一种比较高效的 scaleβ\beta 初始化方法:MSE 最小误差初始化方法优于最大最小值。

Algorithm

1. LSQ 算法存在的问题

  • LSQ 公式

    xˉ=clamp(xs,n,p)\bar{x} = \lfloor clamp (\frac{x}{s}, n, p)\rceil

    x^=xˉ×s\hat{x} = \bar{x} \times s

  • LSQ 对例如 Leaky-ReLUSwish 这种存在负半轴的激活函数量化有两种方法:

    • 截断负半轴,即 n=0, p=2b1n=0,\ p=2^b-1,显然降低模型表现能力
    • 正负半轴相同尺度量化,即 n=2b1, p=2b11n=-2^{b-1},\ p=2^{b-1}-1,由于正半轴的信息量远高于负半轴,同尺度量化会增大正半轴的量化误差

2. LSQ+ 的解决方案

  • LSQ+ 的改进主要包含两个方面:
    • LSQ 设置了可学习的参数 scale 的基础上,在 activation 量化上weight 量化没有 offset)增加了另外一个可学习参数 offset
    • 对网络初始化的方法进行了改进

2.1 增加可学习 offset 参数

  • LSQ+ 公式
    xˉ=clamp(xβs,n,p)\bar{x} = \lfloor clamp (\frac{x-\beta}{s}, n, p)\rceil

    x^=xˉ×s+β\hat{x} = \bar{x} \times s + \beta

  • s 的梯度计算:

    x^s\frac{\partial\hat{x}}{\partial{s}} = xˉss+xˉ{xβs+xβs,if n<xβs<pn,if xβs<np,if p<xβs\frac{\partial\bar{x}}{\partial{s}}s + \bar{x} \simeq \begin{cases} -\frac{x-\beta}{s}+\lfloor\frac{x-\beta}{s}\rceil &,if\ n < \frac{x-\beta}{s} < p\\ n&, if\ \frac{x-\beta}{s} < n\\ p&,if\ p<\frac{x-\beta}{s}\end{cases}

  • β\beta 的梯度计算

    x^β=xˉβ+1{0,if n<xβs<p1,otherwise\frac{\partial\hat{x}}{\partial{\beta}}=\frac{\partial\bar{x}}{\partial{\beta}}+1\simeq \begin{cases} 0&,if\ n<\frac{x-\beta}{s} <p\\ 1&,otherwise\end{cases}

  • 加入了 β\beta 参数后,对存在负半轴的激活函数进行非对称量化将几乎没有额外开销

    w^x^=(wˉ×sw)(xˉ×sx+β)=wˉxˉswsx+βswwˉbias\hat{w}\hat{x}=(\bar{w}\times s_w)(\bar{x}\times s_x + \beta)=\bar{w}\bar{x}s_ws_x+\begin{matrix}\underbrace{\beta s_w\bar{w}}\\ bias\end{matrix}

2.2 更合理的 scale 和 β\beta 参数初始化方法

  • 低比特量化神经网络训练的最终性能与参数初始化方法关联性较大,这在深度可分离卷积网络中更为明显(例如: MobileNet系列)
2.2.1 weight 量化的 scale 参数初始化方法
  • LSQ 对于对称量化的 weightscale 初始化公式是:sinit=2<w>ps_{init} = \frac{2<|w|>}{\sqrt{p}}
  • 作者认为这样的 scale 初始化方法会导致初始 scale 太大,所以 LSQ+ 对 weight 对称量化的 scale 初始化方法是:sinit=max(μ3×σ,μ+3×σ)2b1s_{init}=\frac{max(|\mu-3\times\sigma|, |\mu+3\times\sigma|)}{2^{b-1}}
    • 其中,μ, σ\mu,\ \sigma 分别表示本层权重的均值和标准差

由于 weight 是对称量化,所以不需要 β\beta 参数

2.2.2 feature 量化的 scale 和 β\beta 参数初始化方法
  • 一个最理想的量化方式是 x 只被量化,没有被 clamp,因此根据 LSQ+ 的量化公式可知:
    • xminβinitsinitn, xmaxβinitsinitp\frac{x_{min}-\beta_{init}}{s_{init}}\rightarrow n,\ \frac{x_{max}-\beta_{init}}{s_{init}}\rightarrow p
    • 化简后:sinit=xmaxxminpn, βinit=xminn×sinits_{init}=\frac{x_{max}-x_{min}}{p-n},\ \beta_{init} = x_{min} - n \times s_{init}
    • 但是,这种完全不 clamp 的操作容易被离群点干扰,所以 sinit, βinits_{init},\ \beta_{init} 还是使用量化前和反量化后的数据最小 MSE loss 来确定,即:sinit, βinit=argmins,βx^xF2s_{init},\ \beta_{init}=argmin_{s,\beta} ||\hat{x}-x||^2_F

Thought

  • 量化算法中多一个可以被硬件无痛吸收的自由度自然是好事

URL

TL;DR

  • 本文提出一种量化算法 LSQ,旨在通过学习的方式确定每一层量化的 scale
  • LSQ 量化算法比基于统计确定 scale 的量化算法的(例如:DoReFa-Net)效果好

Algorithm

量化和反量化过程

  • 量化过程:vˉ=clip(v/s,QN,Qp)\bar{v} = \lfloor clip(v/s, -Q_N, Q_p) \rceil
  • 反量化过程:v^=vˉ×s\hat{v} = \bar{v} \times s

其中:

  • vv 表示原始数据(weight / feature)
  • ss 表示量化 scale
  • \lfloor \rceil 表示四舍五入(round)
  • QN, QP-Q_N,\ Q_P 分别表示量化上下界,通常来说:
    • 对于无符号整形量化数据:QN = 0, QP=2b1Q_N\ =\ 0,\ Q_P = 2^{b} - 1
    • 对于有符号整形量化数据:QN = 2b1, QP=2b11Q_N\ =\ 2^{b-1},\ Q_P = 2^{b-1} - 1
  • vˉ\bar{v} 表示量化后的数据
  • v^\hat{v} 表示反量化(×s\times s)后的数据

lsq1.png

通常反量化会移到后面做,如上图中的 sx, sws_x,\ s_wwˉ @ xˉ\bar{w}\ @\ \bar{x} 之后才会乘上去

对 scale 的梯度定义

v^s={v/s+v/s,if QN<V/s<QPQN,if v/sQNQP,if v/sQP\frac{\partial\hat{v}}{\partial s} = \begin{cases} -v/s+ \lfloor v/s \rceil, & if\ -Q_N < V/s < Q_P\\ -Q_N, & if\ v/s \le -Q_N \\ Q_P, & if\ v/s \ge Q_P\end{cases}

对量化区间外的部分有非常高的梯度,因为 clip 之后原始信息全部丢失。所以需要较大惩罚(梯度)。

  • v^v={1,if QN<v/s<QP0,otherwise\frac{\partial\hat v}{\partial v}=\begin{cases} 1, & if\ -Q_N<v/s<Q_P \\ 0, & otherwise\end{cases}

lsq2.png

量化前数据和反量化后的数据关系

lsq3.png

量化前数据和 scale 梯度的关系(有效将数据集中在量化点附近,减小量化损失)

  • scale 的初始值 2<v>QP\frac{2<|v|>}{\sqrt{Q_P}},其中 <v><|v|> 表示输入的绝对值均值。

对 scale 的梯度上加的权重

  • 训练中会涉及到 scale 的梯度、weight 的梯度和 feature 的梯度,需要均衡三个梯度,所以需要在weight 的梯度和 feature 的梯度上乘上两个因子进行平衡。
  • R=sLs/wLwR = \frac{\nabla_sL}{s} / \frac{||\nabla_wL||}{||w||},需要 R 尽可能接近 1
  • 经过数学推理和实验,得到两个权重因子 gw, gfg_w,\ g_f 分别表示 weight 梯度权重和 feature 的权重梯度。
  • gw=1NWQPgf=1NFQPg_w = \frac{1}{\sqrt{N_WQ_P}}\\ g_f = \frac{1}{\sqrt{N_FQ_P}},其中 NW,NFN_W,N_F 分别表示 number of weightnumber of feature

一些实验 trick

  • 越低位宽需要越低的 weight_decay 系数
  • cosine learning rate decay 可以涨点
  • 使用 float 模型去蒸馏可以涨点

Through

  • 学出来的 scale 确实比统计出来的 scalemake sense ,毕竟 QAT 给了学习的机会,就多给些可学习的参数是有道理的。

URL

TL;DR

  • GPT (Generative Pre-Training) 是一种基于 transformer decoder 结构的语言预训练模型,和视觉预训练模型不同的是使用没有 label 的文本数据做自监督预训练训练。

  • GPT 训练主要分成两个步骤:

    1. 在无标注数据上做自监督预训练,具体训练目标函数是:根据前 k 个词预测下一个词
    2. 在有监督数据集上做有监督微调,具体微调目标函数是:任务相关预测 + 根据前 k 个词预测下一个词
  • 由于 transformer decoder 中存在 mask,所以不像 Bert 可以根据前后文推理中间缺失的词(完型填空任务),GPT 只能使用根据前文推后文的方法,因此也更适合做文本生成任务

  • 预训练好的模型在下游任务上微调时,只需要对网络输出头做较小的修改即可适配,效果很好。

Algorithm

  • 发展历程: Transformer -> GPT -> Bert -> GPT2 -> GPT3 -> GPT4

example

GPT 模型擅长文本生成,因此以文本生成举例:输入"Hello, world!" 要求生成后续内容。

1. tokenize

2. token embeding

  • 因为 id 串不是神经网络可以处理的格式,所以需要 id 的向量化
  • token embedding 过程本身也是一个查表过程,表格的大小是 vocabulary_size * embedding_sizeGPT-2vocabulary size == 50257embedding size == 768
  • 查表后得到一个 4 * 768token embedding

3. position embeding

  • 给每个 token id 顺序编码一个 position id, 因此 position id[0, 1, 2, 3]
  • 然后将 position id 变成模型可识别的向量,也是一个查表过程,表格本身是可以通过梯度下降学习的,表格的大小是 max_seq_len * embedding_sizemax_seq_len 表示 最大支持的上下文长度GPT-2 中为 1024
  • position embedding 只用在 transformer 第一层之前

4. 生成输入 hidden states

  • token embedding + position embedding = hidden states
  • hidden statesshape = 4 * 768

5. Casual Decoder Layer

  • 这个是 GPT 系列模型的核心,是一种因果注意力机制
  • 因果注意力(Casual)是指每个 hidden state 只能关注之前位置的 hidden state,而不能关注之后的
  • 例如: Hello, world!seq_len == 4,那么注意力矩阵是 4x4,但此矩阵需要是下三角矩阵,即 “,” 只能关注 Hello,而不能关注 world

6. Casual Decoder Layer 输出的 hidden states 再输入下一层 Casual Decoder Layer

  • 输出的 hidden states 和输入的 hidden statesshape 保持一致
  • 再输入下一层 Casual Decoder LayerGPT-212

7. 最后一层输出的 hidden states 的最后一个 hidden state 用于分类

  • 经过重复 12 层的 Casual Decoder Layer,最后输出 hidden states (shape = 4 x 768)
  • 取最后一维 hidden state (shape = 1 x 768) 通过一层或多层 fully connect 映射到 vocabulary size
  • vocabulary size 上取 argmax 得到最大概率的下一个词

8. 合并预测到的词到语句末尾

  • 如果预测的词不是结束符,且语句总长小于 max_seq_len,则将预测得到的词加到原语句末尾
  • 加完之后的长度为 5 的语句继续通过 12Casual Decoder Layer 去预测下一个词
  • 重复直到结束符或 max_seq_len

model architecture

  • token embedding

gpt2-token-embeddings-wte-2.png

  • postion embedding

gpt2-positional-encoding.png

  • model architecture

gpt2-input-embedding-positional-encoding-3.png

Unsupervised pre-training

  • 使用标准语言建模(用前面的词预测下一个词)目标来最大化如下的似然函数:
    目标函数: L1(U)=ilogP(uiuik,...,ui1Θ)L_1(U)=\sum_ilogP(u_i|u_{i-k},...,u_{i-1} | \Theta)
    其中:U 表示 token 的上下文向量,k 为窗口大小, Θ\Theta 为模型参数

  • 模型使用 Transformer decoder 结构,整体计算流程可简写为:

    • h0=UWe+Wph_0=UW_e+W_p
    • hl=transformerblock(hl1),   i[1,n]h_l=transformer\\_block(h_{l-1}),\ \ \ \forall i\in[1,n]
    • P(u)=softmax(hnWeT)P(u)=softmax(h_nW_e^T)

    其中: n 表示 transformer 层数,U 表示上下文 tokenWeW_e 表示 tokenembedding 矩阵, WpW_p 表示 position embedding 矩阵

Supervised fine-tuning

  • 有监督 fine-tuning 使用的数据可表示为:

    • 输入 x1,x2,...,xmx_1, x_2, ..., x_m
    • 标签 y
  • 预测 P(yxi,...,xm)=softmax(hlmWy)P(y|x_i,...,x_m)=softmax(h_l^mW_y) 这里使用 最后一个一层的最后一个 token 对应的输出

  • 因此,有监督目标函数为: L2(C)=(x,y)logP(yx1,...,xm)L_2(C)=\sum_{(x,y)}logP(y|x_1,...,x_m) ,其中 C 表示 fine-tuning 使用的有标签数据集

  • 作者发现在 fine-tuning 阶段,加上无监督损失函数效果会更好,即: L3(C)=L2(C)+λL1(C)L_3(C)=L_2(C)+\lambda * L_1(C)

Task-specific input transformations

  • 本节讨论的是在 fine-tunning 以及 inference 阶段如何构造模型输入

GPT.png

  • 上图举例了四个常见 NLP 任务:

    • 分类:图中的 StartExtract 分别是两个保留的特殊 token,分别表示输入的开始和输出特征的抽取(linear 层只输入 transformer 最后一层的最后一个 token 的输出,因此在最后填充一个 Extract 特殊标记 token)

    • 蕴含:用于分析 前提(premise) 是否蕴含 假设(hypothesis),本质是一个 蕴含 / 不蕴含 / 不确定 三分类问题,中间的 Delim 是特殊标识 token,表示分割含义

    • 相似:用于分析两个句子是否具有相似关系,由于相似具有对称性,所以需要构造两种顺序的输入,本质是二分类

    • 多选:其中 context 包含上下文文本和问题,需要针对每个答案构建一个 contextanswer 对,最后用 softmax 计算 answer 概率分布

Thought

  • GPT 使用了 Transformer decoder,由于 mask 的存在,无法知道之后的句子,因此选择了比 Bert 更难的标准语言建模(根据前 k 个词预测下一个词)的代理任务,对应的模型无监督预训练效果上限也相应提高。
  • 由于 Bert 使用的 Transformer encoder,因此可以看到句子的上下文,因此 Bert 使用了较为简单的完形填空无监督目标函数。
  • Bert 晚于 GPT,借鉴了很多 GPT 的思想,效果也优于 GPT,但 GPT 开启了语言模型无监督预训练先河,有可能成为 AIGC 的原型机。

URL

TL;DR

  • 本文提出一种类别增量学习算法,在类增量学习中同时学习分类和特征表示,最后得到一个表征器 + 部分旧任务的少量典型样例,缓解灾难性遗忘的问题。
  • 本文对类别增量学习进行了定义,同时满足如下三条规则的学习任务才是一个类别增量学习:
    • 当新的类别在不同时间出现,它都是可训练的。
    • 任何时间都在已经学习过的所有类别中有很好的分类效果。
    • 计算能力与内存应该随着类别数的增加固定或者缓慢增长。
  • 本文中表征学习使用的是 NME(Nearest-Mean-of-Exemplars)算法,而不是使用神经网络直接分类。

Algorithm

icarl_1.png

  • 本算法使用最近邻表征中心法进行分类,而不是使用神经网络传统的 argmax、sigmoid 分类,因为后者更容易引入灾难性遗忘。

icarl_2.png

  • 类别增量学习的核心:1 ~ s-1 表示旧任务,s ~ t 表示新任务,K 表示可缓存的最大旧任务样本数量,P 表示已缓存的旧任务样本集,具体步骤如下(重复直到所有任务训练完):
    1. 使用新任务样本 Xs,...,XtX^s,...,X^t 和旧任务缓存样本 P\mathcal{P} 联合起来使用 NME 分类方法训练模型参数。
    2. 由于任务数变多,所以需要重新计算每个任务可以缓存的最大样本数 m=Ktm = \frac{K}{t}
    3. 将之前选的旧任务(1 ~ s)的缓存样本减少,每一类减少到 m 个样本(根据到样本中心的距离排序,取 top m)。
    4. 对新任务 (s ~ t) 逐类样本进行采样,根据取出剩余样本到样本中心的距离排序,逐一取样本直到取到 m 个。

icarl_3.png

  • gy(x)=11+exp(wyTφ(x)), y1,...,tg_y(x) = \frac{1}{1 + exp(-w_y^T\varphi(x))},\ y\in{1,...,t},其中 φ(x)\varphi(x) 表示表征输出。
  • 最终的 Loss 是新任务上的分类 Loss + 旧任务上的蒸馏 Loss(注意蒸馏 Loss 的写法)。

icarl_4.png

  • 对新任务 (s ~ t) 逐类样本进行采样,根据取出剩余样本到样本中心的距离排序,逐一取样本直到取到 m 个。

icarl_5.png

  • 将之前选的旧任务(1 ~ s)的缓存样本减少,每一类减少到 m 个样本(根据到样本中心的距离排序,取 top m)。

Thought

  • 论文写的很好,公式表达十分清晰,而且还开源了,比 DGR 不知道高到哪里去了…

2022年6月14日中午,听闻了孙老师意外离世的消息,愕然!

在我的印象中,孙老师是一个高高壮壮、有些腼腆的学者。在旷视的一年和孙老师接触仅限于在电梯里的几次照面,我只是一个 nobody,所以没有打过招呼。

记得有一次,我同时和印奇老板、孙剑老师同时进入电梯,印奇老板询问孙老师一个事情的进度,态度和蔼,但孙老师瞬间脸就红了,然后尴尬的微笑着简单地汇报了进度,能看出非常的不自在。我事后给女友讲起此事,感叹人间真实,曾经的学生变成了自己的老板,尴尬自然是正常的。

对孙老师形成直观的印象来自于一封内部信,应该是 2021 新年伊始,孙老师发内部信总结公司的 2020 并展望 2021,关于公司的战略规划,我兴趣不大,只是隐约明白了我还有活干。我感兴趣的点在于孙老师对自己生活的分享,他说父母经常会有自己的小孩一定会和自己一样优秀的错误幻想,但实际上他自己作为一个名声响彻 ai 界的大牛,女儿小学数学竟然不及格,他每天都在辅导女儿打败数学大魔头。他还分享了自己练习长跑的心得,刚开始跑几百米就气喘吁吁,后面每天练习,日复一日,终于可以一口气跑 10 km,相信自己,贵在坚持,总能战胜自己。

谁能想到,最终他引以为傲的长跑夺走了他年轻的生命。突发性心肌梗死带走了 45 岁的他,从此女儿没有了父亲,妻子没有了丈夫,旷视研究院没有了孙院长,学界少了一位孙老师。

是的,朋友圈刷屏了,满眼都是对他的哀悼和纪念,甚至旷视 CEO 印奇也发文:“一定到完成孙老师未竟的事业”,但是又如何?怕不过一周之后,不会再有人感叹他的英年早逝、不会再有人感叹天妒英才,人总要向前看。尘归尘,土归土,只留给他的家人无尽的痛苦。

他无疑是成功的,拥有 100 多篇顶级学术论文,多少研究人员终其一生也难中一篇。我来自农村,能一步一步走到现在实属不易,受过的苦只有自己知道,也从未幻想过能有一天和巨人并肩。我只是一个小人物,赚着不多不少的钱,住着不大不小的房子,每天努力工作,少有人知道也少有人关心,我没有成功者该有自律,甚至已经三四个月没有读过论文了,健身事业也常常被各种各样的杂事搁置。累了就躺平,无聊了就找点事干,我知道我的一生很可能永远也不会有高光时刻,我是个平凡的普通人,我认了。

不过至少没有让我的父母和妻子失望,我活着,每天遇到各种各样的烦恼却依然相信总会变好的。人拼一辈子,拼到最后就是拼谁命长,把时间线拉的足够长,眼下的困难和失意又算的了什么?

在阿里的 11 个月,我太疲惫了,每个工作日在家的时间不会超过 9 个小时,不想继续下去了,到此为止吧。孙老师的意外给了我很深的启示,人生绝不是只有工作的,我要去寻找生活了,重新出发,去迎接新生命的到来。

孙老师的微博“孙剑_ai”,我一条一条仔细翻完了,除去他作为 AI 大牛的光环之外,他是一个非常 nice 的父亲、丈夫和儿子,是一个乐观又有点愤青的学者,一个和蔼又毒舌的朋友,一个慷慨又有点小骄傲的老师,斯人已逝,愿您在乎的人永远平安!

URL

TL;DR

  • 本文提出一种学者模型用于处理持续学习问题,依次训练每个任务,每个任务都有一个学者模型,每个学者模型包括一个生成器和一个求解器
  • 生成器的作用是生成与 旧任务 真实样本同分布的样本
  • 求解器的作用是求解任务
  • 二者分开训练

Algorithm

网络结构

dgr1.png

  • 根据 task 顺序训练 学者模型
  • 训练新任务生成器时,新任务生成器负责 模仿新任务的真实数据和旧任务的生成器数据,这里的生成器实际上是指一整个 GAN,可以对抗学习来模拟样本分布。
  • 训练新任务的求解器时,求解器会映射 x -> y,这里的 x 来自第 i 个任务的真实样本和第 i-1 个任务的生成样本,生成样本的 label 来自于第 i-1 个任务的求解器的输出

Loss 设计

  • loss
    Ltrain(θi)=rE(x,y)Di[L(S(x;θi),y)]+(1r)ExGi1[L(S(x;θi),S(x;θi1))]L_{train}(\theta_i) = r\mathbb{E}_{(x,y) \sim D_i}[L(S(x;\theta_i), y)] + (1-r)\mathbb{E}_{x' \sim G_{i-1}}[L(S(x';\theta_i), S(x';\theta_{i-1}))]

    其中,DiD_i 表示第 i 个任务的数据,Gi1G_{i-1} 表示第 i-1 个任务的数据生成器。

    Ltest(θi)=rE(x,y)Di[L(S(x;θi),y)]+(1r)E(x,y)Dpast[L(S(x;θi),y)]L_{test}(\theta_i) = r\mathbb{E}_{(x,y) \sim D_i}[L(S(x;\theta_i), y)] + (1-r)\mathbb{E}_{(x,y) \sim D_{past}}[L(S(x;\theta_i), y)]

    其中,DpastD_{past} 表示过去数据的积累分布

Thought

  • 感谢 GAN,感恩 Ian Goodfellow

URL

TL;DR

lwf1.png

  • 本文将一个增量学习任务的网络结构拆分成三个部分:
    • backbone
    • 旧任务相关参数
    • 新任务相关参数
  • 所有增量学习都需要:
    • 使用原始 backbone(可微调)
    • 随机初始化新任务相关参数
  • 在此基础上增量学习常用的解决灾难式遗忘的方法有:
    • Fine-tuning:在 新任务数据集冻结旧任务相关参数,Fine-tuning backbone 以及新任务相关参数,如上图 b 所示
    • Feature Extraction:在 新任务数据集冻结 backbone 以及旧任务相关参数,只训练新任务相关参数,(与 b 不同的地方在于 是否冻结 backbone),如上图 c 所示
    • Joint Training:在 所有任务数据集上Fine-tuning 所有参数(backbone、新任务相关参数、旧任务相关参数),(与 b 不同的地方在于 是否使用所有任务数据,以及是否 fine-tuning 旧任务相关参数),如上图 d 所示
    • Learning without Forgetting:在 新任务数据集Fine-tuning 所有参数(backbone、新任务相关参数、旧任务相关参数),如上图 e 所示,(与 d 不同的地方在于 使用的训练数据不同),这种方法使用的标签包括:
      • 硬标签:新任务数据的 原始标签
      • 软标签:新任务数据在旧模型上的 输出分布,目的是:使得网络在训练新任务时,尽可能保持旧任务上的分布

Joint Training 因为用到所有数据同时训练,所以通常被认为是增量学习的算法效果上界

Algorithm

lwf2.png

  • LwF 算法会修改所有参数:

    • backbone
    • 新任务相关参数
    • 旧任务相关参数(这个很重要!)
  • LwF 损失函数中各参数的含义:

    • θs,θs,θs^\theta_s,\theta_s^\star,\hat{\theta_s} 分别表示:backbone 原始参数、backbone 在所有任务上的最优参数、backbone 训练中的临时参数
    • θo,θo,θo^\theta_o,\theta_o^\star,\hat{\theta_o} 分别表示:旧任务相关参数原始参数、旧任务相关参数在所有任务上的最优参数、旧任务相关参数训练中的临时参数
    • θn,θn,θn^\theta_n,\theta_n^\star,\hat{\theta_n} 分别表示:新任务相关参数原始参数、新任务相关参数在所有任务上的最优参数、新任务相关参数训练中的临时参数
    • λo\lambda_o 表示:旧任务重要程度权重

Experiment

lwf3.png

Fine-tuning、Feature Extraction、Joint Training 都强

Thought

  • 使用一种类似蒸馏的方法,使用新数据 + 旧模型的方法 replay 旧数据,看起来挺 make sense