【深度学习-Day 12】从零认识神经网络:感知器原理、实现与局限性深度剖析

news2025/5/19 0:43:11

Langchain系列文章目录

01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南
02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖
03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南
04-玩转 LangChain:从文档加载到高效问答系统构建的全程实战
05-玩转 LangChain:深度评估问答系统的三种高效方法(示例生成、手动评估与LLM辅助评估)
06-从 0 到 1 掌握 LangChain Agents:自定义工具 + LLM 打造智能工作流!
07-【深度解析】从GPT-1到GPT-4:ChatGPT背后的核心原理全揭秘
08-【万字长文】MCP深度解析:打通AI与世界的“USB-C”,模型上下文协议原理、实践与未来

Python系列文章目录

PyTorch系列文章目录

机器学习系列文章目录

深度学习系列文章目录

Java系列文章目录

JavaScript系列文章目录

深度学习系列文章目录

01-【深度学习-Day 1】为什么深度学习是未来?一探究竟AI、ML、DL关系与应用
02-【深度学习-Day 2】图解线性代数:从标量到张量,理解深度学习的数据表示与运算
03-【深度学习-Day 3】搞懂微积分关键:导数、偏导数、链式法则与梯度详解
04-【深度学习-Day 4】掌握深度学习的“概率”视角:基础概念与应用解析
05-【深度学习-Day 5】Python 快速入门:深度学习的“瑞士军刀”实战指南
06-【深度学习-Day 6】掌握 NumPy:ndarray 创建、索引、运算与性能优化指南
07-【深度学习-Day 7】精通Pandas:从Series、DataFrame入门到数据清洗实战
08-【深度学习-Day 8】让数据说话:Python 可视化双雄 Matplotlib 与 Seaborn 教程
09-【深度学习-Day 9】机器学习核心概念入门:监督、无监督与强化学习全解析
10-【深度学习-Day 10】机器学习基石:从零入门线性回归与逻辑回归
11-【深度学习-Day 11】Scikit-learn实战:手把手教你完成鸢尾花分类项目
12-【深度学习-Day 12】从零认识神经网络:感知器原理、实现与局限性深度剖析


文章目录

  • Langchain系列文章目录
  • Python系列文章目录
  • PyTorch系列文章目录
  • 机器学习系列文章目录
  • 深度学习系列文章目录
  • Java系列文章目录
  • JavaScript系列文章目录
  • 深度学习系列文章目录
  • 前言
  • 一、神经网络的灵感之源:生物神经元
    • 1.1 生物神经元简介
      • 1.1.1 结构与功能
      • 1.1.2 信息传递方式
    • 1.2 从生物到人工:模型的抽象
      • 1.2.1 关键元素的类比
  • 二、感知器模型 (Perceptron Model)
    • 2.1 感知器的定义与结构
      • 2.1.1 基本组成
      • 2.1.2 数学表示
    • 2.2 激活函数:阶跃函数 (Step Function)
      • 2.2.1 定义与作用
      • 2.2.2 图示阶跃函数
    • 2.3 感知器的学习规则 (简述)
      • 2.3.1 目的
      • 2.3.2 更新规则 (感知器学习算法)
  • 三、感知器的能力与局限性
    • 3.1 线性可分性
      • 3.1.1 感知器能做什么?
      • 3.1.2 代码示例:实现 AND/OR 逻辑门 (Python)
    • 3.2 感知器的致命缺陷:XOR 问题
      • 3.2.1 XOR 逻辑的定义
      • 3.2.2 为什么感知器无法解决 XOR?
      • 3.2.3 历史意义与影响
  • 四、从感知器到神经网络
    • 4.1 克服局限性的思考
      • 4.1.1 多层结构的需求
    • 4.2 展望:多层感知器 (MLP)
  • 五、总结


前言

欢迎来到深度学习系列的第12篇文章!在前面的章节中,我们已经为深度学习之旅奠定了坚实的数学、编程和机器学习基础。我们了解了线性回归和逻辑回归等基本模型,并对模型训练的基本流程有了初步认识。从本篇开始,我们将正式踏入神经网络的核心领域。神经网络是当前人工智能浪潮中最耀眼的技术之一,而理解其最基本的构建单元——感知器(Perceptron)——是至关重要的一步。本文将带你深入了解感知器的概念、工作原理、能力以及其著名的局限性,为后续学习更复杂的神经网络结构打下坚实的基础。

一、神经网络的灵感之源:生物神经元

在深入研究人工神经网络之前,了解一下它们的生物学灵感来源——生物神经元,会非常有帮助。虽然人工神经网络是对生物神经系统的高度简化和抽象,但其核心思想确实源于此。

1.1 生物神经元简介

生物神经元是构成大脑和神经系统的基本单元,负责处理和传递信息。

1.1.1 结构与功能

一个典型的生物神经元主要由以下几个部分组成:

  • 树突 (Dendrites):像树枝一样的结构,负责从其他神经元接收化学或电信号。
  • 细胞体 (Soma):神经元的核心部分,包含细胞核。它整合从树突接收到的所有信号。
  • 轴突 (Axon):一根长的纤维状结构,负责将细胞体处理后的信号传递给其他神经元、肌肉或腺体。
  • 突触 (Synapse):神经元之间的连接点。当信号(动作电位)到达轴突末梢时,会通过突触释放神经递质,这些化学物质作用于下一个神经元的树突,从而传递信号。突触的强度是可以变化的,这构成了学习和记忆的基础。

下图展示了一个简化的生物神经元结构:

生物神经元
信号
汇总信号
处理并产生输出
传递信号
影响
树突 Dendrites
细胞体 Soma
轴突 Axon
突触 Synapse
其他神经元
下一个神经元

1.1.2 信息传递方式

生物神经元通过复杂的电化学过程传递信息。当树突接收到的信号累积到一定阈值时,细胞体会“兴奋”并产生一个称为“动作电位”的电脉冲。这个电脉冲沿着轴突传递到突触,并触发神经递质的释放,进而影响下一个神经元。这个过程可以看作是一种“全或无”的响应:要么神经元被激活并传递信号,要么不被激活。

1.2 从生物到人工:模型的抽象

人工神经网络中的“神经元”(通常指感知器或其变体)正是对生物神经元信息处理机制的一种数学抽象和简化。

1.2.1 关键元素的类比

我们可以将人工神经元的组成部分与生物神经元进行类比:

  • 输入 (Inputs):类似于生物神经元的树突接收到的信号。
  • 权重 (Weights):每个输入都带有一个权重,这可以类比于生物神经元中突触的强度。权重决定了对应输入信号的重要性。
  • 加权和与偏置 (Weighted Sum & Bias):人工神经元会将所有输入信号与其对应的权重相乘后求和,再加上一个偏置项。这可以看作是对细胞体整合信号过程的模拟。偏置项可以理解为神经元固有的激活阈值,调整神经元被激活的难易程度。
  • 激活函数 (Activation Function):加权和与偏置的结果会经过一个激活函数处理,产生最终的输出。这类似于生物神经元达到一定阈值后才会被激活(“放电”)的过程。
  • 输出 (Output):激活函数的输出,类似于生物神经元通过轴突传递出去的信号。

通过这种抽象,科学家们构建了能够模拟生物学习过程的数学模型,即我们接下来要详细讨论的感知器。

二、感知器模型 (Perceptron Model)

感知器(Perceptron)由弗兰克·罗森布拉特(Frank Rosenblatt)在1957年首次提出,是已知最简单、最古老的人工神经网络模型之一。它是一个二分类(binary classification)的线性分类器。

2.1 感知器的定义与结构

一个感知器接收多个二进制输入(通常是0或1,或者-1和1),计算这些输入的加权和,如果这个和超过某个阈值,则输出1(代表一个类别),否则输出0(代表另一个类别)。

2.1.1 基本组成

一个感知器由以下几个关键部分构成:

  • 输入 (Inputs):一组特征值,表示为 x _ 1 , x _ 2 , . . . , x _ n x\_1, x\_2, ..., x\_n x_1,x_2,...,x_n
  • 权重 (Weights):每个输入 x _ i x\_i x_i 都对应一个权重 w _ i w\_i w_i。权重表示该输入对于最终决策的重要性。权重可以是正数也可以是负数。
  • 偏置 (Bias):一个常数项 b b b。偏置可以看作是独立于任何输入的额外参数,它允许我们上下平移决策边界,使得模型有更大的灵活性。如果没有偏置,决策边界必须通过原点。
  • 激活函数 (Activation Function):通常是一个简单的阶跃函数(Step Function),用于根据加权和与偏置的结果产生输出。

2.1.2 数学表示

感知器的计算过程可以分为两步:

  1. 计算加权和 (Weighted Sum):将所有输入与它们对应的权重相乘,然后加上偏置项。这个结果通常用 z z z 表示。

    $$z = (w_1 x_1 + w_2 x_2 + \dots + w_n x_n) + b

    $$如果使用向量表示,令权重向量为 W = [ w _ 1 , w _ 2 , d o t s , w _ n ] T W = [w\_1, w\_2, \\dots, w\_n]^T W=[w_1,w_2,dots,w_n]T X = [ x _ 1 , x _ 2 , d o t s , x _ n ] T X = [x\_1, x\_2, \\dots, x\_n]^T X=[x_1,x_2,dots,x_n]T,则加权和可以表示为:

    $$z = W^T X + b

  2. 通过激活函数得到输出 (Output via Activation Function):将 z z z 输入到激活函数 f f f 中,得到最终的输出 y y y

    $$y = f(z)

    下面是一个感知器的结构示意图:

graph TD
    subgraph 感知器模型
        direction LR
        X1[输入 x1] -->|w1| S((Σ))
        X2[输入 x2] -->|w2| S
        Xd[...] -->|...| S
        Xn[输入 xn] -->|wn| S
        B[偏置 b] --> S
        S -- 加权和 z --> AF[激活函数 f(z)]
        AF -- 输出 y --> O[输出 y]
    end

在这个图中, S i g m a \\Sigma Sigma 表示求和操作,输出 z = s u m w _ i x _ i + b z = \\sum w\_i x\_i + b z=sumw_ix_i+b

2.2 激活函数:阶跃函数 (Step Function)

在经典的感知器模型中,最常用的激活函数是阶跃函数(也称为赫维赛德阶跃函数 Heaviside step function)。

2.2.1 定义与作用

阶跃函数的作用是将感知器的加权和 z z z 映射到一个二进制输出(通常是0或1,或者-1和1)。它引入了一种简单的非线性(尽管这种非线性能力有限),使得感知器能够做出决策。

如果我们将偏置 b b b 视为一个特殊的权重 w _ 0 w\_0 w_0,其对应的输入 x _ 0 x\_0 x_0 恒为1,即 z = s u m _ i = 0 n w _ i x _ i z = \\sum\_{i=0}^{n} w\_i x\_i z=sum_i=0nw_ix_i(其中 w _ 0 = b , x _ 0 = 1 w\_0=b, x\_0=1 w_0=b,x_0=1)。此时,阶跃函数可以定义为:

f ( z ) = { 1 if  z > θ 0 if  z ≤ θ f(z) = \begin{cases} 1 & \text{if } z > \theta \\ 0 & \text{if } z \le \theta \end{cases} f(z)={10if z>θif zθ其中 t h e t a \\theta theta 是一个预设的阈值。

更常见地,当偏置 b b b 显式包含在加权和 z = W T X + b z = W^T X + b z=WTX+b 中时,阶跃函数通常定义为(阈值为0):

KaTeX parse error: Expected 'EOF', got '&' at position 29: …begin{cases} 1 &̲ \\text{if } z …这意味着如果加权和大于0,感知器“激活”并输出1;否则,它输出0。

2.2.2 图示阶跃函数

阶跃函数(以阈值为0为例)的图像如下:

xychart-beta
  title "阶跃函数 (Step Function)"
  x-axis [-5, 5]
  y-axis [-0.5, 1.5]
  line [{ x: -5, y: 0 }, { x: 0, y: 0 }]
  line [{ x: 0, y: 1 }, { x: 5, y: 1 }]
  point [{x:0, y:0}]
  point [{x:0, y:1}]

(注意:严格来说,在 z = 0 z=0 z=0 处的取值可以定义为0、1或0.5,具体取决于约定。在感知器中,通常将其归为一类,例如 z l e 0 z \\le 0 zle0 输出0。)

2.3 感知器的学习规则 (简述)

感知器的“学习”过程就是调整其权重 w _ i w\_i w_i 和偏置 b b b 的过程,目标是使得对于给定的训练数据集,感知器的输出能够尽可能地与真实的标签一致。

2.3.1 目的

学习的目的是找到一组权重和偏置,使得感知器能够正确地将输入数据点划分到它们各自的类别中。

2.3.2 更新规则 (感知器学习算法)

感知器学习算法是一个迭代的过程。对于训练集中的每一个样本 ( X , y _ t r u e ) (X, y\_{true}) (X,y_true)(其中 X X X 是输入特征向量, y _ t r u e y\_{true} y_true 是真实标签):

  1. 使用当前的权重 W W W 和偏置 b b b 计算感知器的输出 y _ p r e d = f ( W T X + b ) y\_{pred} = f(W^T X + b) y_pred=f(WTX+b)
  2. 计算误差: e r r o r = y _ t r u e − y _ p r e d error = y\_{true} - y\_{pred} error=y_truey_pred
  3. 如果 e r r o r n e 0 error \\ne 0 errorne0(即预测错误),则更新权重和偏置:
    • w _ i ( t e x t n e w ) = w _ i ( t e x t o l d ) + e t a c d o t e r r o r c d o t x _ i w\_i(\\text{new}) = w\_i(\\text{old}) + \\eta \\cdot error \\cdot x\_i w_i(textnew)=w_i(textold)+etacdoterrorcdotx_i (对每个权重 w _ i w\_i w_i)
    • b ( t e x t n e w ) = b ( t e x t o l d ) + e t a c d o t e r r o r b(\\text{new}) = b(\\text{old}) + \\eta \\cdot error b(textnew)=b(textold)+etacdoterror
      其中, e t a \\eta eta(eta)是学习率 (learning rate),一个介于0和1之间的小正数,它控制了每次更新的步长。

更新规则的直观理解:

  • 如果 y _ t r u e = 1 y\_{true}=1 y_true=1 y _ p r e d = 0 y\_{pred}=0 y_pred=0(应激活但未激活),则 e r r o r = 1 error = 1 error=1。此时,为了使 z = W T X + b z = W^T X + b z=WTX+b 增大,需要增加那些 x _ i x\_i x_i 为正的输入的权重,并增加偏置。
  • 如果 y _ t r u e = 0 y\_{true}=0 y_true=0 y _ p r e d = 1 y\_{pred}=1 y_pred=1(不应激活但激活了),则 e r r o r = − 1 error = -1 error=1。此时,为了使 z = W T X + b z = W^T X + b z=WTX+b 减小,需要减小那些 x _ i x\_i x_i 为正的输入的权重,并减小偏置。

如果训练数据是线性可分的,感知器学习算法保证能在有限次数的迭代后收敛,即找到一个能够完美划分数据的权重和偏置组合。

三、感知器的能力与局限性

理解感知器能做什么和不能做什么是学习神经网络的关键。

3.1 线性可分性

感知器本质上是一个线性分类器。

3.1.1 感知器能做什么?

感知器能够解决线性可分 (linearly separable) 的问题。在线性代数中,方程 W T X + b = 0 W^T X + b = 0 WTX+b=0 定义了一个 n n n 维空间中的超平面。这个超平面将输入空间分成了两部分。感知器的决策边界就是这个超平面。如果一个数据集中的两类样本可以通过这样一个超平面完美地分开,那么这个问题就是线性可分的。

常见的线性可分问题包括逻辑门,如AND(与门)和OR(或门)。

  • AND门:只有当所有输入都为1时,输出才为1。
  • OR门:只要有任何一个输入为1,输出就为1。

3.1.2 代码示例:实现 AND/OR 逻辑门 (Python)

下面我们用一个简单的 Python 函数来模拟感知器,并展示如何用它来实现 AND 和 OR 逻辑门。

import numpy as np

class Perceptron:
    def __init__(self, input_size, learning_rate=0.1, epochs=100):
        """
        初始化感知器
        :param input_size: 输入特征的数量 (不包括偏置的输入)
        :param learning_rate: 学习率
        :param epochs: 训练迭代次数
        """
        # 初始化权重 (input_size + 1, 其中+1是为了偏置项的权重)
        # np.random.rand 返回 [0, 1) 之间的随机数
        self.weights = np.random.rand(input_size + 1) # w0, w1, ..., wn (w0 is bias weight)
        self.learning_rate = learning_rate
        self.epochs = epochs

    def _step_function(self, z):
        """阶跃激活函数"""
        return 1 if z > 0 else 0

    def predict(self, inputs):
        """
        进行预测
        :param inputs: 输入特征向量 (不包含偏置的 x0=1)
        :return: 预测结果 (0 或 1)
        """
        # 构造带偏置的输入向量 [1, x1, x2, ..., xn]
        inputs_with_bias = np.insert(inputs, 0, 1) # 在索引0处插入1作为偏置的输入
        # 计算加权和 z = w0*1 + w1*x1 + ...
        z = np.dot(self.weights, inputs_with_bias)
        return self._step_function(z)

    def train(self, training_inputs, labels):
        """
        训练感知器
        :param training_inputs: 训练数据集, shape (num_samples, num_features)
        :param labels: 对应的真实标签, shape (num_samples,)
        """
        for _ in range(self.epochs):
            for inputs, label in zip(training_inputs, labels):
                prediction = self.predict(inputs)
                error = label - prediction
                # 更新权重,包括偏置的权重 self.weights[0]
                inputs_with_bias = np.insert(inputs, 0, 1)
                self.weights += self.learning_rate * error * inputs_with_bias
        print("训练完成。最终权重:", self.weights)

# --- AND 门示例 ---
print("训练 AND 门感知器:")
# 输入数据: [[0,0], [0,1], [1,0], [1,1]]
# 对应标签: [0, 0, 0, 1]
and_inputs = np.array([[0,0], [0,1], [1,0], [1,1]])
and_labels = np.array([0, 0, 0, 1])

and_perceptron = Perceptron(input_size=2, learning_rate=0.1, epochs=10) # 通常需要很少的迭代
and_perceptron.train(and_inputs, and_labels)

print("\nAND 门测试:")
for inputs in and_inputs:
    print(f"输入: {inputs}, 预测输出: {and_perceptron.predict(inputs)}")

# 手动设置 AND 门的权重和偏置进行验证 (一种可能的解)
# 例如: w1 = 0.5, w2 = 0.5, bias_weight (w0) = -0.7
# z = -0.7*1 + 0.5*x1 + 0.5*x2
# (0,0) -> z = -0.7 -> 0
# (0,1) -> z = -0.7 + 0.5 = -0.2 -> 0
# (1,0) -> z = -0.7 + 0.5 = -0.2 -> 0
# (1,1) -> z = -0.7 + 1.0 = 0.3 -> 1

# --- OR 门示例 ---
print("\n训练 OR 门感知器:")
# 输入数据: [[0,0], [0,1], [1,0], [1,1]]
# 对应标签: [0, 1, 1, 1]
or_inputs = np.array([[0,0], [0,1], [1,0], [1,1]])
or_labels = np.array([0, 1, 1, 1])

or_perceptron = Perceptron(input_size=2, learning_rate=0.1, epochs=10)
or_perceptron.train(or_inputs, or_labels)

print("\nOR 门测试:")
for inputs in or_inputs:
    print(f"输入: {inputs}, 预测输出: {or_perceptron.predict(inputs)}")

# 手动设置 OR 门的权重和偏置进行验证 (一种可能的解)
# 例如: w1 = 0.5, w2 = 0.5, bias_weight (w0) = -0.2
# z = -0.2*1 + 0.5*x1 + 0.5*x2
# (0,0) -> z = -0.2 -> 0
# (0,1) -> z = -0.2 + 0.5 = 0.3 -> 1
# (1,0) -> z = -0.2 + 0.5 = 0.3 -> 1
# (1,1) -> z = -0.2 + 1.0 = 0.8 -> 1

代码说明:

  • Perceptron 类封装了感知器的逻辑。
  • __init__:初始化权重(包括一个偏置项的权重 self.weights[0])。
  • _step_function:阶跃激活函数。
  • predict:根据当前权重计算输出。输入 inputs 会被添加一个前导1,与偏置权重 self.weights[0] 相乘。
  • train:实现感知器学习规则,迭代更新权重。

运行上述代码,你会看到感知器能够通过训练学会正确分类AND门和OR门的输入。

3.2 感知器的致命缺陷:XOR 问题

尽管感知器能够解决像AND和OR这样的简单问题,但它有一个著名的局限性:它无法解决异或 (XOR, exclusive OR) 问题。

3.2.1 XOR 逻辑的定义

XOR逻辑门当两个输入不同时输出1,相同时输出0。其真值表如下:

输入 x _ 1 x\_1 x_1输入 x _ 2 x\_2 x_2输出 y y y
000
011
101
110

3.2.2 为什么感知器无法解决 XOR?

XOR问题不是线性可分的。我们无法在二维平面上画出一条直线,将XOR的输入点 (0,0), (1,1)(对应输出0)与 (0,1), (1,0)(对应输出1)完美地分开。

我们可以用图示来理解:

graph TD
    subgraph XOR 数据点 (二维空间)
        A[ (0,0) - 输出0 ]
        B[ (0,1) - 输出1 ]
        C[ (1,0) - 输出1 ]
        D[ (1,1) - 输出0 ]
    end

    %% 尝试用一条直线分割是不可能的
    %% 类0的点: A, D
    %% 类1的点: B, C

几何直观解释:
想象一下在图上绘制这四个点:

  • (0,0) 和 (1,1) 属于一类(输出0)。
  • (0,1) 和 (1,0) 属于另一类(输出1)。

无论你如何尝试画一条直线,都无法将这两组点完全分到直线的两侧。至少会有一个点被错误分类。因为感知器的决策边界是一条直线(或高维空间中的超平面),所以单个感知器无法解决XOR问题。

3.2.3 历史意义与影响

1969年,马文·明斯基(Marvin Minsky)和西摩尔·派普特(Seymour Papert)在其著作《感知器》(Perceptrons)中深入分析了感知器的能力和局限性,并明确指出了其无法解决XOR这类非线性问题的缺陷。这本书对当时的人工智能领域产生了深远影响,导致了对神经网络研究热情的减退和资金的削减,这一时期有时被称为第一次“AI寒冬”(AI Winter)。

然而,XOR问题也激发了研究者们思考如何克服这一局限性,最终推动了多层感知器 (Multi-Layer Perceptron, MLP) 的发展,即通过将多个感知器组合成网络层次来解决非线性问题。

四、从感知器到神经网络

感知器的局限性(特别是XOR问题)清楚地表明,单个感知器不足以解决许多现实世界中的复杂问题,因为这些问题往往是非线性的。

4.1 克服局限性的思考

要解决像XOR这样的非线性问题,我们需要更强大的模型。关键的思路是:如果单个感知器(一条直线)不行,那么多个感知器组合起来(多条直线形成的区域)是否可以呢?

4.1.1 多层结构的需求

答案是肯定的。通过将感知器组织成层次结构——即多层感知器 (MLP)——我们可以创建能够学习非线性决策边界的模型。例如,XOR问题可以通过一个包含输入层、一个隐藏层(包含两个感知器)和一个输出层(一个感知器)的简单MLP来解决。隐藏层的感知器可以将输入空间转换到一个新的表示空间,在这个新的空间里,问题就变得线性可分了,然后输出层的感知器就可以进行最终的分类。

4.2 展望:多层感知器 (MLP)

多层感知器(MLP)是前馈神经网络(Feedforward Neural Network)的一种基本形式,它至少包含一个输入层、一个或多个隐藏层以及一个输出层。与单个感知器不同,MLP中的神经元通常使用平滑的、可微分的激活函数(如Sigmoid、Tanh或ReLU),而不是简单的阶跃函数。这使得我们可以使用基于梯度的优化算法(如反向传播)来训练网络。

在接下来的文章中,我们将深入探讨不同类型的激活函数,并学习如何构建和训练多层感知器,从而真正开启深度学习的大门。

五、总结

本篇文章我们详细介绍了神经网络的“原子”——感知器。通过学习,我们应掌握以下核心内容:

  1. 感知器模型:理解其由输入、权重、偏置和阶跃激活函数组成的基本结构。
  2. 数学表示与决策:感知器通过计算输入的加权和,并应用阶跃函数来产生二进制输出,从而实现分类决策。
  3. 线性可分性:感知器能够解决线性可分的问题,例如逻辑AND门和OR门,其决策边界是一个超平面。
  4. XOR困境:感知器的核心局限在于它无法解决非线性可分的问题,最经典的例子就是XOR(异或)问题。
  5. 历史意义:XOR问题及其在《感知器》一书中的阐述,对早期神经网络研究产生了重大影响,并间接推动了多层网络的发展。
  6. 奠基石作用:尽管功能有限,但感知器是理解更复杂神经网络(如多层感知器)的基础,为我们后续学习神经网络的层级结构和非线性处理能力奠定了基础。

理解感知器是进入神经网络世界的关键第一步。它的简单性使其易于理解,而其局限性则自然地引出了对更强大网络结构的需求。在下一篇文章中,我们将探讨各种激活函数,它们是构建更强大神经网络不可或缺的组件。敬请期待!


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2378891.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity3D仿星露谷物语开发43之农作物生长

1、目标 把防风草种子种在地里,并展示植物种子,防风草种子将随着时间变化而生长成植株。 2、创建Crop.cs脚本 在Assets -> Scripts下创建新的目录命名为Crop,在其下创建新的脚本命名为Crop.cs。 代码如下: using System.C…

从0到1上手Kafka:开启分布式消息处理之旅

目录 一、Kafka 是什么 二、Kafka 的基础概念 2.1 核心术语解读 2.2 工作模式剖析 三、Kafka 的应用场景 四、Kafka 与其他消息队列的比较 五、Kafka 的安装与配置 5.1 环境准备 5.2 安装步骤 5.3 常见问题及解决 六、Kafka 的基本操作 6.1 命令行工具使用 6.1.1 …

Python爬虫如何应对网站的反爬加密策略?

在当今的互联网环境中,网络爬虫已经成为数据采集的重要工具之一。然而,随着网站安全意识的不断提高,反爬虫技术也越来越复杂,尤其是数据加密策略的广泛应用,给爬虫开发者带来了巨大的挑战。本文将详细介绍Python爬虫如…

第一次经历项目上线

这几天没写csdn,因为忙着项目上线的问题,我这阶段改了非常多的前端bug哈哈哈哈,说几个比较好的bug思想! 这个页面算是我遇到的比较大的bug,因为我一开始的逻辑都写好了,询价就是在点击快递公司弹出弹框的时…

Conda配置完全指南——Windows系统Anaconda/Miniconda的安装、配置、基础使用、清理缓存空间和Pycharm/VSCode配置指南

本文同步发布在个人博客: Conda配置完全指南Conda 是一个开源的跨平台包管理与环境管理工具,广泛应用于数据科学、机器学习及 Python 开发领域。它不仅能帮助用户快速安装、更新和卸载第三方库,还能创建相互隔离的虚拟环境,解决不…

Quasar组件 Carousel走马灯

通过对比两个q-carousel组件来&#xff0c;了解该组件的属性 官方文档请参阅&#xff1a;Carousel 预览 源代码 <template><div class"q-pa-md"><div class"q-gutter-md"><q-carouselv-model"slide"transition-prev&quo…

风控域——风控决策引擎系统设计

摘要 本文详细介绍了风控决策引擎系统的设计与应用。决策引擎系统是一种智能化工具&#xff0c;可自动化、数据驱动地辅助或替代人工决策&#xff0c;广泛应用于金融、医疗、营销、风控等领域。文章阐述了决策引擎的核心功能&#xff0c;包括自动化决策、动态规则管理、实时处…

CAPL Class: TcpSocket (此类用于实现 TCP 网络通信 )

目录 Class: TcpSocketacceptopenclosebindconnectgetLastSocketErrorgetLastSocketErrorAsStringlistenreceivesendsetSocketOptionshutdown函数调用的基本流程服务器端的基本流程客户端的基本流程Class: TcpSocket学习笔记。来自CANoe帮助文档。 Class: TcpSocket accept /…

数据分析 —— 数据预处理

一、什么是数据预处理 数据预处理&#xff08;Data Preprocessing&#xff09;是数据分析和机器学习中至关重要的步骤&#xff0c;旨在将原始数据转换为更高质量、更适合分析或建模的形式。由于真实世界的数据通常存在不完整、不一致、噪声或冗余等问题&#xff0c;预处理可以…

软件架构风格系列(4):事件驱动架构

文章目录 前言一、从“用户下单”场景看懂事件驱动核心概念&#xff08;一&#xff09;什么是事件驱动架构&#xff1f;&#xff08;二&#xff09;核心优势&#xff1a;解耦与异步的双重魔法 二、架构设计图&#xff1a;三要素构建事件流转闭环三、Java实战&#xff1a;从简单…

arduino平台读取鼠标光电传感器

鼠标坏掉了&#xff0c;大抵是修不好了。&#xff08;全剧终—&#xff09; 但是爱动手的小明不会浪费这个鼠标&#xff0c;确认外观没有明显烧毁痕迹后&#xff0c;尝试从电路板上利用光电传感器进行位移的测量&#xff0c;光电传感器&#xff08;型号&#xff1a;FCT3065&am…

【Linux网络】网络层

网络层 在复杂的网络环境中确定一个合适的路径 IP 协议 IPV4 点分十进制[0,255].[0,255].[0,255].[0,255]IPV6 IP地址目标网格目标主机 基本概念 主机:配有IP地址,但是不进行路由控制的设备;路由器:即配有IP地址,又能进行路由控制;节点:主机和路由器的统称。 两个问题 路…

大模型学习:Deepseek+dify零成本部署本地运行实用教程(超级详细!建议收藏)

文章目录 大模型学习&#xff1a;Deepseekdify零成本部署本地运行实用教程&#xff08;超级详细&#xff01;建议收藏&#xff09;一、Dify是什么二、Dify的安装部署1. 官网体验2. 本地部署2.1 linux环境下的Docker安装2.2 Windows环境下安装部署DockerDeskTop2.3启用虚拟机平台…

LeetCode Hot100 (2、3、4、5、6、8、9、12)

题2--字母异或位分词 class Solution { public:vector<vector<string>> groupAnagrams(vector<string>& strs) {// 一开始的思路是&#xff0c;对于其中的一个单词&#xff0c;遍历所有排序组合&#xff0c;然后判断这些组合是否在哈希表里//&#xff0…

FastMCP:为大语言模型构建强大的上下文和工具服务

FastMCP&#xff1a;为大语言模型构建强大的上下文和工具服务 在人工智能快速发展的今天&#xff0c;大语言模型&#xff08;LLM&#xff09;已经成为许多应用的核心。然而&#xff0c;如何让这些模型更好地与外部世界交互&#xff0c;获取实时信息&#xff0c;执行特定任务&am…

数据结构(3)线性表-链表-单链表

我们学习过顺序表时&#xff0c;一旦对头部或中间的数据进行处理&#xff0c;由于物理结构的连续性&#xff0c;为了不覆盖&#xff0c;都得移&#xff0c;就导致时间复杂度为O&#xff08;n&#xff09;&#xff0c;还有一个潜在的问题就是扩容&#xff0c;假如我们扩容前是10…

Java Solon v3.3.0 发布(国产优秀应用开发基座)

Solon 框架&#xff01; Solon 是新一代&#xff0c;Java 企业级应用开发框架。从零开始构建&#xff08;No Java-EE&#xff09;&#xff0c;有灵活的接口规范与开放生态。采用商用友好的 Apache 2.0 开源协议&#xff0c;是“杭州无耳科技有限公司”开源的根级项目&#xff…

23种设计模式概述详述(C#代码示例)

文章目录 1. 引言1.1 设计模式的价值1.2 设计模式的分类 2. 面向对象设计原则2.1 单一职责原则 (SRP)2.2 开放封闭原则 (OCP)2.3 里氏替换原则 (LSP)2.4 接口隔离原则 (ISP)2.5 依赖倒置原则 (DIP)2.6 合成复用原则 (CRP)2.7 迪米特法则 (LoD) 3. 创建型设计模式3.1 单例模式 (…

数字化工厂升级引擎:Modbus TCP转Profinet网关助力打造柔性生产系统

在当今的工业自动化领域&#xff0c;通信协议扮演着至关重要的角色。Modbus TCP和Profinet是两种广泛使用的工业通信协议&#xff0c;它们分别在不同的应用场景中发挥着重要作用。然而&#xff0c;有时我们可能需要将这两种协议进行转换&#xff0c;以实现不同设备之间的无缝通…

FPGA生成随机数的方法

FPGA生成随机数的方法&#xff0c;目前有以下几种: 1、震荡采样法 实现方式一&#xff1a;通过低频时钟作为D触发器的时钟输入端&#xff0c;高频时钟作为D触发器的数据输入端&#xff0c;使用高频采样低频&#xff0c;利用亚稳态输出随机数。 实现方式二&#xff1a;使用三个…