Transformers documentation
Audio Spectrogram Transformer
このモデルは2021年4月5日にHF papersで公開され、2022年11月21日にHugging Face Transformersに貢献されました。
Audio Spectrogram Transformer
概要
Audio Spectrogram Transformer モデルは、Yuan Gong、Yu-An Chung、James Glass によって AST: Audio Spectrogram Transformer で提案されました。 Audio Spectrogram Transformer は、オーディオを画像(スペクトログラム)に変換することで、Vision Transformer をオーディオに適用します。このモデルは、オーディオ分類において最先端の結果を達成しています。
論文の抄録は以下の通りです。
過去10年間で、畳み込みニューラルネットワーク(CNN)は、音声スペクトログラムから対応するラベルへの直接的なマッピングを学習することを目的とするエンドツーエンドの音声分類モデルの主要な構成要素として広く採用されてきました。長距離のグローバルなコンテキストをよりよく捉えるために、CNNの上に自己注意機構を追加してCNN-アテンションハイブリッドモデルを構成するという最近のトレンドがあります。しかし、CNNへの依存が本当に必要なのか、また純粋にアテンションに基づくニューラルネットワークだけで音声分類において良好な性能を得られるのかは不明です。本論文では、音声分類のための最初の畳み込みなしで純粋にアテンションに基づくモデルであるAudio Spectrogram Transformer(AST)を導入することで、この問いに答えます。ASTを様々な音声分類ベンチマークで評価したところ、AudioSetで0.485 mAP、ESC-50で95.6%の精度、Speech Commands V2で98.1%の精度という新たな最良の結果(state-of-the-art)を達成しました。
Audio Spectrogram Transformer architecture. Taken from the original paper. このモデルはnielsrによって提供されました。 元のコードはこちらで確認できます。
使用のコツ
- 独自のデータセットで Audio Spectrogram Transformer (AST) をファインチューニングする際は、入力正規化(入力の平均が 0、標準偏差が 0.5 であることを保証する処理)を行うことをお勧めします。ASTFeatureExtractor がこの処理を担当します。なお、デフォルトでは AudioSet の平均と標準偏差が使用されます。著者が下流データセットの統計量をどのように計算しているかは、
ast/src/get_norm_stats.pyを確認してください。 - ASTには低い学習率が必要です(著者は、PSLA論文で提案したCNNモデルと比較して10分の1の学習率を使用しています)。また、収束が速いため、タスクに適した学習率と学習率スケジューラーを検索してください。
Scaled Dot Product Attention (SDPA) の使用
PyTorchには、torch.nn.functionalの一部として、ネイティブのスケーリングドットプロダクトアテンション(SDPA)オペレーターが含まれています。この関数は、入力や使用しているハードウェアに応じて適用できる複数の実装を備えています。詳細については、公式ドキュメントまたはGPU推論ページを参照してください。
torch>=2.1.1 の場合、実装が利用可能な場合はデフォルトで SDPA が使用されますが、from_pretrained() で attn_implementation="sdpa" を設定することで、SDPA の使用を明示的に指定することもできます。
from transformers import ASTForAudioClassification
model = ASTForAudioClassification.from_pretrained("MIT/ast-finetuned-audioset-10-10-0.4593", attn_implementation="sdpa", device_map="auto")
...最大限の高速化を実現するには、モデルを半精度(例: torch.float16 または torch.bfloat16)で読み込むことをお勧めします。
ローカル環境でのベンチマーク(A100-40GB、PyTorch 2.3.0、OS Ubuntu 22.04)において、float32 と MIT/ast-finetuned-audioset-10-10-0.4593 モデルを使用した場合、推論時に以下の速度向上を確認しました。
| バッチサイズ | 平均推論時間 (ms)、eager モード | 平均推論時間 (ms)、sdpa モデル | Speed up, Sdpa / Eager (x) |
|---|---|---|---|
| 1 | 27 | 6 | 4.5 |
| 2 | 12 | 6 | 2 |
| 4 | 21 | 8 | 2.62 |
| 8 | 40 | 14 | 2.86 |
リソース
Audio Spectrogram Transformer の入門を支援するための、Hugging Face 公式およびコミュニティ(🌎 で示す)のリソースのリストです。
- 音声分類におけるASTを用いた推論を示すノートブックは、こちらで確認できます。
- ASTForAudioClassification は、この ノートブック でサポートされています。
- 関連項目: 音声分類。
ここにリソースを掲載していただくことを希望される場合は、Pull Request を開いてください。レビューいたします。リソースは、既存のリソースと重複するのではなく、新しいものを示すことが望ましいです。
ASTConfig
クラス transformers.ASTConfig
< 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 = Nonehidden_size: int = 768num_hidden_layers: int = 12num_attention_heads: int = 12intermediate_size: int = 3072hidden_act: str = 'gelu'hidden_dropout_prob: float | int = 0.0attention_probs_dropout_prob: float | int = 0.0initializer_range: float = 0.02layer_norm_eps: float = 1e-12patch_size: int | list[int] | tuple[int, int] = 16qkv_bias: bool = Truefrequency_stride: int = 10time_stride: int = 10max_length: int = 1024num_mel_bins: int = 128 )
パラメータ
- hidden_size (
int、任意、デフォルトは768) — 隠れ表現の次元数。 - num_hidden_layers (
int、任意、デフォルトは12) — Transformer デコーダーの隠れ層の数。 - num_attention_heads (
int、任意、デフォルトは12) — Transformerデコーダーの各アテンション層におけるアテンションヘッドの数。 - intermediate_size (
int、任意、デフォルトは3072) — MLP 表現の次元数。 - hidden_act (
str、任意、デフォルトはgelu) — デコーダーで使用する非線形活性化関数(関数または文字列)。例えば、"gelu"、"relu"、"silu"など。 - hidden_dropout_prob (
Union[float, int]、任意、デフォルト値は0.0) — embeddings、encoder、pooler 内のすべての全結合層における dropout 確率です。 - attention_probs_dropout_prob (
Union[float, int]、任意、デフォルトは0.0) — アテンション確率のドロップアウト率です。 - initializer_range (
float、任意、デフォルトは0.02) — すべての重み行列を初期化するための truncated_normal_initializer の標準偏差です。 - layer_norm_eps (
float、任意、デフォルトは1e-12) — レイヤーノーマル層で使用する epsilon です。 - patch_size (
Union[int, list[int], tuple[int, int]]、任意、デフォルトは16) — 各パッチのサイズ(解像度)です。 - qkv_bias (
bool、省略可、デフォルトはTrue) — クエリ、キー、バリューにバイアスを追加するかどうか。 - frequency_stride (
int、任意、デフォルトは 10)— スペクトログラムをパッチ化する際に使用する周波数方向のストライド。 - time_stride (
int、任意、デフォルト値は 10)— スペクトログラムをパッチ化する際に使用する時間方向のストライドです。 - max_length (
int、任意、デフォルトは 1024) — スペクトログラムの時間軸の次元です。 - num_mel_bins (
int, 任意、デフォルトは128) — 入力フレームごとに使用される mel 特徴の数を指定します。AutoFeatureExtractorクラスで使用された値と一致させる必要があります。
これは、Audio Spectrogram Transformerモデルの設定を保存するための設定クラスです。指定された引数に基づいて Audio Spectrogram Transformer モデルをインスタンス化し、モデルのアーキテクチャを定義するために使用されます。デフォルト値で設定をインスタンス化すると、MIT/ast-finetuned-audioset-10-10-0.4593 と同様の設定が得られます。
設定オブジェクトはPreTrainedConfigを継承し、モデルの出力を制御するために使用できます。詳細については、PreTrainedConfigのドキュメントを参照してください。
例:
>>> from transformers import ASTConfig, ASTModel
>>> # Initializing a AST MIT/ast-finetuned-audioset-10-10-0.4593 style configuration
>>> configuration = ASTConfig()
>>> # Initializing a model (with random weights) from the MIT/ast-finetuned-audioset-10-10-0.4593 style configuration
>>> model = ASTModel(configuration)
>>> # Accessing the model configuration
>>> configuration = model.configASTFeatureExtractor
class transformers.ASTFeatureExtractor
< source >( feature_size = 1sampling_rate = 16000num_mel_bins = 128max_length = 1024padding_value = 0.0do_normalize = Truemean = -4.2677393std = 4.5689974return_attention_mask = False**kwargs )
パラメータ
- feature_size (
int、任意、デフォルトは 1) — 抽出された特徴量の次元数。 - sampling_rate (
int、任意、デフォルトは 16000) — オーディオファイルをデジタル化するためのサンプリングレート(ヘルツ (Hz) 表記)。 - num_mel_bins (
int、任意、デフォルト値は 128) — Mel 周波数ビンの数。 - max_length (
int、任意、デフォルトは 1024) — 抽出された特徴量をパディングまたは切り詰める際の最大長です。 - do_normalize (
bool、任意、デフォルトはTrue) —meanとstdを用いて log-Mel 特徴を正規化するか否かを指定します。 - mean (
float、任意、デフォルト値: -4.2677393) — log-Mel 特徴量を正規化するために使用される平均値です。デフォルトでは AudioSet の平均値を使用します。 - std (
float、任意、デフォルト値は 4.5689974) — log-Mel 特徴量を正規化するために使用する標準偏差の値です。デフォルトでは AudioSet の標準偏差を使用します。 - return_attention_mask (
bool、任意、デフォルトはFalse) — call() がattention_maskを返すかどうか。
Audio Spectrogram Transformer (AST) の特徴抽出器を構築します。
このフィーチャーエクストラクターは、主要なメソッドの大部分を含む SequenceFeatureExtractor を継承しています。これらのメソッドに関する詳細については、このスーパークラスを参照してください。
このクラスは、TorchAudioがインストールされている場合はTorchAudioを使用し、そうでない場合はnumpyを使用して、生音声からメルフィルタバンク特徴量を抽出します。その後、固定長にパディングまたは切り詰め、平均と標準偏差を用いて正規化します。
__call__
< source >( raw_speech: numpy.ndarray | list[float] | list[numpy.ndarray] | list[list[float]]sampling_rate: int | None = Nonereturn_tensors: str | transformers.utils.generic.TensorType | None = None**kwargs )
パラメータ
- raw_speech (
np.ndarray、list[float]、list[np.ndarray]、list[list[float]]) — パディング対象のシーケンスまたはシーケンスのバッチです。各シーケンスは、NumPy 配列、浮動小数点数の値のリスト、NumPy 配列のリスト、または浮動小数点数の値のリストのリストであることができます。モノラル音声(ステレオではなく、タイムステップごとに単一の浮動小数点数)である必要があります。 - sampling_rate (
int, 任意) —raw_speech入力がサンプリングされたレートです。サイレントエラーを防ぐため、forward 呼び出し時にsampling_rateを渡すことを強く推奨します。 - return_tensors (
strまたは TensorType, 省略可) — 設定すると、Python の整数のリストではなくテンソルを返します。指定可能な値は以下の通りです:'pt': PyTorchのtorch.Tensorオブジェクトを返します。'np': Numpy のnp.ndarrayオブジェクトを返します。
1つ以上のシーケンスを特徴量化し、モデル用に準備するための主要なメソッド。
ASTModel
class transformers.ASTModel
< source >( config: ASTConfig )
パラメータ
- config (ASTConfig) — モデルのすべてのパラメータを含むモデル設定クラスです。設定ファイルで初期化しても、モデルに関連付けられた重みは読み込まれず、設定のみが読み込まれます。モデルの重みをロードするには、from_pretrained() メソッドを参照してください。
特定のヘッドを上に配置せず、生のhidden-statesを出力する、素のAudio Spectrogram Transformer Modelです。
このモデルは PreTrainedModel を継承しています。すべてのモデルに実装されている汎用的なメソッド(ダウンロードや保存、入力埋め込みのリサイズ、ヘッドのプルーニングなど)については、スーパークラスのドキュメントを参照してください。
このモデルは、PyTorchのtorch.nn.Moduleのサブクラスでもあります。 通常のPyTorch Moduleとして使用し、一般的な使用方法や動作に関する詳細については、PyTorchのドキュメントを参照してください。
forward
< source >( input_values: typing.Optional[torch.Tensor] = Noneattention_mask: typing.Optional[torch.Tensor] = None**kwargs: *<class 'transformers.utils.generic.TransformersKwargs'> ) → BaseModelOutputWithPooling or tuple(torch.Tensor)
パラメータ
- input_values (
torch.Tensor、shape(batch_size, max_length, num_mel_bins)) — 生のオーディオ波形から抽出されたメル特徴量の浮動小数点値です。生のオーディオ波形は、.flacまたは.wavのオーディオファイルをlist[float]、numpy.ndarray、またはtorch.Tensor型の配列として読み込むことで取得できます。例えば、torchcodec ライブラリ(pip install torchcodec)や soundfile ライブラリ(pip install soundfile)を通じて行います。 配列をinput_featuresに変換するには、メル特徴量の抽出、パディング、およびtorch.Tensor型への変換を行うために AutoFeatureExtractor を使用してください。 call() を参照してください。 - attention_mask (
torch.Tensorの形状(batch_size, sequence_length), 、任意) — パディングトークンのインデックスに対するアテンションを回避するためのマスク。[0, 1]:- マスクされていないトークンに対して1
- マスクされたトークンに対しては 0 です。
戻り値
BaseModelOutputWithPooling または tuple(torch.Tensor)
torch.Tensor のタプル(return_dict=False が渡された場合、または config.return_dict=False の場合)または BaseModelOutputWithPooling。設定(ASTConfig)と入力に応じて、さまざまな要素で構成されます。
ASTModelのforwardメソッドは、__call__特殊メソッドをオーバーライドします。
この関数内でフォワードパスの手順を定義する必要がありますが、その後、この関数ではなく
Moduleインスタンスを呼び出すべきです。前者は前処理と後処理の実行を適切に処理するのに対し、後者はそれらを黙って無視するためです。
last_hidden_state (
torch.Tensor、形状(batch_size, sequence_length, hidden_size)) — モデルの最終層の出力における隠れ状態のシーケンス。pooler_output (
torch.Tensor、shape(batch_size, hidden_size)) — シーケンスの最初のトークン(分類トークン)の最終層の隠れ状態を、補助的な事前学習タスクに使用される層でさらに処理した後の出力。例えば、BERT系のモデルでは、線形層とtanh活性化関数を経て処理された分類トークンを返します。この線形層の重みは、事前学習中の次の文予測(分類)目的から学習されます。hidden_states (
tuple(torch.Tensor)、optional、output_hidden_states=Trueが渡された場合またはconfig.output_hidden_states=Trueの場合に返されます) —torch.Tensorのタプル(埋め込み層を持つモデルの場合、埋め込みの出力が 1 つ、各層の出力がそれぞれ 1 つずつ)で、形状は(batch_size, sequence_length, hidden_size)です。各層の出力におけるモデルのHidden-states、および任意の初期埋め込み出力。
attentions (
tuple(torch.Tensor)、optional、output_attentions=Trueが渡された場合またはconfig.output_attentions=Trueの場合に返されます) —torch.Tensorのタプル(各レイヤーごとに1つ)、形状は(batch_size, num_heads, sequence_length, sequence_length)。アテンションのsoftmax後のアテンション重み。自己アテンションヘッド内で加重平均を計算するために使用されます。
ASTForAudioClassification
class transformers.ASTForAudioClassification
< source >( config: ASTConfig )
パラメータ
- config (ASTConfig) — モデルのすべてのパラメータを含むモデル設定クラスです。設定ファイルで初期化しても、モデルに関連付けられた重みは読み込まれず、設定のみが読み込まれます。モデルの重みをロードするには、from_pretrained() メソッドを参照してください。
Audio Spectrogram Transformer モデルの上部に音声分類ヘッド(プーリングされた出力の上に配置された線形層)を備えたモデル。AudioSet や Speech Commands v2 などのデータセット向けに使用できます。
このモデルは PreTrainedModel を継承しています。すべてのモデルに実装されている汎用的なメソッド(ダウンロードや保存、入力埋め込みのリサイズ、ヘッドのプルーニングなど)については、スーパークラスのドキュメントを参照してください。
このモデルは、PyTorchのtorch.nn.Moduleのサブクラスでもあります。 通常のPyTorch Moduleとして使用し、一般的な使用方法や動作に関する詳細については、PyTorchのドキュメントを参照してください。
forward
< source >( input_values: typing.Optional[torch.Tensor] = Nonelabels: typing.Optional[torch.Tensor] = Noneattention_mask: typing.Optional[torch.Tensor] = None**kwargs: *<class 'transformers.utils.generic.TransformersKwargs'> ) → SequenceClassifierOutput or tuple(torch.Tensor)
パラメータ
- input_values (
torch.Tensor、shape(batch_size, max_length, num_mel_bins)) — 生のオーディオ波形から抽出されたメル特徴量の浮動小数点値です。生のオーディオ波形は、.flacまたは.wavのオーディオファイルをlist[float]、numpy.ndarray、またはtorch.Tensor型の配列として読み込むことで取得できます。例えば、torchcodec ライブラリ(pip install torchcodec)や soundfile ライブラリ(pip install soundfile)を通じて行います。 配列をinput_featuresに変換するには、メル特徴量の抽出、パディング、およびtorch.Tensor型へのテンソル変換を行うために AutoFeatureExtractor を使用してください。 call() を参照してください。 - labels (
torch.LongTensor、shape(batch_size,)、任意) — 音声分類/回帰の損失を計算するためのラベル。インデックスは[0, ..., config.num_labels - 1]の範囲である必要があります。config.num_labels == 1の場合は回帰損失(Mean-Square loss)が計算され、config.num_labels > 1の場合は分類損失(Cross-Entropy)が計算されます。 - attention_mask (
torch.Tensorの形状(batch_size, sequence_length), 、任意) — パディングトークンのインデックスに対するアテンションを回避するためのマスク。[0, 1]:- マスクされていないトークンに対して1
- マスクされたトークンに対しては 0 です。
戻り値
SequenceClassifierOutput または tuple(torch.Tensor)
torch.Tensor のタプル、または SequenceClassifierOutput(return_dict=False が渡された場合、または config.return_dict=False の場合)。設定(ASTConfig)と入力に応じて、さまざまな要素で構成されます。
ASTForAudioClassificationのforwardメソッドは、__call__特殊メソッドをオーバーライドします。
この関数内でフォワードパスの手順を定義する必要がありますが、その後、この関数ではなく
Moduleインスタンスを呼び出すべきです。前者は前処理と後処理の実行を適切に処理するのに対し、後者はそれらを黙って無視するためです。
loss (
torch.Tensor、shape(1,)、optional、labelsが指定された場合に返されます) — 分類損失(config.num_labels==1 の場合は回帰損失)。logits (
torch.Tensor、形状(batch_size, config.num_labels)) — SoftMax 適用前の分類(または config.num_labels==1 の場合は回帰)スコア。hidden_states (
tuple(torch.Tensor)、optional、output_hidden_states=Trueが渡された場合またはconfig.output_hidden_states=Trueの場合に返されます) —torch.Tensorのタプル(埋め込み層を持つモデルの場合、埋め込みの出力が 1 つ、各層の出力がそれぞれ 1 つずつ)で、形状は(batch_size, sequence_length, hidden_size)です。各層の出力におけるモデルのHidden-states、および任意の初期埋め込み出力。
attentions (
tuple(torch.Tensor)、optional、output_attentions=Trueが渡された場合またはconfig.output_attentions=Trueの場合に返されます) —torch.Tensorのタプル(各レイヤーごとに1つ)、形状は(batch_size, num_heads, sequence_length, sequence_length)。アテンションのsoftmax後のアテンション重み。自己アテンションヘッド内で加重平均を計算するために使用されます。
例:
>>> from transformers import AutoFeatureExtractor, ASTForAudioClassification
>>> from datasets import load_dataset
>>> import torch
>>> dataset = load_dataset("hf-internal-testing/librispeech_asr_demo", "clean", split="validation")
>>> dataset = dataset.sort("id")
>>> sampling_rate = dataset.features["audio"].sampling_rate
>>> feature_extractor = AutoFeatureExtractor.from_pretrained("MIT/ast-finetuned-audioset-10-10-0.4593")
>>> model = ASTForAudioClassification.from_pretrained("MIT/ast-finetuned-audioset-10-10-0.4593")
>>> # audio file is decoded on the fly
>>> inputs = feature_extractor(dataset[0]["audio"]["array"], sampling_rate=sampling_rate, return_tensors="pt")
>>> with torch.no_grad():
... logits = model(**inputs).logits
>>> predicted_class_ids = torch.argmax(logits, dim=-1).item()
>>> predicted_label = model.config.id2label[predicted_class_ids]
>>> predicted_label
...
>>> # compute loss - target_label is e.g. "down"
>>> target_label = model.config.id2label[0]
>>> inputs["labels"] = torch.tensor([model.config.label2id[target_label]])
>>> loss = model(**inputs).loss
>>> round(loss.item(), 2)
...