|
|
--- |
|
|
library_name: transformers |
|
|
language: |
|
|
- hy |
|
|
tags: |
|
|
- sentence-transformers |
|
|
--- |
|
|
|
|
|
# ArmEmbed - Text Embedding Model for Armenian |
|
|
|
|
|
This embedding model is built on a Llama-based language model pre-trained on Armenian text and further adapted using LoRA on additional Armenian data. It produces 2048-dimensional embeddings. |
|
|
|
|
|
|
|
|
## Usage |
|
|
Below is an example to encode queries and passages from the MS-MARCO passage ranking dataset. |
|
|
|
|
|
## Sentence Transformers |
|
|
```python |
|
|
from sentence_transformers import SentenceTransformer |
|
|
|
|
|
queries = [ |
|
|
"Ի՞նչ է պատահում հյուսվածքներին, ինչպիսիք են սիրտը կամ ուղեղը, եթե թթվածնով հարուստ արյունը ժամանակին չի մատակարարվում:", |
|
|
"Կարո՞ղ է արդյոք ոստիկանությունը հետախուզման թույլտվություն ստանալ այն բանից հետո, երբ նրանք տեսել են ապացույցներ:", |
|
|
] |
|
|
|
|
|
passages = [ |
|
|
"Եվ․․․ Կիսալուսնաձև փականները կանխում են արյան հետհոսքը զարկերակներից դեպի փորոքներ։ Բացատրեք, թե ինչ է պատահում հյուսվածքներին, ինչպիսիք են սիրտը կամ ուղեղը, եթե թթվածնով հարուստ արյունը ժամանակին չի մատակարարվում: Օրգանի հյուսվածքը սկսում է մահանալ։", |
|
|
"Ոստիկանությունը կտրամադրի իր սեփական ապացույցները հետախուզման թույլտվության համար, և կասկածյալը ներկա չէ, երբ թույլտվություն է տրվում: Երբ հետախուզման թույլտվություն է ստացվում, ոստիկանությունը կարող է խուզարկել միայն թույլտվության մեջ նշված վայրը, լինի դա տուն, մեքենա, թե որոշակի արտաքին վայր:", |
|
|
] |
|
|
|
|
|
prefixed_queries = ["query: " + query for query in queries] |
|
|
prefixed_passages = [" passage: " + passage for passage in passages] |
|
|
|
|
|
sentence_transformer = SentenceTransformer("alexshah/armembed", trust_remote_code=True) |
|
|
|
|
|
query_embeddings = sentence_transformer.encode( |
|
|
prefixed_queries, normalize_embeddings=True |
|
|
) |
|
|
passage_embeddings = sentence_transformer.encode( |
|
|
prefixed_passages, normalize_embeddings=True |
|
|
) |
|
|
|
|
|
scores = (query_embeddings @ passage_embeddings.T) * 100 |
|
|
print(scores.tolist()) |
|
|
``` |
|
|
|
|
|
## Transformers |
|
|
```python |
|
|
import torch |
|
|
import torch.nn.functional as F |
|
|
from transformers import AutoModel, AutoTokenizer |
|
|
|
|
|
|
|
|
def last_token_pool(last_hidden_states, attention_mask): |
|
|
left_padding = attention_mask[:, -1].sum() == attention_mask.shape[0] |
|
|
if left_padding: |
|
|
return last_hidden_states[:, -1] |
|
|
else: |
|
|
sequence_lengths = attention_mask.sum(dim=1) - 1 |
|
|
batch_size = last_hidden_states.shape[0] |
|
|
return last_hidden_states[ |
|
|
torch.arange(batch_size, device=last_hidden_states.device), sequence_lengths |
|
|
] |
|
|
|
|
|
|
|
|
queries = [ |
|
|
"Ի՞նչ է պատահում հյուսվածքներին, ինչպիսիք են սիրտը կամ ուղեղը, եթե թթվածնով հարուստ արյունը ժամանակին չի մատակարարվում:", |
|
|
"Կարո՞ղ է արդյոք ոստիկանությունը հետախուզման թույլտվություն ստանալ այն բանից հետո, երբ նրանք տեսել են ապացույցներ:", |
|
|
] |
|
|
|
|
|
passages = [ |
|
|
"Եվ․․․ Կիսալուսնաձև փականները կանխում են արյան հետհոսքը զարկերակներից դեպի փորոքներ։ Բացատրեք, թե ինչ է պատահում հյուսվածքներին, ինչպիսիք են սիրտը կամ ուղեղը, եթե թթվածնով հարուստ արյունը ժամանակին չի մատակարարվում: Օրգանի հյուսվածքը սկսում է մահանալ։", |
|
|
"Ոստիկանությունը կտրամադրի իր սեփական ապացույցները հետախուզման թույլտվության համար, և կասկածյալը ներկա չէ, երբ թույլտվություն է տրվում: Երբ հետախուզման թույլտվություն է ստացվում, ոստիկանությունը կարող է խուզարկել միայն թույլտվության մեջ նշված վայրը, լինի դա տուն, մեքենա, թե որոշակի արտաքին վայր:", |
|
|
] |
|
|
|
|
|
input_texts = ["query: " + query for query in queries] + [ |
|
|
" passage: " + passage for passage in passages |
|
|
] |
|
|
|
|
|
model = AutoModel.from_pretrained("alexshah/armembed") |
|
|
tokenizer = AutoTokenizer.from_pretrained("alexshah/armembed") |
|
|
|
|
|
batch_dict = tokenizer( |
|
|
input_texts, max_length=512, padding=True, truncation=True, return_tensors="pt" |
|
|
) |
|
|
outputs = model(**batch_dict) |
|
|
embeddings = last_token_pool(outputs.last_hidden_state, batch_dict["attention_mask"]) |
|
|
|
|
|
embeddings = F.normalize(embeddings, p=2, dim=1) |
|
|
scores = (embeddings[:2] @ embeddings[2:].T) * 100 |
|
|
print(scores.tolist()) |
|
|
``` |
|
|
|
|
|
## Intended Use |
|
|
### Primary Intended Uses |
|
|
- Retrieval-augmented generation (RAG) |
|
|
- Semantic search in Armenian |
|
|
- Document similarity computation |
|
|
- Cross-lingual text understanding |
|
|
- Text classification tasks |
|
|
- Information retrieval |
|
|
|
|
|
## Training Data |
|
|
### Dataset Details |
|
|
- **Source**: Reddit dataset with English-Armenian translations |
|
|
- **Size**: 0.66M pairs of rows |
|
|
- **Content Type**: Title and body text pairs |
|
|
- **Split Ratio**: 98.5% train, 1.5% test |
|
|
|
|
|
## Training Procedure |
|
|
### Training Details |
|
|
- **LoRA**: 16/32/0.1 on all linear layers |
|
|
- **Training Duration**: \~15 hours |
|
|
- **Hardware**: 4 × NVIDIA A100 (40GB) GPUs |
|
|
- **Effective Batch Size**: 128 (2 per GPU × 4 GPUs, with gradient accumulation of 16) |
|
|
- **Learning Rate**: 1e-4 |
|
|
- **Weight Decay**: 0.01 |
|
|
- **Warmup Steps**: 200 |
|
|
- **Max Sequence Length**: 512 tokens |
|
|
- **FP16 Training**: Enabled |
|
|
- **Gradient Clipping**: 1.0 |
|
|
|
|
|
### Optimization Configuration |
|
|
- **Framework**: DeepSpeed ZeRO Stage 3 |
|
|
- **Optimizer**: AdamW with auto learning rate and weight decay |
|
|
- **Mixed Precision**: bfloat16 (`bf16`) enabled |
|
|
- **ZeRO Optimization**: Stage 3 with: |
|
|
- No parameter offloading |
|
|
- Overlap communication enabled |
|
|
- Contiguous gradients enabled |
|
|
- Auto-tuned reduce and prefetch bucket sizes |
|
|
- Auto-tuned parameter persistence threshold |
|
|
|
|
|
## Technical Specifications |
|
|
- **Model Size**: ~1.24B parameters (based on a Llama-style architecture LLM pre-trained on Armenian data) |
|
|
- **Embedding Dimension**: 2048 |
|
|
- **Max Sequence Length**: 512 tokens |
|
|
- **Framework Compatibility**: |
|
|
- PyTorch |
|
|
- Hugging Face Transformers |
|
|
- DeepSpeed |
|
|
|
|
|
## Model Details |
|
|
- **Model Name**: ArmEmbed |
|
|
- **Model Type**: Text Embeddings for the Armenian Language |
|
|
- **Version**: 1.0.0 |
|
|
- **License**: Apache 2.0 |
|
|
- **Last Updated**: May 2025 |
|
|
- **Model Architecture**: Transformer-based embeddings model |
|
|
- **Input**: Armenian text |
|
|
- **Output**: Dense vector embeddings (size=2048) |