Lecture2 Autoregressive Models
Lecture2的主要内容是自回归模型,主要包括:
- Motivation
- Histogram
- Neural Autoregressive models
- Parameterized distributions and maximum likelihood
- Autoregressive models
- RNN
- Masking-based models
Likelihood-based Model
基于似然的模型主要做的一件事情是:根据数据集 { x ( 1 ) , … , x ( n ) } \{x^{(1)},\dots,x^{(n)}\} {x(1),…,x(n)}学习一个概率分布 p d a t a p_{data} pdata。 学习到的 p d a t a p_{data} pdata应该满足:
- 我们可以得到任意sample x x x的概率密度 p ( x ) p(x) p(x)
- 我们可以从概率分布中采样出一个 x x x
但是我们所处理的数据通常都是高维的,例如一张 128 × 128 × 3 128\times128\times3 128×128×3的彩色图像,他的维度大约是 50000 50000 50000。因此我们还希望我们的模型具有以下几个特点:
- 训练过程高效
- 模型表达能力强、泛化性强
- 生成数据的质量高、速度快
- 压缩率高、速度快
Histogram
最简单粗暴的方法就是根据训练集画一个直方图,我们只需要知道每个特征有哪些不同的取值然后计算frequency当作probability即可
根据直方图模型,我们可以轻松的进行以下两个操作:
- Inference:给定一个 x x x,求 p ( x ) p(x) p(x)。可以直接看图说话
- Sampling:根据CDF生成
x
x
x。可以通过以下几步完成
- 首先计算出CDF: F i = ∑ j = 1 i p ( j ) i ∈ { 1 … k } F_{i}\ =\ \sum_{j=1}^{i}p(j)\ \ \ \ \ i\in \{1\dots k\} Fi = ∑j=1ip(j) i∈{1…k}, k k k是特征不同取值的数量
- 随机生成一个 0 0 0到 1 1 1之间的数 u u u
- 返回最小的 i i i满足 F i ≥ u F_i \ge u Fi≥u
然而,直方图模型最显而易见的缺点就是它无法应用在高维数据上。另一个问题就是他的泛化能力差,毕竟直方图是完全按照训练集的数据分布进行拟合,因此是很明显的过拟合,模型的方差会很大。我们想要的分布应该是如下图这种:
Likelihood-based Generative Model
为了克服histogram有的问题,我们引入一个参数 θ \theta θ,让模型学习一个基于参数 θ \theta θ的概率分布 p θ ( x ) p_{\theta}(x) pθ(x)并且要求 p θ ( x ) p_{\theta}(x) pθ(x)和 p d a t a ( x ) p_{data}(x) pdata(x)越接近越好,这其实就是大多数ML模型在做的事情。
如何训练模型?我们需要定义一个损失函数,最优的参数应该满足最小化损失函数,即
θ
∗
=
a
r
g
m
i
n
θ
l
o
s
s
(
θ
,
x
(
1
)
,
x
(
2
)
,
…
,
x
(
n
)
)
\theta^{*}\ =\ argmin_{\theta}\ \ \ loss(\theta,x^{(1)}, x^{(2)},\dots,x^{(n)})
θ∗ = argminθ loss(θ,x(1),x(2),…,x(n))
而我们定义的损失函数以及我们寻找最优解的过程应该满足:
- 能够应对大规模数据集
- p θ ∗ ( x ) p_{\theta^{*}}(x) pθ∗(x)应该和 p d a t a ( x ) p_{data}(x) pdata(x)匹配
- 得到的模型应该具有良好的泛化能力
Maximum Likelihood
给定数据集
{
x
(
1
)
,
…
,
x
(
n
)
}
\{x^{(1)},\dots,x^{(n)}\}
{x(1),…,x(n)},我们可以通过解决以下的优化问题找到参数
θ
\theta
θ:
a
r
g
m
i
n
θ
l
o
s
s
(
θ
,
x
(
1
)
,
…
,
x
(
n
)
)
=
1
n
∑
i
=
1
n
−
l
o
g
p
θ
(
x
(
i
)
)
argmin_{\theta}\ \ \ loss(\theta,x^{(1)},\dots,x^{(n)})\ =\ \frac{1}{n}\sum_{i=1}^{n}-logp_{\theta}(x^{(i)})
argminθ loss(θ,x(1),…,x(n)) = n1i=1∑n−logpθ(x(i))
也就是经典的最大对数似然法。这个与最小化
p
θ
(
x
)
p_{\theta}(x)
pθ(x)和
p
d
a
t
a
(
x
)
p_{data}(x)
pdata(x)之间的KL散度是等价的:
p
d
a
t
a
(
x
)
=
1
n
∑
i
=
1
n
1
[
x
=
x
(
i
)
]
K
L
(
p
d
a
t
a
∣
∣
p
θ
)
=
∑
x
∼
p
d
a
t
a
p
d
a
t
a
(
x
)
l
o
g
(
p
d
a
t
a
(
x
)
p
θ
(
x
)
)
p_{data}(x)\ =\ \frac{1}{n}\sum_{i=1}^{n}1[x=x^{(i)}]\\ KL(p_{data}||p_{\theta})\ =\ \sum_{x \sim p_{data}} p_{data}(x)log(\frac{p_{data}(x)}{p_{\theta}(x)})
pdata(x) = n1i=1∑n1[x=x(i)]KL(pdata∣∣pθ) = x∼pdata∑pdata(x)log(pθ(x)pdata(x))
Autoregressive Models
首先回顾一些概率论里的东西,假如我们要计算多元随机变量的联合概率分布,我们可以根据chain rule进行拆分,例如:
p
(
x
,
y
,
z
)
=
p
(
x
)
⋅
p
(
x
∣
y
)
⋅
p
(
z
∣
x
,
y
)
p(x,y,z)\ =\ p(x) \cdot p(x|y) \cdot p(z|x,y)
p(x,y,z) = p(x)⋅p(x∣y)⋅p(z∣x,y)
我们知道生成式模型是对联合概率进行建模,而应用了上述的chain rule之后,我们发现得到的目标函数很适合用之前的maximum likelihood方法进行优化
p
θ
(
x
)
=
∏
i
=
1
d
p
θ
(
x
i
∣
x
1
:
i
−
1
)
l
o
g
p
θ
(
x
)
=
∑
i
=
1
d
l
o
g
p
θ
(
x
i
∣
x
1
:
i
−
1
)
p_{\theta}(x)\ =\ \prod_{i=1}^{d}p_{\theta}(x_i | x_{1:i-1}) \\ logp_{\theta}(x)\ =\ \sum_{i=1}^{d}logp_{\theta}(x_i|x_{1:i-1})
pθ(x) = i=1∏dpθ(xi∣x1:i−1)logpθ(x) = i=1∑dlogpθ(xi∣x1:i−1)
这也被称为Autoregressive Model
那么,Autoregressive Model能够解决之前提到的高维数据问题么?实际上Autoregressive Model依旧存在两个问题:
- 对于 n n n维数据,模型参数是 O ( d ) O(d) O(d)的。而这个 d d d其实可以很大
- 泛化能力有限,不同的条件概率分布之间没有共享任何信息
解决这两个问题的有效方法就是进行参数共享
Recurrent Neural Network
比较经典的一类Autoregressive Model就是RNN。在Transformer霸榜以前,RNN模型是被广泛用于文本生成任务的。
RNN的模型结构完美的符合了Autoregressive Model的要求,即在每个时间步我们只能看到之前的数据。而参数共享的实现有三个部分:
- W x h W_{xh} Wxh: 即输入与当前隐状态之间的参数
- W h h W_{hh} Whh: 即上一个隐状态与当前隐状态之间的参数
- W h y W_{hy} Why: 即当前隐状态与输出之间的参数
RNN模型也可以用于图像生成,比如生成MNIST,如果给模型加一个类似positional encoding的输入,RNN也能取得不错的效果
Masking-based Autoregressive Model
Masking-based Autoregressive Model的核心特征是对所有条件概率进行并行运算。
Masked Autoencoder for Distribution Estimation (MADE)
考虑一个普通的MLP,我们输入几张图片进去,得到输出。但是这个输出并不是我们想要的概率分布,它可以表示某种分布,但是没有normalized。MADE模型所做的事情就是通过chain rule将输出进行normalize,得到我们想要的proper distribution。而实现的方式是先给输入数据赋一个ordering,比如在上图中就是3 1 2,然后应用chain rule: x 2 x_2 x2不依赖于任何其他输入, x 3 x_3 x3依赖于 x 2 x_2 x2, x 1 x_1 x1依赖于 x 2 , x 3 x_2,x_3 x2,x3。然后,基于这种依赖关系,MADE设计了相应的mask以确保模型在forward过程中满足这些关系。
MADE中具体的mask设计方法是这样的:
- 对于每一个neuron,生成一个 1 1 1到 D − 1 D-1 D−1的随机数 m m m
- 对于第 k k k个neuron,我们令 m ( k ) m(k) m(k)表示这个neuron最多能够连接的input数量
- 对于input和hidden units之间或者hidden units与hidden units之间的mask, M k , d W = I [ m ( k ) ≥ d ] M^{W}_{k,d}=I[m(k)\ge d] Mk,dW=I[m(k)≥d]
- 对于hidden units与output之间的mask, M d , k V = I [ m ( k ) < d ] M^{V}_{d,k}=I[m(k)<d] Md,kV=I[m(k)<d]
而 M W , V = M W M V M^{W,V}\ =\ M^{W}M^{V} MW,V = MWMV就能够表示从每个input到每个output的路径,可以证明这个矩阵是严格lower diagonal的,也就能够满足Auto-regressive的性质。
上图是MADE在MNIST数据集上sampling的效果,可以看出MADE的expressiveness和generalize ability都是不错的。
WaveNet
WaveNet是语音领域的一个经典模型。首先我们来看普通的Masked 1D Convolution。
根据Autoregressive Model的要求,我们只能看到当前数据之前的数据,因此我们也只能对之前的数据进行卷积。这种模型的优点是:
- 比较容易实现,可以直接对卷积核进行mask
- 参数量是一个常数
- 计算效率高
但是一个很大的缺点是感受野(receptive field)十分有限,从上图就能看出,三层的hidden layer感受野才只有5,因此要获得较大的感受野,必须增加多层卷积网络或者用很大的卷积核。
WaveNet对卷积进行了改进,设计了一种dilated convolution,直观感受就是模型在跳步进行卷积,随着深度的增加,步长也越大。
除了这一改进,WaveNet还设计了更加优秀的网络结构来增强模型的表达能力,包括使用了残差连接和门控机制
PixelCNN
PixelCNN可以看作是WaveNet的二维卷积形式,在图像生成领域应用很广泛。同样的问题,当我们想生成像素点 x i x_i xi的时候,我们只能看到 x i x_i xi之前的像素点,而不能看到之后的。因此还是需要对卷积核进行一个mask操作。
一种简单的方式就是设计如下图的mask
而根据前面介绍的MADE模型,我们知道layer与layer之间是可以有horizontal connection的。因此PixelCNN中的mask也分为type A mask和type B mask。 type A mask就是上图这种,表示input与first layer之间的卷积核mask;type B mask则是允许当前像素点可见,也就是中心的那个pixel的mask值现在变为1。
Improvements
但是这种mask产生了一个问题叫做:blind spot in receptive field
这个问题的产生是由于我们的mask只能看到上面那个L型,因此当我们卷积到比较靠两边的像素点时,mask为0的区域我们永远也无法看到。
PixelCNN对此的改进是对于每个像素点,我们把mask值为1的区域分成两个部分,一个部分是像素点所在行之前的所有行,也就是像素点上方的矩形区域;另一个部分是像素点当前行左边的部分。上方的矩形部分我们把它叫做Vertical Stack,左边的长条部分叫做Horizontal Stack。通过对这两个部分分别进行卷积,再合并,就能解决blind spot的问题。
另一个改进来源于PixelRNN,作者引入了LSTM的门控机制,提出Gated PixelCNN
y
=
t
a
n
h
(
W
k
,
f
∗
x
)
⋅
σ
(
W
k
,
g
∗
x
)
y\ =\ tanh(W_{k,f} * x)\cdot \sigma(W_{k,g} * x)
y = tanh(Wk,f∗x)⋅σ(Wk,g∗x)
改进后的PixelCNN结构如下图所示,左边的输入表示Vertical Stack, 右边的是Horizontal Stack,绿色的部分表示卷积操作以及卷积核的大小。
Conditional PixelCNN
朴素的PixelCNN在学习的是以下的概率分布:
p
(
x
)
=
∏
i
=
1
n
2
p
(
x
i
∣
x
i
−
1
,
x
i
−
2
,
…
,
x
1
)
p(x)\ =\ \prod_{i=1}^{n^2}p(x_i|x_{i-1},x_{i-2},\dots,x_1)
p(x) = i=1∏n2p(xi∣xi−1,xi−2,…,x1)
实际上我们还可以给模型一个high-level image description latent vector
h
h
h,这个
h
h
h可以表示图片所属的类别,或者表示图片中一些位置信息(文中提到可以通过deconvolution训练出一个与图中位置相关的特征表示
s
=
m
(
h
)
s=m(h)
s=m(h))。于是模型接下来train的就变成了一个条件概率:
p
(
x
)
=
∏
i
=
1
n
2
p
(
x
i
∣
x
i
−
1
,
…
,
x
1
,
h
)
p(x)\ =\ \prod_{i=1}^{n^2}p(x_i|x_{i-1},\dots,x_1,h)
p(x) = i=1∏n2p(xi∣xi−1,…,x1,h)
具体融合
h
h
h的方式类似于把它作为卷积的一个bias
y
=
t
a
n
h
(
W
k
,
f
∗
x
+
V
k
,
f
T
h
)
⋅
σ
(
W
k
,
g
∗
x
+
V
k
,
g
T
h
)
y\ =\ tanh(W_{k,f} * x + V_{k,f}^T h)\cdot \sigma(W_{k,g} * x + V_{k,g}^T h)
y = tanh(Wk,f∗x+Vk,fTh)⋅σ(Wk,g∗x+Vk,gTh)
Masked Attention
Attention是masking-based模型中最典型的一种,也是目前最热门的一种。对于Multi-head Self-Attention的计算过程就不多赘述了,而实现Autoregressive的方法也很简单,只需要设计一个只能看到前面数据的mask就可以,自己和之后的数据置为一个非常小的值,这样再取 e x p exp exp就近似于0。