unilm [LayoutReader] 训练损失很低,但推理表现很差,

yiytaume  于 2个月前  发布在  其他
关注(0)|答案(5)|浏览(38)

描述

我正在使用的模型(UniLM,MiniLM,LayoutLM等):LayoutReader
你好@zlwang-cs
我正在使用layoutreader来预测仅包含布局数据的类似这样的数据,顺序是从右到左,从上到下。

然而,我遇到了一些问题,希望你能分享一些见解。

  • 当我尝试训练模型时,在line 671处出现了一个错误,表示两个求和Tensor的维度不对齐,当我移除self.bias时,我可以正常训练。

unilm/layoutreader/s2s_ft/modeling.py
第669行至第673行的代码:
| | defforward(self, hidden_states, src_emb): |
| | hidden_states=self.transform(hidden_states) |
| | hidden_states=torch.einsum('btf,bsf->bts', hidden_states, src_emb) +self.bias |
| | # hidden_states = F.linear(hidden_states, weight=src_emb, bias=self.bias) |
| | returnhidden_states |

  • 训练过程正常,初始损失约为30,可以降至0.01。然而,当我用测试集(shuffle rate=1.0)进行测试时,结果可能非常差。很多框都丢失了,ARD大约为20.1。当我用规则(简单地按x坐标排序)预先对测试集中的输入进行排序,并将它们输入到网络中。但是网络只是预测与输入完全相同的阅读顺序。而且,当我用训练集进行测试时,结果也非常差
vof42yt1

vof42yt11#

你好,感谢你对我们论文的兴趣。我很乐意帮助你解决这些问题。

对于第一个问题,由于没有更多的详细信息,我不确定问题出在哪里。我建议你使用停止点或其他调试工具来查看在这个步骤中Tensor的形状。

对于第二个问题,我认为问题可能来自于你的数据集的读取顺序。你可以看到你使用的数据显示与我们论文中的原始设置有很大不同。预训练的权重是基于从左到右和从上到下的阅读顺序,因此这样的预训练设置可能会成为你在实验中遇到的障碍。考虑到这一点,我认为性能不佳并不令人惊讶。如果你想继续解决这个阅读顺序设置的问题,你可能需要收集足够的数据来再次预训练模型,或者尝试其他方法。另一个可能的方法是将图像顺时针旋转90度,使其与常见的阅读顺序设置相似。

xxb16uws

xxb16uws2#

你好,zlwang-cs

感谢及时的回复。我会尝试调试这个问题,看看能否找到问题所在。顺时针旋转90度似乎是一个合理的方法,我也会尝试这个方法。

还有一件事情让我感到困惑。你提到LayoutReader在训练过程中加载了预训练权重。这个预训练权重是基于word-level还是textline-level的?看起来我在这里需要textline-level的预训练权重。

n53p2ov0

n53p2ov03#

你好,@Mountchicken。预训练模型是基于词级别的。很遗憾,我无法帮助你进行文本级别的预训练。

xam8gpfp

xam8gpfp4#

你好,zlwang-cs

感谢你的回复。顺便问一下,如何在自己的数据集上加载预训练权重并进行微调?我从这个链接下载了layoutreader-base-readingbank.zip,解压后得到了config.jsonpytorch_model.bin

下面应该填写哪个参数

python -m torch.distributed.launch --nproc_per_node=4 run_seq2seq.py \
    --model_type layoutlm \
    --model_name_or_path layoutlm-base-uncased \
    --train_folder /path/to/ReadingBank/train \
    --output_dir /path/to/output/LayoutReader/layoutlm \
    --do_lower_case \
    --fp16 \
    --fp16_opt_level O2 \
    --max_source_seq_length 513 \
    --max_target_seq_length 511 \
    --per_gpu_train_batch_size 2 \
    --gradient_accumulation_steps 1 \
    --learning_rate 7e-5 \
    --num_warmup_steps 500 \
    --num_training_steps 75000 \
    --cache_dir /path/to/output/LayoutReader/cache \
    --label_smoothing 0.1 \
    --save_steps 5000 \
    --cached_train_features_file /path/to/ReadingBank/features_train.pt
ou6hu8tu

ou6hu8tu5#

你好,@Mountchicken。我假设在实践中,载重是很常见的。请参考一些相关的文档,我相信你能找到正确的答案。我看到你正在使用run_seq2seq.py进行训练,但你下载的重量实际上是用于解码的。我想这就是你感到困惑的原因。

相关问题