ICML 2018 《GAIN : Missing Data Imputation using Generative Adversarial Nets》
总览
这篇论文中作者提出了一种使用GAN进行估值来完成填补缺失值工作的GAIN,基本原理和标准的GAN相似,不同的在于根据具体问题所做的架构方面的改变。严格来说,它并不是对于GAN的某种改进,只是将其用在了缺失值估值方面,但还是有很多方面有借鉴的地方。GAIN中主要包括以下三个部分:
- Generator,G:它用来观察真实数据的每一部分,然后根据观察的结果填补缺失数据的部分,输出一个填补后完整的向量
- Discriminator,D:它接受一个完整的向量,来判别哪一部分数据是真实观察到的,哪一部分是被填补的
- Hint Vector,hint:它揭示了原始数据中缺失部分的某些信息,让D更加关注它所提示的部分,同时也逼迫G生成更加接近真实的数据用来填补
当然实现的细节并不是这么简单,具体细节正文中会介绍。最后作者通过在多个数据集上进行实验,证明了GAIN的性能比之前各种填补算法都要好。
背景
在实际的问题中,数据的缺失是一个很普遍的现象,有时因为数据本身就很难获得,有时是因为各种原因而造成了数据的丢失。作者的关注领域主要是医疗数据,此外也提出了数据填充算法同样也可以用在其他的方面,比如图像含混、数据压缩等等。
缺失的数据可以分为以下的三大类:
- MCAR:数据的缺失完全是随机的,它不依赖于任何的变量
- MAR:数据的缺失不完全是随机的,仅依赖于可以观察到的变量
- MNAR:数据的缺失不是随机的,它依赖于目前可以观察到的变量,同样也依赖于未观察的变量,我们无法通过可以观察到的变量来掌握数据的情况
本文作者主要是针对MCAR这种情况提出新的填补算法,并与在这种背景下的其他先进的填补算法进行了比较。
同时填补算法也可以分为判别式和生成式两种:
- generative methods:这些方法主要依赖于EM算法和深度学习,如DAE、GAN等
- discriminative methods:如MICE、MissForest、matrix completion等
但是目前的生成式填补算法存在着一些缺点,它们是以一种基于对数据分布的先验假设的方法,当数据中含有混合类别和连续变量时,它的泛化能力就会很差。DAE在一定程度上解决了这个问题,但是它在训练的过程中需要完成的数据集,在很多情况下,缺失的数据部分在一定程度上反映了完整数据集的内在结构信息,所以获取到完成的数据集是不太可能的。DAE的另一种方法允许使用不完整的数据集进行训练,但是它只能根据观察到的部分来表示数据。而使用DCGANs来完成图像填补的算法,同样需要完整的数据集来训练判别器。
本文作者提出的GAIN是GAN的一个泛化版本,它基本上采用了GAN的架构,在数据集不完整的情况下,它也可以很好的处理数据的填补。在GAIN中,生成器的目标是精确的填补缺失的数据,判别器的目标是准确的分辨数据是填补的还是真实的。所以判别器要最小化分类误差率,而生成器要最大化判别器的分类误差率,这样两者就处在了一种相互对抗的过程中。同时为了使这个对抗过程得到更加理想的结果,还为判别器提供了关于数据的部分信息的hints,逼迫生成器生成的样本接近于真实的数据分布。
问题的公式化表示
首先给出GAIN的架构图

为了方便公式的推导,先做以下的规定:
-
χ : χ = χ 1 × … × χ d \chi :\chi=\chi_{1}\times…\times \chi_{d} χ:χ=χ1×…×χd,表示一个d维的空间
-
X : X = X 1 × … × X d X:X=X_{1}\times…\times X_{d} X:X=X1×…×Xd,表示取自 χ \chi χ空间中的一个随机变量,将其称为数据向量
-
P ( X ) : P(X): P(X): 表示X的数据分布
-
M : M = { M 1 … M d } M:M=\{M_{1}…M{d}\} M:M={M1…Md},表示取值{0,1}的随机变量,将其称为掩模向量,,它反映了哪些变量是观察数据,哪些是填补的
-
χ i ~ : \tilde{\chi_{i}}: χi~: χ i ~ = χ i ∪ { ∗ } \tilde{\chi_{i}}=\chi_{i}∪\{\ast\} χi~=χi∪{∗}, i = 1 , 2 , … , d i=1,2,…,d i=1,2,…,d, χ i ~ \tilde{\chi_{i}} χi~表示对于每一维定义的新空间,其中 ∗ \ast ∗表示不在 χ \chi χ任何一维空间 χ i \chi_{i} χi中的数据
-
χ ~ \tilde{\chi} χ~: χ ~ = χ 1 ~ × … × χ d ~ \tilde{\chi}=\tilde{\chi_{1}}\times…\times \tilde{\chi_{d}} χ~=χ1~×…×χd~,表示新生成的d维空间
-
X ~ : X ~ = X 1 ~ × … × X d ~ \tilde{X}:\tilde{X}=\tilde{X_{1}}\times…\times \tilde{X_{d}} X~:X~=X1~×…×Xd~,表示取样自 χ ~ \tilde{\chi} χ~的一个随机变量,它的取值规定如下:
X i ~ = { X i , if M i = 1 ∗ , otherwise \tilde{X_{i}} = \begin{cases} X_{i}, & \text{if $M_{i}$ = 1} \\ *, & \text{otherwise} \end{cases} Xi~={Xi,∗,if Mi = 1otherwise可以从 X ~ \tilde{X} X~复原 M M M
-
x ~ i , i = 1 , 2 , . . . , n \tilde{x}^{i},i=1,2,...,n x~i,i=1,2,...,n:表示 X ~ \tilde{X} X~空间中的第 i i i个数据
-
m i , i = 1 , 2 , . . . , n m^{i},i=1,2,...,n mi,i=1,2,...,n:表示从 X ~ \tilde{X} X~复原 M M M的元素
-
D D D: D = { x ~ i , m i } , i = 1 , 2 , . . . , n D=\{\tilde{x}^{i},m^{i}\},i=1,2,...,n D={x~i,mi},i=1,2,...,n,表示要使用的数据集
我们的目标就是根据上面定义的内容填充 x ~ i \tilde{x}^{i} x~i缺失的部分,通常使用条件概率 P = ( X ∣ X ~ = x ~ i ) P=(X|\tilde{X}=\tilde{x}^{i}) P=(X∣X~=x~i)来填补D中缺失的值。这里是尝试找到数据分布模型,而不仅仅是求期望。通过多次的填补,我们就可以把握数据内在的不确定性。
GAIN
这部分通过由GANs驱动的模拟 P = ( X ∣ X ~ = x ~ i ) P=(X|\tilde{X}=\tilde{x}^{i}) P=(X∣X~=x~i)的方法来阐述GAIN的思路。
Generator
G将 X ~ \tilde{X} X~、 M M M和 Z Z Z做为输入,输出 X ˉ \bar{X} Xˉ, Z Z Z是一个d维的噪声,独立于所有的变量。
定义两个随机变量:
X
ˉ
=
G
(
X
~
,
M
,
(
1
−
M
)
⊙
Z
)
X
^
=
M
⊙
X
~
+
(
1
−
M
)
X
ˉ
\bar{X}=G(\tilde{X},M,(1-M)\odot Z) \\ \hat{X}=M \odot \tilde{X}+(1-M)\bar{X}
Xˉ=G(X~,M,(1−M)⊙Z)X^=M⊙X~+(1−M)Xˉ
X ˉ \bar{X} Xˉ:指的是填补值的向量,不含已观察到的数据部分,这里需要注意的是,G会为每一部分都输出一个值,即使有些部分不是缺失的。
X ^ \hat{X} X^:指的是填补后完整的数据向量,它观察 X ~ \tilde{X} X~局部的信息,然后用 X ˉ \bar{X} Xˉ中的估算值代替对应位置的 ∗ \ast ∗得到。
- 因为M中的值(0,1)指示了采样得到的数据中哪些部分是缺失的,哪些部分是可以被观察到的,那么使用相同尺寸的单位阵与M相减,0和1互换位置,就告诉了哪些部分是需要进行估值的,所以在 X ˉ \bar{X} Xˉ的表达式中 ( 1 − M ) ⊙ Z (1-M)\odot Z (1−M)⊙Z就表示了使用随机噪声z来填补缺失的部分
- 使用 ( 1 − M ) ⊙ Z (1-M)\odot Z (1−M)⊙Z代替 Z Z Z,是为了使得让噪声数据的维度匹配目标分布,即告诉 Z Z Z在 X ~ \tilde{X} X~中哪些部分是需要使用噪声进行填充的。
Discriminator
和标准的GAN一样,判别器被用来作为一个对抗者训练G。不同之处在于标准的GAN中,生成器生成结果要么全是真实的,要么全是假的,判别器给出的结果也只有真假两个选择。但是在GAIN中,生成器给出的结果有些部分是真实的,有些部分是生成的;判别器也不是识别整个向量的真假,而是试图判别哪些部分是真的,哪些是生成的。这就相当于预测 M M M中 m m m的值。
D ( X ^ ) D(\hat{X}) D(X^)中的第 i i i个成分表示的是 X ^ \hat{X} X^的第 i i i个成分是观察数据的概率
Hint
这是一种提示机制,强化了G和D的对抗过程。它是一个随机变量 H H H,从 H \mathcal {H} H中取值, H H H和 H \mathcal {H} H都是用户自己定义的。 H H H中的元素 h h h依赖于分布 H ∣ M = m H|M=m H∣M=m,将其输入到D中。基于条件 X ^ = x ^ \hat{X}=\hat{x} X^=x^和 H = h H=h H=h,此时 D ( x ^ , h ) D(\hat{x},h) D(x^,h)中第 i i i个部分就反映了它是真实数据的概率。
H H H定义的不同,那么给D的提示信息就不同,从而可以训练出具有多个分布的G,根据D的结果来选择最优的那一个。
目标
通过最大化正确预测M的概率来训练D,通过最小化D能正确预测M的概率来训练G。所以类似于GAN,定义如下的评估函数:
V
(
D
,
G
)
=
E
X
^
,
M
,
H
[
M
T
l
o
g
D
(
X
^
,
H
)
+
(
1
−
M
)
T
l
o
g
(
1
−
D
(
X
^
,
H
)
)
]
V(D,G)=\mathbb{E}_{\hat{X},M,H}[M^TlogD(\hat{X},H)+(1-M)^Tlog(1-D(\hat{X},H))]
V(D,G)=EX^,M,H[MTlogD(X^,H)+(1−M)Tlog(1−D(X^,H))]
因此GAIN的目标就是
min
G
max
D
V
(
D
,
G
)
\min \limits_{G} \max \limits_{D} V(D,G)
GminDmaxV(D,G)
因为对于判别器来说就是一个简单的二分类问题,所以这里就使用交叉熵来定义损失函数,如下所示
L
(
a
,
b
)
=
∑
i
=
1
d
[
a
i
l
o
g
(
b
i
)
+
(
1
−
a
i
)
l
o
g
(
1
−
b
i
)
]
\mathcal{L}(a,b)=\sum_{i=1}^d [a_{i}log(b_{i})+(1-a_{i})log(1-b_{i})]
L(a,b)=i=1∑d[ailog(bi)+(1−ai)log(1−bi)]
其中
a
i
a_{i}
ai表示D预测结果矩阵中的元素,
b
i
b_{i}
bi表示对应于
a
i
a_{i}
ai的
M
M
M中的元素。
令
M
^
=
D
(
X
^
,
H
)
\hat{M}=D(\hat{X},H)
M^=D(X^,H),则目标就转换成了D能否正确预测
M
M
M的函数
min
G
max
D
E
[
L
(
M
,
M
^
)
]
\min \limits_{G} \max \limits_{D} \mathbb{E}[\mathcal{L}(M,\hat{M})]
GminDmaxE[L(M,M^)]
GAIN算法
首先给出算法描述的伪代码:

这里G和D都是全连接的神经网络,迭代的解决 min G max D V ( D , G ) \min \limits_{G} \max \limits_{D} V(D,G) GminDmaxV(D,G)这个最大最小优化问题。
-
判别器D的训练过程:
固定一个G和小批次的大小 k D k_{D} kD,首先从数据集中抽样 k D k_{D} kD个样本 ( x ~ ( j ) , m ( j ) ) (\tilde{x}(j),m(j)) (x~(j),m(j)),从 Z Z Z和 B B B中抽样 k D k_{D} kD个样本 z ( j ) z(j) z(j)和 b ( j ) b(j) b(j),然后根据公式计算 x ^ ( j ) \hat{x}(j) x^(j)和 h ( j ) h(j) h(j)。根据数学推理知道,当G固定时,D的唯一输出是对应于每个样本的 b i = 0 b_{i} = 0 bi=0的部分,因此我们只训练D来给出 b i = 0 b_{i}=0 bi=0部分的输出。定义关于D的损失函数:
L D ( m , m ^ , b ) = ∑ i : b i = 0 [ m i l o g ( m i ^ ) + ( 1 − m i ) l o g ( 1 − m i ^ ) ] \mathcal{L}_{D}(m,\hat{m},b)=\sum_{i:b_{i}=0}[m_{i}log(\hat{m_{i}})+(1-m_{i})log(1-\hat{m_{i}})] LD(m,m^,b)=i:bi=0∑[milog(mi^)+(1−mi)log(1−mi^)]D根据以下的准则来训练:
min D ∑ j = 1 k D L D ( m ( j ) , m ^ ( j ) , b ( j ) ) \min \limits_{D} \sum_{j=1}^{k_{D}}L_{D}(m(j),\hat{m}(j),b(j)) Dminj=1∑kDLD(m(j),m^(j),b(j)) -
生成器G的训练过程:
使用最近更新过的D,以小批量 k G k_{G} kG进行训练。G实际上输出的是一个包含所有数据的向量,因此在G的训练过程中,我们不仅要使缺失地方 ( m j = 0 ) (m_{j}=0) (mj=0)填补的值成功的骗过D,还要保证真实被观察的数据( m j = 1 m_{j}=1 mj=1)的输出也要接近真实值。为此我们需要定义两个损失函数如下所示:
L G ( m , m ^ , b ) = − ∑ i : b i = 0 ( 1 − m i l o g ( m i ^ ) ) \mathcal{L}_{G}(m,\hat{m},b)=-\sum_{i:b_{i}=0}(1-m_{i}log(\hat{m_{i}})) LG(m,m^,b)=−i:bi=0∑(1−milog(mi^))
它用来评估填补的质量,它的值越小,表示 m i = 0 m_{i}=0 mi=0被D判别为 m i = 1 m_{i}=1 mi=1的概率越接近1。
L M ( x , x ′ ) = ∑ i = 1 d m i L M ( x i , x i ′ ) \mathcal{L}_{M}(x,x')=\sum_{i=1}^dm_{i}L_{M}(x_{i},x_{i}') LM(x,x′)=i=1∑dmiLM(xi,xi′)其中
L M ( x , x ′ ) = { ( x i ′ − x i ) 2 , if x i is continuous − x i l o g ( x i ′ ) , if x i is binary \mathcal{L}_{M}(x,x')= \begin{cases} (x_{i}'-x_{i})^2, & \text {if $x_{i}$ is continuous} \\ -x_{i}log(x_{i}'), & \text{if $x_{i}$ is binary} \end{cases} LM(x,x′)={(xi′−xi)2,−xilog(xi′),if xi is continuousif xi is binary
它表示重建误差,用来评估真实观察值经过G的输出与真实值的差距。它的值越小,说明重构后的值越接近真实值。因此我们可以使用一个完整的损失函数评估训练过程:
min G ∑ j = 1 k G L G ( m ( j ) , m ^ ( j ) , b ( j ) ) + α L M ( x ~ ( j ) , x ^ ( j ) ) \min \limits_{G}\sum_{j=1}^{k_{G}}\mathcal{L}_{G}(m(j),\hat{m}(j),b(j))+\alpha \mathcal{L}_{M}(\tilde{x}(j),\hat{x}(j)) Gminj=1∑kGLG(m(j),m^(j),b(j))+αLM(x~(j),x^(j))α \alpha α这里是一个超参数。
实验评估
作者通过与其他的填补算法进行对比,比较它们的效果。每个实验做10次,同时使用5折交叉验证,使用RMSE(均方根误差RMSE是观测值与真值偏差的平方与观测次数n比值的平方根,值越小越好)和AUROC(ROC曲线下的面积,值越大表示效果越好)来评估结果的优劣。
数据的缺失标准是20%。
实验1
验证GAIN中每一部分对于整体的重要性,通过每次去掉 L G \mathcal{L}_{G} LG、 L M \mathcal{L}_{M} LM、 H H H中的一个来和完整的GAIN进行比较,在6个不同的数据集上进行实验,结果如下

从图中我们可以看出完整的GAIN相比于缺少某一部分的GAIN的效果在每一个数据集上都好的多。
实验2
通过在5个不同的数据集上实验,比较GAIN和其他5个填补算法的效果,结果如下:

GAIN效果明显好于其他算法。
实验3
通过调整数据的缺失率、样本的数量、特征的维度来对比GAIN和MissForest、Auto-encoder的效果,结果如下

从第一个图中可以看到,GAIN在各种缺失比例的条件下,效果都优于其他两种算法。在第二个图中可以看出,随着样本数的增加,GAIN的RMSE迅速下降,并小于其他的两种算法,并且当样本数很多时,它的RMSE也是最小的。从第三个图中看出,随着特征维度的变化,GAIN的效果好于其他两种算法,特别是当特征维度很小时,MissForest和Auto-encoder显得难以处理。
实验4
评估在计算后预测的准确性方面。为了达到这个目的,使用了AUROC作为性能指标。为了公平对待所有方法,我们在所有情况下使用相同的预测模型(逻辑回归)。结果如下

从中我们可以看出,在4个数据集上实验,GAIN和其他的算法相比并没有太大的提升,这可能是填补精度虽然提升了,但是对于预测精度的帮助不大,因为可以80%被观察的数据已有足够的信息来做预测。
而且在不同的缺失率的情况下,GAIN的效果更好,可能是因为当缺失的数据多时,填补的数据对于真实数据的反映对于预测起到了重要的作用。

实验5
填补模型的相似性在于它能够保持特征-标签关系的值。通过测量填补后对特征-标签关系的影响,可以评估填补模型的同质性。作者使用不同的填补算法,从完整的信用数据集中执行Logistic Regression,得到参数 w w w;再从不完整的同样的数据集上执行Logistic Regression,得到参数 w ^ \hat{w} w^,比较 w w w和 w ^ \hat{w} w^。
作者使用了 ∣ ∣ w − w ^ ∣ ∣ 1 ||w-\hat{w}||_{1} ∣∣w−w^∣∣1和 ∣ ∣ w − w ^ ∣ ∣ 2 ||w-\hat{w}||_{2} ∣∣w−w^∣∣2来做评估。这些量越小,说明该算法较好地考虑了特征与标签之间的关系。结果如下

从中可以看出GAIN的效果明显好于其他的算法。
然后在文章的附录中,作者给出了针对M的可视化结果,如下所示

一开始样本经过人为设置的缺失率去掉一些信息后,M的值就变成了0和1的分布,表现在图上就是纯黑的点和纯白的部分。经过多次的训练我们可以看出,对于D来说,M矩阵中的点越来越接近于0.5所代表的颜色,表示它已很难分辨出数据是已观察到的还是生成的,对应的交叉熵损失也在逐渐减小;而对于G来说,它生成M的结果图中的点越来越白,表示填补的数据越来越接近真实,对应的RMSE值也越来越小。
跑了一下MNIST数据集,结果如下所示,我们可以直观的看到模型的效果还是不错的

对应的损失值也很小

总结
作者所提出的新的框架GAIN在缺失数据填补方面有很大的提高,同样也可以将其用在推荐系统、主动感知等其他方面。
附件
最后我看这篇文章所做的一个汇报的PPT,希望可以帮助一起学习的同学更好的理解它的思想