#Datawhale AI 夏令营
参考链接:Docs
本次主要讲一下在运行baseline时需要注意的一些小问题。
一、提前准备:
本次baseline与Task1使用相同数据集,所以与Task1时一样,需要上传数据集压缩文件并解压。具体方法参考Docs 。
需要注意的是,由于baseline中的load_data函数等函数在读取或生成文件时需要提前创建该文件路径,否则会报没有找到相关文件的错误。所以在执行baseline前,需要先在终端执行以下命令,在/MT/下生成保存模型用的model文件夹和保存测试集结果用的results文件夹。
mkdir ../model
mkdir ../results
二、配置环境:
本次baseline需要额外安装如下四个库:
-
torchtext :是一个用于自然语言处理(NLP)任务的库,它提供了丰富的功能,包括数据预处理、词汇构建、序列化和批处理等,特别适合于文本分类、情感分析、机器翻译等任务。
-
jieba
:是一个中文分词库,用于将中文文本切分成有意义的词语。 -
sacrebleu:用于评估机器翻译质量的工具,主要通过计算BLEU(Bilingual Evaluation Understudy)得分来衡量生成文本与参考译文之间的相似度。
-
spacy:是一个强大的自然语言处理库,支持70+语言的分词与训练。
前三个库安装如下:
!pip install torchtext
!pip install jieba
!pip install sacrebleu
我们需要注意的是spacy库的安装:
在线安装:不同环境的安装请参考:Install spaCy · spaCy Usage Documentation,如果使用魔搭平台,可按照下图中的配置进行安装:
离线安装:在线安装非常的慢,经常会安装失败,因此我们可以离线安装。
首先使用 pip show
s
pac
y
命令在终端查看spacy的版本,这里可以看到版本为3.7.5。
然后我们从该路径下:Releases · explosion/spacy-models · GitHub 安装对应版本的 en_core_web_trf 语言包,可以看到我的 en_core_web_trf 3.7.3 版本的要求 spaCy >=3.7.2,<3.8.0,刚好满足 3.7.5的 spacy。将下载到本地的压缩包上传到你的魔搭平台上的 dataset 目录下。
然后使用 !pip install ../dataset/en_core_web_trf
安装英文语言包:
!pip install -U pip setuptools wheel -i https://pypi.tuna.tsinghua.edu.cn/simple
!pip install -U 'spacy[cuda12x]' -i https://pypi.tuna.tsinghua.edu.cn/simple
!pip install ../dataset/en_core_web_trf-3.7.3-py3-none-any.whl
三、模型训练时的参数影响
在训练模型时,调参也是重中之重。选择参数不当,会使模型造成欠拟合或者过拟合现象,从而影响模型性能。以下是代码中的一些可供调整的部分参数,如果运行baseline性能不是很好,可以尝试调整以下参数:
# 定义常量
MAX_LENGTH = 100 # 最大句子长度
BATCH_SIZE = 32
DEVICE = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')
N = 10000 # 采样训练集的数量
train_path = '../dataset/train.txt'
dev_en_path = '../dataset/dev_en.txt'
dev_zh_path = '../dataset/dev_zh.txt'
test_en_path = '../dataset/test_en.txt'
train_loader, dev_loader, test_loader, en_vocab, zh_vocab = load_data(
train_path, dev_en_path, dev_zh_path, test_en_path
)
print(f"英语词汇表大小: {len(en_vocab)}")
print(f"中文词汇表大小: {len(zh_vocab)}")
print(f"训练集大小: {len(train_loader.dataset)}")
print(f"开发集大小: {len(dev_loader.dataset)}")
print(f"测试集大小: {len(test_loader.dataset)}")
# 主函数
if __name__ == '__main__':
N_EPOCHS = 5
CLIP=1
# 模型参数
INPUT_DIM = len(en_vocab)
OUTPUT_DIM = len(zh_vocab)
EMB_DIM = 128
HID_DIM = 256
N_LAYERS = 2
DROPOUT = 0.5
# 初始化模型
model = initialize_model(INPUT_DIM, OUTPUT_DIM, EMB_DIM, HID_DIM, N_LAYERS, DROPOUT, DEVICE)
print(f'The model has {sum(p.numel() for p in model.parameters() if p.requires_grad):,} trainable parameters')
# 定义损失函数
criterion = nn.CrossEntropyLoss(ignore_index=zh_vocab['<pad>'])
# 初始化优化器
optimizer = initialize_optimizer(model)
# 训练模型
train_model(model, train_loader, dev_loader, optimizer, criterion, N_EPOCHS, CLIP)
通过调整参数,可以提高模型翻译的性能,最大程度地发挥模型性能。