Downloads · 30 days
56
1% of all-time downloads
bluenguyen/longformer-phobert-base-4096
longformer-phobert-base-4096 is a fill-mask model from bluenguyen. Use it when you need the model to fill a missing word. It is set up for transformers.
Experiment performed with Transformers version 4.25.1\ A Longformer roberta model for long context based on vinai/phobert-base and Longformer.\ Phobert model is converted to Longformer version using author's repo, the…
Downloads · 30 days
56
1% of all-time downloads
All-time downloads
6.1K
Public
Repo size
1.3 GB
Likes
2
Public
Click a slice to open those files.
.bin637 MB · 100%
From the Hugging Face model README
Experiment performed with Transformers version 4.25.1
A Longformer roberta model for long context based on vinai/phobert-base and Longformer.
Phobert model is converted to Longformer version using author's repo, then continued MLM pretraining for 5000 steps with batch size 64 on Binhvq News Corpus so the model can learn to work with the new sliding window attention.
This corpus does not contains very long documents in general so you should finetune this model using your long docment dataset on downstream task to get better results.
The final BPC is 1.926 (In my expriment, the original BPC of Phobert-base model with max input length of 256 is 2.067).
Fill mask example:
from transformers import RobertaForMaskedLM, AutoTokenizer
from transformers.models.longformer.modeling_longformer import LongformerSelfAttention
class RobertaLongSelfAttention(LongformerSelfAttention):
def forward(
self,
hidden_states,
attention_mask=None,
head_mask=None,
encoder_hidden_states=None,
encoder_attention_mask=None,
past_key_value = None,
output_attentions=False,
):
attention_mask = attention_mask.squeeze(dim=2).squeeze(dim=1)
is_index_masked = attention_mask < 0
is_index_global_attn = attention_mask > 0
is_global_attn = any(is_index_global_attn.flatten())
return super().forward(hidden_states,
is_index_masked=is_index_masked,
is_index_global_attn=is_index_global_attn,
is_global_attn=is_global_attn,
attention_mask=attention_mask,
output_attentions=output_attentions)
class RobertaLongForMaskedLM(RobertaForMaskedLM):
def __init__(self, config):
super().__init__(config)
for i, layer in enumerate(self.roberta.encoder.layer):
layer.attention.self = RobertaLongSelfAttention(config, layer_id=i)
tokenizer = AutoTokenizer.from_pretrained("bluenguyen/longformer-phobert-base-4096")
model = RobertaLongForMaskedLM.from_pretrained("bluenguyen/longformer-phobert-base-4096")
TXT = (
"Hoàng_Sa và Trường_Sa là <mask> Việt_Nam ."
+ "Đó là điều không_thể chối_cãi ." * 300
+ "Bằng_chứng lịch_sử , pháp_lý về chủ_quyền của Việt_Nam với 2 quần_đảo này đã và đang được nhiều quốc_gia và cộng_đồng quốc_tế <mask> ."
)
input_ids = tokenizer([TXT], padding=True, pad_to_multiple_of=256, return_tensors="pt")["input_ids"]
logits = model(input_ids).logits
masked_index = [i.item() for i in (input_ids[0] == tokenizer.mask_token_id).nonzero()]
for index in masked_index:
probs = logits[0, index].softmax(dim=0)
values, predictions = probs.topk(3)
print(tokenizer.batch_decode([[p] for p in predictions]))
> ['của', 'lãnh_thổ', 'chủ_quyền']
> ['công_nhận', 'thừa_nhận', 'ghi_nhận']
Because this mode based on vinai/phobert-base, users should use VnCoreNLP or Python Vietnamese Toolkit(pyvi) to segment input raw texts.
More detail about Longformer can be found in author's repo.
For personal questions related to this implementation, please contact via [email protected]