最近开始了解深度学习的东西,看到国内研究者翻译的斯坦福大学的深度学习的历程,觉得很不错,就按照学习例程学习,一步一步完成后面的练习。这个练习安排的很合理,得按顺序完成,跳跃着做可能会遇到一定的麻烦。我在完成中也遇到不少的麻烦,不过还是慢慢克服了,越往后程序对计算机的配置要求越高,需要的内存也越大。下面是我完成这些例程中一些关键性的代码,觉得有用的可以参考一下,建议大家先自己动手写,如果实在是遇到困难了,可以参考一下我写的代码,由于本人编程能力也很一般,代码优化做得也很差,只供参考而已。
Exercise1: Sparase AutoEncoder
这个练习比较关键,基本上后面许多练习都依赖于这个练习的代码,所以首先得完成好这个练习。这个练习需要补充3个地方的代码。我这里只列出其中最关键的一个地方的代码,也就是sparseAutoencoderCost.m这个文件。
函数的目的是首先代价的计算以及梯度的计算,具体的实现如下:
A1 = data;
Y = data;
z2 = W1 * data + repmat(b1,1,m);
A2 = sigmoid(z2);
z3 = W2 * A2 + repmat(b2,1,m);
A3 = sigmoid(z3);
rho_hat = mean(A2,2); % 隐层每个神经元的平均激活度 hiddenSize*1
%backpropagation
for i = 1:m
a1 = A1(:,i);
a2 = A2(:,i);
a3 = A3(:,i);
y = Y(:,i); % 原始输入向量
cost = cost + 1/2 * norm(y - a3, 2)^2; % 计算代价
delta_3 = -(y - a3) .* (a3 .* (1 - a3));
delta_2 = (W2'* delta_3 + beta *(-sparsityParam ./rho_hat + (1 - sparsityParam) ./(1 - rho_hat))) .* (a2 .* (1 - a2));
W1grad = W1grad + delta_2 * a1';
b1grad = b1grad + delta_2;
W2grad = W2grad + delta_3 * a2';
b2grad = b2grad + delta_3;
end
% 计算梯度
W1grad = 1/m * W1grad + lambda * W1;
W2grad = 1/m * W2grad + lambda * W2;
b1grad = 1/m * b1grad;
b2grad = 1/m * b2grad;
%计算KL
KL = 0;
for i = 1:hiddenSize
KL = KL + sparsityParam * log(sparsityParam/rho_hat(i)) + (1 - sparsityParam) * log((1 - sparsityParam)/(1 - rho_hat(i)));
end
%计算代价
cost = 1/m * cost + lambda/2 * (sum(sum(W1.^2)) + sum(sum(W2.^2)))