File size: 4,665 Bytes
b459b79
 
6a2e33c
 
 
 
 
 
b459b79
 
6a2e33c
 
 
 
3f0da49
6a2e33c
 
 
 
c4943a7
 
6a2e33c
 
 
 
 
 
 
 
 
 
3f0da49
6a2e33c
 
 
 
 
 
 
 
 
 
 
 
 
c4943a7
6a2e33c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c4943a7
 
6a2e33c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c4943a7
6a2e33c
 
 
 
c4943a7
6a2e33c
 
c4943a7
6a2e33c
 
 
 
c4943a7
6a2e33c
 
 
 
 
 
 
 
 
c4943a7
 
 
 
6a2e33c
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
---
license: apache-2.0
pipeline_tag: sentence-similarity
tags:
  - sentence-transformers
  - feature-extraction
  - sentence-similarity
  - transformers
language:
- vi
---

# thehosy/roberta-base-qa-vietnamese

This is a encoder model: It can encodes sentences or paragraphs (maximum 768 tokens) to dense vectors with 768 dimensions. It used for QA semantic search.

Datasets: 
  - MS Macro (translated into Vietnamese)
  - SQuAD v2  (translated into Vietnamese)
  - UIT ViQuad2.0
  - ZaloQA 2021

Roberta-base architecture is used as backbone (Training from scratch).

<!--- Describe your model here -->

## Usage (Sentence-Transformers)

Using this model becomes easy when you have [sentence-transformers](https://www.SBERT.net) installed:

```
pip install -q sentence-transformers
```

Then you can use the model like this:

```python
from sentence_transformers import SentenceTransformer
from torch.nn import functional as F


sentences = ["Mỗi hiệp bóng đá kéo dài bao lâu",
  "Một trận đấu bóng đá thông thường có hai hiệp , mỗi hiệp 45 phút với khoảng thời gian 15 phút nghỉ giữa hai hiệp .",
  "Cũng trong thập niên 1850 , các đội bóng nghiệp dư bắt đầu được thành lập và thường mỗi đội xây dựng cho riêng họ những luật chơi mới của môn bóng đá , trong đó đáng chú ý có câu lạc bộ Sheffield F.C .. Việc mỗi đội bóng có luật chơi khác nhau khiến việc điều hành mỗi trận đấu giữa họ diễn ra rất khó khăn ."]

model = SentenceTransformer('thehosy/vi-roberta-base-qa-embedding')
model.eval()

embeddings = model.encode(sentences, convert_to_tensor=True)
vecs = F.normalize(embeddings)
sim_scores = F.cosine_similarity(vecs[:1], vecs[1:])
print(sim_scores)

# tensor([0.9971, 0.3511])
```

## Usage (HuggingFace Transformers)

You can alse use the model with transformers by applying the pooling (mean pooling) on-top of the contextualized word embeddings.

```python
from transformers import AutoTokenizer, AutoModel
import torch
from torch.nn import functional as F


#Mean Pooling - Take attention mask into account for correct averaging
def mean_pooling(model_output, attention_mask):
    token_embeddings = model_output.last_hidden_state
    input_mask_expanded = attention_mask.unsqueeze(-1).expand(token_embeddings.size()).float()
    return torch.sum(token_embeddings * input_mask_expanded, 1) / torch.clamp(input_mask_expanded.sum(1), min=1e-9)


sentences = ["Mỗi hiệp bóng đá kéo dài bao lâu",
  "Một trận đấu bóng đá thông thường có hai hiệp , mỗi hiệp 45 phút với khoảng thời gian 15 phút nghỉ giữa hai hiệp .",
  "Cũng trong thập niên 1850 , các đội bóng nghiệp dư bắt đầu được thành lập và thường mỗi đội xây dựng cho riêng họ những luật chơi mới của môn bóng đá , trong đó đáng chú ý có câu lạc bộ Sheffield F.C .. Việc mỗi đội bóng có luật chơi khác nhau khiến việc điều hành mỗi trận đấu giữa họ diễn ra rất khó khăn ."]

# Load model from HuggingFace Hub
tokenizer = AutoTokenizer.from_pretrained('thehosy/vi-roberta-base-qa-embedding')
model = AutoModel.from_pretrained('thehosy/vi-roberta-base-qa-embedding')
model.eval()

# Tokenize sentences
encoded_input = tokenizer(sentences, padding=True, truncation=True, return_tensors='pt')
# Compute token embeddings
with torch.no_grad():
    model_output = model(**encoded_input)

embeddings = mean_pooling(model_output, encoded_input['attention_mask'])
vecs = F.normalize(embeddings)
sim_scores = F.cosine_similarity(vecs[:1], vecs[1:])
print(sim_scores)

# tensor([0.9971, 0.3511])
```

## Training

### Pretraining
The model was trained with the parameters:

**DataLoader**:

MSMACRO: `torch.utils.data.dataloader.DataLoader` of length 2621440 with parameters:

```json
{'batch_size': 32, 'sampler': None, 'batch_sampler': None, 'shuffle': true}
```

**Loss**:

`Triplet loss`

**Training Parameters**
 - epochs: 6
 - optimizer: AdamW
 - learning_rate: 2e-05
 - scheduler: Warmup Linear Scheduler
 - warmup_steps: 10000
 - weight_decay": 0.001

### Finetuning




## Full Model Architecture

```
SentenceTransformer(
  (0): Transformer({'max_seq_length': 768, 'do_lower_case': False}) with Transformer model: RobertaModel
  (1): Pooling({'word_embedding_dimension': 768, 'pooling_mode_cls_token': False, 'pooling_mode_mean_tokens': True, 'pooling_mode_max_tokens': False, 'pooling_mode_mean_sqrt_len_tokens': False, 'pooling_mode_weightedmean_tokens': False, 'pooling_mode_lasttoken': False})
)
```