Github#フィードバック変圧器これは、フィードバックメモリを用いたシーケンシャル・トランスフォーマーの高位表現へのアクセスに関する論文「PyTorch」のPyTorch実装です。通常のトランスフォーマーはトークンを並行して処理します。各トランス層は、前の層の出力に注目します。フィードバックトランスは、前のステップのすべてのレイヤーの出力に注目します。そのため、これによって繰り返しが発生し、トークンごとに処理する必要があります。これにより、トレーニングが大幅に遅くなります(シーケンスの長さにもよりますが、約5倍から10倍です)。Transformerを予測する場合、メモリベクトルをキャッシュすれば次のトークンを予測できるため、より高速です。トレーニングをスピードアップするために、この論文では短いシーケンス長から始めて、徐々に長くする方法について説明します。事前学習済みの並列変圧器を出発点として使用する方法についても説明します。オリジナルのフィードバックトランスは、すべてのレイヤーの出力を保持するわけではありません。代わりに、すべてのレイヤーの出力の加重合計が保持されます。これにより、予測中のキャッシュに使用されるメモリが減ります。このファイルの前半はこれを実装しています。Wkl​更新されたフィードバックトランスフォーマーは重みを共有し、Wvl​レイヤー間のキーと値の計算に使用されます。その後、各ステップのキーと値を一度だけ計算し、キャッシュに保存します。このファイルの後半はこれを実装しています。Shakespeareデータセットのフィードバックトランスフォーマーをトレーニングするためのトレーニングコードとノートブックは次のとおりです。clone_module_list#フィードバック注意このモジュールは、オリジナルのトランスフォーマーの論文で出てきたアテンションと同様の反復アテンションを計算します。これらは多面的な注意力を変えます。多面的な注目を集めます。12#クエリを基準としたキーの相対位置埋め込み。requires_grad=True)#クエリに対するキーの相対的な位置埋め込みバイアス。None#アテンションスコアを取得Transformer-XLの論文で紹介されている相対マルチヘッドアテンションと同様に、アテンションには相対位置エンコーディングを使用しています。現在のステップのクエリからキーインステップj(現在のステップを基準とする)への注意は、Aj​​=Q⊤Kj​=linq​(Xq+Pq​)⊤link​(Xjk​+Pj​)=(Q+UQ)⊤(Kj​+UjK​)=AQ⊤Kj​​+BQ⊤UjK​​+CUQ⊤Kj​​+DUQ⊤UjK​​​ここでQ,Kj​、Xq,Xjk​は元の埋め込みの線形変換で、UQ,UjK​は位置エンコーディングの線形変換です。Pq​,Pj​D用語をに置き換えますSj​。self.value(value)#アテンションスコアを計算します。self.output(x)#フィードバックトランス層これにより、フィードバックトランスに単一のトランス層が実装されます。self.norm_self_attn(x)#自己注意を向ける。nn.LayerNorm([layer.size])#メモリベクトルは、各レイヤーの表現の加重和として計算されます。これがそのためのウェイトパラメータです。Pythonリストに追加してから実行する代わりに、カスタム関数を実装します。シーケンスの各ステップで呼び出すよりもパフォーマンスが大幅に向上します。このメソッドとそれに付随するクラスは各ステップのメモリを共有します。(つまりスタックのサイズ)これにより、ステップアップのスタックテンソルが返されます。forwardこれにより、共有メモリテンソルに勾配が蓄積され、スタック内の結果に対する勾配が返されます。None#スタックモジュールこれは上記で定義したスタック関数を使用し、必要な初期化を行います。torch.Tensor):#値を追加した後にスタックを取得(使用)する必要があります。value.shape:#これはスタックが空の場合にのみ発生するはずです。requires_grad=False)#メモリはすでに初期化されていますが、スタックをリセットしています。こちらの方が使いやすいことがわかりました。n#スタックに最後に追加された値を記録します。グラデーションを逆方向に伝播させるには、これを渡す必要があります。get(self):#使用時のスタックのサイズを記録しておきます。これはサニティチェックインに使用されます。呼び出されるようにします。None#更新されたフィードバックトランスモジュールこれは、キーと値をキャッシュする更新されたフィードバックトランスモジュールです。nn.LayerNorm([layer.size])#メモリベクトルは、各レイヤーの表現の加重和として計算されます。これがそのためのウェイトパラメータです。