转:https://zhuanlan.zhihu.com/p/343529491
有些可视化以及清晰的见解来自ICLR 2020: Yann LeCun and Energy-Based Models。所谓的能量模型并不是一种新的技术,而是LeCun的一种尝试:将当前的DL,ML统一在能量模型的框架中。我们先理解一下何为能量函数,能量函数通常写作
E
(
x
,
y
)
E(x, y)
E(x,y) 用于衡量
x
,
y
x, y
x,y 的 compatibility,也可以理解为
x
,
y
x, y
x,y 是否匹配,能量越小匹配度越高。
- 用分类器做一个简单例子,如果输入是猫的图片,那么 E ( x , l a b e l = ′ c a t ′ ) = 0 E(x, label='cat')=0 E(x,label=′cat′)=0 ,即分类正确能量函数即为0,所以这里的能量函数其实与损失函数没有太大差别,可能是最大化数据的负对数似然。为了最小化这个能量,我们可以改变label使其适应 x x x(传统的图像分类),也可以改变 x x x 来适应label(deepdream)
- GAN:判别器本身是一个能量函数,真实样本的能量为0。生成器尝试着生成能量更低的样本。
- Self-supervised:比如我们要从当前帧预测下一帧内容,那么我们需要找到一个帧使得 E ( x t , x t + 1 ) E(x^t, x^{t+1}) E(xt,xt+1) 尽可能小即可。
用综述中的话来讲:基于能量的学习为许多概率和非概率的学习方法提供了一个统一的框架,特别是图模型和其他结构化模型的非概率训练。基于能量的学习可以被看作是预测、分类或决策任务的概率估计的替代方法。由于不需要适当的归一化,基于能量的方法避免了概率模型中与估计归一化常数相关的问题。此外,由于没有标准化条件,在学习机器的设计中允许了更多的灵活性。大多数概率模型都可以看作是特殊类型的基于能量的模型,其中能量函数满足一定的归一化条件,损失函数通过学习优化,具有特定的形式。这里归一化,标准化多次出现,将会在下文进行剖析。
我们比较常用的情况是这样的,给定一张image
X
X
X ,模型产生与
X
X
X 最兼容的
Y
Y
Y
Y
∗
=
a
r
g
m
i
n
Y
∈
Y
E
(
Y
,
X
)
Y^*=arg \underset {Y \in \mathcal{Y}}{min} E(Y, X)
Y∗=argY∈YminE(Y,X)
显然如果
Y
\mathcal{Y}
Y 很小的话我们可以遍历所有
Y
Y
Y 进行挑选最小的。但是通常情况下,问题并没有这么简单,我们可以看一下一些应用场景
(a): 人脸识别-Y离散,但是基数成千上万。(b): 人脸检测与姿态估计-Y是一组向量集合。©图像分割-Y是每个pixel的标签。(d)(e):手写字体识别与序列标记-Y是一组结构化但取值可能无限的符号(NLP常态)。(f)图像复原-Y是高维数据图像
在这些场景中遍历
Y
\mathcal{Y}
Y 空间往往都是不太现实的,因此针对场景我们需要选择合适的近似策略。需要注意的是,能量是没有上界的,在一个model中使用的时候这是没有问题的,比如RL中我们只需要选择能量最低的action即可,但是如果我们需要合并两个model(一个的输出是另一个的输入)就比较麻烦了。唯一一致的方法是将所有可能输出的能量转换成一个标准化的概率分布。最简单、最常用的方法即转化为Gibbs分布
P
(
Y
∣
X
)
=
e
−
β
E
(
Y
,
X
)
∫
y
∈
y
e
−
β
E
(
Y
,
X
)
P(Y|X)=\frac{e^{-\beta E(Y,X)}}{\int_{y \in \mathcal{y}}e^{-\beta E(Y,X)}}
P(Y∣X)=∫y∈ye−βE(Y,X)e−βE(Y,X)
这里的 β \beta β 是逆温度,分母是配分函数。这样的转换只有在配分函数可以计算时才是有效的,但是通常配分函数是得不到的(想象一下在图片这种高维空间做积分),因此概率建模的代价很高,我们应该尽量避免
Energy-Based Training: Architecture and Loss Function
我们训练EBM的初衷就是找一个合适的能量函数,使得其能够对输入的
X
X
X 输出最匹配的
Y
Y
Y 。给定参数
W
W
W ,我们将这一类能量函数写作
E
=
{
E
(
W
,
X
,
Y
)
:
W
∈
W
}
\mathcal{E}=\{E(W,X,Y):W \in \mathcal{W}\}
E={E(W,X,Y):W∈W}
这里就显示出了能量函数的包罗万象,当
X
,
Y
X,Y
X,Y 是实向量的时候,
E
\mathcal{E}
E 可以简单到基函数的线性组合(如核方法),或一组神经网络架构和权值。当
X
,
Y
X,Y
X,Y 是可变大小的图像、符号序列或向量,或更复杂的结构对象时,
E
\mathcal{E}
E 可能代表相当丰富的一类函数。
对现有的预测,分类这些问题,都会给定数据
S
=
{
(
X
i
,
X
j
)
:
i
=
1
,
.
.
,
P
}
\mathcal{S}=\{(X^i, X^j):i=1,..,P \}
S={(Xi,Xj):i=1,..,P} ,然后我们需要一个损失函数来
L
(
E
,
S
)
\mathcal{L}(E,\mathcal{S})
L(E,S) 评估当前的能量函数的好坏,为了简单起见,我们通常表示它为
L
(
W
,
S
)
\mathcal{L}(W,\mathcal{S})
L(W,S)。学习问题很简单,就是要找到使损失最小的
W
W
W :
W
∗
=
m
i
n
W
∈
W
L
(
W
,
S
)
W^*=\underset{W \in \mathcal{W}}{min} \mathcal{L}(W,\mathcal{S})
W∗=W∈WminL(W,S)
在大多数情况下,损失函数是如下形式
L
(
E
,
S
)
=
1
P
∑
i
=
1
P
L
(
Y
i
,
E
(
W
,
Y
,
X
i
)
)
+
R
(
W
)
\mathcal{L}(E,S)=\frac{1}{P}\sum^P_{i=1}L(Y^i,E(W,\mathcal{Y},X^i))+R(W)
L(E,S)=P1i=1∑PL(Yi,E(W,Y,Xi))+R(W)
损失由一个训练集样本损失函数均值和正则化器 R(W) 组成,后者可以用来引入我们的先验知识,可能是哪类能量函数比其他能量函数更可取(在缺乏训练数据的情况下)。
Designing a Loss Functional
直观来说损失应该满足如下条件:对一个表现良好的能量函数赋予低损失(如果该能量函数给正确答案的能量最低,其他答案的能量较高),相反损失较高。损失函数需要指导训练过程塑造正确的的surface of energy,如下图所示
即push down正确回答的能量,push up错误回答的能量。
其中
Y
i
Y^i
Yi 是正确答案,
Y
i
−
\overset{-}{Y^i}
Yi− 是能量最低的错误答案。
总结一下:给定一个训练集 S \mathcal{S} S ,构建和训练一个基于能量的模型需要设计四个部分
- The architecture,即 E ( W , Y , X ) E(W, Y, X) E(W,Y,X) 的内部结构。
- The inference algorithm,对任意给定的 X 求出使 E ( W , Y , X ) E(W, Y, X) E(W,Y,X) 最小的 Y 值的方法。
- The loss function,用于评估能量函数的好坏
- The learning algorithm,在给定训练集的能量函数 E 的泛函族上,找到使得损失最小的参数 W 的方法。
其中1,3最为重要:我们可能拥有的关于当前任务的任何先验知识都被嵌入到架构和损失函数中(特别是正则化器)。不幸的是,并不是所有架构和损失函数的组合都是允许的。在某些组合下,最小化损失并不能使模型产生最佳答案。对于基于能量的方法来说,选择能够有效学习的架构和损耗函数的组合是至关重要的,因此也是本教程的中心主题。