Neural Networks Learning
Cost Function
这里定义一些新的符号
L表示总共的layer数量,如下图,L=4
s带下标l,表示第l层的units个数,比如layer2有5个unit, 不包含bias unit
下面以binary classification和multi class classification为例子:
binary classification: 最终只有一个output,记作h(x),也就是说h(x)是实数空间的一个数字
multi classification:结果会有若干个output,整体作为一个向量,那么这里的h(x)就是k维空间向量中的一个向量。
理解上面lambda注意s是不包含bias unit的,每一层的bias unit都要排除
Back propagation Algorithm
我们的目标是让J取得最小值,如果使用octave系统自带的优化的求解方法的话,要计算下面2个东西,J 和 Gradient
从最后一层开始一次向前分别定义每一层的“error”,第一层除外,因为作为input layer是没有error的,其实这里的“error”和我们真正要计算的偏导数有一个对应的关系,如下:
下面的Δ要给每个layer都计算一次,而且要把1-m个trainning example计算到的Δ累加起来。Δ和对应layer的Θ矩阵是一样大小的
Backpropagation intuition
从x input前向计算到z,然后使用sigmoid函数得到第一层的activation value,依次计算到后面的a,可以看得出来下面图中最下面的公式对应图片中的关系。这里先有个图像化的感知。
看一下下面,后向计算delta,画线的方式,然后看一下右边的手写公式,现在有些理解后向传播了吧。
Unrolling parameters
octave内置的优化的方法,如fminunc,要求的输入的gradient,theta,都是vector类型的,而我们这里的theta,每一层都是一个矩阵,如何把神经网络中的theta fit到内置的优化方法中呢?
我们下面看一下如何处置这样的问题
看一下,下面计算顺序,这就是我们将来计算的一个顺序啦,当然还有一块内容没包含进来
Gradient Checking
如果真的要计算的话,如下
循环计算出来估计值,然后和Dvec比较,如果很接近的话,我们就可以很有信心的认为我们的计算是正确的
但是计算估计值的时候要计算改变单个theta后J的value,相当于一次完全的前向计算过程,很有很大的计算量
那么现在我们更新一下我们整个计算过程
Random Initialization
会发生下面的事情,首先是a1 = a2, 然后反向计算δ也都相等,相应的偏导数都相等,然后更新的θ也都相等,那么最终计算的每层hidden layer的hidden unit也都相等,那么其实最终hidden unit只得到一个feature,而并非是神经网络的本意。
那么我们这里初始化采用随即初始化的方法,实际上这里的ξ是有一个经验取法的,参考后面的programming excercise部分,下面是给每个theta进行初始化的过程。
Put it together
下面我们总结如何训练一个神经网络
注意实际上神经网络的cost function并不是一个凹函数,所以很有可能我们只得到局部最优解,不过一般局部最优解也会是一个比较优秀的结果。
可以看得出来,选取不同的theta有可能最终带来不同的结果
Autonomous Driving