「.NET 開発基盤部会 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
目次 †
概要 †
自己符号化器(AE:オートエンコーダ)、自己識別機とも呼ばれる。
歴史 †
- AEのポイントは、可視層より隠れ層の次元(数)を少なくしてある(情報の圧縮)。
- このAEを積み重ね、ディープAE、正確には、積層AEを作成(ジェフリー・ヒントン)。
層の積み重ねは、事前学習とファイン・チューニングによって達成される。
- はじめに事前学習を行い層を積み重ねていく。
- 最上部に層を足し、教師あり学習にする(?)
特徴 †
教師あり、なし †
- 入力データと一致するデータを出力することを目的とする教師なし学習
- データとしては教師なしだが(、学習としては)、入力データを用いた教師あり学習。
入出力を一致させる。 †
- 入出力が一致するように各エッジの重みを調整
- 出力と入力に対して誤差を算出し、その差が小さくなるように誤差逆伝播法を用い重みを学習する。
特徴表現の獲得 †
隠れ層の次元を小さくして情報量を小さくした特徴表現を獲得する。
(入力の情報を圧縮される。→ 学習の結果、重みとして要約される。)
- 入力したデータをEncoderで潜在空間上の特徴量(潜在変数z)に圧縮(次元削減・特徴抽出)し、
- 潜在空間上の特徴量(潜在変数z)からDecoderで復元(再び戻して出力)する。
※ EncoderもDecoderもニューラルネットワーク
種類 †
様々な種類があるもよう。
できること †
様々な用途で利用されている。
詳細 †
変分オートエンコーダ(VAE) †
- 画像生成では変分オートエンコーダ(VAE)を使う。
- AEを活用、学習データが何らかの分布に基づいて生成されていると仮定
- 生成される画像は鮮明ではなく、ぼやけた画像になる。
仕組み †
- Encoder
- 入力データが多次元ガウス分布として符号化され、その分布から潜在変数zをサンプリング。
- つまり、多次元ガウス分布を記述する平均 μ と分散 σ^2 を返すようにEncoderを学習。
- Decoder
- サンプリングされた潜在変数zから、元々の入力データを再構成したものを出力。
潜在変数z †
- 中間層
- z~N(μ, σ^2)
- ノイズ : ϵ~N(0, I)
- z = μ+σϵ
- 潜在空間上の特徴量、潜在変数z...
- ...は入力x1, x2を、異なる潜在変数の領域に正規分布に沿ってマッピング。
- ...が連続的な分布(正規分布)になっているので、
- ...を調整することで連続的に生成データが変化する。
最適化 †
x をより良く表現する p(X) のパラメータを学習するには、周辺尤度 logp(X) の最大化を考える。
記号 | 説明 |
X | 再構成されるデータ |
p(X) | 再構成されるデータの確率分布 |
z | 潜在変数z |
p(z) | 潜在変数zの確率分布 |
p(X|z) | 潜在変数zが与えられた時のxの確率分布(Decoder) |
q(z|X) | データXが与えられた時のzの確率分布(Encoder) |
復元誤差 †
Decoderによる誤差
KLダイバージェンス †
Encoderによる誤差
損失関数 †
復元誤差とKLダイバージェンスの展開式を損失関数として利用することでVAEを最適化出来る
- その情報に注目スべきか判断して情報を処理するAttentionの導入。
- Self-Attention機構の重要性を示し、他の分野にも影響を与えた。
- 汎用性が高くコレを画像処理に応用したのが、Vision Transformer。
※ RNN Encoder-DecoderのAttention機構と同じ目的を達成するが機構は異なる。
アーキテクチャ †
- Attention機構をMulti-head Attentionに置き換えた、
- 「並列化できない」「長期記憶ができない(大域的な特徴・ニュアンスを捉え難い)」問題を解決。
- 並列計算で高速な学習が可能になった。
- 後半に行けばいくほど昔の記憶を維持するのが難しくなる問題を解決。
- Positional Encoding(位置エンコーディング)でベクトルに語順情報を付加。
パフォーマンス †
RNN Encoder-Decoder(Sequence-to-Sequence)系よりも早くて精度が高い
- 処理が速い:並列化によって学習時間を大幅に短縮。
- データを逐次処理する必要がなく、
- 並列化で訓練時間が圧倒的に削減でき
- ビッグデータで効率的に学習できる。
- 精度が高い:英独翻訳タスクで従来モデルの最良結果を超える。
- 汎用性が高い:汎用的で、大規模なモデルも構築可能
タスクの概要と構造 †
- 翻訳タスク
スペイン語 → 英語
- Yo tengo gatos → I have cats
- ...と、catsを予測するTransformer.
- 入力と出力
翻訳タスク(Yo tengo gatos → I have cats)
- 入力
- Self-Attention:「Yo tengo gatos」
- Masked Self-Attention:「I have [cats]」※ []はMask
- 出力
- 次単語予測(BEAM search):「cats」を予想する。
- Decoderが通常のSeq2seqのように逐次的に単語を出力していく。
- 以下の前処理が処理前に行われる。
- ストップワード削除済み原文
- Embeding:単語の分散表現で512次元のベクトルに圧縮
- Positional Encoding:単語の順番情報を埋込。
- Encoderの出力を一気にDecoderに入れる。
- Encoder
文章を意味に変換する。
- Self-Attention(Multi-head Attention)
1文の単語だけを使って計算された単語間の照応関係を付加
| I | have | cats |
I | 0.88 | 0.10 | 0.02 |
have | 0.08 | 0.80 | 0.12 |
cats | 0.03 | 0.14 | 0.83 |
- Position-Wise Feed-Forward Networks(PFFN)
2層のDNN:FFN(x) = ReLU(xW1+b1)W2+b2
- Source-Target Attention(Multi-head Attention)
ここまでの出力をQueryに、Encoderの出力をKeyとValueにして
Multi-Head AttentionでAttentionを計算し異なる時系列データの照応関係情報を獲得
- Position-Wise Feed-Forward Networks(PFFN)
2層のDNN:FFN(x) = ReLU(xW1+b1)W2+b2
オートエンコーダ †
- Position-Wise Feed-Forward Networks層は...
・入力はQと同サイズのトークン・ベクトルが並んだ文章で
・Position-Wiseは各トークン毎(位置単位)に計算をすると言う意味
- それぞれのサブ層の後にはAdd&Normがある。
- Add:残差接続
- Norm:Layer Normalization(学習高速化の正規化)
#ref(): File not found: "Transformer2.jpg" at page "自己符号化器(AE:オートエンコーダ)"
| #ref(): File not found: "Transformer3.jpg" at page "自己符号化器(AE:オートエンコーダ)"
| #ref(): File not found: "Transformer4.jpg" at page "自己符号化器(AE:オートエンコーダ)"
|
https://nlpillustration.tech/?p=2171 |
Transformer Block †
Transformer ≒ Transformer Block
- 計算結果をPosition-Wise Feed-Forward Networksに適用。
- 最終的なTransformer Blockの出力とする。
Multi-head Attention †
- Multi-head Attention
- Single-Head Attention(Scaled Dot-Product AttentionとLinear層からなる)を並列化したもの。
- 獲得された学習パラメタを可視化すると並列に並んでいる各Single-Headが異なる注意表現を獲得している(後述の①)。
- これは、後述のScaled Dot-Product AttentionのK、Vの値を決める重み、出力を調整する重みの学習になる。
Single-Head Attention | Multi-head Attention |
#ref(): File not found: "Transformer6.png" at page "自己符号化器(AE:オートエンコーダ)"
| #ref(): File not found: "Transformer7.png" at page "自己符号化器(AE:オートエンコーダ)"
|
Multi-head Attention内部で行われる計算 |
#ref(): File not found: "Transformer8.png" at page "自己符号化器(AE:オートエンコーダ)"
|
#ref(): File not found: "Transformer9.png" at page "自己符号化器(AE:オートエンコーダ)"
|
① 行列をかける。Q = K = V = Xなのでそれぞれを変形させる。 ・QWiqはh=8なのでXの次元を1/8にする。= Xのどの部分を処理するか?を変える。 ・KWikは内積を取る前にXの角度を変える。= どの部分に注目するか?注目の仕方を変える。 ・VWivは出力する前にXの角度を変える。= 出力の様子を調整する。 |
② Scaled Dot-Product Attentionを行う(後述)。 |
③ Concatで横に繋げる(1/hにしたものをh倍にする)。 |
④ 行列Woをかける。 |
https://agirobots.com/multi-head-attention/ |
- Single-Head Attention
HeadとはLinear層*3とScaled Dot-Product Attention層*1の4つの組合せ
- Linear層
Scaled Dot-Product Attention層の直前に学習パラメタを持つLinear層を設け、
多種多様な特徴部分空間における注意表現を学習可能にする柔軟性を獲得させている。
- Scaled Dot-Product Attention層
- 内積に基づく注意計算を行うだけとなっていて内部に学習パラメタを持たない。
- スケール化内積注意と訳せるだけに、内積を利用したベクトル間の類似性に基づく変換を行う注意機構
#ref(): File not found: "Transformer10.png" at page "自己符号化器(AE:オートエンコーダ)"
| #ref(): File not found: "Transformer11.png" at page "自己符号化器(AE:オートエンコーダ)"
|
・Qは横ベクトルqの縦ベクトル ・Kは横ベクトルkの縦ベクトル ・Vは横ベクトルvの縦ベクトル(KV(kv)はペアになっている) |
QをqにしてSingle-Head Attentionで考えると、qtKは、同様に、qkの内積(類似度)の横ベクトルになる。また、√dkは、次元が大きくなると長くなるので補正する。コレを同様にSoftmaxで重み(Attention_Weight)に変換し、この重み(Attention_Weight)とVのdot積=加重和がCi(文脈を加味した単語ベクトル)になる。 |
Attention(q, K, V)では、qとkiが似ていて場合 Pi≒1 他≒0となる場合、kiとの類似度に応じたVの加重和はほぼviになる。Attention(Q, K, V)はバッチで処理。 |
https://agirobots.com/multi-head-attention/ |
- Concat+Linear層(前述の③、④)
- Concat
- Linear:活性化関数が恒等関数(なのでPosition-Wise Feed-Forward Networksがある)
数式のポイントとベクトルの内容 †
- 数式のポイント
- Xは縦ベクトルではなく横ベクトル、WXではなくXW(= tWtX)
- 詰まる所、以下の様な事をやっているらしい。
- ベクトルの内容
文のベクトル | #ref(): File not found: "Transformer12.png" at page "自己符号化器(AE:オートエンコーダ)"
| #ref(): File not found: "Transformer14.png" at page "自己符号化器(AE:オートエンコーダ)"
|
QKVのベクトル | #ref(): File not found: "Transformer13.png" at page "自己符号化器(AE:オートエンコーダ)"
|
QKVから計算して得たCi(文脈を加味した単語ベクトル) |
#ref(): File not found: "Transformer15.png" at page "自己符号化器(AE:オートエンコーダ)"
| #ref(): File not found: "Transformer16.png" at page "自己符号化器(AE:オートエンコーダ)"
| #ref(): File not found: "Transformer17.png" at page "自己符号化器(AE:オートエンコーダ)"
|
並列に並んでいる各Single-Headが異なる注意表現を獲得している |
#ref(): File not found: "Transformer18.png" at page "自己符号化器(AE:オートエンコーダ)"
|
https://agirobots.com/multi-head-attention/ |
アーキテクチャ †
エンコーダを持たず、Transformerのデコーダと似た構造を持つネットワーク
パフォーマンス †
タスクの概要と構造 †
- 次単語予測、文章穴埋
- 自然言語推論 (NLI) :2テキスト間の推論的関係の同定
- 分類、意味、文章生成(翻訳、要約、対話生成、Q&A)
- 計算(足し算・引き算)もできる。
- ソースコード生成、デザイン支援もできる。
- 苦手なタスク
文の意味を人間のように理解していない
- 比較が苦手
- 人間社会、物理現象の慣習や常識を認識、推論できない。
- ファイン・チューニング
少データ、少資源でOKのため、多くの応用が可能。
- 最終層のみ取り替えて教師あり学習
- 数例のデータしか必要としないので教師データの作成が楽
- 学習も3エポック程度の学習で済む。
- 代替手段となるfew-shot学習は、学習を行っているわけではなく、
巨大な汎用事前学習モデルの中の学習結果から求められている学習結果を引き出しているだけ。
バージョン †
- 2019年にGPT-2、2020年にGPT-3が発表
- GPT-3
- 1750億のパラメタ、約45TBのコーパスで事前学習と、BERTに比べてあまりにも巨大
アーキテクチャ †
Transformerのエンコーダーを双方向多層に積み重ねたアーキテクチャ
- 双方向(文頭と文末)から学習することによって「文脈を読むこと」が実現された。
- 膨大な量のテキストデータからテキストの単語の連なりの「言語らしさ」を学習
- 長く複雑な文章を読み取ることができ文脈を読むことが可能になった
パフォーマンス †
上位の層では意味・文脈に関する抽象化された情報が獲得される事を期待。
タスクの概要と構造 †
マスクされた単語の前後のテキストを使って単語を予測する。
- 元々は機械翻訳で利用されていた。
- 今は自然言語処理なら大概できる。
- 質問応答(質問に対する回答を文書中から見つけてくる)
- 文の比較(片方の文がもう一方の文の内容を含んでいるか)
- 事前学習に工夫をしている。
- マスクされた単語の予測を学習(MLM)
- 連続する2文であるか判断を学習(NSP)
- リソースと時間が必要なので学習済みモデル(汎用事前学習モデル)をGoogleが無償で公開
- チューニング
実現したいタスクに応じた数百レベルの学習データを用意してファイン・チューニング
- 事前学習結果を実際に使う場合。
- BERTの上にタスク依存の層を重ねる。
- 数百件レベルの学習データで実施可能
参考 †
Qiita †
YouTube? †
以下はブログ側