初识人工智能
一、一切的起点——达特茅斯会议
1956年8月,在美国汉诺斯小镇宁静的达特茅斯学院中,约翰·麦卡锡(John McCarthy)、马文·闵斯基(Marvin Minsky,人工智能与认知学专家)、克劳德·香农(Claude Shannon,信息论的创始人)、艾伦·纽厄尔(Allen Newell,计算机科学家)、赫伯特·西蒙(Herbert Simon,诺贝尔经济学奖得主)等科学家正聚在一起,讨论着一个主题:如何可以制作出一个可以不断学习并模拟人类智能的机器?
达特茅斯会议是人工智能(AI)发展史上的里程碑事件,它不仅定义了==“人工智能”这一学科名称,还为后续研究奠定了框架和方向,因此1956年也就成为了人工智能元年==。
二、什么是智能?
比如在生活中,我们和狗狗对话,让他坐他就坐,让他叫他就会叫两声,骂他两句,他还会一脸幽怨的盯着我们,此时我就就会说这只小狗很聪明,有灵性,有灵性就是说狗是有智能的生物,而不会像石头那样无论如何都毫无反应,尽管智能的定义千千万,但本质上来说,智能就是针对不同场景给出有针对性的输出反应。所以说人工智能,就是人工搭建起一个根据不同的环境信息,给出针对性的输出和回应的系统,这种输出,可以是动作语言,也可以是判断和预测。
数学一点来说,智能,就是找到情景信息的输入,和我们想要的聪明的输出之间的函数关系。(Functions describe the world!)
三、如何实现智能?
那么该如何做出一个这样的黑箱呢?
符号主义
一批科学家从数学的形式化推理得到灵感,主张智能可以由符号的逻辑推理来模拟,这就是符号主义(Symbolicism)。
以下是基于符号逻辑的规则推理示例,展示如何通过明确的条件和结论进行推导:
例1:天气预测
-
符号定义:
C
: 阴天(Cloudy)H>70
: 湿度大于70%(Humidity > 70%)R
: 今天会下雨(Rain)
-
规则:
如果 C ∧ (H>70),则 R
-
推理过程:
- 事实输入:当前天气是阴天(
C=True
),湿度为75%(H=75
)。 - 条件检查:
C
为真且H>70
为真 → 触发规则。 - 结论:推出
R=True
(今天会下雨)。
- 事实输入:当前天气是阴天(
例2:医疗诊断
-
符号定义:
F
: 患者发烧(Fever)C
: 患者咳嗽(Cough)D
: 诊断为流感(Diagnosis=Flu)
-
规则:
如果 F ∧ C,则 D
-
推理过程:
- 症状输入:患者体温38.5°C(
F=True
),持续咳嗽(C=True
)。 - 条件检查:
F
和C
均为真 → 触发规则。 - 结论:诊断为流感(
D=Flu
)。
- 症状输入:患者体温38.5°C(
这套理论在专家系统中获得了很大的成功。但随着发展其也暴露出了很多的缺陷,即现实生活中没有那么多明确的规则,同时很致命的是这套系统完全就是在复制人类的经验,它的上限就是人类专家的水平,无法做到比人更好,而且一旦设计好这个系统,它的能力就固定不变了,很难像人一样不断成长。正因为此问题,另一个人工智能流派逐渐发扬光大。
联结主义
联结主义(connectionism)是一种模拟人类大脑神经网络的计算模型,通过大量简单的处理单元之间的连接,模拟人类的认知过程。它认为智能行为和学习过程是通过神经元间的连接权重和活动模式来实现的,而不是依赖符号或逻辑推理。
为了理解,我们先看一个简单的例子,在一堆水果中,人类是如何判断它到底是苹果、西瓜还是其他?
人类是通过其他概念的组合来认识水果类型的(比如苹果外表皮是红色个的、比较圆、尺寸比较小…),在不同的概念属性上,不同的水果会有不同的特征。对于水果的各种特征,我们可以用1来表示符合,0来表示不符合,就可以获得下面这样一张表。
苹果 | 葡萄 | 柠檬 | 山楂 | 西瓜 | |
---|---|---|---|---|---|
尺寸大 | 0 | 0 | 0 | 0 | 1 |
尺寸小 | 1 | 1 | 1 | 1 | 0 |
红色 | 1 | 0 | 0 | 1 | 0 |
绿色 | 0 | 1 | 0 | 0 | 1 |
黄色 | 0 | 0 | 1 | 0 | 0 |
味道甜 | 1 | 1 | 0 | 0 | 1 |
味道酸 | 0 | 1 | 1 | 1 | 0 |
根据上述思想,我们就可以设计一台机器,将这些特征作为输入,再给每一个特征乘以一个系数,当这个特征符合当前要判断的水果(如苹果),则乘以一个正数(正向促进作用),反之则乘以一个负数,最后根据得分总和的高低判断正确的可能性大小。
我们可以再设置一个得分的阈值b,如果得分高于b,就激活机器,否则就不激活,这样我们就可以进行识别,通过不断调整每一个特征对应的系数,就可以识别不同的物体。
而这种从不同输入数据中,识别不同水果的模式,就叫做模式识别。
而感知机就是人类提出的最早的模式识别算法。
大家可能感觉这个感知机和前面说的专家模式(符号主义)很类似,这是因为神经网络所代表的联结主义从一开始并不是水火不容的,但感知机这种最早期神经网络它的设计很大程度上借鉴甚至脱胎于逻辑推理,其思路同样是组合不同的特征来进行推理。这里的神经元,就像刚刚说的一个一个命题的字母一样,只不过,它是通过数值计算的方式来模拟的,而是指计算本身,不局限于有限且明确的符号推理,因而在控制、图像感知等领域潜力更强。
联结主义的发展历程:
联结主义的理论基础可追溯至20世纪40年代McCulloch和Pitts提出的首个神经元模型,以及Donald Hebb的“赫布学习理论”(神经元协同激活增强连接)。
坎坷进步:
1957年:Frank Rosenblatt发明感知机(Perceptron),首次实现图像识别,但受限于线性不可分问题(如无法解决简单的异或逻辑),加上图灵奖得主马文·闵斯基的带头唱衰之下,神经网络一度陷入寒冬。
但仍然有人坚持研究神经网络,如图灵奖和诺贝尔物理学奖双料得主Geoffrey Hinton,他们发现既然一个神经元不行,那就再添加神经元,也就是说,将一层感知机的输出,作为下一层感知机的输入,一层套一层。 这就是后面大名鼎鼎的多层感知机(MLP,Multilayer Perceptron)。这里中间层可以不只两个神经元,层数也可以不只两层,当神经元层层叠叠的时候,就是神经网络。
1986年:反向传播算法(Backpropagation)的提出,解决了多层网络训练难题,开启了现代深度学习时代。
2012年:AlexNet在ImageNet竞赛中夺冠,标志深度学习在图像识别领域的革命性突破。
代表人物:
Geoffrey Hinton(反向传播算法)、Yann LeCun(卷积神经网络)、Yoshua Bengio(自然语言处理)被称为“深度学习三巨头”。
四、神经网络
神经网络如此强大,可以自主地发现数据中蕴藏的结构、理解概念,它到底是如何做到这一点的呢?答案就是 数据训练,通过奖励和惩罚,来引导神经网络形成智能。
那我们究竟应该如何奖励和惩罚一个神经网络呢?
拟合函数
拟合函数是一种通过数学表达式(如多项式、指数函数等)对离散数据点进行整体逼近的方法。其核心在于找到一组参数,使得函数曲线与数据点之间的误差最小化。例如,最小二乘法通过最小化误差平方和实现最优拟合。
过拟合
模型过度捕获了原始数据特征,因此只适合训练集,而不适合测试集。
解决方案:
- 增大训练的数据量
- 采用正则化方法:在目标函数之后加上范数。
-
Dropout方法:前向传播过程中,随机选取和丢弃指定层次之间的部分神经连接,因为整个过程是随机的,所以能有效防止过拟合的发生。
-
提前终止训练
损失函数
我们其实很早就接触过损失函数了,中学时我们学习的最小二乘法,其实就是用一个最简单的 y = kx + b 的线性函数来搭建黑箱,对于每一个点,线性预测结果都会与实际结果都会有偏差,我们把这些偏差的平方加在一起,就得到了这根直线的损失函数。
给定一组数据点 (x1,y1),(x2,y2),…,(xn,yn),最小二乘法的目标是最小化所有数据点的平方误差和:
E
(
k
,
b
)
=
∑
i
=
1
n
(
y
i
−
(
k
x
i
+
b
)
)
2
E(k, b) = \sum_{i=1}^n (y_i - (kx_i + b))^2
E(k,b)=i=1∑n(yi−(kxi+b))2
在复杂的非线性里,损失函数也是一样的道理,我们同样把函数预测的数值,和实际数据点的数值误差平方加到一起,就得到了非线性函数的损失函数。
常见的损失函数包括均方误差函数MSE、均方根误差函数RMSE,平均绝对误差函数MAE等等。
损失函数就是在衡量一个模型预测值和真实值之间的偏差程度,可以简单理解为
掌握规律 = 损失函数很小
请注意区分拟合函数和损失函数!
拟合函数,是用来去拟合数据点的曲线,他的输入的x1,x2…,我们需要决定这些参数,得到最好的输出y,等等?输入和输出的结果有无穷多个,那怎样才算是最好呢?这就是损失函数要做的事情了,它衡量一个拟合函数到底好不好,是一个“打分机器”。之后,通过损失函数找到使其值很低的输入参数组合,这就是最出色的拟合函数,而有了这个拟合函数之后,我们就可以将其用作输入x得到符合规律的y。
训练神经网络可理解为调节不同参数旋钮找到最好损失函数的游戏,但现实中输入神经网络的参数旋钮实在是太多了!比如说,GPT3有1750亿个参数。这一问题,就是限制神经网络发展非常重要的因素。
下面介绍找到如此大量最好参数设置的方法,就是利用反向传播算法,计算出每个参数的导数,接着用梯度下降法,每次让这些参数变化一点点,不断地向着更好的参数演化和移动,最后整个神经网络理解掌握数据中的规律,学会底层函数,并获得这种我们想要的智能。
梯度下降(Gradient Descent)
梯度下降是一种基于目标函数梯度的迭代优化算法,用于寻找函数的最小值(如损失函数的最小值)。其核心思想是沿梯度反方向逐步调整参数,以逼近最优解。
梯度定义:梯度是多元函数在当前位置的偏导数向量,指向函数值上升最快的方向。也是曲面在局部最陡峭的方向。例如,函数 f(x,y) 的梯度为
∇
f
=
(
∂
f
∂
x
,
∂
f
∂
y
)
\nabla f = \left( \frac{\partial f}{\partial x}, \frac{\partial f}{\partial y} \right)
∇f=(∂x∂f,∂y∂f)
参数更新公式:
θ
k
+
1
=
θ
k
−
η
⋅
∇
θ
J
(
θ
k
)
\theta_{k+1} = \theta_k - \eta \cdot \nabla_\theta J(\theta_k)
θk+1=θk−η⋅∇θJ(θk)
其中,θ 是待优化参数,η 是学习率(步长),J(θ) 是损失函数。
常见的梯度下降算法包括批量梯度下降(BGD)、随机梯度下降(SGD)、自适应时刻估计方法(Adam)等。
梯度下降的精神:每次减小一点点
B站北冥孤鲤 :‘’梯度本身就是一个向量,以一座山为例,梯度就是一个指向最陡峭上坡方向的单位向量,梯度的反方向当然就是下坡最快的方向。 但是有一个问题,就是你以在该点的最快下坡方向,迈了一步走到了下一个点,这其实并不是完全最快的。因为每一个点都有都独属于自己的最快下坡方向,你全都用上一个点的方向一步迈过去了。因此就要控制步长,就是视频里说的学习率。 所以我们可以发现,学习率(步长)太大,下降最优参数会被忽略掉,学习率太小学(步长),太小,就会学习的很慢。‘’
损失函数和梯度下降的区别
反向传播(Back propagation)
反向传播是神经网络中高效计算梯度的算法,通过链式法则将损失误差从输出层逐层反向传播至输入层,为梯度下降提供参数更新依据。
核心机制
-
前向传播:输入数据通过神经网络各层逐层计算,得到预测结果。例如,输入 x 经过线性变换和激活函数生成输出 y
-
误差计算:通过损失函数(如均方误差、交叉熵)量化预测与真实值的差异。
-
反向传播:
-
链式法则:将损失对参数的偏导数分解为各层梯度的乘积。例如,第 L 层的梯度为:
∂ L ∂ W l = ∂ L ∂ y ^ ⋅ ∂ y ^ ∂ h l ⋅ ∂ h l ∂ W l \frac{\partial L}{\partial W_l} = \frac{\partial L}{\partial \hat{y}} \cdot \frac{\partial \hat{y}}{\partial h_l} \cdot \frac{\partial h_l}{\partial W_l} ∂Wl∂L=∂y^∂L⋅∂hl∂y^⋅∂Wl∂hl -
梯度累积:从输出层到输入层逐层计算并累积梯度。
-
神经网络是如何举一反三的呢——泛化(Generalization)
神经网络的泛化能力是指模型在训练数据之外的未见数据(测试数据或真实世界数据)上的表现能力。它是衡量模型实用性和鲁棒性的核心指标。
关键:推广、举一反三、活学活用
神经网络有很强的泛化能力,比如在识别图片训练中,虽然在训练数据时它没有见过一模一样的图片,但它可以在训练中发现这些输入的图片和标签之间的趋势、微妙的关联性。这正是神经网络十分强大的一点,我们只需输入数据,那么底层抽象的趋势和规律,只需要交给神经网络,它自己学就可以学明白了。
4.5 激活函数
激活函数是神经网络中的核心组件之一,用于==引入非线性特性,使神经网络能够学习和表示复杂的模式(从线性表示到非线性表示)。==在深度学习中,激活函数的作用是将输入信号转换为输出信号,从而决定神经元是否被激活以及如何传递信息。
1. 激活函数的作用
- 引入非线性:如果没有激活函数,神经网络的每一层都只是线性变换的叠加,最终的结果仍然是一个线性模型,无法解决复杂的非线性问题。
- 控制信息流动:激活函数可以过滤掉不必要的信息,增强有用的信息。
- 模拟生物神经元的行为:类似于生物神经元只有在输入达到一定阈值时才会“激活”,激活函数也可以起到类似的作用。
2. 常见的激活函数
(1)Sigmoid
公式:
f
(
x
)
=
1
1
+
e
−
x
f(x) = \frac{1}{1 + e^{-x}}
f(x)=1+e−x1
特点:
- 输出范围: ( 0 , 1 ) (0, 1) (0,1)
- 平滑且连续,便于梯度计算。
- 缺点:
- 容易导致梯度消失问题(当输入过大或过小时,梯度接近于零)。(注:因为Sigmoid导数的取值区间为0~0.25,如果在每层神经网络的输出节点都使用Sigmoid作为激活函数,那么在后向传播的过程中每逆向经过一个节点,就要乘上一个Sigmoid的导数值,也即梯度值大小每次都会变为原来的四分之一,如果模型达到了一定的深度,那么后相传播会导致梯度值越来越小,直到梯度消失。)
- 计算复杂度较高(涉及指数运算)。
- Sigmoid函数的输出值恒大于0,会导致模型在优化过程中收敛速度变慢。
适用场景:
- 二分类问题的输出层。
- 需要概率解释的场景。
(2)Tanh(双曲正切)
公式:
f
(
x
)
=
tanh
(
x
)
=
e
x
−
e
−
x
e
x
+
e
−
x
f(x) = \tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}}
f(x)=tanh(x)=ex+e−xex−e−x
特点:
- 输出范围:$ (-1, 1) $,输出结果是零中心数据,所以解决了激活函数在优化过程中收敛速度变慢的问题。
- 中心对称,均值接近于0,有助于梯度传播。
- 缺点:
- 同样存在梯度消失问题。
适用场景:
- 隐藏层的激活函数。
- 数据分布中心化的情况。
(3)ReLU(Rectified Linear Unit)
公式:
f
(
x
)
=
max
(
0
,
x
)
f(x) = \max(0, x)
f(x)=max(0,x)
特点:
- 输出范围: [ 0 , + ∞ ) [0, +\infty) [0,+∞)
- 计算简单高效,避免了指数运算。
- 能够有效缓解梯度消失问题。
- 缺点:
- 存在“死亡ReLU”问题(当输入小于0时,梯度恒为0,神经元可能永远不被激活)。
- 输出不是零均值。
适用场景:
- 深度神经网络的隐藏层。
- 高维数据处理任务。
(4)Leaky ReLU
公式:
f
(
x
)
=
{
x
if
x
>
0
α
x
if
x
≤
0
f(x) = \begin{cases} x & \text{if } x > 0 \\ \alpha x & \text{if } x \leq 0 \end{cases}
f(x)={xαxif x>0if x≤0
其中,
α
\alpha
α 是一个小的正数(通常为0.01)。
特点:
- 解决了ReLU的“死亡ReLU”问题。
- 当输入为负时,仍然有一定的梯度。
- 缺点:
- 参数 α \alpha α需要手动设置或通过训练调整。
适用场景:
- 存在较多负值输入的场景。
(5)ELU(Exponential Linear Unit)
公式:
f
(
x
)
=
{
x
if
x
>
0
α
(
e
x
−
1
)
if
x
≤
0
f(x) = \begin{cases} x & \text{if } x > 0 \\ \alpha (e^x - 1) & \text{if } x \leq 0 \end{cases}
f(x)={xα(ex−1)if x>0if x≤0
特点:
- 输出均值更接近于0,有助于梯度传播。
- 对负值输入有更强的鲁棒性。
- 缺点:
- 计算复杂度较高(涉及指数运算)。
适用场景:
- 深度网络的隐藏层。
- 需要快速收敛的任务。
(6)Softmax
公式:
f
(
x
i
)
=
e
x
i
∑
j
=
1
n
e
x
j
f(x_i) = \frac{e^{x_i}}{\sum_{j=1}^n e^{x_j}}
f(xi)=∑j=1nexjexi
特点:
- 输出范围: ( 0 , 1 ) (0, 1) (0,1),并且所有输出的和为1。
- 常用于多分类问题的输出层。
- 缺点:
- 计算复杂度较高。
适用场景:
- 多分类问题的输出层。
3. 如何选择激活函数?
- 隐藏层:
- 默认选择ReLU(简单高效)。
- 如果出现“死亡ReLU”问题,可以尝试Leaky ReLU或ELU。
- 对于非常深的网络,可以尝试Swish。
- 输出层:
- 二分类问题:Sigmoid。
- 多分类问题:Softmax。
- 回归问题:通常不需要激活函数(直接输出原始值)。
4. 注意事项
- 梯度消失与爆炸:激活函数的选择直接影响梯度的传播,需根据具体任务选择合适的激活函数。
- 计算效率:某些激活函数(如Sigmoid、Softmax)涉及指数运算,可能会增加计算开销。
- 初始化方法:激活函数的表现也依赖于权重初始化方法(如Xavier初始化、He初始化等)。
总结来说,激活函数是神经网络的核心组件,其选择和使用对模型的性能至关重要。不同的激活函数适用于不同的场景,结合任务需求和实验结果进行选择是最优策略。
五、张量
张量(Tensor)是计算机科学和深度学习中的核心概念,本质上是==多维数组==的扩展形式。它不仅能够表示标量、向量、矩阵等传统数学对象,还能处理更高维度的数据。
一、张量的基本概念
- 定义与维度:
- 标量(0阶张量):单个数值(如
3.0
)。 - 向量(1阶张量):一维数组(如
[1, 2, 3]
)。 - 矩阵(2阶张量):二维数组(如
[[1,2], [3,4]]
)。 - 高阶张量:三维及以上(如
3×28×28
的图像批次)。 - 通用定义:一个 n n n 维张量可表示为 R d 1 × d 2 × ⋯ × d n \mathbb{R}^{d_1 \times d_2 \times \cdots \times d_n} Rd1×d2×⋯×dn,其中 d i d_i di 是各维度的大小。iokkoioioikoikooo
- 标量(0阶张量):单个数值(如
- 关键属性:
- 形状(Shape):各维度的长度(如
(64, 3, 224, 224)
表示一批64张RGB图像)。 - 数据类型(Data Type):如
float32
、int64
,影响计算精度和内存占用。 - 设备(Device):张量可存储在CPU或GPU上,后者用于加速计算。
- 形状(Shape):各维度的长度(如
二、张量与深度学习的关系
深度学习依赖张量作为数据表示和计算的基础工具,原因如下:
1. 数据的高效表示
- 输入数据:张量统一表示各种类型的数据:
- 图像:四维张量
(批次大小, 高度, 宽度, 通道数)
。 - 文本:三维张量
(批次大小, 序列长度, 词向量维度)
。 - 视频:五维张量
(批次大小, 时间帧, 高度, 宽度, 通道)
。
- 图像:四维张量
- 模型参数:神经网络的权重和偏置均以张量形式存储。例如,全连接层的权重是二维张量
(输入维度, 输出维度)
,卷积核是四维张量(输出通道数, 输入通道数, 核高度, 核宽度)
。
2. 计算的核心载体
- 张量运算:深度学习模型本质上是张量操作链:
- 线性运算:矩阵乘法(如全连接层)。
- 非线性激活:如
ReLU
对张量逐元素操作。 - 卷积运算:通过滑动窗口处理空间或时序数据。
- 池化:降维操作(如最大池化)。
- 自动微分:框架(如PyTorch、TensorFlow)通过张量的计算图追踪梯度,实现反向传播。
3. 硬件加速优化
- GPU/TPU并行计算:张量操作(矩阵运算)天然适合并行化,GPU可同时处理数千个计算核心,加速训练。
- 内存连续性:张量在内存中以连续块存储,便于优化数据传输和缓存利用。
三、深度学习框架中的张量
主流框架(如 PyTorch、TensorFlow)围绕张量构建,提供以下功能:
- 创建与操作:
- 支持从NumPy数组转换、随机初始化等方式创建张量。
- 提供丰富的API(如切片、重塑、转置、广播)。
- 自动微分:
- 张量携带梯度信息(如PyTorch的
requires_grad=True
)。
- 张量携带梯度信息(如PyTorch的
- 分布式计算:
- 支持跨多GPU或集群的张量分片计算。
示例(PyTorch):
import torch
# 创建一个3×3的随机张量(设备为GPU)
x = torch.randn(3, 3, device="cuda")
# 张量运算:矩阵乘法
y = x @ x.T
# 自动微分
x.requires_grad = True
loss = y.sum()
loss.backward() # 计算梯度
四、张量的应用场景
- 计算机视觉:
- 卷积层处理四维图像张量(
N×C×H×W
)。
- 卷积层处理四维图像张量(
- 自然语言处理:
- 词嵌入将单词映射为向量(三维张量
N×SeqLen×EmbedDim
)。
- 词嵌入将单词映射为向量(三维张量
- 强化学习:
- 状态和动作空间用张量表示。
五、张量与矩阵的区别
- 矩阵是二维的,而张量可以是任意维度。
- 运算扩展:张量支持更复杂的操作(如张量积、逐元素运算、广播机制)。
总结
张量是深度学习的“原子单位”,它统一了数据表示和数学运算,使得复杂模型(如CNN、Transformer)得以高效实现。深度学习框架通过优化张量计算(如GPU加速、自动微分),推动了人工智能技术的快速发展。理解张量是掌握深度学习的基础,也是优化模型性能的关键。
文章内容思路参考