我们学习了线性回归、logistic,为什么还要学习神经网络。
我们用几个例子作为例子。
注意:如果没有学习神经网络之前的知识,如线性回归、logistic(我前面发的笔记),会比较难食用这篇文章。
例子一
假设有一个监督学习分类问题,我们可以利用一个包含很多非线性项的logistic回归来解决问题:
决策边界就会画出来:
这是只有x1和x2两个特征得到的不错的效果,因为把x1和x2的所有组合都包含到多项式中。
但有趣的机器学习问题,大多都不止只有两个特征,就像我们之前讨论过的预测房价问题:
假设我们现在讨论的是关于住房分类问题半年内能否被卖出去,而不是回归问题。我们可想象出上百个特征进行分类,用这100个特征套入二项式,个数大约就是(n2)/2个,也就是5000个左右(排列组合+100),复杂度是o(n2)
因此要包含所有的二次项,也不是个好办法,而且由于项数过多,最后的结果很有可能是过拟合的,运算量也高。
当然,我们也可以直接拟合x12、x22这些项,这样可以大量减少二次项的个数。不过只拟合这些项,最终会导致拟合出来的效果会过于光滑,例如拟合出椭圆,效果会不好。
二次项已经很多数据了,如果是三次项,那复杂度就变成了o(n3)了,跑起来就会十分慢。
例子二
关于计算机视觉中的一个问题,如果我们使用一个机器学习的方法来训练一个分类器来检测图像来判断该图像是否为一辆车。很多人不懂计算机视觉为什么难,因为我们对这东西是不是车根本就一目了然。这是因为计算机看到的图像,是一堆的数据。
我们那车的把手做例子,我们看到的是把手,计算机看到的是数据:
因此,我们需要做的是,先做好两个样本集,一个样本集里是车,一个样本集里不是车。
然后,我们在车里选择两个像素点,作为这是车的特征:
并在坐标系中表示出来哪些是车、哪些不是车:
最后结果是这样的:
然后,我们需要做个非线性假设,来尽量分开这两类样本,就可以开开心心的进行预测了。
理想是美好的,但现实是残酷的。
因为一张很小的图片,也是50*50像素的图片,也就是2500个像素点,因此特征向量里的元素数量有2500个,每一个代表一个对应的像素点的值。如果这是rgb的图,那像素点就变成7500个了。
所以,如果我们使用全部的像素点进行二项式的非线性假设,那起码有3百万个特征(xi*xj),跑起来会特别的慢。
因此,我们需要学习神经网络。
神经网络背景
神经网络本来是用于模仿大脑的,但现在就用来解决机器学习各种问题。
在20世纪80、90年代,神经网络也极为兴起,后面逐渐没落。近几年又开始兴起,是因为现在的计算机的性能足以运行大规模数据的神经网络。而神经网络对于很多应用来说是最先进的技术。
略。哈哈哈
神经网络模型
单神经元
说到神经网络,我们不得不说一下神经细胞。好了,我们先来回顾一下生物知识:
高中知识告诉我们,神经细胞的结构包括:树突、细胞体、轴突三个部分。而树突用于输入信息,细胞体用于处理信息,轴突用于输出信息。
回到神经网络上,我们可以用一个很容易的模型在电脑实现人工神经网络,模拟神经网络的工作。
上图代表了单个的神经元,我们把黄色圈圈当作是细胞体,用来处理接收到的信息。而把我们的输入线当作是树突,给细胞体传递信息。然后细胞体做完运算后,通过它的输出通道把信息传出去。
而我们的假设函数h就是我们的logistic回归函数:
通常x和θ是我们的参数向量,像如下:
通常绘制一个神经网络时,只绘制输入节点x1、x2、x3,有必要的时候,我们会增加一个额外的节点x0。x0通常也被称作偏置单元(bias unit)或偏置神经元(bias neuron),但因为x0总是等于1,所以可画可不画,看具体需求进行分析。
在神经网络术语中,我们会说这是一个带有sigmoid或者logistic激活函数的人工神经元。
在神经网络术语中,激活函数是指非线性函数g(z):
而θ是参数,不过在神经网络文献中,称之为模型的权重。
神经网络解析
而我们的神经网络其实就是一组神经元连接在一起的集合,就像如下:
输入单元为x1、x2、x3,当然有时会加上x0。
然后我们有三个神经元:a(2)_1、a(2)_2、a(2)_3,我们一样可以增加一个a(2)_0作为一个额外的偏置单元,值永远是1。
最后一层有第三个节点,正是这第三个节点输出假设函数h的结果。
第一层也被称为输入层,因为在这一层有我们的输入特征。
最后一层也被称为输出层,因为这一层的神经元代表假设的最终计算结果。
而中间的第二层被称作隐藏层,因为作为用户会不知道里面的处理过程(封装原理吗哈哈哈)。如果不是输入层和输出层,那都是隐藏层。
然后我们来看看记号:
a(j)_i:意思就是第j层的第i个神经元(或单元)的激活项,例如:
a(2)_1就代表第2层的第1个激活项,而激活项的意思就是由一个具体神经元计算并输出的值。
θj:就是权重矩阵,它控制从每一层到另一层的权重,比如第一层到第二层的映射。
然后,我们把神经网络矩阵化,得到以下公式:
我们用第一个进行分析
a(2)_1等于sigmoid激活函数作用在这种输入的线性组合上的结果:
同理,a(2)_2、a(2)_3不作解释。
而我们的θ(1)就是控制着从三个输入单元到三个隐藏单元的映射的参数矩阵。θ(1)就是一个3*4矩阵
而更一般地,如果一个网络在第j层有s_j个单元,在j+1层有s_(j+1)个单元,那么矩阵θ(j)即控制第j层到第j+1层映射的矩阵,它的大小是s_(j+1)*(s_j+1)
最后,我们的假设函数等于a(3)_1。
神经网络向量化
现在我们学习一下如何用神经网络进行大量运算。
以上面所说的神经网络图为例:
我们通过这些方程计算出三个隐藏单元的激活值,然后利用这些值来计算最终输出的假设函数h。
接下来,我将定义一些额外的项,我们把下面的参数定义成z(2)_1:
因此,a1变成如下式子:
同理得出:
然后我们重新看看公式整体:
这里看起来就像是
因此,我们能够将神经网络的计算向量化了。
具体而言,我们定义特征向量x:
然后定义z(2)为这些z值组成的向量:
值得注意的是向量z(2)是一个三维向量。
而a(2)_1、a(2)_2、a(2)_3的计算,我们只用两个步骤。先计算z(2)等于θ(1)*x,然后计算a(2)等于g(z(2)):
注意我们的向量a(2)也是一个三维向量。
这里的激活项g用的是sigmoid函数,逐个元素地作用于z(2)中的每个元素。
小技巧:我们可以把输入特征x的符号变成a(1),方便计算机编码操作。我们的z(2)就等于θ(1)*a(1)了。
现在我们在a(2)加上一个偏置单元:
使a(2)变成四位向量,再按照和前面一样的计算公式,求出a(3),也就是假设函数h。
这个求出假设函数h的过程,也叫前向传播
我们重新看看图:
这样看其实就是logistic回归,只是输入值是a(2),而不是一开始输入的x。
现在我们大致理解了神经网络前向传播的使用了,但我们还不知道隐藏层每个激活项代表着什么,θ值又怎么得出。
我们先带着第一个问题接着看下去,我们用例子来进行解释,为什么神经网络能用于学习复杂的非线性假设模型。
神经网络例子
我们要做的是,学习一个非线性的判断边界,判断x1是否同或x2。
x代表同或,o代表非同或:
我们先从拟合and运算的神经网络入手。
and运算
我们知道and运算就是,当x1、x2等于1的时候,逻辑才算真。
x1,x2只能取0或1,
目标函数y=x1 and x2,
我们加个偏置单元x0=1,然后设θ(1)_10=-30,θ(1)_11=20,θ(1)_12=20:
得出假设函数:
我们画出logistic激活函数图:
再写出x1、x2不同取值时的假设函数结果:
我们在看看or运算。
or运算
我们知道or运算就是,当x1、x2不等于0的时候,逻辑算真。
因此,我们加个偏置单元x0=1,然后设θ(1)_10=-10,θ(1)_11=20,θ(1)_12=20,就能得出想要的结果:
我们再来看一个非运算.
非运算
非运算就是设y=1,x1=1,则h=0,x1=0,则h=1。
我们加个偏置单元x0=1,然后设θ(1)_10=10,θ(1)_11=-20,就能得出想要的结果:
同或运算
现在我来看回一开始的同或运算,同或运算其实就是与运算、或运算和非运算的结合体。
而我们知道,同或运算的公式是:x0 nor x1 = (x0 and x1) or ((not x) and (not y))
我们先设好每一个小规模神经网络的θ值:
我们的任务是,把它们三个组合在一起,形成一个同或运算的神经网络。
我们先用与运算和非运算的神经网络得出两个再隐藏层的神经元a(2)_1、a(2)_2。
我们再加一个偏置神经元a(2)_0=1,把或运算的神经网络搞下来:
真值表得出结果如下:
有没有一种旷然大悟的感觉。原来隐藏层的含义就是用来计算一些关于输入的略微复杂的功能,然后增加一层再用于计算一个更加复杂的非线性函数。这就是为什么神经网络能计算复杂的函数。
神经网络-多元分类
其实神经网络的多元分类,也就只是在最后的输出层从一个神经元变成多个神经元而已。
例如,我们现在要做一个分辨行人、汽车、摩托车、货车的神经网络。
我们需要做的就是建立一个有四个输出单元的神经网络:
而我们的假设函数h将是一个含4个数的向量。所以也就是输出从一个数变成了一个四维的向量。
当图像是行人时,这个网络就会输出:
当图像是汽车时,这个网络就会输出:
当图像是摩托时,这个网络就会输出:
在神经网络中,我们训练集也有所改变:
看起来好像没什么不同,不过y发生了改变。y变成了向量:
下一节,我们再聊如何使用我们的训练集、以及如何进行训练。