机器学习---编程练习(四):神经网络

机器学习—编程练习(四):神经网络

文件列表

ex4.m - Octave/MATLAB script that steps you through the exercise
ex4data1.mat - Training set of hand-written digits
ex4weights.mat - Neural network parameters for exercise 4
submit.m - Submission script that sends your solutions to our servers
displayData.m - Function to help visualize the dataset
fmincg.m - Function minimization routine (similar to fminunc)
sigmoid.m - Sigmoid function
computeNumericalGradient.m - Numerically compute gradients
checkNNGradients.m - Function to help check your gradients
debugInitializeWeights.m - Function for initializing weights
predict.m - Neural network prediction function
[*] sigmoidGradient.m - Compute the gradient of the sigmoid function
[*]randInitializeWeights.m - Randomly initialize weights
[*] nnCostFunction.m - Neural network cost function
* 是需要完成的内容


1 神经网络

在之前的练习中,你实现了前向传播神经网络,并且使用它以及我们提供的权重预测了手写体。在这次的练习中,你将会实现反向传播算法学习神经网络中的参数。

第一部分是前向传播神经网络,这部分的第一节和第二节和(练习三)一致,就不过多赘述,从第三节开始。

1.3 前向传播和成本函数

现在你将会为神经网络实现成本函数和梯度,首先完成nnCostFunction.m中的代码返回cost。

神经网络的成本函数
机器学习---编程练习(四):神经网络
hθ(x(i))计算如下图
机器学习---编程练习(四):神经网络
另外,我们的原始标签是1-10,为了训练神经网络,我们需要将标签转换成只含1和0的向量
机器学习---编程练习(四):神经网络
这里我做的时候不知道y是多大的向量,以及怎样去转换。

首先y 是 5000*1的矩阵

机器学习---编程练习(四):神经网络
矩阵中的每个元素需要转换成
机器学习---编程练习(四):神经网络
那么转换之后的y是
机器学习---编程练习(四):神经网络
y中有5000个10*1的矩阵。

之后是y的转换代码

y = repmat([1:num_labels], m, 1) == repmat(y, 1, num_labels);
%我们把它拆分一下,方便我解释
a = repmat([1:num_labels], m, 1);
b = repmat(y, 1, num_labels);
y = a == b;

repmat函数的百度解释。
机器学习---编程练习(四):神经网络

上面那段代码的意思是
创建一个5000 x 1的矩阵,矩阵中每个元素是[1 2 3 4 5 6 7 8 9 10], a的大小是5000 x 10
再创建一个1 x 10的矩阵,矩阵中每个元素是y,y是5000 x 1的矩阵, 所以b的大小是5000 x 10
(这里用*会变成斜体,用x代替)
再解释 y = a == b;我贴个图,应该就明白了。
机器学习---编程练习(四):神经网络
这段代码的意思是创建一个a大小的矩阵(a b矩阵大小相等),比较ab当ab相等是值为1,其余为0.

之后比较ab中的元素,我们得到这样的矩阵y 大小 5000*10.
机器学习---编程练习(四):神经网络

正则成本函数

神经网络的正则成本函数
机器学习---编程练习(四):神经网络
这部分代码如下:


a_1 = [ones(m, 1) X];

z_2 = a_1*Theta1';
a_2 = sigmoid(z_2);

a_2 = [ones(m, 1) a_2];
z_3 = a_2*Theta2';

a_3 = sigmoid(z_3);
h = a_3;
y_vec = [y(:)];
h_vec = [h(:)];
%对Theta1 Theta2矢量化
regTheta1 =  Theta1(:,2:end);
regTheta2 =  Theta2(:,2:end);
Theta1_vec = [regTheta1(:)];
Theta2_vec = [regTheta2(:)];
J = 1/m.*(-y_vec' * log(h_vec) - (1 - y_vec)' * log(1 - h_vec))...
    + lambda/(2*m).*(Theta1_vec'*Theta1_vec + Theta2_vec'*Theta2_vec);

这部分有点绕,我看了程序答案又思考了好久才理解。不知道你们理解了没。如果有没懂的地方可以留言,我看到会回复的。答案上就比较简单了,不需要思考这么多东西,没用矩阵乘法求和,两个sum解决。实在看不懂也可以参考答案。

2 反向传播

在这部分的练习中,你将会实现反向传播算法计算神经网络成本函数的梯度。完成梯度的计算后,你就能使用一个像fmincg这样的高级优化器,通过最小化成本函数 J(Θ)训练神经网络。首先你将会求得一个非正则神经网络的梯度,完成以后,再实现正则神经网络的梯度。

2.1 Sigmopid gradient

为了帮助你完成这部分的练习,你将会先实现sigmoid梯度函数

机器学习---编程练习(四):神经网络
机器学习---编程练习(四):神经网络
将下列代码输入到 sigmoidGradient(z)

g = sigmoid(z).*(1 - sigmoid(z));

2.2 随机初始化

在训练神经网络的时候,随机初始化参数对于对称破坏(symmetry breaking 知网上查的)时非常重要的。一种非常有效的随机初始化方法是在 [−ϵinitinit ]之间挑选Θ(l) 的值。你应该使用,ϵinit = 0.12.这个范围的值确保参数被保持的很小,并且使学习更有效。

将下列代码输入到 randInitializeWeights.m 中(讲义上有)

% Randomly initialize the weights to small values
epsilon init = 0.12;
W = rand(L out, 1 + L in)*2*epsilon_init − epsilon_init;

ϵinit 的计算方法
机器学习---编程练习(四):神经网络
Lin = sl , Lout = sl+1 ,是Θ(l)相邻层中的单元数。

2.3 反向回归

机器学习---编程练习(四):神经网络
这部分还没想懂。
明天更完。