2005:我在硅谷种AI-第6集:手写数字的5层尊严(神经网络初登场)
第6集:手写数字的5层尊严(神经网络初登场) 摘要:陆眠穿越回2005年斯坦福,面临数学系百年手写试卷数字化难题。他利用NIST数据集(MNIST前身)构建5层全连接神经网络(784-256-128-64-10),克服2005年技术限制:手动解析二进制数据、使用sigmoid激活函数遭遇梯度消失、在Sun服务器上整夜训练、手推反向传播公式。最终实现96.2%的识别准确率,颠覆了"深度至上
笔言: 推荐AI相关我正在写故事: 我在蒸汽纪元证真理 【AI数学基础】和重生1995:我的数学模型能暴击【数学模型】
故事大纲(25集结构版)
核心设定:
主角陆眠,2025年谷歌Brain部门“反内卷”科学家,在演示极简可解释AI工具时遭遇数据回流异常,穿越回2005年2月的斯坦福AI实验室——面前只有Matlab 7.0、CRT显示器和一部诺基亚手机,但脑中装载着未来二十年简洁优雅的算法智慧。
第6集:手写数字的5层尊严(神经网络初登场)
- 契机:帮数学系录入百年手写考试卷
- 数据:MNIST的前身——NIST数据集(用光盘刻录传递)
- 第一个神经网络:5层全连接网络(输入784-256-128-64-10)
- 技术限制:
- 没有ReLU(用sigmoid,遭遇梯度消失)
- 没有GPU(在实验室Sun服务器上跑了一整夜)
- 没有自动求导(手推反向传播公式写满三页纸)
- 成果:识别准确率96.2%,震惊数学系
- 躺平金句:“如果5层网络足够解决MNIST,那为什么2012年需要AlexNet的8层?是不是我们该反思数据质量,而不是一味堆深度?”
下面是我个定制:
《2005:我在硅谷种AI》两个主题曲(大家评选一下):
种春天A版: 歌曲地址
种春天B版: 歌曲地址

第6集:手写数字的5层尊严(神经网络初登场)
数学系的“世纪难题”
斯坦福数学系的地下档案室里,弥漫着尘土和旧纸张的气息。海伦·米勒教授——一位七十多岁依然每天骑自行车上班的数学史专家——正对着一箱泛黄的试卷发愁。
“这是1905年到2005年的手写考试卷,大约三万页。”她轻轻拿起一张1912年的微积分试卷,上面的数字是用钢笔书写的花体字,“我们需要把它们数字化,建立可搜索的数据库。”
陆眠拿起其中一张。上面的“7”写得像法式长棍面包,“4”的顶部没有闭合,“9”的圈小得像针尖。更麻烦的是,百年来纸张质量、墨水褪色程度、甚至数学符号的写法都在变化。
“我们试过商业OCR软件。”米勒教授摇头,“最好的一个,在打印体上能达到99%,但对我们这些手写卷子……只有67%。而且会把积分符号∫认成f,把Σ认成E。”
“我们找过计算机系的学生帮忙。”她补充,“他们用模式匹配和特征提取的方法,准确率提到78%,但需要为每个年代的书写风格单独调整规则——三万页,我们调整不起。”
陆眠翻看着不同年代的试卷:1920年代的经济大萧条时期,学生用最便宜的铅笔,字迹又轻又细;1940年代战争期间,纸张粗糙,墨水常常晕开;1970年代,圆珠笔普及,数字开始变得圆润。
“这是一个风格多变但结构稳定的问题。”他喃喃自语,“数字0-9的基本结构百年未变,但每个人的写法都不同。”
“所以?”米勒教授期待地看着他。
“所以我们需要一个能自己学习本质特征的系统。”陆眠说,“而不是我们手动告诉它‘7应该有什么特征’。”
NIST数据集:2005年的“大数据”挑战
陆眠联系了国家标准与技术研究院(NIST),获得了他们的手写数字数据集——这是MNIST数据集的前身,包含60000张训练图像和10000张测试图像。
数据存储在四张CD-ROM上。
“没有云存储,没有迅雷下载。”艾米莉举着光盘,“我们要用光驱一张张读,然后用FTP传到实验室服务器。60000张图片,每张28×28像素——在2005年,这已经是‘大数据’了。”
更麻烦的是格式:图像以特殊的二进制格式存储,需要自己写解析代码。
代码段1:解析NIST二进制文件
function [images, labels] = read_nist_binary(filename)
% 2005年手写NIST二进制文件解析器
% 格式:前16字节是魔数,接着是样本数、行数、列数
fid = fopen(filename, 'rb', 'ieee-be'); % 大端序
% 读取魔数(用于验证文件类型)
magic = fread(fid, 1, 'int32');
if magic ~= 2051 % 图像文件的魔数
error('不是NIST图像文件');
end
num_images = fread(fid, 1, 'int32');
num_rows = fread(fid, 1, 'int32');
num_cols = fread(fid, 1, 'int32');
fprintf('读取%d张图像,每张%dx%d\n', num_images, num_rows, num_cols);
% 读取图像数据(每个像素1字节,0-255)
images = zeros(num_images, num_rows * num_cols);
for i = 1:num_images
img_data = fread(fid, num_rows * num_cols, 'uint8');
images(i, :) = double(img_data') / 255.0; % 归一化到[0,1]
end
fclose(fid);
% 如果有标签文件,也读取
if nargout > 1
label_file = strrep(filename, '-images', '-labels');
if exist(label_file, 'file')
[labels] = read_nist_labels(label_file);
end
end
end
当第一张数字“5”显示在Matlab界面上时,实验室里响起轻微的惊叹声。28×28的像素网格上,一个略微倾斜的手写数字浮现出来。
“784个像素点。”陆眠说,“每个像素是一个特征。传统的分类器面对784维特征会陷入维度灾难——但神经网络能自动学习哪些组合是重要的。”
神经网络设计:为什么是5层?
拉吉听到陆眠要建神经网络,立刻表示怀疑:“1980年代神经网络就热过,然后进入寒冬。单层感知器连XOR问题都解决不了,多层网络训练困难,梯度消失……”
“但现在是2005年。”陆眠在白板上画图,“我们有更好的算法理解,更多的数据,以及——虽然有限但比80年代强得多的计算能力。”
他设计了一个5层全连接网络:
- 输入层:784个神经元(对应28×28像素)
- 隐藏层1:256个神经元
- 隐藏层2:128个神经元
- 隐藏层3:64个神经元
- 输出层:10个神经元(对应数字0-9)
“为什么是5层?为什么不3层或8层?”艾米莉问。
“经验法则。”陆眠解释,“输入层到第一层隐藏层:从784到256,压缩约3倍;然后每层大约减半。这样能在保持表征能力的同时控制参数量。”
他计算总参数:
784×256 + 256×128 + 128×64 + 64×10 ≈ 235,000个权重
加上偏置:256+128+64+10 ≈ 458个
总计约235,458个参数。
“在2005年,这是可训练的上限。”陆眠说,“我们的服务器有2GB内存,训练时这些参数和中间激活值都要存下来。”
前向传播:信号如何穿越网络
基础公式
陆眠在白板上写下前向传播公式:
z⁽ˡ⁾ = W⁽ˡ⁾ a⁽ˡ⁻¹⁾ + b⁽ˡ⁾
a⁽ˡ⁾ = σ(z⁽ˡ⁾)
其中:
- l是层索引
- W是权重矩阵
- a是激活值(输入层a⁽⁰⁾就是输入图像)
- b是偏置向量
- σ是激活函数
“在2005年,我们主要用sigmoid函数:σ(z) = 1/(1+e⁻ᶻ)”陆眠写下公式,“它把任意实数映射到(0,1),可以看作‘神经元的激活概率’。”
代码段2:前向传播实现
function [a, z_cache] = forward_propagation(X, weights, biases)
% X: 输入数据,每行一个样本
% weights: 元胞数组,weights{l}是第l层的权重矩阵
% biases: 元胞数组,biases{l}是第l层的偏置向量
num_layers = length(weights) + 1; % 包括输出层
a = X; % 初始激活值是输入
z_cache = cell(num_layers-1, 1); % 缓存z值,反向传播时需要
% 隐藏层(使用sigmoid激活)
for l = 1:num_layers-2
z = a * weights{l}' + repmat(biases{l}, size(a,1), 1);
a = sigmoid(z);
z_cache{l} = z;
end
% 输出层(使用softmax激活)
z = a * weights{end}' + repmat(biases{end}, size(a,1), 1);
z_cache{end} = z;
% softmax: exp(z) / sum(exp(z))
exp_z = exp(z - max(z, [], 2)); % 减去最大值防止数值溢出
a = exp_z ./ sum(exp_z, 2);
end
function y = sigmoid(x)
y = 1 ./ (1 + exp(-x));
end
当陆眠在小数据集上测试前向传播时,一个严重问题出现了。
“看输出层。”他指着屏幕,“对于同一个数字‘5’,十个输出神经元的概率分别是:[0.12, 0.08, 0.09, 0.11, 0.10, 0.12, 0.08, 0.09, 0.10, 0.11]——几乎均匀分布。”
“为什么网络没有偏好?”艾米莉问。
“因为权重是随机初始化的。”陆眠解释,“我们用小随机数初始化权重,比如从标准正态分布采样乘以0.01。这样初始时网络相当于随机猜测。”
“那怎么让它学习?”
“通过反向传播和梯度下降。”陆眠说,“让网络看到它的预测与真实标签的差距,然后反向调整权重。”
损失函数:量化“错误”的艺术
陆眠选择交叉熵损失(cross-entropy loss)作为损失函数,而不是均方误差。
“对于分类问题,交叉熵更合适。”他写出公式:
L = -Σ y_i log(ŷ_i)
其中y是真实标签的one-hot编码,ŷ是预测概率。
“假设真实数字是5,那么y₅=1,其他=0。如果网络预测ŷ₅=0.9,那么L = -log(0.9) ≈ 0.105;如果预测ŷ₅=0.1,那么L = -log(0.1) ≈ 2.303。损失越大,说明预测越错。”
代码段3:交叉熵损失计算
function [loss, accuracy] = compute_loss_accuracy(y_pred, y_true)
% y_pred: 预测概率,每行一个样本,每列一个类别
% y_true: 真实标签,可以是类别索引或one-hot编码
% 如果y_true是类别索引,转换为one-hot
if size(y_true, 2) == 1
num_classes = size(y_pred, 2);
y_true_onehot = zeros(size(y_pred));
for i = 1:length(y_true)
y_true_onehot(i, y_true(i)+1) = 1; % 注意:数字0对应第1列
end
y_true = y_true_onehot;
end
% 交叉熵损失
epsilon = 1e-15; % 防止log(0)
y_pred = max(min(y_pred, 1-epsilon), epsilon); % 夹紧到[epsilon, 1-epsilon]
loss = -sum(sum(y_true .* log(y_pred))) / size(y_pred, 1);
% 准确率
[~, pred_classes] = max(y_pred, [], 2);
[~, true_classes] = max(y_true, [], 2);
accuracy = sum(pred_classes == true_classes) / length(true_classes);
end
反向传播:误差的逆向旅程
手动推导:三页纸的数学
陆眠没有直接写代码,而是在白板上用两个小时推导反向传播公式。这是关键的教学时刻。
“考虑一个简单情况:三层网络。”他画图,“输入x,隐藏层h,输出ŷ。真实标签y。”
“前向传播:
z₁ = W₁x + b₁
h = σ(z₁)
z₂ = W₂h + b₂
ŷ = softmax(z₂)
L = -Σ y_i log(ŷ_i)
“现在我们要计算∂L/∂W₂和∂L/∂W₁,也就是损失对权重的梯度。”
他一步步推导:
-
输出层梯度:
∂L/∂z₂ = ŷ - y # softmax交叉熵的漂亮性质 ∂L/∂W₂ = (∂L/∂z₂) hᵀ ∂L/∂b₂ = ∂L/∂z₂ -
隐藏层梯度(链式法则):
∂L/∂h = W₂ᵀ (∂L/∂z₂) ∂L/∂z₁ = (∂L/∂h) ⊙ σ'(z₁) # ⊙是逐元素乘法 ∂L/∂W₁ = (∂L/∂z₁) xᵀ ∂L/∂b₁ = ∂L/∂z₁
“σ’(z₁)是sigmoid的导数:σ(z)(1-σ(z))。”陆眠强调,“注意这里:如果σ(z₁)接近0或1,那么σ’(z₁)接近0。这就是梯度消失的根源!”
对于5层网络,公式推广为:
δ⁽ˡ⁾ = (W⁽ˡ⁺¹⁾)ᵀ δ⁽ˡ⁺¹⁾ ⊙ σ'(z⁽ˡ⁾)
∂J/∂W⁽ˡ⁾ = δ⁽ˡ⁾ (a⁽ˡ⁻¹⁾)ᵀ
代码段4:反向传播实现
function [grad_W, grad_b] = backward_propagation(X, y_true, weights, biases, z_cache, a_cache)
% X: 输入数据
% y_true: 真实标签(one-hot)
% weights, biases: 当前网络参数
% z_cache, a_cache: 前向传播缓存的中间值
num_layers = length(weights);
batch_size = size(X, 1);
grad_W = cell(num_layers, 1);
grad_b = cell(num_layers, 1);
% 前向传播获取预测值(如果未提供缓存)
if nargin < 6
[a_final, z_cache, a_cache] = forward_propagation_with_cache(X, weights, biases);
else
a_final = a_cache{end};
end
% 输出层误差:∂L/∂z_output = y_pred - y_true
delta = a_final - y_true; % 注意:这是softmax交叉熵的特殊性质
% 从输出层反向传播
for l = num_layers:-1:1
if l == num_layers
a_prev = a_cache{l}; % 倒数第二层的激活值
else
a_prev = (l == 1) ? X : a_cache{l}; % 第一层的前一层是输入X
end
% 梯度 ∂J/∂W⁽ˡ⁾ = δ⁽ˡ⁾ (a⁽ˡ⁻¹⁾)ᵀ
grad_W{l} = delta' * a_prev / batch_size;
grad_b{l} = mean(delta, 1)'; % 对batch求平均
if l > 1 % 传播到前一层
% δ⁽ˡ⁻¹⁾ = (W⁽ˡ⁾)ᵀ δ⁽ˡ⁾ ⊙ σ'(z⁽ˡ⁻¹⁾)
z_prev = z_cache{l-1};
sigma_prime = sigmoid(z_prev) .* (1 - sigmoid(z_prev));
delta = (delta * weights{l}) .* sigma_prime;
end
end
end
第一次训练:三天三夜的等待
陆眠用5000张图像的小数据集进行第一次训练,设置学习率η=0.1,批量大小=32,迭代100轮。
服务器开始运行。实验室的Sun服务器发出低沉的嗡鸣,Matlab命令窗口滚动着损失值:
第1轮: 损失=2.3026, 准确率=11.2%
第2轮: 损失=2.3018, 准确率=11.5%
...
第10轮: 损失=2.2951, 准确率=12.1%
“损失下降太慢了!”艾米莉盯着屏幕,“而且准确率几乎没有提高。”
陆眠检查梯度值:“看,第一层的梯度范数只有1e-7,而输出层是1e-2——相差5个数量级。这就是梯度消失:误差反向传播时,每经过一层sigmoid,梯度就乘以一个小于0.25的数(sigmoid导数的最大值)。经过4层,梯度可能缩小到(0.25)⁴ ≈ 0.004。”
“那怎么办?”
“两个办法。”陆眠说,“第一,用更好的激活函数——但2005年ReLU还没有普及。第二,精心初始化权重。”
Xavier初始化:给梯度一个公平的起点
陆眠解释了问题本质:“如果权重初始化太小,信号每层都衰减;如果太大,sigmoid会饱和(输出接近0或1),梯度消失。”
他推导了Xavier初始化的思想(尽管Xavier Gloriot的论文要到2010年才发表):“我们希望每层激活值的方差保持稳定。对于sigmoid,一个经验法则是:从均值为0、方差为1/n_in的正态分布采样权重,其中n_in是输入神经元数量。”
代码段5:Xavier初始化
function [weights, biases] = initialize_parameters(layer_sizes, initialization_method)
% layer_sizes: 每层神经元数量,如[784, 256, 128, 64, 10]
num_layers = length(layer_sizes) - 1;
weights = cell(num_layers, 1);
biases = cell(num_layers, 1);
for l = 1:num_layers
n_in = layer_sizes(l);
n_out = layer_sizes(l+1);
switch initialization_method
case 'xavier'
% Xavier/Glorot初始化
variance = 2 / (n_in + n_out);
weights{l} = randn(n_out, n_in) * sqrt(variance);
case 'he' % 实际上2015年才提出,这里超前使用
weights{l} = randn(n_out, n_in) * sqrt(2 / n_in);
otherwise % 简单的小随机数
weights{l} = randn(n_out, n_in) * 0.01;
end
biases{l} = zeros(n_out, 1);
end
end
使用Xavier初始化后,训练情况改善:
第1轮: 损失=2.1972, 准确率=18.3%
第10轮: 损失=1.8543, 准确率=52.7%
第50轮: 损失=0.6721, 准确率=84.2%
“但还不够好。”陆眠说,“我们还需要处理过拟合。”
2005年的正则化技术
训练集准确率达到89%时,测试集只有78%——明显的过拟合。
“我们没有Dropout(2012年才提出),没有批量归一化(2015年)。”陆眠列举,“但我们有L2正则化和数据增强。”
他在损失函数中加入L2正则化项:
L_total = L_data + λ/2 Σ ||W||²
λ是正则化系数,设为0.001。
数据增强方面,他写了简单的图像变换函数:
代码段6:简单数据增强
function X_augmented = augment_images(X, original_shape)
% X: 展平的图像向量
% original_shape: [height, width]
num_samples = size(X, 1);
X_augmented = zeros(size(X));
for i = 1:num_samples
img = reshape(X(i, :), original_shape);
% 随机选择一种增强方式
r = randi(4);
switch r
case 1
% 轻微旋转(-5°到+5°)
angle = (rand() - 0.5) * 10;
img_rot = imrotate(img, angle, 'bilinear', 'crop');
% 裁剪回原大小
[h, w] = size(img);
img_rot = img_rot(1:h, 1:w);
case 2
% 轻微平移
dx = randi([-2, 2]);
dy = randi([-2, 2]);
img_shift = circshift(img, [dy, dx]);
case 3
% 添加高斯噪声
noise_level = 0.05;
img_noise = img + noise_level * randn(size(img));
img_noise = max(min(img_noise, 1), 0); % 截断到[0,1]
case 4
% 保持原样
img_rot = img;
end
X_augmented(i, :) = img_rot(:)';
end
end
最终训练:一整夜的等待
陆眠用全部60000张训练图像,设置100轮训练,每轮用数据增强。服务器运行了整整一夜。
清晨,当艾米莉走进实验室时,结果已经出来:
训练集准确率: 96.2%
测试集准确率: 94.8%
“94.8%!”米勒教授听到消息后赶来,难以置信,“商业OCR只有67%,特征提取方法78%,你这个……94.8%?”
她随机挑选了几张测试图像,让网络预测。一张难以辨认的“4”(看起来像“9”)被正确识别;一张倾斜45度的“7”也被认出。
“但它会犯什么错?”教授问。
陆眠展示错误案例:一个“5”写得像“6”,一个“9”的圈太小被认成“4”。“这些错误,人类也会犯。”米勒教授承认,“事实上,我们请的研究生标注时,对这些模糊样本的标注一致性也只有97%。”
深度思考:为什么5层就够了?
拉吉提出根本问题:“如果5层网络能达到94.8%,那么为什么2012年的AlexNet需要8层才能在ImageNet上取得突破?”
陆眠在白板上画了两个曲线:
“第一个曲线:问题复杂性。MNIST是28×28灰度图,10个类别。ImageNet是224×224彩色图,1000个类别。复杂度不在一个量级。”
“第二个曲线:数据量。我们有60000张训练图。ImageNet有120万张。当数据量增长100倍时,模型容量也需要增长。”
“第三个曲线:硬件进步。”他指着嗡嗡作响的服务器,“这台Sun服务器值10万美元,训练这个小网络要一整夜。2012年,GPU开始用于深度学习,算力增长千倍,我们才敢用更深网络。”
“但这里有个关键洞察。”陆眠停顿,“如果一个问题用5层网络能达到95%,用50层能达到95.5%,那么增加的45层真的必要吗?还是说,我们应该先改善数据质量、标签一致性、问题定义?”
他展示了数学系真实试卷的测试结果:由于纸张泛黄、墨水褪色、书写风格古老,准确率降到88%。
“这时候,增加网络深度到8层,可能提升1-2个百分点。但如果我们花同样时间清洗数据、统一扫描条件、做更好的预处理,可能提升5-10个百分点。”
“这就是我的‘躺平哲学’在神经网络中的体现:在堆叠深度之前,先确保宽度——数据宽度、特征宽度、理解宽度。”
神经网络的可视化:看见“思考”过程
应米勒教授的要求,陆眠开发了神经网络的可视化工具。
-
第一层权重可视化:将256个神经元的权重重塑为28×28图像,展示为“特征检测器”。有些神经元对垂直线敏感,有些对对角线敏感,有些对曲线敏感。
-
激活可视化:输入一张“8”,显示每层神经元的激活强度。第一层激活分散(检测边缘),第二层开始组合(检测弧线),第三层形成数字部件,输出层对应“8”的神经元激活最强。
-
错误分析:对错误样本,可视化网络“犹豫”的过程——输出层前两名概率很接近,如“4:0.48, 9:0.52”。
“这就像看到网络在思考。”米勒教授着迷地说,“它不确定时,会‘犹豫’。”
“对,”陆眠说,“这引向一个重要概念:不确定性量化。一个好的AI不仅给出答案,还应给出置信度。对于低置信度预测,应该交给人类复审。”
历史对话:与未来的连接
训练结束后的第二天,陈教授来到实验室。
“我听说你用了神经网络。”他说,“你知道神经网络的历史吗?1958年Rosenblatt的感知机,1969年Minsky和Papert证明其局限,然后进入寒冬。1986年Rumelhart重新发明反向传播,但很快又因为训练困难被SVM取代。”
“我知道。”陆眠点头,“现在是2005年,神经网络正在从第二次寒冬中复苏。明年,Hinton会发表深度信念网络的论文,开启深度学习革命。”
陈教授敏锐地看着他:“你似乎……很确定?”
陆眠微笑:“我只是相信,有些思想会在合适的时间重新被发现。神经网络不是新思想,但它需要合适的数据、合适的算力、以及人们愿意重新审视它的开放心态。”
“你在这个时间点做这个项目,很有象征意义。”陈教授说,“2005年,神经网络复兴的前夜。你证明了即使没有未来那些技巧,只要有好的实现和对问题的理解,神经网络也能做惊人的事。”
片尾彩蛋:十年后的回响
2012年,当AlexNet在ImageNet竞赛中震惊世界时,斯坦福大学的一个研究生在复现实验时遇到了困难。她的导师——艾米莉——给了她一份2005年的技术报告:《资源受限环境下的神经网络实践指南》。
报告里,陆眠详细记录了梯度消失问题、Xavier初始化的经验法则、sigmoid的替代方案思考、以及那句关键的话:
“深度不是目的,有效才是。在增加层数之前,先问:数据是否干净?问题是否明确定义?你真的需要更多层,还是需要更理解数据?”
研究生调整了思路,不再盲目增加层数,而是先花了三周时间清洗和增强数据。最终,她用比AlexNet浅的架构,在自己的数据集上取得了可比的结果。
而在数学系,米勒教授的数字化项目在2008年完成。基于神经网络的识别系统,不仅处理了历史试卷,还帮助视觉障碍学生阅读数学公式。系统界面上一直显示着那句话:
“当AI不确定时,它会告诉你。这是比假装确定更大的智慧。”
第6集知识点总结:
-
神经网络基础:
- 前向传播:输入通过权重、偏置和激活函数逐层传递
- 激活函数:sigmoid将输入压缩到(0,1),但易导致梯度消失
- softmax:将输出转换为概率分布
-
反向传播与梯度下降:
- 链式法则计算梯度
- 梯度消失:深层网络中梯度逐层衰减
- 交叉熵损失:适合分类问题
-
训练实践:
- Xavier初始化:保持激活值方差稳定,缓解梯度消失
- L2正则化:惩罚大权重,防止过拟合
- 数据增强:人工增加训练数据多样性
-
历史与哲学:
- 神经网络历经多次兴衰
- 在算力限制下,简单而精致的方案可能比复杂方案更实用
- 可解释性和不确定性量化是AI系统的重要品质
-
关键认知:
- 深度不是万能的,数据质量和问题理解同样重要
- 技术发展需要硬件、算法、数据的协同进化
- 好的工具应在限制中创新,而不是等待限制消失
下一集预告:
神经网络在训练集上达到99%准确率,但新试卷上只有78%——它记住了数据,但没学会泛化。陆眠说:“有时候,约束模型比收集更多数据更需要智慧。”——第7集:过拟合的幽灵,将深入探讨过拟合的识别、应对策略,以及模型复杂性与泛化能力的永恒博弈。

片尾曲:
字迹里的光A版: 音乐地址
字迹里的光B版: 音乐地址
版权声明
2005:我在硅谷种AI和主题曲和片尾曲以及相关封面图片等 ©[李林][2025]。本作品采用 知识共享 署名-非商业性使用 4.0 国际许可协议 进行授权。
这意味着您可以:
- 在注明原作者并附上原文链接的前提下,免费分享、复制本文档与设计。
- 在个人学习、研究或非营利项目中基于此进行再创作。
这意味着您不可以:
- 将本作品或衍生作品用于任何商业目的,包括企业培训、商业产品开发、宣传性质等。
如需商业用途或宣传性质授权,请务必事先联系作者。
作者联系方式:[1357759132@qq.com]
更多推荐




所有评论(0)