メインコンテンツ

selfAttentionLayer

自己注意層

R2023a 以降

    説明

    自己注意層は、入力のシングルヘッドまたはマルチヘッドの自己注意を計算します。

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

    1. 入力からクエリ、キー、および値を計算する

    2. クエリ、キー、および値を使用して、ヘッド全体でスケールされたドット積アテンションを計算する

    3. ヘッドからの結果をマージする

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

    作成

    説明

    layer = selfAttentionLayer(numHeads,numKeyChannels) は、自己注意層を作成し、NumHeads プロパティおよび NumKeyChannels プロパティを設定します。

    layer = selfAttentionLayer(numHeads,numKeyChannels,Name=Value) は、オプションの NumValueChannelsOutputSizeHasPaddingMaskInputAttentionMaskDropoutProbabilityHasScoresOutputパラメーターと初期化学習率および正則化、および Name のプロパティを設定します。

    プロパティ

    すべて展開する

    自己注意

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

    アテンション ヘッド数。NumKeyChannels を等分する正の整数として指定します。

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

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

    キーとクエリのチャネル数。NumHeads で割り切れる正の整数として指定します。

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

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

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

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

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

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

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

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

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

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

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

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

    パディング マスクの形式は入力の形式と一致していなければなりません。パディング マスクの "S" (空間)、"T" (時間)、および "B" (バッチ) の各次元のサイズは、入力内の対応する次元のサイズと一致していなければなりません。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    パラメーターと初期化

    クエリ、キー、値、および出力の重みを初期化する関数。次のいずれかの値として指定します。

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

      重みnumInnumOut
      クエリInputSizeNumKeyChannels
      キーInputSizeNumKeyChannels
      InputSizeNumValueChannels
      出力NumValueChannelsOutputSize

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

      重みnumInnumOut
      クエリInputSizeNumKeyChannels
      キーInputSizeNumKeyChannels
      InputSizeNumValueChannels
      出力NumValueChannelsOutputSize

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

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

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

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

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

    データ型: char | string | function_handle

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

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

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

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

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

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

    データ型: char | string | function_handle

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

    データ型: single | double

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

    データ型: single | double

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

    データ型: single | double

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

    データ型: single | double

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

    データ型: single | double

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

    データ型: single | double

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

    データ型: single | double

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

    データ型: single | double

    学習率および正則化

    クエリ、キー、値、および出力の重みの学習率係数。非負のスカラーとして指定します。

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

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

    クエリ、キー、値、および出力のバイアスの学習率係数。非負のスカラーとして指定します。

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

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

    クエリ、キー、値、および出力の重みの L2 正則化係数。非負のスカラーとして指定します。

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

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

    クエリ、キー、値、および出力のバイアスの L2 正則化係数。非負のスカラーとして指定します。

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

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

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

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

    データ型: char | string

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

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

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

    パディング マスクの形式は入力の形式と一致していなければなりません。パディング マスクの "S" (空間)、"T" (時間)、および "B" (バッチ) の各次元のサイズは、入力内の対応する次元のサイズと一致していなければなりません。

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

    データ型: double

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

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

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

    パディング マスクの形式は入力の形式と一致していなければなりません。パディング マスクの "S" (空間)、"T" (時間)、および "B" (バッチ) の各次元のサイズは、入力内の対応する次元のサイズと一致していなければなりません。

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

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

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

    層の出力の数。

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

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

    データ型: double

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

    層の出力名。

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

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

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

    すべて折りたたむ

    ヘッド数 8、キーとクエリのチャネル数 256 の自己注意層を作成します。

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

    層配列に自己注意層を含めます。

    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/7181-attention-is-all-you-need.

    [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 で導入