【机器学习05】神经网络、模型表示、前向传播、TensorFlow实现
文章目录
- 一、神经网络简介 (Introduction to Neural Networks)
- 1.1 什么是神经网络
- 1.2 神经网络为何现在如此强大?
- 二、神经网络的模型表示
- 2.1 单个神经元:逻辑回归单元
- 2.2 构建网络:层 (Layers)
- 2.3 神经网络如何自动学习特征
- 三、前向传播 (Forward Propagation)
- 3.1 逐层计算详解
- 3.2 更复杂的网络与数学符号
- 3.3 完整示例:手写数字识别
- 3.4 神经网络的应用实例
- 四、代码实现:使用 TensorFlow
- 4.1 [附录] 关于 NumPy 数组的说明
视频链接
吴恩达机器学习p38-46
一、神经网络简介 (Introduction to Neural Networks)
经过对线性回归和逻辑回归的学习,我们已经掌握了构建强大预测模型的基础。现在,我们将进入一个更高级、更强大的算法领域:神经网络(Neural Networks),以及决策树等。
1.1 什么是神经网络
神经网络(NN)是一类算法,其最初的灵感来源于对生物大脑工作方式的模仿。
它并非一个全新的概念,早在20世纪80年代和90年代初就已被使用。但由于当时计算能力和数据量的限制,它在90年代后期一度失宠。然而,自2005年左右以来,得益于大数据和计算能力的飞速发展,神经网络迎来了巨大的复兴,并迅速在语音、图像、自然语言处理(NLP)等众多领域取得了突破性进展。
在大脑中,神经元(Neuron)是基本的信息处理单元。它通过树突(Dendrites)接收输入信号,处理后通过轴突(Axon)产生输出信号。
人工神经网络就是对这个过程的一个简化数学建模。我们将一个生物神经元抽象成一个接收数字输入、进行计算、然后输出一个数字的数学单元。
1.2 神经网络为何现在如此强大?
神经网络的再度崛起,主要得益于两个关键因素的结合:海量的可用数据(大数据) 和 强大的计算能力(更快的处理器,特别是GPU)。
上图清晰地展示了,当数据量非常大时,大型神经网络(绿色曲线)的性能远超传统的机器学习算法(红色曲线)。数据越多,模型越大,性能就越强。
二、神经网络的模型表示
2.1 单个神经元:逻辑回归单元
我们其实已经接触过最简单的神经元了——它本质上就是一个我们前面学过的逻辑回归单元。
这个“神经元”接收输入 x
(例如商品价格),通过一个 激活函数(activation function)(这里是Sigmoid函数),计算并输出一个 激活值(activation) a
,这个 a
值代表了某个事件发生的概率(例如,商品成为爆款的概率)。
2.2 构建网络:层 (Layers)
神经网络的强大之处在于,它将许许多多这样的单个神经元,组织成一个个“层(Layer)”。
一个典型的神经网络由三部分组成:
- 输入层 (Input Layer):接收原始的特征数据
x⃗
(如价格、运费、营销投入等)。 - 隐藏层 (Hidden Layer):位于输入层和输出层之间,负责进行大部分的计算。隐藏层能够学习到数据中更抽象、更深层次的特征(如“性价比”、“品牌知名度”等)。
- 输出层 (Output Layer):输出最终的预测结果
a
。
当一个网络包含多个隐藏层时,它也被称为多层感知机(Multilayer Perceptron, MLP)。我们可以通过增加隐藏层的数量和每层神经元的数量,来构建更加复杂的神经网络架构(architecture)。
2.3 神经网络如何自动学习特征
神经网络,特别是深度神经网络(有很多隐藏层的网络),最神奇的能力之一就是自动学习特征的层次化表示。
以人脸识别为例,首先,我们需要将一张图像转化为神经网络可以处理的数字。我们把图像的每个像素点的灰度值“拉直”,形成一个长长的输入向量 x⃗
。
然后,将这个向量输入神经网络:
- 第一个隐藏层:可能会学习到如何识别一些基础的视觉元素,比如不同方向的边缘、角点。
- 第二个隐藏层:将第一层的边缘和角点信息组合,学习识别更复杂的部件,比如眼睛、鼻子。
- 更深的隐藏层:继续组合,学习识别人脸的轮廓。
- 输出层:接收到人脸轮廓这一高度抽象的特征后,最终判断出这张脸属于谁。
这种从简单到复杂的特征逐层学习和抽象的能力,是神经网络在图像识别、车辆检测等复杂任务上取得巨大成功的关键。
三、前向传播 (Forward Propagation)
神经网络从输入层接收数据,逐层计算,直到输出层得到最终结果的这个过程,被称为前向传播(Forward Propagation)。
3.1 逐层计算详解
我们来分解一下这个计算过程。每一层的每个神经元,都会接收来自前一层所有神经元的激活值作为输入,然后进行计算。
以上图为例,layer 1
的激活值向量 a⃗[¹]
是由输入 x⃗
计算得出的。然后,layer 2
的输出 a[²]
是由 a⃗[¹]
作为输入计算得出的。
最终,输出层的神经元给出预测值 a[²]
后,我们可以通过一个阈值(如0.5)来做出最终的分类判断 ŷ
。
3.2 更复杂的网络与数学符号
当网络更深时,这个过程是完全一样的:每一层的输出,都成为下一层的输入。
我们来看一下更深网络中,layer 2
到 layer 3
的计算过程。layer 3
的每一个神经元,都接收来自 layer 2
的完整激活向量 a⃗[²]
作为输入,并计算出自己的激活值。
为了精确描述这个过程,我们需要一套标准的符号。请注意下图中 a₂[³]
各部分的下标和上标的含义。
这里有一个小测验,可以帮助我们巩固对符号的理解。正确的写法是 a₂[³] = g(w⃗₂[³] · a⃗[²] + b₂[³])
,因为输入是来自上一层(layer 2
)的整个向量 a⃗[²]
。
现在,我们来总结一下通用的数学符号:
aⱼ[ˡ]
: 表示第l
层(layerl
)中,第j
个神经元(unitj
)的激活值。w⃗ⱼ[ˡ]
,bⱼ[ˡ]
: 分别表示第l
层、第j
个神经元对应的权重向量和偏置。a⃗[ˡ⁻¹]
: 表示第l-1
层的激活向量,它是第l
层的输入。
那么,第 l
层第 j
个神经元的计算公式为:
aⱼ[ˡ] = g(w⃗ⱼ[ˡ] · a⃗[ˡ⁻¹] + bⱼ[ˡ])
3.3 完整示例:手写数字识别
我们来看一个识别手写数字“0”或“1”的端到端示例。
- 输入 (x⃗): 8x8像素的图片,拉直成64维的向量。
- Layer 1: 25个神经元,计算出
a⃗[¹]
。 - Layer 2: 15个神经元,接收
a⃗[¹]
,计算出a⃗[²]
。 - Layer 3 (Output): 1个神经元,接收
a⃗[²]
,计算出最终概率a[³]
。
Layer 2 的计算过程如下:
最终,输出层的计算(前向传播的最后一步)如下:
3.4 神经网络的应用实例
神经网络可以学习非常复杂的非线性决策边界。比如在咖啡豆烘焙中,我们可以用神经网络来区分“优质咖啡”(红叉)和其他类别。
四、代码实现:使用 TensorFlow
现代深度学习框架(如 TensorFlow)极大地简化了构建和训练神经网络的过程。
我们可以用 TensorFlow 的 Dense
层来搭建上面咖啡豆分类的模型。
同样,前面手写数字识别的三层网络,也可以用几行代码清晰地构建出来。
4.1 [附录] 关于 NumPy 数组的说明
在实际编程中,输入数据的**形状(shape)**非常重要。
TensorFlow 通常期望接收 (N, D)
形式的二维数组(矩阵),其中 N
是样本数量,D
是特征维度。
np.array([200, 17])
创建的是一维数组,需要注意。np.array([[200, 17]])
创建的是1x2
的二维数组,这通常是喂给模型时的正确格式(代表1个样本,2个特征)。
框架的输出通常是 Tensor 格式,可以使用 .numpy()
方法将其转换为 NumPy 数组,以便后续处理。