神经网络的前向传播
不得不承认,假设函数的格式很大程度上决定了我们所获得图像的样式,对于线性回归是与样本数据尽可能重合的那条直线,而在逻辑回归中就是所谓的决策边界。
我们观察逻辑回归中的sigmoid函数
不难发现对于theta*X这一项的存在,若是只输入单一的一次特征值,你只能得到一条为直线的决策边界。
然而我们在特征数较少时,可以人为构造二次项,三次项…再通过正则化得到一个比较符合分类的曲线。
然而当特征值众多时,二次项三次项的数量成几何级上升,训练成本昂贵。
但神经网络的出现,恰恰解决了这个问题,使得得到非线性边界变得十分方便。
由输入特征x_1经过第一层权重的处理后得到a_1,a_1现在仅仅是简单的特征值的线性组合。然而经过g函数(sigmoid)的处理再进行第二层权重的线性处理后,原本的x_1_之间的关系就变成非线性的了。这就有利于我们处理非线性问题。
由于神经网络用于处理分类问题,最后的输出结果,一般是一个0~1的值(单一分类)或者是一个向量(多种分类)。如下是一个样本特征下的h_θ_x的处理结果。
在matlab中通过代码 [value,index]=max(A) 可以读出每列元素的最大值和对应索引(索引值代表样本类型)。
代价函数
对于多元分类,因为最后的输出结果是一个向量而非逻辑单元中的一个结果。
所以对于一个K元分类,代价函数在训练集的一个样本中要累计K个单元的全部误差。所以代价函数如下:
i=1开始是因为正则化不涉及偏置单元系数。
反向传播
在实现梯度下降算法中,需要对代价函数进行求导操作
我们通过反向传播算法实现对于每个θ系数的求导。
步骤如下:
如上图所示,对于一个4层神经网络,经过一次正向传播后,我们将最后得到的结果与实际值做差,作为反向传播的新的输入量。(反向传播就是正向传播的镜像过程。)
δ(4)作为新的输入变量进过一次原权重不变的向量相乘过程
还要再进行一次运算才能得到新的δ(3)
因为
为了便于计算
传播终止于δ(2),因为δ可以理解为是一个与实际结果的偏差值,而作为第一层输入的是特征值,并没有偏差。
导数与δ关系如下
以下是实现梯度计算的代码思路
最后两项中j=0 不添加正则项。
θ初始化问题
如图所示,因为每条线上的权重都一样,所以不管正向反向得到的每列θ和δ都是一样的。
又因为
所以每列的θ值最终都相同。
代码实现
代码实现-反向传播
第三层输出单元为k,则y的结果亦对应一个k元向量 ,y是一个K x M的矩阵,y=
我们求出δ(3)向量,亦是一个K x M的矩阵。
因为θ(2)的大小为 (P+1)x K,因此θδ大小为(P+1)x M,且a(2)大小也为(p+1)x m
delta应减去首行
delta大小为p x m
我们利用for循环 每次取出一个样本值。设取出的第一个样本值为
利用for循环对这个θ(2)矩阵不断累加。可得所求D