资讯动态

动手学深度学习(PyTorch版)深度详解(13):自然语言处理:预训练(详解 + 实战避坑)

发布时间:2026/9/12 11:38:34 来源:尧图企业网站定制
前言为什么预训练是 NLP 的 “核心钥匙”在自然语言处理NLP的发展历程中预训练技术的出现是里程碑式的突破 —— 它彻底改变了 NLP 模型的训练范式从 “从零开始训练特定任务模型” 转向 “先在大规模无标注文本上预训练通用语言模型再微调适配下游任务”大幅降低了下游任务的训练成本同时显著提升了模型性能。《动手学深度学习PyTorch 版》自然语言处理系统讲解 NLP 预训练的核心技术从基础的词嵌入word2vec出发逐步进阶到GloVe、子词嵌入最终聚焦现代预训练模型的标杆BERT完整覆盖 “词级预训练→句子级预训练→通用语言模型预训练” 的技术演进路径。本章内容既是 NLP 入门的核心基础也是进阶大模型、文本生成、对话系统等方向的必备前提。本文将结合教材核心内容、实战场景、高频避坑指南、系统化学习计划以及下章内容预告全面拆解自然语言处理知识兼顾理论深度与实操价值适合零基础入门、进阶巩固、实战落地三类学习场景。一、本章核心知识体系教材内容深度拆解1 词嵌入word2vec从独热编码到语义向量1.1 独热编码的致命缺陷传统 NLP 中单词常用独热编码One-Hot Encoding表示假设词汇表大小为V每个单词对应一个V维向量仅对应位置为 1其余为 0。但这种表示存在两大核心问题维度灾难词汇表动辄数万甚至数十万向量维度极高计算效率极低语义缺失任意两个不同单词的独热向量余弦相似度为 0无法表达 “国王 - 男人 女人≈女王” 这类语义关联。1.2 word2vec 的核心思想用上下文预测单词word2vec 由 Mikolov 等人于 2013 年提出核心是通过自监督学习将单词映射到低维稠密向量词嵌入使语义相近的单词向量距离更近。它包含两个核心模型跳元模型Skip-Gram和连续词袋模型CBOW。跳元模型Skip-Gram输入是中心词目标是预测其周围的上下文词如 “我 爱 深度学习”中心词为 “爱”上下文词为 “我”“深度学习”。核心逻辑P(上下文词∣中心词)适合处理低频词对小规模语料友好。连续词袋模型CBOW输入是上下文词目标是预测中间的中心词。核心逻辑P(中心词∣上下文词)训练速度更快对高频词友好适合大规模语料。1.3 核心数学原理简化理解以 Skip-Gram 为例假设中心词为wc​上下文词为wo​词嵌入矩阵为W∈RV×dd为词向量维度通常 50~300则中心词向量vc​W[wc​]上下文词向量uo​W[wo​]预测概率P(wo​∣wc​)∑k1V​exp(ukT​vc​)exp(uoT​vc​)​损失函数最大化对数似然∑logP(wo​∣wc​)等价于最小化负对数似然。2 近似训练解决大规模语料的计算瓶颈word2vec 的标准训练依赖softmax 归一化但词汇表V动辄数万每次训练需计算V次指数运算计算量极大、训练极慢。为解决这一问题教材介绍两种高效近似训练方法负采样Negative Sampling和层序 softmaxHierarchical Softmax。2.1 负采样最常用实战首选核心思想将多分类问题转化为二分类问题。对每个 “中心词 - 上下文词” 正样本随机采样k个不在上下文中的单词作为负样本训练模型区分正样本真实上下文和负样本随机噪声。正样本标签1损失logσ(uoT​vc​)负样本标签0损失∑i1k​log(1−σ(uiT​vc​))总损失正样本损失 负样本损失k通常取 5~20训练速度提升数百倍。2.2 层序 softmax理论优雅实战较少用核心思想用二叉树结构替代平坦的 softmax 层将词汇表中的单词作为二叉树的叶子节点非叶子节点为二分类器。预测时从根节点到叶子节点每次二分类路径长度为log2​V计算量从O(V)降至O(logV)。3 用于预训练词嵌入的数据集预训练词嵌入的核心前提是大规模、高质量、无标注的文本语料—— 语料规模越大、覆盖领域越广词嵌入的语义表达能力越强。3.1 常用公开数据集维基百科语料多语言、覆盖全面、文本质量高是 NLP 预训练的 “标配语料”BookCorpus11000 本书籍文本侧重日常语言、对话场景Common Crawl互联网网页文本规模最大万亿级 tokens但噪声较多中文语料中文维基百科、人民日报语料、微博 / 新闻语料需清洗。3.2 数据预处理流程实战核心步骤分词英文按空格分割中文用 jieba、spaCy 等工具分词清洗去除特殊符号、数字、低频词出现次数 5、停用词可选构建词汇表统计词频保留前V个高频词V通常取 10000~50000生成训练样本按上下文窗口大小通常 2~5遍历文本生成 “中心词 - 上下文词” 样本。4 预训练 word2vec从零实现与效果验证教材基于 PyTorch 从零实现Skip-Gram 负采样的 word2vec 模型核心流程数据加载→模型定义→训练循环→词嵌入保存→效果验证。4.1 模型核心代码简化版可直接运行import torch import torch.nn as nn import torch.optim as optim from collections import Counter import numpy as np # 1. 超参数设置 batch_size 256 embedding_dim 100 # 词向量维度 window_size 2 # 上下文窗口大小 negative_k 5 # 负采样数量 lr 0.001 epochs 10 # 2. 模拟文本数据实战替换为真实语料 text 自然语言处理 是 人工智能 的 重要 分支 词嵌入 用于 表示 单词 的 语义 tokens text.split() vocab list(set(tokens)) word_to_idx {word: i for i, word in enumerate(vocab)} idx_to_word {i: word for i, word in enumerate(vocab)} vocab_size len(vocab) # 3. 生成Skip-Gram训练样本 def generate_skip_gram_samples(tokens, window_size): samples [] for i, center in enumerate(tokens): # 上下文范围i-window_size 到 iwindow_size排除自身 for j in range(max(0, i-window_size), min(len(tokens), iwindow_size1)): if i ! j: context tokens[j] samples.append((word_to_idx[center], word_to_idx[context])) return samples samples generate_skip_gram_samples(tokens, window_size) X torch.tensor([s[0] for s in samples]) # 中心词 Y torch.tensor([s[1] for s in samples]) # 上下文词 # 4. 定义Skip-Gram模型 class SkipGram(nn.Module): def __init__(self, vocab_size, embedding_dim): super().__init__() # 中心词嵌入矩阵 self.in_embedding nn.Embedding(vocab_size, embedding_dim) # 上下文词嵌入矩阵 self.out_embedding nn.Embedding(vocab_size, embedding_dim) def forward(self, center, context, negative_samples): # 正样本相似度中心词×上下文词 center_emb self.in_embedding(center) # (batch_size, embedding_dim) context_emb self.out_embedding(context) # (batch_size, embedding_dim) pos_score torch.sum(center_emb * context_emb, dim1) # (batch_size,) pos_loss torch.log(torch.sigmoid(pos_score)) # 负样本相似度中心词×负样本 neg_emb self.out_embedding(negative_samples) # (batch_size, negative_k, embedding_dim) center_emb_expand center_emb.unsqueeze(1) # (batch_size, 1, embedding_dim) neg_score torch.bmm(neg_emb, center_emb_expand.transpose(1, 2)).squeeze() # (batch_size, negative_k) neg_loss torch.sum(torch.log(1 - torch.sigmoid(neg_score)), dim1) # 总损失负号最小化损失 loss -torch.mean(pos_loss neg_loss) return loss # 5. 初始化模型、优化器 model SkipGram(vocab_size, embedding_dim) optimizer optim.Adam(model.parameters(), lrlr) # 6. 训练循环 for epoch in range(epochs): model.train() total_loss 0 for i in range(0, len(X), batch_size): batch_center X[i:ibatch_size] batch_context Y[i:ibatch_size] # 随机采样负样本 batch_neg torch.randint(0, vocab_size, (len(batch_center), negative_k)) optimizer.zero_grad() loss model(batch_center, batch_context, batch_neg) loss.backward() optimizer.step() total_loss loss.item() print(fEpoch {epoch1}, Loss: {total_loss/len(X):.4f}) # 7. 提取词嵌入中心词嵌入矩阵 word_embeddings model.in_embedding.weight.detach().numpy()4.2 效果验证词相似性与类比任务训练完成后通过余弦相似度验证词嵌入效果词相似性计算 “人工智能” 与 “自然语言处理” 的相似度应远高于 “人工智能” 与 “分支” 的相似度类比任务验证 “国王 - 男人 女人≈女王”中文可验证 “北京 - 中国 法国≈巴黎”。5 全局向量的词嵌入GloVe融合局部与全局统计word2vec 仅利用局部上下文信息窗口内单词未考虑全局词共现统计GloVeGlobal Vectors for Word Representation由 Pennington 等人于 2014 年提出融合 word2vec 的局部上下文与全局词共现矩阵进一步提升词嵌入质量。5.1 核心思想共现矩阵 加权最小二乘构建全局共现矩阵XXij​表示单词i与单词j在上下文窗口内共现的次数加权最小二乘损失J∑i,j1V​f(Xij​)(uiT​vj​−logXij​)2其中ui​、vj​分别为中心词和上下文词向量f(Xij​)为权重函数低频共现权重低、高频共现权重高避免噪声影响。5.2 GloVe vs word2vecword2vec训练快、实现简单、适合小规模语料GloVe语义更精准、擅长捕捉全局语义、适合大规模语料但训练慢、内存占用大。6 子词嵌入解决生僻词与未登录词问题word2vec、GloVe 均为词级嵌入无法处理未登录词OOV—— 词汇表外的单词如生僻词、网络新词、拼写错误词这是 NLP 实战的高频痛点。6.1 子词嵌入核心思想单词拆分为子词子词嵌入Subword Embedding将单词拆分为更小的子词字符 / 字符组合单词向量由其子词向量求和得到即使是未登录词也可通过子词向量合成其表示。6.2 两种主流实现fastTextFacebook2016单词前后添加特殊符号如、拆分为 n-gram 子词如 “apple”→a、ap、pp、pl、le单词向量 所有子词向量求和优点实现简单、训练快、支持 OOV缺点子词数量多、内存占用大。字节对编码BPEOpenAI2018初始将单词拆分为单个字符迭代合并出现频率最高的相邻字符对直到达到预设子词数量优点子词数量可控、压缩率高、适合大语料缺点需迭代训练、实现稍复杂应用BERT、GPT、LLaMA 等现代大模型均采用 BPE 做子词分词。7 词的相似性和类比任务词嵌入效果量化评估词嵌入训练完成后需通过量化任务验证其语义表达能力教材重点介绍两大核心任务词相似性任务和词类比任务。7.1 词相似性任务任务定义给定一对单词计算其词嵌入的余弦相似度与人类标注的语义相似度对比相关性越高词嵌入质量越好常用数据集WordSim-353英文、Chinese Word Similarity中文余弦相似度公式sim(u,v)∥u∥∥v∥uTv​范围 [-1,1]越接近 1 语义越相似。7.2 词类比任务任务定义给定 “a:b::c:d”即a与b的关系等价于c与d的关系通过词嵌入计算dargmaxsim(vc​−va​vb​,vd​)示例英文king:man :: queen:woman → vking​−vman​vwoman​≈vqueen​中文北京中国巴黎法国 → 北京中国法国巴黎评估指标准确率正确预测的类比对数 / 总类比对数。8 BERT现代预训练语言模型的标杆词嵌入word2vec/GloVe是静态词嵌入—— 单词向量固定无法区分多义词如 “苹果” 可指水果或公司BERTBidirectional Encoder Representations from Transformers由 Google 于 2018 年提出是动态上下文敏感预训练模型彻底解决静态词嵌入的缺陷成为 NLP 下游任务的 “标配预训练模型”。8.1 BERT 的核心突破双向上下文建模基于 Transformer 编码器同时利用左右上下文区别于 GPT 的单向左上下文、ELMo 的浅层双向动态词嵌入单词向量随上下文动态变化精准区分多义词任务无关预训练预训练目标不依赖下游任务预训练完成后只需少量微调即可适配所有 NLP 任务融合 ELMo 与 GPT 优势ELMo上下文敏感 GPTTransformer 架构 BERT。8.2 BERT 输入表示三大嵌入融合BERT 输入是token 嵌入 段嵌入 位置嵌入的求和支持句子对输入如自然语言推断、问答。token 嵌入单词 / 子词的向量表示BPE 分词段嵌入区分句子 A 和句子 B句子 AEA​句子 BEB​位置嵌入注入序列顺序信息Transformer 无循环结构无法天然感知顺序特殊 token句子开头、[SEP]句子分隔。8.3 BERT 预训练任务两大自监督目标BERT 通过两个核心预训练任务在大规模无标注文本上学习通用语言表示。掩码语言模型MLM核心任务随机将输入序列中 15% 的 token 替换为[MASK]目标根据上下文预测被掩码的原始 token作用学习双向上下文语义解决多义词问题。下一句预测NSP辅助任务输入句子对A,B50% 概率 B 是 A 的真实下一句50% 概率是随机句子目标二分类预测 B 是否为 A 的下一句作用学习句子间关系适配问答、自然语言推断等句子对任务。9 用于预训练 BERT 的数据集BERT 预训练需大规模、高质量、句子级对齐的文本语料常用数据集BookCorpus 英文维基百科合计约 16GB33 亿 tokens中文常用中文维基百科 BooksCorpus 中文 新闻语料。9.1 数据预处理核心步骤BPE 分词用 BERT 自带的 Tokenizer 将文本拆分为子词 token生成 MLM 样本随机掩码 15% token记录掩码位置与原始 token生成 NSP 样本构建句子对标记是否为连续句子格式转换输出 BERT 输入格式token_ids、segment_ids、attention_mask、mlm_labels、nsp_labels。10 预训练 BERT从零实现与微调基础教材基于 PyTorch 从零实现简化版 BERT 预训练核心流程数据预处理→Transformer 编码器定义→MLMNSP 联合损失→预训练循环→模型保存。10.1 核心注意事项计算资源要求高原生 BERT-base1.1 亿参数预训练需多 GPU8×RTX 3090 数天训练实战可直接加载 Hugging Face 预训练权重预训练 vs 微调预训练是 “通用语言学习”微调是 “下游任务适配”微调时只需少量数据数百数千样本即可达到 SOTA 效果BERT 变体后续优化模型RoBERTa、ALBERT、DistilBERT均基于 BERT 改进核心逻辑一致。二、实际学习场景适配零基础 / 进阶 / 实战全覆盖场景 1零基础入门NLP 小白无深度学习基础学习目标理解词嵌入、BERT 的核心思想能跑通基础代码掌握 NLP 预训练的核心逻辑重点内容word2vec 核心思想、负采样原理、子词嵌入解决 OOV、BERT 核心突破学习节奏每天 1~2 小时7 天完成重点理解 “为什么需要预训练”“预训练解决了什么问题”适配建议跳过复杂数学推导重点跑通教材简化版 word2vec 代码直观感受词嵌入效果。场景 2进阶巩固有深度学习基础想深入 NLP 预训练学习目标掌握 word2vec/GloVe/BERT 的数学原理、模型结构、训练逻辑能从零实现核心模块理解技术演进脉络重点内容word2vec 数学原理、GloVe 损失函数、BERT 预训练任务、BERT 预训练代码学习节奏每天 2~3 小时10~14 天完成重点推导核心公式、复现教材代码、对比不同模型的优劣适配建议深入理解 “静态词嵌入→动态词嵌入”“单向→双向” 的技术演进逻辑复现 BERT 的 MLM 和 NSP 模块。场景 3实战落地工业界 / 项目实战需解决实际 NLP 问题学习目标掌握预训练模型的数据预处理、模型加载、微调技巧、效果优化能基于 BERT 解决文本分类、情感分析、问答等实际任务重点内容数据集预处理、子词分词实战、BERT 数据格式、预训练模型微调学习节奏边学边练2~3 周完成重点结合 Hugging Face Transformers 库实战微调 BERT适配建议跳过从零预训练 BERT资源消耗大直接加载预训练权重微调重点解决 OOV、数据噪声、过拟合等实战问题。三、高频避坑指南实战 90% 的人都会踩的坑附解决方案一word2vec/GloVe 避坑词嵌入阶段坑 1词汇表过大 / 过小导致维度灾难或语义缺失现象词汇表 10 万训练极慢、内存溢出词汇表 5000低频词过多语义表达差原因未合理过滤低频词、停用词解决方案统计词频过滤出现次数 5 的低频词词汇表控制在 10000~50000中文可过滤停用词如 “的、是、在”。坑 2上下文窗口大小设置不合理现象窗口过小1语义关联弱窗口过大5引入噪声训练不稳定原因未理解窗口大小的物理意义窗口越大上下文范围越广解决方案英文窗口 2~5中文窗口 2~3中文语义更密集小规模语料用小窗口大规模语料用大窗口。坑 3负采样数量k设置不当现象k过小3负样本噪声不足模型区分能力差k过大20训练慢、易过拟合解决方案k5 20小规模语料k5 10大规模语料k10 20。坑 4词嵌入维度设置不合理现象维度过小50语义表达能力不足维度过大300训练慢、易过拟合解决方案常用维度 50~300小规模语料 50~100大规模语料 100~300。二子词嵌入避坑fastText/BPE 阶段坑 5未处理特殊符号、大小写导致子词冗余现象英文大小写不统一如 “Apple” 和 “apple” 拆分为不同子词、中文含特殊符号如 “、#”子词数量激增解决方案英文统一转小写中文去除特殊符号、数字仅保留汉字和常用标点。坑 6BPE 迭代次数不足 / 过多现象迭代次数过少子词过碎多为单个字符语义关联弱迭代次数过多子词过长未登录词处理能力下降解决方案BPE 迭代次数 10000~50000中文常用 30000 次英文常用 40000 次。三BERT 避坑预训练 / 微调阶段坑 7预训练时 MLM 掩码概率不当现象掩码概率 10%学习不充分掩码概率 20%上下文信息缺失训练不稳定解决方案严格遵循 BERT 原始设置掩码概率 15%。坑 8微调时学习率过大 / 过小现象学习率 5e-5预训练权重被破坏模型不收敛学习率 1e-5微调慢、易过拟合解决方案BERT 微调学习率 1e-5~5e-5优先用 2e-5配合学习率衰减。坑 9未处理序列长度超限问题现象文本长度 512BERT 最大输入长度直接截断导致语义丢失解决方案短文本直接填充至 512长文本滑动窗口截断保留关键语义段模型选择长文本任务用 Longformer、BERT-large支持更长序列。坑 10数据量不足导致微调过拟合现象下游任务数据 1000 样本微调后训练集准确率高、验证集低解决方案数据增强同义词替换、随机插入、回译正则化添加 Dropout0.1~0.3、权重衰减模型冻结冻结 BERT 底层 8~10 层仅微调顶层。四通用避坑全阶段高频坑 11未归一化文本数据导致噪声干扰现象文本含大量乱码、特殊符号、重复内容模型学习到噪声而非语义解决方案严格数据清洗去除乱码、特殊符号、重复句、短文本长度 5。坑 12只跑代码不理解原理遇到问题无法排查现象能跑通教材代码但修改参数 / 换数据集就报错无法定位问题原因只复制粘贴代码未理解模型核心逻辑、数据流向、维度变化解决方案每段代码逐行理解重点关注数据维度变化、张量形状、损失函数计算逻辑。四、本章系统化学习计划14 天从入门到实战总体原则理论理解→代码复现→场景实战→避坑总结每天聚焦 1~2 个核心知识点边学边练拒绝 “只看不练”。Day1词嵌入基础word2vec 核心思想学习内容理解独热编码缺陷、word2vec 核心逻辑、Skip-Gram 与 CBOW 区别实战任务手动生成简单文本的 Skip-Gram 样本理解 “中心词 - 上下文词” 对应关系避坑重点区分 Skip-Gram中心→上下文与 CBOW上下文→中心。Day2word2vec 数学原理 近似训练学习内容数学原理、负采样 / 层序 softmax实战任务推导 Skip-Gram 损失函数理解负采样如何将多分类转为二分类避坑重点掌握负采样的核心逻辑区分正样本与负样本的损失计算。Day3预训练词嵌入数据集预处理学习内容理解语料选择、分词、清洗、词汇表构建流程实战任务用 jieba 分词处理中文短句过滤低频词构建小型词汇表避坑重点合理过滤低频词避免词汇表过大或过小。Day4word2vec 从零实现PyTorch学习内容理解模型结构、训练循环、词嵌入提取实战任务复现本文简化版 Skip-Gram 负采样代码训练小型文本的词嵌入避坑重点注意张量维度匹配避免维度不匹配报错。Day5GloVe 原理 词嵌入效果验证学习内容GloVe 核心思想、词相似性 / 类比任务实战任务计算训练好的 word2vec 词嵌入的余弦相似度验证词类比任务避坑重点理解 GloVe 如何融合局部与全局信息对比 GloVe 与 word2vec 优劣。Day6子词嵌入fastTextBPE学习内容理解子词嵌入解决 OOV 的核心逻辑、fastText 与 BPE 区别实战任务用 BPE 分词工具处理中文短句观察子词拆分结果避坑重点统一英文大小写、去除特殊符号避免子词冗余。Day7BERT 核心突破 输入表示学习内容理解 BERT 双向上下文、动态词嵌入、输入嵌入融合实战任务手动构建 BERT 输入token_ids、segment_ids、attention_mask避坑重点区分 token 嵌入、段嵌入、位置嵌入的作用理解特殊 token 含义。Day8BERT 预训练任务MLMNSP学习内容理解 MLM 掩码预测、NSP 下一句预测的核心逻辑实战任务手动生成 MLM 掩码样本理解掩码位置与原始 token 的对应关系避坑重点MLM 掩码概率严格设为 15%理解 NSP 如何学习句子间关系。Day9BERT 数据集预处理学习内容理解 BERT 语料选择、BPE 分词、MLM/NSP 样本生成实战任务用 Hugging Face BertTokenizer 处理中文句子对生成 BERT 输入格式避坑重点处理长文本截断避免序列长度超过 512。Day10BERT 模型结构 从零实现简化版学习内容理解 Transformer 编码器结构、BERT 基础模块实战任务复现简化版 BERT 的 MLM 和 NSP 模块理解联合损失计算避坑重点注意 Transformer 的多头注意力维度匹配避免维度错误。Day11BERT 预训练实战加载预训练权重学习内容预训练与微调区别、Hugging Face Transformers 库使用实战任务加载 bert-base-chinese 预训练权重运行预训练推理避坑重点预训练资源消耗大实战直接加载预训练权重避免从零训练。Day12BERT 下游任务微调文本分类学习内容BERT 微调核心逻辑、学习率设置、正则化技巧实战任务用 BERT 微调中文情感分类任务正面 / 负面避坑重点微调学习率设为 1e-5~5e-5添加 Dropout 防止过拟合。Day13全章知识复盘 高频避坑总结学习内容复盘 核心知识点梳理技术演进脉络word2vec→GloVe→BERT实战任务整理本章高频避坑点形成个人避坑手册避坑重点总结 “数据预处理→模型训练→效果验证” 全流程避坑技巧。Day14综合实战 效果优化学习内容综合运用本章知识解决实际 NLP 问题实战任务选择一个下游任务如新闻分类、问答匹配完成 “数据预处理→BERT 微调→效果评估→优化” 全流程避坑重点针对实战中的 OOV、过拟合、效果差等问题用本章避坑指南解决。五、下章预告自然语言处理应用本章我们掌握了 NLP 预训练的核心技术词嵌入、BERT下章将聚焦预训练模型的实战落地讲解如何将 BERT 等预训练模型适配到各类 NLP 下游任务核心内容包括情感分析基于 RNN/CNN/BERT 的文本情感分类正面 / 负面 / 中性自然语言推断判断句子对的关系蕴含、矛盾、中性序列级 / 词元级微调BERT 在文本分类、命名实体识别、问答系统中的微调技巧实战项目基于 BERT 的中文情感分析、自然语言推断实战从数据预处理到模型部署全流程讲解。下章将理论与实战深度融合带你从 “预训练原理” 走向 “工业级 NLP 应用”干货满满敬请期待六、结尾互动点赞 收藏 关注一起攻克 NLP 预训练✅码字不易干货满满如果你觉得本章详解对你有帮助点赞 收藏 关注你的支持是我持续输出高质量 NLP 干货的最大动力收藏本文14 天学习计划 万字详解 避坑指南随时翻看高效复习帮你快速掌握 NLP 预训练核心技术关注我后续持续更新《动手学深度学习PyTorch 版》全章详解、NLP 实战项目、大模型微调技巧带你从入门到精通深度学习与 NLP。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价