ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

AI-For-Beginners 课程实战:用自定义数据集重跑 Embeddings 词嵌入实验(PyTorch 与 TensorFlow 双版本)

AI-For-Beginners 课程实战:用自定义数据集重跑 Embeddings 词嵌入实验(PyTorch 与 TensorFlow 双版本) 教程人工智能机器学习深度学习【免费下载链接】AI-For-Beginners12 Weeks, 24 Lessons, AI for All!项目地址https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners点击查看免费下载导读本文对应 AI-For-Beginners 课程 NLP 章节第 14 课《Embeddings》的课后作业Assignment: Notebooks。你将学习如何把课程自带的 EmbeddingsPyTorch.ipynb 或 EmbeddingsTF.ipynb 从原始的 AG News 新闻数据集迁移到你自己的数据集上从 Kaggle 获取数据并正确注明来源、重写 notebook 突出自己的发现、尝试不同类型的数据集如披头士歌词并记录实验结果。读完本文后你将掌握 embedding 层、EmbeddingBag、Word2Vec 预训练向量等核心概念的动手实践方法并能独立完成一次完整的换数据重跑实验。一、作业要求速览原作业英文原文的核心指令可以拆解为四步使用课程配套的 notebookPyTorch 版本或 TensorFlow 版本二选一换用你自己的数据集重新运行建议从 Kaggle 挑选若使用他人数据集必须注明来源attribution重写 notebook突出你自己的发现与观察而不是照抄原 notebook 的结论尝试不同类型的数据集例如披头士歌词Beatles lyrics这类非新闻文本并文档化你的实验发现。作业的目的不是让你机械地重跑代码而是验证你能否将一套既定的文本分类 pipeline 迁移到全新的数据形态上并理解数据差异领域、词汇分布、文本长度如何影响 embedding 模型的表现。二、课前准备理解本课实验的原始骨架要换数据重跑首先得吃透原实验的骨架。第 14 课的核心链路如下详见 README.md背景在 BoW / TF-IDF 文本分类中我们使用长度为vocab_size的高维稀疏 one-hot 向量每个词被独立对待不携带词与词之间的语义相似性。embedding 的思想用低维稠密向量表示词使其在一定程度上反映词的语义embedding 层输入一个词编号输出指定embedding_size维的向量等价于一个不需要构造 one-hot 大向量的 Linear 层。embedding bag 模型把 embedding 层作为网络第一层先将文本中每个词映射为对应 embedding再对全部 embedding 做聚合sum/average/max得到整条文本的定长表示之后接线性分类器。图为作者自绘展示先逐词 embedding、再聚合、最后分类的 embedding bag 架构。2.1 PyTorch 版本的骨架EmbeddingsPyTorch.ipynb 与配套模块 torchnlp.py 共同组成实验基础。核心代码如下class EmbedClassifier(torch.nn.Module): def __init__(self, vocab_size, embed_dim, num_class): super().__init__() self.embedding torch.nn.Embedding(vocab_size, embed_dim) self.fc torch.nn.Linear(embed_dim, num_class) def forward(self, x): x self.embedding(x) x torch.mean(x, dim1) return self.fc(x)数据加载与词表构建在 torchnlp.py 中实现load_dataset(ngrams1, min_freq1)从torchtext.datasets.AG_NEWS加载训练/测试集用basic_englishtokenizer 统计词频并构建词表encode(x, voc, unk0)把句子 token 化并映射为词表索引padify(b)把一个 minibatch 内长度不等的序列 pad 到批内最大长度右侧补 0以满足矩形张量要求offsetify(b)将所有序列拼成一个大向量并返回每个序列的起始偏移量向量train_epoch(...)/train_epoch_emb(...)Adam 优化器 CrossEntropyLoss 的训练循环。notebook 中给出了两种变长序列处理方案方案 Apaddingpadify。直接对 minibatch 内序列补零到等长def padify(b): 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)方案 Boffset EmbeddingBag。避免低效 padding改用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) def 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 个值因此需要使用调整后的train_epoch_emb训练函数torchnlp.py。2.2 TensorFlow/Keras 版本的骨架EmbeddingsTF.ipynb 使用tensorflow_datasets加载ag_news_subset模型由四层堆叠model keras.models.Sequential([ vectorizer, # TextVectorization文本 - token 编号 keras.layers.Embedding(vocab_size, 100), # 每个 token - 100 维稠密向量 keras.layers.Lambda(lambda x: tf.reduce_mean(x, axis1)), # 聚合层对词向量取平均 keras.layers.Dense(4, activationsoftmax) # 4 类新闻分类 ])其中TextVectorization(max_tokensvocab_size)负责把字符串转成 token 序列Embedding层输出n × 100张量Lambda聚合层沿第一个轴取平均得到整句的 100 维表示。model.summary()显示该网络约 300 万参数主要来自vocab_size30000的 embedding 矩阵。训练前先vectorizer.adapt(ds_train.take(500).map(extract_text))注意此处只用 500 条样本拟合词表以加速这可能使部分 token 落空而被忽略略微拉低精度——这正是你换数据集后需要观察的现象之一。三、Word2Vec 与预训练向量的实验要点无论哪个框架notebook 后半部分都涉及语义 embeddingWord2Vec。你需要掌握以下实验点作业换数据时同样适用两种预训练架构连续词袋CBoW用上下文预测中心词速度快与 skip-gram用中心词预测上下文速度慢但对低频词更友好gensim 用法import gensim.downloader as api w2v api.load(word2vec-google-news-300) # 首次下载耗时较长 w2v.most_similar(neural) # 查看最相似词 w2v.most_similar(positive[king,woman], negative[man])[0] # 经典 king-manwoman - queen词向量代数qvec w2v[king] - 1.7*w2v[man] 1.7*w2v[woman]然后对全词表向量求平方距离、取argmin得到queen——注意两个 notebook 都需要对系数做微调才能得到稳定结果两种预训练向量接入方案用 tokenizer 的词表遍历词表逐个把 Word2Vec 向量填入 embedding 权重矩阵缺失词留零或随机初始化PyTorch 版随机初始化Keras 版默认置零用预训练词表PyTorch 用torchtext.vocab.GloVe(name6B, dim50)直接加载 GloVe 词表并net.embedding.weight.data vocab.vectorsKeras 用vectorizer.set_vocabulary(list(w2v.vocab.keys()))配合w2v.get_keras_embedding(train_embeddingsFalse)词汇表不匹配是核心痛点预训练词表与你语料词表大概率不一致这直接导致大量词被忽略、精度提升不明显。两种出路①在自己的语料上重新训练 Word2Vec②直接用预训练词表加载数据集。图为论文《Efficient Estimation of Word Representations in Vector Space》中的架构示意图分别展示 CBoW 与 Skip-gram 的预测方向。局限性与延伸传统预训练 embedding 是静态的一词多义word sense disambiguation问题无法解决如I went to a play at the theatre与John wants to play with his friends中的 play 共享同一向量FastText在 Word2Vec 基础上学习子词字符 n-gram向量并逐训练步求平均能编码词形信息但预训练计算量大GloVe基于共现矩阵分解把高维共现矩阵压缩为表达能力更强的非线性词向量语境化 embedding基于语言模型才能解决一词多义本课不展开留待后续语言模型章节18-Transformers讲解。四、实战指南把实验迁移到自己的数据集下面是可直接照做的四步流程同时也是你重写 notebook 时的章节组织建议。步骤 1选数据与合规注明来源首选 Kaggle 上的文本数据集用他人数据时必须在 notebook 的 markdown 单元格中写明数据集作者与来源作业示例给出的是披头士歌词数据集Beatles lyrics作者 Jen Looper。这类歌词/诗歌数据集与 AG News 新闻截然不同句子短、口语化、词汇重复度高、领域极窄非常适合用来对比观察其他可尝试方向电影评论情感分析、推特文本、产品评论、法律文书、技术问答语料等——换不同类型新闻→歌词、长文本→短文本、正式语体→口语语体正是作业的评分点之一。步骤 2适配数据加载PyTorch 版改写 torchnlp.py 中的load_dataset把torchtext.datasets.AG_NEWS换成你自己的数据源。关键点数据结构保持(label, text)元组列表你的数据集可能是 CSV用pandas.read_csv读取后转成list(zip(labels, texts))即可classes列表改为你数据集的类别词表构建与encode/padify/offsetify逻辑无需改动直接复用类别编号从 1 开始t[0]-1转 0 基索引若你的标签是字符串先做 label 编码。TensorFlow 版用tfds之外的来源时把tfds.load(ag_news_subset)替换为你自己的数据集构造器tupelize中拼接文本的字段名x[title] x[description]要改为你数据的文本列输出类别数 4 改为你的类别数。步骤 3超参与训练策略调整换数据集后需重新审视以下参数这也是你自己的发现的一部分参数默认值原 notebook换数据时的调整方向vocab_sizeAG News 全词表 95812TF 版取 30000领域窄的歌词数据集可显著调小过滤低频词embed_dim32自训/ 300Word2Vec/ 50GloVe 6B数据量小时用小维度防止过拟合batch_size16PyTorch/ 128TF文本长度差异大时可调大 batch 观察稳定性lrPyTorch 自训 1、EmbeddingBag 4换小数据集后应从较小学习率重新网格搜索epoch_size25000 条不到一个完整 epoch小数据集可以训练完整多个 epochmin_freq1歌词等小语料建议 ≥2 滤掉罕见词原 notebook 的注释特别提醒只训练 25k 条数据是为了省时间完整训练并调学习率后准确率可逼近约 90%使用预训练向量后因为 embedding 层变大、参数剧增训练时间显著变长且更容易过拟合需要更多样本。步骤 4记录并对比发现重写的 notebook 应当至少包含以下分析块每块配代码 结论 markdown数据概览类别分布、平均句长、词表大小与 AG News 对比自训 embedding vs. 预训练 embedding 的准确率对比分别跑EmbedClassifier自训与 Word2Vec/GloVe 初始化两条路线记录每个 checkpoint 的准确率词表覆盖分析统计预训练词表在你语料上的命中率如 PyTorch 版输出的found X words, Y words missing解释精度差异的根因最相似词可视化用w2v.most_similar挑 3~5 个你数据里的领域词观察结果是否符合语义直觉词向量代数测试在你的语料上尝试king-manwoman类运算记录是否成立及需要如何调系数。五、运行环境与注意事项依赖安装本课依赖通过 NLP 章节的 requirements-pytorch.txt含 torch、torchtext、gensim、nltk 等或 requirements-tf.txt 安装也可参考仓库根目录的 requirements.txt 与 environment.ymlBinder 在线运行GPU 建议第 14 课的预训练向量实验参数量大NLP 章节 README.md 建议使用 GPU 机器若遇到显存不足先减小 minibatch size旧版 TensorFlow 在同一 kernel 训练多个模型后可能不释放显存可在 notebook 中加入physical_devices tf.config.list_physical_devices(GPU) if len(physical_devices)0: tf.config.experimental.set_memory_growth(physical_devices[0], True)下载提示Word2VecGoogle News 300 维与 GloVe 首次加载需要下载较大文件notebook 中有明确提示第一次创建词向量下载需要一些时间建议提前准备好网络环境前置知识本课建立在上一课 13-TextRep文本张量表示、BoW、TF-IDF之上换数据重跑前建议先回顾其中train_epoch等函数的使用方式。六、结论完成本作业后你应该能做到把 EmbeddingsPyTorch.ipynb 或 EmbeddingsTF.ipynb 从 AG News 顺利迁移到任意文本数据集上理解 padding 与 offset 两种变长序列处理方案各自的取舍掌握自训 embedding 与 Word2Vec/GloVe 预训练 embedding 在精度、训练耗时与词表匹配问题上的差异并会用最相似词、词向量代数等手段验证向量确实携带了语义信息。这四点正是本课在整条 NLP 学习路线从文本表示到语言模型中的关键承上启下作用所在。赞分享教程人工智能机器学习深度学习【免费下载链接】AI-For-Beginners12 Weeks, 24 Lessons, AI for All!项目地址https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners点击查看免费下载相关推荐SuperAgent 单元测试代码覆盖率 Istanbul 与 Codecov 集成SuperAgent 单元测试代码覆盖率 Istanbul 与 Codecov 集成 引言为什么代码覆盖率至关重要 在现代软件开发中单元测试是保证代码质量教程人工智能机器学习深度学习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 双框架实战指南 在 AI Fo教程人工智能机器学习深度学习上一篇Buildah 的 Dockerfile 构建引擎openshift/imagebuilder 库使用与源码解析下一篇Humanizer 自定义时间表述策略IDateTimeHumanizeStrategy 接口详解与 DateTime.Humanize 扩展实现创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表