【深度学习-Day 12】从零认识神经网络:感知器原理、实现与局限性深度剖析
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):神经元之间的连接点。当信号(动作电位)到达轴突末梢时,会通过突触释放神经递质,这些化学物质作用于下一个神经元的树突,从而传递信号。突触的强度是可以变化的,这构成了学习和记忆的基础。
下图展示了一个简化的生物神经元结构:
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 数学表示
感知器的计算过程可以分为两步:
-
计算加权和 (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
-
通过激活函数得到输出 (Output via Activation Function):将 z z z 输入到激活函数 f f f 中,得到最终的输出 y y y。
$$y = f(z)
下面是一个感知器的结构示意图:
graph TDsubgraph 感知器模型direction LRX1[输入 x1] -->|w1| S((Σ))X2[输入 x2] -->|w2| SXd[...] -->|...| SXn[输入 xn] -->|wn| SB[偏置 b] --> SS -- 加权和 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-betatitle "阶跃函数 (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 是真实标签):
- 使用当前的权重 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)。
- 计算误差: e r r o r = y _ t r u e − y _ p r e d error = y\_{true} - y\_{pred} error=y_true−y_pred。
- 如果 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 npclass 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_rateself.epochs = epochsdef _step_function(self, z):"""阶跃激活函数"""return 1 if z > 0 else 0def 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_biasprint("训练完成。最终权重:", 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 |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
3.2.2 为什么感知器无法解决 XOR?
XOR问题不是线性可分的。我们无法在二维平面上画出一条直线,将XOR的输入点 (0,0), (1,1)(对应输出0)与 (0,1), (1,0)(对应输出1)完美地分开。
我们可以用图示来理解:
graph TDsubgraph 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),而不是简单的阶跃函数。这使得我们可以使用基于梯度的优化算法(如反向传播)来训练网络。
在接下来的文章中,我们将深入探讨不同类型的激活函数,并学习如何构建和训练多层感知器,从而真正开启深度学习的大门。
五、总结
本篇文章我们详细介绍了神经网络的“原子”——感知器。通过学习,我们应掌握以下核心内容:
- 感知器模型:理解其由输入、权重、偏置和阶跃激活函数组成的基本结构。
- 数学表示与决策:感知器通过计算输入的加权和,并应用阶跃函数来产生二进制输出,从而实现分类决策。
- 线性可分性:感知器能够解决线性可分的问题,例如逻辑AND门和OR门,其决策边界是一个超平面。
- XOR困境:感知器的核心局限在于它无法解决非线性可分的问题,最经典的例子就是XOR(异或)问题。
- 历史意义:XOR问题及其在《感知器》一书中的阐述,对早期神经网络研究产生了重大影响,并间接推动了多层网络的发展。
- 奠基石作用:尽管功能有限,但感知器是理解更复杂神经网络(如多层感知器)的基础,为我们后续学习神经网络的层级结构和非线性处理能力奠定了基础。
理解感知器是进入神经网络世界的关键第一步。它的简单性使其易于理解,而其局限性则自然地引出了对更强大网络结构的需求。在下一篇文章中,我们将探讨各种激活函数,它们是构建更强大神经网络不可或缺的组件。敬请期待!
相关文章:
【深度学习-Day 12】从零认识神经网络:感知器原理、实现与局限性深度剖析
Langchain系列文章目录 01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…...
力扣HOT100之二叉树:98. 验证二叉搜索树
这道题之前也刷过,自己做了一遍,发现卡在了第70多个样例,才发现自己没有利用二叉搜索树的性质,但凡涉及到二叉搜索树,应该首先考虑中序遍历!!! 被卡住的测试样例是这样的:…...
vector(c++)
前言 正式进入学习STL的第一步就是vector容器, vector是一种用于存储可变大小数组的序列容器,就像数组一样,vector也采用的连续存储空间来存储元素。本质上讲,vector使用动态分配数组来存储它的元素。底层是一个顺序表。本文介绍…...
CAPL Class: TcpSocket (此类用于实现 TCP 网络通信 )
目录 Class: TcpSocketacceptopenclosebindconnectgetLastSocketErrorgetLastSocketErrorAsStringlistenreceivesendsetSocketOptionshutdown函数调用的基本流程服务器端的基本流程客户端的基本流程Class: TcpSocket学习笔记。来自CANoe帮助文档。 Class: TcpSocket accept /…...
C语言:gcc 如何调用 Win32 打开文件对话框 ?
在 Windows 平台上使用 gcc 调用原生 Win32 API 实现文件打开对话框是可行的,但需要直接使用 Win32 的 GetOpenFileName 函数(位于 commdlg.h 头文件,依赖 comdlg32.lib 库)。以下是完整实现步骤和代码示例: 编写 file…...
OpenHarmony:开源操作系统重塑产业数字化底座
OpenHarmony:开源操作系统重塑产业数字化底座 引言:当操作系统成为数字公共品 在万物智联时代,操作系统不再是科技巨头的专属领地。华为捐赠的OpenHarmony项目,正以开源协作模式重构操作系统产业格局。这个脱胎于商业版本的开源…...
线程同步学习
概念 有A、B、C三个线程,A线程负责输入数据,B线程负责处理数据、C线程负责输出数据,这三个线程之间就存在着同步关系,即A必须先执行,B次之,C最后执行,否则不能得到正确的结果。 那么所谓线程同…...
十二、Hive 函数
作者:IvanCodes 日期:2025年5月17日 专栏:Hive教程 在数据处理的广阔天地中,我们常常需要对数据进行转换、计算、清洗或提取特定信息。Hive 提供了强大的内置运算符和丰富的内置函数库,它们就像魔法师手中的魔法棒&…...
DeepSeek 赋能社会科学:解锁研究新范式
目录 一、DeepSeek:大语言模型中的新力量1.1 DeepSeek 技术亮点1.2 与其他模型对比 二、DeepSeek 在社会科学研究中的应用领域2.1 经济学研究2.2 社会学研究2.3 历史学研究2.4 法学研究 三、DeepSeek 应用案例深度剖析3.1 案例一:社会学研究中社会舆情分…...
java函数内的变量问题
public class VendingMachine {//设计一个类叫做VendingMachine,用这个类制造一个对象vmint price 80;int balance;//三个属性int total;void showprompt(){System.out.println("Welcome");}void insertmoney(int amount){balance balance amount;}void showBalan…...
docker部署第一个Go项目
1.前期准备 目录结构 main.go package mainimport ("fmt""github.com/gin-gonic/gin""net/http" )func main() {fmt.Println("\n .::::.\n .::::::::.\n :::::::::::\n …...
【读代码】端到端多模态语言模型Ultravox深度解析
一、项目基本介绍 Ultravox是由Fixie AI团队开发的开源多模态大语言模型,专注于实现音频-文本的端到端实时交互。项目基于Llama 3、Mistral等开源模型,通过创新的跨模态投影架构,绕过了传统语音识别(ASR)的中间步骤,可直接将音频特征映射到语言模型的高维空间。 核心优…...
管理前端项目依赖版本冲突导致启动失败的问题的解决办法
管理前端项目依赖版本冲突导致启动失败的问题,可按照以下步骤系统解决: 1. 定位冲突来源 查看错误日志:启动失败时的控制台报错通常会指出具体模块或版本问题,例如 Module not found 或 TypeError。检查依赖树:npm l…...
北京市工程技术人才职称评价基本标准条件解读
北京市工程技术人才职称评价基本标准条件 北京市工程技术人才之技术员 北京市工程技术人才之助理工程师 北京市工程技术人才之工程师 北京市工程技术人才之高级工程师 北京市工程技术人才之高级工程师(破格) 北京市工程技术人才之正高级工程师 北京市工程…...
MUSE Pi Pro 开发板 Imagination GPU 利用 OpenCL 测试
视频讲解: MUSE Pi Pro 开发板 Imagination GPU 利用 OpenCL 测试 继续玩MUSE Pi Pro,今天看下比较关注的gpu这块,从opencl看起,安装clinfo指令 sudo apt install clinfo 可以看到这颗GPU是Imagination的 一般嵌入式中gpu都和hos…...
Mysql数据库之集群进阶
一、日志管理 5.7版本自定义路径时的文件需要自己提前创建好文件,不会自动创建,否则启动mysql会报错 错误日志 rpm包(yum) /var/log/mysql.log 默认错误日志 ###查询日志路径 [rootdb01 ~]# mysqladmin -uroot -pEgon123 variables | grep -w log_e…...
JavaScript防抖与节流全解析
文章目录 前言:为什么需要防抖和节流基本概念与区别防抖(Debounce)节流(Throttle)关键区别防抖(Debounce)详解1. 基本防抖函数实现2. 防抖函数的使用3. 防抖函数的工作流程4. 防抖函数进阶 - 立即执行选项节流(Throttle)详解1. 基本节流函数实现时间戳法(第一次会立即执行)定…...
大模型学习:Deepseek+dify零成本部署本地运行实用教程(超级详细!建议收藏)
文章目录 大模型学习:Deepseekdify零成本部署本地运行实用教程(超级详细!建议收藏)一、Dify是什么二、Dify的安装部署1. 官网体验2. 本地部署2.1 linux环境下的Docker安装2.2 Windows环境下安装部署DockerDeskTop2.3启用虚拟机平台…...
在RK3588上使用NCNN和Vulkan加速ResNet50推理全流程
在RK3588上使用NCNN和Vulkan加速ResNet50推理全流程 前言:为什么需要关注移动端AI推理一、环境准备与框架编译1.1 获取NCNN源码1.2 安装必要依赖1.3 编译NCNN二、模型导出与转换2.1 生成ONNX模型2.2 转换NCNN格式三、模型量化加速3.1 生成校准数据3.2 执行量化操作四、性能测试…...
Web安全基础:深度解析与实战指南
一、Web安全体系架构的全面剖析 1.1 分层防御模型(Defense in Depth) 1.1.1 网络层防护 防火墙技术: 状态检测防火墙(SPI):基于连接状态跟踪,阻断非法会话(如SYN Flood攻击)下一代防火墙(NGFW):集成IPS、AV、URL过滤(如Palo Alto PA-5400系列)配置示例…...
Uniapp开发鸿蒙应用时如何运行和调试项目
经过前几天的分享,大家应该应该对uniapp开发鸿蒙应用的开发语法有了一定的了解,可以进行一些简单的应用开发,今天分享一下在使用uniapp开发鸿蒙应用时怎么运行到鸿蒙设备,并且在开发中怎么调试程序。 运行 Uniapp项目支持运行到…...
Python海龟绘图(Turtle Graphics)核心函数和关键要点
以下是Python海龟绘图(Turtle Graphics)的核心函数和关键要点整理: 一、画布设置 函数/方法说明参数说明备注turtle.setup(width, height, x, y)设置画布尺寸和位置width宽度,height高度,x/y窗口左上角坐标默认尺寸80…...
如何在Cursor中高效使用MCP协议
1、Cursor介绍 Cursor是一个功能强大的开发工具,内置了聊天助手、代码自动补全和调试工具,能够与多种外部工具和服务(如数据库、文件系统、浏览器等)进行深度集成。借助MCP(Multiverse Communication Protocol&#x…...
典籍知识问答模块AI问答bug修改
一、修改流式数据处理问题 1.问题描述:由于传来的数据形式如下: event:START data:350 data:< data:t data:h data:i data:n data:k data:> data: data: data: data: data:嗯 data:, 导致需要修改获取正常的当前信息id并更…...
Redis 发布订阅模式深度解析:原理、应用与实践
在现代分布式系统架构中,实时消息传递机制扮演着至关重要的角色。Redis 作为一款高性能的内存数据库,其内置的发布订阅(Pub/Sub)功能提供了一种轻量级、高效的消息通信方案。本文将全面剖析 Redis 发布订阅模式,从其基本概念、工作原理到实际…...
通义千问-langchain使用构建(三)
目录 序言docker 部署xinference1WSL环境docker安装2拉取镜像运行容器3使用的界面 本地跑chatchat1rag踩坑2使用的界面2.1配置个前置条件然后对话2.2rag对话 结论 序言 在前两天的基础上,将xinference调整为wsl环境,docker部署。 然后langchain chatcha…...
c++ 仿函数
示例代码: void testFunctor() {using Sum struct MyStruct {int operator() (int a, int b) const { // 重载()运算符return a b;}};Sum sum;std::cout << sum(9528, -1) << std::endl; } 打印: 仿函数意思是&am…...
hyper-v 虚拟机怎么克隆一台一样的虚拟机?
环境: hyper-v Win10专业版 问题描述: hyper-v 虚拟机怎么克隆一台一样的虚拟机? 解决方案: 以下是在 Hyper-V 中克隆虚拟机的几种方法: 方法一:使用导出和导入功能 导出虚拟机: 打开 H…...
操作系统:os概述
操作系统:OS概述 程序、进程与线程无极二级目录三级目录 程序、进程与线程 指令执行需要那些条件?CPU内存 需要数据和 无极 二级目录 三级目录...
【技巧】GoogleChrome浏览器开发者模式查看dify接口
回到目录 GoogleChrome浏览器开发者模式查看dify接口 1.搭建本地dify开发环境 参考 《 win10的wsl环境下调试dify的api后端服务(20250511发布)》 2.打开dify首页,进入开发者模式,Network页 勾选 Preserve log [图1] 3.填好用户名和密码,…...
Ocean: Object-aware Anchor-free Tracking
领域:Object tracking It aims to infer the location of an arbitrary target in a video sequence, given only its location in the first frame 问题/现象: Anchor-based Siamese trackers have achieved remarkable advancements in accuracy, yet…...
java中的循环结构
文章目录 流程控制顺序结构if单选择结构if双选择结构if多选择结构嵌套的if结构switch多选择结构 循环结构while循环do...while循环 for循环增强for循环 break continue练习案例 流程控制 顺序结构 java的基本结果就是顺序结构,除非特别指明,否则就按照…...
数学复习笔记 16
前言 例题真是经典。 background music 《青春不一样》 2.28 算一个行列式,算出来行列式不等于零,这表示矩阵式可逆的。但是这个算的秩是复合的,感觉没啥好办法了,我直接硬算了,之后再看解析积累好的方法。算矩阵…...
PySide6 GUI 学习笔记——常用类及控件使用方法(常用类颜色QColor)
文章目录 一、概述二、核心功能三、常用函数及方法四、代码示例五、注意事项 一、概述 QColor 是用于处理颜色的类,支持 RGB、HSV、HSL、CMYK 等多种颜色模型,提供颜色创建、转换、分量操作及格式转换功能。支持透明度设置,可通过颜色名称或…...
【Closure-Hayd】
RNA序列本身存在结构上的物理信息,因此可以利用文献提供的相关方法来对RNA序列的物理特征进行更加细致的提取。 几何向量编码(GVP模块)借鉴Rhodesign模型中的GVP(Geometric Vector Perceptron)模块,将每个…...
MySQL高可用架构
一、读写分离在高可用架构中的核心作用 1.读写分离与高可用的协同价值 在MySQL高可用架构中,读写分离不仅是性能优化的手段,更是提升系统容错能力的关键策略。通过将写操作(INSERT、UPDATE、DELETE) 集中到主节点,读…...
粒子群算法(PSO算法)
粒子群算法概述 1.粒子群优化算法(Particle Swarm Optimization,简称PSO)。粒子群优化算法是在1995年由Kennedy博士和Eberhart博士一起提出的,它源于对鸟群捕食行为的研究。 2.基本核心是利用群体中的个体对信息的共享从而使得整…...
信道编码技术介绍
信息与通信系统中的编码有4 种形式:信源编码、信道编码、密码编码和多址编码。 其中信道编码的作用是对信源经过压缩后的数据加一定数量受到控制的冗余,使得数据在传输中或接收中发生的差错可以被纠正或被发现,从而可以正确恢复出原始数据信息…...
JavaScript【4】数组和其他内置对象(API)
1.数组: 1.概述: js中数组可理解为一个存储数据的容器,但与java中的数组不太一样;js中的数组更像java中的集合,因为此集合在创建的时候,不需要定义数组长度,它可以实现动态扩容;js中的数组存储元素时,可以存储任意类型的元素,而java中的数组一旦创建后,就只能存储定义类型的元…...
【背包dp-----分组背包】------(标准的分组背包【可以不装满的 最大价值】)
通天之分组背包 题目链接 题目描述 自 01 01 01 背包问世之后,小 A 对此深感兴趣。一天,小 A 去远游,却发现他的背包不同于 01 01 01 背包,他的物品大致可分为 k k k 组,每组中的物品相互冲突,现在&a…...
docker-compose——安装mongo
编写docker-compose.yml version : 3.8services:zaomeng-mongodb:container_name: zaomeng-mongodbimage: mongo:latestrestart: alwaysports:- 27017:27017environment:- MONGO_INITDB_ROOT_USERNAMEroot- MONGO_INITDB_ROOT_PASSWORDpssw0rdvolumes:- ./mongodb/data:/data/…...
day 28
类 一个常见的类的定义包括了: 1. 关键字class 2. 类名 3. 语法固定符号冒号(:) 4. 一个初始化函数__init__(self) Pass占位符和缩进 Python 通过缩进来定义代码块的结构。当解释器遇到像 def, class, if, for 这样的语句,并且后面跟着冒号 : 时&…...
JavaScript入门【1】概述
1.JavaScript是什么? <font style"color:rgb(38,38,38);">Javascript (简称“JS”)是⼀种直译式脚本语⾔,⼀段脚本其实就是⼀系列指令,计算机通过这些指令来达成⽬标。它⼜是⼀种动态类型的编程语⾔。JS⽤来在⽹…...
MySQL 中 JOIN 和子查询的区别与使用场景
目录 一、JOIN:表连接1.1 INNER JOIN:内连接1.2 LEFT JOIN:左连接1.3 RIGHT JOIN:右连接1.4 FULL JOIN:全连接二、子查询:嵌套查询2.1 WHERE 子句中的子查询2.2 FROM 子句中的子查询2.3 SELECT 子句中的子查询三、JOIN 和子查询的区别3.1 功能差异3.2 性能差异3.3 使用场…...
DeepSeek 大模型部署全指南:常见问题、优化策略与实战解决方案
DeepSeek 作为当前最热门的开源大模型之一,其强大的语义理解和生成能力吸引了大量开发者和企业关注。然而在实际部署过程中,无论是本地运行还是云端服务,用户往往会遇到各种技术挑战。本文将全面剖析 DeepSeek 部署中的常见问题,提…...
Python 3.11详细安装步骤(包含安装包)Python 3.11详细图文安装教程
文章目录 前言Python 3.11介绍Python 3.11安装包下载Python 3.11安装步骤 前言 作为当前最热门的编程语言之一,Python 3.11 不仅拥有简洁优雅的语法,还在性能上实现了飞跃,代码运行速度提升显著。无论是初入编程的小白,还是经验丰…...
虚拟主播肖像权保护,数字时代的法律博弈
首席数据官高鹏律师团队 在虚拟主播行业蓬勃发展的表象之下,潜藏着一场关乎法律边界的隐形战争。当一位虚拟偶像的3D模型被非法拆解、面部数据被批量复制,运营方惊讶地发现——传统的肖像权保护体系,竟难以完全覆盖这具由代码与数据构成的“…...
硬件工程师笔记——二极管Multisim电路仿真实验汇总
目录 1 二极管基础知识 1.1 工作原理 1.2 二极管的结构 1.3 PN结的形成 1.4 二极管的工作原理详解 正向偏置 反向偏置 multisim使用说明链接 2 二极管特性实验 2.1 二极管加正向电压 2.2 二极管加反向电压 2.3 二极管两端的电阻 2.4 交流电下二级管工作 2.5 二极…...
学习笔记(C++篇)—— Day 6
1.内部类 如果一个类定义在另一个类的内部,就叫做内部类。 例如下面一个代码示例: class A { private:static int _k;int _h 1; public:class B // B默认就是A的友元{public:void foo(const A& a){cout << _k << endl; //OKcout <&…...
常见的实时通信技术(轮询、sse、websocket、webhooks)
1. HTTP轮询:最老实的办法 刚开始做实时功能时,我第一个想到的就是轮询。特别简单直白,就像你每隔5分钟就刷新一次朋友圈看看有没有新消息一样。 短轮询:勤快但费劲 短轮询就是客户端隔三差五地问服务器:"有新…...