吴恩达深度学习课程一神经网络和深度学习 第三周浅层神经网络一大家好我是你们的技术博主。今天我们来聊聊吴恩达深度学习课程中一个非常关键的章节——第三周的浅层神经网络一。如果你已经跟随课程学完了逻辑回归那么恭喜你你已经迈出了深度学习的第一步。接下来我们将从单神经元逻辑回归过渡到多层神经元也就是神经网络的基础架构。这篇文章会用最通俗的语言搭配可运行的代码带你理解什么是浅层神经网络以及它如何工作。## 什么是浅层神经网络在逻辑回归中我们只有一个神经元输入特征x通过线性组合z w*x b然后经过激活函数如 sigmoid得到输出。但现实问题往往更复杂比如图像识别、语音处理等单神经元无法捕捉到数据中的非线性关系。这时候我们就需要引入隐藏层把多个神经元组合起来。浅层神经网络通常指只包含一个隐藏层的神经网络。用吴恩达老师的话说它就像是一个“迷你”版本的深度学习模型。这个隐藏层可以学习到输入特征的一些中间表示然后再传给输出层做最终预测。举个例子假设我们要预测一个房子的价格输入特征可能包括面积、卧室数量、楼层等。隐藏层的神经元可以学习到更高级的特征比如“房间大小”或“居住舒适度”这些特征再被组合成最终的价格预测。### 网络结构拆解一个浅层神经网络的结构如下-输入层特征向量x维度为(n_x, m)其中n_x是特征数m是样本数。-隐藏层有n_h个神经元每个神经元都有自己的权重W和偏置b。这里“隐藏”是因为我们看不到中间结果它们只作为内部表示。-输出层输出预测值y_hat维度为(1, m)。数学上前向传播过程可以写成- 隐藏层z^[1] W^[1] * X b^[1]然后a^[1] activation(z^[1])- 输出层z^[2] W^[2] * a^[1] b^[2]然后a^[2] sigmoid(z^[2])这里的上标[1]和[2]表示层数。## 为什么需要激活函数你可能已经注意到我们用了激活函数。如果没有激活函数隐藏层和输出层就只是线性组合的叠加那本质上就退化成逻辑回归了。激活函数给网络引入了非线性使得它可以学习复杂的模式。常用的激活函数有-sigmoid输出在 (0,1) 之间适合二分类输出层。-tanh输出在 (-1,1) 之间通常比 sigmoid 更好因为它的均值是 0。-ReLUmax(0, z)计算简单能缓解梯度消失问题是目前最常用的隐藏层激活函数。在浅层神经网络中隐藏层常用 tanh 或 ReLU输出层用 sigmoid。## 代码示例一手动实现一个浅层神经网络为了让你直观感受我们用一个简单的数据集来演示。这里我们生成两个半月形的数据点然后用一个隐藏层神经网络进行分类。pythonimport numpy as npimport matplotlib.pyplot as pltfrom sklearn.datasets import make_moons# 生成数据集两个半月形用于二分类np.random.seed(1)X, y make_moons(n_samples300, noise0.2, random_state1)y y.reshape(1, -1) # 转为 (1, m) 形状# 定义激活函数def sigmoid(z): return 1 / (1 np.exp(-z))def tanh(z): return np.tanh(z)# 初始化参数def initialize_parameters(n_x, n_h, n_y): W1 np.random.randn(n_h, n_x) * 0.01 # 小随机数防止梯度消失 b1 np.zeros((n_h, 1)) W2 np.random.randn(n_y, n_h) * 0.01 b2 np.zeros((n_y, 1)) return W1, b1, W2, b2# 前向传播def forward_propagation(X, W1, b1, W2, b2): Z1 np.dot(W1, X) b1 A1 tanh(Z1) # 隐藏层用tanh Z2 np.dot(W2, A1) b2 A2 sigmoid(Z2) # 输出层用sigmoid return A1, A2# 计算损失def compute_loss(A2, y): m y.shape[1] loss -np.sum(y * np.log(A2) (1 - y) * np.log(1 - A2)) / m return loss# 测试一下W1, b1, W2, b2 initialize_parameters(2, 4, 1) # 2个特征4个隐藏神经元A1, A2 forward_propagation(X, W1, b1, W2, b2)print(初始损失:, compute_loss(A2, y))这段代码展示了如何从零搭建一个浅层神经网络。注意隐藏层有 4 个神经元我们用了 tanh 激活函数。初始损失很大是因为参数还没训练。## 反向传播让网络学习前向传播只是计算输出要让网络学习我们需要反向传播Backpropagation。反向传播通过计算损失函数对每层参数的梯度然后更新参数使得损失降低。对于浅层神经网络反向传播的公式如下- 输出层dZ2 A2 - y这是交叉熵损失的梯度- 隐藏层dZ1 (W2^T * dZ2) * (1 - tanh(Z1)^2)tanh 的导数是 1 - tanh^2- 然后更新参数W W - learning_rate * dWb b - learning_rate * db这个过程和逻辑回归类似但多了链式法则的层级传递。## 代码示例二完整的训练循环下面我们加入反向传播和训练循环让网络真正学会分类。python# 反向传播def backward_propagation(X, y, A1, A2, W2, Z1): m X.shape[1] # 输出层梯度 dZ2 A2 - y dW2 np.dot(dZ2, A1.T) / m db2 np.sum(dZ2, axis1, keepdimsTrue) / m # 隐藏层梯度使用tanh导数 dZ1 np.dot(W2.T, dZ2) * (1 - np.power(A1, 2)) # tanh导数 dW1 np.dot(dZ1, X.T) / m db1 np.sum(dZ1, axis1, keepdimsTrue) / m return dW1, db1, dW2, db2# 训练函数def train(X, y, n_h, learning_rate0.1, num_iterations1000): n_x X.shape[0] n_y y.shape[0] W1, b1, W2, b2 initialize_parameters(n_x, n_h, n_y) for i in range(num_iterations): # 前向传播 A1, A2 forward_propagation(X, W1, b1, W2, b2) loss compute_loss(A2, y) # 反向传播 dW1, db1, dW2, db2 backward_propagation(X, y, A1, A2, W2, None) # 更新参数 W1 - learning_rate * dW1 b1 - learning_rate * db1 W2 - learning_rate * dW2 b2 - learning_rate * db2 if i % 100 0: print(fIteration {i}, loss: {loss:.4f}) return W1, b1, W2, b2# 运行训练print(开始训练...)W1, b1, W2, b2 train(X, y, n_h4, learning_rate0.5, num_iterations1000)# 预测并计算准确率_, A2 forward_propagation(X, W1, b1, W2, b2)predictions (A2 0.5).astype(int)accuracy np.mean(predictions y)print(f训练准确率: {accuracy * 100:.2f}%)这段代码运行后你会看到损失逐渐下降最终准确率可以达到 90% 以上。这就是浅层神经网络的力量——只需一个隐藏层就能学会复杂的决策边界。## 调试与注意事项在实际应用中你可能会遇到一些问题1.隐藏层神经元数量太少会欠拟合太多会过拟合。通常从 4-10 开始尝试。2.学习率太大可能导致损失震荡太小则收敛慢。0.1 到 1.0 是常见范围。3.初始化权重不能全零否则所有神经元对称学习效果差。用小随机数打破对称性。4.激活函数选择隐藏层用 tanh 或 ReLU输出层用 sigmoid二分类或 softmax多分类。## 总结通过这篇文章我们深入浅出地学习了浅层神经网络的核心概念包括它的结构、前向传播、反向传播以及如何用代码实现一个可工作的网络。吴恩达老师的课程里这部分内容是为后续深度神经网络打基础的关键。关键要点回顾- 浅层神经网络有一个隐藏层可以学习非线性关系。- 激活函数如 tanh、ReLU是引入非线性的关键。- 反向传播通过链式法则计算梯度然后更新参数。- 代码实现中注意参数初始化、学习率调整和损失监控。希望这篇文章能帮你扫清学习障碍。下一期我们继续深入第三周的内容聊聊如何选择隐藏层大小、正则化技巧以及如何用更高级的库如 TensorFlow 或 PyTorch快速实现。如果你有任何问题欢迎在评论区留言我们一起探讨。