Transformers documentation
RWKV
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
< source >( 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ılan50277) — Modelin sözlük boyutu.input_idsile 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ılan4096) — Gizli temsillerin boyutu. - num_hidden_layers (
int, isteğe bağlı, varsayılan32) — 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 olarakhidden_sizedeğerini alır. - intermediate_size (
int, isteğe bağlı) — MLP temsillerinin boyutu. - layer_norm_epsilon (
float, isteğe bağlı, varsayılan1e-05) — Katman normalizasyon katmanları tarafından kullanılan epsilon. - bos_token_id (
int, isteğe bağlı, varsayılan0) — 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ılan0) — 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ı) herrescale_everykatmanda 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ılanFalse) — Modelintied_weights_keyseş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ılanTrue) — Modelin son anahtar/değer dikkatlerini (tüm modellerde kullanılmaz) döndürüp döndürmeyeceği. Yalnızcaconfig.is_decoder=Trueolduğ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.configRwkvModel
sınıf transformers.RwkvModel
< source >( 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
< source >( 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_lengtheğerpast_key_valuesiseNonedeğilsepast_key_values.get_seq_length()(sequence_lengthgirdi geçmiş anahtar değer durumlarının uzunluğu). Sözlükteki girdi dizisi belirteçlerinin dizinleri.past_key_valueskullanılıyorsa, geçmişleri hesaplanmamış olaninput_idsdeğerleriinput_idsolarak geçirilmelidir.Dizinler AutoTokenizer kullanılarak elde edilebilir. Ayrıntılar için PreTrainedTokenizer.encode() ve PreTrainedTokenizer.call() konularına bakın.
- 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.
- inputs_embeds (
torch.FloatTensor, şekli(batch_size, sequence_length, hidden_size), isteğe bağlı) — İsteğe bağlı olarak,input_idsyerine gömülü bir temsil doğrudan geçmeyi tercih edebilirsiniz. Bu,input_idsdizinlerini 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ş adettorch.FloatTensor, şekli(batch_size, hidden_size, num_hidden_layers), isteğe bağlı) — Verilirse, model tüm bloklarda önceki durumu kullanır (bu, modelinstate_input_ids + input_idsbağlamını eklediği varsayımıyla, sağlananinput_idsiçin çıktıyı verir). - use_cache (
bool, isteğe bağlı) —Trueolarak 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ındakiattentionsbö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ındakihidden_statesbö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ş adettorch.FloatTensor, şekli(batch_size, hidden_size, num_hidden_layers)) — Modelin son zaman adımındaki durumu. Eskiinput_idsdeğerlerini sağlamak zorunluluğunu ortadan kaldırmak için, bir forward yönteminde bir sonrakiinput_idsile birlikte kullanılabilir.hidden_states (
tuple[torch.FloatTensor, ...], isteğe bağlı,output_hidden_states=Truegeçirildiğinde veyaconfig.output_hidden_states=Trueolduğ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=Truegeçirildiğinde veyaconfig.output_attentions=Trueolduğunda döndürülür) —(batch_size, num_heads, sequence_length, sequence_length)biçimindetorch.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
< source >( 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
< source >( 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_lengtheğerpast_key_valuesiseNonedeğilsepast_key_values.get_seq_length()(sequence_lengthgirdi geçmiş anahtar değer durumlarının uzunluğu). Sözlükteki girdi dizisi belirteçlerinin dizinleri.past_key_valueskullanılıyorsa, geçmişleri hesaplanmamış olaninput_idsdeğerleriinput_idsolarak geçirilmelidir.Dizinler AutoTokenizer kullanılarak elde edilebilir. Ayrıntılar için PreTrainedTokenizer.encode() ve PreTrainedTokenizer.call() konularına bakın.
- 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.
- inputs_embeds (
torch.FloatTensor, şekli(batch_size, sequence_length, hidden_size), isteğe bağlı) — İsteğe bağlı olarak,input_idsyerine gömülü bir temsil doğrudan geçmeyi tercih edebilirsiniz. Bu,input_idsdizinlerini 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ş adettorch.FloatTensor, şekli(batch_size, hidden_size, num_hidden_layers), opsiyonel) — İletilirse, model tüm bloklarda önceki durumu kullanır (bu, modelininput_idsolarak sağlanan girdi için,state_input_ids + input_idsifadesini 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, yanilabels = input_idsolarak ayarlayabilirsiniz. İndisler[-100, 0, ..., config.vocab_size]aralığından seçilir.-100olarak 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ı) —Trueolarak 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ındakiattentionsbö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ındakihidden_statesbö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ılan0) —intise, sonlogits_to_keeptoken için logits hesaplanır.0ise, tüminput_idsiç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.Tensorise, 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,labelssağ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ş adettorch.FloatTensor, şekli(batch_size, hidden_size, num_hidden_layers)) — Modelin son zaman adımındaki durumu. Eskiinput_idsdeğerlerini sağlamak zorunluluğunu ortadan kaldırmak için, bir forward yönteminde bir sonrakiinput_idsile birlikte kullanılabilir.hidden_states (
tuple[torch.FloatTensor, ...], isteğe bağlı,output_hidden_states=Truegeçirildiğinde veyaconfig.output_hidden_states=Trueolduğ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=Truegeçirildiğinde veyaconfig.output_attentions=Trueolduğunda döndürülür) —(batch_size, num_heads, sequence_length, sequence_length)biçimindetorch.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.
Rwkv dikkati ve tekrarlayan formüller
Geleneksel otoregresif bir Transformer'da dikkat (attention) şu şekilde yazılır:
ile $Q$, ve ş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 ardından şu şekildedir seq_len x seq_len ile matris çarpımını alabiliriz ile çıktıyı elde ederiz diğerleriyle aynı şekildedir.
softmax yerine değeri konulduğunda:
Dikkat edin, '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:
burada yazar tarafından reaktans olarak adlandırılan yeni bir matris, ve hâlâ anahtar ve değerdir ($\sigma$ burada sigmoid fonksiyonudur). token'in konumunu temsil eden yeni bir vektördür ve şu şekilde verilir:
ile ve 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ı ve olarak adlandırırsak:
böylece (adı verilen numerator_state koddaki
ve
böylece (adı verilen denominator_state kodda
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:
ile 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:
aşağıdaki tekrarlayan formüllerle tanımlanır:
ve
ve $M_{j+1} = q$. Bunlarla birlikte, şu şekilde hesaplayabiliriz
ve
bize nihayetinde
Update on GitHub