入力のある部分に注意を払うことを学ぶ,訓練可能なネット層を表す.
AttentionLayer[net]
入力のある部分にスコアを与える特定のネットを指定する.
AttentionLayer[net,opts]
重みの正規化,マスキング,その他のパラメータのためのオプションを含む.
AttentionLayer
入力のある部分に注意を払うことを学ぶ,訓練可能なネット層を表す.
AttentionLayer[net]
入力のある部分にスコアを与える特定のネットを指定する.
AttentionLayer[net,opts]
重みの正規化,マスキング,その他のパラメータのためのオプションを含む.
詳細とオプション
- AttentionLayer[net]は,キーベクトルの集合,値ベクトルの集合,1つあるいは複数のクエリベクトルを取り,net[<|"Input"key,"Query"query|>]からのソフトマックス正規化されたスコアを使って各クエリベクトルについて値ベクトルの加重和を計算する.
- AttentionLayer[net]は,その一般的な単一の頭部を持つ形式で,次元 d1×…×dn×k のキー配列K,次元 d1×…×dn×v の値の配列V,次元 q1×…×qm×q のクエリ配列Qを取る.キー配列と値配列は,要素がベクトルのサイズ d1×…×dnの配列と見ることができる.Kについては,これらのベクトルはサイズ k の k で表され,Vについては,これらのベクトルはサイズ v の v で表される.同様に,クエリ配列は,要素がサイズ q のqで表されるベクトルであるサイズ q1×…×qm の配列と見ることができる.クエリ配列は,m が0ならサイズ q の単一のクエリベクトルでよい点に注意のこと.したがって,d1×…×dn キーベクトルkと q1×…×qm クエリベクトルqの各計算にスコアリングネット f を使ってスケールスコア s=f(k,q)が計算される.これらのスカラースコアを使って加重和 o=
wiviを含むサイズ q1×…×qmの出力配列Oが生成される.ただし,重みは w=softmax(S)でSは指定のクエリベクトルについて生成された d1×…×dn スカラースコアの配列である. - AttentionLayer[net]は,一般的に,キーがサイズ n×k の行列,値がサイズ n×v の行列で,クエリがサイズ q の単一のベクトルのときに使われることが多い.このとき,AttentionLayerは n 値の行ベクトルの加重和 o=
(ただし zi=f(ki,q))である単一の出力ベクトル o を計算する.Wolfram言語では,これは Total[values*weights]と書くことができる.ただし,weights はSoftmaxLayer[][Map[net[<|"Input"#,"Query"query|>]&,keys]]である. - AttentionLayer[net]のスコアリングネットワーク net は以下のいずれかでよい.
-
"Dot" s=Dot[k,q]を計算するNetGraph "Bilinear" s=Dot[k,W,q]を計算するNetGraph.ただし,W は学習可能行列である(デフォルト) NetGraph[…] "Input"ベクトルおよび "Query"ベクトルを取ってスカラーの"Output"値を生成する特定のNetGraph - 次の選択的パラメータを含めることができる.
-
"Dropout" 0 注意の重みについてのドロップアウト率 LearningRateMultipliers Automatic スコアリングネットワークの学習率乗数 "Mask" None 注意の特定のパターンを阻止する "MultiHead" False 頭部が複数の注意を行うかどうか.ただし,最後から2番目の次元は別の頭部に対応する "ScoreRescaling" None スコアをスケールするためのメソッド - 次は"Mask"の可能な設定である.
-
None マスキングなし "Causal" 因果マスキング "Causal"n ウィンドウサイズが n の局所的因果マスキング - "Dropout"p を指定すると確率 p のドロップアウトが注意の重みに適用される.ここで,p は0を含んで0から1まで(1は含まない)のスカラーである.
- "Mask""Causal"の設定のとき,クエリ入力はキーと同じ長さのベクトルと値の入力の連続に限られ,キーと値の入力で t'<=t の位置だけが位置 t の出力の計算に使われる.
- "Mask""Causal"n(n は正の整数)の設定では,キーと値の入力の t-n<t'<=t の位置だけが位置 t の出力の計算に使われる.
- "MultiHead"Trueの設定では,キーと値の入力は少なくとも階数3,クエリ入力は少なくとも階数2で,最後から2番目の次元は注意の頭部を表しすべての入力に対して同じでなければならない.注意の各頭部は独特の注意メカニズムに対応し,全頭部の出力が結合される.
- "ScoreRescaling""DimensionSqrt"の設定では,ソフトマックス
による正規化の前に,スコアがキーの入力次元の平方根で分割される. - AttentionLayerはNetGraphの中で使われることが多い.
- AttentionLayerは,NetGraph等の中で使うために次の入力ポートを開放する.
-
"Key" サイズ d1×…×dn×k の配列(あるいは多頭部の注意がある d1×…×dn×h×k) "Value" サイズ d1×…×dn×v の配列(あるいは多頭部の注意がある d1×…×dn×h×k) "Query" サイズ q1×…×qm×q の配列(あるいは多頭部の注意がある q1×…×qm×h×k) - AttentionLayerは,NetGraph等の中で使うために次の出力ポートを開放する.
-
"Output" 次元 q1×…×qm×v の出力の配列(あるいは多頭部の注意がある q1×…×qm×h×v) - AttentionLayerは内部の注意の重みにアクセスするために追加のポートを開放する.
-
"AttentionWeights" 次元 d1×…×dn×q1×…×qm(あるいは多頭部の注意がある d1×…×dn×h×q1×…×qm)の重みの配列 - AttentionLayer[…,"Key"->shape1,"Value"->shape2,"Query"->shape3]で入力の形状が指定できる.shapeiの使用可能な形状には以下がある.
-
NetEncoder[…] 一連の配列を生成するエンコーダ {d1,d2,…} 次元 d1×d2×…の配列 {"Varying",d1,d2,…} 最初の次元が可変で残りの次元が d1×d2×…の配列 {Automatic,…} 次元が推測される配列 {"Varying",Automatic,…} それぞれサイズが推測された,さまざまな数の配列 - キー,値,クエリ配列の大きさは,大抵の場合,NetGraph内で自動的に推測される.
- AttentionLayer[…][<|"Key"key,"Value"value,"Query"query|>]は層を適用して出力を明示的に計算する.
- AttentionLayer[…][<|"Key"{key1,key2,…},"Value"{value1,value2,…},"Query"{query1,query2,…}|>]は,入力バッチ内の keyi,valuei,queryiのそれぞれについて出力を明示的に計算する.
- AttentionLayer[…][input,NetPort["AttentionWeights"]]を使って特定の入力についてのソフトマックス正規化されたスコアにアクセスできる.
- NumericArrayが入力内で与えられると,出力はNumericArrayになる.
- NetExtract[…,"ScoringNet"]を使ってAttentionLayer[net]オブジェクトから net が抽出できる.
- Options[AttentionLayer]は層を構築する際のデフォルトオプションのリストを与える.Options[AttentionLayer[…]]はデータについて層を評価する際のデフォルトオプションのリストを与える.
- Information[AttentionLayer[…]]は層についてのレポートを与える.
- Information[AttentionLayer[…],prop]はAttentionLayer[…]の特性 prop の値を与える.使用可能な特性はNetGraphと同じである.
例題
すべて開く すべて閉じる例 (2)
AttentionLayerを作る:
AttentionLayer[]二次元のキーの列,三次元の値,一次元のクエリの列を取る,ランダムに初期化されたAttentionLayerを作る:
attend = NetInitialize@AttentionLayer["Key" -> {"Varying", 2}, "Value" -> {"Varying", 3}, "Query" -> {"Varying", 1}]attend[<|"Key" -> {{1, 2}, {3, 4}}, "Value" -> {{1, 2, 2}, {2, 1, 2}}, "Query" -> {{5}, {6}, {7}, {8}}|>]//MatrixFormattend[<|"Key" -> {{{1, 2}, {3, 4}}, {{1, 2}, {3, 4}, {5, 6}}}, "Value" -> {{{1, 2, 2}, {2, 1, 2}}, {{1, 2, 2}, {2, 1, 2}, {2, 2, 1}}}, "Query" -> {{{5}, {6}, {7}}, {{5}, {6}, {7}, {8}}}|>]//Map[MatrixForm]スコープ (4)
スコアリングネット (2)
"Dot"スコアリングネットを使ってAttentionLayerを作る:
attend = AttentionLayer["Dot"]net = NetExtract[attend, "ScoringNet"]スコアリングネットをNetGraphオブジェクトとして明示的に指定して,新たなAttentionLayerを作る:
attend2 = AttentionLayer[net]net = NetGraph[{10, 10, ThreadingLayer[Tanh[#1 + #2]&], {}}, {NetPort["Input"] -> 1 -> 3, NetPort["Query"] -> 2 -> 3 -> 4}, "Input" -> 2, "Query" -> 3]カスタムのスコアリングネットを利用するAttentionLayerを作り初期化する:
attend = NetInitialize@AttentionLayer[net]attend[<|"Key" -> {{1, 2}, {3, 4}}, "Value" -> {{1, 2, 2}, {2, 1, 2}}, "Query" -> {0.1, 2.1, 1.2}|>]attend[<|"Key" -> {{1, 2}, {3, 4}}, "Value" -> {{1, 2, 2}, {2, 1, 2}}, "Query" -> {{0.1, 2.1, 1.2}, {4.2, 4, 3}}|>]注意の重み (2)
AttentionLayerを作成する:
attend = AttentionLayer["Dot"]input = <|"Key" -> {{-1, 0, 1}, {1, 1, 0}, {0, -1, 1}, {1, 1, -1}}, "Value" -> {{1, 2, 3}, {-2, 0, 2}, {3, 2, 0}, {3, 2, 1}}, "Query" -> {1, 2, 3}|>;attend[input, NetPort["AttentionWeights"]]Function[N@Exp[#] / Total[Exp[#]]]@Dot[input["Key"], input["Query"]]attend[input, {NetPort["AttentionWeights"], NetPort["Output"]}]AttentionLayerに基づいたモデルを取る:
net = NetModel["BERT Trained on BookCorpus and Wikipedia Data"]このネットは,例えば12の頭部がある,いくつかの多頭自己注意層を含んでいる:
NetExtract[net, {"encoder", 1, 1, "attention", 5}]ネットに対する指定された入力に対してのこの層の注意の重みを抽出する:
input = "The cat sat on the mat";weights = NumericArray@net[input, NetPort[{"encoder", 1, 1, "attention", 5, "AttentionWeights"}]]最初の注意の頭部の重みを入力トークン間の接続の強さとして表す:
tokens = {"[START]", Splice[StringSplit[input]], "[END]"}head = 1;Graphics[Table[{Text[tokens[[i]], {-1, -i}], Text[tokens[[j]], {5, -j}], Opacity[weights[[i, head, j]]], Line[{{0, -i}, {4, -j}}]}, {i, Length[weights]}, {j, Last@Dimensions[weights]}]]オプション (7)
"Dropout" (1)
注意の重みのマスキングについてのドロップアウトがあるAttentionLayerを定義する:
attendDrop = AttentionLayer["Dot", "Dropout" -> 0.5]訓練特有の動作がなければ,この層はドロップアウトがない場合と同じ結果を返す:
input = <|"Query" -> (| |
| -- |
| 0 |
| 1 |
| -2 |), "Key" -> (| |
| -- |
| 1 |
| 0 |
| -1 |), "Value" -> (| | |
| -- | -- |
| 1 | 2 |
| 3 | 4 |
| -5 | -6 |)|>;attendDrop[input]//MatrixFormAttentionLayer["Dot"][input]//MatrixFormNetEvaluationMode"Train"とすると,この層は別の結果を返す:
attendDrop[input, NetEvaluationMode -> "Train"]//MatrixFormattendDrop[input, NetEvaluationMode -> "Train"]//MatrixFormattendDrop[input, NetPort["AttentionWeights"], NetEvaluationMode -> "Train"]//MatrixFormLearningRateMultipliers (1)
weights = {{2, -1}, {-1, 1}};dot = NetGraph[{LinearLayer["Weights" -> weights, "Biases" -> None], DotLayer[]}, {NetPort["Input"] -> 1 -> 2, NetPort["Query"] -> 2}]このスコアリングネットを,オプションLearningRateMultipliersで重みをフリーズしてAttentionLayerで使う:
attend = AttentionLayer[dot, LearningRateMultipliers -> 0, "Value" -> {2, 2}, "Query" -> 2]訓練時には,スコアリングネットの重みに学習率乗数0が使われる:
Information[attend, "ArraysLearningRateMultipliers"]Information[NetChain[{attend, LinearLayer[3], SoftmaxLayer[]}], "ArraysLearningRateMultipliers"]"Mask" (2)
因果マスキングでAttentionLayerを定義する:
attend = AttentionLayer["Dot", "Mask" -> "Causal"]input = <|"Query" -> (| |
| -- |
| 1 |
| 0 |
| -1 |
| -2 |
| 2 |), "Key" -> (| |
| -- |
| -2 |
| -1 |
| 0 |
| 1 |
| 2 |), "Value" -> (| | |
| -- | --- |
| 1 | 2 |
| 3 | 4 |
| 5 | 6 |
| 7 | 8 |
| -9 | -10 |)|>;attend[input]//MatrixForm指定されたステップにおける出力はそのステップまでのキーと値にのみ依存する.特に,最初の出力ベクトルは値の最初のベクトルである.
attend[input, NetPort["AttentionWeights"]]//MatrixFormウィンドウサイズ3の局所的因果マスキングを持つAttentionLayerを定義する:
attend = AttentionLayer["Dot", "Mask" -> "Causal" -> 3]1つのクエリベクトルおよび長さ5の列を持つ注意層を適用する:
input = <|"Query" -> (| |
| -- |
| 1 |
| 0 |
| -1 |
| -2 |
| 2 |), "Key" -> (| |
| -- |
| -2 |
| -1 |
| 0 |
| 1 |
| 2 |), "Value" -> (| | |
| -- | --- |
| 1 | 2 |
| 3 | 4 |
| 5 | 6 |
| 7 | 8 |
| -9 | -10 |)|>;attend[input]//MatrixFormある特定のステップでの出力は,直近3つのステップにおけるキーおよび値のみに依存する.
これはゼロを含む注意重みの行列において確認することができる:
attend[input, NetPort["AttentionWeights"]]//MatrixForm"MultiHead" (2)
2つの頭部を持つAttentionLayerを定義する:
multihead = AttentionLayer["Dot", "MultiHead" -> True, "Value" -> {"Varying", 2, 4}, "Query" -> {2, 5}]key = RandomReal[1, {3, 2, 5}];
value = RandomReal[1, {3, 2, 4}];
query = RandomReal[1, {2, 5}];multihead[<|"Key" -> key, "Value" -> value, "Query" -> query|>]//MatrixForm結果は単頭の注意層を各頭部に別々に適用して結果を結合したものと同じである:
singlehead = AttentionLayer["Dot", "Value" -> {"Varying", 4}, "Query" -> {5}]singlehead[<|"Key" -> Transpose[key, 1 2], "Value" -> Transpose[value, 1 2], "Query" -> query|>]//MatrixForm6つの頭部による多頭自己注意を実行するためのNetGraphを定義する:
multiheadself = NetInitialize@NetGraph[<|"Key" -> NetMapOperator[{6, 10}], "Value" -> NetMapOperator[{6, 10}], "Query" -> NetMapOperator[{6, 10}], "Attention" -> AttentionLayer["Dot", "MultiHead" -> True], "Merge" -> NetMapOperator[10]|>, {"Key" -> NetPort["Attention", "Key"], "Value" -> NetPort["Attention", "Value"], "Query" -> NetPort["Attention", "Query"],
"Attention" -> "Merge"}, "Input" -> {"Varying", 10}]長さが3の列を持つNumericArrayに適用する:
multiheadself[NumericArray[RandomReal[1, {3, 10}], "Real32"]]"ScoreRescaling" (1)
入力次元について注意スコアを再スケールするAttentionLayerを作る:
attend = AttentionLayer["Dot", "ScoreRescaling" -> "DimensionSqrt"]input = <|"Key" -> RandomReal[{-1, 1}, {7, 20}], "Value" -> RandomReal[{-1, 1}, {7, 1}], "Query" -> RandomReal[1, {3, 20}]|>;attend[input]//MatrixFormこの出力はスコアを再スケールしなかったものよりもコントラストが低い:
AttentionLayer["Dot"][input]//MatrixFormListLinePlot[{AttentionLayer["Dot"][input, NetPort["AttentionWeights"]][[1, All]], attend[input, NetPort["AttentionWeights"]][[1, All]]}, PlotLegends -> {"without score rescaling", "with score rescaling"}]アプリケーション (1)
数のリストをソートするために,1から6までの整数のリストからなる検定集合と訓練集合を生成する:
digits = Range[6];
seqs = RandomSample[Flatten[Table[Tuples[digits, n], {n, 3, 6}], 1]];
data = Map[# -> Sort[#]&, seqs];
{testData, trainData} = TakeDrop[data, Ceiling[Length[data] / 10]];RandomSample[trainData, 3]AttentionLayerでNetGraphを定義する:
net = NetGraph[<|
"enc" -> {EmbeddingLayer[12], LongShortTermMemoryLayer[50]}, "dec" -> LongShortTermMemoryLayer[50],
"key" -> NetMapOperator[50],
"value" -> NetMapOperator[50],
"attend" -> AttentionLayer["Dot"],
"cat" -> CatenateLayer[2], "classify" -> {NetMapOperator[LinearLayer[]], SoftmaxLayer[]}
|>, {
"enc" -> "key" -> NetPort["attend", "Key"], "enc" -> "value" -> NetPort["attend", "Value"],
"enc" -> "dec" -> NetPort["attend", "Query"],
"dec" -> "cat", "attend" -> "cat", "cat" -> "classify"}, "Input" -> {"Varying", NetEncoder[{"Class", digits}]}, "Output" -> {"Varying", NetDecoder[{"Class", digits}]}
]trained = NetTrain[net, trainData, MaxTrainingRounds -> 3, ValidationSet -> testData]trained[{6, 6, 1, 4, 2}]特性と関係 (4)
クエリ,キー,値の入力が行列の場合は,AttentionLayer[net]は計算を行う:
attentionFunction[inputKey_, inputValue_, query_, scorer_] := Table[Mean@WeightedData[inputValue, Exp[scorer[<|"Input" -> #, "Query" -> q|>]]& /@ inputKey], {q, query}];AttentionLayerを定義し,スコアリングサブネットを抽出する:
att = NetInitialize@AttentionLayer["Key" -> {"Varying", 3}, "Value" -> {"Varying", Automatic}, "Query" -> {"Varying", 2}]scorer = NetExtract[att, "ScoringNet"]いくつかの検定データについてAttentionLayerを評価する:
data = <|"Key" -> {{1, 2, 3}, {-0.4, -1, 1.5}}, "Value" -> {{1, -2, 0}, {-0.4, 1, 0}}, "Query" -> {{0, -3}, {2, 3}, {-0.2, 0}, {5, 2}}|>;att@dataattentionFunction[data["Key"], data["Value"], data["Query"], scorer]AttentionLayer[net,"ScoreRescaling""DimensionSqrt"]は計算を行う:
attentionFunction[inputKey_, inputValue_, query_, scorer_] := Table[
Mean@WeightedData[inputValue, Exp[scorer[<|"Input" -> #, "Query" -> q|>] / Sqrt[Last@Dimensions[inputKey]]]& /@ inputKey]
, {q, query}];AttentionLayerを定義し,スコアリングサブネットを抽出する:
att = NetInitialize@AttentionLayer["ScoreRescaling" -> "DimensionSqrt", "Key" -> {"Varying", 3}, "Value" -> {"Varying", Automatic}, "Query" -> {"Varying", 2}]scorer = NetExtract[att, "ScoringNet"]いくつかの検定データについてAttentionLayerを評価する:
data = <|"Key" -> RandomReal[{-1, 1}, {4, 3}], "Value" -> RandomReal[{-1, 1}, {4, 2}], "Query" -> RandomReal[{-1, 1}, {4, 2}]|>;att@data//MatrixFormattentionFunction[data["Key"], data["Value"], data["Query"], scorer]//MatrixFormAttentionLayer[scorer,"Mask""Causal","ScoreRescaling""DimensionSqrt"]は計算を行う:
attentionFunction[inputKey_, inputValue_, query_, scorer_] := Table[
Mean@WeightedData[inputValue[[ ;; i]], Exp[scorer[<|"Input" -> #, "Query" -> query[[i]]|>] / Sqrt[Last@Dimensions[inputKey]]]& /@ inputKey[[ ;; i]]]
, {i, Length[query]}];AttentionLayerを定義し,スコアリングサブネットを抽出する:
att = NetInitialize@AttentionLayer["Mask" -> "Causal", "ScoreRescaling" -> "DimensionSqrt", "Key" -> {"Varying", 3}, "Value" -> {"Varying", Automatic}, "Query" -> {"Varying", 2}]scorer = NetExtract[att, "ScoringNet"]いくつかの検定データについてAttentionLayerを評価する:
data = <|"Key" -> RandomReal[{-1, 1}, {4, 3}], "Value" -> RandomReal[{-1, 1}, {4, 2}], "Query" -> RandomReal[{-1, 1}, {4, 2}]|>;att@data//MatrixFormattentionFunction[data["Key"], data["Value"], data["Query"], scorer]//MatrixForm"Key"入力と"Value"入力が同じなら,AttentionLayerはサポートされなくなったSequenceAttentionLayerと同じである:
NetGraph[<|"attend" -> AttentionLayer[]|>, {NetPort["Input"] -> {NetPort[{"attend", "Key"}], NetPort[{"attend", "Value"}]}}]NetGraph[<|"attend" -> SequenceAttentionLayer[]|>, {}]考えられる問題 (1)
AttentionLayer[net]のスコアリングネット net に"Dot"の設定を使うときは,入力キーとクエリベクトルが同じサイズでなければならない:
AttentionLayer["Dot", "Key" -> {"Varying", 3}, "Value" -> {"Varying", 4}, "Query" -> {"Varying", 4}]AttentionLayer["Dot", "Key" -> {"Varying", 4}, "Value" -> {"Varying", 3}, "Query" -> {"Varying", 4}]この制約は"Bilinear"スコアリングネットを使う際には当てはまらない:
AttentionLayer["Bilinear", "Key" -> {"Varying", 3}, "Value" -> {"Varying", 4}, "Query" -> {"Varying", 17}]テクニカルノート
関連するガイド
-
▪
- ニューラルネットワーク層 ▪
- 機械学習 ▪
- 自然言語処理 ▪
- ニューラルネットワーク ▪
- ニューラルネットワークの構築と特性
テキスト
Wolfram Research (2019), AttentionLayer, Wolfram言語関数, https://reference.wolfram.com/language/ref/AttentionLayer.html (2022年に更新).
CMS
Wolfram Language. 2019. "AttentionLayer." Wolfram Language & System Documentation Center. Wolfram Research. Last Modified 2022. https://reference.wolfram.com/language/ref/AttentionLayer.html.
APA
Wolfram Language. (2019). AttentionLayer. Wolfram Language & System Documentation Center. Retrieved from https://reference.wolfram.com/language/ref/AttentionLayer.html
BibTeX
@misc{reference.wolfram_2026_attentionlayer, author="Wolfram Research", title="{AttentionLayer}", year="2022", howpublished="\url{https://reference.wolfram.com/language/ref/AttentionLayer.html}", note=[Accessed: 12-August-2026]}
BibLaTeX
@online{reference.wolfram_2026_attentionlayer, organization={Wolfram Research}, title={AttentionLayer}, year={2022}, url={https://reference.wolfram.com/language/ref/AttentionLayer.html}, note=[Accessed: 12-August-2026]}