赞
踩
机器翻译(Machine Translation,简称MT)是自然语言处理领域的一个重要分支,其目标是将一种语言的文本自动转换为另一种语言的文本。机器翻译的发展可以追溯到20世纪50年代,经历了从基于规则的方法、统计方法到深度学习方法的演变过程。
简单来说就是由人来制定一系列的规则,再把这些规则交给计算机,计算机再通过人为制定的规则来进行翻译。这些规则涵盖了词法、句法、短语规则和转换生成语法规则等。
优点:直观准确
缺点:规则构建复杂、规则冲突、难以处理复杂句子
分析已经翻译好的双语文本对后构建统计模型来进行翻译。其核心思想是利用概率论和统计学的方法,计算源语言句子和目标语言句子之间的翻译概率,从而选择概率最高的翻译结果。
优点:翻译质量较高、通用性强、自动化程度高
缺点:数据依赖性强、无法处理复杂语义
利用深度学习技术,特别是神经网络模型,来自动将一种自然语言(源语言)的文本转换为另一种自然语言(目标语言)的过程。
优点:高效、准确
缺点:数据依赖性强
作用:训练集用于训练模型,使模型能够学习输入数据与输出结果之间的映射关系。模型会根据训练集中的样本调整其参数,以最小化预测误差。
目标:让模型在训练数据上尽可能地拟合好,学习到数据的内在规律。
作用:开发集用于在模型训练过程中调整超参数、选择模型架构以及防止过拟合。它作为独立于训练集的数据,用于评估模型在未见过的数据上的表现。
目标:通过在开发集上的性能评估,选择最佳的模型配置,避免模型在训练集上过度拟合,确保模型的泛化能力。
作用:测试集用于最终评估模型的性能,是在模型训练和调参完全完成后,用来衡量模型实际应用效果的一组数据。它是最接近真实世界数据的评估标准。
目标:提供一个公正、无偏见的性能估计,反映模型在未知数据上的泛化能力。
baseline指的是一个简单、易于实现的基准模型,用于与更复杂的机器学习模型进行比较。
- # 主函数
- if __name__ == '__main__':
- start_time = time.time() # 开始计时
-
- device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
-
- #terminology = load_terminology_dictionary('../dataset/en-zh.dic')
- terminology = load_terminology_dictionary('../dataset/en-zh.dic')
-
- # 加载数据
- dataset = TranslationDataset('../dataset/train.txt',terminology = terminology)
- # 选择数据集的前N个样本进行训练
- N = 1000 #int(len(dataset) * 1) # 或者你可以设置为数据集大小的一定比例,如 int(len(dataset) * 0.1)
- subset_indices = list(range(N))
- subset_dataset = Subset(dataset, subset_indices)
- train_loader = DataLoader(subset_dataset, batch_size=32, shuffle=True, collate_fn=collate_fn)
-
- # 定义模型参数
- INPUT_DIM = len(dataset.en_vocab)
- OUTPUT_DIM = len(dataset.zh_vocab)
- ENC_EMB_DIM = 256
- DEC_EMB_DIM = 256
- HID_DIM = 512
- N_LAYERS = 2
- ENC_DROPOUT = 0.5
- DEC_DROPOUT = 0.5
-
- # 初始化模型
- enc = Encoder(INPUT_DIM, ENC_EMB_DIM, HID_DIM, N_LAYERS, ENC_DROPOUT)
- dec = Decoder(OUTPUT_DIM, DEC_EMB_DIM, HID_DIM, N_LAYERS, DEC_DROPOUT)
- model = Seq2Seq(enc, dec, device).to(device)
-
- # 定义优化器和损失函数
- optimizer = optim.Adam(model.parameters())
- criterion = nn.CrossEntropyLoss(ignore_index=dataset.zh_word2idx['<pad>'])
-
- # 训练模型
- N_EPOCHS = 10
- CLIP = 1
-
- for epoch in range(N_EPOCHS):
- train_loss = train(model, train_loader, optimizer, criterion, CLIP)
- print(f'Epoch: {epoch+1:02} | Train Loss: {train_loss:.3f}')
-
- # 在训练循环结束后保存模型
- torch.save(model.state_dict(), './translation_model_GRU.pth')
-
- end_time = time.time() # 结束计时
-
- # 计算并打印运行时间
- elapsed_time_minute = (end_time - start_time)/60
- 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
当N和N_EPOCHS提高到一定数值后,Train Loss将在一定范围内浮动,这是过拟合的表现。
过拟合的模型在训练集上的性能(如准确率、损失值等)通常会非常好,甚至接近完美,但在测试集或新数据上的性能却会大幅下降。这是因为模型已经“记住”了训练数据中的具体细节,而不是学会了如何泛化到新的数据上。
- Epoch: 88 | Train Loss: 2.674
- Epoch: 89 | Train Loss: 2.656
- Epoch: 90 | Train Loss: 2.684
- Epoch: 91 | Train Loss: 2.662
- Epoch: 92 | Train Loss: 2.683
- Epoch: 93 | Train Loss: 2.669
- Epoch: 94 | Train Loss: 2.616
- Epoch: 95 | Train Loss: 2.614
- Epoch: 96 | Train Loss: 2.625
- Epoch: 97 | Train Loss: 2.604
- Epoch: 98 | Train Loss: 2.600
- Epoch: 99 | Train Loss: 2.614
- Epoch: 100 | Train Loss: 2.605
- Total running time: 18.89 minutes
事实证明在训练集大小为3000的情况下,循环100次仍未过拟合哈哈哈哈
最后结果好像也没提升多少0.0
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。