吴恩达教授的深度学习课程第一门课《神经网络和深度学习》是入门AI领域的经典教材,其中第二周"神经网络基础"更是构建后续知识体系的重要基石。这部分内容主要围绕神经网络的基本数学原理展开,重点讲解了逻辑回归模型及其在二分类问题中的应用。
作为课程助教,我观察到许多初学者在完成第二周课后习题和代码实践时,容易陷入"跟着敲代码却不明原理"的困境。实际上,这个阶段的编程作业(如用Python实现逻辑回归)蕴含着深度学习最基础也最重要的思想:
这些核心概念会像DNA一样贯穿整个深度学习学习历程。我在指导学生的过程中发现,真正吃透这周的作业内容,后续学习卷积神经网络、循环神经网络时会轻松很多。
逻辑回归虽然是"回归"之名,实则是解决二分类问题的利器。其核心公式为:
ŷ = σ(wᵀx + b)
其中σ代表sigmoid函数:σ(z) = 1/(1+e⁻ᶻ)。这个函数的妙处在于能将任意实数映射到(0,1)区间,完美适配概率解释。
在作业实现中,初学者常犯的错误是:
提示:在Python实现时,建议先用np.random.randn()初始化参数,并记录各参数的维度。例如对于n维特征,w的shape应是(n,1),b则是标量。
单个样本的损失函数采用交叉熵形式:
L(ŷ,y) = -[y·log(ŷ)+(1-y)·log(1-ŷ)]
整个训练集的成本函数则是所有样本损失的平均:
J(w,b) = (1/m)·ΣL(ŷ⁽ⁱ⁾,y⁽ⁱ⁾)
在代码实现时,常见陷阱包括:
参数更新规则看似简单:
w := w - α·∂J/∂w
b := b - α·∂J/∂b
但实际编程时有几个关键细节:
我在首次实现时,曾因为忘记在梯度计算时除以m(样本数),导致模型完全无法收敛。这个bug花了两小时才排查出来,教训深刻。
作业使用的猫分类数据集包含:
标准预处理流程:
python复制# 示例代码片段
train_set_x_flatten = train_set_x_orig.reshape(train_set_x_orig.shape[0], -1).T
test_set_x_flatten = test_set_x_orig.reshape(test_set_x_orig.shape[0], -1).T
train_set_x = train_set_x_flatten/255.
test_set_x = test_set_x_flatten/255.
sigmoid函数:
python复制def sigmoid(z):
s = 1 / (1 + np.exp(-z))
return s
注意处理大数值时的溢出问题,可添加数值截断。
初始化参数:
python复制def initialize_with_zeros(dim):
w = np.zeros((dim, 1))
b = 0.0
return w, b
对于深层网络,全零初始化可能引发对称性问题,但逻辑回归中是可接受的。
前向传播与反向传播:
python复制def propagate(w, b, X, Y):
# 前向传播
A = sigmoid(np.dot(w.T, X) + b)
cost = -np.mean(Y * np.log(A) + (1-Y) * np.log(1-A))
# 反向传播
dw = np.dot(X, (A-Y).T) / m
db = np.mean(A-Y)
grads = {"dw": dw, "db": db}
return grads, cost
这里矩阵运算的顺序和维度广播是调试重点。
完整训练流程:
python复制def optimize(w, b, X, Y, num_iterations, learning_rate):
costs = []
for i in range(num_iterations):
grads, cost = propagate(w, b, X, Y)
dw = grads["dw"]
db = grads["db"]
w = w - learning_rate * dw
b = b - learning_rate * db
if i % 100 == 0:
costs.append(cost)
params = {"w": w, "b": b}
grads = {"dw": dw, "db": db}
return params, grads, costs
调试技巧:
典型报错:
code复制ValueError: shapes (12288,209) and (12288,209) not aligned
解决方案:
可能原因:
诊断方法:
python复制def predict(w, b, X):
Y_prediction = sigmoid(np.dot(w.T, X) + b) > 0.5
return Y_prediction
症状:
解决方法:
完成基础作业后,可以尝试以下扩展练习:
一个有趣的发现是:虽然这个模型结构简单,但在猫分类测试集上能达到约70%准确率。这说明即使不用复杂CNN,良好的特征工程配合基础模型也能获得不错效果。
我在教学过程中会特别强调维度检查的习惯培养。建议在每个关键运算后添加assert语句,例如:
python复制assert(w.shape == (num_px * num_px * 3, 1))
这能节省大量调试时间。