#Datawhale AI 夏令营#Task 1

一、机器翻译的发展历程

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

1、基于规则的机器翻译

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

优点:直观准确

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

2、基于统计的机器翻译

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

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

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

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

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

优点:高效、准确

缺点:数据依赖性强

二、数据划分

1、训练集(Training Set)

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

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

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

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

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

3、测试集(Test Set)

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

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

三、直播笔记

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

NN_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

 

  • 24
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值