CSDN博客-第2天-多样本训练与分类边界

CSDN博客-第2天-多样本训练与分类边界
【深度学习入门 Day 2】从单样本到多样本向量化训练与分类边界本文记录深度学习学习第 2 天的内容把昨天的单样本 sigmoid 神经元扩展到多样本训练理解X w b、平均损失、梯度聚合X.T dL_dz以及训练出来的w和b为什么对应一条分类边界。文章目录一、从单样本训练到多样本训练二、多样本数据如何表示三、向量化前向传播X w b四、多个样本的损失怎么合并五、多样本反向传播为什么是X.T dL_dz六、一次多样本参数更新七、w和b的几何意义分类边界八、今天的上机练习代码九、今日总结十、课后自测一、从单样本训练到多样本训练昨天我们只训练了一个样本xnp.array([2.0,3.0])y1.0模型形式是z w1*x1 w2*x2 b a sigmoid(z)这只能说明一件事对于[2, 3]这个点让模型输出尽量接近1。但机器学习真正要做的不是只记住一个点而是从多个样本中学习规律。今天我们把单个输入x扩展为样本矩阵X。二、多样本数据如何表示今天使用 4 个二维样本Xnp.array([[2.0,3.0],[1.0,1.0],[3.0,4.0],[0.0,2.0],])ynp.array([1.0,0.0,1.0,0.0])其中X.shape (4, 2) y.shape (4,)含义是4 个样本 每个样本 2 个特征 每个样本对应 1 个标签参数仍然是wnp.array([0.5,-1.0])b1.0因为每个样本有 2 个特征所以权重w有 2 个分量。三、向量化前向传播X w b单样本时znp.dot(w,x)b多样本时zX wb形状关系是X.shape (4, 2) w.shape (2,) z.shape (4,)语义上z是 4 个样本各自的线性输出z [z1, z2, z3, z4]代入初始参数样本1: z1 2*0.5 3*(-1) 1 -1 样本2: z2 1*0.5 1*(-1) 1 0.5 样本3: z3 3*0.5 4*(-1) 1 -1.5 样本4: z4 0*0.5 2*(-1) 1 -1所以z [-1, 0.5, -1.5, -1]经过 sigmoida sigmoid(z) ≈ [0.269, 0.622, 0.182, 0.269]对应标签y [1.000, 0.000, 1.000, 0.000]当前预测情况样本1预测 0.269标签 1偏低希望输出变大 样本2预测 0.622标签 0偏高希望输出变小 样本3预测 0.182标签 1偏低希望输出变大 样本4预测 0.269标签 0偏高希望输出变小这就是多样本训练和单样本训练的本质差别同一组参数要同时照顾多个样本最终更新方向是多个样本意见的综合。四、多个样本的损失怎么合并单样本平方损失L (a - y)^2多样本时通常取平均lossnp.mean((a-y)**2)数学上可以写成loss 1/N * Σ(ai - yi)^2其中N是样本数量。为什么要取平均因为我们希望优化的是整体效果而不是只服务某一个样本。如果只看单个样本参数可能朝着对其他样本更差的方向更新。五、多样本反向传播为什么是X.T dL_dz平方损失下反向传播可以写成Nlen(y)dL_da2*(a-y)/N da_dza*(1-a)dL_dzdL_da*da_dz这里的dL_dz是每个样本对z的梯度信号dL_dz.shape (4,)近似计算得到dL_dz ≈ [-0.072, 0.073, -0.061, 0.027]符号含义负数希望对应样本的 z 变大 正数希望对应样本的 z 变小权重梯度是dL_dwX.T dL_dz形状关系X.shape (4, 2) X.T.shape (2, 4) dL_dz.shape (4,) dL_dw.shape (2,)也就是得到[dL/dw1, dL/dw2]具体展开X 第一列 [2, 1, 3, 0] X 第二列 [3, 1, 4, 2]所以dL/dw1 2*dL_dz1 1*dL_dz2 3*dL_dz3 0*dL_dz4 dL/dw2 3*dL_dz1 1*dL_dz2 4*dL_dz3 2*dL_dz4这就是X.T dL_dz的核心含义把每个样本的误差信号按照每个特征列加权汇总得到每个权重的梯度。偏置梯度更简单dL_dbnp.sum(dL_dz)因为每个样本的z都加了同一个b所以偏置梯度就是所有样本误差信号的总和。六、一次多样本参数更新近似有dL_dz ≈ [-0.072, 0.073, -0.061, 0.027]计算w1梯度dL/dw1 2*(-0.072) 1*(0.073) 3*(-0.061) 0*(0.027) -0.144 0.073 - 0.183 0 ≈ -0.254计算w2梯度dL/dw2 3*(-0.072) 1*(0.073) 4*(-0.061) 2*(0.027) -0.216 0.073 - 0.244 0.054 ≈ -0.333计算b梯度dL/db -0.072 0.073 - 0.061 0.027 ≈ -0.033设学习率lr 0.1初始参数w1 0.5 w2 -1 b 1更新w1_new 0.5 - 0.1*(-0.254) 0.5254 w2_new -1 - 0.1*(-0.333) -0.9667 b_new 1 - 0.1*(-0.033) 1.0033注意w2从-1变成-0.9667也是变大因为它没有那么负了。七、w和b的几何意义分类边界对于二维输入z w1*x1 w2*x2 b预测规则是z 0 - sigmoid(z) 0.5 - 预测 1 z 0 - sigmoid(z) 0.5 - 在边界上 z 0 - sigmoid(z) 0.5 - 预测 0因此分类边界是w1*x1 w2*x2 b 0这是一条直线。把它改写成x2 k*x1 c的形式w2*x2 -w1*x1 - b x2 -(w1/w2)*x1 - b/w2所以斜率 -w1 / w2 截距 -b / w2这里要注意b不是斜率。w1和w2决定直线方向b控制直线整体平移。举例初始参数w1 0.5 w2 -1 b 1分类边界0.5*x1 - x2 1 0 x2 0.5*x1 1对于点[3, 4]边界上的 x2 0.5*3 1 2.5 实际 x2 4它在直线上方。但是否预测为1不能只看“上方”两个字还要看z的符号z 0.5*3 - 4 1 -1.5 0所以初始模型预测为0。一个可以分开这组数据的边界是x1 x2 - 4 0对应w [1, 1] b -4检查[2, 3]: 23-4 1 - 预测 1 [3, 4]: 34-4 3 - 预测 1 [1, 1]: 11-4 -2 - 预测 0 [0, 2]: 02-4 -2 - 预测 0所以训练的目标可以理解为找到一组w和b让正类和负类尽量落在分类边界的不同侧。八、今天的上机练习代码importnumpyasnp# 4 个样本每个样本 2 个特征Xnp.array([[2.0,3.0],[1.0,1.0],[3.0,4.0],[0.0,2.0],])# 标签1 表示正类0 表示负类ynp.array([1.0,0.0,1.0,0.0])# 初始化参数wnp.array([0.5,-1.0])b1.0lr0.1defsigmoid(z):return1/(1np.exp(-z))forstepinrange(101):# forwardzX wb asigmoid(z)lossnp.mean((a-y)**2)# backwardNlen(y)dL_da2*(a-y)/N da_dza*(1-a)dL_dzdL_da*da_dz dL_dwX.T dL_dz dL_dbnp.sum(dL_dz)# updateww-lr*dL_dw bb-lr*dL_dbifstep%100:pred(a0.5).astype(int)print(fstep{step:03d}, floss{loss:.6f}, fa{np.round(a,3)}, fpred{pred}, fw{np.round(w,4)}, fb{b:.4f})重点观察loss 是否下降 a 是否逐渐靠近 y pred 是否从错误变正确 w 和 b 如何变化尤其要盯住这行dL_dwX.T dL_dz它是多样本训练从“逐样本计算”走向“矩阵化计算”的关键。九、今日总结今天的核心内容可以压缩成 4 点单样本输入x扩展为多样本矩阵X。前向传播从np.dot(w, x) b变成X w b。多样本梯度通过X.T dL_dz聚合。二维 sigmoid 神经元学到的w和b对应一条分类直线。最终要记住这句话多样本训练不是让某一个点输出正确而是找到一组参数让整体平均损失下降并让不同类别尽量落在分类边界的不同侧。十、课后自测为什么X w b的结果是 4 个z而不是 1 个X.T dL_dz为什么能得到[dL/dw1, dL/dw2]为什么w1*x1 w2*x2 b 0是分类边界b是斜率吗如果不是斜率和截距分别是什么如果z -2sigmoid 输出大于 0.5 还是小于 0.5预测为哪一类