笔言: 推荐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₁,也就是损失对权重的梯度。”

他一步步推导:

  1. 输出层梯度

    ∂L/∂z₂ = ŷ - y  # softmax交叉熵的漂亮性质
    ∂L/∂W₂ = (∂L/∂z₂) hᵀ
    ∂L/∂b₂ = ∂L/∂z₂
    
  2. 隐藏层梯度(链式法则):

    ∂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个百分点。”

“这就是我的‘躺平哲学’在神经网络中的体现:在堆叠深度之前,先确保宽度——数据宽度、特征宽度、理解宽度。


神经网络的可视化:看见“思考”过程

应米勒教授的要求,陆眠开发了神经网络的可视化工具。

  1. 第一层权重可视化:将256个神经元的权重重塑为28×28图像,展示为“特征检测器”。有些神经元对垂直线敏感,有些对对角线敏感,有些对曲线敏感。

  2. 激活可视化:输入一张“8”,显示每层神经元的激活强度。第一层激活分散(检测边缘),第二层开始组合(检测弧线),第三层形成数字部件,输出层对应“8”的神经元激活最强。

  3. 错误分析:对错误样本,可视化网络“犹豫”的过程——输出层前两名概率很接近,如“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集知识点总结

  1. 神经网络基础

    • 前向传播:输入通过权重、偏置和激活函数逐层传递
    • 激活函数:sigmoid将输入压缩到(0,1),但易导致梯度消失
    • softmax:将输出转换为概率分布
  2. 反向传播与梯度下降

    • 链式法则计算梯度
    • 梯度消失:深层网络中梯度逐层衰减
    • 交叉熵损失:适合分类问题
  3. 训练实践

    • Xavier初始化:保持激活值方差稳定,缓解梯度消失
    • L2正则化:惩罚大权重,防止过拟合
    • 数据增强:人工增加训练数据多样性
  4. 历史与哲学

    • 神经网络历经多次兴衰
    • 在算力限制下,简单而精致的方案可能比复杂方案更实用
    • 可解释性和不确定性量化是AI系统的重要品质
  5. 关键认知

    • 深度不是万能的,数据质量和问题理解同样重要
    • 技术发展需要硬件、算法、数据的协同进化
    • 好的工具应在限制中创新,而不是等待限制消失

下一集预告
神经网络在训练集上达到99%准确率,但新试卷上只有78%——它记住了数据,但没学会泛化。陆眠说:“有时候,约束模型比收集更多数据更需要智慧。”——第7集:过拟合的幽灵,将深入探讨过拟合的识别、应对策略,以及模型复杂性与泛化能力的永恒博弈。


在这里插入图片描述

片尾曲:
字迹里的光A版: 音乐地址
字迹里的光B版: 音乐地址


版权声明
2005:我在硅谷种AI和主题曲和片尾曲以及相关封面图片等 © [李林] [2025]

本作品采用 知识共享 署名-非商业性使用 4.0 国际许可协议 进行授权。
这意味着您可以:

  • 注明原作者附上原文链接的前提下,免费分享、复制本文档与设计。
  • 个人学习、研究或非营利项目中基于此进行再创作。

这意味着您不可以:

  • 将本作品或衍生作品用于任何商业目的,包括企业培训、商业产品开发、宣传性质等。

如需商业用途或宣传性质授权,请务必事先联系作者。
作者联系方式:[1357759132@qq.com]

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐