文章目录
- 一、神经网络简介 (Introduction to Neural Networks)
-
- [1.1 什么是神经网络](#1.1 什么是神经网络)
- [1.2 神经网络为何现在如此强大?](#1.2 神经网络为何现在如此强大?)
- 二、神经网络的模型表示
-
- [2.1 单个神经元:逻辑回归单元](#2.1 单个神经元:逻辑回归单元)
- [2.2 构建网络:层 (Layers)](#2.2 构建网络:层 (Layers))
- [2.3 神经网络如何自动学习特征](#2.3 神经网络如何自动学习特征)
- 三、前向传播 (Forward Propagation)
-
- [3.1 逐层计算详解](#3.1 逐层计算详解)
- [3.2 更复杂的网络与数学符号](#3.2 更复杂的网络与数学符号)
- [3.3 完整示例:手写数字识别](#3.3 完整示例:手写数字识别)
- [3.4 神经网络的应用实例](#3.4 神经网络的应用实例)
- [四、代码实现:使用 TensorFlow](#四、代码实现:使用 TensorFlow)
-
- [4.1 [附录] 关于 NumPy 数组的说明](#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 数组,以便后续处理。
