File size: 5,975 Bytes
a9fd75b
 
 
7d6748a
a9fd75b
 
 
7d6748a
 
 
a9fd75b
7d6748a
5b619b1
0ce9706
5b619b1
 
 
9122358
5b619b1
 
e0e9b1d
7d6748a
 
 
 
 
 
f056e20
7d6748a
 
ce67b8a
 
7d6748a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5102f69
7d6748a
 
a839720
 
7d6748a
 
a839720
 
 
 
 
 
 
 
 
 
 
7d6748a
 
a839720
 
 
 
 
 
 
 
7d6748a
 
 
 
 
 
 
 
 
 
 
 
 
 
5102f69
 
7d6748a
 
d2e9205
 
 
 
7d6748a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
82dc9ae
 
938bb7b
 
 
82dc9ae
938bb7b
 
 
 
5102f69
ce67b8a
938bb7b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
136
137
138
139
140
141
142
143
144
145
---
license: apache-2.0
language:
  - vi
library_name: transformers
pipeline_tag: text-classification
tags:
  - transformers
  - cross-encoder
  - rerank
datasets:
  - unicamp-dl/mmarco
widget:
  - text: tỉnh nào  diện tích lớn nhất việt nam
    output:
      - label: >-
          nghệ an có diện tích lớn nhất việt nam
        score: 0.9999
      - label: >-
          bắc ninh có diện tích nhỏ nhất việt nam
        score: 0.1705
---

# Reranker

* [Usage](#usage)
    * [Using FlagEmbedding](#using-flagembedding)
    * [Using Huggingface transformers](#using-huggingface-transformers)
* [Fine tune](#fine-tune)
    * [Data format](#data-format)
* [Performance](#performance)
* [Citation](#citation)

Different from embedding model, reranker uses question and document as input and directly output similarity instead of
embedding.
You can get a relevance score by inputting query and passage to the reranker.
And the score can be mapped to a float value in [0,1] by sigmoid function.

## Usage

### Using FlagEmbedding

```
pip install -U FlagEmbedding
```

Get relevance scores (higher scores indicate more relevance):

```python
from FlagEmbedding import FlagReranker

reranker = FlagReranker('namdp-ptit/ViRanker',
                        use_fp16=True)  # Setting use_fp16 to True speeds up computation with a slight performance degradation

score = reranker.compute_score(['tỉnh nào có diện tích lớn nhất việt nam', 'nghệ an có diện tích lớn nhất việt nam'])
print(score)  # 11.140625

# You can map the scores into 0-1 by set "normalize=True", which will apply sigmoid function to the score
score = reranker.compute_score(['tỉnh nào có diện tích lớn nhất việt nam', 'nghệ an có diện tích lớn nhất việt nam'],
                               normalize=True)
print(score)  # 0.9999854895214452

scores = reranker.compute_score(
    [
        ['tỉnh nào có diện tích lớn nhất việt nam', 'nghệ an có diện tích lớn nhất việt nam'],
        ['tỉnh nào có diện tích lớn nhất việt nam', 'bắc ninh có diện tích nhỏ nhất việt nam']
    ]
)
print(scores)  # [11.140625, -1.58203125]

# You can map the scores into 0-1 by set "normalize=True", which will apply sigmoid function to the score
scores = reranker.compute_score(
    [
        ['tỉnh nào có diện tích lớn nhất việt nam', 'nghệ an có diện tích lớn nhất việt nam'],
        ['tỉnh nào có diện tích lớn nhất việt nam', 'bắc ninh có diện tích nhỏ nhất việt nam']
    ],
    normalize=True
)
print(scores)  # [0.99998548952144523, 0.17050799982688053]
```

### Using Huggingface transformers

```
pip install -U transformers
```

Get relevance scores (higher scores indicate more relevance):

```python
import torch
from transformers import AutoModelForSequenceClassification, AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained('namdp-ptit/ViRanker')
model = AutoModelForSequenceClassification.from_pretrained('namdp-ptit/ViRanker')
model.eval()

pairs = [
    ['tỉnh nào có diện tích lớn nhất việt nam', 'nghệ an có diện tích lớn nhất việt nam'],
    ['tỉnh nào có diện tích lớn nhất việt nam', 'bắc ninh có diện tích nhỏ nhất việt nam']
],
with torch.no_grad():
    inputs = tokenizer(pairs, padding=True, truncation=True, return_tensors='pt', max_length=512)
    scores = model(**inputs, return_dict=True).logits.view(-1, ).float()
    print(scores)
```

## Fine-tune

### Data Format

Train data should be a json file, where each line is a dict like this:

```
{"query": str, "pos": List[str], "neg": List[str]}
```

`query` is the query, and `pos` is a list of positive texts, `neg` is a list of negative texts. If you have no negative
texts for a query, you can random sample some from the entire corpus as the negatives.

## Performance

Below is a comparision table of the results we achieved compared to some other pre-trained Cross-Encoders on
the [MS MMarco Passage Reranking - Vi - Dev](https://huggingface.co/datasets/unicamp-dl/mmarco) dataset.

| Model-Name                                                                                                                              | NDCG@3     | MRR@3      | NDCG@5     | MRR@5      | NDCG@10    | MRR@10     | Docs / Sec |
|-----------------------------------------------------------------------------------------------------------------------------------------|:-----------|:-----------|:-----------|:-----------|:-----------|:-----------|:-----------|
| [namdp-ptit/ViRanker](https://huggingface.co/namdp-ptit/ViRanker)                                                                       | **0.6685** | **0.6564** | 0.6842     | **0.6811** | 0.7278     | **0.6985** | 2.02       
| [itdainb/PhoRanker](https://huggingface.co/itdainb/PhoRanker)                                                                           | 0.6625     | 0.6458     | **0.7147** | 0.6731     | **0.7422** | 0.6830     | **15**     
| [kien-vu-uet/finetuned-phobert-passage-rerank-best-eval](https://huggingface.co/kien-vu-uet/finetuned-phobert-passage-rerank-best-eval) | 0.0963     | 0.0883     | 0.1396     | 0.1131     | 0.1681     | 0.1246     | **15**     
| [BAAI/bge-reranker-v2-m3](https://huggingface.co/BAAI/bge-reranker-v2-m3)                                                               | 0.6087     | 0.5841     | 0.6513     | 0.6062     | 0.6872     | 0.62091    | 3.51       
| [BAAI/bge-reranker-v2-gemma](https://huggingface.co/BAAI/bge-reranker-v2-gemma)                                                         | 0.6088     | 0.5908     | 0.6446     | 0.6108     | 0.6785     | 0.6249     | 1.29       

## Citation

Please cite as

```Plaintext
@misc{ViRanker,
  title={ViRanker: A Cross-encoder Model for Vietnamese Text Ranking},
  author={Nam Dang Phuong},
  year={2024},
  publisher={Huggingface},
}
```