% 第五章：结果验证

\section{结果验证}

本章将对基于文档驱动的自适应编码大模型微调框架的实验结果进行验证和分析，包括实验环境介绍、实验对象介绍、微调过程中资源占用和指标的变化以及微调效果验证等方面，以全面评估本框架的实际效果和性能表现。

\subsection{实验环境介绍}

本实验在以下硬件和软件环境下进行：

\subsubsection{硬件环境}

实验采用的主要硬件配置如下：
\begin{itemize}
    \item 笔记本型号：Lenovo Legion R7000P 2021H
    \item CPU：AMD Ryzen 7 5800H
    \item GPU：NVIDIA GeForce RTX 3060 Laptop GPU（6GB显存）
    \item 内存：16GB DDR4
    \item 存储：2TB NVMe SSD
\end{itemize}

\subsubsection{软件环境}

实验的软件环境配置如下：
\begin{itemize}
    \item 操作系统：Ubuntu 22.04 LTS（通过Windows Subsystem for Linux 2运行）
    \item Python版本：3.10.12
    \item 深度学习框架：PyTorch 2.1.0+cu121
    \item 主要依赖库：
    \begin{itemize}
        \item unsloth 2025.3.19（用于优化LoRA微调）
        \item transformers 4.36.2（用于模型加载和处理）
        \item gradio 5.25.0+（用于构建Web界面）
        \item langchain 0.3+（用于文档处理）
        \item tinydb 4.0.0+（用于数据存储）
        \item tensorboard 2.19.0（用于训练可视化）
    \end{itemize}
\end{itemize}

实验环境的选择充分考虑了资源受限条件下的优化需求。尽管采用RTX 3060 Laptop GPU（仅6GB显存）这一消费级显卡，本框架仍能高效完成3B参数模型的微调，体现了框架出色的资源优化能力。软件环境选择了最新稳定版本的深度学习工具链（如PyTorch 2.1.0+cu121等），主要基于以下考虑：(1)确保与最新硬件驱动的兼容性；(2)充分利用框架的最新优化特性；(3)提高实验的可复现性和前沿性。这一配置方案证明了本框架在有限计算资源下实现高效微调的可行性。

\subsection{实验对象介绍}

\subsubsection{基础模型选择}

本实验选择qwen2.5-3B作为基础模型进行微调。该模型是阿里云开源的新一代大语言模型，具有以下特点：
\begin{itemize}
    \item 性能表现：在 MMLU、GSM8K、BBH 等权威测试中优于多数同参数级开源模型。
    \item 参数规模：3.09B参数量（非嵌入参数2.77B），在保持较高性能的同时，对计算资源要求相对较低。
    \item 上下文窗口：支持128K tokens的上下文窗口和8K tokens的生成长度，适合处理超长技术文档。
    \item 开源许可：采用Qwen Research 许可协议，允许学术研究。
\end{itemize}

\subsubsection{数据集生成}

本实验采用DeepSeek V3作为数据集生成模型，该模型是深度求索公司开发的新一代大语言模型，具有以下特点：
\begin{itemize}
    \item 性能表现：在 Codeforces 基准测试中，DeepSeek V3 取得了 51.6 分的成绩，刷新了该领域的 SOTA 水平。在 LiveCodeBench（Pass@1 - COT）测试中得分为 40.5，在 LiveCodeBench（Pass@1）测试中成绩为 37.6，均表现出色。
    \item 上下文窗口：在理论上支持 128K tokens 的上下文长度。不过在实际应用中，部分服务商可能会出于硬件或性能优化等考虑，将其限制在 64K tokens。
    \item 开源许可：采用MIT许可协议，允许学术研究。
\end{itemize}

数据集生成模型通过Deepseek ai官方API调用，具体的生成参数如下：
\begin{itemize}
    \item temperature：1.0
    \item max\_length：4096
\end{itemize}

\subsubsection{仓库文档选择}
本实验使用unsloth官方仓库文档(\url{https://docs.unsloth.ai/})进行微调。在训练前，大模型并不了解该项目，如图\ref{fig:before_train}所示。

\begin{figure}[htbp]
    \centering
    \includegraphics[width=0.8\textwidth]{pic/before_train.png}
    \caption{训练前的文档内容示例}
    \label{fig:before_train}
\end{figure}

\subsubsection{微调参数配置}

本实验采用LoRA（Low-Rank Adaptation）技术进行参数高效微调，主要配置参数如下：
\begin{itemize}
	\item 量化精度：4bit
    \item LoRA秩（r）：64，控制低秩矩阵的维度
    \item LoRA缩放因子（alpha）：16，控制LoRA更新的幅度
    \item 学习率：2e-4，采用余弦学习率调度策略
    \item 批处理大小：每设备1个样本
    \item 训练轮次：3个epoch
    \item 优化器：AdamW，权重衰减为0.01
    \item 梯度累积步数：4，用于增大有效批处理大小
    \item 混合精度训练：采用bfloat16精度
\end{itemize}

这些参数配置基于预实验结果和相关研究经验确定，旨在平衡训练效率和模型性能。

\subsection{微调过程中资源占用和指标的变化}

\subsubsection{计算资源占用}

图\ref{fig:monitor}展示了模型训练过程中的系统资源占用情况。在6GB显存的RTX 3060 GPU上，QLoRA微调仅占用4.1GB显存，这种高效的资源利用率得益于QLoRA的低秩适应技术，仅需更新少量参数即可实现模型性能的显著提升，充分体现了本框架在资源受限环境下的优化能力。

\begin{figure}[htbp]
    \centering
    \includegraphics[width=0.8\textwidth]{pic/monitor.png}
    \caption{模型训练过程中的系统资源监控}
    \label{fig:monitor}
\end{figure}

\subsubsection{训练指标变化}
图~\ref{fig:tensorboard} 展示了使用TensorBoard对训练过程中的损失、梯度、学习率等指标进行实时监控，有助于及时发现训练异常并优化模型参数配置。

% TensorBoard 监控截图
\begin{figure}[htbp]
    \centering
    \includegraphics[width=0.8\textwidth]{pic/tensorboard.png}
    \caption{使用TensorBoard实时监控训练指标变化}
    \label{fig:tensorboard}
\end{figure}

微调过程中，主要训练指标的变化趋势如图\ref{fig:training_metrics}所示，包括损失值（图\ref{fig:loss_metrics}）、梯度范数（图\ref{fig:grad_norm_metrics}）和学习率（图\ref{fig:learning_rate_metrics}）三个关键指标。从这些图表中可以观察到以下几个关键特征：

\pgfplotsset{compat=1.18}
\begin{figure}[htbp]
    \centering
    \begin{subfigure}[b]{0.8\textwidth}
        \centering
        \begin{tikzpicture}
            \begin{axis}[
                width=\textwidth,
                height=5cm,
                xlabel={训练步数 (Step)},
                ylabel={损失值 (Loss)},
                xmin=0, xmax=7029,
                ymin=0, ymax=2.5,
                ymajorgrids=true,
                grid style=dashed,
            ]
            \addplot[smooth, thick, blue] table[x=Step, y=loss, col sep=comma] {./figures/training_data.csv};

            \end{axis}
        \end{tikzpicture}
        \caption{损失值变化趋势}
        \label{fig:loss_metrics}
    \end{subfigure}
    
    \begin{subfigure}[b]{0.8\textwidth}
        \centering
        \begin{tikzpicture}
            \begin{axis}[
                width=\textwidth,
                height=5cm,
                xlabel={训练步数 (Step)},
                ylabel={梯度范数 (Grad Norm)},
                xmin=0, xmax=7029,
                ymin=0, ymax=1.8,
                ymajorgrids=true,
                grid style=dashed,
            ]
            \addplot[smooth, thick, red] table[x=Step, y=grad_norm, col sep=comma] {./figures/training_data.csv};

            \end{axis}
        \end{tikzpicture}
        \caption{梯度范数变化趋势}
        \label{fig:grad_norm_metrics}
    \end{subfigure}
    
    \begin{subfigure}[b]{0.8\textwidth}
        \centering
        \begin{tikzpicture}
            \begin{axis}[
                width=\textwidth,
                height=5cm,
                xlabel={训练步数 (Step)},
                ylabel={学习率 (Learning Rate)},
                xmin=0, xmax=7029,
                ymin=0, ymax=0.0002,
                ymajorgrids=true,
                grid style=dashed,
            ]
            \addplot[smooth, thick, green!60!black] table[x=Step, y=learning_rate, col sep=comma] {./figures/training_data.csv};

            \end{axis}
        \end{tikzpicture}
        \caption{学习率变化趋势}
        \label{fig:learning_rate_metrics}
    \end{subfigure}
    
    \caption{模型微调过程中的训练指标变化趋势}
    \label{fig:training_metrics}
\end{figure}

\begin{itemize}
    \item \textbf{损失函数（Loss）}：如图\ref{fig:loss_metrics}所示，训练初期，损失值从约2.4迅速下降。在约1000步时降至0.5以下，随后继续缓慢下降。在大约5000步后，损失值稳定在接近于零的水平，表明模型在训练集上已经取得了很好的性能，基本收敛。

    \item \textbf{梯度范数（Gradient Norm）}：如图\ref{fig:grad_norm_metrics}所示，训练初期，梯度范数在0.5到1.5之间波动，表明参数更新幅度较大。随着训练步数的增加，梯度范数逐渐减小，并在约4000步后稳定在0.1到0.5之间，这与损失函数的下降趋势一致，表明模型正在趋于收敛，参数更新的步伐减缓。

    \item \textbf{学习率（Learning Rate）}：如图\ref{fig:learning_rate_metrics}所示，学习率采用线性衰减策略，从初始值约0.0002（或2e-4）随着训练步数的增加而稳定地线性降低，直至训练结束时接近于零。这种策略有助于在训练初期快速探索解空间，并在后期精细调整参数以促进模型稳定收敛。
    
    \item \textbf{训练效率}：整个微调过程耗时约5.5小时，平均每步训练时间约3秒，展现了本框架在资源受限环境下的高效性。特别是在训练后期，尽管学习率降低，模型仍能持续优化，损失值稳步下降，表明LoRA微调方法的有效性。
\end{itemize}

通过分析训练指标变化可以看出，本框架采用的LoRA微调策略在有限计算资源下实现了高效训练，损失函数的平稳下降和最终收敛表明模型成功适应了目标文档内容，为后续的效果验证奠定了基础。

\subsection{微调效果验证}

经过微调后的模型能够对相关内容做出准确回答，图\ref{fig:after_train}展示了训练后的效果，本框架将通用大语言模型定向优化为具备企业特定代码生成能力的专用模型，在保持模型通用能力的同时，显著提升了其在特定领域的表现，为企业级软件开发的智能化与高效化提供了有力支持。

\begin{figure}[htbp]
    \centering
    \includegraphics[width=0.8\textwidth]{pic/after_train.png}
    \caption{模型微调后的效果}
    \label{fig:after_train}
\end{figure}
