吴恩达机器学习:神经网络 | 多分类问题
上一周我们学习了 逻辑回归,并使用它解决了简单的 0/1 分类问题。这周我们首先尝试使用 逻辑回归 来解决 多分类问题( 手写字符识别 )。通过这个问题了解到,当我们需要解决特征量很大的非线性分类问题时( 比如计算机视觉问题 ),我们原本假设高次特征的方法会使得特征数异常庞大,从而引出新的方法 神经网络。
为了更好的阅读体验你可以在 网站 中查看,点击 课程视频 你就能不间断地学习 Ng 的课程,关于课程作业的 Python 代码已经放到了 Github 上,点击 课程代码 就能去 Github 查看( 无法访问 Github 的话可以点击 Coding 查看 ),代码中的错误和改进欢迎大家指出。
以下是 Ng 机器学习课程第三周的笔记。
多分类问题
之前我们已经使用 逻辑回归 解决了 0/1 分类问题,这次的新问题是手写字符识别。有一个手写字符的图片集合,每张图片都是一个 0 ~ 9 之间的手写数字,对于每张手写字符图片,我们要输出它是什么数字。( 下图是随机选取的 100 张图片 )
随机选取的 100 张手写字符对于这个问题,我们的解决方法是训练 10 个 0/1 分类器,分别判断图片属于这个分类的概率( 逻辑回归 的输出 ),然后从这 10 个结果中选取最大的作为结果。对于作业中的数据( 数据集 与 训练集相同 ),这个分类器可以达到 95% 的正确率。要想再提升准确率我们就需要将特征映射到更高次,比如之前作业中的 6 次。这样的话,就会有多达 342505341313200 个特征。所以要更好地解决这类问题,我们需要引入新的方法。
神经网络
神经网络是一种很古老的算法,这个算法诞生的目的是为了模拟大脑的算法从而建造智能机器。这个想法产生的原因是神经科学的研究表明大脑并非对不同的信号采取不同的处理方式( 不同的算法 ),而是使用同一种来应对不同的信号( 视觉、听觉等 )。这极大地激发了研究人员对寻找这种算法的热情,虽然期间由于各种技术问题( 没有有效的训练算法和硬件速度限制 )消声觅迹了一段时间,但最终凭借 反向传播、共享权值、GPU加速 等技术重现光辉。并成为现代机器学习技术中最有效的方法之一。
数学表示
我们把单个 神经元 抽象为一个 逻辑单元 ,x0、x1、x2、x3 为 树突 传入的信号( x0 为偏置,图中没有画出 ),激活 神经元 后从 轴突 输出 hθ(x)。
神经元与逻辑单元逻辑单元 可以使用数学符号表示为如下形式:
单个 神经元 的能力非常有限,而 神经网络 强大的地方在于将这些 神经元 连接在一起共同工作( 类似于大脑中神经元的工作方式 ),所以我们来看一下 神经网络 是如何表示的。
上图是含有一层 隐含层 的神经网络,输入单元 x0、x1、x2、x3 将值传给 隐含层( 每个输入单元传入的 权值 是不同的 )。然后 隐含层 将输出值再传给输出层的 神经元。用数学语言表达就是:
式中 g(z) 为 激活函数,也就是 逻辑回归 中提到的 Sigmoid 函数。a02=1 为偏置。hΘ(x) 由于输出层只有一个元素,为了美观没有写为矩阵形式。图中输出层只有一个 逻辑单元,但实际可以有多个。
表达能力
监督学习 的目的就是为了使用算法获得问题的 预测函数,所以一个 预测函数 能够表达的函数越多,应用就能够更广泛。那么 神经网络 的表达能力如何呢?Andrew Ng 在课程中展示了如何使用 逻辑单元 来组成数字电路中的 逻辑门。而我们又知道 逻辑门 是计算机计算的基础,它们的组合可以表达一切可以计算的函数,所以从某种直觉上来说 神经网络 能够表达的东西是非常多的。
这里我强烈推荐看 神经网络可以拟合任意函数的视觉证明( sorry~,第四章有互动,没能找到好的翻译 ),在文章中你可以调整各种参数,互动地感受 神经网络 的表达能力。
手写字符识别
本周课程最后回到我们的 多分类问题 问题,我们构造一个 神经网络 来完成手写字符识别的任务。网络的输入为 20x20 的图片,所以输入层有 401 个单元。我们需要归类 0 ~ 9 的 10 个数字,所以输出层有 10 个单元,第 i 个单元表示图片为 i mod 10 的概率( 偏置不在图中绘出 )。
作业中给出的隐含层为 26 个单元,并且已经给出了层与层之前的权值矩阵,我们通过 神经网络 的数学表达来计算它的输出。最后我们得到的识别准确率为 97%。看到 神经网络 正确地给图片做出分类还真是觉得神奇。
在下次的课程中我们会学习如何训练我们的 神经网络,给出它的 代价函数,并使用 反向传播 算法来计算梯度。
So~,第三周的内容就是这些了,谢谢大家耐心阅读。