自动编码机是一种出入层节点数等于输出层节点数的三层神经网络,只有中间一层隐藏层。
与http://blog.csdn.net/scarecrow398966925/article/details/24178931文章中描述的三层网络类似,关于神经网络的前向传到及反向传播训练可以在上述连接的文章中有详细的讲解。自动编码机与之前描述的神经网络不同的是自动编码机要求网络的输出尽量等于输入。即zi尽量等于xi,这样在隐藏层的yi就可以看成是一种输入xi的另一种表现形式,因为yi可以通过一层变换得到近似于xi的zi,所以可以把yi看成是xi的编码。这就是自动编码机的名字的由来。可以通过BP算法训练这个网络,得到输入的一种编码形式。但是有时候我们需要加入一些其他的限制来得到我们需要的更好的结果,比如权重衰减和稀疏限制。
权重衰减的意思是对每条边的权重加上一些约束,防止权重变化过大,产生过拟合。
单个样本的代价函数如下:
在此代价函数上求最小代价,只用梯度下降法就能得到局部最优解,具体梯度的求解可以使用http://blog.csdn.net/scarecrow398966925/article/details/24178931中的推导,只要在
http://blog.csdn.net/itplus/article/details/11449055
本人水平有限,文章有错误的地方欢迎大家指出,有问题也希望大家能够留言交流,一起学习进步
下面是此章的练习部分我的matlab代码,仅供参考
sampleIMAGES.m
for i=1:1:numpatches
imageIndex = unidrnd(10);
startX = unidrnd(505);
startY = unidrnd(505);
patch =IMAGES(startX:startX+7,startY:startY+7,imageIndex);
linePatch = zeros(1,patchsize*patchsize);
for j=1:1:patchsize
linePatch((j-1)*patchsize+1:j*patchsize) = patch(j,:);
end
patches(:,i) = linePatch;
end
computeNumericalGradient.m
[row,col] = size(theta);
EPSILON = 0.0001;
for i = 1:1:row
e = zeros(size(theta));
e(i,:) = 1;
[value1,grad]=J(theta+EPSILON*e);
[value2,grad]=J(theta-EPSILON*e);
numgrad(i,:)=(value1-value2)/(2*EPSILON);
end
sparseAutoencoderCost.m
[row,col] = size(data);
hiddenForward =zeros(hiddenSize,col);
outputForward =zeros(visibleSize,col);
averageActivity =zeros(hiddenSize,1);
hiddenForward =sigmoid(W1*data+repmat(b1,1,col));
outputForward = sigmoid(W2*hiddenForward+repmat(b2,1,col));
averageActivity =sum(hiddenForward,2)/col;
cost = outputForward-data;
cost = cost.*cost;
cost = sum(cost(:))/2/col;
dencyW1 = W1.*W1;
dencyW1 = sum(dencyW1(:))/2;
dencyW2 = W2.*W2;
dencyW2 = sum(dencyW2(:))/2;
cost = cost + lambda*(dencyW1 +dencyW2);
sparseCost =sparsityParam*log(sparsityParam./averageActivity)+(1-sparsityParam)*log((1-sparsityParam)./(1-averageActivity));
cost = cost +beta*sum(sparseCost);
outputErr =-(data-outputForward).*outputForward.*(1-outputForward);
hiddenErr = W2'*outputErr;
sparse =beta*(-sparsityParam./averageActivity +(1-sparsityParam)./(1-averageActivity));
hiddenErr = (hiddenErr +repmat(sparse,1,col)).*hiddenForward.*(1-hiddenForward);
W1grad = hiddenErr*data';
W2grad = outputErr*hiddenForward';
b1grad = sum(hiddenErr,2);
b2grad = sum(outputErr,2);
W1grad = W1grad/col +lambda*W1;
W2grad = W2grad/col +lambda*W2;
b1grad = b1grad/col;
b2grad = b2grad/col;