深度学习入门学习笔记--感知机、神经网络

📅 2026/7/12 4:31:18
深度学习入门学习笔记--感知机、神经网络
第二章 感知机感知机是神经网络与深度学习的基础算法是一种接收多个输入、输出单个二值信号的简单模型。1. 感知机的基本原理感知机的核心单元是神经元节点输入信号 x1​,x2​ 会被赋予对应的权重 w1​,w2​也叫参数神经元对加权后的输入求和当求和结果超过某个阈值 θ 时输出 1神经元被激活否则输出 0。原始数学表达式引入偏置 b将阈值 θ 移项并替换为 −b公式改写为更通用的形式权重 w控制输入信号的重要性权重越大对应输入对结果的影响越强。偏置 b控制神经元被激活的难易程度b 越大神经元越容易输出 1。2. 单层感知机实现基础逻辑门通过调整权重和偏置单层感知机可以实现与门AND、与非门NAND、或门OR等线性可分的逻辑电路。import numpy as np # 与门 def AND(x1, x2): x np.array([x1, x2]) w np.array([0.5, 0.5]) b -0.7 tmp np.sum(w * x) b return 1 if tmp 0 else 0 # 与非门 def NAND(x1, x2): x np.array([x1, x2]) w np.array([-0.5, -0.5]) b 0.7 tmp np.sum(w * x) b return 1 if tmp 0 else 0 # 或门 def OR(x1, x2): x np.array([x1, x2]) w np.array([0.5, 0.5]) b -0.2 tmp np.sum(w * x) b return 1 if tmp 0 else 03. 感知机的局限性无法实现异或门异或门XOR属于非线性可分问题单层感知机无法处理与门、或门的决策边界是一条直线可以把二维空间分为两个线性区域属于线性可分问题。当w1w21b-0.5感知机会生成由直线−0.5 x1 x2 0分割开的两个空 间。其中一个空间输出1另一个空间输出0可表示或门异或门的正负样本无法用一条直线分割需要曲线 / 折线作为决策边界属于非线性空间问题。单层感知机只能表示线性分割因此无法单独实现异或门。4. 多层感知机解决非线性问题通过叠加感知机层构建多层结构可以实现非线性分割解决异或门问题。原理组合与非门、或门、与门通过「输入层 → 隐藏层 → 输出层」的 2 层感知机结构实现异或。真值表def XOR(x1, x2): s1 NAND(x1, x2) s2 OR(x1, x2) y AND(s1, s2) return y结论多层感知机可以表示复杂的非线性空间理论上 2 层感知机就能够拟合任意函数。第三章 神经网络神经网络在感知机的基础上引入平滑可导的激活函数与多层结构支持通过梯度法自动学习参数是深度学习的核心载体。1. 神经网络的基本概念神经网络由输入层、隐藏层、输出层构成信号从输入向输出单向传递前向传播。和感知机的核心差异感知机使用阶跃函数二值离散输出神经网络使用连续可导的激活函数支持通过梯度更新参数完成学习。核心能力通过叠加层与非线性激活函数拟合任意复杂的非线性关系。2. 激活函数激活函数会将输入信号的总和转换为输出信号比如感知机实现的与门x1x2均为1输出y为1激活函数的作用是为神经网络引入非线性。如果没有激活函数无论叠加多少层网络都等价于单层线性变换无法拟合复杂模式。(1) 阶跃函数感知机使用的激活函数输入大于 0 时输出 1否则输出 0。def step_function(x): return np.array(x 0, dtypenp.int32)特点输出离散、存在突变点几乎处处导数为 0无法用于梯度学习。(2) sigmoid 函数经典的平滑激活函数将输入压缩到 (0,1) 区间。公式代码实现def sigmoid(x): return 1 / (1 np.exp(-x))sigmoid 与 阶跃函数的异同对比维度阶跃函数sigmoid 函数输出形式0/1 离散二值0~1 之间的连续值平滑性存在突变跳变不光滑曲线平滑处处可导梯度可用性几乎处处导数为 0无法支持梯度学习导数连续可用于反向传播更新参数共性都是 S 型曲线输入越大输出越接近 1输入越小越接近 0都具备非线性(3) ReLU 函数目前深度学习最常用的激活函数输入为正时原样输出负时输出 0。公式代码实现def relu(x): return np.maximum(0, x)特点计算简单高效能有效缓解深层网络的梯度消失问题。3. 多维数组的矩阵运算神经网络的前向传播可以通过矩阵乘积点积高效实现避免逐元素循环。矩阵乘法要求第一个矩阵的列数 第二个矩阵的行数。简单示例输入层到隐藏层的加权计算X np.array([1.0, 0.5]) # 输入形状(2,) W np.array([[0.1, 0.3, 0.5], [0.2, 0.4, 0.6]]) # 权重形状(2,3) B np.array([0.1, 0.2, 0.3]) # 偏置形状(3,) A np.dot(X, W) B # 加权和形状(3,) Z sigmoid(A) # 激活后输出4. 三层神经网络的前向传播实现以「输入层 (2 神经元)→隐藏层 1 (3 神经元)→隐藏层 2 (2 神经元)→输出层 (2 神经元)」为例完整前向传播代码def init_network(): network {} network[W1] np.array([[0.1, 0.3, 0.5], [0.2, 0.4, 0.6]]) network[b1] np.array([0.1, 0.2, 0.3]) network[W2] np.array([[0.1, 0.4], [0.2, 0.5], [0.3, 0.6]]) network[b2] np.array([0.1, 0.2]) network[W3] np.array([[0.1, 0.3], [0.2, 0.4]]) network[b3] np.array([0.1, 0.2]) return network def forward(network, x): W1, W2, W3 network[W1], network[W2], network[W3] b1, b2, b3 network[b1], network[b2], network[b3] a1 np.dot(x, W1) b1 z1 sigmoid(a1) a2 np.dot(z1, W2) b2 z2 sigmoid(a2) a3 np.dot(z2, W3) b3 y identity_function(a3) return y5. 输出层的设计输出层的激活函数根据任务类型选择(1) 恒等函数适用场景回归问题预测连续数值如房价、温度。定义输入原样输出h(x)x。def identity_function(x): return x(2) softmax 函数适用场景分类问题输出每个类别的概率所有类别概率和为 1。公式溢出问题当输入数值很大时ex^x会指数级增长导致数值溢出。优化方案减去输入中的最大值不改变计算结果但避免溢出。下图的C取ai的最大值优化后代码def softmax(a): c np.max(a) exp_a np.exp(a - c) # 减去最大值防止溢出 sum_exp_a np.sum(exp_a) y exp_a / sum_exp_a return y性质输出值都在 0~1 之间并且所有输出的和为 1可以直接解释为每个类别的概率。