您的位置:首页 > 运维架构

ML_note:NN_backpropagation

2016-12-30 21:17 183 查看

Abstract

这篇笔记主要讲BP算法(backpropagation),即用这个算法来计算在上一节学到的神经网络中的参数.

Notation

在解决这个问题以前,为了方便描述,我们先定义一些符号.

a) L= total number of layers in the network

b) sl = number of units (not counting bias unit) in layer l

c) K= number of output units/classes

costFunction

和前面的算法一样我们需要定义costFunction,仿照前面的分类器的costFunction,由于这个神经网络的分类器有 k

个单元所以我们需要 对每一个输出计算cost .

J(θ)=1m(∑mi=1∑Kj=1−y(i)jlog(hθ(x(i))j)−(1−y(i)j)log(1−hθ(x(i))j))+λ2m∑L−1l=1∑slj=1∑sl+1i=1(θli,j)2

后面一项是正则化部分其实就是对所有的 θli,j平方求和.

Backpropagation Algorithm

从前面的算法我们知道,对这样的一个 costFunction 最小化需要知道,对于一个给定的 θ 的值 J,以及 对每一个 θ 的偏导数. BP算法就是用来求偏导数的.

BP算法描述

input

训练集合 (x(1),y(1)),...,(x(i),y(i)),...,(x(m),y(m))

output

每一层参数 Θ 的偏导数 Dl

for t = 1 to m

a(1)=x(t)

对于每一层 用前向传播计算 a(l) for l = 2,3,…,L

let δL=aL−y(t)

对于 l=L−1,L−2,...,2 反向计算 δl,用公式 δl=(Θl)Tδl+1.∗a(l).∗(1−a(l)) 注意 这个 a(l).∗(1−a(l)) 是当前层的值 g′(zl)

Δli,j=Δli,j+a(l)jδl+1i (想想 网络图像就明白了,从本层的 j 号单元 到下一层的 i 号单元) 也可以用向量化实现 Δl=Δl+δl∗(al)T

endfor

Dli,j=1m(Δli,j+λΘli,j)if j≠0 else Dli,j=1m(Δli,j)

下面是本周作业中我在 octave 中的实现

Delta_2 = zeros(size(Theta2));
Delta_1 = zeros(size(Theta1));
for i = 1:m
%step 1
a1 = X(i,:);
a1 = [1 a1](:);
z2 = Theta1*a1;
a2 = sigmoid(z2);
a2 = [1 ;a2];
z3 = Theta2*a2;
o = sigmoid(z3);
%step 2 计算输出层误差
yk = zeros(num_labels,1);
yk(y(i)) = 1;
delta_3 = o-yk;
%step 3 反向计算l = (L-1),L-2,..,2的误差delta_l
delta_2 = Theta2'*delta_3.*a2.*(1-a2);

%step 4
Delta_2 = Delta_2+delta_3*a2';
Delta_1 = Delta_1+delta_2(2:end)*a1';
end;
%step 5
Theta2_grad= (Delta_2+lambda*[zeros(size(Theta2,1),1) Theta2(:,(2:end))])/m;
Theta1_grad = (Delta_1+lambda*[zeros(size(Theta1,1),1) Theta1(:,(2:end))])/m;


Implementation Note

展开 Θ

对于一般的优化好了的内建函数来说,往往 Θ 与倒数都是一个 vector ,所以我们需要把矩阵展开为向量,

thetaVector = [ Theta1(:); Theta2(:); Theta3(:); ]
deltaVector = [ D1(:); D2(:); D3(:) ]


还原回去

Theta1 = reshape(thetaVector(1:110),10,11)
Theta2 = reshape(thetaVector(111:220),10,11)
Theta3 = reshape(thetaVector(221:231),1,11)


θ1为10x11,…

debug :Gradient Checking

用数值的算法来验证你的 BP 算法是否正确。 简单地说就是对于每一个 θli,j,用

∂J∂θli,j=(J(,...,θli,j+ϵ,...,)−J(,...,θli,j−ϵ,...,))2ϵ

epsilon = 1e-4;
for i = 1:n,
thetaPlus = theta;
thetaPlus(i) += epsilon;
thetaMinus = theta;
thetaMinus(i) -= epsilon;
gradApprox(i) = (J(thetaPlus) - J(thetaMinus))/(2*epsilon)
end;


来近似BP算法中的 偏导数看看误差(直接用数值算法的训练成本异常的高)

##随机初始化

Initializing all theta weights to zero does not work with neural networks. When we backpropagate, all nodes will update to the same value repeatedly.

Instead we can randomly initialize our weights:

Initialize each θ to a random value between [−ϵ,ϵ]:

一般来说 ϵ选为

ϵ=6√Lin+Lout√

原因详见

paper

If the dimensions of Theta1 is 10x11, Theta2 is 10x11 and Theta3 is 1x11.

Theta1 = rand(10,11) * (2 * INIT_EPSILON) - INIT_EPSILON;
Theta2 = rand(10,11) * (2 * INIT_EPSILON) - INIT_EPSILON;
Theta3 = rand(1,11) * (2 * INIT_EPSILON) - INIT_EPSILON;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  机器学习 andrewNg BP