代码:https://github.com/LiuZhe6/AndrewNGMachineLearning
文章目录
测验:Neural Networks: Learning
第一题
答案
B
第二题
答案
A
第三题
答案
D
第四题
答案
AD
分析:
A:使用梯度检验来检查反向传播是否正确,正确。
B:梯度检验要比反向传播计算损失函数的梯度慢的多,错误。
C:梯度检验对梯度下降算法来说非常有用,错误。
D:为了保证效率,在使用反向传播算法前关闭梯度检验,正确。
第五题
答案
BC
分析:
A:权重为1不能打破堆成,错误。
B:正确。
C:训练结果可能是到达局部最小值,而不是全局的,正确。
D:一层的权重都是一样的数字不能打破对称,错误。
编程练习:Neural Network Learning
作业一:Feedforward and Cost Function
Hint:根据文档一步一步来做,注意对y向量的转换
nnCostFunction.m
% part1
% 计算假设函数
a1 = [ones(m,1) X];
z2 = a1 * Theta1';
a2 = sigmoid(z2);
a2 = [ones(size(a2,1),1) a2];
z3 = a2 * Theta2';
a3 = sigmoid(z3);
h = a3; % 5000 x 10
% y是m x 1向量,需要变成m x 10矩阵
u = eye(num_labels);
% 这条语句有点难理解,大概意思是选出每一行的y值作为u的行标,将这行u替换对应行的y
y = u(y,:);
J = 1/m * sum(sum(-y .* log(h) - (1 - y) .* log(1 - h)));
% 对X添加一列
X = [ones(m,1) X];
作业二:Regularized Cost Function
Hint:注意双重求和的向量化,注意Theta求和时的下标,不正则化0号!
nnCostFunction.m
下面采用 非向量化和向量化两种方式实现
先看一下效率比较
非向量化用时:ans = 0.0012472
向量化代码用时:ans = 0.00015712
可以看出非向量化代码用时是向量化代码用时的近十倍。
非向量形式的代码,不推荐
sum1 = 0;
sum2 = 0;
for i = 1 : size(Theta1,1)
sum1 += Theta1(i,:) * Theta1'(:,i) - Theta1(i,1)^2;
end;
for i = 1 : size(Theta2,1)
sum2 += Theta2(i,:) * Theta2'(:,i) - Theta2(i,1)^2;
end;
J += lambda/(2*m) * (sum1 + sum2);
正则化形式的代码,推荐
% 正则化 (向量化形式)
regularization = lambda / (2*m) * (sum(sum(Theta1(:, 2:end).^2))+ sum(sum(Theta2(: , 2:end).^2 )));
J += regularization;
作业三:Sigmoid Gradient
sigmoidGradient.m
g = sigmoid(z) .* (1 - sigmoid(z));
作业四:Neural Network Gradient (Backpropagation)
nnCostFunction.m
我是按照步骤一步一步来做的,老师上课说推荐第一次使用for循环,我实在没有get到这个意思,大概可能就是说一步一步来做吧!
% part2
delta3 = a3 - y; % 5000 x 10
delta2 = delta3 * Theta2; % 5000 x 26
delta2 = delta2(:,2:end); % 5000 x 25
delta2 = delta2 .* sigmoidGradient(z2); % 5000 x 25
Delta1 = zeros(size(Theta1));
Delta2 = zeros(size(Theta2));
Delta1 = Delta1 + delta2' * a1; % 26 x 400
Delta2 = Delta2 + delta3' * a2; % 10 x 25
作业五:Regularized Gradient
nnCostFunction.m
Theta1_grad = 1 / m * Delta1 + lambda / m * Theta1 ;
Theta2_grad = 1 / m * Delta2 + lambda /m * Theta2 ;
% 0号元素不用正则化
Theta1_grad(:,1) -= lambda / m * Theta1(:,1);
Theta2_grad(:,1) -= lambda / m * Theta2(:,1);