本节以一道算法八股题为引,介绍稀疏自编码器。
下列方法中,可以用于特征降维的方法包括(多选) ( ) (\quad) ()
A \mathcal A \quad A主成分分析 PCA \text{PCA} PCA
B \mathcal B \quad B线性判别分析 LDA \text{LDA} LDA
C \mathcal C \quad C深度学习 SparseAutoEncoder \text{SparseAutoEncoder} SparseAutoEncoder
D \mathcal D \quad D矩阵奇异值分解 SVD \text{SVD} SVD
E \mathcal E \quad E最小二乘法 LeastSquares \text{LeastSquares} LeastSquares
关于 A D \mathcal A \quad \mathcal D \quad AD 选项,可以放在一起观察。关于主成分分析 ( Principal Component Analysis,PCA ) (\text{Principal Component Analysis,PCA}) (Principal Component Analysis,PCA)的降维思想,这里不再过多赘述。这里重点描述从奇异值分解角度观察主成分分析:
详细推导过程见
传送门
其中
E N \mathcal E_N EN表示
N N N维单位向量;
I N \mathcal I_{N} IN表示元素值均为
1 1 1的
N N N维列向量。
其中
X , H \mathcal X,\mathcal H X,H对
S \mathcal S S的表达过程详见
主成分分析——最大投影方差角度上式等号两侧右乘
V , 1 N \mathcal V,\begin{aligned}\frac{1}{N}\end{aligned} V,N1忽略。
关于 B \mathcal B \quad B 选项:线性判别分析,这里不过多赘述,详见算法八股(十)——线性判别分析与核函数中关于线性判别分析的解释。
关于 E \mathcal E \quad E 选项:最小二乘法:
L ( W ) = ∑ i = 1 N ∣ ∣ W T x ( i ) − y ( i ) ∣ ∣ ( x ( i ) , y ( i ) ) ∈ D \mathcal L(\mathcal W) = \sum_{i=1}^N ||\mathcal W^Tx^{(i)} - y^{(i)}|| \quad (x^{(i)},y^{(i)}) \in \mathcal D L(W)=i=1∑N∣∣WTx(i)−y(i)∣∣(x(i),y(i))∈D
我们仅从计算过程中观察,我们可以认为将 x ( i ) x^{(i)} x(i)所在的特征空间通过 W \mathcal W W映射到对应的标签空间。但整个过程 x ( i ) ( i = 1 , 2 , ⋯ , N ) x^{(i)}(i=1,2,\cdots,N) x(i)(i=1,2,⋯,N)的特征没有变化过。也就是说,我们并没有去修改特征空间,从而对 x ( i ) x^{(i)} x(i)提出新的表示。
下面主要关注 C \mathcal C \quad C 选项:什么是稀疏自编码器( SparseAutoEncoder \text{SparseAutoEncoder} SparseAutoEncoder),它又是如何实现特征降维的。
关于自编码器 ( AutoEncoder ) (\text{AutoEncoder}) (AutoEncoder),是神经网络的一种。它经过训练后能尝试将输入复制到输出。其模型结构可表示为如下形式:
节自《深度学习》(花书) P306。从该描述中可以发现,它是一个典型的
概率生成模型
该模型中包含一个隐藏层 h h h,其作用是对输入特征 x x x进行抽象表示,也称作编码 ( Code ) (\text{Code}) (Code)。通过 h h h将整个模型划分成两个部分:
既然是生成模型,从常规角度认为从模型中生成出的特征 r r r和 x x x越相似越好。但相反,如果仅仅得到一个 g [ f ( x ) ] = x g[f(x)] = x g[f(x)]=x,这个模型可能并没有什么意义。因此,我们需要对模型施加一些约束,从而:
如果从概率分布的角度认识这个过程,已知输入分布 x x x,那么编码器的输出分布可表示为:
也就是给定
x x x,在
Encoder \text{Encoder} Encoder的抽象描述下,输出编码
h h h的后验概率分布。
P e n c o d e r ( h ∣ x ) \mathcal P_{encoder}(h \mid x) Pencoder(h∣x)
同理,假设编码 h h h给定的条件下,解码器的输出分布可表示为:
P d e c o d e r ( x ∣ h ) \mathcal P_{decoder}(x \mid h) Pdecoder(x∣h)
基于我们想要输出分布 P m o d e l ( x ∣ h ) \mathcal P_{model}(x \mid h) Pmodel(x∣h)与真实分布 P d a t a ( x ) \mathcal P_{data}(x) Pdata(x)相同,但又不想单纯地将输入复制到输出。
看起来像是一个矛盾的事情。
也就是说,在训练自编码器对 x x x训练的过程中,使隐变量 h h h能够学习到有用的特性。一种做法是:通过人工设置,强行让 h h h的维度小于 x x x的维度:
这种编码维度小于输入维度的自编码器被称作欠完备自编码器 ( Undercompleter AutoEncoder ) (\text{Undercompleter AutoEncoder}) (Undercompleter AutoEncoder)。编码维度的减小意味着学习到的分布 P m o d e l ( h ∣ x ) \mathcal P_{model}(h \mid x) Pmodel(h∣x)相比真实分布 P d a t a ( x ) \mathcal P_{data}(x) Pdata(x)确实出现了缺失,但强制自编码器捕捉 x x x中最显著的特征。
从
x ⇒ h x \Rightarrow h x⇒h过程中学习到的特征信息被‘压缩’,信息丢失是不可避免的。但在
x x x分布确定的条件下,
h h h中保留的必然是‘更具代表性、性质更加显著’的信息。
在后续解码器对压缩特征 h h h进行重构的过程中,由于 h h h特征的缺失已经达到了 不想单纯地将输入复制到输出 这个动机,导致后续即便重构出与 x x x大小相同的特征空间,它的信息相比真实分布 x x x依然是缺失的。因而我们需要一个损失函数来惩罚重构分布和真实分布 之间的差异:
L [ x , g ( f ( x ) ) ] \mathcal L[x,g(f(x))] L[x,g(f(x))]
从降维的角度观察, x ⇒ h x \Rightarrow h x⇒h可以被看作是一个降维过程, h h h中的各维度可看作特征值最大的若干主成分。在重构过程中,虽然无法将缺失的部分还原,但重构后的结果相比于真实分布其特征更具代表性。
也就是说,
Undercompleter AutoEncoder \text{Undercompleter AutoEncoder} Undercompleter AutoEncoder这种独特的模型结构就已经存在了特征降维的思想。那么它与
Sparse AutoEncdoer \text{Sparse AutoEncdoer} Sparse AutoEncdoer之间的关联关系是什么?
上面描述的欠完备自编码器是通过人为设置强制减小编码维数而产生的模型结构,这种结构能够使 h h h学习到 x x x更显著的特征信息。
相反呢?如果我们的自编码器容量过大,也就是说: h h h的编码维数与 x x x相等,甚至高于 x x x:
这种情况可能导致 h h h在编码过程中对 x x x的学习更加准确,我们不否认对应的解码结果会对 x x x重构的更加准确,但 h h h中学习不到任何有用的信息。
这种就是‘单纯地将输入复制到输出’的情况。
我们将这种情况称作过完备 ( Overcomplete ) (\text{Overcomplete}) (Overcomplete)。那么类似于上述的情况,是否可以让 h h h学习到有用的信息?换句话说:能否不使用“限制” h h h维度的方式,理想情况下,任意大小的 h h h都能够在训练中学习出有用的信息。
正则自编码器提供了这样的能力。其思想在于利用稀疏表示、表示的小导数以及噪声或输入缺失的鲁棒性的方式,使非线性且过完备的正则自编码器仍然能够从数据中学到一些关于数据分布的有用信息。
节自《深度学习》(花书) P307 14.2 正则自编码器
稀疏自编码器 ( Sparse AutoEncoder ) (\text{Sparse AutoEncoder}) (Sparse AutoEncoder)就是通过对 h h h进行稀疏表示达到上述目的。其具体做法是:在损失函数的基础上,增加对 h h h的稀疏惩罚:
再次强调,两个部分‘惩罚’的方向不一样。
L [ x , g ( f ( x ) ) ] \mathcal L[x,g(f(x))] L[x,g(f(x))]惩罚的是真实分布
x x x和重构分布
g ( f ( x ) ) g(f(x)) g(f(x))之间的差异性;
Ω ( h ) \Omega(h) Ω(h)惩罚的是
h = f ( x ) h=f(x) h=f(x)的稀疏性。
L [ x , g ( f ( x ) ) ] + Ω ( h ) h = f ( x ) \mathcal L[x,g(f(x))] + \Omega(h) \quad h=f(x) L[x,g(f(x))]+Ω(h)h=f(x)
我们可以将 Ω ( h ) \Omega(h) Ω(h)视作关于 h h h的正则项,但实际上,该项并没有正则项的意义。在正则化——贝叶斯概率角度中介绍了正则项相当于参数的先验概率:
MAP : θ ^ = arg max θ [ log P ( X ∣ θ ) + log P ( θ ) ] \text{MAP : } \hat \theta = \mathop{\arg\max}\theta \left[ \log \mathcal P(\mathcal X \mid \theta) + \log \mathcal P(\theta)\right] MAP : θ^=argmaxθ[logP(X∣θ)+logP(θ)]
而先验概率 log P ( θ ) \log \mathcal P(\theta) logP(θ)描述在训练过程之前,对参数 θ \theta θ特定值的偏好,并且 这个偏好取决于事件自身的性质。例如极大似然估计与最大后验概率估计中投掷硬币的例子。我们给出的分布 P ( θ ) \mathcal P(\theta) P(θ)是均值 μ = 0.5 \mu = 0.5 μ=0.5,方差 σ = 0.1 \sigma = 0.1 σ=0.1的高斯分布:
很明显,我们在给出先验分布时,连数据是什么都不知道。
P ( θ ) = 1 0.1 × 2 π exp { − ( θ − 0.5 ) 2 0.02 } \mathcal P(\theta) = \frac{1}{0.1 \times \sqrt{2\pi}} \exp \left\{-\frac{(\theta - 0.5)^2}{0.02}\right\} P(θ)=0.1×2π1exp{−0.02(θ−0.5)2}
但是隐变量 h h h是伴随模型存在的,它自身没有实际的物理意义。因而对应的先验分布 P m o d e l ( h ) \mathcal P_{model}(h) Pmodel(h)也同样是没有实际意义的先验。因而它不能被直接视作正则项,但我们仍可以认为 P m o d e l ( h ) \mathcal P_{model}(h) Pmodel(h)隐式地表达了对函数的偏好:
通常也将
P m o d e l ( h ) \mathcal P_{model}(h) Pmodel(h)称作信念先验。节选自《深度学习》(花书) P308 14.2.1 稀疏自编码器。
关于解码器生成的样本分布 P m o d e l ( x ) \mathcal P_{model}(x) Pmodel(x),它的似然函数可分解为如下形式:
P m o d e l ( x ) = ∑ h P m o d e l ( h , x ) \mathcal P_{model}(x) = \sum_{h} \mathcal P_{model}(h,x) Pmodel(x)=h∑Pmodel(h,x)
关于联合概率分布 P m o d e l ( h , x ) \mathcal P_{model}(h,x) Pmodel(h,x),它的对数结果表示为:
log P m o d e l ( h , x ) = log [ P m o d e l ( x ∣ h ) ⋅ P m o d e l ( h ) ] = log P m o d e l ( x ∣ h ) + log P m o d e l ( h ) \begin{aligned} \log \mathcal P_{model}(h,x) & = \log \left[\mathcal P_{model}(x \mid h) \cdot \mathcal P_{model}(h)\right] \\ & = \log \mathcal P_{model}(x \mid h) + \log \mathcal P_{model}(h) \end{aligned} logPmodel(h,x)=log[Pmodel(x∣h)⋅Pmodel(h)]=logPmodel(x∣h)+logPmodel(h)
如果 h h h,也就是编码器各神经元的输出,假设它们之间是独立同分布的条件下,虽然 P m o d e l ( h ) \mathcal P_{model}(h) Pmodel(h)不是真正意义上的先验
,但是依然可以给其各个分量一个先验分布。如 Laplace \text{Laplace} Laplace先验:
其中
h j ( j = 1 , 2 , ⋯ , K ) h_j(j=1,2,\cdots,\mathcal K) hj(j=1,2,⋯,K)表示
h h h的各个分量,也就是编码器第
j j j个神经元的输出。
log P m o d e l ( h ) = log ∏ j = 1 K P m o d e l ( h j ) = ∑ j = 1 K log P m o d e l ( h j ) = ∑ j = 1 K log [ λ 2 exp { − λ ∣ h j ∣ } ] = ∑ j = 1 K log λ 2 ⏟ C − λ ⋅ ∑ j = 1 K ∣ h j ∣ ⏟ Ω ( h ) \begin{aligned} \log \mathcal P_{model}(h) & = \log \prod_{j=1}^{\mathcal K} \mathcal P_{model}(h_j) \\ & = \sum_{j=1}^{\mathcal K} \log \mathcal P_{model}(h_j) \\ & = \sum_{j=1}^{\mathcal K} \log \left[\frac{\lambda}{2} \exp \{-\lambda |h_j|\}\right] \\ & =\underbrace{\sum_{j=1}^{\mathcal K} \log \frac{\lambda}{2}}_{\mathcal C} - \underbrace{\lambda \cdot \sum_{j=1}^{\mathcal K} |h_j|}_{\Omega(h)} \end{aligned} logPmodel(h)=logj=1∏KPmodel(hj)=j=1∑KlogPmodel(hj)=j=1∑Klog[2λexp{−λ∣hj∣}]=C j=1∑Klog2λ−Ω(h) λ⋅j=1∑K∣hj∣
个人理解:从先验的角度解释了稀疏惩罚 Ω ( h ) \Omega(h) Ω(h)的作用。重点在于如何构建稀疏惩罚,也就是说,如何约束编码器神经元的输出 h h h。
花书中的介绍,个人没有理解它的精髓。在不是真正意义上的先验的基础上,用先验去解释它。这里欢迎小伙伴们批评指正。
上面的 Laplace \text{Laplace} Laplace分布是一种方式,也可以尝试其他的方式去约束编码器的输出 h h h:
通过前馈神经网络的描述,可以将 h h h的第 j j j个神经元 h j h_j hj表示为如下形式:
其中
σ \sigma σ表示激活函数。
h j = σ ( W x 1 ⇔ j ⋅ x 1 + W x 2 ⇔ j ⋅ x 2 + ⋯ + W x p ⇔ j ⋅ x p + b j ) = σ ( W x ⇔ j ⋅ x + b j ) \begin{aligned} h_j & = \sigma \left(\mathcal W_{x_1 \Leftrightarrow j} \cdot x_1 + \mathcal W_{x_2 \Leftrightarrow j} \cdot x_2 + \cdots + \mathcal W_{x_p \Leftrightarrow j} \cdot x_p + b_j\right) \\ & = \sigma(\mathcal W_{x \Leftrightarrow j} \cdot x + b_j) \end{aligned} hj=σ(Wx1⇔j⋅x1+Wx2⇔j⋅x2+⋯+Wxp⇔j⋅xp+bj)=σ(Wx⇔j⋅x+bj)
很明显, h j h_j hj可看作是一个关于样本特征 x 1 , x 2 , ⋯ , x p x_1,x_2,\cdots,x_p x1,x2,⋯,xp的函数 h j ( x ) h_j(x) hj(x)。将样本集合 D \mathcal D D内的所有样本 x ( i ) ( i = 1 , 2 , ⋯ , N ) x^{(i)}(i=1,2,\cdots,N) x(i)(i=1,2,⋯,N)带入到上式中,并取该结果的均值,结果记作 ρ j ^ \hat {\rho_j} ρj^:
也称
ρ j ^ \hat {\rho_j} ρj^为‘平均激活度’
( Average Activation ) (\text{Average Activation}) (Average Activation)
ρ j ^ = 1 N ∑ i = 1 N [ h j ( x ( i ) ) ] \hat {\rho_j} = \frac{1}{N} \sum_{i=1}^N \left[h_j(x^{(i)})\right] ρj^=N1i=1∑N[hj(x(i))]
在向下执行之前,我们有必要了解一下 ρ j ^ \hat {\rho_j} ρj^,它的物理意义。为什么要这么设计它 ? ? ?如果从蒙特卡洛方法的反方向去考虑该式子,那么他可以被看作是:真实分布 P d a t a ( x ) \mathcal P_{data}(x) Pdata(x)下, h j ( x ) h_j(x) hj(x)的期望结果:
ρ j ^ ≈ E x ( i ) ∼ P d a t a ( x ) [ h j ( x ( i ) ) ] \hat {\rho_j} \approx \mathbb E_{x^{(i)} \sim \mathcal P_{data}(x)} [h_j(x^{(i)})] ρj^≈Ex(i)∼Pdata(x)[hj(x(i))]
这个期望的大小意味着什么:
但这种特征描述方式违背了‘对其稀疏表示’的初衷,从而变成了单纯的复制。
基于上述描述,我们可以设置一个目标值 ρ \rho ρ,也称作稀疏性常数。这个值很小,例如 0.05 0.05 0.05(讲义中的例子),我们希望 ρ j ^ \hat {\rho_j} ρj^向目标值 ρ \rho ρ靠近,直至相等:
ρ j ^ = ρ \hat {\rho_j} = \rho ρj^=ρ
如何对这个靠近进行描述 ? ? ?我们将 ρ j ^ \hat {\rho_j} ρj^和 ρ \rho ρ看做是两个概率分布,使用 K L \mathcal K\mathcal L KL散度对其进行描述:
K L \mathcal K\mathcal L KL散度可理解为两概率分布
ρ , ρ j ^ \rho,\hat {\rho_j} ρ,ρj^之间的相似程度。有下界
0 0 0,意味着
ρ = ρ j ^ \rho=\hat {\rho_j} ρ=ρj^
K L ( ρ ∣ ∣ ρ j ^ ) = ρ log ρ ρ j ^ + ( 1 − ρ ) log 1 − ρ 1 − ρ j ^ \mathcal K\mathcal L(\rho || \hat {\rho_j}) = \rho \log \frac{\rho}{\hat {\rho_j}} + (1 - \rho) \log \frac{1 - \rho}{1 - \hat {\rho_j}} KL(ρ∣∣ρj^)=ρlogρj^ρ+(1−ρ)log1−ρj^1−ρ
当然,这里仅描述了第 j j j个神经元 h j h_j hj的情况。对于完整稀疏惩罚 Ω ( h ) \Omega(h) Ω(h)可表示为:
因为
ρ j ^ \hat {\rho_j} ρj^是
h j h_j hj的均值/期望,因此整个式子中只有
h j ( j = 1 , 2 , ⋯ , K ) h_j(j=1,2,\cdots,\mathcal K) hj(j=1,2,⋯,K)是变量,满足‘稀疏惩罚项’的要求。
Ω ( h ) = ∑ j = 1 K K L ( ρ ∣ ∣ ρ j ^ ) \Omega(h) = \sum_{j=1}^{\mathcal K} \mathcal K\mathcal L(\rho || \hat {\rho_j}) Ω(h)=j=1∑KKL(ρ∣∣ρj^)
最终,基于该方式的稀疏自编码器的策略可表示为:
J s p a r s e ( W , b ) = L [ x , g ( f ( x ) ) ] + Ω ( h ) = J ( W , b ) + β ⋅ ∑ j = 1 K K L ( ρ ∣ ∣ ρ j ^ ) \begin{aligned} \mathcal J_{sparse}(\mathcal W,b) & = \mathcal L[x,g(f(x))] + \Omega(h) \\ & = \mathcal J(\mathcal W,b) + \beta \cdot \sum_{j=1}^{\mathcal K} \mathcal K\mathcal L(\rho || \hat {\rho_j}) \end{aligned} Jsparse(W,b)=L[x,g(f(x))]+Ω(h)=J(W,b)+β⋅j=1∑KKL(ρ∣∣ρj^)
回到题目, C \mathcal C \quad C 选项稀疏自编码器主要是针对编码器容量过完备情况下,对编码器神经元输出的稀疏惩罚。还是要和欠完备自编码器区分一下,正确。
相关参考:
《深度学习》(花书) P306 第14章 自编码器
深度学习 - 深度生成网络