用于预训练BERT的数据集

http://zh-v2.d2l.ai/chapter_natural-language-processing-pretraining/bert-dataset.html

all_segments.append(torch.tensor(segments + [0] * (max_len - len(segments)), dtype=torch.long))

segments list原本对应句子1和句子2的值分别为0和1。这里把位置对应的segment值也设置为0,不会confuse BERT模型吗?

1 Like

所以它设置了权重列表,tokens填充的地方权重为0,在计算损失时会忽略这些地方,tokens填充的地方和segments填充0的地方是相同的。

1 Like

报了个错:RuntimeError: unable to open shared memory object </torch_85159_194567204> in read-write mode在这一句for (tokens_X, segments_X, valid_lens_x, pred_positions_X, mlm_weights_X, mlm_Y, nsp_y) in train_iter:有没有知道咋解决的

解决了,将num_workers去掉就行了

thank for your answer


掩码任务直接把下句预测任务的数据送入_get_mlm_data_from_tokens(…)进行预处理,但是下句预测任务的数据中有的上句和下句是语义无关的,这样的两句在_get_mlm_data_from_tokens中去掉cls和sep标记后直接作为一句用于MASK任务,不会对模型理解证据语义造成误导吗?难道说是为了故意引入这种噪声来增强模型在处理非语义连贯上下文中的预测能力吗

1 Like

_get_mlm_data_from_tokens中没有去掉cls和sep吧, 这里加mask的过程没有替换掉标记词; 单说上下文不连贯对于预测mask的影响, 我觉得不能算是噪声, 毕竟模型也是要处理nsp任务的, 它应当有能力知道这个mask的预测不该受无关的上下句的影响

14.9.2. 将文本转换为预训练数据集

现在我们几乎准备好为BERT预训练定制一个Dataset类。在此之前,我们仍然需要定义辅助函数_pad_bert_inputs来将特殊的mask词元附加到输入。它的参数examples包含来自两个预训练任务的辅助函数_get_nsp_data_from_paragraph_get_mlm_data_from_tokens的输出。

这段话有误,应该是“将特殊的pad词元附加到输入”

wikitext-2-v1数据集的地址d2l.DATA_HUB[‘wikitext-2’] = (
https://s3.amazonaws.com/research.metamind.io/wikitext/
‘wikitext-2-v1.zip’, ‘3c914d17d80b1459be871a5039ac23e752a53cbe’)失效了

请问怎么解决呢??我也觉得是数据集地址失效了,一直报错

去找别的人开源的关于这个数据集吧,悲伤 :sob:

回樓上,我今天學到這裡也發現這問題,我後來去 hugging face 上下載:
wikitext at main (huggingface.co)
我是下載 wikitext-2-v1
讀檔的函數也要手動調整一下, train-00000-of-00001.parquet 這個 parquet 檔可以用 pd.read_parquet() 讀,回傳內容轉 list 之後就是所有文本內容了。

原版数据集,我刚好备份了

3 Likes

_replace_mlm_tokens这个函数中"#10%的时间:用随机词元替换该词"的实现里:
random.choice(vocab.idx_to_token)
这个做法似乎也会引入<cls>, <sep>, <mask>和<pad>这四个特殊词元,我不晓得这是不是个bug,感觉不合理。

1 Like

exactly. 事实上也可能是label. 这几节有些数据处理并非严谨,或者看作noise?。

一直以来,感觉d2l课程缺少插图说明,相比之下李宏毅的就多很多了。
这一节从细节入手,自底向上,很不直观(好像讲解算法但不清楚数据结构一样模糊)。于是我反过来阅读,从文末开始阅读代码才比较顺利。

亲测有效,将该文件放在相对路径"…/data/"目录下,运行代码即可加载~