Transformers documentation
RWKV
このモデルは2023年5月9日に Hugging Face Transformers に貢献されました。
RWKV
概要
RWKVモデル(バージョン4)は、このリポジトリで提案されました。
従来の Transformer の注意機構を調整して線形化することを提案しています。これにより、モデルを再帰型ネットワークとして使用できます。タイムスタンプ 0 とタイムスタンプ 1 の入力を同時に渡すことは、まずタイムスタンプ 0 の入力を渡し、次にタイムスタンプ 0 の状態とともにタイムスタンプ 1 の入力を渡すことと同等です(以下の例を参照)。
これは通常の Transformer よりも効率的であり、任意の長さの文を処理できます(モデルが学習時に固定のコンテキスト長を使用する場合でも)。
このモデルは sgugger によって提供されました。 元のコードは こちら で確認できます。
使用例
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)'\n\n' が検出された時点でモデルの生成を停止させたい場合は、以下の停止条件の使用を推奨します。
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()])注記
- バッチ生成には左パディングを使用します。Padding sideを参照してください。
RwkvConfig
クラス 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 )
パラメータ
- vocab_size (
int、任意、デフォルトは50277) — モデルの語彙サイズ。input_idsで表現できるトークンの種類数を定義します。 - context_length (
int、任意、デフォルトは 1024) — このモデルを単一の forward で使用できる最大シーケンス長です(RNN モードで使用する場合は、任意のシーケンス長を使用できます)。 - hidden_size (
int、任意、デフォルトは4096) — 隠れ表現の次元数。 - num_hidden_layers (
int、任意、デフォルトは32) — Transformer デコーダーの隠れ層の数。 - attention_hidden_size (
int, 省略可) — アテンションの隠れ状態の次元数。未設定の場合はhidden_sizeがデフォルトとして使用されます。 - intermediate_size (
int, 任意) — MLP 表現の次元数。 - layer_norm_epsilon (
float、任意、デフォルトは1e-05) — レイヤーノーマル層で使用する epsilon です。 - bos_token_id (
int、任意、デフォルトは0) — 語彙におけるストリーム開始に使用されるトークン ID。 - eos_token_id (
Union[int, list[int]]、任意、デフォルトは0) — 語彙内でストリーム終了に使用されるトークン ID。 - rescale_every (
int、任意、デフォルトは 6) — 推論時、rescale_every層ごとに、隠れ状態(および対応する出力層の重み)を 2 で割ります。0 または負の値を設定した場合、リスケールは行われません。 - tie_word_embeddings (
bool、任意、デフォルトはFalse) — モデルのtied_weights_keysマッピングに従って重み埋め込みを共有するかどうかを指定します。 - use_cache (
bool、任意、デフォルトはTrue) — モデルが最後のキー/バリューの注意を返すかどうか(すべてのモデルで利用されるわけではありません)。config.is_decoder=Trueの場合、またはモデルがデコーダー専用の生成モデルである場合にのみ関連します。
これは RwkvModel の設定を保存するための設定クラスです。指定された引数に基づいて Rwkv モデルをインスタンス化し、モデルのアーキテクチャを定義するために使用されます。デフォルト値で設定をインスタンス化すると、RWKV/rwkv-4-169m-pile と同様の設定が得られます。
設定オブジェクトはPreTrainedConfigを継承し、モデルの出力を制御するために使用できます。詳細については、PreTrainedConfigのドキュメントを参照してください。
例:
>>> 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
クラス transformers.RwkvModel
< source >( config: RwkvConfig )
パラメータ
- config (RwkvConfig) — モデルのパラメータをすべて含むモデル設定クラスです。設定ファイルで初期化しても、モデルに関連する重みは読み込まれず、設定のみが読み込まれます。モデルの重みをロードするには、from_pretrained() メソッドを参照してください。
特定のヘッドを付加せず、生の隠れ状態を出力する素のRwkvモデル。
このモデルは PreTrainedModel を継承しています。すべてのモデルに実装されている汎用的なメソッド(ダウンロードや保存、入力埋め込みのリサイズ、ヘッドのプルーニングなど)については、スーパークラスのドキュメントを参照してください。
このモデルは、PyTorchのtorch.nn.Moduleのサブクラスでもあります。 通常のPyTorch Moduleとして使用し、一般的な使用方法や動作に関する詳細については、PyTorchのドキュメントを参照してください。
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)
パラメータ
- input_ids (
torch.LongTensorの形状(batch_size, input_ids_length)) —input_ids_length=sequence_lengthの場合past_key_valuesがNoneそれ以外の場合past_key_values.get_seq_length()(sequence_lengthの input past key value states の長さ)。語彙における入力シーケンスのトークンインデックス。past_key_valuesを使用する場合、過去が計算されていないinput_idsのみをinput_idsとして渡す必要があります。インデックスはAutoTokenizerを使用して取得できます。詳細については、PreTrainedTokenizer.encode()およびPreTrainedTokenizer.call()を参照してください。
- attention_mask (
torch.LongTensorの形状(batch_size, sequence_length), 、任意) — パディングトークンのインデックスに対するアテンションを回避するためのマスク。[0, 1]:- マスクされていないトークンに対して1
- マスクされたトークンに対しては 0 です。
- inputs_embeds (
torch.FloatTensor、形状(batch_size, sequence_length, hidden_size)、任意) —input_idsを渡す代わりに、埋め込み表現を直接渡すこともできます。これは、モデル内部の埋め込みルックアップ行列よりも、input_idsのインデックスを対応するベクトルに変換する方法をより細かく制御したい場合に有用です。 - state (
tupleof fivetorch.FloatTensorof shape(batch_size, hidden_size, num_hidden_layers), optional) — 指定された場合、モデルはすべてのブロックで前回の状態を使用します(input_idsに対して、モデルがstate_input_ids + input_idsをコンテキストとして追加したかのような出力が得られます)。 - use_cache (
bool、省略可) —Trueに設定すると、最後の状態が返され、次の logits を高速に生成するために使用できます。 - output_attentions (
bool, 省略可) — すべてのアテンション層のアテンションテンソルを返すかどうかを指定します。詳細は、返されるテンソルのattentionsを参照してください。 - output_hidden_states (
bool, 省略可) — すべての層の hidden states を返すかどうかを指定します。詳細は、返されるテンソルのhidden_statesを参照してください。 - return_dict (
bool, 任意) — プレーンなタプルではなく ModelOutput を返すかどうか。
戻り値
RwkvOutput または tuple(torch.FloatTensor)
RwkvOutput または、torch.FloatTensor のタプル(return_dict=False が渡された場合、または config.return_dict=False の場合)。設定(RwkvConfig)や入力に応じて、さまざまな要素で構成されます。
RwkvModelのforwardメソッドは、__call__特殊メソッドをオーバーライドします。
この関数内でフォワードパスの手順を定義する必要がありますが、その後、この関数ではなく
Moduleインスタンスを呼び出すべきです。前者は前処理と後処理の実行を適切に処理するのに対し、後者はそれらを黙って無視するためです。
last_hidden_state (
torch.FloatTensor、shape(batch_size, sequence_length, hidden_size)、optional) — モデルの最終層の出力における隠れ状態のシーケンス。state(
list、5 つのtorch.FloatTensor、shape は(batch_size, hidden_size, num_hidden_layers))— 最終タイムステップにおけるモデルの状態。次のinput_idsと組み合わせて forward メソッドで使用することで、古いinput_idsを提供することを回避できます。hidden_states (
tuple[torch.FloatTensor, ...]、optional、output_hidden_states=Trueが渡された場合またはconfig.output_hidden_states=Trueの場合に返されます) —torch.FloatTensorのタプル(埋め込み層を持つモデルの場合、埋め込みの出力が 1 つ、各層の出力がそれぞれ 1 つずつ)で、形状は(batch_size, sequence_length, hidden_size)です。各層の出力におけるモデルのHidden-states、および任意の初期埋め込み出力。
attentions (
tuple[torch.FloatTensor, ...]、optional、output_attentions=Trueが渡された場合またはconfig.output_attentions=Trueの場合に返されます)—torch.FloatTensorのタプル(各レイヤーごとに1つ)、形状は(batch_size, num_heads, sequence_length, sequence_length)です。アテンションのsoftmax後のアテンション重み。自己アテンションヘッド内で加重平均を計算するために使用されます。
RwkvLMHeadModel
クラス transformers.RwkvForCausalLM
< source >( config: RwkvConfig )
パラメータ
- config (RwkvConfig) — モデルのすべてのパラメータを含むモデル設定クラスです。設定ファイルで初期化しても、モデルに関連付けられた重みは読み込まれず、設定のみが読み込まれます。モデルの重みをロードするには、from_pretrained() メソッドを参照してください。
RWKV Modelは、入力埋め込みの重みと共有される重みを持つ線形層からなる言語モデリングヘッドを上部に備えたTransformerです。
このモデルは PreTrainedModel を継承しています。すべてのモデルに実装されている汎用的なメソッド(ダウンロードや保存、入力埋め込みのリサイズ、ヘッドのプルーニングなど)については、スーパークラスのドキュメントを参照してください。
このモデルは、PyTorchのtorch.nn.Moduleのサブクラスでもあります。 通常のPyTorch Moduleとして使用し、一般的な使用方法や動作に関する詳細については、PyTorchのドキュメントを参照してください。
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)
パラメータ
- input_ids (
torch.LongTensorの形状(batch_size, input_ids_length)) —input_ids_length=sequence_lengthの場合past_key_valuesがNoneそれ以外の場合past_key_values.get_seq_length()(sequence_lengthの input past key value states の長さ)。語彙における入力シーケンスのトークンインデックス。past_key_valuesを使用する場合、過去が計算されていないinput_idsのみをinput_idsとして渡す必要があります。インデックスはAutoTokenizerを使用して取得できます。詳細については、PreTrainedTokenizer.encode()およびPreTrainedTokenizer.call()を参照してください。
- attention_mask (
torch.LongTensorの形状(batch_size, sequence_length), 、任意) — パディングトークンのインデックスに対するアテンションを回避するためのマスク。[0, 1]:- マスクされていないトークンに対して1
- マスクされたトークンに対しては 0 です。
- inputs_embeds (
torch.FloatTensor、形状(batch_size, sequence_length, hidden_size)、任意) —input_idsを渡す代わりに、埋め込み表現を直接渡すこともできます。これは、モデル内部の埋め込みルックアップ行列よりも、input_idsのインデックスを対応するベクトルに変換する方法をより細かく制御したい場合に有用です。 - state (
tupleof fivetorch.FloatTensorof shape(batch_size, hidden_size, num_hidden_layers), optional) — 指定された場合、モデルはすべてのブロックで前回の状態を使用します(input_idsに対して、モデルがstate_input_ids + input_idsをコンテキストとして追加したかのような出力が得られます)。 - labels (
torch.LongTensor、形状(batch_size, sequence_length)、任意) — 言語モデリング用のラベルです。モデル内部ではラベルがシフトされるため、labels = input_idsと設定できます。インデックスは[-100, 0, ..., config.vocab_size]から選択されます。-100に設定されたすべてのラベルは無視(マスク)され、損失は[0, ..., config.vocab_size]内のラベルに対してのみ計算されます。 - use_cache (
bool、省略可) —Trueに設定すると、最後の状態が返され、次の logits を高速に生成するために使用できます。 - output_attentions (
bool, 省略可) — すべてのアテンション層のアテンションテンソルを返すかどうかを指定します。詳細は、返されるテンソルのattentionsを参照してください。 - output_hidden_states (
bool, 省略可) — すべての層の hidden states を返すかどうかを指定します。詳細は、返されるテンソルのhidden_statesを参照してください。 - return_dict (
bool, 任意) — プレーンなタプルではなく ModelOutput を返すかどうか。 - logits_to_keep (
Union[int, torch.Tensor]、省略可、デフォルトは0) —intの場合、最後のlogits_to_keepトークンについて logits を計算します。0の場合、すべてのinput_idsについて logits を計算します(特殊ケース)。生成には最後のトークンの logits だけで十分であり、そのトークンのみについて計算することでメモリを節約できます。これは、長いシーケンスや大規模な語彙サイズの場合に特に顕著な効果があります。torch.Tensorの場合、シーケンス長次元で保持するインデックスに対応する 1 次元テンソルである必要があります。これは、パックされたテンソル形式(バッチとシーケンス長を単一の次元にまとめた形式)を使用する場合に有用です。
戻り値
RwkvCausalLMOutput または tuple(torch.FloatTensor)
RwkvCausalLMOutput、または torch.FloatTensor のタプル(return_dict=False が渡された場合、または config.return_dict=False の場合)。設定(RwkvConfig)や入力に応じて、さまざまな要素で構成されます。
RwkvForCausalLM の forward メソッドは、__call__ という特殊メソッドをオーバーライドします。
この関数内でフォワードパスの手順を定義する必要がありますが、その後、この関数ではなく
Moduleインスタンスを呼び出すべきです。前者は前処理と後処理の実行を適切に処理するのに対し、後者はそれらを黙って無視するためです。
loss (
torch.FloatTensor、shape(1,)、optional、labelsが指定された場合に返されます) — 言語モデリングの損失(次のトークン予測用)。logits (
torch.FloatTensor、shape(batch_size, sequence_length, config.vocab_size)) — 言語モデリングヘッドの予測スコア(SoftMax 適用前の各語彙トークンのスコア)。state(
list、5つのtorch.FloatTensor、形状(batch_size, hidden_size, num_hidden_layers)) — 最終タイムステップにおけるモデルの状態。次のinput_idsと組み合わせて forward メソッドで使用でき、古いinput_idsを指定することを回避できます。hidden_states (
tuple[torch.FloatTensor, ...]、optional、output_hidden_states=Trueが渡された場合またはconfig.output_hidden_states=Trueの場合に返されます) —torch.FloatTensorのタプル(埋め込み層を持つモデルの場合、埋め込みの出力が 1 つ、各層の出力がそれぞれ 1 つずつ)で、形状は(batch_size, sequence_length, hidden_size)です。各層の出力におけるモデルのHidden-states、および任意の初期埋め込み出力。
attentions (
tuple[torch.FloatTensor, ...]、optional、output_attentions=Trueが渡された場合またはconfig.output_attentions=Trueの場合に返されます)—torch.FloatTensorのタプル(各レイヤーごとに1つ)、形状は(batch_size, num_heads, sequence_length, sequence_length)です。アテンションのsoftmax後のアテンション重み。自己アテンションヘッド内で加重平均を計算するために使用されます。
Rwkvのattentionと再帰式
従来の自己回帰型 Transformer では、アテンションは以下のように表されます。
と $Q$ は 、 は形状が seq_len x hidden_size の行列で、それぞれクエリ、キー、バリューと呼ばれます(実際にはバッチ次元とアテンションヘッド次元を持つより大きな行列ですが、行列積が計算される最後の2次元にのみ注目するため、簡略化のためにこれら2次元のみを考慮します)。積 の形状は seq_len x seq_len となり、 との行列積を計算することで、出力 が得られ、他の行列と同じ形状になります。
softmax をその値で置き換えると、次のようになります:
の項目において、 に対応する $j > i$ の要素はマスクされています(合計は j で打ち切られます)。これは、アテンションが将来のトークンではなく、過去のトークンのみに参照を許可されるためです。
これに対し、RWKV のアテンションは次のように与えられます。
ここで は著者が受容率 (receptance) と呼ぶ新しい行列、 および は依然としてキーとバリューです(ここでは $\sigma$ はシグモイド関数です)。 はトークンの位置を表す新しいベクトルであり、以下のように与えられます
の および は、コード内でそれぞれ time_first および time_decay と呼ばれる学習可能なパラメータです。分子と分母は、どちらも再帰的に表すことができます。これらを および と名付けると、次のようになります。
したがって ((コードでは numerator_state と呼ばれます)は、
および
したがって ((コードでは denominator_state と呼ばれます)は
実際に使用される再帰式は、数値の安定性を保つために大きな数の指数を計算したくないため、わずかに複雑になっています。通常、softmax はそのまま計算されるのではなく、最大項の指数を分子と分母で割ります:
最大値 すべての $x_{j}$ の最大値です。つまり、ここでは分子の状態 ($\hat{N}$) と分母の状態 ($\hat{D}$) を保存するだけでなく、指数関数で遭遇したすべての項の最大値も追跡します。したがって、実際には
以下の再帰式で定義されます:
および
および $M_{j+1} = q$。これらを用いて、次を計算できます
および
これにより最終的に得られるのは
Update on GitHub