资讯动态

用自定义数据集重跑 Embeddings 实验:AI-For-Beginners 第 14 课作业实战指南

发布时间:2026/10/9 9:58:05 来源:尧图企业网站定制
教程人工智能机器学习深度学习【免费下载链接】AI-For-Beginners12 Weeks, 24 Lessons, AI for All!项目地址https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners点击查看免费下载本文围绕 AI-For-Beginners 第 14 课「Embeddings词嵌入」的 Notebooks 作业展开你将学会如何用自有数据集例如来自 Kaggle 并遵循署名的文本语料重跑 PyTorch 或 TensorFlow 版嵌入实验改写 Notebook 突出自己的观察结论并系统掌握词嵌入、EmbeddingBag、Word2Vec 与预训练嵌入的完整技术链路。读完本文你不仅能高质量完成作业还能独立复现从文本分词到嵌入分类的全流程。作业任务解读该作业要求你完成以下四件事详见 作业原文重跑配套 Notebook选择 PyTorch 版 或 TensorFlow 版 中的任意一套用你自己的数据集重新执行。遵循数据出处规范若数据来自 Kaggle 等平台必须在交付物中注明来源并遵守相应署名attribution要求。改写 Notebook不要原样照搬而是围绕你自己的观察与结论重构 Notebook 的结构、注释与说明文字。尝试不同类型的语料建议选用与默认 AG News 新闻数据集差异较大的数据例如文本歌词原文示例为 Beatles 歌词并文档化你的发现如词表规模、训练曲线、准确率差异、缺词率等。默认实验中使用的数据集是 AG NewsPyTorch 版经torchtext.datasets.AG_NEWS加载见 torchnlp.pyTensorFlow 版经tfds.load(ag_news_subset)加载类别为 World、Sports、Business、Sci/Tech 四类。更换数据集后类别数、语料语言、文本长度分布都会发生变化这正是作业想要你观察和记录的差异点。前置知识为什么从词袋转向嵌入要完成作业首先要理解 Notebook 前半部分的技术背景。在第 14 课之前的实验中分类器基于 BoW词袋或 TF/IDF操作的是长度为vocab_size的高维稀疏向量且需要把词的位置表示显式转换成 one-hot 编码。这种表示有两个明显缺陷详见 课程 README内存效率低one-hot 向量大部分元素为 0词表越大越浪费无语义关联每个词被独立对待任意两个词的 one-hot 向量距离完全相等无法表达词之间的语义相似性。嵌入Embedding的核心思想是用低维稠密向量表示词让向量在一定程度上反映词的语义。嵌入层接收一个词的编号作为输入输出长度为embedding_size的向量。它从结构上类似Linear/Dense层但输入不再是 one-hot 编码而是词编号从而避免构造巨大的 one-hot 向量。将嵌入层作为网络第一层后模型就从「词袋」升级为embedding bag嵌入袋模型先把文本中每个词转换为对应嵌入再对所有嵌入计算某种聚合函数sum、average或max得到整段文本的向量表示最后交给线性分类器变长序列的两种处理方式作业中必须理解的关键设计切换到嵌入后一个立刻浮现的问题是每个样本的单词数量不同如何组织成 minibatch之前 BoW 张量在 minibatch 中都是等长的vocab_size而嵌入模型下文本序列长短不一。Notebook 给出了两种方案你在改写时可以选择其一并在文档中说明各自的取舍。方案一填充paddingPyTorch 版通过collate_fnpadify实现先对每条文本编码成 token 序列求出当前 minibatch 内序列的最大长度l再用 0PAD token把较短序列补齐到等长。核心代码见 EmbeddingsPyTorch.ipynbdef padify(b): # b 是长度为 batch_size 的元组列表 # - 元组第一个元素 标签 # - 第二个元素 特征文本序列 v [encode(x[1]) for x in b] l max(map(len, v)) return ( torch.LongTensor([t[0]-1 for t in b]), torch.stack([torch.nn.functional.pad(torch.tensor(t), (0, l-len(t)), modeconstant, value0) for t in v]) ) train_loader torch.utils.data.DataLoader(train_dataset, batch_size16, collate_fnpadify, shuffleTrue)TensorFlow 版则由TextVectorization层自动完成同样的填充两个不同长度的句子被向量化后得到 (2, 6) 的矩形张量空位以 0 填充。Notebook 还给出了一个优化建议可以按序列长度递增排序使每个 minibatch 内序列长度相近从而减少填充量。方案二偏移向量offset填充会带来冗余计算。另一种更高效的表示是偏移向量把所有序列拼接进一个大向量再用一个offsets向量记录每个序列的起始位置PyTorch 中对应的是EmbeddingBag层它同时接收内容向量和偏移向量内部还集成了mean、sum或max聚合。改造后的分类器极其简洁class EmbedClassifier(torch.nn.Module): def __init__(self, vocab_size, embed_dim, num_class): super().__init__() self.embedding torch.nn.EmbeddingBag(vocab_size, embed_dim) self.fc torch.nn.Linear(embed_dim, num_class) def forward(self, text, off): x self.embedding(text, off) return self.fc(x)配套的offsetify用累积求和计算偏移EmbeddingsPyTorch.ipynbdef offsetify(b): x [torch.tensor(encode(t[1])) for t in b] o [0] [len(t) for t in x] o torch.tensor(o[:-1]).cumsum(dim0) return ( torch.LongTensor([t[0]-1 for t in b]), # 标签 torch.cat(x), # 文本 o # 偏移 )注意改用EmbeddingBag后dataloader 一次返回 3 个值标签、文本、偏移网络前向也接受两个参数因此必须配套使用专门的训练函数PyTorch 版为train_epoch_emb见 torchnlp.py这一点在更换数据集时同样适用。语义嵌入Word2Vec 与 gensim作业要求你「文档化自己的观察」而这部分正是观察点最丰富的实验环节。前面训练的嵌入层只是把词映射到向量并不保证向量具有语义含义。要让同义词的向量在欧氏距离等度量下彼此接近需要用大规模语料以特定方式预训练嵌入模型最经典的方法就是 Word2Vec其两种架构为连续词袋CBoW给定 n-gram $(W_{-2},W_{-1},W_0,W_1,W_2)$用上下文 $(W_{-2},W_{-1},W_1,W_2)$ 预测中心词 $W_0$。训练更快。连续跳元skip-gram与 CBoW 相反用中心词预测周围窗口内的上下文词。训练更慢但对低频词的表征更好。Notebook 使用 gensim 加载在 Google News 语料上预训练的word2vec-google-news-300模型进行实验首次加载需要下载耗时较长。你可以复现并观察w2v.most_similar(neural)返回最相似词neuronal、neurons、neural_circuits…相似度约在 0.65~0.78 之间w2v[play][:20]展示 300 维向量的前 20 个分量经典的向量运算king - man woman ≈ queengensim 直接给出结果(queen, 0.7118...)手动实现则是求目标向量与词表中所有向量距离的argmin。在作业文档中你可以记录以下对比更换数据集后同一单词的邻近词是否发生变化你的语料是否包含 Word2Vec 预训练词表中缺失的领域词另外Notebook 还对比了 FastText额外学习字符 n-gram编码子词信息和 GloVe基于共现矩阵分解gensim 均支持可以替换模型加载代码做消融实验。预训练嵌入落地词汇表不一致问题作业改写的核心难点Word2Vec/GloVe 预训练嵌入可以直接替代嵌入层但面临一个关键问题预训练模型的词表与你的语料词表大概率不一致。Notebook 给出了两条解决路径你在重跑自有数据集时必然要处理这个问题路径 A用自己的词表缺词随机初始化以 PyTorch 为例遍历自己语料构建的词表vocab.get_itos()命中的词拷贝预训练向量缺失的词用正态分布随机向量填充见 EmbeddingsPyTorch.ipynb。默认 AG News 实验中词表 95812预训练命中 41080 个词缺词 54732 个——这个「命中率」数据本身就是很好的观察记录点。需要说明的是这会让嵌入层尺寸如 300 维远大于自训练方案如 32 维参数更多、训练更慢也更容易过拟合。TensorFlowKeras版思路相同用vectorizer.get_vocabulary()遍历构造vocab_size × embed_size权重矩阵W缺失词可置零或随机初始化再以keras.layers.Embedding(vocab_size, embed_size, weights[W], trainableFalse)冻结加载注意trainableFalse意味着不微调嵌入层训练更快但准确率可能略低见 EmbeddingsTF.ipynb。路径 B用预训练模型的词表加载数据PyTorch 版借助torchtext内置支持直接实例化 GloVe 词表vocab torchtext.vocab.GloVe(name6B, dim50)其基础操作包括vocab.stoi词 → 索引、vocab.itos索引 → 词、vocab.vectors嵌入向量矩阵取词s的向量用vocab.vectors[vocab.stoi[s]]。随后用 GloVe 词表重新编码数据encode(t[1], vocvocab)并直接把整个矩阵拷贝进嵌入层net EmbedClassifier(len(vocab), len(vocab.vectors[0]), len(classes)) net.embedding.weight.data vocab.vectorsKeras 版则用w2v.get_keras_embedding(train_embeddingsFalse)自动生成对应嵌入层并用vectorizer.set_vocabulary(vocab)指定预训练词表。两条路径的观察要点两个 Notebook 的结论一致换用预训练嵌入后准确率提升并不显著PyTorch 版约 75% 上下与自训练嵌入接近主要原因是数据集中部分词在预训练词表中缺失、被忽略。这正指向作业要求的「记录你的发现」——请在你的改写版本中量化语料词表与预训练词表的重合率缺失词的占比及其对准确率的影响若改为在自有语料上从头训练嵌入效果是否更好。上下文嵌入一个必须写进结论的局限课程明确指出了一个重要局限词义消歧word sense disambiguation问题。Word2Vec 这类静态预训练嵌入把所有可能的词义编码进同一个向量例如play在下面两个句子中含义完全不同I went to aplayat the theatre.名词戏剧John wants toplaywith his friends.动词玩耍但两个含义共享同一个嵌入向量可能误导下游模型。克服方案是使用基于语言模型的上下文嵌入contextual embeddings课程将其留到后续语言模型单元讲解。在作业报告中建议用你自己数据集中真实的歧义词举例说明静态嵌入的局限作为结论部分的升华。完成作业的实操步骤清单综合以上分析一份合格的作业交付物建议包含以下步骤请结合所选 Notebook 落地选定并获取数据集从 Kaggle 等平台挑选与新闻文本类型不同的语料如歌词、影评、法律文书、多语言文本记录来源、许可证与署名信息。替换数据加载代码将 Notebook 中AG_NEWS/ag_news_subset的加载逻辑替换为你的数据读取逻辑同步更新classes类别列表若使用 PyTorchtorchnlp.py 的load_dataset与encode均可复用只需替换数据源。重建词表记录新的词表规模与min_freq过滤效果对比 AG News 的 95812观察歌词等小语料的词表差异。按步骤重跑依次完成自训练嵌入分类器padify EmbeddingBag 两条路径、gensim Word2Vec 语义实验、预训练嵌入路径 A/B三组实验记录每组训练的 loss/acc 曲线与耗时。改写与文档化把每步的代码注释和 Markdown 说明改为「你的观察」——例如「更换数据集后命中率变化」「低资源语料上预训练嵌入是否仍然有效」「聚合函数 mean/sum/max 的选择对结果的影响」。结论与局限结合上下文嵌入的局限给出针对该数据集的最终结论与后续改进方向。交付自查清单提交前对照以下要点检查你的改写成果数据来源与署名是否明确标注数据集类别/标签是否与分类器输出维度一致词表不一致问题是否被显式处理并记录命中率训练函数是否适配了EmbeddingBag的三元组输入若选用偏移方案每个实验是否包含你自己的观察注释与量化结论是否对比了「自训练嵌入 vs 预训练嵌入」及不同数据集之间的表现差异。完成以上步骤你交付的将不再是对照源码的复制而是一份结构完整、有独立观察与结论的嵌入技术实验报告。赞分享教程人工智能机器学习深度学习【免费下载链接】AI-For-Beginners12 Weeks, 24 Lessons, AI for All!项目地址https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners点击查看免费下载相关推荐AI-For-Beginners 词嵌入Embeddings作业实战用自定义数据集重跑 PyTorch / TensorFlow NotebookAI For Beginners 词嵌入Embeddings作业实战用自定义数据集重跑 PyTorch / TensorFlow Notebook 导读教程人工智能机器学习深度学习AI-For-Beginners 词嵌入Embeddings实战作业指南用自定义数据集重跑 PyTorch / TensorFlow 笔记本AI For Beginners 词嵌入Embeddings实战作业指南用自定义数据集重跑 PyTorch / TensorFlow 笔记本 本文面向正在教程人工智能机器学习深度学习SuperAgent 单元测试代码覆盖率 Istanbul 与 Codecov 集成SuperAgent 单元测试代码覆盖率 Istanbul 与 Codecov 集成 引言为什么代码覆盖率至关重要 在现代软件开发中单元测试是保证代码质量教程人工智能机器学习深度学习上一篇解锁老旧Mac潜能OpenCore Legacy Patcher终极技术指南下一篇OpenCore Legacy Patcher完整指南四步让老旧Mac重获新生创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

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

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

免费获取报价 →
↑