oneAPI 1.3 暫定仕様書 Rev. 1 の解説 (20)

その他

この記事は、https://www.oneapi.io/spec/ で 2023年9月14日に公開された『oneAPI 1.3 Provisional Specification Rev. 1』 (HTMLPDF) をベースにしています。原文は2000 ページ近くあり、翻訳の時間とリソースも限られるため、全文翻訳ではなく、記事形式で区切った仕様とその解説を提供することにしました。


この回では、『oneAPI 1.3 Provisional Specification Rev. 1』の「oneDNN」の「Layer normalization」と「Local Response Normalization」の節を取り上げています。

レイヤーの正規化

レイヤーの正規化プリミティブは、2D~5D データテンソルで順方向または逆方向のレイヤー正規化操作を実行します。

レイヤーの正規化操作は、データテンソルの最後の論理軸に対して正規化を行います (次の式で定義されます)。ここでは、高次元のケースで一般化が容易な 3D データの式を示します。変数名は標準の規則に従います。

順方向 (前方)

説明:

  • γ(c)β(c) は、チャネルのオプションのスケールとシフトです (use_scaleuse_shift フラグを参照)。

  • μ(t,n)σ2(t,n) は、平均と分散です (use_global_stats フラグを参照)。

  • ε は数値の安定性を向上させる定数です。

平均と分散は実行時に計算されるか、ユーザーによって提供されます。平均と分散を実行時に計算する場合、次の式が使用されます。

γβ テンソルは学習可能です。

順方向トレーニングと順方向推論の違い

平均と分散が実行時に計算される場合 (つまり use_global_stats が設定されていない場合)、それらは伝播種別 forward_training の出力となり (逆伝播で必要となります)。平均と分散のデータレイアウトは、統計用のメモリー記述子を渡すことで (例えば、dnnl::layer_normalization_forward::desc::desc()stat_desc を渡す) レイヤー正規化記述子の初期化中に指定する必要があります。平均と分散は、伝播種別 forward_inference では公開されていません。

逆方向 (後方)

逆方向伝播では、diff_dst(t,n,c)src(t,n,c)μ(t,n)σ2(t,n)γ(c)∗ および β(c)∗ に基づいて、diff_src(t,n,c)diff_γ(c)∗diff_β(c)∗ を計算します。

アスタリスク付きのテンソルは、プリミティブが γ(c)β(c) を使用するように構成されている (use_scaleuse_shift が設定される) 場合にのみ使用されます。

実行引数

フラグと伝播の種別に応じて、レイヤー正規化プリミティブには異なる入力と出力が必要です。以下に要約します。

実行時に入力と出力は、次の表で示す実行引数インデックスにマップする必要があります。

操作の詳細

  1. プリミティブのさまざまな振る舞いは、操作記述子の初期化関数 (dnnl::layer_normalization_forward::primtive_desc) などに渡される flags パラメーターによって部分的に制御できます。複数のフラグはビットごとの OR 演算子 (|) を使用して組み合わせることができます。

  2. 順伝播の場合、平均と分散は実行時に (プリミティブの出力として) 計算されるか、ユーザーによって (入力として) 提供されます。後者の場合、use_global_stats フラグを設定する必要があります。逆伝播の場合、平均と分散は常に入力パラメーターとなります。

  3. 順方向と逆方向の両方でインプレース操作がサポートされ、src は順方向伝播の入力および出力として使用でき、diff_dst は逆伝播の入力および出力として使用できます。インプレースの場合、元のデータは上書きされます。逆伝播では元の src が必要であるため、対応する順伝播をインプレースで実行してはなりません。

サポートされるデータタイプ

レイヤーの正規化では次のデータタイプの組み合わせをサポートします。

注: この節では、可読性のためデータタイプの名称を省略しています。例えば、dnnl::memory::data_type::f32f32 に省略されます。

伝播 ソース/デスティネーション 平均/分散/スケール/シフト
順方向/逆方向 f32 f32
順方向 f16 f32

データ表現

平均と分散

平均 (μ) と分散 (σ2) は、(data_ndims−1) に等しい次元数と size (data_dim [0], data_dim [1],..., data_dim [ndims−2]) を持つ個別のテンソルです。

対応するメモリー・オブジェクトは、任意のメモリー形式にできます。平均と分散が実行時に計算されて公開されていない場合 (つまり、伝播の種別が forward_inferenceuse_global_stats が設定されていない)、ユーザーはレイヤー正規化記述子を初期化する際に統計用のメモリー記述子を用意する必要があります。最高のパフォーマンスを達成するには、データメモリー形式に応じたメモリー形式を使用することを推奨します。つまり、データ形式が tnc である場合、tn 形式の統計では最高のパフォーマンスを期待できますが、nt 形式の統計では最高のパフォーマンスは期待できません。

スケールとシフト

使用する場合、スケール (γ) とシフト (β) は、形状 2×C の単一 2D テンソルに結合されます。

対応するメモリー・オブジェクトの形式は nc (ab) である必要があります。

ソース、デスティネーション、およびそれらの勾配

レイヤー正規化プリミティブは任意のデータテンソルで機能しますが、RNN データテンソル (nctncldnc) 向けに設計されています。CNN データテンソルとは異なり、RNN データテンソルには単一の特徴次元があります。レイヤーの正規化は、非特徴次元全体で最後の論理次元 (RNN テンソルの特徴次元) に対して正規化を実行します。

レイヤー正規化プリミティブは次のメモリー形式に最適化されています。

論理テンソル メモリー形式向けに最適化された実装
NC nc (ab)
TNC tnc (abc), ntc (bac)
LDNC ldnc (abcd)

API

API については、こちら (英語) をご覧ください。

ローカル応答の正規化

LRN プリミティブは、次の式で定義される順方向もしくは逆方向のローカル応答正規化操作を行います。変数名は標準の規則に従います。

順方向 (前方)

LRN とアルゴリズム lrn_across_channels:

LRN とアルゴリズム lrn_within_channel:

ここで、nllocal_size です。2D 空間データ向けの式が提供されています。

逆方向 (後方)

逆方向伝播は、diff_dst(n,c,h,w)src(n,c,h,w) に基づいて diff_src(n,c,h,w) を計算します。

実行引数

実行時に入力と出力は、次の表で示す実行引数インデックスにマップする必要があります。

操作の詳細

  1. トレーニング中、LRN は順方向パスと逆方向パスでワークスペースを必要とする場合があります。動作は実行に依存します。最適化された実装では、通常ワークスペースが必要であり、順方向パスからの中間結果を保存して、逆方向パスの計算を高速化します。ワークスペースが必要であるか確認するには、ワークスペースの LRN プリミティブ記述子を照会します。照会が成功した場合、ワークスペースが必要であり、記述子が返されます。

サポートされるデータタイプ

LRN プリミティブは次のデータタイプの組み合わせをサポートします。

注: この節では、可読性のためデータタイプの名称を短縮しています。例えば、dnnl::memory::data_type::f32f32 に短縮されます。

データ表現

ソース、デスティネーション、およびそれらの勾配

他のプリミティブと同様に、LRN プリミティブは次のテンソルを想定します。

LRN プリミティブは次のメモリー形式に最適化されています。

ここでいう optimized (最適化) とは、前述の計算集約型プリミティブによって選択された形式を意味します。

post-ops と属性

LRN プリミティブは post-ops や属性をサポートしません。

API

API については、こちら (英語) をご覧ください。


法務上の注意書き

The content of this oneAPI Specification is licensed under the Creative Commons Attribution 4.0 International License (英語). Unless stated otherwise, the sample code examples in this document are released to you under the MIT license (英語).

This specification is a continuation of Intel’s decades-long history of working with standards groups and industry/academia initiatives such as The Khronos Group*, to create and define specifications in an open and fair process to achieve interoperability and interchangeability. oneAPI is intended to be an open specification and we encourage you to help us make it better. Your feedback is optional, but to enable Intel to incorporate any feedback you may provide to this specification, and to further upstream your feedback to other standards bodies, including The Khronos Group SYCL* specification, please submit your feedback under the terms and conditions below. Any contribution of your feedback to the oneAPI Specification does not prohibit you from also contributing your feedback directly to other standard bodies, including The Khronos Group under their respective submission policies.

By opening an issue, providing feedback, or otherwise contributing to the specification, you agree that Intel will be free to use, disclose, reproduce, modify, license, or otherwise distribute your feedback at its sole discretion without any obligations or restrictions of any kind, including without limitation, intellectual property rights or licensing obligations.

This document contains information on products, services and/or processes in development. All information provided here is subject to change without notice.

© Intel Corporation. Intel、インテル、Intel ロゴ、その他のインテルの名称やロゴは、Intel Corporation またはその子会社の商標です。

* その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

« パート 19        目次        パート 21 »
タイトルとURLをコピーしました