Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks
Paper • 1908.10084 • Published • 13
How to use TTHDZ/finetuned_vietnamese-document-embedding with sentence-transformers:
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("TTHDZ/finetuned_vietnamese-document-embedding", trust_remote_code=True)
sentences = [
"Có bao nhiêu nhóm chỉ tiêu cấp điện chính được quy định",
"Public_521\n|<image_4>|Ví dụ:\n\n_Hình 1.12: Các loại nét vẽ_",
"Public_024\nCÁC CHỈ TIÊU CHẤT LƯỢNG CỦA THỰC PHẨM\nChất lượng thực phẩm được đánh giá dựa trên nhiều chỉ tiêu. Có thể phân loại theo hai cách:",
"Public_049\nKiểu và cấu trúc dữ liệu\nKiểu dữ liệu\n**Kiểu dữ liệu ( _a data type_ )** là một tên hay từ khóa dùng để chỉ tập các đối tượng dữ liệu cùng các phép toán trên nó. Ví dụ trong C++, từ khóa _int_ dùng để chỉ tập các số nguyên có độ lớn biểu diễn bằng 2 byte (tùy thuộc vào các compiler) cùng với các phép toán số học, các phép toán so sánh, các phép toán cấp bít, các phép toán dịch chuyển bit. Từ khóa _float_ dùng để chỉ tập các số thực có độ chính xác đơn có độ lớn được biểu diễn bằng 4 byte (tùy thuộc vào các compiler) cùng với các phép toán số học, các phép toán so sánh. Không có phép lấy phần dư, các phép toán thao tác cấp bít với kiểu dữ liệu _float_. Kiểu dữ liệu được chia thành hai loại kiểu dữ liệu cơ bản hay còn gọi là kiểu dữ liệu nguyên thủy và các kiểu dữ liệu do người dùng định nghĩa.\n**Kiểu dữ liệu nguyên thủy** ( _primitive data types_ ) các kiểu dữ liệu được định nghĩa bởi hệ thống ( _system defined data type_ ) được gọi là các kiểu dữ liệu nguyên thủy. Thông thường, các ngôn ngữ lập trình cung cấp ba kiểu dữ liệu nguyên thủy đó là ký tự ( _character_ ), số ( _numeric_ ), và kiểu logic ( _bool_ ). Kiểu dữ liệu ký tự được chia thành hai loại ký tự ASCII ( _char_ ) và ký tự unicode ( _wchar_t_ ). Kiểu dữ liệu số cũng được chia thành hai loại: số kiểu số nguyên ( _integer_ ) và kiểu số thực ( _real_ ). Kiểu số nguyên được chia thành ba loại: số nguyên nhỏ ( _int_ ), số nguyên lớn ( _long_ ), số nguyên rất lớn ( _long long_ ). Kiểu số thực được chia làm hai loại: số thực có độ chính xác đơn ( _float_ ) và số thực có độ chính xác kép ( _double_ ). Dữ liệu kiểu bool chỉ định nghĩa bộ hai giá trị đúng ( _true_ ) và sai ( _false_ ).\nĐương nhiên, hai từ khóa khác nhau đại diện cho hai kiểu dữ liệu khác nhau. Quan sát này chỉ mang tính hình thức vì ta có thể quan sát được bằng mắt. Sự khác biệt bên trong giữa các kiểu dữ liệu là không gian bộ nhớ dùng để biểu diễn kiểu và các phép toán dành cho mỗi biến thuộc kiểu. Không gian nhớ dành cho kiểu phụ thuộc vào compiler của ngôn ngữ lập trình và hệ thống máy tính ta đang sử dụng. Chẳng hạn, kiểu dữ liệu _int_ một số compiler dùng 2 byte biểu diễn, một số compiler dùng 4 byte để biểu diễn. Các phép toán lấy phần dư ( _modulo_ ), dịch chuyển bít ( _bit operations_ ) định nghĩa cho các số _int_ , _long_ nhưng không định nghĩa cho các số _float_ và _double_. Để xác định độ lớn của kiểu ta có thể sử dụng hàm _sizeof_ ( _tên kiểu_ ). Ví dụ dưới đây dùng để xác định không gian nhớ dành cho kiểu.\n<table>\n<colgroup>\n<col/>\n</colgroup>\n<tbody>\n<tr>\n<td><p>//<strong>Ví dụ 1.1.</strong> Xác định kích cỡ bộ nhớ biểu diễn\nkiểu</p>\n<p>#include <iostream> using namespace std; int main(void){</p>\n<p>cout<<\"KÍCH CỠ KIỂU CƠ BẢN\"<<endl; cout<<\"Kích cỡ\nkiểu bool:\"<<sizeof(bool)<<endl;</p>\n<p>cout<<\" Kích cỡ kiểu\nchar:\"<<sizeof(char)<<endl;</p>\n<p>cout<<\" Kích cỡ kiểu\nwchar_t:\"<<sizeof(wchar_t)<<endl; cout<<\" Kích cỡ kiểu\nint:\"<<sizeof(int)<<endl; cout<<\" Kích cỡ kiểu\nlong:\"<<sizeof(long)<<endl; cout<<\" Kích cỡ kiểu long\nlong:\"<<sizeof(long long)<<endl;</p>\n<p>cout<<\" Kích cỡ kiểu float:\"<<sizeof(float)<<endl;\ncout<<\" Kích cỡ kiểu\ndouble:\"<<sizeof(double)<<endl;</p>\n<p>}</p></td>\n</tr>\n</tbody>\n</table> \n**Kiểu dữ liệu do người dùng định nghĩa** ( _user defined data types_ ) là các kiểu dữ liệu được do người dùng xây dựng bằng cách tổ hợp các kiểu dữ liệu nguyên thủy theo một nguyên tắc nào đó. Chẳng hạn, kiểu mảng ( _array_ ) là dãy có thứ tự các phần tử ( _các biến_ ) có cùng chung một kiểu dữ liệu được tổ chức liên tục nhau trong bộ nhớ. Kiếu xâu ký tự (string) là một mảng mỗi phần tử là một ký tự và có ký tự kết thúc là ‘\\0’. Như vậy, các kiểu dữ liệu không thuộc các kiểu dữ liệu nguyên thủy như mảng, cấu trúc, file đều được xem là các kiểu dữ liệu do người dùng định nghĩa.\n**Cấu trúc dữ liệu ( _data structure_ )** là phương pháp biểu diễn các đối tượng ở thế giới thực thành một đối tượng dữ liệu được tổ chức và lưu trữ trong máy tính để có thể sử lý một cách hiệu quả. Theo nghĩa này, mảng ( _array_ ), danh sách liên kết ( _linked list_ ), ngăn xếp ( _stack_ ), hàng đợi ( _queue_ ), cây ( _tree_ ), đồ thị ( _graph_ )… đều được gọi là các cấu trúc dữ liệu. Dựa vào biểu diễn của các cấu trúc dữ liệu, khoa học máy tính chia các cấu trúc dữ liệu thành hai loại: các cấu trúc dữ liệu tuyến tính ( _linear data structures_ ) và các cấu trúc dữ liệu không tuyến tính ( _non-linear data structures_ ). Một cấu trúc dữ liệu được gọi là tuyến tính nếu việc truy cập các phần tử được thực hiện tuần tự nhưng không nhất thiết được tổ chức liên tục. Điều này có nghĩa, các cấu trúc dữ liệu mảng, danh sách liên kết đơn, danh sách liên kết kép đều là các cấu trúc dữ liệu tuyến tính. Một cấu trúc dữ liệu được gọi là không tuyến tính nếu các phần tử của nó được tổ chức và truy cập không tuần tự. Theo nghĩa này, các cấu trúc dữ liệu cây, graph đều là các cấu trúc dữ liệu không tuyến tính.\n**Cấu trúc dữ liệu trừu tượng ( _Abstract Data types: ADTs_ )** là phương pháp kết hợp giữa cấu trúc dữ liệu cùng với các phép toán trên dữ liệu cụ thể của cấu trúc dữ liệu. Như vậy, mỗi kiểu dữ liệu ADTs bao gồm hai thành phần:\n * _Biểu diễn cấu trúc dữ liệu_.\n * _Xây dựng các phép toán trên dữ liệu_ _cụ thể_ _của cấu trúc dữ liệu._\nTheo nghĩa này các cấu trúc dữ liệu danh sách liên kết ( _linked list_ ), ngăn xếp ( _stack_ ), hàng đợi ( _queue_ ), hàng đợi ưu tiên ( _priority queue_ ), cây nhị phân ( _binary tree_ ), đồ thị ( _graph_ ) đều là _ADTs_. Mỗi cấu trúc dữ liệu cụ thể cùng các thao tác trên nó sẽ được trình bày trong những chương tiếp theo của tài liệu.\nĐối với mỗi cấu trúc dữ liệu trừu tượng, ta cần quan tâm và nắm bắt được những vấn đề sau:\n * **Định nghĩa** : nhằm xác định rõ cấu trúc dữ liệu ADTs ta đang quan tâm đến là gì.\n * **Biểu diễn** : nhằm định hình nên cấu trúc dữ liệu ADTs.\n * **Thao tác (phép toán)** : những thao tác và phép toán nào được cài đặt trên cấu trúc dữ liệu ADTs.\n * **Ứng dụng** : sử dụng cấu trúc dữ liệu ADTs để giải quyết lớp những bài toán nào trong khoa học máy tính."
]
embeddings = model.encode(sentences)
similarities = model.similarity(embeddings, embeddings)
print(similarities.shape)
# [4, 4]This is a sentence-transformers model finetuned from dangvantuan/vietnamese-document-embedding. 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': 8192, 'do_lower_case': False, 'architecture': 'VietnameseModel'})
(1): Pooling({'word_embedding_dimension': 768, 'pooling_mode_cls_token': True, 'pooling_mode_mean_tokens': False, 'pooling_mode_max_tokens': False, 'pooling_mode_mean_sqrt_len_tokens': False, 'pooling_mode_weightedmean_tokens': False, 'pooling_mode_lasttoken': False, 'include_prompt': True})
(2): Normalize()
)
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("TTHDZ/finetuned_vietnamese-document-embedding")
# Run inference
sentences = [
'Thách thức nào đặc thù khi huấn luyện AI cho an ninh mạng?',
'Public_076\nKiến trúc tổng thể của hệ thống phòng thủ AI\nTầng phân tích và học máy\n* Giám sát (Supervised Learning): sử dụng dữ liệu đã gắn nhãn (ví dụ, gói tin tấn công) để dự đoán tấn công đã biết.\n * Không giám sát (Unsupervised/Anomaly Detection): tìm kiếm mẫu hành vi bất thường, hữu ích với các cuộc tấn công 0-day.\n * Học bán giám sát và tự giám sát: giảm phụ thuộc vào dữ liệu gắn nhãn khan hiếm.\n * Học tăng cường (Reinforcement Learning): cho phép hệ thống tự điều chỉnh chính sách phản ứng dựa trên kết quả.',
'Public_076\nKiến trúc tổng thể của hệ thống phòng thủ AI\nMột giải pháp AI an ninh mạng toàn diện thường bao gồm nhiều lớp:',
]
embeddings = model.encode(sentences)
print(embeddings.shape)
# [3, 768]
# Get the similarity scores for the embeddings
similarities = model.similarity(embeddings, embeddings)
print(similarities)
# tensor([[1., 1., 1.],
# [1., 1., 1.],
# [1., 1., 1.]])
sentence_0, sentence_1, and sentence_2| sentence_0 | sentence_1 | sentence_2 | |
|---|---|---|---|
| type | string | string | string |
| details |
|
|
|
| sentence_0 | sentence_1 | sentence_2 |
|---|---|---|
Theo tài liệu Public_503, bộ kí tự (character set) trong ngôn ngữ lập trình có chức năng gì? |
Public_503 |
Public_183 |
Theo tài liệu Public_194, khái niệm Database trong MongoDB là gì? |
Public_194 |
Public_194 |
Dự án Stellarator nào được đề cập trong tài liệu? |
Public_096 |
Public_096 |
TripletLoss with these parameters:{
"distance_metric": "TripletDistanceMetric.EUCLIDEAN",
"triplet_margin": 5
}
per_device_train_batch_size: 2per_device_eval_batch_size: 2fp16: Truemulti_dataset_batch_sampler: round_robinoverwrite_output_dir: Falsedo_predict: Falseeval_strategy: noprediction_loss_only: Trueper_device_train_batch_size: 2per_device_eval_batch_size: 2per_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: 3max_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: 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}parallelism_config: Nonedeepspeed: Nonelabel_smoothing_factor: 0.0optim: adamw_torchoptim_args: Noneadafactor: Falsegroup_by_length: Falselength_column_name: lengthproject: huggingfacetrackio_space_id: trackioddp_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: Falsehub_revision: Nonegradient_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: Noneinclude_tokens_per_second: Falseinclude_num_input_tokens_seen: noneftune_noise_alpha: Noneoptim_target_modules: Nonebatch_eval_metrics: Falseeval_on_start: Falseuse_liger_kernel: Falseliger_kernel_config: Noneeval_use_gather_object: Falseaverage_tokens_across_devices: Trueprompts: Nonebatch_sampler: batch_samplermulti_dataset_batch_sampler: round_robinrouter_mapping: {}learning_rate_mapping: {}| Epoch | Step | Training Loss |
|---|---|---|
| 0.1478 | 500 | 5.0049 |
| 0.2956 | 1000 | 4.9978 |
| 0.4434 | 1500 | 4.9986 |
| 0.5912 | 2000 | 4.9993 |
| 0.7390 | 2500 | 5.0005 |
| 0.8868 | 3000 | 4.999 |
| 1.0346 | 3500 | 5.0014 |
| 1.1824 | 4000 | 4.9977 |
| 1.3302 | 4500 | 4.9989 |
| 1.4780 | 5000 | 5.003 |
| 1.6258 | 5500 | 5.0022 |
| 1.7736 | 6000 | 4.9975 |
| 1.9214 | 6500 | 4.9974 |
| 2.0692 | 7000 | 4.9986 |
| 2.2170 | 7500 | 5.0003 |
| 2.3648 | 8000 | 4.9994 |
| 2.5126 | 8500 | 4.9971 |
| 2.6604 | 9000 | 5.0037 |
| 2.8082 | 9500 | 4.997 |
| 2.9560 | 10000 | 4.9997 |
@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}
}
Base model
dangvantuan/vietnamese-document-embedding