o
    shH                     @   sh   d dl Z d dlmZmZmZmZmZ d dlZd dlmZm	Z	 d dl
mZ e eZG dd de	jZdS )    N)CallableDictIterableTupleUnion)Tensornn)SentenceTransformerc                       s   e Zd Zddde fdedededededed	ed
df fddZ	de
eeef  ded
eeeeef f fddZed
efddZ  ZS )SoftmaxLossTFmodelsentence_embedding_dimension
num_labelsconcatenation_sent_repconcatenation_sent_difference!concatenation_sent_multiplicationloss_fctreturnNc           	         s   t t|   || _|| _|| _|| _|| _d}|r|d7 }|r$|d7 }|r*|d7 }t	d
| tj|| ||jd| _|| _dS )a\  
        This loss was used in our SBERT publication (https://arxiv.org/abs/1908.10084) to train the SentenceTransformer
        model on NLI data. It adds a softmax classifier on top of the output of two transformer networks.

        :class:`MultipleNegativesRankingLoss` is an alternative loss function that often yields better results,
        as per https://arxiv.org/abs/2004.09813.

        Args:
            model (SentenceTransformer): The SentenceTransformer model.
            sentence_embedding_dimension (int): The dimension of the sentence embeddings.
            num_labels (int): The number of different labels.
            concatenation_sent_rep (bool): Whether to concatenate vectors u,v for the softmax classifier. Defaults to True.
            concatenation_sent_difference (bool): Whether to add abs(u-v) for the softmax classifier. Defaults to True.
            concatenation_sent_multiplication (bool): Whether to add u*v for the softmax classifier. Defaults to False.
            loss_fct (Callable): Custom pytorch loss function. If not set, uses nn.CrossEntropyLoss(). Defaults to nn.CrossEntropyLoss().

        References:
            - Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks: https://arxiv.org/abs/1908.10084
            - `Training Examples > Natural Language Inference <../../examples/training/nli/README.html>`_

        Requirements:
            1. sentence pairs with a class label

        Inputs:
            +---------------------------------------+--------+
            | Texts                                 | Labels |
            +=======================================+========+
            | (sentence_A, sentence_B) pairs        | class  |
            +---------------------------------------+--------+

        Example:
            ::

                from sentence_transformers import SentenceTransformer, SentenceTransformerTrainer, losses
                from datasets import Dataset

                model = SentenceTransformer("microsoft/mpnet-base")
                train_dataset = Dataset.from_dict({
                    "sentence1": [
                        "A person on a horse jumps over a broken down airplane.",
                        "A person on a horse jumps over a broken down airplane.",
                        "A person on a horse jumps over a broken down airplane.",
                        "Children smiling and waving at camera",
                    ],
                    "sentence2": [
                        "A person is training his horse for a competition.",
                        "A person is at a diner, ordering an omelette.",
                        "A person is outdoors, on a horse.",
                        "There are children present.",
                    ],
                    "label": [1, 2, 0, 0],
                })
                loss = losses.SoftmaxLoss(model, model.get_sentence_embedding_dimension(), num_labels=3)

                trainer = SentenceTransformerTrainer(
                    model=model,
                    train_dataset=train_dataset,
                    loss=loss,
                )
                trainer.train()
        r         z'Softmax loss: #Vectors concatenated: {})deviceN)superr
   __init__r   r   r   r   r   loggerinfoformatr   Linearr   
classifierr   )	selfr   r   r   r   r   r   r   num_vectors_concatenated	__class__ f/var/www/html/alpaca_bot/venv/lib/python3.10/site-packages/sentence_transformers/losses/SoftmaxLoss.pyr      s$   G
zSoftmaxLoss.__init__sentence_featureslabelsc           
         s    fdd|D }|\}}g } j r|| ||  jr)|t||   jr3|||  t|d} |}|d urM ||	d}	|	S ||fS )Nc                    s   g | ]	}  |d  qS )sentence_embedding)r   ).0sentence_featurer   r!   r"   
<listcomp>k   s    z'SoftmaxLoss.forward.<locals>.<listcomp>r   )
r   appendr   torchabsr   catr   r   view)
r   r#   r$   repsrep_arep_bvectors_concatfeaturesoutputlossr!   r(   r"   forwardh   s    


zSoftmaxLoss.forwardc                 C   s   dS )Na  
@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",
}
r!   r(   r!   r!   r"   citation   s   zSoftmaxLoss.citation)__name__
__module____qualname__r   CrossEntropyLossr	   intboolr   r   r   r   strr   r   r   r7   propertyr8   __classcell__r!   r!   r   r"   r
      s>    	[
r
   )loggingtypingr   r   r   r   r   r,   r   r   )sentence_transformers.SentenceTransformerr	   	getLoggerr9   r   Moduler
   r!   r!   r!   r"   <module>   s    
