ディープラーニング入門 (67) リカレント ニューラル ネットワーク - アテンション メカニズム

序文

核心的な内容はブログリンク1ブログリンク2からです作者をたくさん応援していただければ幸いです
この記事は忘れないための記録用です

リカレント ニューラル ネットワーク - 注意メカニズム

コースウェア

心理学

  • 動物は複雑な環境で注目すべき点に効果的に焦点を合わせる必要がある
  • 心理的フレームワーク: 人間は自発的および非自発的な手がかりに基づいて注意点を選択します

注意メカニズム

畳み込み層、完全接続層、およびプーリング層は、不随意なキューのみを考慮します (明確な目標はありません)。

プーリング演算は通常、受容野の範囲内の最大値を抽出します (最大プーリング)
畳み込み演算は、通常、畳み込みカーネルを介してすべての入力に対して演算を行い、より明白な特徴を抽出します。

注意のメカニズムは、ランダムな手がかりを明示的に考慮することです

ランダムな手がかりはクエリ (クエリ) と呼ばれます - やりたいこと、
各入力は値 (値) と非ランダムな手がかり (キー) のペアです - 環境、つまりいくつかのキーとして理解できます 値のペア、キーと値は同じであることも、異なることもできます。
アテンション プーリング層を通じて特定の入力を偏って選択します ---- クエリに従って偏って入力を選択します。これは、前のプーリング層とは異なります。ここでは明示的にクエリを追加し、その後、クエリに従って必要なものをクエリする

ノンパラメトリック アテンション プーリング層

ここに画像の説明を挿入

ノンパラメータ:学習不要 パラメータ
x – キー
y – 値
f(x) – クエリ対象のもの
(x, y) に対応 – キーと値のペア (候補)
平均プーリング: 最も簡単な理由解決策は、探しているもの (つまり、f(x) の x) を気にする必要がないため、何も考えずに y を合計して平均するだけで済みます。

Nadaraya-Watson カーネル回帰:

カーネル: K 関数。x と xi の間の距離を測定する関数と考えることができます
。新しく与えられた値が類似のデータと比較され、これらのデータに対応する値が重み付けされて合計され、最終クエリ)、パラメータを学習する必要はありません

K の選択: ガウス カーネル
ここに画像の説明を挿入

u: x と xi の間の距離を表します
exp: 関数は、最終結果を 0 より大きい数値に変更することです
Softmax: 0 から 1 までの数値を重みとして取得します
上記の式に基づいて学習可能な w を追加します。
ここに画像の説明を挿入

要約する

1. 心理学では、人はランダムな手がかりや無意識の手がかりによって注意を向けるポイントを選択すると考えられています。

2. アテンション メカニズムでは、入力はクエリ (ランダムな手がかり) とキー (非ランダムな手がかり) を通じて偏って選択されます。これは一般に次のように記述できます。

ここに画像の説明を挿入

f(x) のキーと非自発的手がかりのすべてのキーは距離 (α(x, xi)、通常は注意の重みと呼ばれます) に基づいて計算され、それぞれすべての値の重みとして使用されます。これは新しい概念ではありません。
ノンパラメトリック アテンション メカニズムは 60 年代から存在しています。

教科書(注意喚起)

経済学は希少な資源の配分を研究するため、人々は「注意の経済」の時代に入っています。つまり、人間の注意は交換可能で、限られた、貴重で希少な商品とみなされます。音楽やビデオのストリーミング サービスでは、人々は広告に注目を集めるか、広告を隠すためにお金を払いますが、オンライン ゲームの世界で成長するには、人々はゲームの戦闘で注目を消費します。 、したがって、新しいプレイヤーを引き付けたり、お金を払ってすぐに強力になるのに役立ちます。要するに、注意力は無料ではありません。

注意力は乏しいですが、注意力を妨げるような情報は環境中にあまりありません。たとえば、人間の視覚神経系は 1 秒あたり約1 0 8 10^8を受け取ります。1 08ビットの情報は、脳が完全に処理できる量をはるかに超えています。幸いなことに、私たちの祖先は経験(データとも呼ばれます)から、「感覚へのすべての入力が同じように作成されるわけではない」ことを学びました。人類の歴史を通して、関心のある情報のごく一部にのみ注意を向けるこの能力により、人間の脳は、捕食者を見つけたり、食べ物や仲間を見つけたりするなど、生存、成長、社会化のためのリソースをより賢明に割り当てることができるようになりました。

1 生物学における注意の手がかり

注意は視覚的な世界にどのように適用されますか? それは今日非常に人気のあるフレームワークから始まります双组件(two-component)。このフレームワークの出現は、「アメリカ心理学の父」と考えられているウィリアム ジェームスの 1890 年代にまで遡ることができます。この枠組みでは、被験者は注意の焦点を基にし非自主性提示、選択的に方向付けます。自主性提示

非自発的な合図は、環境内のオブジェクトの顕著性と可視性に基づいています。下の写真のように、目の前に新聞、研究論文、コーヒー、ノート、本という 5 つのアイテムがあると想像してください。赤いコーヒーカップを除いて、すべての紙製品は白黒で印刷されています。つまり、このコーヒーマグはこの視覚環境の中で際立って目立ち、思わず人々の注目を集めてしまうのです。そこで、写真に示すように、コーヒーに最も鋭い視点を置きました。
ここに画像の説明を挿入
コーヒーを飲んだ後、私たちは興奮して本を読みたくなり、下の画像に示すように、頭を回転させ、目の焦点を再調整して本を読みます。上の図の顕著性による選択とは異なり、このときの選択本は認知と意識によって制御されるため、自律的なプロンプトに基づいて選択を支援する場合には注意がより慎重になります。主体の主観的な意志に押されて、選択の力が強くなります。
ここに画像の説明を挿入

2 クエリ、キー、値

自律的および非自律的な注意手がかりは、人間の注意の仕組みを説明します。これら 2 つの注意手がかりを使用して、ニューラル ネットワークで注意メカニズムのフレームワークを設計する方法を見てみましょう。

まず、不随意の合図のみを使用した比較的単純な状況を考えてみましょう。選択を感覚入力に偏らせるには、パラメトリックな全結合層、またはノンパラメトリックな最大プーリング層または平均プーリング層を使用するだけです。

したがって、「自律性のヒントが含まれるかどうか」によって、アテンション メカニズムと完全接続層またはプーリング層が区別されます。注意メカニズムの文脈では、自律的な手がかりは と呼ばれます查询(query)任意のクエリが与えられると、注意メカニズムはによって注意力汇聚(attention pooling)選択を感官输入(中間特徴表現などの感覚入力) に導きます。注意メカニズムでは、これらの感覚入力は と呼ばれます值(value)より口語的に解釈すると、各値は键(key)とペアになっており、感覚入力の不随意な合図として想像できます。示されているように、アテンションプーリングは、特定のクエリ (自律的手がかり) がキー (非自発的手がかり) と照合され、最もよく一致する値 (感覚入力) が得られるように設計できます。
ここに画像の説明を挿入
図では前述のフレームワークが優勢であるため、このフレームワークに基づくモデルがこの章の中心になります。ただし、注意メカニズムの設計には多くの代替案があります。たとえば、強化学習法を使用してトレーニングできる微分不可能な注意モデルを設計することが可能です (Mnih et al., 2014)。

3 注意力の可視化

平均プーリング層は、各入力が均等に重み付けされた入力の加重平均として見ることができます。実際、アテンション プーリングの結果、加重平均の合計が計算されます。この場合、重みは、特定のクエリのさまざまなキーにわたって計算されます。

import torch
from d2l import torch as d2l

アテンションの重みを視覚化するには、show_heatmaps関数を定義する必要があります。入力の形式matricesは (表示する行数、表示する列数、クエリ数、キー数) です。

#@save
def show_heatmaps(matrices, xlabel, ylabel, titles=None, figsize=(2.5, 2.5),
                  cmap='Reds'):
    """显示矩阵热图"""
    d2l.use_svg_display()
    num_rows, num_cols = matrices.shape[0], matrices.shape[1]
    fig, axes = d2l.plt.subplots(num_rows, num_cols, figsize=figsize,
                                 sharex=True, sharey=True, squeeze=False)
    for i, (row_axes, row_matrices) in enumerate(zip(axes, matrices)):
        for j, (ax, matrix) in enumerate(zip(row_axes, row_matrices)):
            pcm = ax.imshow(matrix.detach().numpy(), cmap=cmap)
            if i == num_rows - 1:
                ax.set_xlabel(xlabel)
            if j == 0:
                ax.set_ylabel(ylabel)
            if titles:
                ax.set_title(titles[j])
    fig.colorbar(pcm, ax=axes, shrink=0.6);

簡単な例を使って説明してみましょう。この例では、アテンションの重みはクエリとキーが同じ場合にのみ 1 になり、それ以外の場合は 0 になります。

attention_weights = torch.eye(10).reshape((1, 1, 10, 10))
show_heatmaps(attention_weights, xlabel='Keys', ylabel='Queries')

出力:
ここに画像の説明を挿入

後の章では、注意の重みを表示する関数を頻繁に呼び出しますshow_heatmaps

4 まとめ

  • 人間の注意力は有限で貴重かつ希少なリソースです。

  • 被験者は、不随意および自発的な合図を使用して選択的に注意を向けます。前者は顕著性に基づいており、後者は認識に基づいています。

  • アテンション メカニズムと完全接続層またはプーリング層の違いは、自律的なヒントの追加によるものです。

  • アテンション メカニズムは、自律的なキューが含まれているため、完全に接続された層やプーリング層とは異なります。

  • 注意メカニズムは、注意プーリングを通じて、クエリ (自律的手がかり) とキー (非自発的手がかり) を含む値 (感覚入力) に向かって選択を偏らせます。キーと値はペアです。

  • クエリとキー間のアテンションの重みを視覚化することが可能です。

教科書 (アテンションプーリング: Nadaraya-Watson カーネル回帰)

前のセクションでは、フレームワークの下でアテンション メカニズムの主なコンポーネントを紹介しました: クエリ (自発的キュー) とキー (非自発的キュー) の間の相互作用はアテンション プールを形成し、アテンション プールは値 (感覚入力) を選択的に集約して最終出力を生成します。このセクションでは、アテンションのメカニズムが実際にどのように機能するかを高度に理解するために、アテンション プーリングの詳細を紹介します。具体的には、1964 年に提案された Nadaraya-Watson カーネル回帰モデルは、アテンション メカニズムを備えた機械学習を実証するために使用できる、シンプルですが完全な例です。

import torch
from torch import nn
from d2l import torch as d2l

1 データセットの生成

n_train = 50  # 训练样本数
x_train, _ = torch.sort(torch.rand(n_train) * 5)   # 排序后的训练样本

def f(x):
    return 2 * torch.sin(x) + x**0.8

y_train = f(x_train) + torch.normal(0.0, 0.5, (n_train,))  # 训练样本的输出
x_test = torch.arange(0, 5, 0.1)  # 测试样本
y_truth = f(x_test)  # 测试样本的真实输出
n_test = len(x_test)  # 测试样本数
n_test

出力

50

以下の関数は、すべてのトレーニング サンプル (サンプルは円で表されます)、ノイズ項を含まない実データ生成関数ffをプロットします。f (「Truth」というラベルが付いている)、および学習された予測関数 (「Pred」というラベルが付いている)。

def plot_kernel_reg(y_hat):
    d2l.plot(x_test, [y_truth, y_hat], 'x', 'y', legend=['Truth', 'Pred'],
             xlim=[0, 5], ylim=[-1, 5])
    d2l.plt.plot(x_train, y_train, 'o', alpha=0.5);

2 平均プーリング

回帰問題を解決するには、最初に最も単純な推定量を使用します。平均プーリングに基づいてすべてのトレーニング サンプルの出力値の平均を計算します:
f ( x ) = 1 n ∑ i = 1 nyi 、 f(x) = \frac{1}{n}\sum_{i=1}^ n y_i 、f ( x )=n1i = 1y私は
下の図に示すように、この推定器は実際には十分に賢明ではありません。実関数fff (「真実」) と予測関数 (「予測」) は大きく異なります。

y_hat = torch.repeat_interleave(y_train.mean(), n_test)
plot_kernel_reg(y_hat)

出力:
ここに画像の説明を挿入

3 ノンパラメトリックな注意プーリング

明らかに、平均プーリングは入力xi x_iを無視します。バツ私はそこで Nadaraya と Watson は、入力の位置に応じてyi y_iを出力するというより良いアイデアを思いつきました。y私は重み付けするには:

f ( x ) = ∑ i = 1 n K ( x − xi ) ∑ j = 1 n K ( x − xj ) yi ( 10.2.3 ) f(x) = \sum_{i=1}^n \frac{ K(x - x_i)}{\sum_{j=1}^n K(x - x_j)} y_i \qquad(10.2.3)f ( x )=i = 1j = 1K ( ×バツj)K ( ×バツ私は)y私は( 10.2.3 )

ここでKKKはカーネルです。式 (10.2.3) で記述される推定器は と呼ばれますNadaraya-Watson核回归(Nadaraya-Watson kernel regression)カーネル関数の詳細についてはここでは詳しく説明しませんが、これに触発されて、アテンション メカニズムのフレームワークの観点から (10.2.3) を書き直して、より一般的な式にすることができます。 f ( x ) = ∑注意力汇聚(attention pooling)i
= 1 n α ( x , xi ) yi ( 10.2.4 ) f(x) = \sum_{i=1}^n \alpha(x, x_i) y_i \qquad(10.2.4)f ( x )=i = 1a ( x ,バツ私は) y私は( 10.2.4 )
ここで、xxx是查询, ( x i , y i ) (x_i, y_i) ( ×私はy私は)はキーと値のペアです。(10.2.4) と (10.2.2) を比較すると、注意プーリングはyi y_iy私は加重平均。xxをクエリしますxとキーxi x_iバツ私は(10.2.4) に示すように、間の関係は次のようにモデル化されます。この重みは、対応する各値yi y_i注意力权重(attention weight)に割り当てられます。y私はどのクエリについても、モデルにはアテンションの重みのすべてのキーと値のペアにわたる有効な確率分布があり、それらは負ではなく、合計は 1 になります。

注意のプールをよりよく理解するには、次高斯核(Gaussian kernel)のように定義される 1 つを考えてみましょう。

K ( u ) = 1 2 π exp ⁡ ( − u 2 2 ) ( 10.2.5 ) K(u) = \frac{1}{\sqrt{2\pi}} \exp(-\frac{u^2) {2})\qquad (10.2.5)K ( u )=午後2時 1exp ( 2あなた2)( 10.2.5 )

ガウス カーネルを (10.2.4) と (10.2.3) に代入すると、次のようになります。

f ( x ) = ∑ i = 1 n α ( x , xi ) yi = ∑ i = 1 n exp ⁡ ( − 1 2 ( x − xi ) 2 ) ∑ j = 1 n exp ⁡ ( − 1 2 ( x − xj ) 2 ) yi = ∑ i = 1 nsoftmax ( − 1 2 ( x − xi ) 2 ) yi 。( 10.2.6 ) \begin{split}\begin{aligned} f(x) &=\sum_{i=1}^n \alpha(x, x_i) y_i\\ &= \sum_{i=1}^ n \frac{\exp\left(-\frac{1}{2}(x - x_i)^2\right)}{\sum_{j=1}^n \exp\left(-\frac{1} {2}(x - x_j)^2\right)} y_i \\&= \sum_{i=1}^n \mathrm{softmax}\left(-\frac{1}{2}(x - x_i) ^2\右) y_i。\end{整列}\end{分割} \qquad (10.2.6)f ( x )=i = 1a ( x ,バツ私は) y私は=i = 1j = 1経験値(21( ×バツj)2 )経験値(21( ×バツ私は)2 )y私は=i = 1ソフトマックス(21( ×バツ私は)2 )y私は.( 10.2.6 )

(10.2.6) では、キーxi x_iの場合、バツ私は指定されたクエリxxに近づくほどx を入力し、このキーに対応する値yi y_iy私は注意の重みが大きければ大きいほど、「注目を獲得」することになります。

Nadaraya-Watson カーネル回帰はノンパラメトリック モデルであることに注意してください。したがって、(10.2.6) が非参数的注意力汇聚(nonparametric attention pooling)モデルになります。次に、このノンパラメトリックな注意プーリング モデルに基づいて予測をプロットします。プロットされた結果から、新しいモデルの予測線は滑らかで、平均的なプールされた予測よりも真実に近いことがわかります。

# X_repeat的形状:(n_test,n_train),
# 每一行都包含着相同的测试输入(例如:同样的查询)
X_repeat = x_test.repeat_interleave(n_train).reshape((-1, n_train))
# x_train包含着键。attention_weights的形状:(n_test,n_train),
# 每一行都包含着要在给定的每个查询的值(y_train)之间分配的注意力权重
attention_weights = nn.functional.softmax(-(X_repeat - x_train)**2 / 2, dim=1)
# y_hat的每个元素都是值的加权平均值,其中的权重是注意力权重
y_hat = torch.matmul(attention_weights, y_train)
plot_kernel_reg(y_hat)

出力:
ここに画像の説明を挿入
次に、注意の重みを見てみましょう。ここで、テストデータの入力はクエリに相当し、トレーニングデータの入力はキーに相当します。両方の入力がソートされているため、クエリとキーのペアが近いほど、アテンション プールのアテンションの重みが高くなることがわかります。

d2l.show_heatmaps(attention_weights.unsqueeze(0).unsqueeze(0),
                  xlabel='Sorted training inputs',
                  ylabel='Sorted testing inputs')

出力
ここに画像の説明を挿入

4 パラメータによるアテンションプーリング

ノンパラメトリック Nadaraya-Watson カーネル回帰の利点一致性(consistency): 十分なデータがある場合、モデルは最適な結果に収束します。それにもかかわらず、学習可能なパラメータを注意プーリングに簡単に統合できます。

たとえば、(10.2.6) とは少し異なり、次のクエリではxxxとキーxi x_iバツ私は間の距離に学習パラメータを乗じた値www

f ( x ) = ∑ i = 1 n α ( x , xi ) yi = ∑ i = 1 n exp ⁡ ( − 1 2 ( ( x − xi ) w ) 2 ) ∑ j = 1 n exp ⁡ ( − 1 2 ( ( x − xj ) w ) 2 ) yi = ∑ i = 1 nsoftmax (− 1 2 ( ( x − xi ) w ) 2 ) yi 。( 10.2.7 ) \begin{split}\begin{aligned}f(x) &= \sum_{i=1}^n \alpha(x, x_i) y_i \\&= \sum_{i=1}^ n \frac{\exp\left(-\frac{1}{2}((x - x_i)w)^2\right)}{\sum_{j=1}^n \exp\left(-\frac {1}{2}((x - x_j)w)^2\right)} y_i \\&= \sum_{i=1}^n \mathrm{softmax}\left(-\frac{1}{2 }((x - x_i)w)^2\right) y_i.\end{aligned}\end{split} \qquad (10.2.7)f ( x )=i = 1a ( x ,バツ私は) y私は=i = 1j = 1経験値(21(( xバツj2 )経験値(21(( xバツ私は2 )y私は=i = 1ソフトマックス(21(( xバツ私は2 )y私は.( 10.2.7 )
このセクションの残りの部分では、このモデル (10.2.7) をトレーニングすることによって、注意プーリングのパラメーターを学習します。

4.1 バッチ行列乗算

データの小さなバッチに対するアテンションをより効率的に計算するために、深層学習開発フレームワークで提供されるバッチ行列乗算を利用できます。

最初のミニバッチにnn が含まれているとします。n行列X 1 , … , X n \mathbf{X}_1,\ldots, \mathbf{X}_nバツ1バツ、形状はa × ba\times bです。ある×b、2 番目のミニバッチにはnn がn範囲Y 1 , ... , Y n \mathbf{Y}_1, \ldots, \mathbf{Y}_nY1Y、形状はb × cb\times cです。b×c . バッチ行列乗算によりnnn範囲X 1 Y 1 , ... , X n Y n \mathbf{X}_1\mathbf{Y}_1, \ldots, \mathbf{X}_n\mathbf{Y}_nバツ1Y1バツY、形状はa × ca\times cです。ある×c . したがって、2 つのテンソルの形状が( n , a , b ) (n,a,b)( n _b )および( n , b , c ) (n,b,c)( n b c )バッチ行列乗算の出力の形状は( n , a , c ) (n,a,c)( n _c )

X = torch.ones((2, 1, 4))
Y = torch.ones((2, 4, 6))
torch.bmm(X, Y).shape

出力

torch.Size([2, 1, 6])

アテンション メカニズムのコンテキストでは、ミニバッチ行列の乗算を使用して、データのミニバッチ全体にわたる加重平均を計算できます。

weights = torch.ones((2, 10)) * 0.1
values = torch.arange(20.0).reshape((2, 10))
torch.bmm(weights.unsqueeze(1), values.unsqueeze(-1))

出力

tensor([[[ 4.5000]],

        [[14.5000]]])

4.2 モデルの定義

(10.2.7) のパラメトリック アテンション プーリングに基づいて、ミニバッチ行列乗算を使用した、Nadaraya-Watson カーネル回帰のパラメトリック バージョンは次のように定義されます。

class NWKernelRegression(nn.Module):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.w = nn.Parameter(torch.rand((1,), requires_grad=True))

    def forward(self, queries, keys, values):
        # queries和attention_weights的形状为(查询个数,“键-值”对个数)
        queries = queries.repeat_interleave(keys.shape[1]).reshape((-1, keys.shape[1]))
        self.attention_weights = nn.functional.softmax(
            -((queries - keys) * self.w)**2 / 2, dim=1)
        # values的形状为(查询个数,“键-值”对个数)
        return torch.bmm(self.attention_weights.unsqueeze(1),
                         values.unsqueeze(-1)).reshape(-1)

4.3 トレーニング

次に、トレーニング データセットをアテンション モデルをトレーニングするためのキーと値に変換します。パラメーターを備えたアテンション プーリング モデルでは、トレーニング サンプルの入力は、対応する予測出力を取得するために、それ自体を除くすべてのトレーニング サンプルの「キーと値」のペアを使用して計算されます。

# X_tile的形状:(n_train,n_train),每一行都包含着相同的训练输入
X_tile = x_train.repeat((n_train, 1))
# Y_tile的形状:(n_train,n_train),每一行都包含着相同的训练输出
Y_tile = y_train.repeat((n_train, 1))
# keys的形状:('n_train','n_train'-1)
keys = X_tile[(1 - torch.eye(n_train)).type(torch.bool)].reshape((n_train, -1))
# values的形状:('n_train','n_train'-1)
values = Y_tile[(1 - torch.eye(n_train)).type(torch.bool)].reshape((n_train, -1))

パラメーターを使用してプールされたアテンション モデルをトレーニングする場合は、二乗損失関数と確率的勾配降下法を使用します。

net = NWKernelRegression()
loss = nn.MSELoss(reduction='none')
trainer = torch.optim.SGD(net.parameters(), lr=0.5)
animator = d2l.Animator(xlabel='epoch', ylabel='loss', xlim=[1, 5])

for epoch in range(5):
    trainer.zero_grad()
    l = loss(net(x_train, keys, values), y_train)
    l.sum().backward()
    trainer.step()
    print(f'epoch {
      
      epoch + 1}, loss {
      
      float(l.sum()):.6f}')
    animator.add(epoch + 1, float(l.sum()))

出力:
ここに画像の説明を挿入
以下に示すように、パラメータを使用してアテンション プーリング モデルをトレーニングした後、次のことがわかります。 ノイズの多いトレーニング データを当てはめようとすると、予測結果は前のノンパラメトリック モデルほど滑らかではない線を描きます。

# keys的形状:(n_test,n_train),每一行包含着相同的训练输入(例如,相同的键)
keys = x_train.repeat((n_test, 1))
# value的形状:(n_test,n_train)
values = y_train.repeat((n_test, 1))
y_hat = net(x_test, keys, values).unsqueeze(1).detach()
plot_kernel_reg(y_hat)

出力
ここに画像の説明を挿入
なぜ新しいモデルはスムーズではないのでしょうか? 出力結果のプロットを見てみましょう。ノンパラメトリックな注意プーリング モデルと比較して、パラメータ化モデルに学習可能なパラメータを追加した後、注意の重みが大きい領域では曲線が滑らかでなくなります。

d2l.show_heatmaps(net.attention_weights.unsqueeze(0).unsqueeze(0),
                  xlabel='Sorted training inputs',
                  ylabel='Sorted testing inputs')

出力
ここに画像の説明を挿入

5 まとめ

  • Nadaraya-Watson カーネル回帰は、アテンション メカニズムを備えた機械学習パラダイムです。

  • Nadaraya-Watson カーネル回帰のアテンション プーリングは、トレーニング データの出力の加重平均です。注意の観点から見ると、各値に割り当てられる注意の重みは、値に対応するキーとクエリを入力として受け取る関数によって異なります。

  • アテンションプーリングはノンパラメトリックとパラメトリックに分類できます。

おすすめ

転載: blog.csdn.net/qq_52358603/article/details/128485768