)
教程人工智能机器学习深度学习【免费下载链接】AI-For-Beginners12 Weeks, 24 Lessons, AI for All!项目地址https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners点击查看免费下载导读本篇文章围绕 AI-For-Beginners 课程第 14 课Embeddings的作业assignment.md展开作业要求学习者使用本课提供的 EmbeddingsPyTorch.ipynb 或 EmbeddingsTF.ipynb 作为基础换用来自 Kaggle 等来源的自有数据集重跑整个实验改写 notebook 突出自己的观察并尝试与新闻分类不同的数据类型例如歌词文本记录实验结果。读完本文你将掌握如何把课程内置的 AG News 文本分类实验改造成任意自有语料的嵌入Embedding训练实验理解词嵌入、EmbeddingBag、Word2Vec 等核心机制的底层实现并学会规范地撰写一份可复现的实验报告。一、作业任务解读从跑通示例到自主实验课程作业原文要求可以拆解为四个可验证的动作换数据重跑使用本课配套的 notebookPyTorch 或 TensorFlow 任一版本改用你自己的数据集再次运行。数据可以来自 Kaggle但必须正确标注数据来源attribution。改写突出观察修改 notebook 的代码与叙述使实验重点落在你自己的结论上而不是照搬课程示例的新闻分类结论。换数据类型尝试一种与课程内置新闻数据不同类型的语料作业示例给出的是歌词文本并系统记录结果。文档化把换数据、换类型后的训练曲线、准确率、词表差异等发现写入 notebook 的 Markdown 单元格。作业的本质是把用 AG News 新闻标题做嵌入分类这一课程实验迁移到你自己关心的语料上从而检验你对嵌入层、变长序列处理、预训练词向量Word2Vec / GloVe的理解是否真正可迁移。下面各节会逐一给出可复制的改写法。二、前置知识回顾为什么需要 Embedding作业改写的所有代码都建立在 Embeddings 的核心思想上课程 README 与两个 notebook 的开篇对此有清晰交代在 BoW / TF-IDF 分类器中我们操作的是长度为vocab_size的高维词袋向量并且显式地把低维位置表示转换成稀疏 one-hot 向量。one-hot 有两个硬伤内存不高效向量长度等于词表大小且词与词彼此独立不表达任何语义相似度。Embedding的思路是用低维稠密向量表示词使向量在一定程度上反映词的语义。Embedding 层接收一个词的编号index作为输入输出指定维度embedding_size的向量从结构上看它非常接近Linear/Dense层区别在于它接受的是词编号而非 one-hot 向量从而避免构造巨大稀疏向量。当把 Embedding 层作为分类网络的第一层时模型就从词袋升级为Embedding Bag 模型先把文本中每个词转成对应嵌入再对整句所有嵌入做聚合sum、average或max最后接线性分类器。这就是两个 notebook 中分类网络的总体结构该图出自课程作者展示的是一个五词序列通过 Embedding 层得到五个向量、再聚合后分类的完整流程是理解下文所有代码的最小可视化。三、替换数据集从 AG News 到你的自有语料3.1 课程内置数据是怎么加载的PyTorch 版本通过仓库中的辅助脚本 torchnlp.py 加载数据并构建词表import torch import torchtext from torchnlp import * train_dataset, test_dataset, classes, vocab load_dataset() vocab_size len(vocab) print(Vocab size , vocab_size) # 课程示例输出 95812load_dataset()内部调用torchtext.datasets.AG_NEWS(root./data)把训练与测试集转成列表后用collections.Counter统计词频构建torchtext.vocab.vocab。四个类别固定为[World, Sports, Business, Sci/Tech]。TensorFlow 版本则通过 TensorFlow Datasets 加载import tensorflow as tf from tensorflow import keras import tensorflow_datasets as tfds ds_train, ds_test tfds.load(ag_news_subset).values()3.2 换用自有数据的关键改动点作业要求替换为你自己的数据集。以作业提到的歌词数据为例你需要在 notebook 开头数据来源声明在 Markdown 单元格中写明数据集名称、作者/发布者、许可证与获取途径例如 Kaggle 上的 Beatles Lyrics 数据集作者 jenlooper满足正确署名要求替换加载逻辑PyTorch 版本把load_dataset()返回的(train_dataset, test_dataset, classes, vocab)替换为自定义加载函数返回结构保持三元组即可——即(样本列表, 类别列表, 词表对象)这样后续所有训练代码无需大改TensorFlow 版本则把ds_train, ds_test替换为你自己的文本标签数据集重新定义类别歌词示例中标签不再是四个新闻类别例如可以按歌手或专辑划分注意类别数变化会改变最后Dense/Linear的输出维度控制词表规模PyTorch 的load_dataset()支持ngrams与min_freq参数对较短的歌词语料可以适当调低min_freq或在 TF 版本中像课程示例那样用max_tokens限制词表大小。3.3 构建文本编码函数torchnlp.py 中的encode函数把一段文本转为词编号序列是数据流的关键一环改写数据时它基本可以复用def encode(x, vocNone, unk0, tokenizertokenizer): # 支持 vocab.vocab 对象有 get_stoi与 GloVe 对象有 stoi 属性两种词表 v vocab if voc is None else voc stoi v.get_stoi() if hasattr(v, get_stoi) else v.stoi return [stoi.get(s, unk) for s in tokenizer(x)]从源码结构看encode兼容两类词表接口这正是后面第 6 节词表不匹配问题的伏笔无论用课程自建词表还是 GloVe 词表都可以用同一函数编码。四、PyTorch 路径改写 EmbeddingsPyTorch.ipynb 的五个关键环节PyTorch 版本中替换数据后需要依次检查以下五段代码4.1 定义嵌入分类网络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)网络由三层构成Embedding 层词表大小 × 嵌入维度、聚合层对序列方向取均值、线性分类器。改写自有数据时注意vocab_size与num_class都要换成你数据集的真实值。4.2 处理变长序列方案一padding词袋模型下一个 minibatch 内所有 BoW 张量长度都是vocab_size换成嵌入后每个样本的词数不同需要 padding。notebook 用collate_fn实现def padify(b): v [encode(x[1]) for x in b] # 逐条编码 l max(map(len, v)) # 该 minibatch 最长序列 return ( torch.LongTensor([t[0]-1 for t in b]), # 标签减 1 转 0 基 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)要点value0的填充 token 在词表中通常对应未知词/填充位Pad 方向在序列尾部modeconstant保证零填充。4.3 训练方案一配套notebook 复用前一课的train_epoch也在 torchnlp.py 中用 Adam 优化器与交叉熵损失。课程示例训练约 25,000 条不到一个 epoch时准确率已达约 76%net EmbedClassifier(vocab_size, 32, len(classes)).to(device) train_epoch(net, train_loader, lr1, epoch_size25000)notebook 中的提示明确指出这里为节省时间只训练 25k 条你完全可以写一个多 epoch 的训练循环并调节学习率应当能把准确率提升到约 90%。换用自有数据后这一条同样成立——小语料上多跑几个 epoch、配合早停是记录实验结论的必要动作。4.4 处理变长序列方案二offset EmbeddingBag更高效padding 方案把所有序列拉到同一长度不够高效。notebook 给出第二种表示用一个大的内容向量 offset 向量记录每句话的起点。改造后的网络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)EmbeddingBag与Embedding的差别在于它接收内容向量与 offset 向量两个输入并且内置聚合层mean/sum/max。配套的offsetify转换函数torchnlp.py 与 notebook 中均有实现先拼接所有序列再用cumsum累积得到每个序列的起点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) # offset 向量 return (torch.LongTensor([t[0]-1 for t in b]), torch.cat(x), o) train_loader torch.utils.data.DataLoader( train_dataset, batch_size16, collate_fnoffsetify, shuffleTrue)由于 dataloader 此时返回 3 个值标签、文本、offset训练循环需改用train_epoch_emb定义见 torchnlp.py它把三个张量都搬到设备后调用net(text, off)。课程示例用lr4训练 25k 条得到约 75.5% 的准确率与 padding 方案结果相当——这本身就是实验报告中值得记录的一个观察两种变长序列表示方案精度接近但 EmbeddingBag 免去了 padding 的冗余计算。4.5 改写时最容易踩的坑类别编号课程用t[0]-1把 1 基标签转成 0 基换数据时务必确认你的标签格式并保持一致。设备torchnlp.py 全局device torch.device(cuda if torch.cuda.is_available() else cpu)换用自有数据后同样要把net、标签与特征搬到device。嵌入维度方案一里embed_dim32是超参数方案二中若加载预训练词向量embed_dim必须等于词向量维度如 Word2Vec 的 300、GloVe 6B 的 50。五、TensorFlow 路径改写 EmbeddingsTF.ipynb 的架构与数据流TensorFlow 版本采用 Keras Sequential 模型四个层各有分工notebook 中model.summary()可逐层核对参数层作用输出形状参数量TextVectorization字符串 → token 编号张量忽略低频词(None, None)0Embedding每个 token 编号 → 100 维稠密向量(None, None, 100)3,000,000 30000 × 100Lambda对序列轴求平均聚合层(None, 100)0Dense线性分类器softmax4 类(None, 4)404vocab_size 30000 batch_size 128 vectorizer keras.layers.experimental.preprocessing.TextVectorization( max_tokensvocab_size, input_shape(1,)) model keras.models.Sequential([ vectorizer, keras.layers.Embedding(vocab_size, 100), keras.layers.Lambda(lambda x: tf.reduce_mean(x, axis1)), keras.layers.Dense(4, activationsoftmax) ])5.1 词表适配adaptKeras 版本的TextVectorization需要先在数据上调用adapt建立词表。课程为了加速只取 500 条文本做adaptvectorizer.adapt(ds_train.take(500).map(extract_text))notebook 特意加注基于子集构建词表会忽略语料中未出现的 token可能略微降低准确率但真实场景中子集往往已能给出足够好的词表估计。换自有数据时这条经验仍然成立——歌词等小语料建议在完整训练集上adapt因为 OOV 对短文本的影响更明显。5.2 变长序列与 paddingnotebook 演示了两个关键行为print(vectorizer(Hello, world!)) # tf.Tensor([1 45], shape(2,)) print(vectorizer(I am glad to meet you!)) # shape(6,)单条序列长度不同而把多条序列一起向量化时TextVectorization必须产出矩形张量用 PAD token此处为 0填充空缺。notebook 还给出优化建议为了减少 padding 浪费可以按序列长度token 数排序后分批保证每个 minibatch 内序列长度接近。训练输出示例在 500 条样本上 adapt 后为acc: 0.8155 / val_acc: 0.8642。5.3 数据转换函数TF 版本的tupelize把原始样本拼成文本与标签对改写自有数据时替换extract_text的字段名即可def extract_text(x): return x[title] x[description] def tupelize(x): return (extract_text(x), x[label])六、语义嵌入实验Word2Vec 与向量运算两种框架通用两个 notebook 都包含 Word2Vec 实验这部分与数据集类型无关换数据后可以直接复用但要注意首载耗时。6.1 CBoW 与 Skip-Gram 两种架构课程 README 与两个 notebook 对 Word2Vec 的描述一致Continuous Bag-of-WordsCBoW给定 n-gram $(W_{-2},W_{-1},W_0,W_1,W_2)$用上下文 $(W_{-2},W_{-1},W_1,W_2)$ 预测中间词 $W_0$Continuous Skip-Gram与 CBoW 相反用当前词预测周围窗口内的上下文词特点对比CBoW 更快Skip-Gram 更慢但对低频词表示更好。6.2 用 gensim 加载预训练词向量import gensim.downloader as api w2v api.load(word2vec-google-news-300) # 首次下载耗时较长加载后即可做三类经典操作近义词查询w2v.most_similar(neural)返回 neuronal、neurons、neural_circuits 等相似度从 0.78 递减——这直观验证了语义向量在欧氏空间中近义词靠近的性质取词向量w2v[play][:20]展示 300 维向量的前 20 个分量向量语义运算king − man woman ≈ queenw2v.most_similar(positive[king, woman], negative[man])[0] # (queen, 0.7118192911148071)notebook 进一步拆解了这个魔法背后的朴素逻辑先计算目标向量qvec w2v[king] - w2v[man] w2v[woman]再对全词表计算欧氏距离并取argmin得到最接近的词。TF 版本提示为了让结果稳定为 queen需要在 man/woman 前加上系数例如-1.7*w2v[man] 1.7*w2v[woman]——去掉系数可以看到结果变化这本身就是一个值得写进实验报告的观察。6.3 Word2Vec 的局限与替代模型两个 notebook 都讨论了 Word2Vec 的缺陷可作为作业结论部分的素材CBoW 与 Skip-Gram 都是预测式predictive嵌入只利用局部上下文不利用全局统计Word2Vec 不考虑词形学morphology词义不依赖词根等结构FastText在 Word2Vec 基础上为每个词及其字符 n-gram 都学习向量每步训练把各表示求平均从而编码子词信息代价是预训练计算量显著增加GloVe基于共现矩阵的思路用神经方法把词-上下文共现矩阵分解为更有表现力的非线性词向量。gensim 同时支持这些模型改写实验时可以把加载代码中的word2vec-google-news-300换成 FastText / GloVe 模型对比不同预训练词向量在你自己的语料上的表现。七、词表不匹配把预训练向量接入网络的三种方案预训练词向量Word2Vec / GloVe的词表几乎不可能与你的语料词表一致两个 notebook 都给出了解决方案这是作业中最有含金量的改写点。7.1 方案 A用你自己的词表 随机初始化缺失词PyTorchembed_size len(w2v.get_vector(hello)) # 300 net EmbedClassifier(vocab_size, embed_size, len(classes)) found, not_found 0, 0 for i, w in enumerate(vocab.get_itos()): try: net.embedding.weight[i].data torch.tensor(w2v.get_vector(w)) found 1 except: net.embedding.weight[i].data torch.normal(0.0, 1.0, (embed_size,)) not_found 1 print(fDone, found {found} words, {not_found} words missing)课程示例中 95,812 词里找到 41,080 词缺 54,732 词——词表覆盖率只有约 43%这正是换数据后必须记录的核心指标之一。缺失词用标准正态随机向量初始化。7.2 方案 B用预训练词表重新加载数据集PyTorch torchtext GloVetorchtext 内置嵌入支持可以直接实例化 GloVe 词表vocab torchtext.vocab.GloVe(name6B, dim50)GloVe 词表提供三种基本操作vocab.stoi词 → 编号、vocab.itos编号 → 词、vocab.vectors嵌入向量矩阵取词s的向量写作vocab.vectors[vocab.stoi[s]]。利用这些操作可以验证向量等式并加载权重qvec vocab.vectors[vocab.stoi[king]] - vocab.vectors[vocab.stoi[man]] 1.3*vocab.vectors[vocab.stoi[woman]] d torch.sum((vocab.vectors - qvec)**2, dim1) min_idx torch.argmin(d) vocab.itos[min_idx] # queen net EmbedClassifier(len(vocab), len(vocab.vectors[0]), len(classes)) net.embedding.weight.data vocab.vectors # 直接拷贝权重矩阵之后只需在offsetify中把encode(t[1])改为encode(t[1], vocvocab)torchnlp.py 的encode支持传入外部词表这正是前面提过的兼容设计。7.3 方案 CTensorFlow / Keras 中的两种做法TF 版本同样有两种做法做法一tokenizer 词表 预训练权重矩阵vocab vectorizer.get_vocabulary() W np.zeros((vocab_size, embed_size)) # 缺失词留 0也可随机 for i, w in enumerate(vocab): try: W[i] w2v.get_vector(w) found 1 except: not_found 1 emb keras.layers.Embedding(vocab_size, embed_size, weights[W], trainableFalse)课程示例 5,335 词中 4,551 词找到、784 词缺失。注意trainableFalse不重训 Embedding 层会略微降低准确率但显著加速训练——这个权衡同样值得写进实验结论。课程示例训练后val_acc: 0.8175略低于从头训练嵌入的 0.8642。做法二预训练词表 get_keras_embeddingsvocab list(w2v.vocab.keys()) vectorizer keras.layers.experimental.preprocessing.TextVectorization(input_shape(1,)) vectorizer.set_vocabulary(vocab) model keras.models.Sequential([ vectorizer, w2v.get_keras_embedding(train_embeddingsFalse), keras.layers.Lambda(lambda x: tf.reduce_mean(x, axis1)), keras.layers.Dense(4, activationsoftmax) ])gensim 的get_keras_embeddings(train_embeddingsFalse)会自动生成对应 Keras 嵌入层。5 个 epoch 后val_acc仅约 0.61notebook 给出的解释是数据集中部分词不在预训练词表中而被忽略。两个 notebook 的共同结论是——如果精度提升不明显最可靠的做法是在自己的语料上从头训练嵌入。八、上下文嵌入作业观察与展望部分的标准素材两个 notebook 的收尾都指向 Word2Vec 的固有缺陷——一词多义word sense disambiguation。例如I went to aplayat the theatre.名词戏剧John wants toplaywith his friends.动词玩耍预训练嵌入把 play 的两种含义编码进同一个向量会干扰下游模型。要解决这个问题需要基于**语言模型language model**构建上下文嵌入——它在大规模语料上训练知道词在不同上下文中的组合方式。本课不展开上下文嵌入但作业实验报告的展望部分可以明确指出这一方向并关联到课程后续的语言模型章节。九、实验报告自查清单如何突出你自己的观察综合作业要求与课程内容一份合格的作业报告至少应包含以下可验证内容数据集卡片来源、作者、许可证、样本数、类别数、平均序列长度词表统计vocab_size、adapt/min_freq的选择、OOV 比例对应两版 notebook 输出的found / not_found两种变长序列方案的对比PyTorchpadding Embedding与 offset EmbeddingBag的精度与训练耗时嵌入训练 vs 预训练嵌入的对比从头训练嵌入、Word2Vec 初始化、GloVe 词表三者的准确率差异并说明trainable/冻结对结果的影响语义性质验证在你的语料词表上做most_similar与向量运算如 king−manwoman记录与新闻语料结果的不同换数据类型的发现歌词、评论、问答等短文本与新闻在词表规模、OOV 率、最佳嵌入维度上的差异。课程示例明确提示继续训练应能达到约 90% 准确率PyTorch 笔记与子集词表会略微降低精度TF 笔记这些都可以作为你实验的对照基线而不是必须照抄的结论。十、总结本课作业的完成路径可以概括为三步换数据替换加载与编码逻辑标注来源→改代码核对分类头维度、词表规模与变长序列处理→记录结论对比向量化方案、预训练嵌入与从头训练的差异验证语义向量性质。本文给出的全部代码与参数均直接取自 EmbeddingsPyTorch.ipynb、EmbeddingsTF.ipynb 与 torchnlp.py 的实际实现你可以在这些 notebook 的副本上直接替换数据区进行实验无需修改仓库内任何文件。通过本次作业你将完整经历嵌入层 → EmbeddingBag → 预训练词向量 → 上下文嵌入的知识链路为后续语言模型章节打下可实操的基础。赞分享教程人工智能机器学习深度学习【免费下载链接】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 双版本 导读 本文教程人工智能机器学习深度学习上一篇城通网盘直连解析工具打破下载限速的技术指南下一篇SharpCompress快速开始5分钟掌握压缩与解压核心操作创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考