Transformers documentation
RWKV
Model ini disumbangkan ke Hugging Face Transformers pada 2023-05-09.
RWKV
Ikhtisar
Model RWKV (versi 4) diusulkan di repo ini
Hal ini mengusulkan penyesuaian pada perhatian Transformer tradisional agar menjadi linear. Dengan cara ini, model dapat digunakan sebagai jaringan rekuren: meneruskan input untuk timestamp 0 dan timestamp 1 secara bersamaan sama dengan meneruskan input pada timestamp 0, kemudian input pada timestamp 1 bersama dengan state dari timestamp 0 (lihat contoh di bawah).
Hal ini dapat lebih efisien daripada Transformer reguler dan dapat menangani kalimat dengan panjang apa pun (bahkan jika model menggunakan panjang konteks tetap untuk pelatihan).
Model ini disumbangkan oleh sgugger. Kode aslinya dapat ditemukan di sini.
Contoh penggunaan
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)Jika Anda ingin memastikan model berhenti menghasilkan teks ketika '\n\n' terdeteksi, kami merekomendasikan untuk menggunakan kriteria penghentian berikut:
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.Tensor, **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()])Catatan
- Gunakan padding kiri untuk generasi batched. Lihat Sisi padding.
RwkvConfig
kelas 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 )
Parameter
- vocab_size (
int, opsional, default50277) — Ukuran kosakata model. Menentukan jumlah token berbeda yang dapat direpresentasikan olehinput_ids. - context_length (
int, opsional, default 1024) — Panjang maksimum sekuens yang dapat digunakan dengan model ini dalam satu forward (penggunaannya dalam mode RNN memungkinkan penggunaan panjang sekuens apa pun). - hidden_size (
int, opsional, default4096) — Dimensi dari representasi tersembunyi. - num_hidden_layers (
int, opsional, default32) — Jumlah lapisan tersembunyi dalam decoder Transformer. - attention_hidden_size (
int, opsional) — Dimensi dari hidden states attention. Akan menggunakanhidden_sizesebagai nilai default jika tidak disetel. - intermediate_size (
int, opsional) — Dimensi dari representasi MLP. - layer_norm_epsilon (
float, opsional, defaultnya1e-05) — Epsilon yang digunakan oleh lapisan normalisasi lapisan. - bos_token_id (
int, opsional, default0) — ID token yang digunakan untuk awal aliran (beginning-of-stream) dalam kosakata. - eos_token_id (
Union[int, list[int]], opsional, default0) — ID token yang digunakan untuk end-of-stream dalam kosakata. - rescale_every (
int, opsional, default 6) — Saat inferensi, hidden states (dan bobot dari lapisan output yang sesuai) dibagi dengan 2 setiaprescale_everylapisan. Jika diatur ke 0 atau bilangan negatif, tidak dilakukan rescale. - tie_word_embeddings (
bool, opsional, defaultFalse) — Apakah akan mengikat bobot embedding sesuai dengan pemetaantied_weights_keysmodel. - use_cache (
bool, opsional, defaultnyaTrue) — Apakah model harus mengembalikan perhatian kunci/nilai terakhir (tidak digunakan oleh semua model). Hanya relevan jikaconfig.is_decoder=Trueatau ketika model adalah model generatif yang hanya decoder.
Ini adalah kelas konfigurasi untuk menyimpan konfigurasi dari RwkvModel. Kelas ini digunakan untuk menginstansiasi model Rwkv berdasarkan argumen yang ditentukan, yang mendefinisikan arsitektur model. Menginstansiasi konfigurasi dengan nilai default akan menghasilkan konfigurasi yang serupa dengan konfigurasi dari RWKV/rwkv-4-169m-pile
Objek konfigurasi mewarisi dari PreTrainedConfig dan dapat digunakan untuk mengontrol output model. Baca dokumentasi dari PreTrainedConfig untuk informasi lebih lanjut.
Contoh:
>>> 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
kelas transformers.RwkvModel
< source >( config: RwkvConfig )
Parameter
- config (RwkvConfig) — Kelas konfigurasi model dengan semua parameter model. Inisialisasi dengan file konfigurasi tidak memuat bobot yang terkait dengan model, hanya konfigurasinya. Lihat metode from_pretrained() untuk memuat bobot model.
Model Rwkv polos yang menghasilkan hidden-states mentah tanpa head spesifik di atasnya.
Model ini mewarisi dari PreTrainedModel. Periksa dokumentasi kelas induk untuk metode generik yang diimplementasikan oleh pustaka untuk semua model (seperti mengunduh atau menyimpan, mengubah ukuran embedding input, memangkas kepala, dll.)
Model ini juga merupakan subclass dari torch.nn.Module PyTorch. Gunakan sebagai PyTorch Module biasa dan merujuk ke dokumentasi PyTorch untuk semua hal yang berkaitan dengan penggunaan dan perilaku umum.
forward
< source >( input_ids: typing.Optional[torch.LongTensor] = Noneattention_mask: typing.Optional[torch.LongTensor] = Noneinputs_embeds: typing.Optional[torch.Tensor] = Nonestate: list[torch.Tensor] | None = Noneuse_cache: bool | None = Noneoutput_attentions: bool | None = Noneoutput_hidden_states: bool | None = Nonereturn_dict: bool | None = None**kwargs ) → RwkvOutput or tuple(torch.Tensor)
Parameter
- input_ids (
torch.LongTensordengan bentuk(batch_size, input_ids_length)) —input_ids_length=sequence_lengthjikapast_key_valuesadalahNonejika tidakpast_key_values.get_seq_length()(sequence_lengthdari input past key value states). Indeks token urutan input dalam kosakata.Jika
past_key_valuesdigunakan, hanyainput_idsyang belum memiliki nilai masa lalunya yang dihitung yang harus diteruskan sebagaiinput_ids.Indeks dapat diperoleh menggunakan AutoTokenizer. Lihat PreTrainedTokenizer.encode() dan PreTrainedTokenizer.call() untuk detailnya.
- attention_mask (
torch.LongTensordengan bentuk(batch_size, sequence_length), opsional) — Mask untuk menghindari eksekusi attention pada indeks token padding. Nilai mask dipilih dari[0, 1]:- 1 untuk token yang tidak dimasker,
- 0 untuk token yang dimasker.
- inputs_embeds (
torch.Tensordengan bentuk(batch_size, sequence_length, hidden_size), opsional) — Secara opsional, alih-alih meneruskaninput_ids, Anda dapat memilih untuk langsung meneruskan representasi tertanam. Hal ini berguna jika Anda ingin memiliki kendali lebih atas cara mengonversi indeksinput_idsmenjadi vektor terkait, dibandingkan dengan matriks pencarian penanaman internal model. - state (
tupledari limatorch.Tensordengan bentuk(batch_size, hidden_size, num_hidden_layers), opsional) — Jika diberikan, model menggunakan state sebelumnya di semua blok (yang akan menghasilkan output untukinput_idsyang diberikan seolah-olah model menambahkanstate_input_ids + input_idssebagai konteks). - use_cache (
bool, opsional) — Jika diset keTrue, state terakhir akan dikembalikan dan dapat digunakan untuk dengan cepat menghasilkan logits berikutnya. - output_attentions (
bool, opsional) — Apakah akan mengembalikan tensor attentions dari semua lapisan attention. Lihatattentionsdi bawah tensor yang dikembalikan untuk detail lebih lanjut. - output_hidden_states (
bool, opsional) — Apakah akan mengembalikan hidden states dari semua lapisan. Lihathidden_statesdi bawah tensor yang dikembalikan untuk detail lebih lanjut. - return_dict (
bool, opsional) — Apakah akan mengembalikan ModelOutput alih-alih tuple biasa.
Mengembalikan
RwkvOutput atau tuple(torch.Tensor)
A RwkvOutput atau tuple dari
torch.Tensor (jika return_dict=False diberikan atau ketika config.return_dict=False) yang terdiri dari berbagai
elemen tergantung pada konfigurasi (RwkvConfig) dan input.
Metode forward dari RwkvModel menimpa metode khusus __call__.
Meskipun resep untuk forward pass perlu didefinisikan di dalam fungsi ini, sebaiknya panggil instance
Modulesetelahnya alih-alih fungsi ini, karena yang pertama menangani langkah-langkah pra-pemrosesan dan pasca-pemrosesan, sedangkan yang kedua mengabaikannya secara diam-diam.
last_hidden_state (
torch.Tensordengan bentuk(batch_size, sequence_length, hidden_size), opsional) — Urutan hidden-states pada keluaran lapisan terakhir model.state (
listberisi limatorch.Tensordengan bentuk(batch_size, hidden_size, num_hidden_layers)) — State model pada langkah waktu terakhir. Dapat digunakan dalam metode forward bersamainput_idsberikutnya untuk menghindari penyediaaninput_idslama.hidden_states (
tuple[torch.Tensor, ...], opsional, dikembalikan ketikaoutput_hidden_states=Truedilewatkan atau ketikaconfig.output_hidden_states=True) — Tuple daritorch.Tensor(satu untuk output dari embeddings, jika model memiliki lapisan embedding, + satu untuk output dari setiap lapisan) dengan bentuk(batch_size, sequence_length, hidden_size).Hidden-states model pada output setiap layer ditambah output embedding awal yang opsional.
attentions (
tuple[torch.Tensor, ...], opsional, dikembalikan saatoutput_attentions=Truedilewatkan atau saatconfig.output_attentions=True) — Tuple daritorch.Tensor(satu untuk setiap layer) dengan bentuk(batch_size, num_heads, sequence_length, sequence_length).Bobot perhatian setelah softmax perhatian, digunakan untuk menghitung rata-rata berbobot di kepala perhatian diri (self-attention).
RwkvLMHeadModel
kelas transformers.RwkvForCausalLM
< source >( config: RwkvConfig )
Parameter
- config (RwkvConfig) — Kelas konfigurasi model dengan semua parameter model. Inisialisasi dengan file konfigurasi tidak memuat bobot yang terkait dengan model, hanya konfigurasinya. Lihat metode from_pretrained() untuk memuat bobot model.
Transformer Model RWKV dengan kepala pemodelan bahasa di atasnya (lapisan linear dengan bobot yang terikat ke embedding input).
Model ini mewarisi dari PreTrainedModel. Periksa dokumentasi kelas induk untuk metode generik yang diimplementasikan oleh pustaka untuk semua model (seperti mengunduh atau menyimpan, mengubah ukuran embedding input, memangkas kepala, dll.)
Model ini juga merupakan subclass dari torch.nn.Module PyTorch. Gunakan sebagai PyTorch Module biasa dan merujuk ke dokumentasi PyTorch untuk semua hal yang berkaitan dengan penggunaan dan perilaku umum.
forward
< source >( input_ids: typing.Optional[torch.LongTensor] = Noneattention_mask: typing.Optional[torch.LongTensor] = Noneinputs_embeds: typing.Optional[torch.Tensor] = Nonestate: list[torch.Tensor] | 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.Tensor)
Parameter
- input_ids (
torch.LongTensordengan bentuk(batch_size, input_ids_length)) —input_ids_length=sequence_lengthjikapast_key_valuesadalahNonejika tidakpast_key_values.get_seq_length()(sequence_lengthdari input past key value states). Indeks token urutan input dalam kosakata.Jika
past_key_valuesdigunakan, hanyainput_idsyang belum memiliki nilai masa lalunya yang dihitung yang harus diteruskan sebagaiinput_ids.Indeks dapat diperoleh menggunakan AutoTokenizer. Lihat PreTrainedTokenizer.encode() dan PreTrainedTokenizer.call() untuk detailnya.
- attention_mask (
torch.LongTensordengan bentuk(batch_size, sequence_length), opsional) — Mask untuk menghindari eksekusi attention pada indeks token padding. Nilai mask dipilih dari[0, 1]:- 1 untuk token yang tidak dimasker,
- 0 untuk token yang dimasker.
- inputs_embeds (
torch.Tensordengan bentuk(batch_size, sequence_length, hidden_size), opsional) — Secara opsional, alih-alih meneruskaninput_ids, Anda dapat memilih untuk langsung meneruskan representasi tertanam. Hal ini berguna jika Anda ingin memiliki kendali lebih atas cara mengonversi indeksinput_idsmenjadi vektor terkait, dibandingkan dengan matriks pencarian penanaman internal model. - state (
tupledari limatorch.Tensordengan bentuk(batch_size, hidden_size, num_hidden_layers), opsional) — Jika diberikan, model menggunakan state sebelumnya di semua blok (yang akan menghasilkan output untukinput_idsyang diberikan seolah-olah model menambahkanstate_input_ids + input_idssebagai konteks). - labels (
torch.LongTensordengan bentuk(batch_size, sequence_length), opsional) — Label untuk pemodelan bahasa. Perhatikan bahwa label digeser di dalam model, yaitu Anda dapat mengaturlabels = input_idsIndeks dipilih dalam[-100, 0, ..., config.vocab_size]Semua label yang diatur ke-100diabaikan (dipertahankan), loss hanya dihitung untuk label dalam[0, ..., config.vocab_size] - use_cache (
bool, opsional) — Jika diset keTrue, state terakhir akan dikembalikan dan dapat digunakan untuk dengan cepat menghasilkan logits berikutnya. - output_attentions (
bool, opsional) — Apakah akan mengembalikan tensor attentions dari semua lapisan attention. Lihatattentionsdi bawah tensor yang dikembalikan untuk detail lebih lanjut. - output_hidden_states (
bool, opsional) — Apakah akan mengembalikan hidden states dari semua lapisan. Lihathidden_statesdi bawah tensor yang dikembalikan untuk detail lebih lanjut. - return_dict (
bool, opsional) — Apakah akan mengembalikan ModelOutput alih-alih tuple biasa. - logits_to_keep (
Union[int, torch.Tensor], opsional, default0) — Jika berupaint, hitung logits untuklogits_to_keeptoken terakhir. Jika0, hitung logits untuk semuainput_ids(kasus khusus). Hanya logits token terakhir yang diperlukan untuk generasi, dan menghitungnya hanya untuk token tersebut dapat menghemat memori, yang menjadi cukup signifikan untuk urutan panjang atau ukuran kosakata besar. Jika berupatorch.Tensor, harus 1D yang sesuai dengan indeks yang akan dipertahankan pada dimensi panjang urutan. Ini berguna saat menggunakan format tensor terpadu (satu dimensi untuk batch dan panjang urutan).
Mengembalikan
RwkvCausalLMOutput atau tuple(torch.Tensor)
RwkvCausalLMOutput atau tuple dari
torch.Tensor (jika return_dict=False diteruskan atau ketika config.return_dict=False) yang terdiri dari berbagai
elemen tergantung pada konfigurasi (RwkvConfig) dan input.
Metode forward dari RwkvForCausalLM menimpa metode khusus __call__.
Meskipun resep untuk forward pass perlu didefinisikan di dalam fungsi ini, sebaiknya panggil instance
Modulesetelahnya alih-alih fungsi ini, karena yang pertama menangani langkah-langkah pra-pemrosesan dan pasca-pemrosesan, sedangkan yang kedua mengabaikannya secara diam-diam.
loss (
torch.Tensordengan bentuk(1,), opsional, dikembalikan saatlabelsdisediakan) — Loss pemodelan bahasa (untuk prediksi token berikutnya).logits (
torch.Tensordengan bentuk(batch_size, sequence_length, config.vocab_size)) — Skor prediksi dari kepala pemodelan bahasa (skor untuk setiap token kosakata sebelum SoftMax).state (
listberisi limatorch.Tensordengan bentuk(batch_size, hidden_size, num_hidden_layers)) — State model pada langkah waktu terakhir. Dapat digunakan dalam metode forward bersamainput_idsberikutnya untuk menghindari penyediaaninput_idslama.hidden_states (
tuple[torch.Tensor, ...], opsional, dikembalikan ketikaoutput_hidden_states=Truedilewatkan atau ketikaconfig.output_hidden_states=True) — Tuple daritorch.Tensor(satu untuk output dari embeddings, jika model memiliki lapisan embedding, + satu untuk output dari setiap lapisan) dengan bentuk(batch_size, sequence_length, hidden_size).Hidden-states model pada output setiap layer ditambah output embedding awal yang opsional.
attentions (
tuple[torch.Tensor, ...], opsional, dikembalikan saatoutput_attentions=Truedilewatkan atau saatconfig.output_attentions=True) — Tuple daritorch.Tensor(satu untuk setiap layer) dengan bentuk(batch_size, num_heads, sequence_length, sequence_length).Bobot perhatian setelah softmax perhatian, digunakan untuk menghitung rata-rata berbobot di kepala perhatian diri (self-attention).
Perhatian Rwkv dan rumus rekurens
Pada Transformer auto-regressive tradisional, attention ditulis sebagai
dengan $Q$, dan adalah matriks dengan bentuk seq_len x hidden_size yang disebut query, key, dan value (sebenarnya ini adalah matriks yang lebih besar dengan dimensi batch dan dimensi attention head, tetapi kami hanya tertarik pada dua dimensi terakhir, yaitu tempat perkalian matriks dilakukan, sehingga demi kesederhanaan kami hanya mempertimbangkan dua dimensi tersebut). Hasil perkalian lalu memiliki bentuk seq_len x seq_len dan kami dapat melakukan perkalian matriks dengan untuk mendapatkan output dengan bentuk yang sama seperti yang lain.
Menggantikan softmax dengan nilainya menghasilkan:
Perhatikan bahwa entri dalam yang sesuai dengan $j > i$ dimasker (penjumlahan berhenti di j) karena attention tidak diizinkan melihat token masa depan (hanya token masa lalu).
Sebagai perbandingan, perhatian RWKV diberikan oleh
di mana adalah matriks baru yang disebut receptance oleh penulisnya, dan tetap menjadi key dan value ($\sigma$ di sini adalah fungsi sigmoid). adalah vektor baru yang merepresentasikan posisi token dan diberikan oleh
dengan dan parameter yang dapat dipelajari, yang disebut dalam kode sebagai time_first dan time_decay masing-masing. Pembilang dan penyebut keduanya dapat diekspresikan secara rekursif. Dengan menamainya dan kita memiliki:
sehingga (disebut numerator_state dalam kode) memenuhi
dan
sehingga (disebut denominator_state dalam kode) memenuhi
Rumus rekuren yang sebenarnya digunakan sedikit lebih kompleks, karena untuk stabilitas numerik kita tidak ingin menghitung eksponen dari angka-angka besar. Biasanya, softmax tidak dihitung apa adanya, melainkan eksponen dari suku maksimum dibagi pada pembilang dan penyebut:
dengan sebagai maksimum dari semua $x_{j}$. Jadi, di sini selain menyimpan state pembilang ($\hat{N}$) dan state penyebut ($\hat{D}$), kita juga melacak maksimum dari semua suku yang ditemui dalam eksponensial. Jadi, kita sebenarnya menggunakan
didefinisikan oleh rumus rekuren berikut:
dan
dan $M_{j+1} = q$. Dengan itu, kita dapat menghitung
dan
yang akhirnya menghasilkan
Update on GitHub