← 返回信息流
AI 资讯Hacker News·3 小时前

用Python构建最小神经网络:感知机详解

原标题:The Smallest Brain You Can Build: A Perceptron in Python

速览

本文通过Python代码演示如何构建感知机,这是神经网络中最基础的单元。文章详细解释了感知机的工作原理及其在机器学习中的核心地位,帮助读者理解人工智能的底层逻辑。

AI 深度解读

你能构建的最小“大脑”:用 Python 从零实现感知机

背景

感知机(Perceptron)常被称为“你能构建的最小大脑”。它结构简单得令人难以置信:一个数字输入,一个“是”或“否”的输出。这就是它的全部。

听起来这似乎微不足道,但这一微小的概念却是当今所有运行中的神经网络的种子。在 1958 年,研究人员 Frank Rosenblatt 构建了一台他称为感知机的机器。它受单个脑细胞——神经元的启发:神经元接收信号,如果信号足够强,它就会“发射”(fire)。Rosenblatt 用数学复制了这一想法,将其简化为最基础的二元分类逻辑。

尽管作者自称非英语母语者且仍在该领域学习,但他选择了一种“从零开始、循序渐进”的方式来解释这一概念,摒弃了复杂的数学推导和庞大的库依赖,仅保留一个权重、一个偏置和一个循环。

核心内容

什么是感知机?

感知机的核心公式如下:

$$ \text{output} = \begin{cases} 1 & \text{if } (w \cdot x + b) > 0 \ 0 & \text{otherwise} \end{cases} $$

其中:

  • $x$ 是输入(Input)。
  • $w$ 是权重(Weight)。
  • $b$ 是偏置(Bias)。

人类决策类比

在机器做出任何决定之前,我们先观察人类的决策过程。假设 John Doe 收到一份工作邀请,他需要回答:“我应该接受吗?”

John 不会抛硬币,而是权衡各种因素。某些因素对他来说更重要。他会将每个因素乘以他关心的程度(权重),然后加总所有结果。如果总和足够高,他说“是”;否则说“否”。

  • 因素 = 输入
  • 关心的程度 = 权重
  • “足够高”的阈值 = 偏置(Bias)

最简单的决策:判断数字是否为正

让我们将问题简化到极致:只有一个输入,一个问题——“这个数字是正数吗?”

机器通过以下公式进行猜测: $$ \text{prediction} = (weight \times value + bias) > 0 $$

  1. 输入乘以权重,加上偏置。
  2. 检查结果是否大于零。
  3. 如果是,预测为 True;否则为 False

这个公式被称为分类器或决策函数。起初,权重和偏置是随机数字,因此机器猜测得很糟糕。学习的核心在于从错误中修正:

if prediction != result:
    error = result - prediction # True - False = 1, False - True = -1
    weight += learning_rate * error * value
    bias += learning_rate * error
  • 错误(Error):告诉我们要朝哪个方向调整。
  • 学习率(Learning Rate):决定每次调整的幅度。
  • Epoch(轮次):遍历所有数据的一次完整过程。重复 Epoch 就是训练。

在可视化演示中,绿色点代表正数(True),红色点代表负数(False),蓝色虚线是决策边界。对于“判断正负”这个问题,决策边界迅速稳定在 0 附近,偏置也接近 0。这是因为在此特定问题中,偏置并非必需。

什么是决策边界?

那条蓝色的线被称为决策边界(Decision Boundary),即机器从说“False”翻转为“True”的确切点。

我们可以通过公式计算它。当 $w \cdot x + b = 0$ 时,边界出现。解出 $x$:

$$ \text{decision_boundary} = -\frac{bias}{weight} $$

为什么需要偏置?学生及格案例

为了理解偏置的重要性,我们看一个更复杂的问题:根据 0-100 分的考试成绩判断学生是否及格(50 分及以上及格)。

  • 理想情况:决策边界应在 50,而不是 0。
  • 仅使用权重(关闭偏置):公式变为 $weight \times score$。由于分数都是正数,如果权重为正,机器会判定所有人及格;如果权重为负,判定所有人不及格。边界被固定在 0,无法移动。准确率会卡在 50% 左右无法提升。
  • 使用偏置:准确率可升至 100%,边界滑动并停留在 50 附近。

偏置的作用:权重决定斜率,而偏置左右移动边界,使其能够位于任何位置。

关键记忆句:当你的输入远离零时,你需要一个偏置来将线移动到它们所在的位置。

学习过程:Epochs 和 Learning Rate

  • Epoch(轮次):数据的一次完整遍历。机器很少在一次遍历中就能完全正确,因此需要多次迭代以修正错误。
  • Learning Rate(学习率):每次修正的大小。
    • 步长太小:谨慎但缓慢。
    • 步长太大:快速但可能过冲(Overshoot)并在周围震荡。
    • 文中示例使用 0.1,这是一个足够温和以保持稳定的值。

为什么要归一化数据(Normalization)?

在及格案例中,如果不开启归一化,由于输入值(分数)可能高达 100,单次错误猜测会导致权重发生巨大跳变,导致准确率曲线剧烈震荡。

归一化的作用

  1. 加速收敛:将输入缩小到小范围(如 0-1),使学习过程平滑且快速。
  2. 公平性:当输入特征尺度差异巨大时(例如 John Doe 案例中的“薪水”是数千美元,而“同城市”是 0 或 1),如果不归一化,大数值特征会淹没小数值特征。归一化让每个因素都有公平的话语权。

文中提到最简单的归一化是除以最大值,而更通用的方法是标准化(Standardization):减去均值并除以标准差。

Python 完整实现

以下是判断“数字是否为正”的完整感知机代码,未隐藏任何细节:

import random

learning_rate = 0.1
EPOCHS = 100

# 初始化随机权重和偏置
weight = random.uniform(-1, 1)
bias = random.uniform(-1, 1)

# 生成数据:正数为 True,负数为 False
data = [(i * 0.1, True) for i in range(1, 501)]
data += [(i * 0.1, False) for i in range(-500, 0)]
random.shuffle(data)

# 训练循环
for epoch in range(EPOCHS):
    for value, result in data:
        # 预测
        prediction = (weight * value + bias) > 0
        
        # 如果预测错误,更新权重和偏置
        if prediction != result:
            error = result - prediction # +1 或 -1
            weight += learning_rate * error * value
            bias += learning_rate * error
            
    # 打印当前决策边界
    decision_boundary = -bias / weight
    print(f"weight = {weight:.3f}")
    print(f"bias = {bias:.3f}")

关键要点

  • 感知机本质:它是神经网络的最小单元,通过线性组合输入($w \cdot x + b$)并应用阈值函数(如符号函数或阶跃函数)进行二元分类。
  • 权重的作用:决定决策边界的斜率(即各个输入特征的重要性)。
  • 偏置的作用:决定决策边界的截距(即边界在空间中的位置)。没有偏置,决策边界必须经过原点,这在大多数实际问题中是受限的。
  • 学习机制:通过计算预测值与真实值的误差,利用梯度下降的思想(尽管文中使用的是简单的误差反馈更新)调整权重和偏置。
  • 学习率的重要性:控制参数更新的步长。过大导致震荡,过小导致收敛慢。

查看原文 →ranpara.net