質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

4311閲覧

BERTを理解したいからTransformerを理解したいから・・・

退会済みユーザー

退会済みユーザー

総合スコア0

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

2クリップ

投稿2019/01/30 06:21

transformerを理解したいです。
下図ではinputsに文章を入力して、単語をベクトル化したものをエンコーダーに与えていると思うのですが、デコーダー側の入力値として使われているOutputsはどこからの出力値からなのかわかりません。
また、タスクによって異なると思うのですが、OutputProbabilitiesは何の確率を出力しているのか具体的な例を出していただけると理解しやすいです。
(Q&Aタスクだと入力値にquestionとanswerの2文をタグを挟んで、繋げて渡しているので出力が何なのかわかりません。)
お時間があるかた回答よろしくお願いします。

*teratailでこのようなジャンルの質問をあまりみないのですが、質問する場所間違えてますか?
transformerの図

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Qiita
Ryobotさんの解説
pytorch実装解説
などを参考にしています。
下記の回答はおそらく正しいですが、絶対の自信はないので参考にする程度でお願いします。
m(_ _)m


結論から言うと
Outputはtgtの前後にbosとeosトークンを付加したものを入力します。
また、OutputProbabilitiesは単語ID?の確率になります。

例えば
src:I like cat.
tgt:私は猫が好きです。
であれば

Decoder入力であるoutputは
<bos> 私 は 猫 が 好き です 。 <eos>
をID化したものになり

OutputProbabilitiesは
<bos> から 私 を予想した確率
私  から は を予想した確率
は  から 猫 を予想した確率

つまり一つ未来の単語を予想した確率になります。

しかしそうすると、Decoderに入力する情報の中に答えが含まれてしまうので
Decoder部のSelf-Attentionで未来情報をマスキングしています。


Q&Aタスクに関してはTransformerでそのような問題を見たことがないので
提示してもらえれば何かわかるかもしれません。
おそらくそれこそBERTですかね?

語弊を恐れずに言うならBERTはTransformerのEncoder部分を色々と改造したもので
srcとtgtをくっつけたものを事前学習し、srcとtgtの関係性を学習した基礎を作り
後ほど基礎にGeneraterをくっつけて一つのモデルにします。
うまく説明できる気がしないので他の解説記事を参考にしてください

ただ、Transformer自体汎用性が高いので、割と無理やりなモデルを作っても意外と何とかなります。

teratailの質問は、今でこそ広く浸透してきたので初学者の質問が目立ちますが
割と込み入った質問も多くあるように思います。
規則に反してはいなさそうですしいいんじゃないでしょうか?

雑な回答ですがお役に立てるとうれしいです。

追記

Encoder、Decoderともに入力は単語IDとなります
ただ、単語IDは正式名称じゃないと思ったので?を一応つけておきました
正式にはなんて呼べばいいんですかね?
とりあえず、wordごとに任意に割り振った数字になります。

投稿2019/01/30 15:01

編集2019/01/30 15:16
ko.tu

総合スコア178

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/01/31 01:04

回答ありがとうございます。 Q&AはBERTでのタスクでした。すみません。 他の方の回答も見てみたいのでもう少し待ってみます。
退会済みユーザー

退会済みユーザー

2019/01/31 04:11

質問があります。 自信がなくても構いません。もし、お時間があれば回答お願いします。 1.Inputsは文章を単語ID列で表しているものを渡していて各単語IDをembedすることでベクトルを得ているのでしょうか? 2.デコーダーのoutputsは出していただいた例からすると<BOS>と<EOS>タグで挟まれた私は猫が好きです。という単語ID列になると思うのですが、この一つの文章入力で”<bos>” から “私” を予想した確率、 “私”  から “は” を予想した確率、“は”  から “猫” を予想した確率などsoftmax関数は一つしかないのに複数の確率を出力できているのはなぜでしょうか? それともこのtransformerというモデルは一つの入力文章に対して処理を何周も回すのでしょうか?
ko.tu

2019/01/31 04:52

1. そうですね図のInput Embedding、Output Embeddingと書かれているところでWord Embeddingして単語IDから単語ベクトルに変換しています。 2. Decoderのsizeを示すと (batch_size, sequence_size) Word Embedding (batch_size, sequence_size, hidden_size) Decoder Layer (batch_size, sequence_size, hidden_size) linear (batch_size, sequence_size, vocab_size) soft_max (batch_size, sequence_size, vocab_size) となります。 つまり最後の層ではsequence_size * vocab_sizeの予想ができていることになるため複数の確率が予想できます。 最もこれは学習時の話であり、推論時にはこれから予想しようと思っている未来の単語は入力できないので 推論時には何回もTransformerを回しながら予想することになります。
退会済みユーザー

退会済みユーザー

2019/01/31 23:18

何度も回答ありがとうございました。これで最後です。 行列をソフトマックス関数に渡すというのは初めての考えで戸惑いました。 ソフトマックス関数に渡すとsequence_size個の各単語ごとにデータ全体の単語に対して次に出てくる確率の和が行方向に1になるように出力され、ワンホット行列?のようなものとの損失関数を取るような感じなのでしょうか? だいぶ理解が進みました。大変お世話になりました!
ko.tu

2019/02/03 04:19

おそらくそれであっています。 (batch_size, sequence_size, vocab_size) で入力された最後のサイズ(vocab_size)毎に関数が実行され 確率が出てくるようになります。 お役に立てて幸いです
ko.tu

2019/02/03 07:14

自分の二個前の回答ちょっとおかしいですね つまり最後の層ではsequence_size * vocab_sizeの予想ができていることになる ではなく つまり最後の層ではbatch_size * sequence_sizeの予想ができていることになる ですね。 認識としては batch_size * sequence_size個の vocab_size分のone_hot行列が出てくる感じでいいと思います いや、正確にはone_hotではないんですけどね。自分もあの行列なんて言えばいいかわかんないです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問