Cost function
先进行符号定义:
L:神经网络层数
Sl:第l层的单元数(不包括偏置单位)
K:输出单元数(SL)
逻辑回归的代价函数是:
而神经网络的代价函数有所不同,是:
这个看上去很复杂的代价函数背后的原理还是一样的,我们希望通过观察代价函数来观察算法预测的结果与真实情况的误差有多大,唯一不同的是:
对于每一行特征,我们都会给出K个预测,基本上我们可以利用循环,对每一行特征都预测K个不同的结果,然后在利用循环在K个预测中选择可能性最高的一个,将其与y中的数据进行比较。
Backpropagation Algorithm
之前计算神经网络时是用的正向传播算法,我们从第一层开始一层一层的计算,直到最后一层得出结果。
选择为了计算代价函数的偏导数,可以采用反向传播算法,首先计算最后一层的误差,然后再一层一层反向求出各层的误差,直到导数第二层。
以之前的例子为例:
正向传播算法计算值过程如下:
用δ表示误差 δ(4) = a(4) - y
然后用这个误差计算前一个误差:
其中g'(z(3))是S形函数的导数,g'(z(3)) = a(3).*(1-a(3)),而(θ(3))Tδ(4)则是权重导致的误差的和,下一步是继续计算第二层的误差:
而第一层是输入变量,不存在误差
完整的计算过程如下:
Backpropagation Intuition
前向传播算法是这样的:
而反向传播算法是这样做的:
Implementation Note: Unrolling Parameters
之前们谈到了怎样使用反向传播算法计算代价函数的导数,现在你介绍一个细节的实现过程,怎样把你的参数从矩阵展开成向量,以便我们在高级最优化步骤中的使用需要。
例如:
Gradient Checking
当我们对一个较为复杂的模型(例如神经网络)使用梯度下降算法时,可能会存在一些不容易察觉的错误,意味着,虽然代价看上去在不断减小,但最终的结果可能并不是最优解。
所以我们可以采取一种叫做梯度的数值检验方法(Numerical Gradient Checking).
当 θ 是一个向量时,我们则需要对偏导数进行检验。因为代价函数的偏导数检验只针对一个参数的改变进行检验,下面是一个只针对 θ1 进行检验的示例:
总的公式如下:
代码实现如下:
Random Initialization
任何优化算法都需要一些初始值,在这个我们将θ的初始值设为0,对于逻辑回归来说是可行的,但是对于神经网络来说是不行的,这样的话会时第二层的所有激活单元都会有相同的值。当然,如果都设成一样的非0值,第二层的激活单元也会有相同的值。
所以,我们可以设置在正负ε之间的随机值
Putting it Together
总结一下使用神经网络的步骤:
第一件要做的事是旋转神经网络结构,即选择多少层以及决定每层分别有多少个单元。
第一层的单元数是我们训练集的特征数量。
最后一层的单元数是我们训练集的结果的类的数量。
如果隐藏层数大于 1,确保每个隐藏层的单元个数相同,通常情况下隐藏层单元的个数越多越好。
所以我们要决定的是中间的隐藏层及单元数。
训练神经网络需要注意的事项:
1、参数的随机初始化
2.、利用正向传播方法计算所有的 hθ(x)
3、 编写计算代价函数 J 的代码
利用反向传播方法计算所有偏导数
5、利用数值检验方法检验这些偏导数
6、使用优化算法来最小化代价函数
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Coursera机器学习week5 笔记 - Python技术站