文章目录
8.1 非线性假设
-
神经网络的出现 解决了什么问题?
我们之前学的,无论是线性回归还是逻辑回归都有这样一个缺点,即:当特征太多时,计算的负荷会非常大。
-
例子1:
-
当我们使用, 的多次项式进行预测时,我们可以应用的很好。
-
之前我们已经看到过,使用非线性的多项式项,能够帮助我们建立更好的分类模型。
-
但假设我们有非常多的特征,例如大于100个变量,我们希望用这100个特征来构建一个非线性的多项式模型,结果将是数量非常惊人的特征组合,即便我们只采用两两特征的组合,我们也会有接近5000个组合而成的特征。这对于一般的逻辑回归来说需要计算的特征太多了。
-
-
例子2:
- 计算机怎么看?
- 计算机看到的是这样一个矩阵,表示像素强度值的网格,告诉我们图像中每个像素的亮度值。
- 计算机的任务就是根据这个像素矩阵来告诉我们这里表示的是一个车门把手。
- 我们怎么训练出汽车分类识别器?
- 两类样本,一类cars,一类non-cars,训练出一个分类器。
- 这些特征的维数是多少?
- 假设50*50的,若灰度值下,那么一共有2500个像素点。
- 若RGB彩色图像,那么一共有7500个像素点。
- 若采用non-liner的话,仅仅考虑选择二次项,2500个像素点就有大约300W个特征,这太离谱了!
- 所以,当特征数量太多的时候,非线性假设就不适合了,因为计算量大的离谱。
- 在下面几节中,我们将介绍神经网络算法,即使在帖子
8.2 神经元与大脑
8.2.1 历史介绍
-
神经网络是一种很古老的算法,它最初产生的目的是制造能模拟大脑的机器。
-
神经网络逐渐兴起于八九十年代,应用得非常广泛。但由于各种原因,在90年代的后期应用减少了。
但是最近,神经网络又东山再起了。其中一个原因是:神经网络是计算量有些偏大的算法。然而大概由于近些年计算机的运行速度变快,才足以真正运行起大规模的神经网络。
-
大脑能处理各种各样的事情,软件实现的话似乎需要千个万个程序替代。但实际上,大脑处理的方法,只需要一个单一的学习算法就可以了
8.2.2 神经元的原理
-
例子描述:
- 左边这是听觉皮层,正是因为你耳朵将听到的东西传给听觉皮层(Auditory Cortex)才能听懂我的话。
- 现在我们将耳朵和听觉皮层的链接切断,将眼睛与听觉皮层链接,即:眼睛的视觉神经信号最终将传到听觉皮层。
- 神奇的事情发生了,听觉皮层将会理解“看”,他们可以正常看并理解。
- 将听觉皮层(Auditory Cortex)换成触觉皮层(Somatosensory Cortex)也能完成,即:也能正常看。
-
例子解析:
- 这被称为神经重接实验。
- 从这个意义上说,如果人体有同一块脑组织可以处理光、声或触觉信号,那么也许存在一种学习算法,可以同时处理视觉、听觉和触觉,而不是需要运行上千个不同的程序,或者上千个不同的算法来做这些大脑所完成的成千上万的美好事情。
- 也许我们需要做的就是找出一些近似的或实际的大脑学习算法,然后实现它大脑通过自学掌握如何处理这些不同类型的数据。
- 在很大的程度上,可以猜想如果我们把几乎任何一种传感器接入到大脑的几乎任何一个部位的话,大脑就会学会处理它。
-
其他例子:
8.3 模型表示 I
8.3.1 大脑中的神经网络
-
分析单个神经元:
- 每一个神经元都可以被认为是一个处理单元/神经核(processing unit/Nucleus),
- 它含有 许多 输入/树突(input/Dendrite),
- 并且有 一个 输出/轴突(output/Axon)。
- 神经网络是大量神经元相互链接并通过电脉冲来交流的一个网络。
-
分析多个神经元:
- 神经元利用微弱的电流进行沟通。神经元想要传递一个消息,它就会就通过它的轴突,发送一段微弱电流给其他神经元的某个树突。 接下来这个神经元接收这条消息,做一些计算,再传给其他神经元。
- 单个神经元通过 树突接收消息,通过轴突发送消息。
- 多个神经元之间的复杂联系就形成了一个神经网络。
- 这就是所有人类思考的模型:我们的神经元把自己的收到的消息进行计算,并向其他神经元传递消息。
如果你想活动一块肌肉,就会触发一个神经元给你的肌肉发送脉冲,并引起你的肌肉收缩。
如果一些感官(比如说眼睛)想要给大脑传递一个消息,那么它就像这样发送电脉冲给大脑的。
-
下面我们将介绍一些神经网络模型 来模拟神经元在大脑中的工作。
8.3.2 神经网络模型
-
先介绍单个神经元模型:
一个十分简单的模型来模拟神经元的工作,我们将神经元模拟成一个逻辑单元(Logistic Unit)
-
黄圈:可以类似于 神经元细胞体的东西。
-
两类箭头:输入通道input wires,输出通道output wires。
-
输入:可以看做是一个 向量
-
输出:是
-
**一般 向量 从 开始编号,有时候也会从 开始编号,**这取决于加上 是否让表示更加方便
-
被称为 偏置单元(bias unit)或者 偏置神经元(bias neuron)
-
一些术语(terminology)
-
这是一个带有sigmoid(或logistic)**函数(activation function)的人工神经元。
-
这个例子中的**函指的就是
-
是模型的参数(parameters),在神经网络里, 被称为 权重(weights)。
-
-
-
再介绍神经网络 —— 多个神经元模型连接在一起
-
神经网络模型是许多逻辑单元按照不同层级组织起来的网络,每一层的输出变量都是下一层的输入变量。
-
下图为一个3层的神经网络,我们可以将每一层的bias unit 加上:
-
第一层称为输入层(Input Layer),最后一层称为输出层(Output Layer),中间一层称为隐藏层(Hidden Layers)。当层数超过3时,除了第一层和最后一层,其他称为:隐藏层 or 中间层。
-
-
三层神经网络模型的数学推导:
- 对于上图所示的模型,**单元和输出分别表达为:
-
我们把这样从左到右的算法称为: 前向传播算法( forward propagation)
-
此外,上面进行的讨论中只是将特征矩阵中的一行(一个训练实例)喂给了神经网络,我们需要将整个训练集都喂给我们的神经网络算法来学习模型。
8.4 模型表示 II
8.4.1 目标:
- 如何高效进行计算,并展示一个向量化的实现方法。
- 明白为什么要这么表示神经网络,在学习复杂的非线性假设函数中的作用。
8.4.2 计算推导
-
我们在上一节的基础上,定义一些额外的量:
将 = ,括号中的表达式 用 来表示,同理得出 , 。
此外,我们发现,这个灰色框框很像:矩阵向量乘法: ,根据这一点,我们可以将神经网络的计算向量化。
- 计算过程如下:
我们令 ,则 ,计算后添加 。 计算输出的值为:
我们令 ,则 。 这只是针对训练集中一个训练实例所进行的计算。如果我们要对整个训练集进行计算,我们需要将训练集特征矩阵进行转置,使得同一个实例的特征都在同一列里。即: ${{z}^{\left( 2 \right)}}={{\Theta }^{\left( 1 \right)}}\times {{X}^{T}} $
-
的上下标三个数字依次表示:第几层,这一层中的第几个,从0到上一层个数+1
-
这这个算法的过程被称为:前向传播(forward propagate),因为我们是从输入单元的**项开始,然后前向传播给隐藏层,计算隐藏层的**项,然后我们继续前向传播,计算输出层的**项。
-
这个依次计算**项,从输入层到隐藏层再到输出层的过程,叫前项传播。
-
我们刚才做的是这一过程的,向量化实现方法。
8.4.3 神经网络与逻辑回归
-
这种前向传播的方法也可以帮助我们理解神经网络的作用,帮助我们学习有趣的非线性假设函数。
为了更好了了解Neuron Networks的工作原理,我们先把左半部分遮住:
右半部分其实就是以, 按照Logistic Regression的方式输出:
-
其实神经网络就像是logistic regression,只不过我们把logistic regression中的输入向量 变成了中间层的
-
即:
-
我们可以把看成更为高级的特征值,也就是的进化体,并且它们是由 与决定的。
-
因为是梯度下降的,所以是变化的,并且变得越来越厉害,所以这些更高级的特征值远比仅仅将 次方厉害,也能更好的预测新数据。 这就是神经网络相比于逻辑回归和线性回归的优势。
-
-
现在描述的这个例子是比较高级的算法,如果现在不能理解的话,可以继续看下面两节的内容,我们会举一些更具体的例子来帮助理解神经网络如何利用隐藏层计算更复杂的特征,并输入到最后的输出层。以及为什么这样就可以学习更加复杂的假设函数。
8.4.4 其他神经网络架构
- 当然我们还可以用其他图像来表示神经网络,如下图。
- 神经网络中神经元的连接方式被称作 神经网络的架构。
8.5 例子与直觉理解
8.5.1 目标:用神经网络表示逻辑运算等
-
左边我只画了两个正样本,两个负样本。是右边的简化版本,但是用左边更能说明问题。
其中 表示 异或, 和 表示对 取反。
8.5.2
-
为了能够建立运行 运算的神经网络,我们先从一个比较简单的,能拟合 运算的神经网络入手:
起初是这样的:
然后我们加上这个偏置单元,+1 单元, 现在对权重(参数)进行赋值,然后得到
我们画出 的草图,发现:当 = 4.6 时, 0.99 ,当 时,
- 下面再来看看
- 和
8.5.3
- 三合一:
- 所以这个神经网络有一个输入层,一个中间层,一个输出层,最后会得到一个非线性的决策边界,用来计算 逻辑函数。
- 中间层计算关于输入的一些略微复杂的功能,然后再继续添加一层(输出层),用于计算一个更复杂的非线性函数。
- 这就是为什么神经网络能计算如此复杂的函数。当有很多层的时候,第二层计算有些复杂的函数,第三层计算更复杂的函数,然后再往后,计算的函数越来越复杂。如下图:
-
按这种方法我们可以逐渐构造出越来越复杂的函数,也能得到更加厉害的特征值。
这就是神经网络的厉害之处。
8.6 多元分类
- 当我们有不止两种分类时(也就是),比如以下这种情况,该怎么办?
- 如果我们要训练一个神经网络算法来识别路人、汽车、摩托车和卡车,在输出层我们应该有4个值,即:需要4个逻辑回归分类器。
- 例如,第一个值为1或0用于预测是否是行人,第二个值用于判断是否为汽车。
- 输入向量有三个维度,两个中间层,输出层4个神经元分别用来表示4类,也就是每一个数据在输出层都会出现,且中仅有一个为1,表示当前类。下面是该神经网络的可能结构示例:
- 具体来讲:
- 之前我们的 都是实数,现在是 向量 。
- 训练集中每一组数据 中的 表示 输入的图片, 表示向量中的一个。
- 最后输出的 也是一个四维向量,它的值 十分接近于某一个