简介这份国科大《自然语言处理》胡玥老师2022年期末复习提纲面向选修该课程、准备期末闭卷或开卷考试的研究生与高年级本科生用一册浓缩笔记串起从神经网络基础到预训练模型的考点脉络。压缩包共1个PDF文件约485KB按章节顺序组织第一、二章标注不考第三至七章逐条列出需掌握的概念、公式与计算题型。内容覆盖激活函数与梯度下降等参数学习方法、CNN结构、LSTM/GRU/BiLSTM与BPTT训练、最大似然估计及NNLM/RNNLM/CW/CBOW/Skip-gram等语言模型、注意力机制的权重计算与软硬注意力、全局局部注意力、马尔科夫与隐马尔可夫的前向-后向和维特比算法、CRF以及Seq2seq的生成式与指针生成网络、Transformer编解码结构与训练流程、ELMo/GPT/BERT的差异。适合考前按目录快速回看配合计算题演练与概念辨析查漏补缺已有420人学习。1. 一张考点地图哪些章节不考、哪些是计算题高发区这份自然语言处理期末复习提纲最反直觉的地方是它把“不考”写在了最前面第一、二、九章直接划掉剩下的第三到第八章、第十、十一章才是全部范围。把目录摊平看它其实是三条线一条是神经网络基础激活函数、三种参数更新、CNN 三层、RNN 三变体与 BPTT一条是表征演进从 one-hot 到语言模型再到注意力与 Transformer 预训练谱系最后一条是任务层序列标注、关系抽取、事件抽取、问答与阅读理解。前两条决定你能不能看懂公式第三条决定你能不能在答题时把模型说清楚。这份梳理适合已经跟完课、需要一次串讲把散点连成面的人计算题只集中在隐马尔可夫的前向、后向与维特比别拖到最后一天才发现。2. 神经网络基础激活函数、三种梯度下降与 CNN/RNN 的结构账2.1 三个激活函数各自解决的问题激活函数在提纲里只有一句话的作用描述——增强网络表达能力加入非线性因素——但这句话背后的逻辑值得展开如果没有非线性无论堆多少层全连接整体仍然等价于一次线性变换深度就失去了意义。Sigmoid 把实数压到 (0,1)形式上是概率友好的但两端饱和区域导数趋近于零反向传播时梯度被逐层削掉Tanh 把输出改成零均值收敛通常比 Sigmoid 快一些饱和问题依旧存在ReLU 用 max(0,x) 一次性解决了正半轴的饱和计算也只是比较大小代价是负半轴梯度恒为零学习率设大了会出现一批“再也醒不过来”的神经元。函数表达式输出区间主要问题复习时记什么Sigmoid1/(1e^-x)(0,1)两端饱和梯度消失输出非零均值概率输出常用深堆叠慎用Tanh(e^x-e^-x)/(e^xe^-x)(-1,1)仍会饱和但零均值收敛比 Sigmoid 稳ReLUmax(0,x)[0,∞)负半轴梯度为 0神经元死亡深网络默认起点答题时容易只写“引入非线性”就结束实际上更完整的表述是激活函数让每层输出经过一次非线性映射使网络可以逼近非线性的决策边界从而学习更复杂的模式。这句话和后面的 CNN、RNN 是同一套逻辑的延伸。2.2 三种参数更新方式的差别只在“多久更新一次”梯度下降这一块提纲列了三种批梯度下降遍历全部数据集算一次损失再更新随机梯度下降每看一个样本就更新一次mini-batch 把样本切成 m 份每跑完一个 batch 更新一次。三者的数学形式完全一样唯一区别是更新频率而更新频率直接决定了收敛曲线长什么样。# 三种更新方式的骨架重点在更新发生的时机不是可运行的训练脚本 for epoch in range(epochs): # 1) 批梯度下降全量样本只换一次参数方向最准一步最慢 loss compute_loss(theta, X_all, y_all) theta - lr * grad(loss, theta) # 2) 随机梯度下降单样本即更新噪声大但逃局部极值能力强 for i in range(num_samples): loss_i compute_loss(theta, X_all[i], y_all[i]) theta - lr * grad(loss_i, theta) # 3) mini-batchbatch_size 常取 32 / 64 / 128兼顾稳定性与吞吐 for xb, yb in iterate_batches(X_all, y_all, batch_size64): loss_b compute_loss(theta, xb, yb) theta - lr * grad(loss_b, theta)这段代码里最需要说清楚的是batch_size这个参数。它小梯度噪声大、更新频繁往往需要配合更小的学习率它大梯度方向更接近全量但显存占用上升、单位 epoch 的更新次数变少。批梯度下降的优点是方向稳定、曲线平滑缺点是样本量大到一个 epoch 都跑不完随机梯度下降的优点是每一步都很快缺点是损失曲线抖得厉害mini-batch 是工程上默认的折中也是 GPU 并行最友好的形式。考试里如果问“哪种更好”正确的答法不是选一个而是说明三者在收敛速度、稳定性、内存开销上的取舍关系。2.3 CNN 三层结构每一层都在减不同的东西卷积神经网络的三层在提纲里各带了一个动词卷积层“减少参数”池化层“减少网络规模”全连接层“将池化层的单元平化”。这三个“减”对象不同混在一起写就会被扣分。层核心操作减少的对象关键机制卷积层滑动窗口做加权求和参数量局部连接 权值共享池化层窗口内取最大或平均特征图尺寸、计算量下采样保留显著响应全连接层展平后做矩阵乘无是最终映射把分布式特征汇总到输出空间参数量差多少用一个具体算例最直观输入是 32×32×3 的图像接 64 个 3×3 卷积核参数量是 3×3×3×64641792如果把同样大小的输入直接拉平成 3072 维接一个 64 维全连接层参数量是 3072×6464196672差了将近两个数量级。权值共享的意思是同一个卷积核在整张图上滑动同一组参数被反复使用这正是卷积层“减少参数”的确切含义。池化层不改变通道数只压缩长宽它带来的另一个副作用是小范围平移不变性。全连接层唯一的动作是把 (H, W, C) 展平成向量这一步的参数量往往最大所以很多现代结构会用全局平均池化替代它——这一点提纲没有写但理解它有助于解释为什么“减少参数”要分两层来谈。2.4 RNN 三变体与 BPTT梯度是按时间步叠加的循环神经网络要处理的输入是变长序列隐藏状态在时间轴上传递这带来两个直接后果一是能利用历史信息二是反向传播必须沿时间轴展开。提纲列出的三种改进各针对一个痛点变体改动解决的痛点LSTM引入输入门、遗忘门、输出门与细胞状态长距离依赖下梯度消失GRU把输入门与输出门简化成更新门另设重置门结构更轻训练更快BiLSTM正向与反向两个 LSTM 叠用单向只能看上文双向能同时看上下文LSTM 的关键不是“门多”而是细胞状态这条通道让梯度可以近乎无损地跨很多时间步回传GRU 的简化思路是把 LSTM 的三个门压缩成更新门和重置门两个参数少了约四分之一很多任务上效果并不差BiLSTM 解决的是另一维度的问题——不是记不住而是只能朝一个方向看双向拼接后每个位置的表示同时包含左右上下文在序列标注类任务上几乎是标配。BPTT 是 RNN 的参数训练方法核心一句话损失函数定义为每一个时刻损失之和反向传播时在每一个时间步长内叠加所有对应的权重梯度。写成式子就是总损失对同一组共享权重 W 的梯度等于各时刻梯度之和因为 W 在每个时间步都被用了同一份。这带来两个实际后果序列一长梯度连乘要么趋近零要么爆炸工程上只能用截断 BPTT把序列切成定长片段分别回传。复习时最容易漏掉的是“共享权重”这四个字——正因为参数共享梯度才需要叠加而不是各时刻各算各的。提示BPTT 和普通 BP 的差别不在反向传播算法本身而在传播经过的计算图里多了时间维。答题时先点出“沿时间展开”再写“梯度按时间步求和”顺序不能反。3. 语言模型与注意力从最大似然到权重求和3.1 概率语言模型只有一条主线用最大似然估参数概率语言模型的目标是给一个词序列打概率链式分解后变成每个位置在给定前文条件下的条件概率连乘。参数学习的办法是本篇提纲里唯一提到的那一个最大似然估计。落到 n-gram 上就是数频次条件概率等于“该 n-gram 出现次数”除以“前 n-1 个词出现次数”。这个方法本身没有难度难点在它暴露出来的问题任何没在语料里出现过的组合概率都是零整句概率直接被清零所以工程上必须做平滑。提纲在这里没有展开平滑方法复习时知道“MLE 会带来数据稀疏所以 n-gram 需要平滑”这层因果链就够了后面的 RNNLM 之所以被夸正是因为它绕开了这个坑。3.2 离散词表示的两个明显缺陷one-hot 把词表大小当作向量维度每个词只有一个位置是 1其余全零词袋把一句话里所有词的 one-hot 相加丢掉顺序只留词频。两者的共同问题是维度随词表线性膨胀、向量极度稀疏并且任意两个词的向量内积恒为零模型无法从“猫”和“狗”的相似性里获得任何信息。这直接引出了后面所有神经语言模型的动机把词映射到低维稠密空间让语义相近的词在向量空间里也靠近同时把参数学习的对象从离散计数转成连续可导的优化问题。3.3 五个神经网络语言模型的输入输出对照这一张表是本章最该背下来的东西五个模型的差异几乎全部体现在输入是什么、输出是什么、用什么方法学参数这三列里。模型输入输出参数学习方法一句话定位NNLMx0…x_{i-1}p(x_i | x0…x_{i-1})BP前馈网络 固定窗口开山之作RNNLMx_{i-1}p(x_i | x_{i-1}) 及隐状态BPTT隐状态承载全部历史不再截断CW目标词及其上下文对输入序列打分pairwise 排序优化输出是分数不是概率CBOW上下文各词词向量的平均目标词概率梯度下降多对一训练快Skip-gram目标词词向量上下文词概率梯度下降一对多低频词表现更好CW 这一行最容易写错。它的输出不是概率分布而是给一个文本片段打分训练时用 pairwise 的方式比较正确片段与替换中心词后的错误片段让前者得分高于后者本质上是一个排序目标而不是分类目标。CBOW 和 Skip-gram 都是 Word2Vec 的两种结构前者用上下文平均预测中心词后者用中心词预测上下文方向正好相反。NNLM 和 RNNLM 的区别在于窗口是否固定NNLM 只能看前 n-1 个词RNNLM 靠隐状态把整段历史压进去。3.4 RNNLM 的两个优点要连起来理解提纲给了两条可以保留每个词的全部历史信息不需要简化为 n-gram引入词向量作为输入后不需要数据平滑。第一条对应的是马尔可夫假设的松绑——n-gram 为了可计算强行规定第 t 个词只依赖前 n-1 个词RNNLM 用一个隐状态向量代替这个窗口理论上能记住任意长的前文。第二条对应的是稀疏性n-gram 里没见过的组合概率为零必须平滑而 RNNLM 每一步输出的是词表上的 softmax 概率分布连续空间里不存在“硬零”即使某个组合没出现模型也会给它一个非零的小概率于是平滑这一步被结构本身吸收了。3.5 传统注意力的三步与两种模式注意力模块的结构在提纲里写得很干脆三步先算 Q 与每个 K 的匹配度 f(Q, Ki)再 softmax 归一成权重最后按权重加权求和得到输出。第一步的 f 可以是点积、缩放点积或加性网络第二步产生的是一个概率分布第三步才是把“看哪里”转成“取什么值”。import numpy as np # Q: (d,) 当前查询K: (n, d) 键矩阵V: (n, dv) 值矩阵 scores K Q # 1) f(Q, Ki)点积打分 weights np.exp(scores) / np.exp(scores).sum() # 2) softmax 归一 out weights V # 3) 加权求和键值对模式 # 普通模式下把 V 换成 Kout weights K代码里最后一行注释就是两种模式的分界。普通模式的输出是各 K 按权重求和键值对模式的输出是各 V 按权重求和权重仍然由 Q 和 K 算出来。为什么要有键值对模式因为很多时候“被检索的键”和“被取出的内容”不是同一个东西比如机器翻译里 K 和 V 可以来自编码器而 Q 来自解码器当前状态。提纲里那两个 Att-V 公式区别就在于乘的是 K 还是 V这一点在选择题里被改一个下标就能变成错项。3.6 软、硬、全局、局部四种注意力的分界线类型对齐方式可微性代价软注意力对输入每个词都给一个概率可微能反向传播都要算序列长时开销大硬注意力只选一个词对齐其余概率记 0不可微需采样或强化学习快但训练不稳全局注意力解码时看编码器全部词可微计算量随长度线性涨局部注意力先预测对齐位置 Pt在 Pt±D 窗口内做软分布可微计算量可控软硬之分看的是“给所有词一个分布还是只挑一个”全局局部之分看的是“看全部还是看一个窗口”。局部注意力本质上是软与硬的折中位置预测这一步类似硬对齐窗口内的概率分布又回到软注意力因此既拿到了可微性又避免了全序列扫描。四条定义里最容易被写反的是硬注意力——它的“硬”体现在概率只有 0 和 1而不是体现在不可微上不可微只是这个定义的后果。3.7 注意力的三种编码方式与一个常被忽略的优点提纲把注意力编码分成三类单一向量编码把输入序列按规则压成一个向量不同序列间编码把两个序列编码成融合表示同一序列自编码用多头自注意力对一个句子编码可以起到类似句法分析器的作用。第三类其实是 Transformer 编码器的雏形自注意力让句子里的每个词直接和所有词交互学到的权重分布常常对应句法依存关系这是“注意力可解释性”这一说的来源。注意力被提的两个优点是根据不同场景动态选择关注对象不考虑词之间的距离直接计算依赖关系从而提升任务性能。第二条对 RNN 是致命的对比——RNN 里相距 50 个时间步的两个词要靠隐状态一路传过来注意力里它们是一次点积的距离。应用场景记住一句就够网络中凡是有“求和”的地方都可以换成加权求和如图卷积、机器翻译。4. 从 Transformer 到任务层预训练模型谱系、序列生成与信息抽取4.1 Transformer 的三层结构差异与训练四步编码器和解码器的层数在提纲里都是 6 层堆叠差别在子层数量编码器每层两个子层多头注意力加前馈网络解码器每层三个子层多出来的是与编码器输出做交互的 cross-attention。cross-attention 的连接方式必须记准解码端每一层都与编码端的最后输出层做注意力Q 来自解码端当前层K 和 V 来自编码端最后一层的输出。训练过程按提纲是四步把 X 输入编码器最后一层编码器输出作为解码器每一层的 K 和 V把起始符作为解码器初始输入解码器最后一层最大概率输出的 y1 与标准答案计算交叉熵把标准答案的前 i 个词作为解码器输入生成第 i1 个词再与答案的第 i1 个词算交叉熵重复上一步直到最后一个输出与终止符算完交叉熵。梳理下来会发现这套流程是典型的 teacher forcing——每一步喂进去的是标准答案而不是模型自己上一步的输出好处是训练可以并行、误差不累积代价是训练和推理时的输入分布不一致。答题时如果被追问“为什么训练快但推理慢”答案就在这里训练时整句答案已知一次前向就能算出所有位置的损失推理时只能一个词一个词往外蹦是自回归的。4.2 五个预训练模型的定位与短板模型结构预训练任务强项短板ELMO双向 LSTM双向语言模型上下文相关词表示可插到下游任务特征拼接式融合交互不深GPTTransformer 解码器12 层768 维12 头自回归语言模型生成能力强单向不能双向理解语言BERT堆叠的双向 Transformer 编码器base 12 层 / large 24 层MLM 加 NSP双向理解加一个输出层即可迁移不具备生成任务能力BART标准 Transformer 编解码结构多种噪声破坏后序列到序列复原同时吸收 BERT 与 GPT 的优点预测时不使用额外的 FFNT5Transformer 编解码结构输入加任务前缀统一成文本到文本一套结构通吃多任务依赖前缀设计BERT 的输入输出是高频考点输入可以是一个句子或一个句对每个序列以 [CLS] 开头句对之间插入 [SEP][CLS] 位置的输出表达整个句子的信息拿来接分类器其余每个输入位置对应一个 Transformer 编码位。GPT 的结构细节在于它砍掉了普通解码器里的编码器-解码器注意力子层每个子层只有一个带掩码的多头自注意力和一个前馈网络共 12 层解码器堆叠。BART 的特别之处在于“破坏再复原”用多种噪声把原文弄乱让模型做序列到序列的还原因此它既懂双向上下文又能做生成。T5 的思路最统一所有任务都改写成“输入加任务前缀、输出是文本”的形式。4.3 第三范式与第四范式到底是谁迁就谁第三范式是预训练加精调第一阶段用大语料做非监督预训练第二阶段针对具体任务在标注数据上做监督微调。第四范式是预训练加提示加预测不改模型结构改任务形式把下游任务重构成预训练时见过的形式从而支持小样本、半监督甚至零样本。两者最容易被写反的是“谁做出牺牲”。第三范式是预训练语言模型迁就下游任务做法是在模型上引入各种辅助任务的损失继续预训练让它更适配具体任务模型这边让步更多第四范式是下游任务迁就预训练语言模型把任务重构成模型熟悉的样子任务这边让步更多。prompt 的形态也和模型类型绑定完形填空式提示适合 BERT 这类 MLM 式模型情感分类就是典型场景前缀式提示适合 GPT 系列这类单向语言模型。4.4 序列生成的三条路线与指针生成网络路线代表输出从哪来局限生成式RNN、RNNAttention、Transformer从词表里生成高度依赖词表示遇 OOV 表达不准选择式指针网络直接从输入中选输出词表等于输入词表造不出新词选择-生成式指针生成网络、拷贝网络可生成也可拷贝结构复杂度上升指针网络解决的是“输出必须出现在输入里”的任务比如抽取式摘要但它治不了需要新词的场景于是指针生成网络把生成式与指针网络结合用一扇门控制这一步是生成还是拷贝。评价指标记四个正确率、召回率、BLEU、ROUGE。BLEU 偏向 n-gram 精确率ROUGE 偏向召回两者的取舍方向相反答题时不要混。4.5 隐马尔可夫与 CRF三个问题对应三套算法马尔科夫模型的定义是t 时刻的状态 qt 只与 t-1 时刻的状态相关。隐马尔可夫模型则是双重随机过程状态转移过程不可观察可观察事件是隐藏状态转换过程的随机函数。它的三个经典问题在提纲里只点了两个评估问题用前向算法和后向算法解码问题用维特比算法。学习问题提纲没有列但复习时至少要知道它对应参数估计不至于被问到就卡住。CRF 在这条线里的位置很明确它解决的是隐马尔可夫对输出之间独立性的假设问题。HMM 里观测之间被默认条件独立序列标注任务里这个假设太强CRF 把整句的标签作为一个整体做全局归一化从而建模标签之间的依赖。命名实体识别的三条技术路线也在这条线上基于规则或字典的方法靠模板加匹配统计学习方法靠特征工程加算法常见的有 PRanking、margin、SVM、LR神经网络方法把 NER 当序列标注做模型从 CNNRNN 到 RNNCRF 再到 BERT。开放域 NER 则是另一套流程种子处理、生成模板、实体抽取、按置信度排序、结果过滤。4.6 关系抽取与远程监督一个太强的假设限定域关系抽取有三类方法规则方法靠人工编制识别规则成本高、覆盖低统计方法把关系实例转成高维特征向量或离散结构在标注语料上训练分类器其中又分基于特征向量和基于核函数两条神经网络方法设计网络结构自动捕捉特征分单一关系抽取与联合抽取。非限定域关系抽取分两种利用知识库的实体间关系不限定但关系类别由知识库定义开放域抽取的关系类别需要从任务中自动获取。远程监督是半监督思路拿一个标注好的小型知识图谱给外部文档里的句子自动打关系标签从多个句子里抽文本特征拼成向量作为该类关系的样本。它的优点是可以从海量无标签数据里获取信息多个句子的信息综合起来还能降低单句噪声。缺点就在那个假设上——只要句子里出现了知识库里的实体对就假定它表达的是知识库中的那种关系条件太强噪声自然多。改进办法是多示例学习单个示例可能有噪声但把包含同一实体对的多个示例放在一起关系类别可以从它们的相互作用中学出来。4.7 事件抽取与四类问答系统事件抽取是从无结构化文本中抽取结构化事件信息五个基本要素要背准事件描述、事件触发词、论元角色、元素角色、事件类别。典型问答系统分四类专家系统面向限定领域数据来自结构化领域知识检索式问答面向开放领域基于非结构化网页数据返回的是简短词或词组社区问答在社区历史问答里找匹配答案知识库问答对自然语言问题做语义理解和解析再在知识库上查询推理出答案。知识库问答的四条技术路线是语义解析、信息抽取、向量建模、表示学习。问答和阅读理解的区别值得单独记一段问答多是事实性单轮问答阅读理解是非事实性的推理问答问答考的是文本匹配与信息抽取能力阅读理解考的是细致化的语言理解与推理能力机器阅读理解的答案是给定在文章里的所以它是有监督任务核心不是相似度计算。神经机器阅读理解按答案形式分四种完形填空、基于选项、片段抽取、文本生成。模型框架统一为四段嵌入编码、特征提取、文章与问题交互、答案预测。5. 易漏点与易错点五个一写就扣分的地方5.1 把 BPTT 写成普通反向传播易漏点只写“用反向传播训练 RNN”不写沿时间展开、梯度按时间步求和。 为什么漏BP 这个名字太熟顺手就写上去了而 BPTT 的“多出来的那一维”在公式里不显眼。 怎么补答题时固定写两句——损失是各时刻损失之和同一组共享权重在每个时间步都被使用因此总梯度等于各时刻梯度之和。再加一句截断 BPTT 的工程处理这个点就完整了。5.2 普通注意力模式与键值对模式混用易漏点算权重时用 Q 和 K加权求和时乘的到底是谁说不清。 为什么漏两个公式长得几乎一样只差一个字母背的时候容易只记结构不记下标。 怎么补记一句口诀——权重永远由 Q 和 K 算乘的东西看模式普通模式乘 K键值对模式乘 V。写答案时把 Att-V 的展开式完整写出来别只写符号。5.3 cross-attention 的 Q、K、V 来源搞反易漏点说成“解码器提供 K 和 V编码器提供 Q”。 为什么漏多头注意力的 QKV 在自注意力里都来自同一处切换到交叉注意力时很容易顺手照搬。 怎么补按“谁在查询谁”来记。解码器当前层是提问方所以 Q 来自解码器被查询的是编码器的输出所以 K 和 V 来自编码器最后一层。用一句话复述解码端每一层与编码端最后输出层做 cross-attention。5.4 第三范式和第四范式的方向写反易漏点说不清到底是谁迁就谁。 为什么漏两个范式都叫“预训练加某某”名字结构相似牺牲方向正好相反。 怎么补抓关键词。第三范式是模型迁就任务体现为给模型加辅助损失继续预训练第四范式是任务迁就模型体现为把任务重构成完形填空或前缀形式。前者模型让步多后者任务让步多两句话背下来就不会反。5.5 HMM 的问题与算法错位CRF 解决什么说不清易漏点把前向算法当成解码把维特比当成评估或者把 CRF 说成“解决标注偏置”。 为什么漏三个问题的名字太像算法名字又不带提示CRF 的作用常被记成一句模糊的“效果更好”。 怎么补按“问什么”来配对。问这段观测序列出现的概率是评估用前向或后向问最可能的状态序列是解码用维特比。CRF 的位置锁定在“输出之间独立”这个假设上HMM 默认观测条件独立CRF 做全局归一化来建模标签依赖。答题时先写被解决的问题再写方法名。6. 复习清单按题型倒推的最后一轮查漏补缺最后一周不建议再从第一页翻起按题型倒推效率最高。下面这张表可以当作自查清单每一行右边的动作要能合上书独立完成做不出来就回到对应小节。题型涉及内容必须能独立完成的动作名词解释马尔科夫模型、隐马尔可夫、CRF、远程监督、事件抽取五要素每个用两句话说清定义加一个关键性质简答对比三种梯度下降、LSTM 与 GRU、软硬注意力、BERT 与 GPT说出差异维度再各举一个适用场景模型结构CNN 三层、RNN 三变体、Transformer 编解码、五个预训练模型画出层次关系标出每个子层的输入输出计算题HMM 前向、后向、维特比手算一遍小规模例子写出递推式再代数流程题开放域 NER、远程监督、Transformer 训练四步按序号写出步骤不跳步论述题第三范式与第四范式、问答与阅读理解的区别先给判断句再展开两到三层理由具体操作上我会把计算题单独拎出来做三遍第一遍照着递推式抄一遍理解每一步在累加什么第二遍换一组观测序列自己算第三遍限时算。HMM 的前向和后向最容易在初始化和终止两步出错维特比最容易漏掉回溯路径那一步——只算出最大概率而不回溯状态序列等于白算。结构题则相反不要默写公式改成合上书画框图本文还有配套的精品资源点击获取