首先要了解神经网络的有关知识,可以参考前一篇博文:
下图是一个自编码神经网络的示意图:
目标是输入和输出保持一致,来训练神经网络,用前一篇博客中的公式。下面再总结一下:
当 时,
,也就是第
个输入值(输入值的第
个特征)。
然后:
能够得到各层的值和输出值。
对于中间层,加一个抑制参数:
亦即:
所以代价函数为:
其中:
对参数求导:
最后:
下面这个网址里有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分钟,下面是程序运行结果: