メインコンテンツ

selfAttentionLayer

self-attention 層

R2023a 以降

    説明

    self-attention 層は、入力の single-head または multihead の self-attention を計算します。

    この層は以下を行います。

    1. 入力から query、key、および value を計算する

    2. query、key、および value を使用して、head 全体でスケールされた dot-product attention を計算する

    3. head からの結果をマージする

    4. マージされた結果に対して線形変換を実行する

    作成

    説明

    layer = selfAttentionLayer(numHeads,numQueryChannels) は、指定された数の head と query チャネルをもつ self-attention 層を作成します。

    layer = selfAttentionLayer(numHeads,numQueryChannels,Name=Value) は、1 つ以上の名前と値の引数を使用して、書き込み可能なプロパティを設定します。たとえば、selfAttentionLayer(3,12,DropoutProbability=0.1) は、3 つの head と 12 個の query チャネルをもつ self-attention 層を作成し、DropoutProbability プロパティを 0.1 に設定します。

    入力引数

    すべて展開する

    この プロパティ は読み取り専用です。

    attention head 数。正の整数として指定します。

    各 head は入力に対して個別の線形変換を実行し、attention の重みを独立して計算します。層はこれらの attention 重みを使用して入力表現の重み付き和を計算し、コンテキスト ベクトルを生成します。head の数を増やすと、モデルはさまざまな種類の依存関係を捉え、入力のさまざまな部分に同時に注意を向けることができるようになります。head の数を減らすと、層の計算コストを削減できます。

    numHeads の値は numQueryChannels を均等に割り切る数でなければなりません。

    この引数は NumHeads プロパティを設定します。

    データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

    query のチャネル数。正の整数として指定します。

    numQueryChannels の値は numHeads で割り切れなければなりません。

    この引数は NumQueryChannels プロパティを設定します。 (R2026a 以降)

    データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

    プロパティ

    すべて展開する

    Self-Attention

    このプロパティは、オブジェクト作成後、読み取り専用になります。SelfAttentionLayer オブジェクトを作成する場合、このプロパティを設定するには、対応する位置入力の引数を使用します。

    attention head 数。正の整数として指定します。

    各 head は入力に対して個別の線形変換を実行し、attention の重みを独立して計算します。層はこれらの attention 重みを使用して入力表現の重み付き和を計算し、コンテキスト ベクトルを生成します。head の数を増やすと、モデルはさまざまな種類の依存関係を捉え、入力のさまざまな部分に同時に注意を向けることができるようになります。head の数を減らすと、層の計算コストを削減できます。

    データ型: double

    R2026a 以降

    このプロパティは、オブジェクト作成後、読み取り専用になります。SelfAttentionLayer オブジェクトを作成する場合、このプロパティを設定するには、対応する位置入力の引数を使用します。

    query のチャネル数。正の整数として指定します。

    データ型: double

    R2026a 以降

    このプロパティは、オブジェクト作成後、読み取り専用になります。SelfAttentionLayer オブジェクトを作成する場合、このプロパティを設定するには、対応する名前と値の引数を使用します。

    query グループの数 (key-value head の数と同じ)。正の整数として指定します。NumQueryGroups の値は NumQueryChannels を割り切る数でなければなりません。

    NumQueryGroups の値によって、attention 演算のタイプを次のように指定します。

    • multihead attention の場合は、NumQueryGroupsnumHeads に設定する。

    • multiquery attention (MQA) の場合は、NumQueryGroups1 に設定する。

    • grouped-query attention (GQA) の場合は、NumQueryGroups1numHeads の正の整数に設定する。

    query グループの数が 1 より大きい場合、この演算によって、head ごとに query チャネルのグループが作成され、各グループ内で attention 演算が適用されます。

    たとえば、3 つの query グループをもつ 6 つの head の場合、この演算によって query チャネルは head (h1、…、h6) に分割され、head グループ g1=(h1,h2)g2=(h3,h4)、および g3=(h5,h6) が作成されます。この演算によって、key と value のチャネルも head g1g2、および g3 に分割されます。

    query グループの数が head の数と一致する場合、各グループは head を 1 つずつもち、multihead attention と同等になります。query グループの数が 1 である場合、すべての head が同じグループに属し、multiquery attention と同等になります。

    既定値は NumHeads プロパティ値です。プログラムで query グループの数を head の数に設定するには、層の作成時に名前と値の引数 NumQueryGroups"num-heads" に設定します。

    データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | char | string

    この プロパティ は読み取り専用です。

    key のチャネル数。正の整数として指定します。

    層は、key のチャネル数として NumQueryChannels*NumQueryGroups/NumHeads を使用します。 (R2026a 以降)

    R2026a より前: 層は、key のチャネル数として numQueryChannels を使用します。これは、query グループの数が head の数と一致する場合と等価です。

    データ型: double

    このプロパティは、オブジェクト作成後、読み取り専用になります。SelfAttentionLayer オブジェクトを作成する場合、このプロパティを設定するには、対応する名前と値の引数を使用します。

    value のチャネル数。次のいずれかの値として指定します。

    • "auto"NumKeyChannels を使用します。

    • 正の整数 — 指定された数のチャネルを使用します。この値は NumHeads で割り切れなければなりません。

    データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | char | string

    このプロパティは、オブジェクト作成後、読み取り専用になります。SelfAttentionLayer オブジェクトを作成する場合、このプロパティを設定するには、対応する名前と値の引数を使用します。

    層出力のチャネル数。次のいずれかの値として指定します。

    • "auto" — 層入力のチャネル数を使用します。

    • 正の整数 — 指定された数のチャネルを使用します。

    データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | char | string

    このプロパティは、オブジェクト作成後、読み取り専用になります。SelfAttentionLayer オブジェクトを作成する場合、このプロパティを設定するには、対応する名前と値の引数を使用します。

    層にパディング マスクを表す入力があるかどうかを示すフラグ。0 (false) または 1 (true) として指定します。

    HasPaddingMaskInput プロパティが 0 (false) の場合、層は、入力データに対応する "in" という名前の 1 つの入力をもちます。この場合、層はすべての要素をデータとして扱います。

    HasPaddingMaskInput プロパティが 1 (true) の場合、層は、それぞれ入力データおよびマスクに対応する "in" および "mask" という名前の 2 つの入力をもちます。この場合、パディング マスクは 1 と 0 から成る配列になります。層は、入力の要素について、マスク内の対応する要素が 1 の場合は使用し、0 の場合は無視します。

    パディング マスクの次元ラベルは、入力データの次元ラベルと一致していなければなりません ("C" (チャネル) 次元および "U" (未指定) 次元は無視されます)。 (R2026a 以降)

    R2026a より前: パディング マスクの形式は入力データの形式と一致していなければなりません。

    パディング マスクの "S" (空間) 次元または "T" (時間) 次元のサイズは、入力内の対応する次元のサイズ、および KeyState プロパティと ValueState プロパティにおける 2 番目の次元のサイズの合計と一致していなければなりません。パディング マスクの "B" (バッチ) 次元のサイズは、入力内の対応する次元のサイズと一致していなければなりません。

    パディング マスクには任意の数のチャネルを含めることができます。ソフトウェアは、最初のチャネルの value をパディング値の表示にのみ使用します。

    このプロパティは、オブジェクト作成後、読み取り専用になります。SelfAttentionLayer オブジェクトを作成する場合、このプロパティを設定するには、対応する名前と値の引数を使用します。

    key と value のペアの要素に注意を払うことを抑制するマスク。次のいずれかの値として指定します。

    • "none" — 位置に基づいて要素に注意を払うことを抑制しません。HasPaddingMaskInput1 (true) だった場合、層はパディング要素のみに注意を払うことを抑制します。

    • "causal" — 位置 M の要素が位置 N の要素に対して注意を払うことを抑制します (ここで、NM より大きい)。このオプションは自己回帰モデルに使用します。

    attention スコアをドロップアウトする確率。範囲 [0, 1) のスカラーとして指定します。

    学習中、ソフトウェアは指定された確率を使用して、attention スコアの値をランダムにゼロに設定します。これらのドロップアウトにより、モデルが特定の依存関係に過度に依存することを防ぎ、より堅牢で一般化可能な表現を学習できるようになります。

    データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

    このプロパティは、オブジェクト作成後、読み取り専用になります。SelfAttentionLayer オブジェクトを作成する場合、このプロパティを設定するには、対応する名前と値の引数を使用します。

    層にスコア (attention の重みとも呼ばれる) を表す出力があるかどうかを示すフラグ。0 (false) または 1 (true) として指定します。

    HasScoresOutput プロパティが 0 (false) の場合、層は、出力データに対応する "out" という名前の 1 つの出力をもちます。

    HasScoresOutput プロパティが 1 (true) の場合、層は、それぞれ出力データおよび attention スコアに対応する "out" および "scores" という名前の 2 つの入力をもちます。

    この プロパティ は読み取り専用です。

    入力チャネル数。次のいずれかの値として指定します。

    • "auto" — ネットワークの初期化時に入力チャネルの数を自動的に決定します。

    • 正の整数 — 指定された数の入力チャネルの層を構成します。InputSize と層入力データのチャネル数は一致しなければなりません。

    データ型: double | char

    パラメーターと初期化

    query、key、value、および出力の重みを初期化する関数。次のいずれかの値として指定します。

    • "glorot" — Glorot 初期化子[2] (Xavier 初期化子とも呼ばれる) を使用して重みを初期化します。Glorot 初期化子は、平均 0、分散 2/(numIn + numOut) の一様分布から個別にサンプリングを行います。numInnumOut の value は重み行列によって決まります。

      重みnumInnumOut
      QueryInputSizeNumQueryChannels
      KeyInputSizeNumKeyChannels
      ValueInputSizeNumValueChannels
      出力NumValueChannelsOutputSize

    • "he" — He 初期化子[3]を使用して重みを初期化します。He 初期化子は、平均 0、分散 2/numIn の正規分布からサンプリングを行います。numInnumOut の value は重み行列によって決まります。

      重みnumInnumOut
      QueryInputSizeNumQueryChannels
      KeyInputSizeNumKeyChannels
      ValueInputSizeNumValueChannels
      出力NumValueChannelsOutputSize

    • "narrow-normal" — 平均 0、標準偏差 0.01 の正規分布から個別にサンプリングを行って、重みを初期化します。

    • "zeros" — 0 で重みを初期化します。

    • "ones" — 1 で重みを初期化します。

    • 関数ハンドル — カスタム関数で重みを初期化します。関数ハンドルを指定する場合、関数の構文は weights = func(sz) という形式でなければなりません。ここで、sz は重みのサイズです。例については、カスタム重み初期化関数の指定を参照してください。

    層は、対応する重みプロパティが空の場合にのみ重みを初期化します。

    SelfAttentionLayer オブジェクトは、このプロパティを文字ベクトルまたは関数ハンドルとして格納します。

    データ型: char | string | function_handle

    query、key、value、および出力のバイアスを初期化する関数。次のいずれかの値として指定します。

    • "zeros" — 0 でバイアスを初期化します。

    • "ones" — 1 でバイアスを初期化します。

    • "narrow-normal" — 平均 0、標準偏差 0.01 の正規分布から個別にサンプリングを行って、バイアスを初期化します。

    • 関数ハンドル — カスタム関数でバイアスを初期化します。関数ハンドルを指定する場合、関数は bias = func(sz) という形式でなければなりません。ここで、sz はバイアスのサイズです。

    層は、対応するバイアス プロパティが空の場合にのみバイアスを初期化します。

    SelfAttentionLayer オブジェクトは、このプロパティを文字ベクトルまたは関数ハンドルとして格納します。

    データ型: char | string | function_handle

    query の重み。NumQueryChannelsnumInputChannels 列の行列または [] として指定します。ここで、numInputChannels は層入力内のチャネル数です。

    データ型: single | double

    key の重み。NumKeyChannelsnumInputChannels 列の行列または [] として指定します。ここで、numInputChannels は層入力内のチャネル数です。

    データ型: single | double

    value の重み。NumValueChannelsnumInputChannels 列の行列または [] として指定します。ここで、numInputChannels は層入力内のチャネル数です。

    データ型: single | double

    出力の重み。OutputSizeNumValueChannels 列の行列または [] として指定します。

    データ型: single | double

    query のバイアス。NumQueryChannels1 列のベクトルまたは [] として指定します。

    データ型: single | double

    key のバイアス。NumKeyChannels1 列のベクトルまたは [] として指定します。

    データ型: single | double

    value のバイアス。NumValueChannels1 列のベクトルまたは [] として指定します。

    データ型: single | double

    出力のバイアス。OutputSize1 列のベクトルまたは [] として指定します。

    データ型: single | double

    状態

    R2026a 以降

    key の状態。NumKeyChannels×x×b の数値配列または [] として指定します。ここで、b は入力の "B" (バッチ) 次元のサイズであり、x は任意の値とすることができます。

    AttentionMask プロパティが "causal" に設定された SelfAttentionLayer オブジェクトを含むネットワークの状態を更新すると、KeyState プロパティには、ネットワークの以前のフォワード パスで使用された key が格納されます。AttentionMask"none" である場合、KeyState プロパティは空でなければなりません。

    このプロパティを手動で設定した後に resetState 関数を呼び出すと、key の状態がこの値に設定されます。

    データ型: single | double

    R2026a 以降

    value の状態。NumValueChannels×x×b の数値配列または [] として指定します。ここで、b は入力の "B" (バッチ) 次元のサイズであり、x は任意の値とすることができます。

    AttentionMask プロパティが "causal" に設定された SelfAttentionLayer を含むネットワークの状態を更新すると、このプロパティには、ネットワークの以前のフォワード パスで使用された値が格納されます。AttentionMask"none" である場合、ValueState プロパティは空でなければなりません。

    このプロパティを手動で設定した後に resetState 関数を呼び出すと、value の状態がこの値に設定されます。

    データ型: single | double

    学習率および正則化

    query、key、value、および出力の重みの学習率係数。非負のスカラーとして指定します。

    この係数にグローバル学習率が乗算されて、この層の重みの学習率が決定されます。たとえば、WeightLearnRateFactor2 の場合、この層の重みの学習率は現在のグローバル学習率の 2 倍になります。関数 trainingOptions で指定した設定に基づいて、グローバル学習率が決定されます。

    データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

    query、key、value、および出力のバイアスの学習率係数。非負のスカラーとして指定します。

    この係数にグローバル学習率が乗算されて、この層のバイアスの学習率が決定されます。たとえば、BiasLearnRateFactor2 の場合、層のバイアスの学習率は現在のグローバル学習率の 2 倍になります。関数 trainingOptions で指定した設定に基づいて、グローバル学習率が決定されます。

    データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

    query、key、value、および出力の重みの L2 正則化係数。非負のスカラーとして指定します。

    この係数にグローバル L2 正則化係数が乗算されて、この層の重みの L2 正則化が決定されます。たとえば、WeightL2Factor2 の場合、この層の重みの L2 正則化はグローバル L2 正則化係数の 2 倍になります。グローバル L2 正則化係数は、関数 trainingOptions を使用して指定できます。

    データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

    query、key、value、および出力のバイアスの L2 正則化係数。非負のスカラーとして指定します。

    この係数にグローバル L2 正則化係数が乗算されて、この層のバイアスの L2 正則化が決定されます。たとえば、BiasL2Factor2 の場合、この層のバイアスの L2 正則化はグローバル L2 正則化係数の 2 倍になります。関数 trainingOptions で指定した設定に基づいて、グローバル L2 正則化係数が決定されます。

    データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

    層の名前。文字ベクトルとして指定します。Layer 配列入力の場合、trainnet 関数および dlnetwork 関数は、名前のない層に自動的に名前を割り当てます。

    データ型: char

    この プロパティ は読み取り専用です。

    層への入力の数。1 または 2 として返されます。

    HasPaddingMaskInput プロパティが 0 (false) の場合、層は、入力データに対応する "in" という名前の 1 つの入力をもちます。この場合、層はすべての要素をデータとして扱います。

    HasPaddingMaskInput プロパティが 1 (true) の場合、層は、それぞれ入力データおよびマスクに対応する "in" および "mask" という名前の 2 つの入力をもちます。この場合、パディング マスクは 1 と 0 から成る配列になります。層は、入力の要素について、マスク内の対応する要素が 1 の場合は使用し、0 の場合は無視します。

    データ型: double

    この プロパティ は読み取り専用です。

    層の入力名。文字ベクトルの cell 配列として返されます。

    HasPaddingMaskInput プロパティが 0 (false) の場合、層は、入力データに対応する "in" という名前の 1 つの入力をもちます。この場合、層はすべての要素をデータとして扱います。

    HasPaddingMaskInput プロパティが 1 (true) の場合、層は、それぞれ入力データおよびマスクに対応する "in" および "mask" という名前の 2 つの入力をもちます。この場合、パディング マスクは 1 と 0 から成る配列になります。層は、入力の要素について、マスク内の対応する要素が 1 の場合は使用し、0 の場合は無視します。

    SelfAttentionLayer オブジェクトは、このプロパティを文字ベクトルの cell 配列として格納します。

    この プロパティ は読み取り専用です。

    層の出力の数。

    HasScoresOutput プロパティが 0 (false) の場合、層は、出力データに対応する "out" という名前の 1 つの出力をもちます。

    HasScoresOutput プロパティが 1 (true) の場合、層は、それぞれ出力データおよび attention スコアに対応する "out" および "scores" という名前の 2 つの入力をもちます。

    データ型: double

    この プロパティ は読み取り専用です。

    層の出力名。

    HasScoresOutput プロパティが 0 (false) の場合、層は、出力データに対応する "out" という名前の 1 つの出力をもちます。

    HasScoresOutput プロパティが 1 (true) の場合、層は、それぞれ出力データおよび attention スコアに対応する "out" および "scores" という名前の 2 つの入力をもちます。

    SelfAttentionLayer オブジェクトは、このプロパティを文字ベクトルの cell 配列として格納します。

    すべて折りたたむ

    head 数 8、key と query のチャネル数 256 の self-attention 層を作成します。

    layer = selfAttentionLayer(8,256)
    layer = 
      SelfAttentionLayer with properties:
    
                       Name: ''
              AttentionMask: 'none'
        HasPaddingMaskInput: 0
            HasScoresOutput: 0
    
       Hyperparameters
                  InputSize: 'auto'
                   NumHeads: 8
             NumQueryGroups: 8
           NumQueryChannels: 256
             NumKeyChannels: 256
           NumValueChannels: 'auto'
                 OutputSize: 'auto'
         DropoutProbability: 0
    
       Learnable Parameters
               QueryWeights: []
                 KeyWeights: []
               ValueWeights: []
              OutputWeights: []
                  QueryBias: []
                    KeyBias: []
                  ValueBias: []
                 OutputBias: []
    
       State Parameters
                   KeyState: []
                 ValueState: []
    
      Show all properties
    
    

    層配列に self-attention 層を含めます。

    layers = [
        sequenceInputLayer(12)
        selfAttentionLayer(4,12)
        layerNormalizationLayer
        fullyConnectedLayer(9)
        softmaxLayer];

    アルゴリズム

    すべて展開する

    参照

    [1] Vaswani, Ashish, Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N. Gomez, Łukasz Kaiser, and Illia Polosukhin. "Attention is all you need." In Advances in Neural Information Processing Systems, Vol. 30. Curran Associates, Inc., 2017. https://papers.nips.cc/paper_files/paper/2017/hash/3f5ee243547dee91fbd053c1c4a845aa-Abstract.html.

    [2] Glorot, Xavier, and Yoshua Bengio. "Understanding the Difficulty of Training Deep Feedforward Neural Networks." In Proceedings of the Thirteenth International Conference on Artificial Intelligence and Statistics, 249–356. Sardinia, Italy: AISTATS, 2010. https://proceedings.mlr.press/v9/glorot10a/glorot10a.pdf

    [3] He, Kaiming, Xiangyu Zhang, Shaoqing Ren, and Jian Sun. "Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification." In 2015 IEEE International Conference on Computer Vision (ICCV), 1026–34. Santiago, Chile: IEEE, 2015. https://doi.org/10.1109/ICCV.2015.123

    拡張機能

    すべて展開する

    バージョン履歴

    R2023a で導入

    すべて展開する