基于卷积神经网络CNN和去偏变分自动编码机DB-VAE的简单人脸识别模型

卷积神经网络

简介

卷积神经网络(Convolution Neural Networks, CNN, ConvNet),结构特性:局部连接,权重共享,汇聚信息. 主要适用于图像处理的一种神经网络,其想法来源来自于生物模型中的感受野(Receptive Field),即视觉神经元只会接收到其所支配的刺激区域的信号,即获得某个区域内的加权平均结果,这种操作在数学中就是卷积.

卷积

这里的卷积指的是离散型的卷积形式.

一维卷积

{wi},{xi}\{w_i\},\{x_i\} 为两个数列,kRk\in\mathbb{R},定义 {wi}\{w_i\}{xi}\{x_i\} 的有限卷积为以下数列

yt=k=1Kwkxtk+1,(tK)y_t = \sum_{k=1}^Kw_kx_{t-k+1},\quad(t\geqslant K)

其中 {wi}\{w_i\} 称为滤波器(Filter)或卷积核(Convolution Kernel),{xi}\{x_i\}信号序列KK滤波器长度.

如果我们将数列记为对应的函数值:w(i)=wi (1iK), x(i)=xi (1i), y(t)=yt (Kt)w(i) = w_i\ (1\leqslant i\leqslant K),\ x(i) = x_i\ (1\leqslant i),\ y(t) = y_t\ (K\leqslant t). 则上述定义可视为:数列 {wi},{xi}\{w_i\}, \{x_i\}R\mathbb{R} 上的零延拓,即 w(i)={wi,1iK,0,otherwise.w(i) = \begin{cases}w_i,&\quad1\leqslant i\leqslant K,\\0,&\quad\texttt{otherwise}.\end{cases} 用更形象的方式将其列出如下

i=,1,0,1,2,,K,K+1,K+2,w(i)=,0,w1,w2,w3,,wK,0,0,x(i)=,0,x1,x2,x3,,xK,xK+1,xK+2,\begin{matrix} i=&\cdots,&-1,&0,&1,&2,&\cdots,&K,&K+1,&K+2,&\cdots\\ w(i)=&\cdots,&0,&w_1,&w_2,&w_3,&\cdots,&w_K,&0,&0,&\cdots\\ x(i)=&\cdots,&0,&x_1,&x_2,&x_3,&\cdots,&x_K,&x_{K+1},&x_{K+2},&\cdots\\ \end{matrix}

定义两个离散数列 {wi},{xi}\{w_i\},\{x_i\} 的卷积如下:

wx:= i=wixti+1=i=tj+1j=xjwtj+1=xw= i=1Kwixti+1\begin{aligned} w*x :=&\ \sum_{i=-\infty}^\infty w_ix_{t-i+1}\xlongequal{i = t-j+1}\sum_{j=-\infty}^\infty x_jw_{t-j+1}=x * w\\ =&\ \sum_{i=1}^Kw_ix_{t-i+1} \end{aligned}

通过 (3)(3) 式可知卷积具有可交换性,(4)(4) 式表明 (1)(1) 式中定义的有限卷积其实就是在数列零延拓下的卷积,再截取 tKt\geqslant K 这一段的结果.

卷积操作在信号处理方面有不错的效果,可以通过不同的卷积核,对不同的信号进行提取. 下面是几个简单例子

  1. 简单移动平移:w=[1/k, 1/k, , 1/k]w = [1/k,\ 1/k,\ \cdots,\ 1/k](用于时间序列中消除数据的随机波动).

  2. 二阶微分近似:w=[1, 2, 1]w=[1,\ -2,\ 1],由数值分析的知识可知,连续二阶可微函数 x(t)x(t),有如下近似式

    x(t)x(th)2x(t)+x(t+h)h2=h=1x(t1)2x(t)+x(t+1)x''(t) \approx \frac{x(t-h)-2x(t)+x(t+h)}{h^2}\xlongequal{\text{令}h=1}x(t-1)-2x(t)+x(t+1)

二维卷积

常用于图像处理,设图像 xRM×Nx\in\mathbb{R}^{M\times N} ,卷积核 wRU×Vw\in\mathbb{R}^{U\times V},一般有 UM,VNU\ll M,V\ll N,类比一维卷积定义,二维卷积定义如下:

yst=i=1Uj=1Vwijxsi+1,tj+1=i=j=wijxsi+1,tj+1=:wxy_{st} = \sum_{i=1}^U\sum_{j=1}^Vw_{ij}x_{s-i+1,t-j+1}=\sum_{i=-\infty}^\infty\sum_{j=-\infty}^\infty w'_{ij}x'_{s-i+1,t-j+1}=:w*x

其中 wij,xijw'_{ij}, x'_{ij} 分别为 wij,xijw_{ij}, x_{ij} 的零延拓,记 y=wxRy=w * x\in\mathbb{R}. 下图是几种不同卷积核作用在一张图片上的效果:

不同卷积核效果

互相关

在机器学习和图像处理中,卷积的作用主要是通过在一个图像上滑动一个卷积核,通过卷积操作得到一个新的图像. 在计算卷积过程中,需要对卷积核进行反转操作,即对卷积核旋转 π\pi 大小. 这个操作就显得多余了,所以在计算机中经常将卷积视为互相关(Cross-Correlation)操作,即直接对卷积核和原图进行点积操作(对应位相乘).

设图像 xRM×Nx\in\mathbb{R}^{M\times N} ,卷积核 wRU×Vw\in\mathbb{R}^{U\times V},则它们的互相关为:

yst=i=1Uj=1Vwijxs+i1,t+j1=i=j=wijxs+i1,t+j1=:wxy_{st} = \sum_{i=1}^U\sum_{j=1}^Vw_{ij}x_{s+i-1,t+j-1} = \sum_{i=-\infty}^\infty\sum_{j=-\infty}^\infty w'_{ij}x'_{s+i-1,t+j-1}=:w\otimes x

(6)(6) 式对照可知,互相关和卷积的区别仅仅在于卷积核是否需要翻转,即 wx=rot(w)xw\otimes x = \text{rot}(w)*xrot(w)\text{rot}(w) 表示将矩阵 ww 旋转 π\pi 以后的结果. 因此互相关也称为不翻转卷积.

卷积的变种

在卷积的基础上,还可以引入步长和零填充增加卷积的多样性,以便更灵活地提取图像特征.

  • 步长(Stride)指卷积核在滑动时的时间间隔.
  • 零填充(Zero Padding)指对输入矩阵的边缘进行零填充.

步长和零填充

设卷积层的输入向量维数为 MM,卷积大小为 KK,步长为 SS,在输入两端各填补 PP00,则输出向量维度为 (MK+2P)/S+1(M-K+2P)/S+1

常用卷积有以下三种:

  1. 窄卷积(Narrow Convolution):S=1,P=0S=1, P=0,输出维度为 MK+1M-K+1.(普通卷积)
  2. 宽卷积(Wide Convolution): S=1,P=K1S=1, P=K-1,输出维度为 M+K1M+K-1.
  3. 等宽卷积(Equal-Width Convolution):S=1,P=(K1)/2S=1, P=(K-1)/2,输出维度为 KK. 上图(b)(b)就是一种等宽卷积.

卷积神经网络结构

卷积层

卷积层的作用是提取局部区域的特征,将输入卷积层的矩阵称为输入特征,将通过卷积层后的输出称为输出特征,也称特征映射(Feature Map).

一般的图片每个像素由RGB三原色(颜色通道数为 33)构成,假设图片的宽度和高度分别为 N,MN, M,颜色通道数为 DD,则一张图片 xRN×M×Dx\in\mathbb{R}^{N\times M\times D},由于图片的像素值一般为无符号 88 位整型,即 xijk[0,255]x_{ijk}\in[0,255],所以也有 x[0,255]N×M×Dx\in[0,255]^{N\times M\times D},当我们对图片进行归一化处理后,即 xx/256x\leftarrow x / 256,就有 x[0,1)N×M×Dx\in[0, 1)^{N\times M\times D}.

卷积层中,假设每个卷积核大小为 U×VU\times V,且每个颜色通道上都对应有 PP 个卷积核,则卷积核 wRU×V×P×Dw\in\mathbb{R}^{U\times V\times P\times D},令第 dd 个颜色通道上的第 pp个卷积核为 wd,pw_{d,p}. 由于每个卷积核 wd,pw_{d,p} 作用在图片 xx 上都会得到一个输出 ypy_p,所以一共有 PP 个输出特征,所以特征映射 yRN×M×Py\in\mathbb{R}^{N'\times M'\times P}N×MN'\times M' 为卷积核 U×VU\times V 作用在 N×MN\times M 矩阵后的维度. 可以参考下图更好地理解.

卷积层的三维结构

汇聚层

汇聚层(Pooling Layer)也称池化层子采样层(Subsampling Layer). 起作用是对卷积层输出的特征映射进一步进行特征选取,降低特征数量,减少参数数量.

设汇聚层的输入特征 xRN×M×Dx\in\mathbb{R}^{N\times M\times D},对于其中每一个颜色通道中的图像 xdx^d,划分为很多的区域 {Rijd}\{R_{ij}^d\},满足 ijRijd{xij}\bigcup_{ij} R_{ij}^d\subset\{x_{ij}\},这些区域可以是不交的,也可以有交集. 汇聚(Pooling)是指对每个区域进行下采样(Down Sampling)操作得到的值,作为该区域的概括.

常用的汇聚操作有以下两种:

  1. 最大汇聚(Maximum Pooling):对于一个区域 RijdR^d_{ij},选择这个区域内所有神经元的最大活性值作为这个区域的表示,即

    yijd=maxxRijdxy^d_{ij} = \max_{x\in R^d_{ij}}x

  2. 平均汇聚(Mean Pooling):取该区域内的所有活性值的平均值作为该区域的表示,即

    yijd=1RijdxRijdxy_{ij}^d=\frac{1}{|R_{ij}^d|}\sum_{x\in R_{ij}^d}x

    其中 Rijd|R_{ij}^d| 表示集合 RijdR_{ij}^d 的基数,即该集合中所包含元素的个数.

卷积网络的一般结构

一个经典卷积网络由卷积层、汇聚层、全连接层堆叠而成,常用卷积神经网络结构如下图所示. 一个卷积块为一组连续 MM 个卷积层和 bb 个汇聚层构成(MM 取值通常为 252\sim 5,且卷积核大小逐层增大,个数逐层增多,bb 通常取为 0011),卷积神经网络堆叠 NN 个连续的卷积块,然后连接 KK 个全连接层(NN 通常取为 11001\sim 100 或更大,KK 一般取为 020\sim 2).

经典卷积网络结构

卷积网络的卷积核大小一般取为 2×22\times 23×33\times 3,以及更多的数量如 3232 个或更多. 由于卷积可以设置步长减少输出特征的大小,所以汇聚层的作用并不显著了,可以通过增加步长来替代.

代码实现

完整代码:1. 基于前馈型全连接神经网络的数字识别;2. 基于RNN的数字识别(数据增强).

第一个版本是最简单的全连接神经网络模型,实现较为简单,对数据集的识别率已经达到 95%95\% 以上,但是如果自定义输入数字,识别效果并不好. 所以第二个版本,在加入RNN的基础上,进行了数据增强操作.

数据增强简单来说就是对原有数据集的图像增加噪声,随机添加轻微扰动后再加入训练集,从而提高模型的鲁棒性. 常见的扰动操作有旋转,平移,拉伸,缩放等,下图就举出了一些例子,最左端为原始图片,右侧均为经过变换后的图片.

数据增强

优化后的算法准确率达到 98%98\% 甚至更高,而且对自定义数字输入识别率极高.

自定义数字识别效果

无监督学习

变分自动编码机

变分自动编码机(Variational AutoEncoder, VAE),是一种通过完全无监督的方式学习图片中的潜在特征编码.

VAE结构

如上图和MIT 6.S191第四讲可知,VAE通过编码-解码(Encoder-Decoder)结构来学习输入数据的潜在表示. 在计算机视觉中,编码网络(Encoder Network)用于接受输入图像,将它们编码为一系列由均值 μ\mu(Mean)和标准差 σ\sigma(Standard Deviation),通过这两个参数就可以定义出潜空间(Latent Space,概率分布函数,通常使用Gauss分布),然后从该空间中进行采样(Sample,根据概率分布随机取样),得到一组潜变量(Latent Variables). 然后通过解码网络(Decoder Network)对这些潜变量进行解码,从而得到输入图像的重建结果. 我们期望输出的结果与输入图像能够尽可能地相似.

设输入图像为 xx,编码过程相当于计算出概率分布 qϕ(zx)q_\phi(z|x)(潜空间),然后对 qϕ(zx)q_\phi(z|x) 进行采样得到编码 zz,然后对 zz 进行解码计算出 x^\hat{x},解码器也可以抽象为一个概率分布 pθ(xz)p_\theta(x|z). 我们期望输入图像与输出图像差别竟可能小,即 xx^2||x-\hat{x}||^2 尽可能小,且希望潜空间 qϕ(zx)q_\phi(z|x) 近似于某个期望的分布 p(z)p(z),即 D(qϕ(zx)p(z))D\big(q_\phi(z|x)||p(z)\big) 最小,D(qp)D(q||p) 用于衡量两个概率分布的差距,一般取为KL散度.

在训练模型的过程中,可以通过VAE识别哪些潜变量对模型训练更加重要. 下面让我们将具体分析VAE的两个关键部分的损失函数,并讨论如何对其参数进行梯度更新.

VAE损失函数

潜空间就是潜变量的概率分布函数,可以通过在潜空间采样获得潜变量,我们需要将潜空间 N(μ,σ2I)\mathcal{N}(\mu,\sigma^2I) 向一个标准Gauss分布 N(0,I)\mathcal{N}(0, I) 近似,这样可以使得潜变量更具有连续性,避免其分布过于分散. 这里需要对可学习参数进行更新,所以我们需要定义第一个损失函数(Loss Function). 并且VAE用这些参数进行图像重建后,还需考虑和输入图像的匹配程度,这里需要第二个损失函数. 因此我们VAE的损失函数具有两项:

  1. 潜损失 Latent Loss LKLL_{KL}:用于衡量潜空间和标准Gauss分布的匹配程度,这里由 Kullback-Leibler (KL) 散度所定义.

  2. 重建损失 Reconstruction Loss Lx(x,x^)L_{x}(x, \hat{x}):用于衡量重建所得到的图片与输入图片的匹配程度,由 L1L^1 范数所定义.

潜损失的表达式(KL散度,μ,σ\mu, \sigma 分别为编码的均值和标准差):

LKL(μ,σ)=12j=0k1(σj+μj21logσj)L_{KL}(\mu, \sigma) = \frac{1}{2}\sum_{j=0}^{k-1}(\sigma_j + \mu_j^2-1-\log\sigma_j)

重建损失的表达式(L1L^1 范数,其中 xx 为输入特征,x^\hat{x} 为重建输出):

Lx(x,x^)=xx^1L_x(x,\hat{x}) = ||x-\hat{x}||_1

综上,VAE损失为:

LVAE=cLKL+Lx(x,x^)L_{VAE} = c\cdot L_{KL} + L_x(x, \hat{x})

其中 cc 为潜损失的权系数,即用于正则化的加权系数.

重新参数化技巧

VAE需要使用“重新参数化技巧”(Reparameterization Trick)对潜变量取样,由于潜变量 zq(zx)z\sim q(z|x),而梯度下降法中不能出现随机变量,所以需要利用该技巧,将 zz 固定下来. 由于 q(zx)q(z|x) 可由Gauss分布近似,则可以对 zz 按照特定均值和方差的Gauss分布进行取样,从而可以进行梯度下降法对参数进行学习. 假设VAE编码中生成的均值和方差分别为 μ,σ\mu, \sigma,则潜变量 zN(μ,σ2I)z\sim \mathcal{N}(\mu, \sigma^2I),可以通过多维标准正态分布 εN(μ,I)\varepsilon\sim \mathcal{N}(\mu,I) 平移和等比放缩得到.

z=μ+e12logεz = \mu + \text{e}^{\frac{1}{2}\log\sum}\circ \varepsilon

其中 =σ2I\sum = \sigma^2 I 为随机变量 zz 的协方差矩阵.

去偏变分自动编码机

去偏变分自动编码机(Debiasing Variational AutoEncoder, DB-VAE)为VAE的一个增强版,在传统VAE基础上,它增加了去偏的功能:通过自适应重采样(自动选择数据,进行重复性训练)减轻训练集中的潜在偏差. 例如:面部识别训练集中,大多数图片的人脸都是正面图像,而侧脸的图像偏少,如果将它们均等地训练,训练出的模型可能对正脸识别效果优于侧脸的效果,这就是数据偏差(Debiasing). 为了平衡这种偏差有两种方法,一是使用人工处理,提高数据集中偏差数据的训练数量,但操作十分复杂,而且人无法判断哪些数据是偏差数据;二是通过机器自动识别偏差数据,然后自我调整数据的训练数量,这就是DB-VAE的提升之处. DB-VAE的示意图如下图所示,图片来源 Uncovering and Mitigating Algorithmic Bias through Learned Latent Structure.

DB-VAE结构

注意到,DB-VAE编码部分有一个单独输出的有监督变量 z0z_0,例如,该变量可以用于判断是否该图片是人脸图像. 而一般的VAE并不具有有监督变量输出的功能,这也是DB-VAE与传统VAE不同之处.

需要注意如果是数据集中既有人脸图像也有非人脸图像,我们仅想学习人脸相关的潜变量,对数据集做去偏操作,并做一个二分类问题. 所以我们要确保模型仅对人脸图片从分布 qϕ(zx)q_{\phi}(z|x) 中获取无监督潜变量的表示,并且输出一个有监督的分类预测 z0z_0,而对于非人脸图片,我们只需要输出一个预测 z0z_0 即可.

DB-VAE损失函数

我们需要对DB-VAE的损失函数进行一些改进,损失函数要与是否是人脸图片相关.

对于人脸图片,我们的损失函数将包含两项:

  1. 传统VAE损失函数 LVAEL_{VAE}:包含潜损失和重建损失.

  2. 分类损失 Ly(y,y^)L_y(y, \hat{y}):二分类问题的标准交叉熵损失函数.

相反地,对于非人脸图片,我们的损失函数仅有分类损失这一项. 则DB-VAE损失函数为:

Ltotal=Ly(y,y^)+χimage(y)LVAEL_{total}= L_y(y, \hat{y}) + \chi_{image}(y)\cdot L_{VAE}

其中 χimage(y)={1,y=1,训练样本为人脸图片,0,y=0,训练样本为非人脸图片.\chi_{image}(y) = \begin{cases}1, &\quad y=1,\text{训练样本为人脸图片},\\ 0, &\quad y=0,\text{训练样本为非人脸图片.}\end{cases}

自适应重采样

回想DB-VAE的架构:当图像通过网络输入时,编码器会学习得到潜空间中 qϕ(zx)q_\phi(z|x) 的估计. 我们希望通过增加对潜空间中代表性不足区域的采样,从而增加稀有数据的相对训练次数. 我们可以通过每个学习到的潜变量的频率分布对 qϕ(zx)q_\phi(z|x) 进行近似,根据中心极限定理(随机变量部分和分布渐近与Gauss分布)近似结果应该趋近于Gauss分布,从该近似结果中我们可以得到出现每个潜变量的出现频率占比,然后将出现频率取倒数(提高出现频率低的样本的重采样率),再归一化处理,将这个概率分布将用于数据的重新采样.

代码实现

完整代码及解释 - Face Detection VAE.

目标为识别输入照片是否是人脸图像,我们使用了两个数据集:

  1. 正训练集:CelebA Dataset,包含超过二十万张名人照片.

  2. 负训练集:ImageNet,该网站上有非常多不同分类的图片,我们将从非人脸类别中选取负样本. 通过 Fitzpatrick度量法 对肤色进行分类,将图片标记为 “Lighter” 或 “Darker”.

然后我们使用了经典CNN和DE-VAE神经网络对图片进行识别,下图体现出了去偏后的训练效果.

CNN与VAE比较

以下一些图片体现了VAE的图像渐变转化功能(变脸效果),清晰的图像为输入的图片(左右两端),较为模糊的图像为VAE输出的预测结果.

渐变效果图


基于卷积神经网络CNN和去偏变分自动编码机DB-VAE的简单人脸识别模型
https://wty-yy.github.io/posts/52484/
作者
wty
发布于
2022年8月24日
许可协议