1. 从“开关”到“大脑”:神经网络的起点——感知机
大家好,我是老张,在AI这个行当里摸爬滚打了十几年,从最早的简单模型一路跟到现在的大模型。今天想和大家聊聊神经网络最核心、最基础的那些事儿。很多朋友一上来就想搞懂Transformer、GPT,但我的经验是,如果不把感知机、多层网络和反向传播(BP)这些地基打牢,后面学起来就像在沙地上盖楼,摇摇晃晃。咱们就从那个最简单的“开关”模型——感知机开始。
想象一下,你要做一个能自动判断今天是否适合打球的装置。它有两个输入:一个是“天气晴朗吗?”(是=1,否=0),另一个是“朋友有空吗?”(是=1,否=0)。你的目标是,只有当两个条件都满足时,装置才亮绿灯(输出1),否则亮红灯(输出0)。这其实就是逻辑“与”运算。感知机干的就是这个活儿。它本质上是一个单层的决策单元,由输入层和输出层组成。输入层负责接收信号(比如天气、朋友状态),每个信号都带有一个权重,你可以把权重理解为这个信号的重要性。比如你觉得“朋友有空”比“天气晴朗”更重要一点,就可以给它分配更大的权重。
这些带权重的信号汇总到输出层的那个神经元里,它会计算一个加权总和,然后和一个预设的阈值(也叫偏置)进行比较。如果总和超过阈值,神经元就“兴奋”,输出1(比如去打球);如果没超过,就“抑制”,输出0(比如宅家)。这个比较和输出的过程,由一个叫激活函数的家伙来完成。最早的感知机用的激活函数是阶跃函数,就像一个硬邦邦的开关,输入超过阈值就“啪”一下跳到1,否则就是0,非常干脆。
用代码来模拟一下这个“与”运算的感知机,会非常直观:
import numpy as np
def step_function(x):
"""阶跃激活函数"""
return 1 if x >= 0 else 0
def perceptron_and(x1, x2):
"""实现逻辑与的感知机"""
# 手动设置权重和阈值(偏置)
w1, w2 = 0.5, 0.5 # 两个输入的权重,这里假设同等重要
theta = 0.7 # 阈值
weighted_sum = x1*w1 + x2*w2
# 将加权总和减去阈值,输入激活函数
return step_function(weighted_sum - theta)
# 测试四种输入情况
print(f"(0, 0) -> {perceptron_and(0, 0)}") # 输出应为 0
print(f"(0, 1) -> {perceptron_and(0, 1)}") # 输出应为 0
print(f"(1, 0) -> {perceptron_and(1, 0)}") # 输出应为 0
print(f"(1, 1) -> {perceptron_and(1, 1)}") # 输出应为 1
运行这段代码,你会发现它完美地实现了“与”逻辑。通过调整权重w1、w2和阈值theta,这个简单的感知机也能实现“或”、“非”运算。听起来很强大,对吧?但这里埋着一个巨大的坑,也是当年让神经网络研究陷入低谷的“阿喀琉斯之踵”:它解决不了异或问题。
什么是异或?就是“二者不同时为真”。比如,天气好和朋友有空,只满足其中一条时才去打球(输出1),两条都满足或都不满足时都不去(输出0)。你试着在纸上画个坐标轴,用点表示(0,0), (0,1), (1,0), (1,1)这四种输入,并标记对应的输出。你会发现,你永远无法用一条直线把输出为1的点((0,1)和(1,0))和输出为0的点((0,0)和(1,1))完全分开。这就是非线性可分问题。单层感知机的能力极限就是画一条直线(在三维空间里是一个平面)来分类,面对异或这种需要一条曲线(或折线)才能分开的情况,它就彻底抓瞎了,在学习过程中会陷入无限振荡,永远找不到正确的权重。
注意:这个“线性可分”的局限性是神经网络发展史上的一个重要转折点。它直接告诉我们,单层的网络结构能力有限,要想处理更复杂的现实问题(比如图像识别、自然语言理解),我们必须堆叠更多的层,引入非线性。这也就引出了我们下一节要讲的,真正强大的武器——多层前馈神经网络。
2. 堆叠的力量:多层前馈神经网络如何成为万能逼近器
既然一层不够用,那很自然的想法就是:多加几层。这就好比单兵作战能力有限,我们就组建一个多兵种协同的军团。多层前馈神经网络


1万+

被折叠的 条评论
为什么被折叠?



