【Transformerの基礎】Multi-Head Attentionの仕組み

Поделиться
HTML-код
  • Опубликовано: 9 фев 2023
  • 本動画では、Transformerの基礎として、Multi-Head Attentionの仕組みを分かりやすく解説しました。
    以前に、「Transformerについて本質を分かりやすく解説」( • Transformerについて本質を分かりや... )とういう動画をアップしましたが、そこでは、Transformerの技術的な部分について詳しく説明していないため、本動画を追加で作成しました。この動画を見ればTransformerで使用されている、Multi-Head Attentionについて詳細を理解していただけるのではないかと思います。
    Corrections:
    15:10 d_kの説明が間違っておりました。d_kはトークン数ではなく、正しくはKeyを構成するベクトルの次元数です。申し訳ございません。
    17:30 d_kの説明が間違っておりました。d_kはトークン数ではなく、正しくはKeyを構成するベクトルの次元数です。よって、図中の√5(5は具体例として示したI have a pen.のトークン数)は誤りであり、√d_kが図の表記として適切でした。該当記事の図は差し替えました。申し訳ございません。
    ・解説に使用した記事
    agirobots.com/multi-head-atte...
    ・Transformerに関する詳細な解説記事&動画
    agirobots.com/attention-mecha...
    • 【速習!】Attentionから始めるTra...
    ・RNNの解説記事&動画
    agirobots.com/lstmgruentrance...
    • 直感で理解するLSTM・GRU入門 - 機械...
    ブログ、Twitter、Instagramでも、情報を発信しています。
    チャンネルの登録や、フォローお願いします!
    blog:agirobots.com/
    twitter: / agirobots
    instagram: / agirobots
  • НаукаНаука

Комментарии • 22

  • @user-sp6xx4fl4c
    @user-sp6xx4fl4c 10 месяцев назад +1

    transformerのQKVの詳細な挙動が分からなく困っていたのですが、こちらの神動画&神サイトに出会えて全て解決しました!
    本当にありがとうございます😊

  • @doggy9745
    @doggy9745 6 месяцев назад +1

    素晴らしい動画ありがとうございます。解説の順番も導入もわかりやすかったです。

  • @tapoh
    @tapoh Год назад +3

    理解の助けになりました。ありがとうございます。

  • @goodnasubi888
    @goodnasubi888 Год назад +2

    謎だった部分の理解が出来ました!❤

  • @lemilemio
    @lemilemio 11 месяцев назад +1

    死ぬほどわかりやすかったです
    有料級コンテンツ

  • @alunalun-sn1ry
    @alunalun-sn1ry Год назад +1

    pytorchのmulti head attentionのソースコードを参照しているのですが、scaled dot product attentionからの出力をconcatenateしている箇所が見当たりません。pytorchのMHAはconcatenateやその後のlinear層を含むものになっているのでしょうか?

    • @AGIRobots
      @AGIRobots  Год назад +1

      コメントありがとうございます。
      結論から言うと、PyTorchのMHDには、concatやlinear層を含んでいると思います。
      以下、私もソースコードを読んでみました(細部までは読んでいませんが)
      pytorch.org/docs/stable/generated/torch.nn.MultiheadAttention.htmlの
      MHDクラスは内部でmulti_head_attention_forward関数を呼び出していて、この関数(ソース: github.com/pytorch/pytorch/blob/master/torch/nn/functional.py )では、scaled_dot_product_attentionの入力(5330~5332行目)はヘッド数だけ情報を持つテンソルになっています。出力の形状(shape)は動画でも説明した通り、qと同じですので、ソースコード5330行目より(bsz, num_heads, tgt_len, head_dim)です。この出力結果を5335行目のpermuteで順番を入れ替えて(tgt_len, bsz, num_heads, head_dim)に変換され、直後のview(bsz * tgt_len, embed_dim)でconcatされた形状になっているのではないかと思われます。linear層は5337行目に記載がありました。

  • @motostudies_jp
    @motostudies_jp Год назад +1

    デコーダにおいて、ある位置の単語を予測する際、図の右下から入ってくる入力は、BOSから一つ前の位置の単語までの系列(ベクトルが単語数だけ並んだもの)になると思うのですが、デコーダの真ん中にあるsorce-target attentionの層にクエリとして入るときは一本のベクトル(RNNの隠れ状態のようなもの)になってるのでしょうか?
    だとすると、どの段階でベクトルの系列が一つのベクトルに変換されるのでしょうか?
    (学習時は出力の系列全体がまとめて処理されると思いますがここではある特定の位置のトークンに着目しています。)

    • @AGIRobots
      @AGIRobots  Год назад

      コメントありがとうございます。
      ”デコーダの真ん中にあるsorce-target attention”とは、エンコーダからの出力とデコーダの入力を受けているデコーダのMulti-Head Attentionのことだと思いますが、そのクエリは1本のベクトルではなく行列になります。行列のサイズは、デコーダに入力される行列と同じになります。

    • @motostudies_jp
      @motostudies_jp Год назад +1

      @@AGIRobots ありがとうございます!ついでにもし宜しければ伺いたいのですが、デコーダの最後の出口のところでは、出力単語の確率分布を出すので一本のベクトルになるかと思ったのですが、この出口のリニア層で(デコーダに右下から入ってきた入力と同じ次元数の)行列をベクトルにするのでしょうか?(推論時にある特定の位置の単語の確率分布を求める場合の話です)

    • @motostudies_jp
      @motostudies_jp Год назад +1

      上の2回目の質問はなんか誤解してた気がします。デコーダーは、トランスフォーマーブロックに関してはインプットもアウトプットも単語数×埋め込み次元数の行列になっていて、入力単語のポジションごとに出力単語の確率分布を出すためのベクトルが別々に得られるということですかね。
      で、出力のi 番目の単語を生成するときは、インプットは「BOSからi-1番目の単語まで」、アウトプットは「1番目からi番目まで」の埋め込み表現を束ねた行列になってるという感じでしょうか。

    • @AGIRobots
      @AGIRobots  Год назад

      >デコーダの最後の出口のところでは、出力単語の確率分布を出すので一本のベクトルになるかと思ったのですが
      デコーダの出力トークン数はデコーダの入力トークン数と同じです。
      つまり、出力される行列サイズは入力される行列サイズと同じです。入力が行列で出力がベクトルになることはありません。
      動画でも使っている例を使うと、
      "I", "have", "a"
      のように3つのトークンを入力するとします。このときデコーダの出力は例えば、
      "have", "a", "pen"
      のようになります。入力文に対して予測された次の単語は、最後の単語を抽出すればよいです。今回の例なら、"pen"ですね。

    • @AGIRobots
      @AGIRobots  Год назад +1

      はい。そういうことになりますね。

  • @matsu_life
    @matsu_life Год назад +1

    スケール化のところで、次元数d _kを単語数(5)とされていますが、各単語の次元数(色がついたベクトルの長さ)の間違いではありませんか?

    • @matsu_life
      @matsu_life Год назад +1

      d_kが単語数ならば、なぜd_kが大きくなると内積が大きくなるのかが分かりません。

    • @AGIRobots
      @AGIRobots  11 месяцев назад +1

      ご指摘いただき、本当にありがとうございます。
      確認したところ、動画の説明は間違っておりました。正しくは、ベクトルの次元数、つまり各単語を表現する特徴ベクトルの次元数を指していおります。ご指摘の通り、d_kが単語数を示す場合、それが内積の大きさに影響を与えることはありません。
      誤った説明をしてしまい申し訳ございません。
      該当記事の図は差し替えしました。また、動画の該当箇所については、修正カードを追加しました。
      今後ともよろしくお願いいたします。

  • @contactglobal1414
    @contactglobal1414 10 месяцев назад

    scaled Dot-Product Attentionの中でもQueryとKeyとValueが同じものがSelf-Attentionですか?どこまでをattentionとさすのかイマイチ分かりません、、、

    • @AGIRobots
      @AGIRobots  10 месяцев назад

      コメントありがとうございます。私の解釈を述べさせていただきます。
      まず、Attentionは抽象的な名称であり、どこまでをAttentionと呼んでいるのかは論文によっても異なることがあります。
      私の場合は、基本的に、Single-Head AttentionをAttentionと呼んでいます(Single-Head AttentionはHulti-Head Attentionと区別するためにそのように読んでいるだけであり、複数使用しないのであれば、そのままAttentionと呼んでも問題ないため)。Scaled Dot-Product AttentionのことをAttentionと省略して呼ぶことが少ないのは、おそらく、Scaled Dot-Product以外の手法も存在し、それをテーマとして扱う場合はそこを明確に述べる必要があるからだと思います。すなわち、Attentionとだけ呼ぶときの説明者側の気持ちとしては、Scaled Dot-Productかどうかを明確にする必要がない、すなわち、そのような詳しい内部的な仕組みはブラックボックスとして述べられるSingle-Head Attentionのことを指すと思ってもらえばよいと思います。
      また、AttentionがSelfか、SourceTarget(Cross)かは、その入力の違いについて分類したものなので、そこで使用されているAttentionがScaled Dot-Product Attentionである必要はありません。Multi-Head Attentionでも、QueryとKey、Valueの全てが同じであれば、Self-Attentionと呼びます。混乱を招かないように説明するなら、Self-Attention型のMulti-Head Attentionというと混同を避けられるかもしれません。
      動画の中では、そこら辺を意識して説明しているつもりではありますが、もしかしたら私自身も混同して説明してる可能性があるので、混乱を招いてしまい申し訳ありませんでした。参考になれば幸いです。

    • @contactglobal1414
      @contactglobal1414 10 месяцев назад +1

      @@AGIRobots こんなにも丁寧に説明していただけるとは、、大変勉強になりました!!ありがとうございます。

  • @tamone2mee302
    @tamone2mee302 Год назад +1

    クエリとキーバリューの内積を取ってどの程度近いのかという計算は具体的にどういう意味ですか?同じ文章の中で何を基準に近いと決めるんですか?リニア層(文に関係なく単語が沢山ならんだもの?)で対象の単語が同じ頻度(ドット積?)で現れるみたいな意味ですか?あと、特徴部分空間とは何ですか?調べてみましたがよくわかりませんでした。
    あと大規模言語モデルだとパラメーターが何百億もあるとの事ですが、それは何処の層にあるのですか?
    お手数ですが教えていただけると助かります!

    • @AGIRobots
      @AGIRobots  Год назад +2

      コメントありがとうございます。
      順番に回答しますね。
      ① Scaled Dot-Product Attentionに分散表現された単語ベクトルを与える場合を考えてみます。分散表現された単語ベクトル(Word2Vec)の特徴空間では、例えば、「King = Queen - Woman + Man」のような、単語の意味や関係性による演算ができるようにベクトルが配置されています。Word2Vec表現されたベクトル間の内積は、意味の類似性を表しますので、QueryとKeyの内積をとる操作は、文章からQueryと類似している単語を抽出する作業になります。
      ② 特徴部分空間と言っているのは、Multi-Head Attention層の特徴空間と、各ヘッド(Single-Head Attention)の特徴空間を分けるためです。Multi-Head Attentionの中には複数のSingle-Head Attentionが並列に配置されているので、Multi-Head Attentionから見れば、Single-Head Attentionの特徴空間は特徴部分空間です。意味的には、特徴空間と大差ありません。ここら辺は、動画では厳密に使い分けしていないかもしれません...
      ③ 大規模言語モデルを構成するTransformerのパラメータです。すなわち、Linear層とFFNです。例えば、GPT-3だと、TransformerのDecoderが96層も組み合わされています。
      こんな感じではないでしょうか?