a
    h8                     @  s   d dl mZ d dlZd dlmZ d dlmZ d dlZd dlZd dl	m
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 )
    )annotationsN)Iterable)Callable)version)Tensornn)SentenceTransformerc                
      sb   e Zd Zddde fddddddddd fd	d
ZddddddZeddddZ  Z	S )SoftmaxLossTFr   intboolr   None)modelsentence_embedding_dimension
num_labelsconcatenation_sent_repconcatenation_sent_difference!concatenation_sent_multiplicationloss_fctreturnc           	        s   t    || _|| _|| _|| _|| _d}|r8|d7 }|rD|d7 }|rP|d7 }td|  t	j
|| ||jd| _|| _ttjtdk rtd dS )	at  
        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/sentence_transformer/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: )devicez4.43.0zSoftmaxLoss requires transformers >= 4.43.0 to work correctly. Otherwise, the classifier layer that maps embeddings to the labels cannot be updated. Consider updating transformers with `pip install transformers>=4.43.0`.N)super__init__r   r   r   r   r   loggerinfor   ZLinearr   
classifierr   r   parsetransformers__version__warning)	selfr   r   r   r   r   r   r   Znum_vectors_concatenated	__class__ d/var/www/html/assistant/venv/lib/python3.9/site-packages/sentence_transformers/losses/SoftmaxLoss.pyr      s,    G
zSoftmaxLoss.__init__zIterable[dict[str, Tensor]]r   zTensor | tuple[Tensor, Tensor])sentence_featureslabelsr   c           
        s    fdd|D }|\}}g } j r8|| ||  jrR|t||   jrf|||  t|d} |}|d ur ||	d}	|	S ||fS d S )Nc                   s   g | ]}  |d  qS )Zsentence_embedding)r   ).0Zsentence_featurer!   r$   r%   
<listcomp>w       z'SoftmaxLoss.forward.<locals>.<listcomp>r   )
r   appendr   torchabsr   catr   r   view)
r!   r&   r'   ZrepsZrep_aZrep_bZvectors_concatfeaturesoutputZlossr$   r)   r%   forwardt   s     


zSoftmaxLoss.forwardstr)r   c                 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   ZCrossEntropyLossr   r4   propertyr6   __classcell__r$   r$   r"   r%   r	      s   "br	   )
__future__r   loggingcollections.abcr   typingr   r.   r   	packagingr   r   r   Z)sentence_transformers.SentenceTransformerr   	getLoggerr7   r   Moduler	   r$   r$   r$   r%   <module>   s   
