(一)用神经网络解决多元分类问题
1、举例 例如,我们想用训练的神经网络给图像分类,将自动识别行人、汽车、摩托车、卡车。那么我们的输出层将设置为四种矩阵,分别对应这四种分类结果。相当于四个模拟分类器,只不过结果y(i)不再是简单地对应1,2,3,4,而是四种向量。 2、代价函数 假设当前有这样一个训练集,其中有m组训练样本。设L为这个神经网络的总层数,则L=4;用SL表示第L层的单元数,也就是神经元的数量,其中不包括第L层的偏差单元。 有两种分类,一种是二元分类,一种是多元(K元)分类:如果是二元分类,y=0或1,只有一个输出单元SL=1,神经网络的输出结果h(x)是一个实数; 如果要分成K类(K>=3),那么有K个输出单元SL=K,神经网络的输出结果h(x)是一个K维向量。 现在来设置神经网络的代价函数,上面是逻辑回归的代价函数,神经网络在上面部分修改了一下,即不是只对一个单元y(i),而是对于K个单元y(i),包括正则项。列式如下: 3、反向传播法 为了使代价函数最小,提出了一种反向传播算法(用来求解神经网络中代价函数的导数)。 首先,根据前向传播的过程我们计算每一层的激活值a(i)。将输入向量x看作a(1),计算中间量z(2)=权重向量θ(1)激活值a(1)…然后由此推算a(i)。 接下来,计算每个神经元节点的激活值的误差。 设第l层第j个节点的误差表示为δj(l),那么第四层的误差就是第四层的激活值aj(4)减去训练样本的实际值yj,因为下标j表示的是第j项特征值,那么这个式子完全可以单纯用向量表示; 接下来计算δ(3),注意是向量点乘,右边这个导数g’可以计算出来,用蓝笔写出来了,可以自行推导; 同理可以计算δ(2)。 注意:因为第一层就是输入层,不可能存在误差,所以没有δ(1)。 因此可以算出其偏导项的计算公式(推导过程比较麻烦)如下(暂时忽略正则项,即λ=0): 下面详细描述运用反向传播算法计算代价函数的过程: 先取一条训练数据(x(i),y(i)),利用前向传播计算a(l),再计算最后一层的激活值与实际输出值的误差,然后由此向前推导第L-1层的误差、第L-2层的误差…第2层的误差。最后将这些误差累积,跳出循环时计算Dij(l),就是最终的结果了。 进一步解释 1、根据神经网络的代价函数,假设我们只有一个输出,且不考虑正则项,那么它的代价函数表示如下: 2、那么实际上误差δ等于代价函数的偏导,表示如下;而如何而求上一层的δ要根据下一层的δ乘以权值的累积和计算的,具体过程如下: 细节–将矩阵展开成向量 1、执行代价函数costFunction输入的参数是theta(n+1维的向量),函数返回代价值jVal和导数值gradient(梯度值,是一个n+1维的向量);然后你可以将代数值传递给高级优化算法fminunc,它将取出theta的一些初始值initialTheta(n+1维的向量)。 但是,当我们使用神经网络时,我们的参数就不再是向量,而是矩阵了。因此,在一个L=4层的神经网络中,我们给出参数矩阵θ(1)、θ(2)、θ(3),对应的在octave中表示成Theta1、Theta2、Theta3;计算的梯度矩阵D(1)、D(2)、D(3)(与上面的梯度值gradient对应),对应的在octave中表示成D1、D2、D3。 所以现在就需要学习如何将这些矩阵元素取出并转为向量的小技巧。 2、举例 设输入层有10个单元S1=10,隐藏层有10个单元S2=10,输出层有1个单元S3=1。那么可知参数矩阵θ(1)、θ(2)、θ(3)的维度以及D(1)、D(2)、D(3)的维度,表示如下。 那么首先要将θ(1)、θ(2)、θ(3)中的元素全部取出,然后展开赋给向量thetaVec;将D(1)、D(2)、D(3)中的元素全部取出,然后展开赋给向量DVec。 如果需要将展开的向量复原成矩阵,就使用reshape命令,分别从向量中取出第几个到第几个元素。例如,Theta1是取出第1-110个元素,组成1011的矩阵。
(二)梯度检测
1、由于反向传播的内部实现比较复杂,所以很容易产生一些微秒的bug,看似正常运行,最终结果可能比无bug情况下多出一个量级,但你根本察觉不到。 因此,我们使用梯度检测完成无论是前向传播还是反向传播的检验。 首先,我们来看当θ为实数时这个点的导数表示方式如下,左边是双侧查分,右边是单侧差分,一般我们选择左边这种更为精确。当ε约为10的-4次方的时候,我们认为这个式子约为精确地表示了这个点的导数。 应用到实际代码中是这样的: 梯度检测方案: 现在我们考虑当θ是一个n维向量时,我们用类似的思想计算所有的偏导项: 为了实现上述流程,我们使用如下代码: 这里的n指的是参数向量θ的维数,这样可以近似地求出这一点的导数项。接下来我们将使用反向传播算法计算出的导数DVec与刚刚算出的导数值gradApprox比较,在无bug的情况下二者应该是约等于(只有几位小数的差距)的关系。 至此,梯度检测介绍完毕。 2、接下来介绍应用顺序建议 第一步,应用反向传播算法计算DVec;第二步,应用梯度检测计算gradApprox;第三步,确保二者的值近似相等;第四步,关掉梯度检测,将反向传播代码用于学习。(因为梯度检测算法的计算效率远远低于反向传播算法计算DVec的效率,所以检测完后请务必关闭) 细节–随机初始化 1、当我们在执行一个梯度下降算法或其他高级算法时,我们需要为变量θ选择一个初始值initialTheta,在逻辑回归中我们一般将之设为0。 但实际在神经网络中将所有权重初始化为0是不对的,这样会导致所有层的激活值一样、误差一样, 在后续的梯度更新中,蓝色线与蓝色线、红色线与红色线…代表的权重同时改变并且同时相等,这将形成一个高度冗余的现象。 2、随机初始化方案 我们刚刚遇到的问题又被称为对称权重问题,需要用随机初始化解决。我们对每一个参数权重θ初始化到一个范围为[-ε,ε]的随机值。 例如我们将Theta1初始化:用一个10*11的随机矩阵rand(10,11)介于0-1之间,然后乘以两倍的ε,减去一个ε,最后得到一个[-ε,ε]的值。 注意,这里的ε与梯度检验中的ε没有关联。
|