Scaling Deep Contrastive Learning Batch Size under Memory Limited Setup
Paper • 2101.06983 • Published • 2
How to use meandyou200175/vn_biencoder_CachedMultipleNegativesRankingLoss with sentence-transformers:
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("meandyou200175/vn_biencoder_CachedMultipleNegativesRankingLoss")
sentences = [
"Nhờ bác sĩ cho biết việc lựa chọn đóng đinh nội tủy và nẹp vít để kết hợp xương đòn dựa trên cơ sở nào ạ? Ca phẫu thuật thường kéo dài trong bao lâu? Bệnh nhân nằm viện mấy ngày?",
" Chào em, là bệnh mãn tính phải điều trị suốt đời, phải kiên nhẫn và kiên trì nên đôi khi lượng đường trong cơ thể không ổn định. Lúc đi khám xét nghiệm thì ổn do bản thân biết mai đi khám nên sẽ kiêng ăn, ăn ít... còn bệnh lâu dài nên trong ngày đôi khi thèm chút này hay thích ăn chút kia, quên uống thuốc, suy nghĩ, mất ngủ cũng làm đường không ổn định. Đường trong cơ thể lúc lên lúc xuống dễ đưa đến biến chứng. Em hay thấy bệnh nhân tiểu đường tháo khớp ngón chân, ngón tay, đôi khi tháo khớp gối, khớp háng, đây là do tê liệt hệ thần kinh nên khi va chạm bệnh nhân không phát hiện. Đến khi phát hiện thì đã nhiễm trùng nặng phải tháo khớp. Theo BS mẹ em có khả năng do biến chứng tiểu đường vì mẹ em bị bệnh khá lâu nên ít nhiều ảnh hưởng thần kinh bị tê liệt gây đau. Em nên nhớ dặn mẹ đi tái khám và điều trị cho thật ổn định nhé! Thân mến!",
" Để lựa chọn phương pháp đóng đinh nội tủy hay nẹp vít cho bệnh nhân cần dựa vào nhiều yếu tố. Trong lòng tủy xương có một cái ống, nếu lòng tủy bệnh nhân nhỏ mà đường gãy không bị gãy thành nhiều mảnh thì nên lựa chọn phương pháp đóng đinh. Phương pháp này có nhược điểm dễ bị lộ phần đinh khi đinh vừa đóng, chưa chắc vào xương. Tuy nhiên, ưu điểm là khi đóng đinh, đường mổ sẽ nhỏ, đơn giản. Đối với nẹp vít, đường mổ dài hơn nhưng phần nắn chỉnh sẽ tuyệt đối, vững chắc hơn. Nhìn chung, giữa 2 phương pháp thời gian mổ không khác biệt nhau nhiều, từ 30-45 phút sẽ hoàn thành cuộc phẫu thuật kết hợp xương. Tại bệnh viện Nhân dân 115, sau khi bệnh nhân được làm phẫu thuật có thể xuất viện rất sớm trong vòng khoảng 3-5 ngày, tùy theo đường mổ lớn hay nhỏ. Giữa việc lựa chọn phẫu thuật hay bảo tồn, đinh nội tủy hay nẹp vít phụ thuộc vào lòng tủy của bệnh nhân và thói quen, sự đánh giá của phẫu thuật viên. Cá nhân tôi thường lựa chọn phương pháp phẫu thuật nẹp vít sẽ cho kết quả nắn chỉnh tốt, chắc hơn và bệnh nhân không bị biến chứng trồi đinh về sau. Thân mến.",
"Chào em, Tình trạng người mệt mỏi, khó thở, tim đập nhanh xảy ra khi không gắng sức có thể do nhiều nguyên nhân, gồm tim mạch, hô hấp, thần kinh cơ, tiêu hóa (chủ yếu là ống tiêu hóa trên), tâm lý, bệnh lý nội tiết tố… Viêm dạ dày trào ngược có thể gây các triệu chứng này do dịch acid trào ngược từ dạ dày lên thực quản kích thích thần kinh tim. Mặt khác bệnh dạ dày là bệnh có thể tái phát, điều trị hết bệnh rồi thì bệnh vẫn có thể tái lại. Do đó, nếu em đã khám tim mạch và hô hấp bình thường, để biết có phải mình mệt mỏi do bệnh dạ dày gây ra hay không thì tốt nhất là em khám chuyên khoa nội tiêu hóa và điều trị trào ngược dạ dày thực quản thử, nếu triệu chứng cải thiện nhanh chóng thì chính hắn là nguyên nhân, em nhé."
]
embeddings = model.encode(sentences)
similarities = model.similarity(embeddings, embeddings)
print(similarities.shape)
# [4, 4]This is a sentence-transformers model finetuned from bkai-foundation-models/vietnamese-bi-encoder. 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': 256, '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("meandyou200175/vn_biencoder_CachedMultipleNegativesRankingLoss")
# Run inference
sentences = [
'Bác sĩ cho em hỏi, em bị rạn nứt xương gót chân bên phải. Em bị hơn 1 tháng nay rồi. Em bỏ thuốc lá. Em muốn hỏi bác sĩ thông thường bó bột hơn hay thuốc lá hơn? Như của em khoảng bao lâu thì khỏi? Và giờ em vẫn chưa đi được bác sĩ ạ. Em cảm ơn.',
'Chào em, Thứ nhất, bắt buộc phải có phim Xquang để biết em có thực sự nứt xương gót hay bị gãy phức tạp hơn, vì nhiều trường hợp tưởng chỉ nứt xương thôi nhưng thật ra là vỡ phức tạp, phải phẫu thuật mới nhanh ổn được. Thứ hai, theo nguyên tắc điều trị nứt gãy xương là phải cố định tốt để can xương mọc ra, chỗ nứt gãy mới được nối liền. Do đó, nếu bó bột thì chân sẽ được cố định liên tục trong 4-6 tuần, còn bó lá thì phải thay thường xuyên, mỗi lần thay là 1 lần xê dịch nên xương khó lành. Tốt hơn hết em nên đến Bệnh viện Chấn thương Chỉnh hình để được kiểm tra và điều trị thích hợp, em nhé. Thân mến.',
'Chào bạn, Qua hình ảnh sang thương và mô tả triệu chứng, bệnh lý của bạn có khả năng là chàm hay còn gọi là viêm da dị ứng với đặc điểm là viêm và nổi mụn nhỏ, ngứa ngáy. Nguyên nhân của chàm hiện nay chưa rõ nhưng có thể do cơ địa dị ứng (người mắc hen, viêm mũi dị ứng có nguy cơ cao mắc chàm), do kích thích của hóa chất như nước rửa chén, bột giặt, cao su, kim loại, chất liệu giày dép (chàm tiếp xúc),... Thời tiết lạnh, stress, đổ mồ hôi nhiều và phấn hoa... cũng là những nguyên nhân có thể khiến da bị chàm. Chàm cũng có thể gặp ở người bị suy van tĩnh mạch, giãn tĩnh mạch chân khiến tình trạng bệnh dai dẳng, kém đáp ứng điều trị. Điều trị chàm thường phải sử dụng một số loại thuốc bôi da kéo dài, có thể để lại tác dụng phụ, do đó bạn nên khám BS Da liễu để kê toa loại thuốc phù hợp. Ngoài ra, bạn nên chú ý xem có yếu tố nào thường kích thích khởi phát chàm để tránh cho bệnh tái phát bạn nhé! Thân mến.',
]
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]
InformationRetrievalEvaluator| Metric | Value |
|---|---|
| cosine_accuracy@1 | 0.695 |
| cosine_accuracy@2 | 0.7874 |
| cosine_accuracy@5 | 0.8784 |
| cosine_accuracy@10 | 0.924 |
| cosine_accuracy@100 | 0.9918 |
| cosine_precision@1 | 0.695 |
| cosine_precision@2 | 0.3937 |
| cosine_precision@5 | 0.1757 |
| cosine_precision@10 | 0.0924 |
| cosine_precision@100 | 0.0099 |
| cosine_recall@1 | 0.695 |
| cosine_recall@2 | 0.7874 |
| cosine_recall@5 | 0.8784 |
| cosine_recall@10 | 0.924 |
| cosine_recall@100 | 0.9918 |
| cosine_ndcg@10 | 0.8092 |
| cosine_mrr@1 | 0.695 |
| cosine_mrr@2 | 0.7412 |
| cosine_mrr@5 | 0.7664 |
| cosine_mrr@10 | 0.7725 |
| cosine_mrr@100 | 0.7758 |
| cosine_map@100 | 0.7758 |
| dot_accuracy@1 | 0.6813 |
| dot_accuracy@2 | 0.7747 |
| dot_accuracy@5 | 0.8711 |
| dot_accuracy@10 | 0.9213 |
| dot_accuracy@100 | 0.992 |
| dot_precision@1 | 0.6813 |
| dot_precision@2 | 0.3873 |
| dot_precision@5 | 0.1742 |
| dot_precision@10 | 0.0921 |
| dot_precision@100 | 0.0099 |
| dot_recall@1 | 0.6813 |
| dot_recall@2 | 0.7747 |
| dot_recall@5 | 0.8711 |
| dot_recall@10 | 0.9213 |
| dot_recall@100 | 0.992 |
| dot_ndcg@10 | 0.8003 |
| dot_mrr@1 | 0.6813 |
| dot_mrr@2 | 0.728 |
| dot_mrr@5 | 0.755 |
| dot_mrr@10 | 0.7617 |
| dot_mrr@100 | 0.7652 |
| dot_map@100 | 0.7652 |
eval_strategy: stepsper_device_train_batch_size: 16per_device_eval_batch_size: 16learning_rate: 2e-05num_train_epochs: 5warmup_ratio: 0.1fp16: Truebatch_sampler: no_duplicatesoverwrite_output_dir: Falsedo_predict: Falseeval_strategy: stepsprediction_loss_only: Trueper_device_train_batch_size: 16per_device_eval_batch_size: 16per_gpu_train_batch_size: Noneper_gpu_eval_batch_size: Nonegradient_accumulation_steps: 1eval_accumulation_steps: Nonetorch_empty_cache_steps: Nonelearning_rate: 2e-05weight_decay: 0.0adam_beta1: 0.9adam_beta2: 0.999adam_epsilon: 1e-08max_grad_norm: 1.0num_train_epochs: 5max_steps: -1lr_scheduler_type: linearlr_scheduler_kwargs: {}warmup_ratio: 0.1warmup_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: Truefp16_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: Falsehub_always_push: Falsegradient_checkpointing: Falsegradient_checkpointing_kwargs: Noneinclude_inputs_for_metrics: Falseeval_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: Falsebatch_sampler: no_duplicatesmulti_dataset_batch_sampler: proportional| Epoch | Step | Training Loss | Validation Loss | cosine_map@100 |
|---|---|---|---|---|
| 0 | 0 | - | - | 0.5553 |
| 0.0365 | 100 | 0.4426 | - | - |
| 0.0730 | 200 | 0.3028 | - | - |
| 0.1096 | 300 | 0.2468 | - | - |
| 0.1461 | 400 | 0.2433 | - | - |
| 0.1826 | 500 | 0.2074 | - | - |
| 0.2191 | 600 | 0.1852 | - | - |
| 0.2557 | 700 | 0.1829 | - | - |
| 0.2922 | 800 | 0.1825 | - | - |
| 0.3287 | 900 | 0.1663 | - | - |
| 0.3652 | 1000 | 0.1626 | 0.1312 | 0.7130 |
| 0.4018 | 1100 | 0.1363 | - | - |
| 0.4383 | 1200 | 0.1832 | - | - |
| 0.4748 | 1300 | 0.1559 | - | - |
| 0.5113 | 1400 | 0.1286 | - | - |
| 0.5478 | 1500 | 0.1423 | - | - |
| 0.5844 | 1600 | 0.1399 | - | - |
| 0.6209 | 1700 | 0.1344 | - | - |
| 0.6574 | 1800 | 0.1285 | - | - |
| 0.6939 | 1900 | 0.1274 | - | - |
| 0.7305 | 2000 | 0.1239 | 0.1054 | 0.7309 |
| 0.7670 | 2100 | 0.114 | - | - |
| 0.8035 | 2200 | 0.1179 | - | - |
| 0.8400 | 2300 | 0.1152 | - | - |
| 0.8766 | 2400 | 0.1006 | - | - |
| 0.9131 | 2500 | 0.1265 | - | - |
| 0.9496 | 2600 | 0.138 | - | - |
| 0.9861 | 2700 | 0.1117 | - | - |
| 1.0226 | 2800 | 0.0932 | - | - |
| 1.0592 | 2900 | 0.0862 | - | - |
| 1.0957 | 3000 | 0.0962 | 0.0834 | 0.7441 |
| 1.1322 | 3100 | 0.0749 | - | - |
| 1.1687 | 3200 | 0.0815 | - | - |
| 1.2053 | 3300 | 0.0749 | - | - |
| 1.2418 | 3400 | 0.062 | - | - |
| 1.2783 | 3500 | 0.0625 | - | - |
| 1.3148 | 3600 | 0.0657 | - | - |
| 1.3514 | 3700 | 0.0521 | - | - |
| 1.3879 | 3800 | 0.0325 | - | - |
| 1.4244 | 3900 | 0.0633 | - | - |
| 1.4609 | 4000 | 0.035 | 0.0734 | 0.7630 |
| 1.4974 | 4100 | 0.0351 | - | - |
| 1.5340 | 4200 | 0.0326 | - | - |
| 1.5705 | 4300 | 0.0294 | - | - |
| 1.6070 | 4400 | 0.0293 | - | - |
| 1.6435 | 4500 | 0.0208 | - | - |
| 1.6801 | 4600 | 0.0321 | - | - |
| 1.7166 | 4700 | 0.0252 | - | - |
| 1.7531 | 4800 | 0.0234 | - | - |
| 1.7896 | 4900 | 0.0251 | - | - |
| 1.8262 | 5000 | 0.0245 | 0.0734 | 0.7611 |
| 1.8627 | 5100 | 0.0206 | - | - |
| 1.8992 | 5200 | 0.0255 | - | - |
| 1.9357 | 5300 | 0.0396 | - | - |
| 1.9722 | 5400 | 0.0311 | - | - |
| 2.0088 | 5500 | 0.0236 | - | - |
| 2.0453 | 5600 | 0.0215 | - | - |
| 2.0818 | 5700 | 0.0216 | - | - |
| 2.1183 | 5800 | 0.017 | - | - |
| 2.1549 | 5900 | 0.0193 | - | - |
| 2.1914 | 6000 | 0.018 | 0.0697 | 0.7700 |
| 2.2279 | 6100 | 0.0189 | - | - |
| 2.2644 | 6200 | 0.0162 | - | - |
| 2.3009 | 6300 | 0.0168 | - | - |
| 2.3375 | 6400 | 0.0176 | - | - |
| 2.3740 | 6500 | 0.0098 | - | - |
| 2.4105 | 6600 | 0.0131 | - | - |
| 2.4470 | 6700 | 0.0124 | - | - |
| 2.4836 | 6800 | 0.0091 | - | - |
| 2.5201 | 6900 | 0.0067 | - | - |
| 2.5566 | 7000 | 0.0096 | 0.0683 | 0.7667 |
| 2.5931 | 7100 | 0.0065 | - | - |
| 2.6297 | 7200 | 0.0072 | - | - |
| 2.6662 | 7300 | 0.01 | - | - |
| 2.7027 | 7400 | 0.0067 | - | - |
| 2.7392 | 7500 | 0.0058 | - | - |
| 2.7757 | 7600 | 0.0067 | - | - |
| 2.8123 | 7700 | 0.0078 | - | - |
| 2.8488 | 7800 | 0.0071 | - | - |
| 2.8853 | 7900 | 0.0081 | - | - |
| 2.9218 | 8000 | 0.0102 | 0.0655 | 0.7740 |
| 2.9584 | 8100 | 0.0088 | - | - |
| 2.9949 | 8200 | 0.0072 | - | - |
| 3.0314 | 8300 | 0.0072 | - | - |
| 3.0679 | 8400 | 0.0052 | - | - |
| 3.1045 | 8500 | 0.0057 | - | - |
| 3.1410 | 8600 | 0.005 | - | - |
| 3.1775 | 8700 | 0.0042 | - | - |
| 3.2140 | 8800 | 0.0058 | - | - |
| 3.2505 | 8900 | 0.0063 | - | - |
| 3.2871 | 9000 | 0.0049 | 0.0671 | 0.7726 |
| 3.3236 | 9100 | 0.0047 | - | - |
| 3.3601 | 9200 | 0.0054 | - | - |
| 3.3966 | 9300 | 0.0029 | - | - |
| 3.4332 | 9400 | 0.0044 | - | - |
| 3.4697 | 9500 | 0.0037 | - | - |
| 3.5062 | 9600 | 0.0036 | - | - |
| 3.5427 | 9700 | 0.004 | - | - |
| 3.5793 | 9800 | 0.0026 | - | - |
| 3.6158 | 9900 | 0.0021 | - | - |
| 3.6523 | 10000 | 0.0028 | 0.0626 | 0.7758 |
| 3.6888 | 10100 | 0.0027 | - | - |
| 3.7253 | 10200 | 0.0026 | - | - |
| 3.7619 | 10300 | 0.0031 | - | - |
| 3.7984 | 10400 | 0.0023 | - | - |
| 3.8349 | 10500 | 0.0039 | - | - |
| 3.8714 | 10600 | 0.0024 | - | - |
| 3.9080 | 10700 | 0.0027 | - | - |
| 3.9445 | 10800 | 0.003 | - | - |
| 3.9810 | 10900 | 0.0029 | - | - |
| 4.0175 | 11000 | 0.0024 | 0.0635 | 0.7734 |
| 4.0541 | 11100 | 0.002 | - | - |
| 4.0906 | 11200 | 0.0026 | - | - |
| 4.1271 | 11300 | 0.0023 | - | - |
| 4.1636 | 11400 | 0.0021 | - | - |
| 4.2001 | 11500 | 0.0021 | - | - |
| 4.2367 | 11600 | 0.0026 | - | - |
| 4.2732 | 11700 | 0.002 | - | - |
| 4.3097 | 11800 | 0.002 | - | - |
| 4.3462 | 11900 | 0.0019 | - | - |
| 4.3828 | 12000 | 0.0015 | 0.0612 | 0.7736 |
| 4.4193 | 12100 | 0.0017 | - | - |
| 4.4558 | 12200 | 0.002 | - | - |
| 4.4923 | 12300 | 0.0018 | - | - |
| 4.5289 | 12400 | 0.0014 | - | - |
| 4.5654 | 12500 | 0.0016 | - | - |
| 4.6019 | 12600 | 0.0013 | - | - |
| 4.6384 | 12700 | 0.0013 | - | - |
| 4.6749 | 12800 | 0.0016 | - | - |
| 4.7115 | 12900 | 0.0014 | - | - |
| 4.7480 | 13000 | 0.0015 | 0.0610 | 0.7758 |
| 4.7845 | 13100 | 0.0014 | - | - |
| 4.8210 | 13200 | 0.0012 | - | - |
| 4.8576 | 13300 | 0.0016 | - | - |
| 4.8941 | 13400 | 0.0015 | - | - |
| 4.9306 | 13500 | 0.0016 | - | - |
| 4.9671 | 13600 | 0.0015 | - | - |
@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{gao2021scaling,
title={Scaling Deep Contrastive Learning Batch Size under Memory Limited Setup},
author={Luyu Gao and Yunyi Zhang and Jiawei Han and Jamie Callan},
year={2021},
eprint={2101.06983},
archivePrefix={arXiv},
primaryClass={cs.LG}
}
Base model
bkai-foundation-models/vietnamese-bi-encoder