第01章 深度学习革命

概述: 利用机器从人类所创建的信息「语音、语言文字、图像」等载体中加速寻求出以前人类通过手工方式, 如经验、逻辑分析或实验才能获得的内在模式.

这好比显微镜或望远镜扩展了人类的视觉界限. 深度学习以逼近人脑的思维方式, 在拓展人脑的上限.

1. 影响

​ 图像信息: 医疗图像、蛋白质结构三维图像、用已有的图像寻找其内在模式来合成新的图像.

​ 语音信息: 在本章节中虽然并未举例, 语音合成技术「虚拟社交」如Soul

​ 文字信息: 大语言模型

​ 乍看三者似乎属于不同的领域, 但是它们如今都得以电子信息的方式储存, 每个领域都在人类的不懈努力下拆分出了它们的最小组成单元, 在线性空间里面即「基向量」, 给「基向量」添加不同的权重, 在同一领域下便可产生不同的效果.

​ 深度学习接近元学习. 我们人类现如今创造的信息只是对自然世界或人类世界的一种描述, 一个视角, 某个侧面. 放弃领域界限, 寻找领域之间的通用模式, 也是我们未来要走的路.

2. 拟合

一个简小的案例揭示机器学习的基本: 训练->获得模型->用模型应用于测试集->调参防过拟合优化->训练...

2.1 合成数据

​ 通过对sin(x) 添加随机噪声来合成数据.无论是训练集还是测试集都采用同样的模式合成.

%% 合成数据函数
% 输入参数 dt:采样率,默认值为1
% 输出参数 x, y:采样点和带噪声的正弦数据
% dt:默认1
% border: 默认10
function [x, y] = syntheticdata(dt, border)

    % 如果没有输入参数,设置默认采样率
    if nargin < 1
        dt = 1;
    end

    % 生成时间序列
    x = (0:dt:border)';     
    
    % 生成噪声,保证噪声幅度随采样率调整
    noise = randn(size(x)) * 0.1 * sqrt(dt); 
    
    % 生成带噪声的正弦信号
    y = sin(x) + noise;  

end

2.2 模型训练

​ 采样率为1, 合成11个数据, 得到训练集.

​ 借用Matlab自带的fit函数, 多项式拟合上述合成数据集.

%%  采用 Matlab默认的fit进行多项式拟合
% dt: 采样率
% border: 合成数据横轴边界
% M: [1:9] 模型阶数
function [wi, rms] = model(dt, border, M)
    %% 数据处理
    if nargin < 2
        dt = 1;  M = 9;
    end

    [x, y] = syntheticdata(dt, border); %合成训练集
    
    fs = cell(M, 1);      % 保存拟合多项式信息
    gof = cell(M, 1);     % 保存拟合优度信息
    for i = 1 : M
        [fs{i},gof{i}] = fit(x, y, ['poly' num2str(i)]);
    end
    


    % 多项式系数信息
    wi = zeros(M+1,M);    % 保存多项式系数
    for i = 1 : M
        for j = 1 : length(flip(coeffvalues(fs{i})))
            cof = flip(coeffvalues(fs{i}));
            wi(j, i) = cof(j);
        end
    end

    % 模型评估参数信息
    sse = zeros(M, 1);    % 残差平方和
    rms = zeros(M, 1);    % 均方根误差
    for i = 1 :  M
        sse(i) = gof{i}.sse;
        rms(i) = gof{i}.rmse;
    end

    %  寻找评估参数最小值对应的模型
    [minValueSSE, minIndexSSE] = min(sse);
    [minValueRMS, minIndexRMS] = min(rms);


    %% 绘图
    figure
    for i = 1 : M
        % 绘图
        subplot(3, 3, i);
        plot(fs{i}, x, y);
    
        ax = gca;
        ax.XAxisLocation = 'origin'; 
    
        ylim([-1.5, 1.5])
    
        title([' M = ' num2str(i) ', SSE = ' num2str(gof{i}.sse) ', RMS = ' num2str(gof{i}.rmse)], ...
            'FontSize', 10, 'FontWeight', 'bold', 'FontName', 'TimesRoman');
    
        legend off;
    end
    % 在整个figure底部添加文字
    annotation('textbox', [0 0 1 0.06], 'String', ...
        sprintf('最小残差平方和: M = %d, SSE = %.4f     最小均方根误差: M = %d, RMS = %.4f', ...
        minIndexSSE, minValueSSE, minIndexRMS, minValueRMS), ...
        'HorizontalAlignment', 'center', 'FontSize', 12, 'FontWeight', 'bold', ...
        'FontName', 'TimesRoman', 'EdgeColor', 'none');
    
    % 在整个figure顶部添加文字
    annotation('textbox', [0 0 1 0.99], 'String', ...
        sprintf('训练集: 多项式拟合'), ...
        'HorizontalAlignment', 'center', 'FontSize', 16, 'FontWeight', 'bold', ...
        'FontName', 'TimesRoman', 'EdgeColor', 'none');
    
    exportgraphics(gcf, './多项式拟合_训练.png', 'Resolution', 300);  % 高分辨率保存
end

通过随机产生的噪声, 每次情况都不同, 截取单独一项作为分析.

​ 上述的M 表示多项式阶数, 从成图上看, 当M=6时, 模型逼近sin(x) ; 当M=7时, 均方根误差增大; M=9虽然均方根很小, 将数据全部纳入了曲线中, 但是出现了过拟合 现象.

​ 我们从多项式系数可以观察到, 当M=8时, 系数值震荡的开始显著.当M=9时, 系数值震荡得更加厉害.
「奥卡姆剃刀原理」: 若有多个假设与观察一致, 则选最简单的那个.

2.3 预测数据

​ 采用率为0.1, 合成101个数据, 得到测试集.

​ 通过上述模型获得的系数应用于测试集.

% wi:  多项式模型权重系数
% rms: 模型均方根
% dt:  测试集采样率
% M:   多项式阶数「模型」
function test(border, wi, rms, dt, M)

    %% 数据处理
    [x, ytest] = syntheticdata(dt, border);%合成测试数据集
    
    % 利用模型预测
    n = length(x);
    V = zeros(n,M+1);     
    for k = 1:(M+1)
        V(:,k) = x.^(k-1);
    end
    ypre = V*wi; %利用训练模型预测数据结果

    % 评估参数SSE
    sse_errors = sum((ypre - ytest).^2, 1);  % 每列是一个模型的 SSE
    
    % 评估参数RMS
    rms_errors = zeros(9, 1);
    
    for i = 1 : M
        diff = ypre(:, i) - ytest;
        rms_errors(i) = sqrt(mean(diff .^ 2));     % RMS 计算
    end
    
    
    %% 绘制测试集预测图
    figure

    for i = 1 : M
    
        subplot(3, 3, i);
    
        % 测试数据用黑色实心圆点表示
        plot(x, ytest, 'ko', 'MarkerSize', 4, 'MarkerFaceColor', 'k', 'DisplayName', 'Test Data');
        hold on;
    
        % 模型预测用红色虚线
        plot(x, ypre(:, i), 'r--', 'LineWidth', 1.2, 'DisplayName', 'Model Prediction');
        hold off;
    
        ax = gca;
        ax.XAxisLocation = 'origin'; 
    
        ylim([-1.5, 1.5]);
    
        title([' M = ' num2str(i) ', SSE = ' num2str(sse_errors(i)) ', RMS = ' num2str(rms_errors(i))], ...
            'FontSize', 10, 'FontWeight', 'bold', 'FontName', 'TimesRoman');
        legend('Location', 'best');
    
    end
    
    
    % 在整个figure顶部添加文字
    annotation('textbox', [0 0 1 0.99], 'String', ...
        sprintf('测试集: 模型预测'), ...
        'HorizontalAlignment', 'center', 'FontSize', 16, 'FontWeight', 'bold', ...
        'FontName', 'TimesRoman', 'EdgeColor', 'none');
    exportgraphics(gcf, '多项式拟合_测试.png', 'Resolution', 300);  % 高分辨率保存


    %% 绘图
    figure
    x = [1:1:M];
    plot(x, rms_errors,'*-', 'DisplayName', '测试');
    hold on;
    plot(x, rms, '*-','DisplayName', '训练');
    legend('Location', 'best'); 

    title(['均方根误差图'],...
    'FontSize', 18, 'FontWeight', 'bold', 'FontName', 'TimesRoman');
    xlabel('M', 'Interpreter', 'latex', 'FontSize', 12, 'FontWeight', 'bold');
    ylabel('$E_{\mathrm{RMS}}$', 'Interpreter', 'latex', 'FontSize', 12, 'FontWeight', 'bold');
    exportgraphics(gcf, '均方根误差图.png', 'Resolution', 300);  % 高分辨率保存

end


​ 尽管预测效果很粗糙, 却也显示出了sin(x) 的趋势.

​ 并且当M=6时与测试集数据的吻合度最好.在均方根误差图中我们也可以看到, M=6是对应参数处于最低点.

​ 当M>7之后,测试集所对应的RMS高于训练集.

2.4 正则化

利用最小二乘法拟合, 使用的岭回归进行正则化: Lambda越大, RMS越大.

%% 采用最小二乘法进行多项式拟合实验
% 
% dt:      采样率
% border:  横轴边界
% M:       最大阶数
% lambda:  正则化强度

function ridge_model(dt, x, y, M, lambda)

    if nargin < 4
        lambda = 0;  % 默认为无正则化(即普通最小二乘)
    end
    if nargin < 3
        M = 9;
    end

    % 构造Vandermonde矩阵(包括x^0常数项)
    N = length(x);
    V = zeros(N, M + 1);  % V(i,j) = x(i)^(j-1)
    for k = 1:(M + 1)
        V(:, k) = x.^(k - 1);
    end

    % 初始化输出
    W = zeros(M + 1, M);  % 每列是一个模型的权重
    rms = zeros(M, 1);    % 每个模型对应一个 RMS

    for i = 1:M
        Vi = V(:, 1:(i + 1));  % 使用阶数为 i 的模型

        % 岭回归闭式解:w = inv(VᵗV + λI) * Vᵗy
        I = eye(i + 1);
        w = (Vi' * Vi + lambda * I) \ (Vi' * y);

        % 保存系数(对齐在W前部)
        W(1:i + 1, i) = w;

        % 预测和误差计算
        yhat = Vi * w;
        rms(i) = sqrt(mean((yhat - y).^2));
    end

    % 绘图:训练集拟合曲线
    figure
    for i = 1:M
        subplot(3, 3, i);
        yhat = V(:, 1:(i+1)) * W(1:(i+1), i);
        plot(x, y, 'ko', 'MarkerSize', 4, 'MarkerFaceColor', 'k'); hold on;
        plot(x, yhat, 'LineWidth', 1.2); hold off;
        title(['M = ' num2str(i) ', RMS = ' num2str(rms(i))], ...
            'FontSize', 10, 'FontWeight', 'bold');
        ax = gca; ax.XAxisLocation = 'origin'; ylim([-1.5, 1.5]);
    end

    annotation('textbox', [0 0 1 0.99], 'String', ...
        sprintf('训练集: 多项式拟合 (λ = %.3f), dt = %.3f', lambda, dt), ...
        'HorizontalAlignment', 'center', 'FontSize', 16, ...
        'FontWeight', 'bold', 'EdgeColor', 'none',...
        'FontName', 'TimesRoman', 'EdgeColor', 'none');

    timestamp = datestr(now, 'HHMMSS');
    filename = ['figure_' timestamp '.png'];
    exportgraphics(gcf, filename, 'Resolution', 300);
    
end

% 正则化
[x, y] = syntheticdata(1, 10);
ridge_model(1, x, y, 9, 0.001);
ridge_model(1, x, y, 9, 0.01);
ridge_model(1, x, y, 9, 0.1);

[x, y] = syntheticdata(0.1, 10);
ridge_model(0.1, x, y, 9, 0.001);
ridge_model(0.1, x, y, 9, 0.01);
ridge_model(0.1, x, y, 9, 0.1);
采样率为1



采样率为0.1



2.5 交叉验证

​ 将合成数据的border扩展成100, 增加10倍. 然后对合成数据进行切分标号.随机取一个作为测试集, 其他的每个都作为训练集找到最优的模型. 在此不做验证.

3. 历史

机器学习的发展符合涌现现象.它不仅是当下时代的产物.

​ 在大地测量学中, 有个误差传播理论. 当我们选取一个基准点进行测量, 因为测量精度关系, 每个测点都会存在一定的误差. 当下测点以前一个点为基准点, 就这样把内含的误差也携带过来.

​ 为了解决这个问题, 就需要进行校正的工作, 进行反推.

​ 当测点越多, 也就会变得愈加复杂.

​ 上述本质上是个线性问题. 但是从过程性质上来参考, 前向传播递推、反向传播矫正 、构建深层节点集. 可当「它山之石」, 辅助理解神经网络.

posted @ 2025-06-16 19:41  ZeroPhix  阅读(124)  评论(0)    收藏  举报