从线性到非线性:感知器如何诞生深度学习
更多专栏文章点击查看:
LLM 架构专栏
大模型架构专栏文章阅读指南
Agent系列
强化学习系列
欢迎加入大模型交流群:加群链接 https://docs.qq.com/doc/DS3VGS0NFVHNRR0Ru#
知乎【柏企】
个人网站:https://www.chenbaiqi.com
在《神经网络系列:源起》中,我们探索了神经网络的基本组成部分——感知器。我们看到了这个简单的、受神经元启发的模型是如何通过权衡输入、求和,然后根据阈值“发射”或不“发射”来做出决策的。我们介绍了感知器作为生物神经元的数字模仿,能够学习基本模式和分类。
但是这个故事并没有以一个感知器结束。虽然作为一个起点非常有洞察力,但一个单独的感知器有一个基本的限制:它在一个线性的世界中运行。为了真正释放神经网络的力量,解决现实世界数据的复杂性,我们需要超越线性,拥抱非线性函数的世界。这就是感知器的概念发挥作用的地方,催生了深度学习领域。
感知器:复杂世界中的直线(快速回顾)
让我们简要回顾一下感知器的性质。感知器的核心是执行一个简单的计算:它接受输入,将它们乘以权重,添加偏差,然后将这个总和传递给激活函数。对于最简单的感知器来说,这个激活函数通常是一个步进函数 ——本质上是一个尖锐的开/关开关。
从数学上讲,单个感知器基本上实现了一个线性函数 。想象一下在图表上绘制您的数据。感知器的决策边界始终是一条直线(或更高维度的超平面)。它擅长于属于不同类的数据点可以被直线整齐分隔的任务——这些问题被认为是线性可分离的 。
想想根据大小和颜色对苹果和橘子进行分类。如果你能在“大小与颜色”的图表上画一条直线,完美地将所有苹果和所有橘子分开,一个感知器就可以学会进行这种分类。
然而,现实世界很少如此整齐地组织起来。数据往往是复杂的、杂乱的、非线性可分离的 。输入和输出之间的许多关系不是直线,而是曲线、弯曲和复杂的形状。这就是单个感知器的局限性变得显而易见的地方。
异或挑战:当一条线不够时
为了说明这个限制,让我们考虑神经网络早期的一个经典问题:异或问题 (异或)。
XOR是一种逻辑运算,其中只有当_一个_ 输入为真时,输出才为真(1),但不能同时为真。这是真值表:
现在,将这些数据点可视化在图表上,其中输入1是x轴,输入2是y轴。试着画一条直线,将XOR为1的情况(点(0,1)和(1,0))与XOR为0的情况(点(0,0)和(1,1))分开。
你很快就会意识到这是不可能的!无论你如何定位一条直线,你都不能把这些点干净地分成两个XOR输出类。这是因为XOR问题不是线性可分的 。
这个简单的例子暴露了单个感知器的一个重要限制。如果我们仅限于单个感知器,我们对复杂的现实世界问题进行建模的能力将受到严重限制。我们需要一种摆脱这种线性约束的方法。
堆叠感知器:为复杂性构建深度
巧妙的解决方案是将感知器分层堆叠在一起。想象一下,不要只创建一个感知器,而是创建一个由它们组成的网络,排列在多个相互连接的层中。这是多层感知器(MLPs) 背后的基本思想,也称为前馈神经网络 。
想想用乐高积木建造。单个乐高积木(感知器)既简单又有限。但是当你组合许多乐高积木,将它们以层和结构连接起来时,你可以构建令人难以置信的复杂和复杂的创作。MLPs类似于此——通过堆叠感知器,我们可以构建更强大、更通用的模型。
在MLP中,感知器被组织成至少三种类型的层(正如您已经阅读过的那样):
- 输入层: 第一层,接收原始输入数据。
- 隐藏层: 输入层和输出层之间的一层或多层。这些是“隐藏的”,因为它们的输出对外部世界不直接可见;它们是中间处理阶段。
- 输出层: 最后一层,产生网络的最终输出。
关键的方面是一层中的每个神经元连接到后续层中的神经元(通常每个前一层神经元连接到下一层中的所有神经元)。 一层中神经元的输出成为下一层神经元的输入。这通过网络创建了信息流。
非线性出现:打破线性障碍
简单地堆叠线性感知器本身并不能解决线性问题。如果我们只在整个网络中使用线性运算和阶跃函数,整个网络仍然有效地执行从输入到输出的线性变换——只是更复杂的线性变换。我们仍然仅限于线性可分离问题。它将只是嵌套的线性函数!
解锁非线性的神奇成分是在隐藏层的感知器中引入非线性激活函数。我们可以使用其他激活函数,将曲线和弯曲引入神经元的输出,而不仅仅是一个简单的阶跃函数。
想想常见的非线性激活函数,如sigmoid函数 (S形)或ReLU(整流线性单元) 函数(看起来像一个斜坡)。当应用于堆叠层时,这些函数允许网络学习和表示数据中复杂的非线性关系。只需将下图视为激活函数而不是阶跃函数
可视化非线性:
现在想象一下,我们的决策边界可以是曲线、圆形和复杂形状,而不仅仅是直线。通过用非线性激活函数堆叠感知器,我们本质上创造了在数据空间中雕刻任意复杂区域的能力。
回到异或问题,即使是具有单个隐藏层(具有多个感知器)和非线性激活函数的MLP也可以轻松解决它。隐藏层允许网络学习中间表示,有效地将非线性可分离异或问题转换为高维空间中的线性可分离问题。让我们设计这个MLP:
- 输入层: 我们需要取两个输入,对应于XOR运算的两个输入(输入1和输入2)。所以,我们的输入层将有2个神经元 。
- 隐藏层: 单个隐藏层足以解决异或问题。为简单起见,让我们使用具有2个神经元 的隐藏层。这些权重将通过训练计算,但我们现在将手动设置它们。权重将是[1,1,1,-1],偏差将是[-1,0]。
- 输出层: 我们希望MLP输出一个值,表示XOR结果(0或1)。因此,我们的输出层将有1个神经元 。输出层的权重是[1,-2]。
- 激活函数: 对于非线性,我们将对隐藏层和输出层使用sigmoid激活函数 。sigmoid函数具有特征性的S形状,将值压缩在0和1之间,引入关键的非线性。
这将有效地区分异或的0和1输出。
很难想象,因为它变得越来越复杂,但这就是我们能够在机器中映射智能的原因。
import numpy as np
def sigmoid(x):
"""Sigmoid激活函数。"""
return 1 / (1 + np.exp(-x))
def xor_mlp_forward_pass(x1, x2):
"""
具有2个神经元的MLP的前向传播,用于计算XOR。
参数:
x1:输入1(0或1)
x2:输入2(0或1)
返回:
y_out:MLP的输出(近似XOR结果)
"""
# --- 定义权重和偏差(针对XOR示例硬编码)---
w1_h1, w2_h1, b_h1 = 1, 1, -1
w1_h2, w2_h2, b_h2 = 1, -1, 0
w_h1_out, w_h2_out, b_out = 1, -2, 0
# --- 隐藏层计算 ---
# 隐藏神经元1
z_h1 = (x1 * w1_h1) + (x2 * w2_h1) + b_h1
h1 = sigmoid(z_h1)
# 隐藏神经元2
z_h2 = (x1 * w1_h2) + (x2 * w2_h2) + b_h2
h2 = sigmoid(z_h2)
# --- 输出层计算 ---
z_out = (h1 * w_h1_out) + (h2 * w_h2_out) + b_out
y_out = sigmoid(z_out)
return y_out
# --- 测试XOR输入的函数 ---
inputs = [(0, 0), (0, 1), (1, 0), (1, 1)]
print("XOR MLP结果:")
for input_pair in inputs:
x1, x2 = input_pair
output = xor_mlp_forward_pass(x1, x2)
print(f"输入: ({x1}, {x2}), 输出: {output:.4f}")
深度学习的诞生(原则上):
这种通过堆叠感知器和使用非线性激活函数来建模非线性关系的能力是深度学习 的概念基础。深度学习中的“深度”是指这些网络的深度 ——多个隐藏层的存在。
这些隐藏层不仅仅是为了展示;它们对于学习数据的分层和日益抽象的表示至关重要。第一个隐藏层可能学习简单的特征(如图像中的边缘),下一个层可能将这些特征组合成更复杂的形状(如角落或纹理),依此类推,直到更深的层能够识别非常高级的概念(如对象或场景)。
这种分层特征学习允许深度神经网络处理图像识别、自然语言处理和许多其他领域中难以置信的复杂任务。类似地,简单的乘法/加法将在每个神经元连接处变成矩阵乘法/加法。一个神经元上的矩阵将具有连接到这个神经元的所有前一层神经元的权重。
从简单的单元到强大的系统
我们已经从单一线性感知器的限制,到将它们堆叠成多层非线性网络所释放的力量。这种简单单元的“堆叠”,加上非线性的巧妙应用,是推动神经网络从理论好奇心转变为变革性技术的关键创新。
从本质上讲,深度学习是建立在通过简单的、受神经元启发的单元的分层网络创造深度和非线性的原则之上的。这证明了相对简单的组件的智能排列是如何产生复杂的行为的。
下一篇文章:
“超越步骤:揭开激活函数——神经网络非线性的秘诀。”
评论