该系列文章为, 观看 "吴恩达机器学习" 系列视频的学习笔记. 虽然每个视频都很简单, 但不得不说每一句都非常的简洁扼要, 浅显易懂. 非常适合我这样的小白入门.
本章含盖
9.1 非线性假设
9.2 神经元与大脑
9.3 模型展示 Ⅰ
9.4 模型展示 Ⅱ
9.5 例子与直觉理解 Ⅰ
9.6 例子与直觉理解 Ⅱ
9.7 多元分类
9.1 非线性假设
例 1: 假如有一个监督学习分类问题:
如果只有 2 个特征的话, 这么做还能比较好的拟合
因此, 在特征很多的情况下, 即时只考虑二次项, 当 n = 100 时, 最终也有 5000 个项. 而且渐渐的二次项的个数大约以 n^2 的量级增长. 其中, n 是原始特征的个数. 事实上, 二次项的个数大约是(n^2)/2.
因此要包含所有的二次项, 似乎并不是一个好方法. 它可能存在如下问题:
a)而且由于项数过多, 最后的结果很有可能是过拟合的;
b)并且, 在处理这么多项时, 也存在运算量过大的问题.
当然, 你也可以考虑仅包含这些二项式的子集.
如, 只保留了 100 个二项式, 但是由于忽略了太多二次项, 在处理类似左上角的数据时不可能得到理想的结果.
你看, 包含二次项的情况下, 就已经有 5000 个特征项了, 如果在包括立方, 三次项 (量级是 n ^3) 等等,
例 2:
一个数矩阵, 或者说表示像素强度值的网格, 告诉我们图像中每个像素的亮度值. 因此计算机视觉的问题就是根据这个像素点亮度矩阵, 来告诉我们这些数值代表一个汽车门把手
训练分类器的样本分两部分. 一部分是'汽车'的图像集, 另一部分是'非汽车'的图像集.
为了理解引入'非线性'假设的必要性. 我们从学习算法的训练样本中找出一些汽车图片和一些非汽车图片, 我们从图片中选择一组像素点位
假设图片大小为 50 * 50 px
特征向量 x 就是包含了所有像素强度的列表. 对于典型的计算机图片表示方法, 如果存储的是每个像素点的灰度值, 那么每个元素的值应该在 0 到 255 之间.
因此, 这个问题中 n = 2500, 但是这只是使用灰度图片的情况. 如果我们使用的是 RGB 彩色图像, 每个像素点包括 红 绿 蓝 三个值, 那么 n = 7500.
因此, 如果我们要通过包含所有的二次项特征来学习得到非线性假设, 那么这 (x_i * x_j) 就是式子中的所有条件. 由于有 2500 个像素, 总共就有约 300 万个特征, 这个数字大得有点离谱了...
对于每个样本都要找到并表示所有这 300 万个特征, 这计算成本太高了. 因此, 只是包括平方项或者立方项特征, 简单的 logistic 回归算法 并不是一个在 n 很大时学习复杂的非线性假设的好办法. 因为特征过多.
神经网络, 它在学习复杂的非线性假设上被证明是一种好得多的算法, 即时输入 特征空间 或 n 很大, 也能轻松搞定.
9.2 神经元与大脑
神经网络是一种很古老的算法, 它最初产生的目的是制造能模拟大脑的机器.
在这门课中, 我将向你们介绍神经网络. 因为它能很好地解决不同的机器学习问题. 而不只因为它们在逻辑上行得通, 在这段视频中, 我想告诉你们一些神经网络的背景知识, 由此我们能知道可以用它们来做什么. 不管是将其应用到现代的机器学习问题上, 还是应用到那些你可能会感兴趣的问题中. 也许, 这一伟大的人工智能梦想在未来能制造出真正的智能机器. 另外, 我们还将讲解神经网络是怎么涉及这些问题的. 神经网络产生的原因是人们想尝试设计出模仿大脑的算法, 从某种意义上说如果我们想要建立学习系统, 那为什么不去模仿我们所认识的最神奇的学习机器 -- 人类的大脑呢?
神经网络逐渐兴起于二十世纪八九十年代, 应用得非常广泛. 但由于各种原因, 在 90 年代的后期应用减少了. 但是最近, 神经网络又东山再起了. 其中一个原因是: 神经网络是计算量有些偏大的算法. 然而大概由于近些年计算机的运行速度变快, 才足以真正运行起大规模的神经网络. 正是由于这个原因和其他一些我们后面会讨论到的技术因素, 如今的神经网络对于许多应用来说是最先进的技术. 当你想模拟大脑时, 是指想制造出与人类大脑作用效果相同的机器. 大脑可以学会去以看而不是听的方式处理图像, 学会处理我们的触觉.
我们能学习数学, 学着做微积分, 而且大脑能处理各种不同的令人惊奇的事情. 似乎如果你想要模仿它, 你得写很多不同的软件来模拟所有这些五花八门的奇妙的事情. 不过能不能假设大脑做所有这些, 不同事情的方法, 不需要用上千个不同的程序去实现. 相反的, 大脑处理的方法, 只需要一个单一的学习算法就可以了? 尽管这只是一个假设, 不过让我和你分享, 一些这方面的证据.
大脑的这一部分这一小片红色区域是你的听觉皮层, 你现在正在理解我的话, 这靠的是耳朵. 耳朵接收到声音信号, 并把声音信号传递给你的听觉皮层, 正因如此, 你才能明白我的话.
神经系统科学家做了下面这个有趣的实验, 把耳朵到听觉皮层的神经切断. 在这种情况下, 将其重新接到一个动物的大脑上, 这样从眼睛到视神经的信号最终将传到听觉皮层. 如果这样做了. 那么结果表明听觉皮层将会学会 "看". 这里的 "看" 代表了我们所知道的每层含义. 所以, 如果你对动物这样做, 那么动物就可以完成视觉辨别任务, 它们可以看图像, 并根据图像做出适当的决定. 它们正是通过脑组织中的这个部分完成的. 下面再举另一个例子, 这块红色的脑组织是你的躯体感觉皮层, 这是你用来处理触觉的, 如果你做一个和刚才类似的重接实验, 那么躯体感觉皮层也能学会 "看". 这个实验和其它一些类似的实验, 被称为神经重接实验, 从这个意义上说, 如果人体有同一块脑组织可以处理光, 声或触觉信号, 那么也许存在一种学习算法, 可以同时处理视觉, 听觉和触觉, 而不是需要运行上千个不同的程序, 或者上千个不同的算法来做这些大脑所完成的成千上万的美好事情. 也许我们需要做的就是找出一些近似的或实际的大脑学习算法, 然后实现它大脑通过自学掌握如何处理这些不同类型的数据. 在很大的程度上, 可以猜想如果我们把几乎任何一种传感器接入到大脑的几乎任何一个部位的话, 大脑就会学会处理它.
下面再举几个例子:
这张图是用舌头学会 "看" 的一个例子. 它的原理是: 这实际上是一个名为 BrainPort 的系统, 它现在正在 FDA (美国食品和药物管理局)的临床试验阶段, 它能帮助失明人士看见事物. 它的原理是, 你在前额上带一个灰度摄像头, 面朝前, 它就能获取你面前事物的低分辨率的灰度图像. 你连一根线到舌头上安装的电极阵列上, 那么每个像素都被映射到你舌头的某个位置上, 可能电压值高的点对应一个暗像素电压值低的点. 对应于亮像素, 即使依靠它现在的功能, 使用这种系统就能让你我在几十分钟里就学会用我们的舌头 "看" 东西.
这是第二个例子, 关于人体回声定位或者说人体声纳. 你有两种方法可以实现: 你可以弹响指, 或者咂舌头. 不过现在有失明人士, 确实在学校里接受这样的培训, 并学会解读从环境反弹回来的声波模式 - 这就是声纳. 如果你搜索 YouTube 之后, 就会发现有些视频讲述了一个令人称奇的孩子, 他因为癌症眼球惨遭移除, 虽然失去了眼球, 但是通过打响指, 他可以四处走动而不撞到任何东西, 他能滑滑板, 他可以将篮球投入篮框中. 注意这是一个没有眼球的孩子.
第三个例子是触觉皮带, 如果你把它戴在腰上, 蜂鸣器会响, 而且总是朝向北时发出嗡嗡声. 它可以使人拥有方向感, 用类似于鸟类感知方向的方式.
还有一些离奇的例子:
如果你在青蛙身上插入第三只眼, 青蛙也能学会使用那只眼睛. 因此, 这将会非常令人惊奇. 如果你能把几乎任何传感器接入到大脑中, 大脑的学习算法就能找出学习数据的方法, 并处理这些数据. 从某种意义上来说, 如果我们能找出大脑的学习算法, 然后在计算机上执行大脑学习算法或与之相似的算法, 也许这将是我们向人工智能迈进做出的最好的尝试. 人工智能的梦想就是: 有一天能制造出真正的智能机器.
神经网络可能为我们打开一扇进入遥远的人工智能梦的窗户, 但我在这节课中讲授神经网络的原因, 主要是对于现代机器学习应用. 它是最有效的技术方法. 因此在接下来的一些课程中, 我们将开始深入到神经网络的技术细节.
9.3 模型展示 Ⅰ
神经网络模仿了大脑中的神经元或者神经网络, 为了解释如何表示假设模型, 我们先来看神经元在大脑中是什么样的? 我们的大脑中充满了这样的神经元, 神经元是大脑中的细胞. 每一个神经元都可以被认为是一个处理单元 / 神经核(processing unit/Nucleus), 它含有许多输入 / 树突(input/Dendrite), 它们接受来自其他神经元的信息, 并且有一个输出 / 轴突(output/Axon), 它用来给其他神经元传递信号 . 简而言之, 神经元是一个计算单元, 它从输入通道接受一定数目的信息, 并做一些计算, 然后将结果通过它的轴突传送到其他节点或者大脑中的其他神经元. 神经网络是大量神经元相互链接并通过电脉冲来交流的一个网络.
是一组神经元的示意图, 神经元利用微弱的电流进行沟通. 这些弱电流也称作动作电位, 其实就是一些微弱的电流. 所以如果神经元想要传递一个消息, 它就会就通过它的轴突, 发送一段微弱电流给其他神经元, 这就是轴突.
这里是一条连接到输入神经, 或者连接另一个神经元树突的神经, 接下来这个神经元接收这条消息, 做一些计算, 它有可能会反过来将在轴突上的自己的消息传给其他神经元. 这就是所有人类思考的模型: 我们的神经元把自己的收到的消息进行计算, 并向其他神经元传递消息. 这也是我们的感觉和肌肉运转的原理. 如果你想活动一块肌肉, 就会触发一个神经元给你的肌肉发送脉冲, 并引起你的肌肉收缩. 如果一些感官: 比如说眼睛想要给大脑传递一个消息, 那么它就像这样发送电脉冲给大脑的.
我们将使用一个很简单的模型来模拟神经元的工作, 我们将神经元模拟成逻辑单元.
x_0 有时也被称作偏置单元或偏置神经元. 但因为 x_0 总是等于 1. 所以, 有时候我会画出它, 有时我不会画出, 这取决于具体例子中, 加上 x_0 是不是表示起来更方便
用神经网络术语描述, 就是带有 sigmoid 或者 logistic 激活函数的人工神经元. 在神经网络学中,"激活函数" 是 非线性函数 g(z) 的另一种术语.
之前, 我们一直称 Θ 为模型的参数, 但在关于神经网络的文献里, 有时被称为模型的权重.
神经网络模型建立在很多神经元之上, 每一个神经元又是一个个学习模型. 这些神经元 (也叫激活单元, activation unit) 采纳一些特征作为输入, 并且根据本身的模型提供一个输出. 下图是一个以逻辑回归模型作为自身学习模型的神经元示例, 在神经网络中, 参数又可被成为权重(weight).
我们设计出了类似于神经元的神经网络, 效果如下:
其中 x_1, x_2, x_3 是输入单元(input units), 我们将原始数据输入给它们.
a_1, a_2, a_3 是中间单元, 它们负责将数据进行处理, 然后呈递到下一层.
最后是输出单元, 它负责计算 h_θ (x).
神经网络模型是许多逻辑单元按照不同层级组织起来的网络, 每一层的输出变量都是下一层的输入变量. 下图为一个 3 层的神经网络, 第一层成为输入层(Input Layer), 因为我们在这一层输入特征; 最后一层称为输出层(Output Layer), 因为这一层的神经元的输出是我们假设的最终结果; 中间一层成为隐藏层(Hidden Layers), 隐藏层并不是非常好的术语, 但是在监督学习中, 直觉告诉我们, 你能看到输入, 也能看到正确的输出, 而隐藏层的值在训练集里是看不到的, 它的值不是 x 也不是 y, 所以我们叫它隐藏层. 隐藏层可能不止一个, 实际上, 任何非输入层或非输出层的层都被称为隐藏层. 我们为每一层都增加一个偏差单位(bias unit):
下面引入一些标记法来帮助描述模型:
a_i^(j) 代表第 j 层的第 i 个激活单元. 所谓激活项是指由一个具体神经元计算并输出的值
θ^(j) 它代表从第 j 层映射到第 j+1 层时的权重的矩阵, 例如θ^(1)代表从第一层映射到第二层的权重的矩阵. 其尺寸为: 以第 j+1 层的激活单元数量为行数, 以第 j 层的激活单元数加一为列数的矩阵. 例如: 上图所示的神经网络中θ^(1)为 3*4 矩阵.
对于上图所示的模型, 激活单元和输出分别表达为:
上面进行的讨论中只是将特征矩阵中的一行 (一个训练实例) 喂给了神经网络, 我们需要将整个训练集都喂给我们的神经网络算法来学习模型.
我们可以知道: 每一个 a 都是由上一层所有的 x 和每一个 x 所对应的 θ 决定的.
(我们把这样从左到右的算法称为前向传播算法( FORWARD PROPAGATION ))
把 x, θ, a 分别用矩阵表示, 我们可以得到θX=a :
9.4 模型展示 Ⅱ
本节概述
如何用数学来计算或者定义神经网络的假设函数.
如何高效进行计算, 并展示一个向量化的实现方法, 以及为什么这样是表示神经网络好的方法
如何使用神经网络学习复杂的非线性假设函数
( FORWARD PROPAGATION ) 相对于使用循环来编码, 利用向量化的方法会使得计算更为简便. 以上面的神经网络为例, 试着计算第二层的值:
这些 z 值都是线性组合, 某个特定神经元的输入值 x_0,x_1,x_2,x_3 的加权线性组合.
θ^(1)是一个 3 * 4 的向量.
g 是 sigmoid 函数.
逐个元素的作用于 z^(2) 中的每个元素.
这个计算 h(x) 的过程, 也称为前向传播. 这是因为, 我们从输入单元的激活项开始, 然后进行向前传播给隐藏层, 计算隐藏层的激活项, 然后继续向前传播, 并计算输出层的激活项. 这个依次计算激活项, 从输入层到隐藏层再到输出层的过程叫前向传播.
这只是针对训练集中一个训练实例所进行的计算. 如果我们要对整个训练集进行计算, 我们需要将训练集特征矩阵进行转置, 使得同一个实例的特征都在同一列里. 即:
这个向前传播也可以帮助我们了解神经网络的作用和它为什么能够帮助我们学习有趣的非线性假设函数.
为了更好的了解 Neuron Networks 的工作原理, 我们先把左半部分遮住:
右半部分其实就是以 a_0,a_1,a_2,a_3 作为输入变量 / 特征, 按照 Logistic Regression 的方式输出 h_θ(x)
而 a_1,a_2,a_3 是它们学习得到的输入值. 因此在神经网络中, 我们没有用输入特征 x_1,x_2,x_3 来训练 logistic 回归, 而是自己训练了 logistic 回归的输入特征(即, a_1,a_2,a_3). 可以想象, 根据Θ_1 选择的不同参数, 有时候可以学习得到很有趣和复杂的特征, 就可以得到一个更好的假设函数. 比使用原始输入特征得到的假设更好. 你也可以选择多项式项等作为输入项, 这个算法可以灵活地尝试快速学习任意的特征项, 把这些 a_1,a_2,a_3 输入这个最后的单元(即, logistic 回归算法).
后面将举例说明, 神经网络如何利用隐藏层计算更复杂的特征, 并输入到最后的输出层, 以及为什么这样就可以学习更复杂的假设函数.
其实神经网络就像是 logistic regression, 只不过我们把 logistic regression 中的输入向量[x_1 ~ x_3] 变成了中间层的 [a_1^(2) ~ a_3^(2)], 即:
我们可以把 a_0,a_1,a_2,a_3 看成更为高级的特征值, 也就是 x_0,x_1,x_2,x_3 的进化体, 并且它们是由 x 与决定的, 因为是梯度下降的, 所以 a 是变化的, 并且变得越来越厉害, 所以这些更高级的特征值远比仅仅将 x 次方厉害, 也能更好的预测新数据.
这就是神经网络相比于逻辑回归和线性回归的优势.
其他的神经网络架构:
架构是指, 不同的神经元的连接方式.
展示了不同的神经网络架构. 会得到一个有趣的非线性假设函数.
9.5 例子与直觉理解 Ⅰ
从本质上讲, 神经网络能够通过学习得出其自身的一系列特征. 在普通的逻辑回归中, 我们被限制为使用数据中的原始特征 x_1,x_2,...,x_n, 我们虽然可以使用一些二项式项来组合这些特征, 但是我们仍然受到这些原始特征的限制. 在神经网络中, 原始特征只是输入层, 在我们上面三层的神经网络例子中, 第三层也就是输出层做出的预测利用的是第二层的特征, 而非输入层中的原始特征, 我们可以认为第二层中的特征是神经网络通过学习后自己得出的一系列用于预测输出变量的新特征.
神经网络中, 单层神经元 (无中间层) 的计算可用来表示逻辑运算, 比如逻辑与(AND), 逻辑或(OR).
举例说明, 神经网络是如何计算复杂非线性函数的输入的. 明白为什么神经网络可以用来学习复杂的非线性假设模型
x1 XOR x2 : 表示当这两个值恰好其中一个等于 1 时, 这个式子为真.
x1 XNOR x2 等价于 NOT(x1 XOR x2): 也就是当这些正样本, 同时为真或同时为假时, y 的值才为 1.
如果构建一个神经网络, 来拟合这些样本数据了?
为了能够拟合 XNOR 运算的神经网络, 我们先从一个比较简单的 AND 运算的网络入手..
举例说明:
逻辑与(AND);
下图中左半部分是神经网络的设计与 output 层表达式, 右边上部分是 sigmod 函数, 下半部分是真值表.
我们可以用这样的一个神经网络表示 AND 函数:
其中,θ_0 = -30,θ_1 = 20,θ_2 = 20, 我们的输出函数 h_θ (x)即为:
接下来再介绍一个 OR 函数:
h_Θ (x)≈x_1 OR x_2
OR 与 AND 整体一样, 区别只在于的取值不同.
所以, 神经网络的单个神经元就是这样被用来计算逻辑函数的.
9.6 例子与直觉理解 Ⅱ
逻辑非:
实现 "逻辑非" 运算的大体思想就是: 在预期得到非结果的变量前面放一个很大的负权重, 如, 本例中的 -20*x_1
实现 (NOT x1) AND (NOT x2) 即, 但且仅当 x1 = x2 = 0 时, y = 1
最后会得到一个非线性的决策边界, 用以计算 XNOR 函数.
更通俗的解释是, 我们的输入都放在输入层, 然后在中间放一个隐藏层用来计算一些关于输入的略复杂的功能, 然后再继续增加一层用于计算一个更复杂非线性函数. 这也就是为什么神经网络可以计算这种复杂的函数
二元逻辑运算符 (BINARY LOGICAL OPERATORS) 当输入特征为布尔值 (0 或 1) 时, 我们可以用一个单一的激活层可以作为二元逻辑运算符, 为了表示不同的运算符, 我们只需要选择不同的权重即可.
下图的神经元 (三个权重分别为 - 30,20,20) 可以被视为作用同于逻辑与(AND):
下图的神经元 (三个权重分别为 - 10,20,20) 可以被视为作用等同于逻辑或(OR):
下图的神经元 (两个权重分别为 10,-20) 可以被视为作用等同于逻辑非(NOT):
我们可以利用神经元来组合成更为复杂的神经网络以实现更复杂的运算. 例如我们要实现 XNOR 功能(输入的两个值必须一样, 均为 1 或均为 0), 即:
首先构造一个能表达 ( NOT x_1 ) AND ( NOT x_2 ) 部分的神经元:
然后将表示 AND 的神经元和表示 (NOTx_1 )AND(NOTx_2 ) 的神经元以及表示 OR 的神经元进行组合:
我们就得到了一个能实现 XNOR 运算符功能的神经网络.
按这种方法我们可以逐渐构造出越来越复杂的函数, 也能得到更加厉害的特征值.
这就是神经网络的厉害之处.
当网络拥有许多层, 在第二层中有一些关于输入的相对简单的函数, 第三层又在此基础上计算更加复杂的方程, 再往后一层计算的函数越来越复杂.
9.7 多元分类
如何利用神经网络解决多类别分类问题.
手写数字的识别问题, 实际上就是一个多类别分类问题. 因为它有 10 种需要识别的类别.
我们要在神经网络中实现多类别分类, 采用的方法本质上是一对多法的拓展.
当我们有不止两种分类时(也就是 y=1,2,3....), 比如以下这种情况, 该怎么办? 如果我们要训练一个神经网络算法来识别路人, 汽车, 摩托车和卡车, 在输出层我们应该有 4 个值. 例如, 第一个值为 1 或 0 用于预测是否是行人, 第二个值用于判断是否为汽车.
输入向量 x 有三个维度, 两个中间层, 输出层 4 个神经元分别用来表示 4 类, 也就是每一个数据在输出层都会出现[a b c d]^T, 且 a,b,c,d 中仅有一个为 1, 表示当前类. 下面是该神经网络的可能结构示例:
y^(i) 的值取决于对应的图像 x^(i), 那么一个训练样本将由一组 ( x^(i) , y^(i) ) 组成. 其中, x^(i) 就是四种物体其中一种的图像, y^(i) 就是这些向量中的一个.
并且, x^(i) 和 y^(i) 在该例子中, 都是 4 维向量. 分别表示 4 种不同的类别.
这就是让神经网络解决多类别分类问题的方法.
来源: http://www.jianshu.com/p/2f37c48260bd