如下图右边的逻辑函数中,仅仅包含了两个特征x1和x2,此时包含了所有的特征值,这里明显包含了所有的特征,但是数据非常多
上述知识在两个特征变量的情况下,但是如果有100个特征变量,在保证拥有全部特征的情况下,只考虑二次项,也就是包括x²、x1x2、x1x3…等等相关的特征组合就已经达到5000个,相应复杂度达到O(n²)
如果只考虑x²、x²…这些项,同样数量也会达到n²/2
如果考虑三次方,也就是例如x1x2x3、x1²x2…,其数量能够达到170000个,复杂度为0(n³)
因为往后的运算中都是围绕这些项去展开的,项越多越复杂,就意味着难度越高。并且上述还是在省去了部分项,可能会造成欠拟合以及过拟合问题
因此,只是包括平方项或者立方项特征以及简单的logistic回归算法,并不是在特征变量数量n很大的时,学习复杂的非线性假设的好办法,因为特征过多
神经网络在学习复杂的非线性假设上被证明是一种好得多的算法
神经网络是人们想尝试设计出模拟人脑的算法,最初被用于制造能模拟大脑的机器
在运用神经网络时,我们该如何表示我们的假设或模型
神经网络模仿了我们大脑中的神经元或者神经网络,所以理解神经网络可以从,人体的神经元进行结合理解,如下图为一个神经元
神经元存在一个细胞体,并且神经元有很多输入通道,如下
神经元后的轴突负责向其他神经元传递信号
综合上述,神经元就是一个计算单元,它从输入通道接受数据,然后经过计算,最终通过轴突进行传递信息到其他神经元
在我们计算机中,我们可以设计如下一个简单的逻辑单元
有时候会添加一个额外的输入x0,如下,这个是偏置单元或偏置神经元,他的值总是等于1,因而一般是不会标出来
神经网络实际上是一系列的神经元连接起来的组合
激活项:由一个具体神经元计算并输出的值
假设j层有sj个单元,而j+1层有sj+1个单元,那么矩阵θj的维度是sj+1sj+1,如上述例子中,θ1就是一个34的矩阵
注意是sj+1*sj+1,右边的是sj,多加1是增加的偏置单元x0
这里a(2)1就是第2层第1个神经元的输出值(激活项目),下标是0的是偏置单元,θ是权重矩阵,上述简单理解就是例如a(2)1后边g函数中的四个相加的项其实,就是最左边的输入项(包括偏置单元)乘上各自连着第2层第1个神经元的线的权重
上述中最后一个单元,他计算h(x),他的计算公式可以是如下图2
z(2)表示第二层激活项对应的sigmoid的参数,如下图,将参数矩阵化
对于上述中z(2)与输入值相关,因此对应的x就是第一层的激活项,为了统一符号表示,可以将x变成a(1)进行表示
同样可以进一步表示其他
计算h(x)的过程成为前向传播,这是因为计算是从输入项一步步计算,最后到输出层,最终得到对应的输出值,这个过程依次计算激活项,称为前向传播
如下图所示,右边部分跟逻辑回归是相同的,但是输入值不是x1,x2…这些,而是经过处理的从隐藏层中输出的新特征
神经网络的神经元之间的连接方式称为神经网络的架构
计算同或执勤啊首先可以进行如下通过例子说明神经元是如何被用来计算逻辑函数
如下为实现逻辑与,其中特征变量是x1和x2,通过神经网络进行计算该值,从下边可以看到,分别设置了相应的权重,通过权重以及对应的输入特征量,最终得到sigmoid函数,x1和x2的输入值只能是0和1
通过右下图的表格,分别输入x1和x2的值,这个时候,可以得到相应的sigmoid的函数值,并且经过计算得到的结果跟实际的逻辑与相同
如下是逻辑或的实现,相对于上述逻辑与,仅仅是改变了权重,然后同样的输入,但是输出不同,并且符合实际的或运算的输出
由上述就可以看到神经网络的工作过程并且每个神经元在其中的作用
如下是算出来的三个组合,将三个组合结合在一起就可以实现同或
如下通过上述两个组合,分别得到隐藏层的两个激活项,最后通过or进行组合,最终输出同或的结果
可以注意到中间的那个NOT x1 and NOTx2,他的参数其实就是x1 or x2的参数变成了负数,这样就成功取反了
为神经网络拟合参数,就需要求出其代价函数
由上述可以知道,对于二分类问题中,输出层实际上只有一个神经元,并且从输出层的上一层的隐藏层到输出层的时候,其构成类似逻辑回归,而多元分类的时候,实际上操作也是相当于多个二分类问题的输出,也就相当于多个类似逻辑回归方程的输出
因而神经网络的代价函数可以从逻辑回归的代价函数入手进行推导
如下是逻辑回归及其正则项的数学方程
而神经网络中,可以处理多分类问题,也就是类似多个逻辑回归的过程
假设有k个分类,那么就得到如下神经网络代价函数
如下按1…k进行叠加,是统计k次的分类结果进行处理
反向传播详细推导:神经网络之反向传播算法(BP)公式推导(超详细)
让神经网络代价函数最小化的算法
如下是神经网络假设函数的代价函数,我们的目的同样是使得代价函数最小并且得到相应的θ的值
最小化代价函数的时候,主要还是对代价函数求偏导的过程
假设只有一个样本的训练集以及如下的架构的神经网络,如下为前向传播的过程。其中add a(2)0表示在对应的层加入相应的偏置单元
为了计算导数项我们将采用一种叫反向传播的算法
反向传播就是对每一个结点,我们计算如下图这样一项,
该项代表了第l层的第j个结点的误差。他捕捉了在这个神经节点的激活值的误差
上图中,以右图神经网络架构为基础,首先得到的是是输出层的各个点的误差,而后是从这里开始往前推导各层的误差,如下
对其中的g’进行展开,如右边公式所示,该公式在数学上就等于激活函数,而在表达式里边使用了g’进行表示,也就是g的偏导数进行表示
如下是根据上述推导方式推导出来的偏导数项
从上述可以知道,反向传播的名字由来是因为我们的推导过程是从输出项开始的,而前向传播则是相反
注意:
- 我们不需要对输入层考虑误差项,也就是说反向传播最多到δ2
- δ有时候写作大写的Δ
上述例子是仅有一个样本的情况下通过反向传播算法来计算这些参数的偏导数,接下来相对一个非常大的训练样本时在这方面的处理
如下是m个样品集合,循环对每个集合进行操作,并设置第一层的激活值为输入值,通过前向传播推导出每一层的激活值,然后通过反向传播求每一层的误差,最后循环执行如下公式循环累加偏导数
其中i是第l+1层的节点,j第l层第j个结点
最终推导出来的代价函数的偏导数如下
前向传播中,如下例子,求第三层的第1个激活值的时候,需要求出其参数项z的表达,根据之前定义,这个时候就是第二层的每个神经元(包括偏置神经元)分别乘上其对连接到第三层第二个神经元对应的权重,重复该过程,最终实现前向传播
反向传播与前向传播类似,只是方向不同
如下第二层第二个节点的误差进行计算,只需要与其相连的权重乘上后一层的对应连接的节点的误差即可,如下
这里主要是对神经网络中的权重θ进行初始化,对于θ首先初始化为0,在神经网络中是起不到任何作用的,如下
当权重初始化为0的时候,每个神经元对应的路径的权重都是相同的,那么以为这,在求下一层的激活值的时候,如下,a(2)1以及a(2)2他们的输入都是一样的,这意味着,后续随着样品不断输入,但是隐藏层中的多个神经元干着同一样事情,产生了冗余
上述的问题有时候别称为对称权重问题
解决上述问题需要随机初始化,如下随机初始化θ的值在[-ε,ε]之间,使得权重是一个接近0的数值