/ Модель

Характеристики

Контекст
512 токенов
Лицензия
MIT
Опубликована
6 окт 2023

KoSimCSE-supervised-roberta-base

ЭмбеддингиТекст → embedding8 профессий

Корейская RoBERTa-модель SimCSE создаёт эмбеддинги предложений для семантического поиска и сравнения сходства текстов.

100скачиваний за 30 дней0лайковвеса обновлены6 окт 2023

Бенчмарки

Как модель справилась с задачами пользователей ailist и что о ней публикуют открытые лидерборды

Публичные оценки

Из открытых лидербордов. Сравнивайте результаты одного теста при одинаковых условиях — отсутствие оценки не значит, что модель хуже.

В подключённых источниках результатов для этой модели пока нет.

Что умеет модель

Описание составлено по карточке модели и метаданным Hugging Face

daekeun-ml выпустил KoSimCSE-supervised-roberta-base — корейскую модель эмбеддингов предложений на архитектуре RoBERTa-base, обученную методом SimCSE с контрастивным обучением на размеченных данных NLI. Она преобразует корейский текст в векторные представления для поиска семантически близких предложений и сравнения их смыслового сходства.

Модель предназначена для семантического поиска, ранжирования похожих текстов и оценки сходства предложений. В README приведены результаты на корейских наборах KLUE-STS и Kor-STS; авторы сообщают, что supervised-версия превосходит unsupervised-вариант base на этих тестах. Репозиторий содержит веса в формате safetensors, лицензия — MIT.

Результаты и описание ориентированы на корейский язык. В README отмечено, что качество зависит от обучающих данных NLI и что увеличение максимальной длины последовательности само по себе не гарантирует улучшения; указанная при обучении максимальная длина — 32 токена.

Сценарии применения

  • поиск корейских предложений по смыслу
  • сравнение семантического сходства двух корейских фраз
  • ранжирование документов по сходству с запросом
  • поиск дубликатов и перефразирований на корейском языке

Ограничения

Модель ориентирована на корейский язык, а указанная при обучении максимальная длина последовательности составляет 32 токена. README отмечает зависимость качества от обучающего NLI-датасета; приведённые результаты относятся к KLUE-STS и Kor-STS.

Для каких профессий подходит8

Разделы каталога профессий, в задачах которых используется эта модель

Все профессии

Также подходит для

Карточка модели

README от автора на Hugging Face, как он его опубликовал

Открыть на Hugging Face

KoSimCSE Training on Amazon SageMaker

Usage

import torch
import torch.nn as nn
import torch.nn.functional as F
from torch import Tensor
from transformers import AutoConfig, PretrainedConfig, PreTrainedModel
from transformers import AutoModel, AutoTokenizer, logging

class SimCSEConfig(PretrainedConfig):
    def __init__(self, version=1.0, **kwargs):
        self.version = version
        super().__init__(**kwargs)

class SimCSEModel(PreTrainedModel):
    config_class = SimCSEConfig

    def __init__(self, config):
        super().__init__(config)
        self.backbone = AutoModel.from_pretrained(config.base_model)
        self.hidden_size: int = self.backbone.config.hidden_size
        self.dense = nn.Linear(self.hidden_size, self.hidden_size)
        self.activation = nn.Tanh()

    def forward(
        self,
        input_ids: Tensor,
        attention_mask: Tensor = None,
        # RoBERTa variants don't have token_type_ids, so this argument is optional
        token_type_ids: Tensor = None,
    ) -> Tensor:
        # shape of input_ids: (batch_size, seq_len)
        # shape of attention_mask: (batch_size, seq_len)
        outputs: BaseModelOutputWithPoolingAndCrossAttentions = self.backbone(
            input_ids=input_ids,
            attention_mask=attention_mask,
            token_type_ids=token_type_ids,
        )

        emb = outputs.last_hidden_state[:, 0]

        if self.training:
            emb = self.dense(emb)
            emb = self.activation(emb)

        return emb
    
def show_embedding_score(tokenizer, model, sentences):
    inputs = tokenizer(sentences, padding=True, truncation=True, return_tensors="pt")
    embeddings = model(**inputs)
    score01 = cal_score(embeddings[0,:], embeddings[1,:])
    score02 = cal_score(embeddings[0,:], embeddings[2,:])
    print(score01, score02)

def cal_score(a, b):
    if len(a.shape) == 1: a = a.unsqueeze(0)
    if len(b.shape) == 1: b = b.unsqueeze(0)
    a_norm = a / a.norm(dim=1)[:, None]
    b_norm = b / b.norm(dim=1)[:, None]
    return torch.mm(a_norm, b_norm.transpose(0, 1)) * 100 

# Load pre-trained model
model = SimCSEModel.from_pretrained("daekeun-ml/KoSimCSE-supervised-roberta-base")
tokenizer = AutoTokenizer.from_pretrained("daekeun-ml/KoSimCSE-supervised-roberta-base")

# Inference example
sentences = ['이번 주 일요일에 분당 이마트 점은 문을 여나요?',
             '일요일에 분당 이마트는 문 열어요?',
             '분당 이마트 점은 토요일에 몇 시까지 하나요']

show_embedding_score(tokenizer, model.cpu(), sentences)

Introduction

SimCSE is a highly efficient and innovative embedding technique based on the concept of contrastive learning. Unsupervised learning can be performed without the need to prepare ground-truth labels, and high-performance supervised learning can be performed if a good NLI (Natural Language Inference) dataset is prepared. The concept is very simple and the psudeo-code is intuitive, so the implementation is not difficult, but I have seen many people still struggle to train this model.

The official implementation code from the authors of the paper is publicly available, but it is not suitable for a step-by-step implementation. Therefore, we have reorganized the code based on Simple-SIMCSE's GitHub so that even ML beginners can train the model from the scratch with a step-by-step implementation. It's minimalist code for beginners, but data scientists and ML engineers can also make good use of it.

Added over Simple-SimCSE

  • Added the Supervised Learning part, which shows you step-by-step how to construct the training dataset.
  • Added Distributed Learning Logic. If you have a multi-GPU setup, you can train faster.
  • Added SageMaker Training. ml.g4dn.xlarge trains well, but we recommend ml.g4dn.12xlarge or ml.g5.12xlarge for faster training.

Requirements

We recommend preparing an Amazon SageMaker instance with the specifications below to perform this hands-on.

SageMaker Notebook instance

  • ml.g4dn.xlarge

SageMaker Training instance

  • ml.g4dn.xlarge (Minimum)
  • ml.g5.12xlarge (Recommended)

Datasets

For supervised learning, you need an NLI dataset that specifies the relationship between the two sentences. For unsupervised learning, we recommend using wikipedia raw data separated into sentences. This hands-on uses the dataset registered with huggingface, but you can also configure your own dataset.

The datasets used in this hands-on are as follows

Supervised

Unsupervised

  • kowiki-sentences: Data from 20221001 Korean wiki split into sentences using kss (backend=mecab) morphological analyzer.

How to train

Performance

We trained with parameters similar to those in the paper and did not perform any parameter tuning. Higher max sequence length does not guarantee higher performance; building a good NLI dataset is more important

{
  "batch_size": 64,
  "num_epochs": 1 (for unsupervised training), 3 (for supervised training)
  "lr": 3e-05,
  "num_warmup_steps": 0,
  "temperature": 0.05,
  "lr_scheduler_type": "linear",
  "max_seq_len": 32,
  "use_fp16": "True",
}

KLUE-STS

ModelAvgCosine PearsonCosine SpearmanEuclidean PearsonEuclidean SpearmanManhattan PearsonManhattan SpearmanDot PearsonDot Spearman
KoSimCSE-RoBERTa-base (Unsupervised)81.1781.2780.9681.7080.9781.6380.8981.1280.81
KoSimCSE-RoBERTa-base (Supervised)84.1983.0484.4684.9784.5084.9584.4582.8884.28
KoSimCSE-RoBERTa-large (Unsupervised)81.9682.0981.7182.4581.7382.4281.6981.9881.58
KoSimCSE-RoBERTa-large (Supervised)85.3784.3885.9985.9785.8186.0085.7983.8785.15

Kor-STS

ModelAvgCosine PearsonCosine SpearmanEuclidean PearsonEuclidean SpearmanManhattan PearsonManhattan SpearmanDot PearsonDot Spearman
KoSimCSE-RoBERTa-base (Unsupervised)81.2081.5381.1780.8981.2080.9381.2281.4881.14
KoSimCSE-RoBERTa-base (Supervised)85.3385.1685.4685.3785.4585.3185.3785.1385.41
KoSimCSE-RoBERTa-large (Unsupervised)81.7182.1081.7881.1281.7881.1581.8082.1581.80
KoSimCSE-RoBERTa-large (Supervised)85.5485.4185.7885.1885.5185.2685.6185.7085.90

References

Как запустить

На своей GPU в ailist. Цена — по текущим предложениям провайдеров

GPU в ailist

Универсальный рантайм

Нельзя запустить

Архитектура SimCSEModel неизвестна transformers в образе рантайма.

Класс архитектуры
SimCSEModel
Ревизия весов
be5c4cb

0 моделей