Deep Learning学习笔记之稀疏自编码器(Sparse Autoencoder)

本文介绍了自编码神经网络的基本原理及实现过程,包括其结构特点、训练目标与损失函数的定义,并通过具体实例展示了如何利用自编码器进行特征学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先要了解神经网络的有关知识,可以参考前一篇博文:

PRML学习笔记之Neural Nerwork(神经网络)

下图是一个自编码神经网络的示意图:


目标是输入和输出保持一致,来训练神经网络,用前一篇博客中的公式。下面再总结一下:

当 \textstyle l=1 时, \textstyle a^{(1)}_i = x_i ,也就是第 \textstyle i 个输入值(输入值的第 \textstyle i 个特征)。

然后:

 \begin{align}z^{(l+1)} &= W^{(l)} a^{(l)} + b^{(l)}   \\a^{(l+1)} &= f(z^{(l+1)})\end{align}

能够得到各层的值和输出值。

对于中间层,加一个抑制参数:

\begin{align}\sum_{j=1}^{s_2} \rho \log \frac{\rho}{\hat\rho_j} + (1-\rho) \log \frac{1-\rho}{1-\hat\rho_j}.\end{align}

亦即:

\begin{align}\sum_{j=1}^{s_2} {\rm KL}(\rho || \hat\rho_j),\end{align}

所以代价函数为:\begin{align}J_{\rm sparse}(W,b) = J(W,b) + \beta \sum_{j=1}^{s_2} {\rm KL}(\rho || \hat\rho_j),\end{align}

其中: \begin{align}J(W,b)&= \left[ \frac{1}{m} \sum_{i=1}^m J(W,b;x^{(i)},y^{(i)}) \right]                       + \frac{\lambda}{2} \sum_{l=1}^{n_l-1} \; \sum_{i=1}^{s_l} \; \sum_{j=1}^{s_{l+1}} \left( W^{(l)}_{ji} \right)^2 \\&= \left[ \frac{1}{m} \sum_{i=1}^m \left( \frac{1}{2} \left\| h_{W,b}(x^{(i)}) - y^{(i)} \right\|^2 \right) \right]                       + \frac{\lambda}{2} \sum_{l=1}^{n_l-1} \; \sum_{i=1}^{s_l} \; \sum_{j=1}^{s_{l+1}} \left( W^{(l)}_{ji} \right)^2\end{align}


对参数求导:

\begin{align}\delta^{(n_l)}_i= \frac{\partial}{\partial z^{(n_l)}_i} \;\;        \frac{1}{2} \left\|y - h_{W,b}(x)\right\|^2 = - (y_i - a^{(n_l)}_i) \cdot f'(z^{(n_l)}_i)\end{align}

\begin{align}\delta^{(2)}_i =  \left( \left( \sum_{j=1}^{s_{2}} W^{(2)}_{ji} \delta^{(3)}_j \right)+ \beta \left( - \frac{\rho}{\hat\rho_i} + \frac{1-\rho}{1-\hat\rho_i} \right) \right) f'(z^{(2)}_i) .\end{align}

 \begin{align}\frac{\partial}{\partial W_{ij}^{(l)}} J(W,b; x, y) &= a^{(l)}_j \delta_i^{(l+1)} \\\frac{\partial}{\partial b_{i}^{(l)}} J(W,b; x, y) &= \delta_i^{(l+1)}.\end{align}

最后:

\begin{align}\frac{\partial}{\partial W_{ij}^{(l)}} J(W,b) &=\left[ \frac{1}{m} \sum_{i=1}^m \frac{\partial}{\partial W_{ij}^{(l)}} J(W,b; x^{(i)}, y^{(i)}) \right] + \lambda W_{ij}^{(l)} \\\frac{\partial}{\partial b_{i}^{(l)}} J(W,b) &=\frac{1}{m}\sum_{i=1}^m \frac{\partial}{\partial b_{i}^{(l)}} J(W,b; x^{(i)}, y^{(i)})\end{align}

下面这个网址里有Sparse Autoencoder的练习题,熟悉一下上面的公式:

Exercise:Sparse Autoencoder

我只贴一下练习中需要自己写的代码:

首先是sampleIMAGES:

for num=1:10
    for i=1:numpatches/10
        a=randi(504);
        b=randi(504);
        A=IMAGES(a:a+patchsize-1,b:b+patchsize-1,num);
        patches(:,i+(num-1)*numpatches/10)=A(:);
    end
end

然后是:sparseAutoencoderCost

[~,m]=size(data);

z1=data;
a1=z1;
z2=W1*a1+repmat(b1,1,m);
a2=sigmoid(z2);
z3=W2*a2+repmat(b2,1,m);
a3=sigmoid(z3);

rho=mean(a2,2);

delta3=-(z1-a3).*sigmoid(z3).*(1-sigmoid(z3));
delta2=W2'*delta3+repmat(beta*(-sparsityParam./rho+(1-sparsityParam)./(1-rho)),1,m);
delta2=delta2.*sigmoid(z2).*(1-sigmoid(z2));

JW1=delta2*a1';
JW2=delta3*a2';

W1grad=JW1./m+lambda*W1;
W2grad=JW2./m+lambda*W2;
b1grad=mean(delta2,2);
b2grad=mean(delta3,2);

cost=sum(mean(0.5*(z1-a3).*(z1-a3),2))+0.5*lambda*(sum(sum(W1.^2))+sum(sum(W2.^2)))+beta* ...
    sum(sparsityParam.*log(sparsityParam./rho)+(1-sparsityParam).*log((1-sparsityParam)./(1-rho)));

最后是computeNumericalGradient

epsilon = 1e-4;
n = size(theta,1);
E = eye(n);
for i = 1:n
    delta = E(:,i)*epsilon;
    numgrad(i) = (J(theta+delta)-J(theta-delta))/(epsilon*2.0);
end
算出来的两个误差的值非常小:

Norm of the difference between numerical and analytical gradient (should be < 1e-9)

7.0354e-11

程序运行完总共用时不到20分钟,下面是程序运行结果:




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值