>- **🍨 本文为[🔗365天深度学习训练营](https://mp.weixin.qq.com/s/AtyZUu_j2k_ScNH6e732ow) 中的学习记录博客**
>- **🍖 原作者:[K同学啊 | 接辅导、项目定制](https://mtyjkh.blog.csdn.net/)**
>- **🚀 文章来源:[K同学的学习圈子](https://www.yuque.com/mingtian-fkmxf/zxwb45)**
Word2Vec使用神经网络来学习词向量。这个神经网络通常是一个浅层的前馈神经网络,其中隐藏层的权重矩阵就是学到的词向量。
Word2Vec的主要思想是通过训练,使得具有相似语境的词在向量空间中彼此接近。这样,我们可以通过比较词向量之间的距离来衡量它们之间的语义相似性。例如,具有相似含义的词在词向量空间中距离较近,如 "king" 和 "queen"。
浅看一下数据集:
导入库 构造迭代器:
def custom_data_iter(texts, labels):
:这行代码定义了一个名为 custom_data_iter
的函数,它接受两个参数,即输入文本(texts)和标签(labels)。
for x, y in zip(texts, labels):
:这行代码通过使用 zip
函数,开始一个循环,依次迭代 texts
和 labels
中的元素对。x
将取自 texts
,而 y
将取自 labels
。
yield x, y
:yield
关键字用于将函数转变为生成器。在循环的每次迭代中,它生成一个包含当前来自 texts
和 labels
的值的元组 (x, y)
。这样可以逐一处理数据,而不必将整个数据集加载到内存中。
构建词典:
vector_size 是特征向量的维度 默认100
min_count 忽略少于min_count的词
文本向量化:
-
average_vec
函数:这个函数接收一个文本text
,然后遍历其中的每个单词,尝试从 Word2Vec 模型w2v
中获取对应的词向量,将这些词向量相加以计算平均向量。如果单词不在模型中,会跳过(通过捕获KeyError
异常)。 -
x_vec = np.concatenate([average_vec(z) for z in x])
:这一行代码使用列表解析,对输入的文本列表x
中的每个文本应用average_vec
函数,然后使用np.concatenate
将这些平均向量连接成一个大的特征矩阵x_vec
。 -
w2v.save('data/w2v_model.pkl')
:最后保存了 Word2Vec 模型为一个文件 'data/w2v_model.pkl'。
转换格式:
使用之前定义的自定义数据迭代器 coustom_data_iter
,将特征矩阵 x_vec
和标签 y
组成一个迭代器 train_iter
,用于训练模型。
创建了一个包含标签名称的列表 label_name
,通过将 train_data[1]
的唯一值转换为集合,然后再转换为列表,目的是为了创建一个标签的索引。
数据加载器:
使用 PyTorch 的 DataLoader 创建一个数据加载器 dataloader
,用于加载数据批次。参数包括:
train_iter
: 你之前定义的自定义数据迭代器。batch_size=8
: 每个批次包含的样本数为 8。shuffle=False
: 不进行数据洗牌,保持输入数据的顺序。collate_fn=collate_batch
: 使用之前定义的collate_batch
函数来对批次进行处理。
构建模型:
尝试了一个RNN 模型
模型初始化:
训练,损失函数:
-
model.train()
: 这个方法将模型切换到训练模式。在训练模式下,启用了一些特性,比如 dropout 和 batch normalization。在模型中的训练和评估时,使用model.train()
和model.eval()
可以确保正确的模式切换。 -
optimizer.zero_grad()
: 在每个训练步骤开始时,这个方法用于将模型参数的梯度清零。在 PyTorch 中,梯度在反向传播过程中会被累积,因此需要在每个步骤开始时清零以避免重复计算。 -
loss.backward()
: 这个方法执行反向传播,计算模型参数相对于损失的梯度。梯度计算后,可以通过优化器进行参数更新。 -
torch.nn.utils.clip_grad_norm_()
: 这个方法用于梯度裁剪,防止梯度爆炸的问题。通过限制梯度的范数,可以稳定训练过程。
训练模型:
测试数据:
总结:
-
数据加载和处理:使用 Pandas 加载和处理数据,使用自定义的数据迭代器,
-
词嵌入: 实现了 Word2Vec 词嵌入,
-
神经网络模型: 创建了一个简单的神经网络模型,用于文本分类任务
-
训练循环: 实现了训练循环,包括计算损失、反向传播、梯度裁剪以及优化器的更新。
-
学习率调度器: 使用了学习率调度器,有助于优化训练过程中的学习率。调整学习率对训练的收敛和性能有重要影响。
-
评估和测试: 实现了模型在验证集上的评估,并在训练完成后进行了测试。