当前位置:   article > 正文

#Datawhale AI 夏令营#Task 1

#Datawhale AI 夏令营#Task 1

一、机器翻译的发展历程

机器翻译(Machine Translation,简称MT)是自然语言处理领域的一个重要分支,其目标是将一种语言的文本自动转换为另一种语言的文本。机器翻译的发展可以追溯到20世纪50年代,经历了从基于规则的方法、统计方法到深度学习方法的演变过程。

1、基于规则的机器翻译

简单来说就是由人来制定一系列的规则,再把这些规则交给计算机,计算机再通过人为制定的规则来进行翻译。这些规则涵盖了词法、句法、短语规则和转换生成语法规则等。

优点:直观准确

缺点:规则构建复杂、规则冲突、难以处理复杂句子

2、基于统计的机器翻译

分析已经翻译好的双语文本对后构建统计模型来进行翻译。其核心思想是利用概率论和统计学的方法,计算源语言句子和目标语言句子之间的翻译概率,从而选择概率最高的翻译结果。

优点:翻译质量较高、通用性强、自动化程度高

缺点:数据依赖性强、无法处理复杂语义

3、基于神经网络机器翻译

利用深度学习技术,特别是神经网络模型,来自动将一种自然语言(源语言)的文本转换为另一种自然语言(目标语言)的过程。

优点:高效、准确

缺点:数据依赖性强

二、数据划分

1、训练集(Training Set)

作用:训练集用于训练模型,使模型能够学习输入数据与输出结果之间的映射关系。模型会根据训练集中的样本调整其参数,以最小化预测误差。

目标:让模型在训练数据上尽可能地拟合好,学习到数据的内在规律。

2、开发集/验证集(Development/Validation Set)

作用:开发集用于在模型训练过程中调整超参数、选择模型架构以及防止过拟合。它作为独立于训练集的数据,用于评估模型在未见过的数据上的表现。

目标:通过在开发集上的性能评估,选择最佳的模型配置,避免模型在训练集上过度拟合,确保模型的泛化能力。

3、测试集(Test Set)

作用:测试集用于最终评估模型的性能,是在模型训练和调参完全完成后,用来衡量模型实际应用效果的一组数据。它是最接近真实世界数据的评估标准。

目标:提供一个公正、无偏见的性能估计,反映模型在未知数据上的泛化能力。

三、直播笔记

baseline指的是一个简单、易于实现的基准模型,用于与更复杂的机器学习模型进行比较。

  1. # 主函数
  2. if __name__ == '__main__':
  3. start_time = time.time() # 开始计时
  4. device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
  5. #terminology = load_terminology_dictionary('../dataset/en-zh.dic')
  6. terminology = load_terminology_dictionary('../dataset/en-zh.dic')
  7. # 加载数据
  8. dataset = TranslationDataset('../dataset/train.txt',terminology = terminology)
  9. # 选择数据集的前N个样本进行训练
  10. N = 1000 #int(len(dataset) * 1) # 或者你可以设置为数据集大小的一定比例,如 int(len(dataset) * 0.1)
  11. subset_indices = list(range(N))
  12. subset_dataset = Subset(dataset, subset_indices)
  13. train_loader = DataLoader(subset_dataset, batch_size=32, shuffle=True, collate_fn=collate_fn)
  14. # 定义模型参数
  15. INPUT_DIM = len(dataset.en_vocab)
  16. OUTPUT_DIM = len(dataset.zh_vocab)
  17. ENC_EMB_DIM = 256
  18. DEC_EMB_DIM = 256
  19. HID_DIM = 512
  20. N_LAYERS = 2
  21. ENC_DROPOUT = 0.5
  22. DEC_DROPOUT = 0.5
  23. # 初始化模型
  24. enc = Encoder(INPUT_DIM, ENC_EMB_DIM, HID_DIM, N_LAYERS, ENC_DROPOUT)
  25. dec = Decoder(OUTPUT_DIM, DEC_EMB_DIM, HID_DIM, N_LAYERS, DEC_DROPOUT)
  26. model = Seq2Seq(enc, dec, device).to(device)
  27. # 定义优化器和损失函数
  28. optimizer = optim.Adam(model.parameters())
  29. criterion = nn.CrossEntropyLoss(ignore_index=dataset.zh_word2idx['<pad>'])
  30. # 训练模型
  31. N_EPOCHS = 10
  32. CLIP = 1
  33. for epoch in range(N_EPOCHS):
  34. train_loss = train(model, train_loader, optimizer, criterion, CLIP)
  35. print(f'Epoch: {epoch+1:02} | Train Loss: {train_loss:.3f}')
  36. # 在训练循环结束后保存模型
  37. torch.save(model.state_dict(), './translation_model_GRU.pth')
  38. end_time = time.time() # 结束计时
  39. # 计算并打印运行时间
  40. elapsed_time_minute = (end_time - start_time)/60
  41. print(f"Total running time: {elapsed_time_minute:.2f} minutes")

 N为训练集的大小,适当调高训练集大小可以提高翻译准确度。

N = 1000  #int(len(dataset) * 1)  # 或者你可以设置为数据集大小的一定比例,如 int(len(dataset) * 0.1)

 N_EPOCHS为训练循环次数,适当调高循环次数也可以提高翻译准确度。

 N_EPOCHS = 10

NN_EPOCHS提高到一定数值后,Train Loss将在一定范围内浮动,这是过拟合的表现。

过拟合的模型训练集上的性能(如准确率、损失值等)通常会非常好,甚至接近完美,但在测试集或新数据上的性能却会大幅下降。这是因为模型已经“记住”了训练数据中的具体细节,而不是学会了如何泛化到新的数据上。

  1. Epoch: 88 | Train Loss: 2.674
  2. Epoch: 89 | Train Loss: 2.656
  3. Epoch: 90 | Train Loss: 2.684
  4. Epoch: 91 | Train Loss: 2.662
  5. Epoch: 92 | Train Loss: 2.683
  6. Epoch: 93 | Train Loss: 2.669
  7. Epoch: 94 | Train Loss: 2.616
  8. Epoch: 95 | Train Loss: 2.614
  9. Epoch: 96 | Train Loss: 2.625
  10. Epoch: 97 | Train Loss: 2.604
  11. Epoch: 98 | Train Loss: 2.600
  12. Epoch: 99 | Train Loss: 2.614
  13. Epoch: 100 | Train Loss: 2.605
  14. Total running time: 18.89 minutes

 事实证明在训练集大小为3000的情况下,循环100次仍未过拟合哈哈哈哈

最后结果好像也没提升多少0.0

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/码创造者/article/detail/903660
推荐阅读
相关标签
  

闽ICP备14008679号