Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks
Paper • 1908.10084 • Published • 17
How to use nikatonika/chatbot_sentence-transformer with sentence-transformers:
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("nikatonika/chatbot_sentence-transformer")
sentences = [
"Its personal! [SEP] I put you on uppers and you still yawned. Means its a symptom, of being a big fat liar. Yawning is a side effect of some antidepressants, apparently the ones youre on. Im not on antidepressants Im on SPEEEEEED! Well that means its a symptom of a cerebral tumour. You got six weeks to live. Mr. Welladjusted is as messed up as the rest of us. Whwhy would you keep that a secret? Are you ashamed of recognising how pathetic your life is? Its not a secret. House itsits... its personal! How long has it been personal? Yawnings recent so! either you just started or you changed prescription.",
"Yawnings recent so! either you just started or you changed prescription.",
"The High Sparrow has hundreds of Faith Militant surrounding him. Ser Gregor will can’t face them all. And he won’t have to. He’ll only have to face one.",
"Whoa, whoa, whoa! Hey! Whoa!"
]
embeddings = model.encode(sentences)
similarities = model.similarity(embeddings, embeddings)
print(similarities.shape)
# [4, 4]This is a sentence-transformers model finetuned from distilbert/distilroberta-base. It maps sentences & paragraphs to a 768-dimensional dense vector space and can be used for semantic textual similarity, semantic search, paraphrase mining, text classification, clustering, and more.
SentenceTransformer(
(0): Transformer({'max_seq_length': 128, '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, 'include_prompt': True})
)
First install the Sentence Transformers library:
pip install -U sentence-transformers
Then you can load this model and run inference.
from sentence_transformers import SentenceTransformer
# Download from the 🤗 Hub
model = SentenceTransformer("nikatonika/chatbot_sentence-transformer")
# Run inference
sentences = [
'Like you are now? [SEP] That liver is going to somebody right now. Were doing that surgery. If you do the surgery, youll be killing a mother of four. Father of three. I was guessing. Naphthalene poisoning is the best explanation we have for whats wrong with your son. It explains the internal bleeding, the hemolytic anemia, the liver failure! it also predicts whatll happen next. If you do the surgery hes gonna lay on that table for fourteen hours while his body continues to burn fat and release poison into his system. Either way, I did you a favor. Hes awake now, youve got a chance to say goodbye.',
'If you do the surgery hes gonna lay on that table for fourteen hours while his body continues to burn fat and release poison into',
'I know none of that. If I did, youd be the last to know.',
]
embeddings = model.encode(sentences)
print(embeddings.shape)
# [3, 768]
# Get the similarity scores for the embeddings
similarities = model.similarity(embeddings, embeddings)
print(similarities.shape)
# [3, 3]
dev_evaluatorTripletEvaluator| Metric | Value |
|---|---|
| cosine_accuracy | 0.9809 |
sentence_0, sentence_1, and sentence_2| sentence_0 | sentence_1 | sentence_2 | |
|---|---|---|---|
| type | string | string | string |
| details |
|
|
|
| sentence_0 | sentence_1 | sentence_2 |
|---|---|---|
I thought Everybody lied? [SEP] Told you, cant trust people. She pRobably knew she was allergic to gadolinium, figured it was an easy way to get someone to cut a hole in her throat. Cant get a picture, gonna have to get a thousand words. You actually want me to talk to the Patient? Get a history? We need to know if theres some genetic or environmental causes triggering an inflammatory response. Truth begins in lies. Think about it. |
Truth begins in lies. Think about it. |
the Krusshy and the... Krab... pizza... |
Whats that? [SEP] Her blood pressures rising. Mines rising too, course I am doing battle with a deity. In the heart, injecting the dye. Right coronary flow isnt obstructed, left coronary flow looks normal. Looks like youre wrong. Either Im right, or this test is about to go very bad. She has one... two... third ostium. How Many is she supposed to have? Dos. All the third ones doing is causing inflammation, throwing off clots, giving away the angiogram. No huMan would screw up that big! Dont worry, just one more surgery and youll be fine. |
She has one... two... third ostium. How Many is she supposed to have? Dos. All the third ones doing is causing inflammation, throwing off clots, giving away the angiogram. |
Of course I’m jokin’! I don’t take checks. |
Do me a favor!? [SEP] Mmhhmmm, I need to go peepee. Dial it up a notch and repeat. Ill be back. Ooh, girl in the boys bathroom. Very dramatic. Must be very important what you have to say to me. Yesterday your Patients tumor was 5.8 centimeters. Today its 4.6. How did that happen? At a guess, Id say Dr. House must be really really good ì why am I wasting him on hiccups?ù I wash before and after. You also requisitioned 20cc of ethanol what Patient was that for? Or are you planning a party? I was gonna say leave,ù but that works. |
I was gonna say leave,ù but that works. |
I seem to recall them giving you a bit of trouble as well. |
TripletLoss with these parameters:{
"distance_metric": "TripletDistanceMetric.EUCLIDEAN",
"triplet_margin": 5
}
eval_strategy: stepsnum_train_epochs: 1multi_dataset_batch_sampler: round_robinoverwrite_output_dir: Falsedo_predict: Falseeval_strategy: stepsprediction_loss_only: Trueper_device_train_batch_size: 8per_device_eval_batch_size: 8per_gpu_train_batch_size: Noneper_gpu_eval_batch_size: Nonegradient_accumulation_steps: 1eval_accumulation_steps: Nonetorch_empty_cache_steps: Nonelearning_rate: 5e-05weight_decay: 0.0adam_beta1: 0.9adam_beta2: 0.999adam_epsilon: 1e-08max_grad_norm: 1num_train_epochs: 1max_steps: -1lr_scheduler_type: linearlr_scheduler_kwargs: {}warmup_ratio: 0.0warmup_steps: 0log_level: passivelog_level_replica: warninglog_on_each_node: Truelogging_nan_inf_filter: Truesave_safetensors: Truesave_on_each_node: Falsesave_only_model: Falserestore_callback_states_from_checkpoint: Falseno_cuda: Falseuse_cpu: Falseuse_mps_device: Falseseed: 42data_seed: Nonejit_mode_eval: Falseuse_ipex: Falsebf16: Falsefp16: Falsefp16_opt_level: O1half_precision_backend: autobf16_full_eval: Falsefp16_full_eval: Falsetf32: Nonelocal_rank: 0ddp_backend: Nonetpu_num_cores: Nonetpu_metrics_debug: Falsedebug: []dataloader_drop_last: Falsedataloader_num_workers: 0dataloader_prefetch_factor: Nonepast_index: -1disable_tqdm: Falseremove_unused_columns: Truelabel_names: Noneload_best_model_at_end: Falseignore_data_skip: Falsefsdp: []fsdp_min_num_params: 0fsdp_config: {'min_num_params': 0, 'xla': False, 'xla_fsdp_v2': False, 'xla_fsdp_grad_ckpt': False}fsdp_transformer_layer_cls_to_wrap: Noneaccelerator_config: {'split_batches': False, 'dispatch_batches': None, 'even_batches': True, 'use_seedable_sampler': True, 'non_blocking': False, 'gradient_accumulation_kwargs': None}deepspeed: Nonelabel_smoothing_factor: 0.0optim: adamw_torchoptim_args: Noneadafactor: Falsegroup_by_length: Falselength_column_name: lengthddp_find_unused_parameters: Noneddp_bucket_cap_mb: Noneddp_broadcast_buffers: Falsedataloader_pin_memory: Truedataloader_persistent_workers: Falseskip_memory_metrics: Trueuse_legacy_prediction_loop: Falsepush_to_hub: Falseresume_from_checkpoint: Nonehub_model_id: Nonehub_strategy: every_savehub_private_repo: Nonehub_always_push: Falsegradient_checkpointing: Falsegradient_checkpointing_kwargs: Noneinclude_inputs_for_metrics: Falseinclude_for_metrics: []eval_do_concat_batches: Truefp16_backend: autopush_to_hub_model_id: Nonepush_to_hub_organization: Nonemp_parameters: auto_find_batch_size: Falsefull_determinism: Falsetorchdynamo: Noneray_scope: lastddp_timeout: 1800torch_compile: Falsetorch_compile_backend: Nonetorch_compile_mode: Nonedispatch_batches: Nonesplit_batches: Noneinclude_tokens_per_second: Falseinclude_num_input_tokens_seen: Falseneftune_noise_alpha: Noneoptim_target_modules: Nonebatch_eval_metrics: Falseeval_on_start: Falseuse_liger_kernel: Falseeval_use_gather_object: Falseaverage_tokens_across_devices: Falseprompts: Nonebatch_sampler: batch_samplermulti_dataset_batch_sampler: round_robin| Epoch | Step | Training Loss | dev_evaluator_cosine_accuracy |
|---|---|---|---|
| -1 | -1 | - | 0.7078 |
| 0.2545 | 200 | - | 0.9255 |
| 0.5089 | 400 | - | 0.9701 |
| 0.6361 | 500 | 1.6621 | - |
| 0.7634 | 600 | - | 0.9752 |
| 1.0 | 786 | - | 0.9790 |
| -1 | -1 | - | 0.9790 |
| 0.2545 | 200 | - | 0.9752 |
| 0.5089 | 400 | - | 0.9790 |
| 0.6361 | 500 | 0.298 | - |
| 0.7634 | 600 | - | 0.9790 |
| 1.0 | 786 | - | 0.9803 |
| -1 | -1 | - | 0.9803 |
| 0.2545 | 200 | - | 0.9777 |
| 0.5089 | 400 | - | 0.9796 |
| 0.6361 | 500 | 0.0783 | - |
| 0.7634 | 600 | - | 0.9809 |
@inproceedings{reimers-2019-sentence-bert,
title = "Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks",
author = "Reimers, Nils and Gurevych, Iryna",
booktitle = "Proceedings of the 2019 Conference on Empirical Methods in Natural Language Processing",
month = "11",
year = "2019",
publisher = "Association for Computational Linguistics",
url = "https://arxiv.org/abs/1908.10084",
}
@misc{hermans2017defense,
title={In Defense of the Triplet Loss for Person Re-Identification},
author={Alexander Hermans and Lucas Beyer and Bastian Leibe},
year={2017},
eprint={1703.07737},
archivePrefix={arXiv},
primaryClass={cs.CV}
}