IKCEST22 - 法俄泰与中文互译 Baseline

前言

见着大家报名积极,提交的人数却不多,于是整理了下部分代码,作为比赛基线,以供大家快速上分。 本项目使用使用transformer_base,在中 <-> 法俄泰 6个语向上分别训练了50轮。 祝飞桨的大伙在比赛上取得佳绩!是兄弟就来卷我吖!

在这里插入图片描述

项目地址: PaddleSeq

更新:

如有bug或不易使用的地方,欢迎大家批评指正!

9/6:

1.修正–arch加载错误bug,感谢三岁大佬的指正!

2.应三岁笠雨聆月 两位大佬的建议,简化了恢复训练的使用,从原先指定-
resume、last-epoch、last-step变为直接加载权重目录下的yaml,即-c ckpt_dir/model.yaml,详见3.3恢复训练。

3.应笠雨聆月 大佬的建议,添加了简易版本,丝滑的一键运行:

在这里插入图片描述

一、赛事介绍

2022 IKCEST第四届“一带一路”国际大数据竞赛

本届大数据竞赛在中国工程院、教育部高等学校大学计算机课程教学指导委员会及丝绸之路大学联盟的指导下由联合国教科文组织国际工程科技知识中心(IKCEST)、中国工程科技知识中心(CKCEST)、百度公司及西安交通大学共同主办,旨在放眼“一带一路”倡议沿线国家,通过竞赛方式挖掘全球大数据人工智能尖端人才,实现政府—产业—高校合力推动大数据产业研究、应用、发展的目标,进一步夯实赛事的理论基础与实践基础,加快拔尖AI创新人才培养。

二、数据处理

2.1 环境安装

!unzip PaddleSeq.zip
# !git clone  https://github.com/MiuGod0126/PaddleSeq.git
%cd PaddleSeq
!pip install -r requirements.txt
!unzip ../nmt_data_tools.zip -d ./
# !git clone https://github.com/MiuGod0126/nmt_data_tools.git
!pip install -r nmt_data_tools/requirements.txt

2.2 数据处理

先对中泰分词(jieba/pythainlp),然后对所有语言应用subword-nmt分子词,并且从训练集中随机分出1000作为验证集,需要运行7分钟左右。

!bash examples/ikcest22/scripts/prepare-ikcest22.sh
# 数据在datasets下,raw是原始未处理的文本对;tmp完成了分词和bpe;最后训练数据写入到bpe文件夹
!ls datasets/
!head -n 1 datasets/raw/zh_th/train.zh
!head -n 1 datasets/tmp/zh_th/train.tok.zh
!head -n 1 datasets/tmp/zh_th/train.bpe.zh
bpe  raw  tmp
初临异界头像框
初临 异界头 像框
初@@ 临 异@@ 界@@ 头 像框
# 本项目的数据格式如下,语言对被分成prefix.lang两个文件,其中valid是随机分的1000句,code是bpe词表。
!ls datasets/bpe/zh_th/
code.th  test.th_zh.th	train.th  valid.th  vocab.th
code.zh  test.zh_th.zh	train.zh  valid.zh  vocab.zh

2.3 数据加载

# 加载中泰数据
from paddleseq.reader import prep_dataset, prep_loader
from yacs.config import CfgNode
cfg_path="examples/ikcest22/configs/zh_th.yaml"
conf = CfgNode.load_cfg(open(cfg_path, encoding="utf-8"))
dataset_train = prep_dataset(conf, mode="train")
dataset_valid = prep_dataset(conf, mode="dev")

配置文件

SAVE: output
data:
  has_target: True
  lang_embed: False
  lazy_load: False
  pad_factor: 8
  pad_vocab: False
  special_token: ['<s>', '<pad>', '</s>', '<unk>']
  src_bpe_path: datasets/bpe/zh_th/code.zh
  src_lang: zh
  test_pref: datasets/bpe/zh_th/test.zh_th
  tgt_bpe_path: datasets/bpe/zh_th/code.th
  tgt_lang: th
  train_pref: datasets/bpe/zh_th/train
  truecase_path: None
  use_binary: False
  use_moses_bpe: False
  valid_pref: datasets/bpe/zh_th/valid
  vocab_pref: datasets/bpe/zh_th/vocab
 ......
# 打印5条valid
for data in dataset_valid[:5]:
    print(data)
{'id': 0, 'src': '变 身 期间 , 对 所有 BOSS 伤害 增加 7%', 'tgt': 'ใน ช่วง กลายร่าง ดา เม จ ที่ ทำ ใส่ BOSS ทั้งหมด เพิ่มขึ้น 7 %'}
{'id': 1, 'src': '我 开始 烦 了 , 老鼠 们 ! 尝尝 来自 坎@@ 特 鲁 最高 科学 的 力量 !', 'tgt': 'ข้า เริ่ม รำ คาน แล้ว นะ พวก หนู ! มา ลอง พลัง แห่ง เทคโนโลยี สูงสุด ของ คัท@@ ลู@@ !'}
{'id': 2, 'src': '而 后面 是 带 肩@@ 线 的 设计 , 慵懒 中 又 带 几分 利落 , 做 了 个 超长 款 , 显得 人 线条 修长 。', 'tgt': 'การ ออกแบบ ด้านหลัง ที่ มี เส้น ไหล่ ภายใน ความ@@ ขี้เกียจ ติด ความ เรียบร้อย บ้าง ทำเป็น แบบ ยาว พิเศษ ทำให้ เส้น โครงร่าง ของ คน เรียว ยาว'}
{'id': 3, 'src': '对 敌方 所有 目标 造成 魔法 伤害 , 目标 低于 5 人时 每 减少 1 个 , 伤害 增加 10% , 同时 暴击 概率 降低 22% , 持续 2 回合 ; 如果 目标 是 战士 职业 , 驱散 其 所有 增益 状态 。', 'tgt': 'ทำ M . DMG ใส่ ศัตรู ทั้งหมด เมื่อ เป้าหมาย น้อยกว่า 5 คน ทุกครั้งที่ ลด 1 คน DMG เพิ่ม 10 % ขณะเดียวกัน อัตรา CRIT ลด 22 % ต่อเนื่อง 2 รอบ ; หาก เป้าหมาย เป็น นักรบ ขับไล่ บัฟ ทั้งหมด ของ เป้าหมาย'}
{'id': 4, 'src': '烹@@ 煮 和 准备 美@@ 食', 'tgt': 'ปรุง@@ อาหาร และ เตรียม อาหาร'}
# tokens转ids,组batch
train_loader = prep_loader(conf, dataset_train, mode="train" ,multi_process=False)
valid_loader = prep_loader(conf, dataset_valid, mode="dev",multi_process=False)
for batch_idx,batch_data in enumerate(valid_loader):
    samples_id, src_tokens, prev_tokens, tgt_tokens = batch_data
    print(f"samples_id:{samples_id.shape} , src_tokens:{src_tokens.shape}, prev_tokens:{prev_tokens.shape}, tgt_tokens:{tgt_tokens.shape}")
    if batch_idx>4:
        break
samples_id:[312] , src_tokens:[312, 6], prev_tokens:[312, 13], tgt_tokens:[312, 13, 1]
samples_id:[240] , src_tokens:[240, 8], prev_tokens:[240, 16], tgt_tokens:[240, 16, 1]
samples_id:[184] , src_tokens:[184, 13], prev_tokens:[184, 22], tgt_tokens:[184, 22, 1]
samples_id:[120] , src_tokens:[120, 20], prev_tokens:[120, 31], tgt_tokens:[120, 31, 1]
samples_id:[88] , src_tokens:[88, 36], prev_tokens:[88, 42], tgt_tokens:[88, 42, 1]
samples_id:[48] , src_tokens:[48, 63], prev_tokens:[48, 77], tgt_tokens:[48, 77, 1]

三、模型训练

3.1 模型组网

Transformer 是论文 Attention Is All You Need 中提出的用以完成机器翻译(Machine Translation)等序列到序列(Seq2Seq)学习任务的一种全新网络结构,其完全使用注意力(Attention)机制来实现序列到序列的建模。
在这里插入图片描述

本项目默认使用transformer_base结构,若要换成transformer_big,请在配置文件yaml中修改model_name:

model:
  model_name: transformer_big

除此之外,还可以在命令行中指定网络结构,如:

python paddleseq_cli/train.py -c examples/ikcest22/configs/zh_th.yaml --arch transformer_big

如果想要魔改网络结构和参数,请在源码中添加新的结构transformer.py,如:

def transformer_big(is_test=False, pretrained_path=None, **kwargs):
    for cfg in cfgs: assert cfg in kwargs, f'missing argument:{cfg}'
    model_args = dict(encoder_layers=6,
                      decoder_layers=6,
                      d_model=1024,
                      nheads=16,
                      dim_feedforward=4096,
                      **kwargs)
    model_args = base_architecture(model_args)
    model = _create_transformer('transformer_big', is_test, pretrained_path, model_args)
    return model

3.2 模型加载

from paddleseq.models import build_model
model = build_model(conf, is_test=False)
print(model)
运行耗时: 4秒585毫秒
TRAIN model transformer_base created!
Transformer(
  (encoder): Encoder(
    (layers): LayerList(
      (0): EncoderLayer(
        (self_attn): MultiHeadAttentionWithInit(
          (q_proj): Linear(in_features=512, out_features=512, dtype=float32)
          (k_proj): Linear(in_features=512, out_features=512, dtype=float32)
          (v_proj): Linear(in_features=512, out_features=512, dtype=float32)
          (out_proj): Linear(in_features=512, out_features=512, dtype=float32)
        )
        (norm1): LayerNorm(normalized_shape=[512], epsilon=1e-05)
        (norm2): LayerNorm(normalized_shape=[512], epsilon=1e-05)
        (dropout1): Dropout(p=0.3, axis=None, mode=upscale_in_train)
        (dropout2): Dropout(p=0.3, axis=None, mode=upscale_in_train)
        (mlp): Mlp(
          (dropout): Dropout(p=0.0, axis=None, mode=upscale_in_train)
          (linear1): Linear(in_features=512, out_features=2048, dtype=float32)
          (linear2): Linear(in_features=2048, out_features=512, dtype=float32)
# 除此之外,还可以加载权重目录中的model.yaml (ckpt_path需要修改成自己的权重目录)
# from paddleseq.models import build_model
# ckpt_path="output/ckpt_zhth/epoch_final/"
# model = build_model(ckpt_path, is_test=False)
# print(model)
TRAIN model transformer_base created!
Pretrained weight load from:output/ckpt_zhth/epoch_final/model.pdparams!

3.3 中泰训练

本节以中泰为例,简介下paddleseq的训练命令。

注:如果想快点提交,可以无脑run 3.4

# 查看配置文件
!ls examples/ikcest22/configs/
fr_zh.yaml  ru_zh.yaml	th_zh.yaml  zh_fr.yaml	zh_ru.yaml  zh_th.yaml
# 训练中泰3epoch
# !export PYTHONWARNINGS='ignore:semaphore_tracker:UserWarning'  # 可以忽略些warn信息
!python paddleseq_cli/train.py -c examples/ikcest22/configs/zh_th.yaml --update-freq 4  --max-epoch 3
2022-09-04 18:39:24,058 | transformer_base_rank0: ----- Total of train set:99000 ,train batch: 407 [single gpu]
2022-09-04 18:39:24,104 | transformer_base_rank0: ----- Total of valid set:1000 ,valid batch: 7 [single gpu]
2022-09-04 18:39:24,105 | transformer_base_rank0: Load data cost 1.7559177875518799 seconds.
2022-09-04 18:40:44,284 | transformer_base_rank0: Now training epoch 2. LR=0.00005
2022-09-04 18:41:01,809 | transformer_base_rank0: Train| epoch:[2/3], step:[100/395], speed:5.71 step/s, loss:11.520, nll_loss:11.148, ppl:2269.24, bsz:1001.9, gnorm:3.339, num_updates:123, lr:0.000063212
2022-09-04 18:41:15,831 | transformer_base_rank0: Train| epoch:[2/3], step:[200/391], speed:7.13 step/s, loss:11.307, nll_loss:10.899, ppl:1909.37, bsz:1011.2, gnorm:3.999, num_updates:147, lr:0.000075710
2022-09-04 18:41:30,304 | transformer_base_rank0: Train| epoch:[2/3], step:[300/404], speed:6.91 step/s, loss:11.169, nll_loss:10.731, ppl:1700.19, bsz:979.0, gnorm:4.359, num_updates:176, lr:0.000088207
2022-09-04 18:41:44,636 | transformer_base_rank0: Train| epoch:[2/3], step:[400/405], speed:6.98 step/s, loss:11.061, nll_loss:10.599, ppl:1551.27, bsz:977.0, gnorm:4.157, num_updates:201, lr:0.000100705
100%|█████████████████████████████████████████████| 7/7 [00:07<00:00,  1.07it/s]
2022-09-04 18:41:54,192 | transformer_base_rank0: Eval | Avg loss: 10.350 | nll_loss:9.716 | ppl: 900.017 | Eval | BLEU Score: 1.239
current checkpoints: ['model_best_0.0', 'epoch_final', 'model_best_1.239']
2022-09-04 18:42:01,859 | transformer_base_rank0: Epoch:[2] | Best Valid Bleu: [1.239] saved to output/ckpt_zhth/model_best_1.239!
2022-09-04 18:42:01,859 | transformer_base_rank0: Now training epoch 3. LR=0.00010
2022-09-04 18:42:18,927 | transformer_base_rank0: Train| epoch:[3/3], step:[100/402], speed:5.86 step/s, loss:10.527, nll_loss:9.950, ppl:989.44, bsz:983.4, gnorm:3.806, num_updates:226, lr:0.000114077
2022-09-04 18:42:33,549 | transformer_base_rank0: Train| epoch:[3/3], step:[200/431], speed:6.84 step/s, loss:10.486, nll_loss:9.902, ppl:957.00, bsz:917.0, gnorm:3.867, num_updates:265, lr:0.000126575
2022-09-04 18:42:48,090 | transformer_base_rank0: Train| epoch:[3/3], step:[300/416], speed:6.88 step/s, loss:10.350, nll_loss:9.747, ppl:859.50, bsz:951.3, gnorm:4.090, num_updates:283, lr:0.000139072
2022-09-04 18:43:03,210 | transformer_base_rank0: Train| epoch:[3/3], step:[400/403], speed:6.61 step/s, loss:10.284, nll_loss:9.671, ppl:815.06, bsz:980.2, gnorm:4.266, num_updates:301, lr:0.000151570
100%|█████████████████████████████████████████████| 7/7 [00:08<00:00,  1.09s/it]
2022-09-04 18:43:16,024 | transformer_base_rank0: Epoch:[3] | Best Valid Bleu: [2.758] saved to output/ckpt_zhth/model_best_2.758!
current checkpoints: ['model_best_0.0', 'epoch_final', 'model_best_1.239', 'model_best_2.758']

训练参数简介

python paddleseq_cli/train.py -c xx.yaml \
        --amp --ngpus 1 --update-freq 4 \
        --max-epoch 50 --save-epoch 10 --save-dir output \
        --pretrained ckpt --log-steps 100 --max-tokens 4096  \
        --seed 1 --eval-beam
        
-c: 配置文件路径;

--amp: 混合精度训练,可以加速训练。(使用amp后,日志中梯度范数gnorm会变得特别大,是正常现象,因为乘了scale);

--ngpus: 使用的gpu数量;

--update-freq:梯度累加,可以模拟更大的batch_size,从而取得更好的分数(设为4时,日志中num_updates=step/4,bsz=bsz*4);

--max-epoch: 训练轮数;

--save-epoch: 保存权重间隔的轮数;

--save-dir: 模型权重、日志、可视化日志、预测输出保存路径;

--pretrained: 加载预先训练的权重,是个目录,一般在output/ckpt下,目录下包含model.pdparams, model.pdopt和model.yaml;

--log-steps: 打印日志的频率;

--max-tokens: 每个batch最大的tokens数(source或target最大的tokens数);

--seed: 随机种子;

--eval-beam: 默认False,指定后会在训练的评估时,启用beam search来生成预测结果并计算bleu分数,比默认的teacher forcing的argmax输出要更准确。

关于恢复训练

有时难免遇到被迫关闭训练,需要重启的情形,可以使用恢复训练,即加载以前训练的模型权重和优化器状态,直接从权重目录的model.yaml加载即可:

ckpt_dir=output/ckpt_zhth/epoch_final
python paddleseq_cli/train.py -c $ckpt_dir/model.yaml 

其他参数详见config.py,其实大多数参数和yaml中的重复,而命令行的参数会覆盖yaml中的参数。

3.4 训练6向⭐

一键跑通六向训练,快速上分!

# 查看训练脚本,可自行修改相应参数
!cat examples/ikcest22/scripts/train_all.sh
epochs=50
freq=4 # update frequence

directions=("zh_th" "th_zh" "zh_fr" "fr_zh" "zh_ru" "ru_zh")
export PYTHONWARNINGS='ignore:semaphore_tracker:UserWarning'
for direct in ${directions[@]}
  do
      echo "------------------------------------------------------------training ${direct}....------------------------------------------------------------"
      python paddleseq_cli/train.py -c examples/ikcest22/configs/${direct}.yaml --update-freq $freq --max-epoch $epochs
  done


echo "all done"
# ≈10h
!bash examples/ikcest22/scripts/train_all.sh
.----------------training zh_th.....----------------
INFO 2022-09-04 18:24:46,576 cloud_utils.py:122] get cluster from args:job_server:None pods:['rank:0 id:None addr:127.0.0.1 port:None visible_gpu:[] trainers:["gpu:[\'0\'] endpoint:127.0.0.1:58733 rank:0"]'] job_stage_flag:None hdfs:None
........................
2022-09-04 18:24:52,306 | transformer_base_rank0: Now training epoch 1. LR=0.00000
2022-09-04 18:25:11,480 | transformer_base_rank0: Train| epoch:[1/50], step:[100/419], speed:5.22 step/s, loss:14.192, nll_loss:14.134, ppl:17973.68, bsz:944.0, gnorm:9.323, num_updates:25, lr:0.000012348
.----------------training th_zh.....----------------
...............................

四、模型评估

4.1 评估中泰

# 权重目录包含配置参数、优化器参数、模型参数
# !ls output/ckpt_zhth/epoch_final/
model.args  model.pdopt  model.pdparams
# 评估验证集
!python paddleseq_cli/generate.py -c examples/ikcest22/configs/zh_th.yaml --pretrained output/ckpt_zhth/epoch_final --test-pref datasets/bpe/zh_th/valid
2022-09-04 18:29:08 | INFO | paddleseq_cli.generate | Paddle BlEU Score:47.3688
Sacrebleu: BLEU = 47.81 70.5/55.5/49.6/47.4 (BP = 0.868 ratio = 0.876 hyp_len = 11084 ref_len = 12647)
write to file output/result.txt success.
# 平均n个权重(需要n个model_best_xx)
!python scripts/average_checkpoints.py --inputs output/ckpt_zhth/ --output output/ckpt_zhth/avg2 --num-ckpts  2
!python paddleseq_cli/generate.py -c examples/ikcest22/configs/zh_th.yaml --pretrained output/ckpt_zhth/avg2  --test-pref datasets/bpe/zh_th/valid

4.2 评估6向

# 查看评估脚本,可以修改对应的权重, 如把output/ckpt_zhth/epoch_final换成output/ckpt_zhth/model_best_xxx
!cat examples/ikcest22/scripts/evaluate_all.sh
directions=("zh_th" "th_zh" "zh_fr" "fr_zh" "zh_ru" "ru_zh")
data_paths=("zh_th" "zh_th" "zh_fr" "zh_fr" "zh_ru" "zh_ru")
ckpts=("output/ckpt_zhth/epoch_final"
        "output/ckpt_thzh/epoch_final"
        "output/ckpt_zhfr/epoch_final"
        "output/ckpt_frzh/epoch_final"
        "output/ckpt_zhru/epoch_final"
        "output/ckpt_ruzh/epoch_final")

for ((i=0;i<${#directions[@]};i++))
  do  
      direct=${directions[$i]}
      ckpt=${ckpts[$i]}
      echo "------------------------------------------------------------evaluate ${direct}....------------------------------------------------------------"
      python paddleseq_cli/generate.py -c examples/ikcest22/configs/${direct}.yaml --pretrained $ckpt --test-pref datasets/bpe/${data_paths[$i]}/valid
  done

echo "all done"
# 3min
!bash examples/ikcest22/scripts/evaluate_all.sh
.----------------evaluate zh_th.....----------------
2022-09-04 18:33:02 | INFO | paddleseq_cli.generate | Paddle BlEU Score:47.3688
Sacrebleu: BLEU = 47.81 70.5/55.5/49.6/47.4 (BP = 0.868 ratio = 0.876 hyp_len = 11084 ref_len = 12647)
write to file output/result.txt success.
.-----------------evaluate th_zh.....----------------
2022-09-04 18:33:25 | INFO | paddleseq_cli.generate | Paddle BlEU Score:49.0684
Sacrebleu: BLEU = 49.46 63.7/49.7/45.1/43.4 (BP = 0.991 ratio = 0.991 hyp_len = 10534 ref_len = 10626)
.----------------evaluate zh_fr....----------------
2022-09-04 18:33:55 | INFO | paddleseq_cli.generate | Paddle BlEU Score:14.9049
Sacrebleu: BLEU = 17.84 47.2/22.6/13.5/8.8 (BP = 0.946 ratio = 0.947 hyp_len = 21648 ref_len = 22854)
write to file output/result.txt success.
.----------------evaluate fr_zh.....----------------
2022-09-04 18:34:26 | INFO | paddleseq_cli.generate | Paddle BlEU Score:16.1178
Sacrebleu: BLEU = 16.33 48.4/20.4/10.9/6.6 (BP = 1.000 ratio = 1.006 hyp_len = 19290 ref_len = 19175)
write to file output/result.txt success.
.----------------evaluate zh_ru.....----------------
2022-09-04 18:35:08 | INFO | paddleseq_cli.generate | Paddle BlEU Score:10.7678
Sacrebleu: BLEU = 14.89 39.9/17.8/10.6/6.8 (BP = 0.992 ratio = 0.992 hyp_len = 24192 ref_len = 24381)
write to file output/result.txt success.
.----------------evaluate ru_zh....----------------
2022-09-04 18:35:49 | INFO | paddleseq_cli.generate | Paddle BlEU Score:16.8321
Sacrebleu: BLEU = 16.99 48.1/21.0/11.6/7.1 (BP = 1.000 ratio = 1.000 hyp_len = 23760 ref_len = 23753)
write to file output/result.txt success.
all done

五、预测提交

5.1 中泰预测

!python paddleseq_cli/generate.py -c examples/ikcest22/configs/zh_th.yaml --pretrained output/ckpt_zhth/epoch_final --only-src
!cat output/generate.txt | grep -P "^H" | sort -V | cut -f 3- > zh_th.rst
!head zh_th.rst
ผ้า กระเป๋า ดำ บน ผนัง ใน ทะเลทราย ฝัง กระดูก คลาสสิก และ เสน่ห์ อัน หรูหรา ปล่อย ให้ เห็น ถึง อารมณ์ ดีงาม ที่ เรียบง่าย
เก็บ เอว ยก สะโพก หรูหรา
เพชร มินิ ที่ ละเอียด
203 LV . 7 ดาว
กองทหาร ฝันร้าย · ยอดเยี่ยม
ทำให้ โล่ ความ ยาว
229 LV . 4 ดาว
อาวุธ ม่วง ดร อป เค วส ขั้น 7 - แหวน
ชื่อ : บริษัท เซี่ยงไฮ้ หัว เช่อผิ่น เปียว เท สติ้ง เทคโนโลยี จำกัด
เฮ ก ซะ วา เลน ต์

5.2 预测6向⭐

默认使用最后一个权重epoch_final, 可以修改成model_best, 结果直接打包到trans_result.zip ,可以提交了。

# 可以使用验证集上评估最好的权重替代epoch_final
!cat examples/ikcest22/scripts/generate_all.sh
directions=("zh_th" "th_zh" "zh_fr" "fr_zh" "zh_ru" "ru_zh")
ckpts=("output/ckpt_zhth/epoch_final"
        "output/ckpt_thzh/epoch_final"
        "output/ckpt_zhfr/epoch_final"
        "output/ckpt_frzh/epoch_final"
        "output/ckpt_zhru/epoch_final"
        "output/ckpt_ruzh/epoch_final")

for ((i=0;i<${#directions[@]};i++))
  do  
      direct=${directions[$i]}
      ckpt=${ckpts[$i]}
      echo "------------------------------------------------------------generate ${direct}....------------------------------------------------------------"
      python paddleseq_cli/generate.py -c examples/ikcest22/configs/${direct}.yaml --pretrained $ckpt --only-src
      cat output/generate.txt | grep -P "^H" | sort -V | cut -f 3- > ${direct}.rst
  done

zip -r trans_result.zip *.rst

echo "all done"
# 3min
!bash examples/ikcest22/scripts/generate_all.sh
.----------------generate zh_th....----------------
write to file output/result.txt success.
.----------------generate th_zh.....----------------
write to file output/result.txt success.
.----------------generate zh_fr.....----------------
write to file output/result.txt success.
.----------------generate fr_zh.....----------------
write to file output/result.txt success.
.----------------generate zh_ru.....----------------
write to file output/result.txt success.
.----------------generate ru_zh.....----------------
2022-09-04 18:49:35 | INFO | paddleseq_cli.generate | configs:
write to file output/result.txt success.
  adding: fr_zh.rst (deflated 59%)
  adding: ru_zh.rst (deflated 61%)
  adding: th_zh.rst (deflated 56%)
  adding: zh_fr.rst (deflated 64%)
  adding: zh_ru.rst (deflated 74%)
  adding: zh_th.rst (deflated 98%)
all done

5.3 提交结果

提交格式

1.翻译结果文件命名

各翻译方向结果文件需按指定方式命名。

法文-中文方向:fr_zh.rst

俄文-中文方向:ru_zh.rst

泰文-中文方向:th_zh.rst

中文-法文方向:zh_fr.rst

中文-俄文方向:zh_ru.rst

中文-泰文方向:zh_th.rst

2.翻译结果文件格式

翻译结果文件按行存储目标端句子。

3.打包提交

将所有翻译结果文件压缩为单个zip文件,参考如下操作:

zip trans_result.zip *.rst
!ls ./trans_result*
./trans_result.zip

个zip文件,参考如下操作:

zip trans_result.zip *.rst
!ls ./trans_result*
./trans_result.zip

generate_all.sh脚本自动打包了所有结果,直接将trans_result.zip提交就行了。

提交地址

本项目baseline:

在这里插入图片描述

官方baseline:

在这里插入图片描述

六、总结

本项目完成了数据处理、加载,模型训练、评估、预测以及一键生成提交文件,方便大家快速上榜。 对于进一步的优化,可以从以下几点入手:
1. 数据: ①对于英俄文本未进行任何处理,可以尝试用moses进行tokenize和truecase ②采用回译,自训练等方法合成更多数据 ③或者用语言模型挖掘与IKCEST数据分布更接近的数据,与原数据混合训练; ④加数据!加卡!
2. 模型: 尝试其他的结构,如transformerbig,或自己魔改参数;
3. 训练: 多语言训练、或自己预训练;
4. 损失:使用simcut、rdrop等增强方法;
5. 预测:① 如简单修改beam大小; ②或者使用噪声通道重排,利用一个反向翻译模型和一个语言模型来对前向模型预测的多个结果进行重排。
如果项目中有任何问题,欢迎加入比赛群讨论,共同进步!

在这里插入图片描述

最后,哈哈,各位冠军选手给俺点给star吧!
PaddleSeq

代码参考:

1.PaddleNLP

2.fairseq

3.ConvS2S_Paddle

4.STACL_Paddle

此文章为搬运
原项目链接

Logo

学大模型,用大模型上飞桨星河社区!每天8点V100G算力免费领!免费领取ERNIE 4.0 100w Token >>>

更多推荐