本文讲的是coursera上斯坦福大学机器学习公开课(吴文达)课程第五周Neural Networks :learning 的课后作业。本文给出了作业实现的具体代码,并给出相应的注释和解释,供各位同学共同讨论学习。
吴老师在课程里说过求解神经网络的一般顺序为:
(1)随机生成初始化theta
(2)正向传播,计算h(x)
(3)计算J值
(4)反向传播,计算误差delta,并计算J对矩阵内各个元素的偏导数
(5)利用gradient checking比较反向传播计算得到的偏导数与numerical gradient计算得到的偏导数的结果,确保反向传播准确无误
(6)利用高级优化算法,利用反向传播,得到最小化J,并得到对应的参数theta值即为所求
准备工作:
a.因为给出的sigmiod函数只能求解标量,我们要修改其代码,使其对矩阵也起作用。
修改sigmoid.m,得到以下代码:
function g = sigmoid(z)
[m,n] = size(z);
g = zeros(m,n);
for i = 1:m,
for j = 1:n,
g(i,j) = 1.0 ./ (1.0 + exp(-z(i,j)));%对z的每个元素求计算其逻辑值
end
end
end
b.由于反向传播时需要求sigmoid函数的偏导数,需要修改sigmoidGradient.m,要求它对矩阵也有作用。
油微积分可证,g(z)的偏导数为:g(z)*(1-g(z)),具体原因需要参考微积分求导相关章节。
修改sigmoidGradient.m,得到以下代码:
function g = sigmoidGradient(z)
g = zeros(size(z));
g = sigmoid(z) .* (1 - sigmoid(z));%因为要使函数对矩阵也起作用,所以用点乘
end
下面按照本文头部给出的步骤的实现代码:
1.随机生成初始化theta
<strong>function W = randInitializeWeights(L_in, L_out)
epsilon_init = 0.