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;
相关文章推荐
- stanford ml note 1(线性回归)
- [ML] k近邻法(k-NN)
- nn pic model preprocess note
- ML 逻辑回归 note
- ML_note:Regularization
- ML_Note:bias VS variance
- stanford_CS231n_learning note_Lec_04 Backpropagation
- [NN] 对于BackPropagation(BP, 误差反向传播)的一些理解
- 【Stanford-ML-Discussion】LiR,LoR,NN,SVM假设,损失函数与训练方法比较
- ML_Note:NeuralNetwork1_representation
- NN AND ML——MLP
- TR111 and TR069 function development note (2)
- READING NOTE: Pushing the Limits of Deep CNNs for Pedestrian Detection
- ML:Scikit-Learn 学习笔记(1) --- Nearest Neighbors 最近邻 综述
- CodeForces 433C Ryouko's Memory Note-暴力
- jspNote
- OpenCV2.4.10之samples_cpp_tutorial-code_learn-----ml(SVM支持向量机一)
- c# language note
- [Book Note] Haskell: Monoid
- BP neural network note