数式を使わないTransformerの解説(前編)

2023/3/23 追記: こちら半年以上前に執筆したもので、その後私の理解も進んで内容的に更新したいところが結構あるため、近日中に非公開とさせていただき,更新後に再公開させていただくつもりです。現時点での本記事の内容は、大きく間違ってはいないけどちらほら微妙なところがあるという感じです。

(ざっくり理解するだけでも良いという人にはそれでも良いかもしれませんが、そういう方向けには 今執筆中のこちらの記事 をおすすめします。)

 

−−−−

 

最近話題のmidjourneyやDALL-E、凄いですよね。中身はディープラーニング(DNN)のようです。DNNといっても色んな技術がありますが、それらにはTransformerという手法が使われています。本記事は、その手法がどんなものであるかを数式を使わずに説明してみよう、という主旨になります。

 

※なお本記事は機械学習のプロの研究者ではない私の独自の解釈が多く含まれるため、誤りを含む可能性があることをご承知おきください。また私の勤務先企業やその関係会社とは無関係に私が個人的に勉強した「感想」程度に受け止めていただければ幸いです。

 

Transformerとは?

もともとはディープラーニングを用いた機械翻訳の品質を向上させるためにグーグルの研究所によって考案された手法でした。

 

それまでももちろん機械翻訳ディープラーニングが用いられてきましたが、このTransformerの導入によって性能が飛躍的に高まったことから機械翻訳以外の自然言語処理のタスクや、さらに画像、音声と適用領域が広がっているとてもホットな技術です。

 

Transformer以前は、再帰ニューラルネットワーク(RNN)という手法が多く用いられていましたが、これは文を翻訳してくときに単語を一つずつアルゴリズムに食わせていく逐次的なアルゴリズムになっているため、「かなり前の単語の意味が影響するような文脈」を加味するのが苦手という短所がありました。

 

もう少し詳しくいうと、RNNでは単語をインプットするたびに「訳語+内部状態」がアウトプットされて、そのアウトプットをまた次の単語インプットと一緒に使いながら処理を進めることで文脈を考慮した翻訳を実現します。

 

そうすると、凄く前の単語に依存するような文脈の場合、そのことを「内部状態」に埋め込む必要があります。内部状態は逐次的に置き換わって変化していきますから、その変化のあいだ文脈をずっと覚えておくすなわち内部状態に埋め込み続けておく必要があります。内部状態を表すビット数は固定なので、そのような埋め込みを必要とする状況では実質的に情報スペースを逼迫させることになるわけです。

 

そこで考案されたのがTransformerでした。そのカギとなるのがAttention(アテンション)というテクニックです。Attention自体はTransformerが登場する前から良く知られた方法でしたが、これを「文脈情報を表現する仕組みの中心に据えた」ところがブレークスルーになった、と言えるかもしれません。

 

Attentionとは何か

ではそのAttentionの説明に入るわけですが、その前に「我々人間が単語の意味や文脈といった情報をどのように頭の中に埋め込んでいるか」についてちょっと考えてみましょう。そのようなことをいったん考えてみることが、遠回りなようで近道なのです。

 

まず単語について考えましょう。「りんご」を例にとってみます。りんごは食べるものですよね?それに、ふつう、赤いです。あまずっぱい味がします。小さな種がありますね。スーパーで買うことが多いです。大きさは片手で握るほど、形はまぁ丸いといえるでしょう。

 

そうしたことは「りんご」という単語の「字面(じづら)」には全く書いてないですよね。単語の綴りには「り」と「ん」と「ご」しか書いてないです。だから上で描いたようなりんごにまつわる色んな事は我々の頭の中にあるわけです。りんご、という言葉を聞いたとき、我々の頭のなかはちょっとだけ「りんごモード」になります。

 

さて、では続いて「文脈」について考えてみましょう。例えば「スーパーでりんごを」という途中までの文を聴いたとします。この後に続く単語として「買った」を思い浮かべる人が多いのではないでしょうか?もちろん「盗んだ」という言葉が続くこともありえます。「食べた」だとちょっと不自然ですよね。「試食した」と正確に書いてほしいところです。もちろんレジでお会計をする前に商品を口にしたという意味なのでしたら、犯罪の香りが漂ってきます。

 

こうしたことが文脈の例として考えられるわけですが、ここで重要となるのが

 

文脈の情報の源泉はすべて単語自体の情報にあるのではないか?

 

という仮説です。例えば、上述したような「りんごにまつわる色々」といった「単語の意味」を512ビットで表すことを考えてみます。512ビットは手元で計算すると10進数では154桁です。人の寿命がだいたい80歳くらいだとするとそれは約25億秒になりますが、これはちょうど10桁ほどですから、1秒に1パターンの意味を経験するとしてもまだ144桁ぶんあります。人類の歴史上の生きたすべての人の人生を合計してもまだ余裕がありそうです。*1

 

そこで、それぞれの単語を512ビットで表現して、それをもとに文脈情報を組み立てることを考えます。そして、文は単語が並んだものですから「単語の位置」は重要になってきます。なので単語の512ビットに加えて、単語の位置を表す情報を付け加えましょう。

 

位置をどう表すかは具体的には次節で解説するとして、これで「単語の意味+位置」(*)が表現できました。そしていよいよ「文脈」をどう表現するかですが、

 

(*)の情報をテキトーに重みづけして足し算するだけ(=それがAttention)

 

で文脈を表せたことにします。「え、そんなんでいいの?」って思ってしまいそうですが、先に述べたように文脈情報の源泉は単語の意味にあるという仮説に基づくならこれも十分試してみる価値のある方法に見えます。実際、それでAttentionというテクニックは良い成果をたたき出してくれるのだそうです。

 

Transformerにおける単語の位置情報の実際

さて、位置情報をどう表現するか考えましょう。

 

文の長さは可変長ですし、また長い文章にわたる文脈や意味を表現したいので、文章の最初の単語からの通し番号を付けるというのが素朴なアイディアとして思いつきます。

ですが単なる通し番号だと、例えば3番とか19887番目で数字の大きさが結構違ってしまって、ディープラーニングは足し算と掛け算と閾値判定で動くのでそういうのは都合が悪いです。

 

そこで文章全体を一つの円の上にぐるっと単語を順番に並べていって半周までしない扇型の孤上に並ぶくらいの感じにします。円周上の座標が単語の位置というわけです。これなら原点からの距離は一定ですし、単語同士の近さ遠さも表現できていい感じです。

 

また、単語の近さ遠さといっても、そのスケールは固定とは限りません。例えば小説であれば主人公が今どこにいるかという「文脈情報」は割と直近の文や単語を見れば分かることが多そうですが、小説のストーリーに関わるような文脈となるとかなり前の単語の情報が必要になってきそうです。

 

そこで、扇型の座標は2次元((x,y)と2つの数で座標を表しますよね)なので、「単語の意味」を表現するのに使った512ビットを256ビットずつ2つに分けて、「文脈が考慮する距離スケール」を256個用意することにします。そうすれば、ストーリーに関わるような長い文脈は512ビットの後ろのほうのビットで表現して、短い文脈は512ビットの前のほうで表現する、っていう風にして必要な文脈スケールをいい感じにカバーしてくれそうです。

 

Transformerの単語の位置情報は、そういう風にして、扇型の長さ(文章全体の地図の縮尺スケール)を256パターン用意して学習させます。

 

ようやくアルゴリズム本体

さて、ここまででようやくAttentionの思惑と実際の表現についての説明が終わりました。TransformerはこのAttentionの表現力をフルに引き出す工夫が盛り込まれています。

 

アルゴリズムの全体は

  1. 単語の意味ビット列+位置情報の埋め込み(前節までで説明済み)
  2. セルフアテンション及びその工夫
    • (工夫1) 極小値回避のためのスケール調整付き内積計算
    • (工夫2) 意味の観点ごとの抽出と並列計算(マルチヘッドと呼ぶ)
  3. 残差ネット及び正規化
  4. 単語位置ごとの密結合ネット

という構成になっており、2~4を1ブロックとしてそのブロックを多段に積んでいくことで単語列から文脈情報を「エンコード」します。

 

これに「デコード」側も同様に上のブロックを並べることで文脈情報から「単語のビット列」を復元します。デコード側も、それまでに「翻訳済みの単語」を入力として与えて構造としては上記の手順1.~と同様になります。翻訳の開始時には「翻訳済みの単語」がまだ何もなくて空っぽなので<BOS>(beginning of sequence) という記号を使います。

 

さて、後編では上記のアルゴリズムの構成要素を一つずつ見ていきましょう。

 

ここまで読んでくださりありがとうございます。

では後編へ。

*1:もちろん言葉の意味には現実に経験したこと以上に人が思考や想像をしうることも含まれますから512ビットで十分かどうかは分かりません。