Transformers documentation

RWKV

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v5.22.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Bu model, 2023-05-09 tarihinde Hugging Face Transformers'a katkıda bulunulmuştur.

RWKV

Genel Bakış

RWKV modeli (4. sürüm) bu depoda önerilmiştir

Geleneksel Transformer dikkat mekanizmasında, onu doğrusal hale getirmek için bir ayarlama önerir. Bu sayede model, tekrarlayan bir ağ olarak kullanılabilir: zaman damgası 0 ve zaman damgası 1 için girdileri birlikte iletmek, önce zaman damgası 0'daki girdileri, ardından zaman damgası 0'ın durumuyla birlikte zaman damgası 1'deki girdileri iletmekle aynıdır (aşağıdaki örneğe bakınız).

Bu, standart bir Transformer'dan daha verimli olabilir ve herhangi bir uzunluktaki cümlelerle başa çıkabilir (model eğitim için sabit bir bağlam uzunluğu kullanıyor olsa bile).

Bu model sgugger tarafından katkıda bulunmuştur. Orijinal kod burada bulunabilir.

Kullanım örneği

import torch

from transformers import AutoTokenizer, RwkvModel


model = RwkvModel.from_pretrained("sgugger/rwkv-430M-pile", device_map="auto")
tokenizer = AutoTokenizer.from_pretrained("sgugger/rwkv-430M-pile")

inputs = tokenizer("This is an example.", return_tensors="pt").to(model.device)
# Feed everything to the model
outputs = model(inputs["input_ids"])
output_whole = outputs.last_hidden_state

outputs = model(inputs["input_ids"][:, :2])
output_one = outputs.last_hidden_state

# Using the state computed on the first inputs, we will get the same output
outputs = model(inputs["input_ids"][:, 2:], state=outputs.state)
output_two = outputs.last_hidden_state

torch.allclose(torch.cat([output_one, output_two], dim=1), output_whole, atol=1e-5)

Modelin '\n\n' algılandığında üretimi durdurduğundan emin olmak istiyorsanız, aşağıdaki durdurma kriterlerini kullanmanızı öneririz:

from transformers import StoppingCriteria


class RwkvStoppingCriteria(StoppingCriteria):
    def __init__(self, eos_sequence = [187,187], eos_token_id = 537):
        self.eos_sequence = eos_sequence
        self.eos_token_id = eos_token_id

    def __call__(self, input_ids: torch.LongTensor, scores: torch.FloatTensor, **kwargs) -> bool:
        last_2_ids = input_ids[:,-2:].tolist()
        return self.eos_sequence in last_2_ids


output = model.generate(inputs["input_ids"], max_new_tokens=64, stopping_criteria = [RwkvStoppingCriteria()])

Notlar

  • Toplu üretim için sol dolguyu kullanın. Dolgu tarafı bölümüne bakın.

RwkvConfig

sınıf transformers.RwkvConfig

< >

( transformers_version: str | None = Nonearchitectures: list[str] | None = Noneoutput_hidden_states: bool | None = Falsereturn_dict: bool | None = Truedtype: str | torch.dtype | None = Nonechunk_size_feed_forward: int = 0is_encoder_decoder: bool = Falseid2label: dict[int, str] | dict[str, str] | None = Nonelabel2id: dict[str, int] | dict[str, str] | None = Noneproblem_type: Literal['regression', 'single_label_classification', 'multi_label_classification'] | None = Nonevocab_size: int = 50277context_length: int = 1024hidden_size: int = 4096num_hidden_layers: int = 32attention_hidden_size: int | None = Noneintermediate_size: int | None = Nonelayer_norm_epsilon: float = 1e-05bos_token_id: int | None = 0eos_token_id: int | list[int] | None = 0rescale_every: int = 6tie_word_embeddings: bool = Falseuse_cache: bool = True )

Parametreler

  • vocab_size (int, isteğe bağlı, varsayılan 50277) — Modelin sözlük boyutu. input_ids ile temsil edilebilecek farklı token sayısını belirler.
  • context_length (int, isteğe bağlı, varsayılan 1024) — Bu modelin tek bir ileri geçişte (forward) kullanılabileceği maksimum dizi uzunluğu (RNN modunda kullanıldığında herhangi bir dizi uzunluğu kullanılabilir).
  • hidden_size (int, isteğe bağlı, varsayılan 4096) — Gizli temsillerin boyutu.
  • num_hidden_layers (int, isteğe bağlı, varsayılan 32) — Transformer çözücüdeki gizli katman sayısı.
  • attention_hidden_size (int, isteğe bağlı) — Dikkat gizli durumlarının boyutluluğu. Ayarlanmazsa varsayılan olarak hidden_size değerini alır.
  • intermediate_size (int, isteğe bağlı) — MLP temsillerinin boyutu.
  • layer_norm_epsilon (float, isteğe bağlı, varsayılan 1e-05) — Katman normalizasyon katmanları tarafından kullanılan epsilon.
  • bos_token_id (int, isteğe bağlı, varsayılan 0) — Sözlükte akış başlangıcı için kullanılan token kimliği.
  • eos_token_id (Union[int, list[int]], isteğe bağlı, varsayılan 0) — Sözlükte akış sonu için kullanılan token kimliği.
  • rescale_every (int, isteğe bağlı, varsayılan 6) — Çıkarım sırasında, gizli durumlar (ve ilgili çıktı katmanlarının ağırlıkları) her rescale_every katmanda 2'ye bölünür. 0 veya negatif bir sayı olarak ayarlanırsa yeniden ölçekleme yapılmaz.
  • tie_word_embeddings (bool, isteğe bağlı, varsayılan False) — Modelin tied_weights_keys eşlemesine göre ağırlık gömme bağlamalarının yapılıp yapılmayacağı.
  • use_cache (bool, isteğe bağlı, varsayılan True) — Modelin son anahtar/değer dikkatlerini (tüm modellerde kullanılmaz) döndürüp döndürmeyeceği. Yalnızca config.is_decoder=True olduğunda veya model yalnızca çözücü tabanlı üretken bir model olduğunda geçerlidir.

Bu, bir RwkvModel yapılandırmasını depolamak için kullanılan yapılandırma sınıfıdır. Belirtilen argümanlara göre bir Rwkv modelinin örneklenmesi ve model mimarisinin tanımlanması için kullanılır. Varsayılan değerlerle bir yapılandırma örneklendiğinde, RWKV/rwkv-4-169m-pile modelinin yapılandırmasına benzer bir yapılandırma elde edilir.

Yapılandırma nesneleri PreTrainedConfig sınıfından devralır ve model çıktılarını kontrol etmek için kullanılabilir. Daha fazla bilgi için PreTrainedConfig belgesini okuyun.

Örnek:

>>> from transformers import RwkvConfig, RwkvModel

>>> # Initializing a Rwkv configuration
>>> configuration = RwkvConfig()

>>> # Initializing a model (with random weights) from the configuration
>>> model = RwkvModel(configuration)

>>> # Accessing the model configuration
>>> configuration = model.config

RwkvModel

sınıf transformers.RwkvModel

< >

( config: RwkvConfig )

Parametreler

  • config (RwkvConfig) — Modelin tüm parametrelerini içeren model yapılandırma sınıfı. Bir yapılandırma dosyasıyla başlatmak, modelle ilişkili ağırlıkları yüklemez, yalnızca yapılandırmayı yükler. Model ağırlıklarını yüklemek için from_pretrained() yöntemine bakın.

Üzerinde herhangi bir özel head olmadan ham hidden-state çıktısı üreten çıplak Rwkv Model.

Bu model PreTrainedModel sınıfından devralır. Kütüphanenin tüm modelleri için uyguladığı genel yöntemler (indirme veya kaydetme, giriş gömme boyutlarını yeniden boyutlandırma, başları budama vb.) için üst sınıf belgelendirmesine bakın.

Bu model aynı zamanda bir PyTorch torch.nn.Module alt sınıfıdır. Bunu standart bir PyTorch Module olarak kullanın ve genel kullanım ve davranışla ilgili tüm konular için PyTorch dokümantasyonuna başvurun.

forward

< >

( input_ids: typing.Optional[torch.LongTensor] = Noneattention_mask: typing.Optional[torch.LongTensor] = Noneinputs_embeds: typing.Optional[torch.FloatTensor] = Nonestate: list[torch.FloatTensor] | None = Noneuse_cache: bool | None = Noneoutput_attentions: bool | None = Noneoutput_hidden_states: bool | None = Nonereturn_dict: bool | None = None**kwargs ) → RwkvOutput or tuple(torch.FloatTensor)

Parametreler

  • input_ids (torch.LongTensor şeklinde (batch_size, input_ids_length)) — input_ids_length = sequence_length eğer past_key_values ise None değilse past_key_values.get_seq_length() (sequence_length girdi geçmiş anahtar değer durumlarının uzunluğu). Sözlükteki girdi dizisi belirteçlerinin dizinleri.

    past_key_values kullanılıyorsa, geçmişleri hesaplanmamış olan input_ids değerleri input_ids olarak geçirilmelidir.

    Dizinler AutoTokenizer kullanılarak elde edilebilir. Ayrıntılar için PreTrainedTokenizer.encode() ve PreTrainedTokenizer.call() konularına bakın.

    Girdi kimlikleri nelerdir?

  • attention_mask (torch.LongTensor şeklinde (batch_size, sequence_length), isteğe bağlı) — Doldurma (padding) token indekslerinde dikkat (attention) işlemi yapmaktan kaçınmak için kullanılan maske. Seçilen maske değerleri [0, 1]:
    • 1, maskelenmemiş jetonlar için,
    • maskelenmiş jetonlar için 0.

    Dikkat maskeleri nedir?

  • inputs_embeds (torch.FloatTensor, şekli (batch_size, sequence_length, hidden_size), isteğe bağlı) — İsteğe bağlı olarak, input_ids yerine gömülü bir temsil doğrudan geçmeyi tercih edebilirsiniz. Bu, input_ids dizinlerini ilgili vektörlere dönüştürme biçimi üzerinde modelin dahili gömme arama matrisine kıyasla daha fazla kontrol sahibi olmak istiyorsanız faydalıdır.
  • state (tuple, beş adet torch.FloatTensor, şekli (batch_size, hidden_size, num_hidden_layers), isteğe bağlı) — Verilirse, model tüm bloklarda önceki durumu kullanır (bu, modelin state_input_ids + input_ids bağlamını eklediği varsayımıyla, sağlanan input_ids için çıktıyı verir).
  • use_cache (bool, isteğe bağlı) — True olarak ayarlanırsa, son durum döndürülür ve bir sonraki logits'leri hızlıca üretmek için kullanılabilir.
  • output_attentions (bool, isteğe bağlı) — Tüm dikkat katmanlarının dikkat tensörlerinin döndürülüp döndürülmeyeceğini belirtir. Daha fazla ayrıntı için döndürülen tensörler altındaki attentions bölümüne bakın.
  • output_hidden_states (bool, isteğe bağlı) — Tüm katmanların gizli durumlarının (hidden states) döndürülüp döndürülmeyeceğini belirtir. Daha fazla ayrıntı için döndürülen tensörler altındaki hidden_states bölümüne bakın.
  • return_dict (bool, isteğe bağlı) — Düz bir tuple yerine ModelOutput döndürülecek mi?

Dönüş değeri

RwkvOutput veya tuple(torch.FloatTensor)

RwkvOutput veya torch.FloatTensor bir demeti (return_dict=False geçirildiğinde veya config.return_dict=False olduğunda), yapılandırmaya (RwkvConfig) ve girdilere bağlı olarak çeşitli öğelerden oluşur.

RwkvModel forward metodu, __call__ özel metodunu geçersiz kılar.

İleri geçiş tarifi bu fonksiyon içinde tanımlanmalı olsa da, sonrasında bunun yerine Module örneğini çağırmak gerekir; çünkü önceki, ön ve son işleme adımlarını çalıştırmaktan sorumluyken ikincisi bunları sessizce yok sayar.

  • last_hidden_state (torch.FloatTensor, şekli (batch_size, sequence_length, hidden_size), isteğe bağlı) — Modelin son katmanının çıktısındaki gizli durumlar dizisi.

  • state (list, beş adet torch.FloatTensor, şekli (batch_size, hidden_size, num_hidden_layers)) — Modelin son zaman adımındaki durumu. Eski input_ids değerlerini sağlamak zorunluluğunu ortadan kaldırmak için, bir forward yönteminde bir sonraki input_ids ile birlikte kullanılabilir.

  • hidden_states (tuple[torch.FloatTensor, ...], isteğe bağlı, output_hidden_states=True geçirildiğinde veya config.output_hidden_states=True olduğunda döndürülür) — torch.FloatTensor (modelin bir gömme katmanı varsa gömme katmanının çıktısı için bir tane + her katmanın çıktısı için birer tane) içeren, (batch_size, sequence_length, hidden_size) biçiminde bir demet.

    Her katmanın çıktısında modelin gizli durumları ve isteğe bağlı başlangıç gömme çıktıları.

  • attentions (tuple[torch.FloatTensor, ...], isteğe bağlı, output_attentions=True geçirildiğinde veya config.output_attentions=True olduğunda döndürülür) — (batch_size, num_heads, sequence_length, sequence_length) biçiminde torch.FloatTensor (her katman için bir tane) içeren bir demet.

    Dikkat softmax'ı sonrası dikkat ağırlıkları, öz-dikkat başlıklarında ağırlıklı ortalamanın hesaplanmasında kullanılır.

RwkvLMHeadModel

sınıf transformers.RwkvForCausalLM

< >

( config: RwkvConfig )

Parametreler

  • config (RwkvConfig) — Modelin tüm parametrelerini içeren model yapılandırma sınıfı. Bir yapılandırma dosyasıyla başlatmak, modelle ilişkili ağırlıkları yüklemez, yalnızca yapılandırmayı yükler. Model ağırlıklarını yüklemek için from_pretrained() yöntemine bakın.

Üzerinde bir dil modelleme başlığı (giriş gömme ağırlıklarıyla bağlı ağırlıklı doğrusal katman) bulunan RWKV Model dönüştürücüsü.

Bu model PreTrainedModel sınıfından devralır. Kütüphanenin tüm modelleri için uyguladığı genel yöntemler (indirme veya kaydetme, giriş gömme boyutlarını yeniden boyutlandırma, başları budama vb.) için üst sınıf belgelendirmesine bakın.

Bu model aynı zamanda bir PyTorch torch.nn.Module alt sınıfıdır. Bunu standart bir PyTorch Module olarak kullanın ve genel kullanım ve davranışla ilgili tüm konular için PyTorch dokümantasyonuna başvurun.

forward

< >

( input_ids: typing.Optional[torch.LongTensor] = Noneattention_mask: typing.Optional[torch.LongTensor] = Noneinputs_embeds: typing.Optional[torch.FloatTensor] = Nonestate: list[torch.FloatTensor] | None = Nonelabels: typing.Optional[torch.LongTensor] = Noneuse_cache: bool | None = Noneoutput_attentions: bool | None = Noneoutput_hidden_states: bool | None = Nonereturn_dict: bool | None = Nonelogits_to_keep: typing.Union[int, torch.Tensor] = 0**kwargs ) → RwkvCausalLMOutput or tuple(torch.FloatTensor)

Parametreler

  • input_ids (torch.LongTensor şeklinde (batch_size, input_ids_length)) — input_ids_length = sequence_length eğer past_key_values ise None değilse past_key_values.get_seq_length() (sequence_length girdi geçmiş anahtar değer durumlarının uzunluğu). Sözlükteki girdi dizisi belirteçlerinin dizinleri.

    past_key_values kullanılıyorsa, geçmişleri hesaplanmamış olan input_ids değerleri input_ids olarak geçirilmelidir.

    Dizinler AutoTokenizer kullanılarak elde edilebilir. Ayrıntılar için PreTrainedTokenizer.encode() ve PreTrainedTokenizer.call() konularına bakın.

    Girdi kimlikleri nelerdir?

  • attention_mask (torch.LongTensor şeklinde (batch_size, sequence_length), isteğe bağlı) — Doldurma (padding) token indekslerinde dikkat (attention) işlemi yapmaktan kaçınmak için kullanılan maske. Seçilen maske değerleri [0, 1]:
    • 1, maskelenmemiş jetonlar için,
    • maskelenmiş jetonlar için 0.

    Dikkat maskeleri nedir?

  • inputs_embeds (torch.FloatTensor, şekli (batch_size, sequence_length, hidden_size), isteğe bağlı) — İsteğe bağlı olarak, input_ids yerine gömülü bir temsil doğrudan geçmeyi tercih edebilirsiniz. Bu, input_ids dizinlerini ilgili vektörlere dönüştürme biçimi üzerinde modelin dahili gömme arama matrisine kıyasla daha fazla kontrol sahibi olmak istiyorsanız faydalıdır.
  • state (tuple, beş adet torch.FloatTensor, şekli (batch_size, hidden_size, num_hidden_layers), opsiyonel) — İletilirse, model tüm bloklarda önceki durumu kullanır (bu, modelin input_ids olarak sağlanan girdi için, state_input_ids + input_ids ifadesini bağlam olarak eklemiş gibi çıktı üreteceği anlamına gelir).
  • labels (torch.LongTensor, şekli (batch_size, sequence_length), isteğe bağlı) — Dil modelleme için etiketler. Not: Etiketler model içinde kaydırılır, yani labels = input_ids olarak ayarlayabilirsiniz. İndisler [-100, 0, ..., config.vocab_size] aralığından seçilir. -100 olarak ayarlanan tüm etiketler yoksayılır (maske uygulanır), kayıp yalnızca [0, ..., config.vocab_size] aralığındaki etiketler için hesaplanır.
  • use_cache (bool, isteğe bağlı) — True olarak ayarlanırsa, son durum döndürülür ve bir sonraki logits'leri hızlıca üretmek için kullanılabilir.
  • output_attentions (bool, isteğe bağlı) — Tüm dikkat katmanlarının dikkat tensörlerinin döndürülüp döndürülmeyeceğini belirtir. Daha fazla ayrıntı için döndürülen tensörler altındaki attentions bölümüne bakın.
  • output_hidden_states (bool, isteğe bağlı) — Tüm katmanların gizli durumlarının (hidden states) döndürülüp döndürülmeyeceğini belirtir. Daha fazla ayrıntı için döndürülen tensörler altındaki hidden_states bölümüne bakın.
  • return_dict (bool, isteğe bağlı) — Düz bir tuple yerine ModelOutput döndürülecek mi?
  • logits_to_keep (Union[int, torch.Tensor], isteğe bağlı, varsayılan 0) — int ise, son logits_to_keep token için logits hesaplanır. 0 ise, tüm input_ids için logits hesaplanır (özel durum). Üretim için yalnızca son token logits'leri gereklidir ve bunların yalnızca o token için hesaplanması bellek tasarrufu sağlar; bu, uzun diziler veya büyük sözlük boyutu için oldukça önemli hale gelir. torch.Tensor ise, dizi uzunluğu boyutundaki korunacak indekslere karşılık gelen 1B olmalıdır. Bu, paketlenmiş tensor biçimini (batch ve dizi uzunluğu için tek boyut) kullanırken faydalıdır.

Dönüş değeri

RwkvCausalLMOutput veya tuple(torch.FloatTensor)

RwkvCausalLMOutput veya, return_dict=False geçirildiğinde ya da config.return_dict=False olduğunda, yapılandırmaya (RwkvConfig) ve girdilere bağlı olarak çeşitli öğelerden oluşan torch.FloatTensor bir demeti.

RwkvForCausalLM forward metodu, __call__ özel metodunu geçersiz kılar.

İleri geçiş tarifi bu fonksiyon içinde tanımlanmalı olsa da, sonrasında bunun yerine Module örneğini çağırmak gerekir; çünkü önceki, ön ve son işleme adımlarını çalıştırmaktan sorumluyken ikincisi bunları sessizce yok sayar.

  • loss (torch.FloatTensor, şekli (1,), opsiyonel, labels sağlandığında döndürülür) — Dil modelleme kaybı (sonraki token tahmini için).

  • logits (torch.FloatTensor, şekli (batch_size, sequence_length, config.vocab_size)) — Dil modelleme başlığının tahmin puanları (SoftMax öncesi her sözlük jetonu için puanlar).

  • state (list, beş adet torch.FloatTensor, şekli (batch_size, hidden_size, num_hidden_layers)) — Modelin son zaman adımındaki durumu. Eski input_ids değerlerini sağlamak zorunluluğunu ortadan kaldırmak için, bir forward yönteminde bir sonraki input_ids ile birlikte kullanılabilir.

  • hidden_states (tuple[torch.FloatTensor, ...], isteğe bağlı, output_hidden_states=True geçirildiğinde veya config.output_hidden_states=True olduğunda döndürülür) — torch.FloatTensor (modelin bir gömme katmanı varsa gömme katmanının çıktısı için bir tane + her katmanın çıktısı için birer tane) içeren, (batch_size, sequence_length, hidden_size) biçiminde bir demet.

    Her katmanın çıktısında modelin gizli durumları ve isteğe bağlı başlangıç gömme çıktıları.

  • attentions (tuple[torch.FloatTensor, ...], isteğe bağlı, output_attentions=True geçirildiğinde veya config.output_attentions=True olduğunda döndürülür) — (batch_size, num_heads, sequence_length, sequence_length) biçiminde torch.FloatTensor (her katman için bir tane) içeren bir demet.

    Dikkat softmax'ı sonrası dikkat ağırlıkları, öz-dikkat başlıklarında ağırlıklı ortalamanın hesaplanmasında kullanılır.

Örnek:

Rwkv dikkati ve tekrarlayan formüller

Geleneksel otoregresif bir Transformer'da dikkat (attention) şu şekilde yazılır: O=softmax(QKT/d)VO = \hbox{softmax}(QK^{T} / \sqrt{d}) V

ile $Q$, KK ve VV şeklinde matrislerdir seq_len x hidden_size query, key ve value olarak adlandırılır (aslında bir batch boyutu ve bir attention head boyutu içeren daha büyük matrislerdir ancak yalnızca son iki boyutla ilgileniyoruz, çünkü matris çarpımı burada yapılır; basitlik adına yalnızca bu iki boyutu ele alıyoruz). Çarpım QKTQK^{T} ardından şu şekildedir seq_len x seq_len ile matris çarpımını alabiliriz VV ile çıktıyı elde ederiz OO diğerleriyle aynı şekildedir.

softmax yerine değeri konulduğunda: Oi=∑j=1ieQiKjT/dVj∑j=1ieQiKjT/dO_{i} = \frac{\sum_{j=1}^{i} e^{Q_{i} K_{j}^{T} / \sqrt{d}} V_{j}}{\sum_{j=1}^{i} e^{Q_{i} K_{j}^{T} / \sqrt{d}}}

Dikkat edin, QKTQK^{T} 'ye karşılık gelen $j > i$ girişleri maskelenmiştir (toplam j'de durur), çünkü dikkat mekanizması gelecekteki token'lara bakmasına izin verilmez (yalnızca geçmiş token'lara).

Karşılaştırma olarak, RWKV dikkati şu şekilde verilir: Oi=σ(Ri)∑j=1ieWi−j+KjVj∑j=1ieWi−j+KjO_{i} = \sigma(R_{i}) \frac{\sum_{j=1}^{i} e^{W_{i-j} + K_{j}} V_{j}}{\sum_{j=1}^{i} e^{W_{i-j} + K_{j}}}

burada RR yazar tarafından reaktans olarak adlandırılan yeni bir matris, KK ve VV hâlâ anahtar ve değerdir ($\sigma$ burada sigmoid fonksiyonudur). WW token'in konumunu temsil eden yeni bir vektördür ve şu şekilde verilir: W0=u and Wk=(k−1)w for k≥1W_{0} = u \hbox{ and } W_{k} = (k-1)w \hbox{ for } k \geq 1

ile uu ve ww kodda sırasıyla olarak adlandırılan öğrenilebilir parametreler time_first ve time_decay şeklindedir. Pay ve payda her ikisi de özyinelemeli olarak ifade edilebilir. Bunları NiN_{i} ve DiD_{i} olarak adlandırırsak: Ni=eu+KiVi+N^i where N^i=eKi−1Vi−1+ew+Ki−2Vi−2⋯+e(i−2)w+K1V1N_{i} = e^{u + K_{i}} V_{i} + \hat{N}_{i} \hbox{ where } \hat{N}_{i} = e^{K_{i-1}} V_{i-1} + e^{w + K_{i-2}} V_{i-2} \cdots + e^{(i-2)w + K_{1}} V_{1}

böylece N^i\hat{N}_{i} (adı verilen numerator_state koddaki N^0=0 and N^j+1=eKjVj+ewN^j\hat{N}_{0} = 0 \hbox{ and } \hat{N}_{j+1} = e^{K_{j}} V_{j} + e^{w} \hat{N}_{j}

ve Di=eu+Ki+D^i where D^i=eKi−1+ew+Ki−2⋯+e(i−2)w+K1D_{i} = e^{u + K_{i}} + \hat{D}_{i} \hbox{ where } \hat{D}_{i} = e^{K_{i-1}} + e^{w + K_{i-2}} \cdots + e^{(i-2)w + K_{1}}

böylece D^i\hat{D}_{i} (adı verilen denominator_state kodda D^0=0 and D^j+1=eKj+ewD^j\hat{D}_{0} = 0 \hbox{ and } \hat{D}_{j+1} = e^{K_{j}} + e^{w} \hat{D}_{j}

Kullanılan gerçek tekrarlayan formül biraz daha karmaşıktır, çünkü sayısal kararlılık için büyük sayıların üstel değerlerini hesaplamak istemeyiz. Genellikle softmax olduğu gibi hesaplanmaz; bunun yerine en büyük terimin üsteli, paydan ve paydadan bölünür: exi∑j=1nexj=exi−M∑j=1nexj−M\frac{e^{x_{i}}}{\sum_{j=1}^{n} e^{x_{j}}} = \frac{e^{x_{i} - M}}{\sum_{j=1}^{n} e^{x_{j} - M}}

ile MM tüm $x_{j}$ değerlerinin maksimumu. Dolayısıyla burada pay durumunu ($\hat{N}$) ve payda durumunu ($\hat{D}$) saklamanın yanı sıra, üstel ifadelerde karşılaşılan tüm terimlerin maksimumunu da takip ediyoruz. Dolayısıyla aslında şunu kullanıyoruz: N~i=e−MiN^i and D~i=e−MiD^i\tilde{N}_{i} = e^{-M_{i}} \hat{N}_{i} \hbox{ and } \tilde{D}_{i} = e^{-M_{i}} \hat{D}_{i}

aşağıdaki tekrarlayan formüllerle tanımlanır: N~0=0 and N~j+1=eKj−qVj+ew+Mj−qN~j where q=max⁡(Kj,w+Mj)\tilde{N}_{0} = 0 \hbox{ and } \tilde{N}_{j+1} = e^{K_{j} - q} V_{j} + e^{w + M_{j} - q} \tilde{N}_{j} \hbox{ where } q = \max(K_{j}, w + M_{j})

ve D~0=0 and D~j+1=eKj−q+ew+Mj−qD~j where q=max⁡(Kj,w+Mj)\tilde{D}_{0} = 0 \hbox{ and } \tilde{D}_{j+1} = e^{K_{j} - q} + e^{w + M_{j} - q} \tilde{D}_{j} \hbox{ where } q = \max(K_{j}, w + M_{j})

ve $M_{j+1} = q$. Bunlarla birlikte, şu şekilde hesaplayabiliriz Ni=eu+Ki−qVi+eMiN~i where q=max⁡(u+Ki,Mi)N_{i} = e^{u + K_{i} - q} V_{i} + e^{M_{i}} \tilde{N}_{i} \hbox{ where } q = \max(u + K_{i}, M_{i})

ve Di=eu+Ki−q+eMiD~i where q=max⁡(u+Ki,Mi)D_{i} = e^{u + K_{i} - q} + e^{M_{i}} \tilde{D}_{i} \hbox{ where } q = \max(u + K_{i}, M_{i})

bize nihayetinde Oi=σ(Ri)NiDiO_{i} = \sigma(R_{i}) \frac{N_{i}}{D_{i}}

Update on GitHub