ขนาดวิดีโอ: 1280 X 720853 X 480640 X 360
แสดงแผงควบคุมโปรแกรมเล่น
เล่นอัตโนมัติ
เล่นใหม่
記事をベースに音声で解説してくれているのでめちゃめちゃわかりやすい。この記事+音声動画の形式の学習教材をバンバン出してほしいです!応援してます!
素晴らしい動画ありがとうございます。解説の順番も導入もわかりやすかったです。
transformerのQKVの詳細な挙動が分からなく困っていたのですが、こちらの神動画&神サイトに出会えて全て解決しました!本当にありがとうございます😊
理解の助けになりました。ありがとうございます。
謎だった部分の理解が出来ました!❤
死ぬほどわかりやすかったです有料級コンテンツ
pytorchのmulti head attentionのソースコードを参照しているのですが、scaled dot product attentionからの出力をconcatenateしている箇所が見当たりません。pytorchのMHAはconcatenateやその後のlinear層を含むものになっているのでしょうか?
コメントありがとうございます。結論から言うと、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行目に記載がありました。
スケール化のところで、次元数d _kを単語数(5)とされていますが、各単語の次元数(色がついたベクトルの長さ)の間違いではありませんか?
d_kが単語数ならば、なぜd_kが大きくなると内積が大きくなるのかが分かりません。
ご指摘いただき、本当にありがとうございます。確認したところ、動画の説明は間違っておりました。正しくは、ベクトルの次元数、つまり各単語を表現する特徴ベクトルの次元数を指していおります。ご指摘の通り、d_kが単語数を示す場合、それが内積の大きさに影響を与えることはありません。誤った説明をしてしまい申し訳ございません。該当記事の図は差し替えしました。また、動画の該当箇所については、修正カードを追加しました。今後ともよろしくお願いいたします。
デコーダにおいて、ある位置の単語を予測する際、図の右下から入ってくる入力は、BOSから一つ前の位置の単語までの系列(ベクトルが単語数だけ並んだもの)になると思うのですが、デコーダの真ん中にあるsorce-target attentionの層にクエリとして入るときは一本のベクトル(RNNの隠れ状態のようなもの)になってるのでしょうか?だとすると、どの段階でベクトルの系列が一つのベクトルに変換されるのでしょうか?(学習時は出力の系列全体がまとめて処理されると思いますがここではある特定の位置のトークンに着目しています。)
コメントありがとうございます。”デコーダの真ん中にあるsorce-target attention”とは、エンコーダからの出力とデコーダの入力を受けているデコーダのMulti-Head Attentionのことだと思いますが、そのクエリは1本のベクトルではなく行列になります。行列のサイズは、デコーダに入力される行列と同じになります。
@@AGIRobots ありがとうございます!ついでにもし宜しければ伺いたいのですが、デコーダの最後の出口のところでは、出力単語の確率分布を出すので一本のベクトルになるかと思ったのですが、この出口のリニア層で(デコーダに右下から入ってきた入力と同じ次元数の)行列をベクトルにするのでしょうか?(推論時にある特定の位置の単語の確率分布を求める場合の話です)
上の2回目の質問はなんか誤解してた気がします。デコーダーは、トランスフォーマーブロックに関してはインプットもアウトプットも単語数×埋め込み次元数の行列になっていて、入力単語のポジションごとに出力単語の確率分布を出すためのベクトルが別々に得られるということですかね。で、出力のi 番目の単語を生成するときは、インプットは「BOSからi-1番目の単語まで」、アウトプットは「1番目からi番目まで」の埋め込み表現を束ねた行列になってるという感じでしょうか。
>デコーダの最後の出口のところでは、出力単語の確率分布を出すので一本のベクトルになるかと思ったのですがデコーダの出力トークン数はデコーダの入力トークン数と同じです。つまり、出力される行列サイズは入力される行列サイズと同じです。入力が行列で出力がベクトルになることはありません。動画でも使っている例を使うと、"I", "have", "a"のように3つのトークンを入力するとします。このときデコーダの出力は例えば、"have", "a", "pen"のようになります。入力文に対して予測された次の単語は、最後の単語を抽出すればよいです。今回の例なら、"pen"ですね。
はい。そういうことになりますね。
クエリとキーバリューの内積を取ってどの程度近いのかという計算は具体的にどういう意味ですか?同じ文章の中で何を基準に近いと決めるんですか?リニア層(文に関係なく単語が沢山ならんだもの?)で対象の単語が同じ頻度(ドット積?)で現れるみたいな意味ですか?あと、特徴部分空間とは何ですか?調べてみましたがよくわかりませんでした。あと大規模言語モデルだとパラメーターが何百億もあるとの事ですが、それは何処の層にあるのですか?お手数ですが教えていただけると助かります!
コメントありがとうございます。順番に回答しますね。① 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層も組み合わされています。こんな感じではないでしょうか?
どなたか。出力層のマスクド〜が、未来の情報を使ってはいけない、というところの(計算方法ではなく本来持つl意味が全くわかりません。。実例を用いてご説明頂けませんでしょうか。。。ここだけが理解できず。。
記事をベースに音声で解説してくれているのでめちゃめちゃわかりやすい。この記事+音声動画の形式の学習教材をバンバン出してほしいです!応援してます!
素晴らしい動画ありがとうございます。解説の順番も導入もわかりやすかったです。
transformerのQKVの詳細な挙動が分からなく困っていたのですが、こちらの神動画&神サイトに出会えて全て解決しました!
本当にありがとうございます😊
理解の助けになりました。ありがとうございます。
謎だった部分の理解が出来ました!❤
死ぬほどわかりやすかったです
有料級コンテンツ
pytorchのmulti head attentionのソースコードを参照しているのですが、scaled dot product attentionからの出力をconcatenateしている箇所が見当たりません。pytorchのMHAはconcatenateやその後のlinear層を含むものになっているのでしょうか?
コメントありがとうございます。
結論から言うと、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行目に記載がありました。
スケール化のところで、次元数d _kを単語数(5)とされていますが、各単語の次元数(色がついたベクトルの長さ)の間違いではありませんか?
d_kが単語数ならば、なぜd_kが大きくなると内積が大きくなるのかが分かりません。
ご指摘いただき、本当にありがとうございます。
確認したところ、動画の説明は間違っておりました。正しくは、ベクトルの次元数、つまり各単語を表現する特徴ベクトルの次元数を指していおります。ご指摘の通り、d_kが単語数を示す場合、それが内積の大きさに影響を与えることはありません。
誤った説明をしてしまい申し訳ございません。
該当記事の図は差し替えしました。また、動画の該当箇所については、修正カードを追加しました。
今後ともよろしくお願いいたします。
デコーダにおいて、ある位置の単語を予測する際、図の右下から入ってくる入力は、BOSから一つ前の位置の単語までの系列(ベクトルが単語数だけ並んだもの)になると思うのですが、デコーダの真ん中にあるsorce-target attentionの層にクエリとして入るときは一本のベクトル(RNNの隠れ状態のようなもの)になってるのでしょうか?
だとすると、どの段階でベクトルの系列が一つのベクトルに変換されるのでしょうか?
(学習時は出力の系列全体がまとめて処理されると思いますがここではある特定の位置のトークンに着目しています。)
コメントありがとうございます。
”デコーダの真ん中にあるsorce-target attention”とは、エンコーダからの出力とデコーダの入力を受けているデコーダのMulti-Head Attentionのことだと思いますが、そのクエリは1本のベクトルではなく行列になります。行列のサイズは、デコーダに入力される行列と同じになります。
@@AGIRobots ありがとうございます!ついでにもし宜しければ伺いたいのですが、デコーダの最後の出口のところでは、出力単語の確率分布を出すので一本のベクトルになるかと思ったのですが、この出口のリニア層で(デコーダに右下から入ってきた入力と同じ次元数の)行列をベクトルにするのでしょうか?(推論時にある特定の位置の単語の確率分布を求める場合の話です)
上の2回目の質問はなんか誤解してた気がします。デコーダーは、トランスフォーマーブロックに関してはインプットもアウトプットも単語数×埋め込み次元数の行列になっていて、入力単語のポジションごとに出力単語の確率分布を出すためのベクトルが別々に得られるということですかね。
で、出力のi 番目の単語を生成するときは、インプットは「BOSからi-1番目の単語まで」、アウトプットは「1番目からi番目まで」の埋め込み表現を束ねた行列になってるという感じでしょうか。
>デコーダの最後の出口のところでは、出力単語の確率分布を出すので一本のベクトルになるかと思ったのですが
デコーダの出力トークン数はデコーダの入力トークン数と同じです。
つまり、出力される行列サイズは入力される行列サイズと同じです。入力が行列で出力がベクトルになることはありません。
動画でも使っている例を使うと、
"I", "have", "a"
のように3つのトークンを入力するとします。このときデコーダの出力は例えば、
"have", "a", "pen"
のようになります。入力文に対して予測された次の単語は、最後の単語を抽出すればよいです。今回の例なら、"pen"ですね。
はい。そういうことになりますね。
クエリとキーバリューの内積を取ってどの程度近いのかという計算は具体的にどういう意味ですか?同じ文章の中で何を基準に近いと決めるんですか?リニア層(文に関係なく単語が沢山ならんだもの?)で対象の単語が同じ頻度(ドット積?)で現れるみたいな意味ですか?あと、特徴部分空間とは何ですか?調べてみましたがよくわかりませんでした。
あと大規模言語モデルだとパラメーターが何百億もあるとの事ですが、それは何処の層にあるのですか?
お手数ですが教えていただけると助かります!
コメントありがとうございます。
順番に回答しますね。
① 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層も組み合わされています。
こんな感じではないでしょうか?
どなたか。
出力層のマスクド〜が、未来の情報を使ってはいけない、というところの(計算方法ではなく本来持つl意味が全くわかりません。。
実例を用いてご説明頂けませんでしょうか。。。ここだけが理解できず。。