深度学习:反向传播算法的数学本质与实现细节
1. 从“猜数字”到“调参数”反向传播到底在做什么很多朋友刚接触深度学习时都会被“反向传播”这个词唬住觉得它高深莫测。其实它的核心思想非常朴素。想象一下你正在教一个完全不懂事的小朋友猜数字。你心里想一个数字“5”他第一次猜了“10”。你告诉他“猜大了。”他下一次就会往小了猜比如“8”。你再说“还是大了。”他继续调整猜“6”……如此反复直到猜中“5”。反向传播算法本质上就是这个“猜数字”过程的自动化、数学化版本。只不过我们教的不是小朋友而是一个由成千上万个参数权重和偏置构成的神经网络。网络的“猜测”就是它的预测输出我们心里的“数字”就是真实的标签数据。每次网络猜错我们都需要告诉它“你猜大了还是猜小了具体大了多少而且是网络里哪一部分的参数导致了这次猜错”这个“告诉”的过程就是计算误差损失并将这个误差信号一层一层地、精确地“分配”回网络中的每一个参数告诉它们各自应该承担多少“责任”以及应该朝哪个方向调整。反向传播就是这套高效、精确的“误差分配”机制。它之所以强大是因为它利用微积分中的链式法则将总误差这个单一信号分解成了对每一个参数的微小调整指令。所以如果你觉得反向传播很抽象不妨先记住这个画面一个超级复杂的机器它每次犯错后都能通过一套精密的数学规则自动找出身上成千上万个旋钮中每一个应该拧动多少、往哪个方向拧从而让自己下次更接近正确答案。这篇文章我们就来亲手拆解这套精密的数学规则看看它到底是如何运作的。我会尽量用最直观的方式带你走过从直觉到公式再到代码实现的完整路径。2. 神经网络的“前因”与“后果”前向传播与损失函数在深入反向传播之前我们必须把神经网络的“正向”工作流程搞清楚这是所有计算的基础。你可以把神经网络想象成一个多层的、由简单计算单元神经元串联起来的流水线。2.1 前向传播数据如何流动假设我们有一个3层的网络输入层、隐藏层、输出层。对于第l层的第j个神经元它做的事情非常固定收集信息它接收来自上一层l-1层所有神经元的输出信号a_k^{l-1}每个信号都通过一个连接权重ω_{jk}^l进行加权。同时它自己还有一个“偏好”参数叫偏置b_j^l。汇总计算把所有加权后的信号加起来再加上自己的偏置得到一个“净输入”z_j^l。用公式写就是z_j^l (ω_{j1}^l * a_1^{l-1}) (ω_{j2}^l * a_2^{l-1}) ... (ω_{jK}^l * a_K^{l-1}) b_j^l更紧凑的写法是向量和矩阵的乘法z^l W^l * a^{l-1} b^l。这里的W^l就是权重矩阵。激活加工这个净输入z_j^l通常还不会直接作为本神经元的输出因为它只是一个线性组合。我们需要给它加点“非线性”的调料让它能表达更复杂的关系。这个调料就是激活函数σ比如Sigmoid、ReLU。所以该神经元的最终输出是a_j^l σ(z_j^l)数据从输入层a^0也就是原始数据x开始经过一层层的“加权求和 - 加偏置 - 激活”的加工最终到达输出层a^L得到网络的预测值。这个过程就叫前向传播。它决定了给定一组参数所有权重W和偏置b和输入数据x时网络会给出什么样的答案。2.2 损失函数衡量“猜”得有多错网络给出了预测a^L但我们有标准答案y标签。怎么量化这个“猜”的误差呢这就是损失函数C的工作。最简单的损失函数是均方误差MSE它计算预测值和真实值之间差距的平方和C 1/2 * ||y - a^L||^2 1/2 * Σ (y_k - a_k^L)^2这里的1/2是为了后续求导时形式更简洁而加上的系数。损失函数C的值越大说明网络当前错得越离谱C值越小说明预测越准。我们的终极目标就是通过调整网络中所有的W和b让这个损失函数C的值尽可能变小。这本质上是一个在高维空间参数空间中寻找最低点的优化问题。而梯度下降法告诉我们要找到最低点我们需要知道当前位置的“坡度”方向也就是梯度。反向传播算法的核心使命就是高效地计算出损失函数C相对于网络中每一个参数每一个ω和b的梯度偏导数。有了梯度我们就知道每个参数应该朝哪个方向、移动多少才能让总误差C下降。3. 链式法则反向传播的数学引擎梯度下降指明了方向但如何计算成千上万个参数的梯度呢手动计算是不可想象的。这里微积分中的链式法则就成为了我们的超级工具。链式法则处理的是复合函数的求导问题。举个简单的例子假设C是a的函数a又是z的函数z是b的函数。那么C关于b的变化率导数可以这样计算dC/db (dC/da) * (da/dz) * (dz/db)看C对b的导数被分解成了几个更简单、更局部的导数的乘积。这正是反向传播的精髓将输出层的总误差一层层地、像剥洋葱一样反向分解到每一层、每一个参数上。在神经网络中这种依赖关系更长、更复杂。一个输出层的误差会通过层层激活函数和线性变换追溯到最开始的输入权重上。反向传播算法巧妙地定义了一个关键的中间变量——误差项 δ来标准化和简化这个链式求导的过程。我们定义第l层第j个神经元的误差项为δ_j^l ∂C / ∂z_j^l这个δ_j^l非常关键它衡量了该神经元的“净输入”z_j^l的微小变化会对最终的总损失C产生多大的影响。我们可以把它理解为该神经元对最终错误所应承担的“责任”或“敏感度”。一旦我们知道了每一层每一个神经元的δ计算参数的梯度就变得异常简单。4. 反向传播四大基本方程的推导与解读现在让我们亲手推导出反向传播的四个核心方程。我强烈建议你拿出纸笔跟着一起算这是理解它最有效的方式。我们沿用之前的符号L是总层数σ是激活函数z^l是l层的净输入a^l是l层的激活输出。4.1 方程一输出层的误差计算从哪里开始当然是从终点——输出层第L层开始。对于输出层的第j个神经元它的误差项δ_j^L根据定义是∂C / ∂z_j^L。 根据链式法则这个误差可以拆解为损失C对神经元输出a_j^L的导数乘以a_j^L对其净输入z_j^L的导数。δ_j^L (∂C / ∂a_j^L) * (∂a_j^L / ∂z_j^L)第一项∂C / ∂a_j^L这是损失函数对输出层激活值的导数。如果我们使用前面提到的均方误差损失C 1/2 Σ (y_k - a_k^L)^2那么对特定的a_j^L求导结果就是(a_j^L - y_j)。这一项直接衡量了预测值与真实值的差距。第二项∂a_j^L / ∂z_j^L这就是激活函数σ在其输入z_j^L处的导数记作σ(z_j^L)。例如如果σ是Sigmoid函数其导数就是σ(z)*(1-σ(z))。因此输出层的误差方程为δ_j^L (a_j^L - y_j) * σ(z_j^L)用向量形式可以优雅地写成δ^L ∇_a C ⊙ σ(z^L)这里的∇_a C是损失函数对输出层激活值的梯度向量就是(a^L - y)⊙表示逐元素相乘哈达玛积。这个方程非常直观输出层的误差正比于“预测误差”和“激活函数在当前位置的斜率”。4.2 方程二将误差反向传递到任意层这是反向传播最巧妙的一步。我们已经知道了第l1层的误差δ^{l1}如何求出第l层的误差δ^l呢 我们想求δ_j^l ∂C / ∂z_j^l。同样使用链式法则但这次路径更长一些。z_j^l影响a_j^l而a_j^l会影响下一层l1层所有神经元的净输入z_k^{l1}进而影响最终的损失C。δ_j^l (∂C / ∂z_j^l) (∂C / ∂a_j^l) * (∂a_j^l / ∂z_j^l) (∂C / ∂a_j^l) * σ(z_j^l)现在问题转化为求∂C / ∂a_j^l。由于a_j^l会通过权重影响到下一层的每一个z_k^{l1}我们需要考虑所有可能的路径这就是全连接网络的特点。再次运用链式法则这里是多元函数的全微分思想∂C / ∂a_j^l Σ_k [ (∂C / ∂z_k^{l1}) * (∂z_k^{l1} / ∂a_j^l) ] Σ_k [ δ_k^{l1} * ω_{kj}^{l1} ]解释一下∂C / ∂z_k^{l1}就是下一层第k个神经元的误差δ_k^{l1}。而∂z_k^{l1} / ∂a_j^l就是连接l层第j个神经元和l1层第k个神经元的权重ω_{kj}^{l1}因为z_k^{l1} Σ_j ω_{kj}^{l1} * a_j^l b_k^{l1}对a_j^l求导自然就是ω_{kj}^{l1}。把这个结果代回去我们就得到了误差反向传播的核心方程δ_j^l ( Σ_k [ ω_{kj}^{l1} * δ_k^{l1} ] ) * σ(z_j^l)用矩阵和向量形式写更加简洁δ^l ( (W^{l1})^T * δ^{l1} ) ⊙ σ(z^l)这个方程是反向传播的灵魂。它告诉我们第l层的误差可以通过下一层l1层的误差δ^{l1}乘以两层之间的权重矩阵的转置(W^{l1})^T来获得然后再逐元素乘上本层激活函数的导数。权重矩阵的转置操作完美地实现了误差从后一层到前一层的“分配”和“路由”。这就像是你把总误差这个包裹按照来时的连接路径权重的比例原路打包发回给上一层的每个神经元。4.3 方程三和四计算权重的梯度一旦我们有了某一层的误差项δ^l计算该层参数的梯度就变得轻而易举。对于偏置b_j^l的梯度∂C / ∂b_j^l (∂C / ∂z_j^l) * (∂z_j^l / ∂b_j^l) δ_j^l * 1 δ_j^l因为z_j^l ... b_j^l所以∂z_j^l / ∂b_j^l 1。一个神经元的偏置梯度直接等于该神经元的误差项δ。这非常直观这个神经元对最终错误越“敏感”δ越大它的偏置就越需要调整。对于权重ω_{jk}^l的梯度∂C / ∂ω_{jk}^l (∂C / ∂z_j^l) * (∂z_j^l / ∂ω_{jk}^l) δ_j^l * a_k^{l-1}因为z_j^l ... ω_{jk}^l * a_k^{l-1} ...所以∂z_j^l / ∂ω_{jk}^l a_k^{l-1}。连接l-1层第k个神经元到l层第j个神经元的权重梯度等于l层神经元的误差δ_j^l乘以l-1层神经元的激活输出a_k^{l-1}。这个结果有着美妙的物理意义权重梯度的大小取决于两个因素1它传递信号的“下游”神经元j的误差有多大2它接收信号的“上游”神经元k的激活值有多强。如果下游神经元责任重大δ大且上游神经元信号强烈a大那么这个连接权重就对最终错误影响很大需要大幅调整。反之如果上游神经元没怎么激活a接近0那么即使下游误差大这个权重的影响也有限。5. 从数学到代码手撕一个迷你版的反向传播理论推导完了不写代码总觉得不踏实。下面我们用最纯粹的Python和NumPy实现一个包含前向传播和反向传播的简单神经网络来训练一个解决异或XOR问题的模型。这个例子虽小但五脏俱全能让你彻底看清数据流动和梯度计算的每一个细节。import numpy as np # 定义激活函数Sigmoid及其导数 def sigmoid(x): return 1 / (1 np.exp(-x)) def sigmoid_derivative(x): s sigmoid(x) return s * (1 - s) # 超参数设置 input_size 2 hidden_size 4 output_size 1 learning_rate 0.5 epochs 10000 # 初始化权重和偏置 - 使用小随机数打破对称性 np.random.seed(42) W1 np.random.randn(hidden_size, input_size) * 0.1 # 第一层权重 (4x2) b1 np.zeros((hidden_size, 1)) # 第一层偏置 (4x1) W2 np.random.randn(output_size, hidden_size) * 0.1 # 第二层权重 (1x4) b2 np.zeros((output_size, 1)) # 第二层偏置 (1x1) # XOR 问题的输入和标签 X np.array([[0, 0], [0, 1], [1, 0], [1, 1]]).T # 形状 (2, 4) Y np.array([[0], [1], [1], [0]]) # 形状 (1, 4) # 开始训练循环 for i in range(epochs): # ---------- 前向传播 ---------- # 第一层 Z1 np.dot(W1, X) b1 # (4,4) (4,2) (2,4) (4,1)广播 A1 sigmoid(Z1) # (4,4) # 第二层输出层 Z2 np.dot(W2, A1) b2 # (1,4) (1,4) (4,4) (1,1)广播 A2 sigmoid(Z2) # (1,4) 这是网络的预测输出 # ---------- 计算损失均方误差 ---------- m X.shape[1] # 样本数这里是4 loss np.sum((A2 - Y) ** 2) / (2 * m) if i % 1000 0: print(fEpoch {i}, Loss: {loss:.6f}) # ---------- 反向传播核心 ---------- # 计算输出层(L2)的误差 delta2 dA2 A2 - Y # 损失对A2的梯度 (1,4) delta2 dA2 * sigmoid_derivative(Z2) # 方程1: δ^L ∇_aC ⊙ σ(z^L) (1,4) # 计算隐藏层(L1)的误差 delta1 dZ1 np.dot(W2.T, delta2) # 方程2的一部分: (W^{l1})^T * δ^{l1} (4,4) (4,1) (1,4)注意维度 # 注意W2形状是(1,4)其转置是(4,1)。delta2形状是(1,4)。 # 我们需要的是 (4,4) 的 dZ1每个样本对应一个(4,1)的误差向量。 # 更准确的实现是dZ1 np.dot(W2.T, delta2) 得到 (4,4)因为 (4,1) (1,4) - (4,4) # 但为了清晰我们按样本循环或使用广播。这里我们采用向量化方式 # 实际上delta2 是 (1,4)W2.T 是 (4,1)它们的点积是 (4,4)。这没问题它计算了所有样本的误差组合。 # 我们继续 delta1 dZ1 * sigmoid_derivative(Z1) # 方程2: δ^l ((W^{l1})^T δ^{l1}) ⊙ σ(z^l) (4,4) # ---------- 计算梯度 ---------- # 方程4: ∂C/∂W^l δ^l * (a^{l-1})^T dW2 np.dot(delta2, A1.T) / m # (1,4) (1,4) (4,4)^T - (1,4) (4,4)? 等等 # 注意维度delta2是(1,4)A1是(4,4)。A1.T是(4,4)。点积 (1,4) (4,4) (1,4)这正是W2的梯度形状。 db2 np.sum(delta2, axis1, keepdimsTrue) / m # 方程3: ∂C/∂b^l sum(δ^l) (1,1) # 对于第一层参数 dW1 np.dot(delta1, X.T) / m # (4,2) (4,4) (4,2)^T? X是(2,4)X.T是(4,2)。(4,4) (4,2) (4,2) db1 np.sum(delta1, axis1, keepdimsTrue) / m # (4,1) # ---------- 更新参数梯度下降 ---------- W2 W2 - learning_rate * dW2 b2 b2 - learning_rate * db2 W1 W1 - learning_rate * dW1 b1 b1 - learning_rate * db1 # 训练完成后测试一下 print(\n训练完成测试结果) for i in range(X.shape[1]): x_sample X[:, i].reshape(-1, 1) # 前向传播一次 z1 np.dot(W1, x_sample) b1 a1 sigmoid(z1) z2 np.dot(W2, a1) b2 a2 sigmoid(z2) pred 1 if a2 0.5 else 0 print(f输入: {X[:, i]}, 预测输出: {a2[0,0]:.4f}, 预测类别: {pred}, 真实类别: {Y[i,0]})运行这段代码你会看到损失从最初的约0.25逐渐下降到接近0并且网络最终能正确学习到XOR的逻辑(0,0)-0,(0,1)-1,(1,0)-1,(1,1)-0。代码中的注释详细对应了反向传播四大方程的实现。特别要注意矩阵维度的变化这是实现中容易出错的地方。np.dot和*逐元素乘的区别以及转置T的使用正是将数学方程转化为高效矩阵运算的关键。6. 深入细节实现中的陷阱与优化技巧纸上推导和简单实现之后在实际的深度学习框架如PyTorch、TensorFlow中反向传播是自动完成的。但理解其底层细节能帮助你在遇到问题时进行调试并理解更高级的优化技术。6.1 梯度消失与爆炸深度网络的阿喀琉斯之踵仔细观察误差反向传播方程δ^l ( (W^{l1})^T * δ^{l1} ) ⊙ σ(z^l)。在反向传播过程中误差信号δ需要经过一连串的权重矩阵转置相乘和激活函数导数逐元素相乘。如果权重矩阵W的值通常小于1初始化不当或训练导致那么连续相乘会导致δ指数级减小传到前面几层时已经微乎其微这就是梯度消失。反之如果权重值通常大于1δ会指数级增大导致梯度爆炸参数更新步伐巨大网络无法收敛。激活函数的选择至关重要。传统的Sigmoid函数其导数σ(z)最大值只有0.25当z0时并且当z的绝对值很大时导数趋近于0。这意味着在反向传播中每经过一个Sigmoid层梯度信号至少会被打上0.25的折扣层数一深前面层的梯度就几乎为0了。这也是为什么现代深度学习普遍使用ReLURectified Linear Unit及其变体作为激活函数。ReLU的导数在输入为正时为1为负时为0。导数为1的部分完美地保留了梯度避免了因激活函数导致的梯度衰减极大地缓解了梯度消失问题使得训练非常深的网络成为可能。6.2 初始化策略给训练一个好的起点既然权重的大小会影响梯度传播那么如何初始化权重就成了一门学问。早期的全零初始化会导致所有神经元对称更新失去意义。小随机数初始化如从标准正态分布N(0, 0.01)采样对于浅层网络可行但对于深层网络可能会在传播过程中使信号过小或过大。现在广泛使用的是Xavier初始化针对Sigmoid/Tanh和He初始化针对ReLU。它们的核心思想是让每一层输出的方差尽可能保持一致从而在前向和反向传播中维持信号强度在一个合理的范围内。例如He初始化建议从均值为0、方差为2/n_in的正态分布中采样权重其中n_in是输入该层的神经元数量。在PyTorch中你可以通过torch.nn.init.kaiming_normal_来使用它。一个好的初始化能显著加速模型收敛并提高训练稳定性。6.3 自动微分框架如何优雅地实现它你可能好奇像PyTorch这样的框架我们只需要定义前向传播调用loss.backward()梯度就自动算好了它是怎么做到的它并没有显式地让我们去写上面那四个方程。其背后的魔法叫做自动微分。框架在计算图中记录了我们所有的张量操作加法、乘法、矩阵乘、激活函数等。每个操作不仅计算输出值还同时注册一个“反向函数”。当调用backward()时框架从最终的损失张量开始沿着计算图逆向回溯根据链式法则依次调用每个操作的“反向函数”将梯度一步步传递回去。这本质上和我们手动推导的数学过程是完全一致的只是由框架自动、高效地完成并且可以处理任意复杂的计算图结构。理解了我们手动推导的过程再看自动微分你就会觉得它不再是黑盒而是一个自然而优雅的工程实现。

相关新闻

S-Lab for Advanced Intelligence:南洋理工大学AI研究的创新引擎

S-Lab for Advanced Intelligence:南洋理工大学AI研究的创新引擎

1. 从“象牙塔”到“发动机”:S-Lab的独特定位 如果你在AI圈子里待过几年,肯定会发现一个挺有意思的现象:很多顶尖大学的实验室,论文发得又多又快,模型刷榜一个比一个猛,但当你真的想把这些技术用在自己的项…

2026/7/5 11:55:58 阅读更多 →
Python变量与数据类型:从零开始的编程基石

Python变量与数据类型:从零开始的编程基石

1. 初识变量:给数据贴个“标签” 刚打开Python解释器或者你的代码编辑器,面对一片空白,是不是有点无从下手的感觉?别慌,这感觉每个程序员都经历过。咱们今天要聊的,就是编程世界里最基础、也最核心的两个概…

2026/5/17 5:51:19 阅读更多 →
Lychee Rerank MM企业实操:构建企业内网知识库的图文混合检索增强模块

Lychee Rerank MM企业实操:构建企业内网知识库的图文混合检索增强模块

Lychee Rerank MM企业实操:构建企业内网知识库的图文混合检索增强模块 1. 企业知识库检索的痛点与解决方案 现代企业内网知识库中充斥着各种格式的内容:产品文档配有截图、技术报告包含图表、培训材料图文并茂。传统的文本检索系统在处理这种混合内容时…

2026/7/4 22:19:04 阅读更多 →

最新新闻

FFBox:免费智能多媒体转码工具箱,让视频处理变简单

FFBox:免费智能多媒体转码工具箱,让视频处理变简单

FFBox:免费智能多媒体转码工具箱,让视频处理变简单 【免费下载链接】FFBox 一个多媒体转码百宝箱 / 一个 FFmpeg 的套壳 项目地址: https://gitcode.com/gh_mirrors/ff/FFBox 你是否曾因复杂的FFmpeg命令行而头疼?是否想要一个既专业又…

2026/7/5 20:46:25 阅读更多 →
Win11Debloat终极指南:3步告别Windows卡顿,免费提升50%系统性能

Win11Debloat终极指南:3步告别Windows卡顿,免费提升50%系统性能

Win11Debloat终极指南:3步告别Windows卡顿,免费提升50%系统性能 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes…

2026/7/5 20:46:25 阅读更多 →
如何用WeChatMsg重新定义个人数据主权:3个颠覆性实践路径

如何用WeChatMsg重新定义个人数据主权:3个颠覆性实践路径

如何用WeChatMsg重新定义个人数据主权:3个颠覆性实践路径 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/We…

2026/7/5 20:44:25 阅读更多 →
沉浸式国际象棋体验:如何用音效系统让每一步棋都充满戏剧感

沉浸式国际象棋体验:如何用音效系统让每一步棋都充满戏剧感

沉浸式国际象棋体验:如何用音效系统让每一步棋都充满戏剧感 【免费下载链接】chess A multiplayer chess platform 项目地址: https://gitcode.com/GitHub_Trending/ch/chess 想象一下这样的场景:深夜的在线国际象棋对局中,你精心策划…

2026/7/5 20:40:24 阅读更多 →
如何用sd快速构建你的个人脚本库:5个实用技巧

如何用sd快速构建你的个人脚本库:5个实用技巧

如何用sd快速构建你的个人脚本库:5个实用技巧 【免费下载链接】sd a cozy nest for your scripts 项目地址: https://gitcode.com/gh_mirrors/sd1/sd 你是否曾经花费大量时间在杂乱无章的脚本文件中寻找需要的工具?sd(script director…

2026/7/5 20:38:24 阅读更多 →
终极指南:如何用Slidev在5分钟内创建专业开发者演示文稿

终极指南:如何用Slidev在5分钟内创建专业开发者演示文稿

终极指南:如何用Slidev在5分钟内创建专业开发者演示文稿 【免费下载链接】slidev Presentation Slides for Developers 项目地址: https://gitcode.com/GitHub_Trending/sl/slidev 还在为技术分享的幻灯片制作烦恼吗?Slidev 是一款专为开发者设计…

2026/7/5 20:36:24 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻