CoolFace
Modelpublic

pkshatech/RoSEtta-base-ja

sourceHugging Faceapache-2.0updated 2y agoView on Hugging Face
8likes127downloads
Model Card

RoSEtta

RoSEtta (RoFormer-based Sentence Encoder through Distillation) is a general Japanese text embedding model, excelling in retrieval tasks. It has a maximum sequence length of 1024, allowing for input of long sentences. It can run on a CPU and is designed to measure semantic similarity between sentences, as well as to function as a retrieval system for searching passages based on queries.

Key features:

  • Use RoPE (Rotary Position Embedding)
  • Maximum sequence length of 1024 tokens
  • Distilled from large sentence embedding models
  • Specialized for retrieval tasks

During inference, the prefix "query: " or "passage: " is required. Please check the Usage section for details.

Model Description

This model is based on RoFormer architecture. After pre-training using MLM loss, weakly supervised learning was performed. Additionally, further training was conducted through distillation using several large embedding models and multi-stage contrastive learning (like GLuCoSE v2).

  • Maximum Sequence Length: 1024 tokens
  • Output Dimensionality: 768 tokens
  • Similarity Function: Cosine Similarity

Usage

Direct Usage (Sentence Transformers)

You can perform inference using SentenceTransformer with the following code:

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

# Download from the 🤗 Hub
# The argument "trust_remote_code=True" is required to load the model
model = SentenceTransformer("pkshatech/RoSEtta-base-ja",trust_remote_code=True)

# Each input text should start with "query: " or "passage: ".
# For tasks other than retrieval, you can simply use the "query: " prefix.
sentences = [
    'query: PKSHAはどんな会社ですか?',
    'passage: 研究開発したアルゴリズムを、多くの企業のソフトウエア・オペレーションに導入しています。',
    'query: 日本で一番高い山は?',
    'passage: 富士山(ふじさん)は、標高3776.12 m、日本最高峰(剣ヶ峰)の独立峰で、その優美な風貌は日本国外でも日本の象徴として広く知られている。',
]
embeddings = model.encode(sentences,convert_to_tensor=True)
print(embeddings.shape)
# [4, 768]

# Get the similarity scores for the embeddings
similarities = F.cosine_similarity(embeddings.unsqueeze(0), embeddings.unsqueeze(1), dim=2)
print(similarities)
# [[1.0000, 0.5910, 0.4332, 0.5421],
# [0.5910, 1.0000, 0.4977, 0.6969],
# [0.4332, 0.4977, 1.0000, 0.7475],
# [0.5421, 0.6969, 0.7475, 1.0000]]

Direct Usage (Transformers)

You can perform inference using Transformers with the following code:

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

def mean_pooling(last_hidden_states: Tensor,attention_mask: Tensor) -> Tensor:
    emb = last_hidden_states * attention_mask.unsqueeze(-1)
    emb = emb.sum(dim=1) / attention_mask.sum(dim=1).unsqueeze(-1)
    return emb

# Download from the 🤗 Hub
tokenizer = AutoTokenizer.from_pretrained("pkshatech/RoSEtta-base-ja")
# The argument "trust_remote_code=True" is required to load the model
model = AutoModel.from_pretrained("pkshatech/RoSEtta-base-ja",trust_remote_code=True)

# Each input text should start with "query: " or "passage: ".
# For tasks other than retrieval, you can simply use the "query: " prefix.
sentences = [
    'query: PKSHAはどんな会社ですか?',
    'passage: 研究開発したアルゴリズムを、多くの企業のソフトウエア・オペレーションに導入しています。',
    'query: 日本で一番高い山は?',
    'passage: 富士山(ふじさん)は、標高3776.12 m、日本最高峰(剣ヶ峰)の独立峰で、その優美な風貌は日本国外でも日本の象徴として広く知られている。',
]

# Tokenize the input texts
batch_dict = tokenizer(sentences, max_length=1024, padding=True, truncation=True, return_tensors='pt')

outputs = model(**batch_dict)
embeddings = mean_pooling(outputs.last_hidden_state, batch_dict['attention_mask'])
print(embeddings.shape)
# [4, 768]

# Get the similarity scores for the embeddings
similarities = F.cosine_similarity(embeddings.unsqueeze(0), embeddings.unsqueeze(1), dim=2)
print(similarities)
# [[1.0000, 0.5910, 0.4332, 0.5421],
# [0.5910, 1.0000, 0.4977, 0.6969],
# [0.4332, 0.4977, 1.0000, 0.7475],
# [0.5421, 0.6969, 0.7475, 1.0000]]

Training Details

The fine-tuning of RoSEtta is carried out through the following steps:

Step 1: Pre-training

Step 2: Weakly supervised learning

  • Training data: MQA and mc4.

Step 3: Ensemble distillation

Step 4: Contrastive learning

  • Triplets were created from JSNLI, MNLI, PAWS-X, JSeM and Mr.TyDi and used for training.
  • This training aimed to improve the overall performance as a sentence embedding model.

Step 5: Search-specific contrastive learning

Benchmarks

Retrieval

Evaluated with MIRACL-ja, JQARA , JaCWIR and MLDR-ja.

ModelSizeMIRACL<br>Recall@5JQaRA<br>nDCG@10JaCWIR<br>MAP@10MLDR<br>nDCG@10
intfloat/multilingual-e5-large0.6B89.255.487.629.8
cl-nagoya/ruri-large0.3B78.762.485.037.5
intfloat/multilingual-e5-base0.3B84.247.285.325.4
cl-nagoya/ruri-base0.1B74.358.184.635.3
pkshatech/GLuCoSE-base-ja0.1B53.330.868.625.2
RoSEtta0.2B79.357.783.832.3

Note: Results for OpenAI small embeddings in JQARA and JaCWIR are quoted from the JQARA and JaCWIR.

JMTEB

Evaluated with JMTEB.

The average score is macro-average.

ModelSizeAvg.RetrievalSTSClassificationRerankingClusteringPairClassification
OpenAI/text-embedding-3-small-69.1866.3979.4673.0692.9251.0662.27
OpenAI/text-embedding-3-large-74.0574.4882.5277.5893.5853.3262.35
intfloat/multilingual-e5-large0.6B70.9070.9879.7072.8992.9651.2462.15
cl-nagoya/ruri-large0.3B73.3173.0283.1377.4392.9951.8262.29
intfloat/multilingual-e5-base0.3B68.6168.2179.8469.3092.8548.2662.26
cl-nagoya/ruri-base0.1B71.9169.8282.8775.5892.9154.1662.38
pkshatech/GLuCoSE-base-ja0.1B67.2959.0278.7176.8291.9049.7866.39
RoSEtta0.2B72.4573.2181.3972.4192.6953.2361.74

Authors

Chihiro Yano, Mocho Go, Hideyuki Tachibana, Hiroto Takegawa, Yotaro Watanabe

License

This model is published under the Apache License, Version 2.0.