1.前言
前面我们讨论了线性回归、逻辑回归,当我们遇到更为复杂的分类问题时,是否有其他的选择?
举个例子,多项式回归如下所示:
得到非线性分类器:
当然这里不再是预测房价(回归问题),而是预测是否能售出(分类问题)。如果有100个独立特征,
我们任取两个特征值作为组合特征时,大约可以得到5000个特征;任选三个作为组合特征时,大约有170000个特征。
同理,再举一个例子,汽车检测问题。给出一幅图像,我们可以很快判断这是辆汽车,但是在计算机眼里,这只是包含像素数据的矩阵。
所以我们要提供很多样例作为训练集,给出一堆汽车图像和一堆非汽车图像。
训练一个用于汽车检测的分类器,去判断一幅图像是否是汽车。
一个解决方法是从每辆汽车上选择两个像素点作为样本的特征,通过学习算法训练分类器:
汽车或者非汽车的训练样本在图形中的表示:
增加样本,简化之后如下图:
我们假设每幅图像有50*50=2500个像素,那么我们就有2500个像素点可供选择,对于二次项组合,大约有3百万个特征组合。
那么对于有大量特征的分类问题,除了逻辑回归,还有其他的学习算法吗?我们接下来引入神经网络。
2.神经元和大脑
神经网络:
起源于机器模仿大脑的算法;
80,90年代非常流行,后期逐渐衰弱;
最近又开始流行。
我们的大脑有一套自己的学习算法,无论给它输入什么类型的数据,它都能找到学习此类数据的方法并处理。所以,我们如果能找到大脑的学习算法是什么,并执行,就能建立一台AI机器。这套学习算法就是神经网络算法。
3.模型表示
神经网络的目标就是模拟大脑中的神经元或网络,我们先看一下神经元。
dendrite是树突,是输入(input wires);axon是轴突,是输出(output wires)。
我们模拟大脑构造一个简单的模型:
在这里,x1,x2,x3被称为输入(来自于其他神经元的输入信号),x0是偏置单元,θ是权重,hθ(x)是**函数。这里的**函数是:
把多个神经元放在一起,就有了神经网络(多级结构),下图是三层结构的神经网络(每一层增加一个偏差单位):
第一层是输入层,我们把原始数据输入给它们;
第二层是隐藏层,中间单元,负责将数据进行处理,呈递给下一层;
第三层是输出层,负责计算hθ(x)。
:j层第i个单元的**函数;
:从第j层映射到j+1层的控制函数的权重矩阵。
对上面的神经网络,中间单元和输出的公式如下:
如果神经网络在第j层有Sj个单元,第j+1层有Sj+1个单元,权重矩阵θ(j)的维度是Sj+1 * Sj。
上面进行的讨论只是将特征矩阵的一行(一个训练实例)喂给神经网络,我们需要将整个训练集都喂给神经网络算法来学习模型。这个神经网络,只在训练过程中会有反馈信号,而在分类过程中数据只能向前传送,直到到达传输层,层间没有向后的反馈信号,因此被称为前馈网络。
其实我们给出的神经网络的模型表示不够简洁,所以可以利用向量化化简。以上面神经网络为例,计算第二层的值:
这只是针对一个训练实例进行的计算,如果对整个训练集进行计算,需要将训练集特征矩阵进行转置,使得同一个实例的特征都在同一列。
为了更好的理解神经网络的工作原理,我们先把左半部分遮住:
右半部分其实就是以a1,a2,a3按照逻辑回归的方式输出hθ(x),如上图右边的式子。
其实神经网络就是逻辑回归,只不过我们把逻辑回归的输入向量[x1~x3]变成了中间层[a1~a3]。即
我们可以把a0,a1,a2,a3看做是更高级的特征值,也就是x0,x1,x2,x3的进化体,并且它们由x来决定,因为是梯度下降,所以a是变化的,并且变化越来越厉害,所以这些更高级的特征值远比仅仅将x次方厉害,也能更好的预测新数据,这也是神经网络相比较于线性回归和逻辑回归的优势。
4.举例和直观解释
从本质上说,神经网络可以通过学习得出自身的一系列特征。在普通的逻辑回归中,我们被限制为使用数据的原始特征x1,x2,x3,......,xn,虽然可以使用二项式项来组合这些特征,但是我们仍然被原始特征限制。在神经网络中,原始特征知识输入层,在上面的例子中,第三层做出的预测利用的是第二层的特征,而非输入层的原始特征,我们可以认为第二层中的特征是神经网络通过学习后自己得出的一系列用于预测输出变量的新特征。
神经网络中,单层神经元的计算可以用来表示逻辑运算。
举例说明:
与运算,其基本的表达式如下:
我们用下面这个神经元表示与逻辑运算:
**函数的表达式:
画出**函数的图形,并将二值变量x1,x2的值代入,得到对应表,可以看出运算结果近似于与运算。
同理,我们也给出或运算的模拟。整体一样,区别只在于取值不同。
我们用神经元组成更复杂的神经网络实现更复杂的运算。比如说实现XNOR功能,XNOR=(X1 AND X2) OR ( (NOT X1) AND (NOT X2))。
首先构造一个能表达(NOT X1)AND(NOT X2)的神经元:
然后将表示AND的神经元,表示OR的神经元以及表示(NOT X1)AND(NOT X2)的神经元组合在一起。
上面即实现XNOR运算符功能的神经网络。
5.多类分类
当我们有不止两种分类时,比如以下的情况,该怎么办?如果我们要训练一个神经网络算法识别路人,汽车,摩托车和卡车,在输出层我们应该有四个输出值。例如第一个值用0或1判断是否是行人,第二个值判断是否为汽车。
输入向量x有三个维度,两个中间层,输出层4个神经元分别用来表示4类。也就是说,每一个数据在输出层都会出现[a,b,c,d]T,而且a,b,c,d仅有一个为1 ,表示当前类。
下面是神经网络的可能结构:
神经网络算法的输出结果为四种情形之一: