神经网络
前面的博客我们讨论了分类问题的时候用的是逻辑回归,那么为什么能用逻辑回归了还要研究神经网络?
首先,我们回想一下,我们用逻辑回归对于一个非线性的分类问题是不是要构造一个有很多个多项式项和高阶项的
分类边界?
如果这个样本有很多个特征怎么办?是不是多项式项和高阶项就会难以想象的多?
再次,如果我们用所有的多项式和高阶项拟合决策边界是不是会过拟合?要是人为删掉一些是不是会欠拟合?
带着这几个问题我们进入神经网络~~~
研究表明,大脑神经网络的机制如果把听觉的神经重接到视觉神经皮层,那么视觉皮层也能学会听,也就是
说只要有不同感官的神经元输入大脑,无论输入到哪一个皮层,大脑都会学会处理相应的数据,大家可以去
看神经重接实验,那么我们能不能找到一种算法来模拟大脑的这种行为?即不管你把任何数据传入大脑中,
大脑的学习算法就能找出学习数据的方法,并处理这些数据。
首先,我们看一下大脑的神经元~~~
一是神经元有像这样的细胞体,二是神经元有一定数量的输入神经,这些输入神经叫做树突,可以把它们想象成
输入电线,它们接收来自其他神经元的信息,神经元的输出神经叫做轴突,这些输出神经是用来给其他神经元传递
信号或者传送信息的。
神经元是一个计算单元,它从输入神经接收一定数目的信息,并做一些计算。然后将结果通过它的轴突传送到其他
节点,或者大脑中的其他神经元。
神经元想要传递一个消息他就会通过它的轴突发送一段微弱的电流给其他神经元这就是树突。接下来这个神经元接
受到这条信息,做一些计算,他有可能会反过来将在轴突上的自己的信息传给其他神经元,这就是所有人类思考的
模型:我们的神经元把自己收到的信息进行计算并向其他神经元传递消息,顺便说一下,这也是我们的感觉和肌肉
运转的原理,如果你想活动一块肌肉,就会触发一个神经元给你的肌肉发送脉冲,并引起你的肌肉收缩。如果一些
感官,比如说眼睛想要给大脑传递一个信息,那么他就想这样发送电脉冲给大脑。
描述一个神经元:
在我们实现的人工神经网络里,如上图,我们将使用非常简单的模型来模拟神经元的工作,我们将神经元模拟成一
个逻辑单元,上图的黄色圆圈,我们把它想象成作用类似于神经元的东西,然后我们通过它的树突或者说它的输入
神经传递给它一些信息,然后神经元做一些计算,并通过它的输出神经,也就是它的轴突,输出计算结果。
当我们画一个神经网络时,通常我们只会画输入节点 x1,x2,x3,但有时也会增加一个额外地节点 x0。这个 x0 节点
有时也被称为偏置单位[bias],或者偏置神经元,但是因为 x0 总是等于 1,所以有时候我们会把它画出来,有时候
不会把它画出来,这取决于它是否对例子有利。
激活函数:
就是对上一个神经元传过来的信息进行计算的函数。有时候,一个 s 型函数或者逻辑函数作为激活函数的人工神经
元。在神经网络术语中,激活函数就是对类似非线性的逻辑回归中的sigmoid函数g(z)的另一个术语称呼。
从线性回归和逻辑回归,我们一直用 θ 作为模型的参数,而在很多神经网络的文献中,我们经常会看到人们谈论一
个模型的权重 W,其实权重和模型的参数是同一个事物。
描述一个神经网络:
神经网络就是多个不同的神经元的组合。
比如,这里是我们的输入 x1,x2 和 x3,有时也可以画上额外的 x0 节点。第二层有3个神经元,分别a(2)1, a(2)2,
a(2)3,我们也可以在这一层添加一个a0,它的值永远是1。最后,我们在最后一层有三个节点(加偏置的话四个
节点),正是这三个节点输出了假设函数h(x)计算的结果。
关于神经网络的术语,网络中的第一层,也被称为输入层,因为我们在这一层,输入我们的特征项x1, x2, x3。最
后一层叫做输出层,因为这一层的神经元输出假设的最终计算结果。中间的这第二层,也被称作隐藏层,隐藏层不
是一个很合适的术语,但是直觉上我们知道,在监督学习中,你能看到输入也能看到输出,而隐藏层的值我们在训
练集中是看不到的,它的值不是 x 也不是 y,所以我们叫它隐藏层,后面我们会看到神经网络,可以有不止一个的
隐藏层,但在上图中中,我们有一个输入层,也就是第一层。一个隐藏层,也就是第二层,以及一个输出层,也就
是第三层。但实际上,任何非输入层或非输出层的层,就被称为隐藏层。
如何计算我们的神经网络?
前向传播:
我们使用a上标(j)下标i 表示第 j 层的第i个神经元或单元。具体来说,这里 a上标(2)下标1,表示第2层的第一个激活
单元,即隐藏层的第一个激活单元。所谓的激活是指,有一个具体的神经元读入,计算并输出的值,此外,我们的
神经网络被一些矩阵化的参数 θ 控制。比如,从第一层到第二层,由一个参数矩阵控制,第二层到第三层也有一个
参数矩阵控制,而这个矩阵的上标 j 表示的就是它控制的是第 j 层到第 j+1 层。
比如,第一个隐藏单元,计算它的值的:a(2) 1等于 sigmoid函数或者说logistic函数,作用在这种输入的线性组合上
的结果。第二个隐藏单元,等于sigmoid函数作用在这个线性组合上的值。同样,对于第三个隐藏单元,它是通过这
个公式计算的。
这样一来,参数矩阵控制了我们来自三个输入单元三个隐藏单元的映射,因此θ1的维数将变成3,θ1将变成一个3*4
的矩阵(有一个偏置)。
如果一个网络在第 j 层有 sj 个单元,在 j+1 层有 s j+1 个单元,那么矩阵 θj 也就是控制第 j 层到 j+1 层映射的矩阵的
维度将是s j+1 乘以 sj +1。第一维表示的是 j+1 层有多少个神经元,而第二维表达是第 j 层有多少个神经元,同时额
外的+1是因为我们会有偏置项。
以上,我们讨论了三个隐藏单元是怎么计算它们的值。最后,在输出层,我们还有一个单元,它计算h(x),这个也可
以写成a(3) 1,计算原理同上。
注意到,我这里写了个上标2,因为 θ 上标 2 是参数矩阵或者说是权重矩阵,该矩阵控制从第二层即隐藏层的3个单元
到第三层的一个单元,即输出单元的映射。
这个神经网络定义了函数h(θ)x:从输入 x 到输出 y 的映射,我们将这些假设的参数记为大写的 θ,这样一来,不同的
θ 对应了不同的假设,所以我们可以得到很多不同的假设函数。这就是神经网络的基本的逻辑。
以这个神经网络为例,以前我们说,计算出假设函数输出的步骤,是上图左侧的这些方程。通过这些方程,我们计算
出三个隐藏单元的激活值,然后利用这些值来计算假设函数h(x)的最终输出。接下来,我们要定义一些额外的项以更
加简化地描述我们的问题。
上图,我划的蓝色直线,把它定义为 z 上标(2)下标1,那么a(2) 1就等于g(z(2), 1)[如上图]。所有上标 2 的意思是,它
们与第二层相关。[红色直线],我们定义为z(2) 2。[粉色直线],我们把它定义为z(2) 3,这样我们有a(2) 3等于g(z(2), 3)
[下方粉色]。
那么,z 值实际上都是线性组合,是输入值x0, x1, x2, x3的加权线性组合。它将会进入一个特定的神经元。然后再用
sigmoid函数求该点激活值。
计算h(θ)x的过程,就叫做前向传播。我们从输入层开始,然后进行前向传播给隐藏层并计算隐藏层的激活值,然后我
们继续向前传播,并计算输出层的激活。这个从输入层到隐藏层再到输出层一次计算激活的过程叫做前向传播。
如果我们只看最后的这几部分,其实就是一个逻辑回归的结构。不同就是我们的 a1 a2 a3 是通过前向传播计算来的,
而不是真是的特征 x1 x2 x3 。所以我们从一开始选择不同的参数 θ 前向传播就会产生很多不一样的复杂特征。从而得
到一个复杂的非线性假设函数。
如何构建并计算关于输入的复杂的非线性函数?
通过讲解一个具体的例子来解释,神经网络是如何计算关于输入的复杂的非线性函数。通过这个例子可以让大家理解
为什么神经网络可以用来学习复杂的非线性假设函数。
考虑下面的问题。我们有二进制的输入特征x1, x2。它们的取值,要么是0,要么是1 。
在这个例子中,左侧画出来两个正样本和两个负样本,但可以被认为是一个更复杂的学习问题的简化版本。[右侧图]在
这个复杂问题中,我们可能在右上角和左下角有一堆正样本,在左上方和右下方有一堆用圆圈表示的负样本。我们想要
学习一种非线性的决策边界来区分正负样本。上图右
神经网络是如何做到的呢?为了描述方便,我们不用右边这个例子,我们用左边这个例子,这样更容易说明。具体来说,
这里需要计算的是,目标函数 y 等于 x1 异或 x2,或者 y 也可以等于x1 异或非 x2,一种异或非表示X1异或x2后取反。
x1 异或 x2 为真,当且仅当这两个值有且仅有一个为1 。 如果我用XNOR作为例子,比用NOT作为例子结果会好一些,
但这两个其实是相同的,这就意味着x1异或x2后再取反 即当它们同时为真 或者同时为假的时候,我们将获得 y=1 。 如
果它们中仅有一个为真,y=0 。
这时候,是否能找到一个神经网络模型来拟合这种训练集?
拆分,
为了建立能拟合异或非运算的神经网络,我们建立能够拟合“且”运算的神经网络。
再建立或运算的神经网络模型:
逻辑非的神经网络模型:
总体思路是,在你希望取非运算的变量前面,放一个绝对值大的负数作为权值,因此如果放一个 - 20,那么和x1相
乘,很显然,最终结果就得到了对 x1 进行非运算的效果。
这时候,
构建这个问题的神经网络:
把前面我们讨论的三部分内容放在一起,”x1,x2”的逻辑与运算,上面的 (非x1)与(非x2) 网络,以及x1,x2的或运算,
把这三个网络放在一起,我们就能计算异或非运算了。
首先,我们需要一个计算逻辑与的单元,我们称之为a(2) 1[图中红色网络],然后我们再把第二个网络复制过来。第二层
网络的输出。[计算右侧真值表中间两列]。
这里,我们知道我们还需要一个逻辑或运算得到我们最终的结果,于是我们在输出层使用表达逻辑或的小网络。这样,
我们就可以得到异或非的逻辑运算了。
通过观察这个网络,我们可以得到更加通用的理解,那就是,在输入层中,我们只有原始输入值,然后我们建立一个隐
藏层,用来计算稍微复杂一些的关于输入数据的函数,比如我们这里的a(2) 1,a(2) 2等。然后,通过添加另一个层,我
们得到了更复杂一点的函数。
这就是关于神经网络可以计算较复杂函数的一种直观理解。
我们知道,当层数很多的时候,我们有一个相对简单的关于输入数据的函数作为第二层,而第三层可以建立在此基础上,
并计算更加复杂一些的函数,然后再下一层,又可以计算再复杂一些的函数。
神经网络做多分类: