CoolFace
Modelpublic

philipphager/baidu-ultr_uva-bert_twotower

sourceHugging Facemitupdated 2y agoView on Hugging Face
0likes9downloads
Model Card

Two Tower MonoBERT trained on Baidu-ULTR

A flax-based MonoBERT cross encoder trained on the Baidu-ULTR dataset with an additivie two tower architecture as suggested by Yan et al. Similar to a position-based click model (PBM), a two tower model jointly learns item relevance (with a BERT model) and position bias (in our case using a single embedding per rank). For more info, read our paper and find the code for this model here.

Test Results on Baidu-ULTR

Ranking performance is measured in DCG, nDCG, and MRR on expert annotations (6,985 queries). Click prediction performance is measured in log-likelihood on one test partition of user clicks (≈297k queries).

ModelLog-likelihoodDCG@1DCG@3DCG@5DCG@10nDCG@10MRR@10
Pointwise Naive0.2271.6413.4624.7527.2510.3570.609
Pointwise Two-Tower0.2181.6293.4714.8227.4560.3670.607
Pointwise IPS0.2221.2952.8113.9776.2960.3070.534
Listwise Naive-1.9474.1085.6148.4780.4050.639
Listwise IPS-1.6713.5304.8737.4500.3610.603
Listwise DLA-1.7963.7305.1257.8020.3770.615

Usage

Here is an example of downloading the model and calling it for inference on a mock batch of input data. For more details on how to use the model on the Baidu-ULTR dataset, take a look at our training and evaluation scripts in our code repository.

Python
import jax.numpy as jnp

from src.model import PBMCrossEncoder

model = PBMCrossEncoder.from_pretrained(
    "philipphager/baidu-ultr_uva-bert_twotower",
)

# Mock batch following Baidu-ULTR with 4 documents, each with 8 tokens
batch = {
    # Query_id for each document
    "query_id": jnp.array([1, 1, 1, 1]),
    # Document position in SERP
    "positions": jnp.array([1, 2, 3, 4]),
    # Token ids for: [CLS] Query [SEP] Document
    "tokens": jnp.array([
        [2, 21448, 21874, 21436, 1, 20206, 4012, 2860],
        [2, 21448, 21874, 21436, 1, 16794, 4522, 2082],
        [2, 21448, 21874, 21436, 1, 20206, 10082, 9773],
        [2, 21448, 21874, 21436, 1, 2618, 8520, 2860],
  ]),
    # Specify if a token id belongs to the query (0) or document (1)
    "token_types": jnp.array([
        [0, 0, 0, 0, 1, 1, 1, 1],
        [0, 0, 0, 0, 1, 1, 1, 1],
        [0, 0, 0, 0, 1, 1, 1, 1],
        [0, 0, 0, 0, 1, 1, 1, 1],
    ]),
    # Marks if a token should be attended to (True) or ignored, e.g., padding tokens (False):
    "attention_mask": jnp.array([
        [True, True, True, True, True, True, True, True],
        [True, True, True, True, True, True, True, True],
        [True, True, True, True, True, True, True, True],
        [True, True, True, True, True, True, True, True],
    ]),
}

outputs = model(batch, train=False)
print(outputs)

Reference

@inproceedings{Hager2024BaiduULTR,
  author = {Philipp Hager and Romain Deffayet and Jean-Michel Renders and Onno Zoeter and Maarten de Rijke},
  title = {Unbiased Learning to Rank Meets Reality: Lessons from Baidu’s Large-Scale Search Dataset},
  booktitle = {Proceedings of the 47th International ACM SIGIR Conference on Research and Development in Information Retrieval (SIGIR`24)},
  organization = {ACM},
  year = {2024},
}