1 - Cost Function 代价函数
对于如下的神经网络,
有m组训练数据: (x(1),y(1)),(x(2),y(2)),…,(x(m),y(m)) 。注意此时的y是K x 1的向量,每个y(i)的取值是0或1。
定义如下参数:
- L 网络的层数
- S_l 第l层的节点数目(不含bias unit)
由第6节的分析,结合logistic regression的Cost function:
推广得到Neural network的Cost function如下:
Tips:这里因为输出(类别)有多个,所以需要把K个输出的error进行相加。
- 注意事项:在Regularize cost function的时候,一定要去掉bias unit的影响!!!
2 - Backpropagation Algorithm 反向传播算法
2.1 计算条件
-
hθ(x)=g(z(4))
- z(4)=θ(3)a(3)
- a(3)=g(z(3))
- z(3)=θ(2)a(2)
- a(2)=g(z(2))
- z(2)=θ(1)a(1)
- a(1)=x
- Cost function:
J(θ)=−1m[∑i=1m∑k=1Ky(i)klog(hθ(x(i)))k+(1−y(i)k)log(1−(hθ(x(i)))k)]+λ2m∑l=1L−1∑i=1sl∑j=1sl+1(θ(l)ji)2 - 目标: minθJ(θ) 时的θ值。
- 需要计算的:
- J(θ)
- ∂∂θ(l)ijJ(θ)
2.2 算法步骤
参数:
-
δ(l)j=
第l层的第 j 个元素的误差
δ(4)j=a(4)j−yj
δ(3)=(θ(3))Tδ(4).∗g′(z(3)) ,其中 g’(z3) = a3 .* (1 - a3)
δ(2)=(θ(2))Tδ(3).∗g′(z(2)) ,其中 g’(z2) = a2 .* (1 - a2)
注意没有 δ(i) ,因为第一层是输入层-
δ(l)j=
第l层的第 j 个元素的误差
- Δ(l)ij= 第 l 层的第 j 个元素到第 l+1 层的第 i 个元素之间的误差
算法:
- 关于算法的解释:
- 算法的目的:计算 Δ(l)ij 的值。
- D(l)ij:=1mΔ(l)ij+λθ(l)ijif≠0
- D(l)ij:=1mΔ(l)ijifj=0
- ∂∂θ(l)ijJ(θ) 偏导计算公式: ∂∂θ(l)ijJ(θ)=D(l)ij
3 - Backpropagation Intuition 对反向传递算法的理解
4 - Implementation Note- Unrolling Parameters 算法实现技巧 - 参数展开
对于Advanced optimization:
function [jVal, gradient] = costFunction(theta) ... optTheta = fminunc(@costFunction, initialTheta, options)
在Neural Network(L=4)中:
- θ(1),θ(2),θ(3) - matrices (Theta1, Theta2, Theta3) 每层的θ都是矩阵
- D(1),D(2),D(3) - matrices (D1, D2, D3) 都是矩阵
多个参数矩阵在传递参数时不方便,因此需要将其展开成向量
示例:
5 - Gradient Checking 算法正确性检查
计算方法(推荐的 EPSILON 值是0.0001):
实现步骤:
- 用反向传递算法计算 DVec(由 D(1),D(2),D(3) 展开而来)
- 用 numerical gradient check 来计算 gradApprox
- 比较二者的值,正常情况下它们应该近似
- 关闭 gradient checking。用反向传递算法继续学习。
要点:
- 在训练分类器之前一定要确保关闭gradient checking,否则程序会运行的非常非常慢!!
6 - Random Initialization 初始化θ的方法 - 随机初始化
为什么不能将 θ 全部初始化为 0:
- After each update, parameters corresponding to inputs going into each of two hidden units are identical.
初始化方法:
7 - Putting It Together 反向传递算法实现步骤总结
准备工作:选择网络结构
- input units数量:输入量 x(i) 的维度
- output units数量:分类器的类别数量
- hidden layer数量:reasonable default是1层,如果大于一层,那么最好每层的节点数都相同(当然越多越好)。
算法步骤:训练神经网络
- 随机化的初始权重 θ 的值。
- 用前向传递方法计算在 initialθ 情况下每个输入 x(i) 所对应的 hθ(x(i)) 。注意,此时的 hθ(x(i)) 是一个 K x 1向量,每位取值是0到1之间的一个小数。因为这时处于训练阶段,因此千万不可将其取整化为0或1!
- 实现 cost function 的计算公式
用反向传递算法计算偏微分 ∂∂θ(l)jkJ(θ)
详见 2.2 的算法部分!用 gradient check 方法来比较用反向传递算法计算出来的 ∂∂θ(l)jkJ(θ) 和用numerical estimate gradient方法计算出来的gradApprox
- 关闭gradient check
- 用gradient descent或者advanced optimization method来得到 J(θ)的最小值。
8 - Autonomous Driving 神经网络的应用 - 汽车自动驾驶技术
- 汽车前方的摄像头会采集前方的道路信息(主要指左右道路弯曲情况)
- 驾驶员正常驾驶
- 训练数据:
- 输入X:摄像头拍摄的实时视频图像(30x30px)
- 输出Y:驾驶员的左右转弯数据
- 神经网络系统:根据训练数据进行学习,得出网络的参数。
- 自动驾驶:根据训练出的神经网络系统,在得到道路实时视频图像数据之后,自主确定左右转弯情况。
9 - 练习中出现的错误:
在编写识别手写字体程序的cost function:
J(θ)=−1m[∑i=1m∑k=1Ky(i)klog(hθ(x(i)))k+(1−y(i)k)log(1−(hθ(x(i)))k)]+λ2m∑l=1L−1∑i=1sl∑j=1sl+1(θ(l)ji)2
的时候,犯下两大错误:- 输出的排序顺序是 1-2-3-4-5-6-7-8-9-0,对应的代码分别是 1-2-3-4-5-6-7-8-9-10
- 不是任何时候都要去vectorilization:
- 错误的实现:
J = - mean( sum( tempy*log(h) + (1-tempy)*log(1 - h) ) ) ;
%temp是由y转化而成的10x5000的训练集输出数据,h是5000x10的估计值 - 错误原因:
- 以
mean(sum(tempy*log(h)))
为例,这里计算了每一个y与所有的h(θ)的误差,复杂度是n*n。而实际上只需要计算每一个y与相对应的h(θ)的误差!
- 以
- 错误的实现:
- 正确的实现: