分かった気になる自然言語AIの仕組み

2019.12.17

Lab研究員 山本

こんにちは、YDCラボ研究員の山本です。
ある自然言語AIのアイディアを実現すべく、自然言語処理に取り組んでいます。

自然言語処理に取り組み始めた前回のコラム(分かった気になる自然言語処理概観 その1 その2)では、自然言語処理の概観として、自然言語処理の基本技術から、AI技術を用いたRNNからAttention(Transformer)への変遷、そして最新のBERTを取り上げました。

本コラムでは引き続き調査した結果として、自然言語AIの仕組みを取り上げます。具体的には、Attention、Transformer、BERTの仕組みをざっくり解説していきます。

もくじ

  1. 1.単語はベクトルで評価
  2. 2.Attentionの仕組み
  3. 3.Self-Attention
  4. 4.Source-Target-Attention
  5. 5.Transformerの仕組み
  6. 6.BERTの仕組み
  7. 7.まとめ

単語はベクトルで評価

まず、単語は自然言語AIでは、多次元のベクトルとして評価されているようです。
視覚化すると直感的です。GoogleのEmbedding Projectorという多次元データ視覚化ツール(2016年12月公開)から実際に触れることができます。

Lab_201911_12_1.png

引用:Embedding Projector

では、文章は?
AIは、文章をあくまで単語の集合体として認識します。
ですので、文章は多次元のベクトルの集合体なんですね。

Attentionの仕組み

さて、Attentionに入ります。

私達人間は、自然言語を解釈するとき、文章の一語一句構造全てを理解している訳ではありませんよね。
多くの解釈は、文章中のある単語から情報を想起し、関係を把握して行っています。
Attentionでは、この人間の解釈モデルがAI化されています。

Attentionとは、「入力されたベクトルによって重みを計算し、その重みに基づいて索引ベクトルから任意のベクトルを出力するモデル」です。

ベクトルとはどのようなことでしょうか?
ベクトルとは、単語のこと。単語が自然言語AI上で評価される形式ですね。

諸々取っ払うと、Attentionでやっていることは、実は入力ベクトルと索引ベクトルの内積を取るだけです。

Lab_201911_12_2.png

ベクトルが似た方向を向いていれば、内積は大きくなりますよね!
内積を取るというのは、入力ベクトル索引ベクトル、つまり、
入力された単語索引で引かれた単語の関連度を求めているのです。

以下の例では、入力された単語「動物」との関連度が、
「インコ」50%、「が」5%、「好き」45%と計算されています。

Lab_201911_12_3.png

関連する単語に注目するので、まさにAttentionという訳です。
たったこれだけ!このシンプルな発想でSoTA(最先端)のベースになっているAttention。
凄いですね!(厳密には後に補足します。)

Attentionには大きく2つの使い方があります。順に見ていき、イメージを掴みましょう。
※Attentionでは、入力された単語群をQuery、索引で引かれた単語群をMemoryと
呼びますので、ここからは入力Query、索引Memoryと書いていきます。

Self-Attention

Self-Attentionは、入力Queryと索引Memoryが同じAttentionです。

Lab_201911_12_4.png

画像では何となく、「好き」と「動物」の関連が高そうですよね。
Self-Attention は、言語の文法構造や照応関係の獲得に使われています。
下の画像では、「its が指してるのは Law」と分析されています。

Lab_201911_12_5.png

また、ネガポジ判定にも使われており、結果は次の通り。赤いマーカーの濃淡がネガポジ判定の際の注目具合を表します。

Lab_201911_12_6.png

 

Source-Target-Attention

Source-Target-Attentionは、入力Queryと索引Memoryが別物の場合のAttentionです。
画像は「お腹が減った」→「ラーメン食べよう」という発話応答を学習する場合です。

Lab_201911_12_7.png

過去の発話「お腹が減った」を索引Memory(Y)としています。
入力Query(X)はまず、「<BOS>(文章の初めを表すコード)」です。
<BOS>は索引Memory「お腹が減った」から、「ラーメン」を生成します。

次に生成された「ラーメン」を入力Queryに加え、「<BOS>ラーメン」から、同様に「ラーメン食べ」を生成していくのです。

より実用的には、入力Queryを質問「好きな動物」とし、索引Memoryは「どこ行くー?」「動物園がいいな」「動物好きなの?」「インコが好き!」「へーそうなんだ」といった文章列となります。入力Queryが索引Memoryの中から一番関係ありそうな情報を引き、「インコ」と答えます。

Lab_201911_12_8.png

(補足)
Attentionでは厳密には、索引MemoryはKey、Valueの2つに分離されます。Keyで関連度を計算し、関連度に従ってValueを取得しています。(そして実はココが強力なポイントのようです。)

Lab_201911_12_9.png

また、注意の重みの求め方として、今回内積注意を紹介しましたが、加法注意という方法もあります。Transformerで使われているAttentionが内積注意です。
本コラムではまずAttentionのイメージを持って頂きたいと思い、上記の通りざっくりとした説明しました。

Transformerの仕組み

Transformerは、Attentionをベースにした自然言語処理です。
Transformerの中で使われている代表的な技術を2つ、紹介します。

・Multi-Head Attention
Attentionの発展版です。次元数の影響を考慮した縮小付きScaled Dot-production Attention(関連度を√次元数で割っただけ)を更に、効率よく処理できるよう並列処理にした複数ヘッド付きMulti-Head Attentionを、Trasnformerでは使っています。

・Positional Encoding
Attentionだけでは文章内の単語の順序を情報として使うことができないので、各単語の位置情報を加算します。

下の図は、Transformerの手順を表現したイメージ図です。

Lab_201911_12_10.png

ウッ、となる図なんですが、よく見ると、上記2つに加え、残りはAdd(並列処理の加算)、SoftmaxやNormalization(正則化処理)、Feed Forward Network(単純ニューラルネットワーク)など、AIをかじるとよく見る単語が並んでいるんですね。

BERTの仕組み

最後にBERTです。
BERTの論文から画像を拝借しました。「Trm」がTransformerです。
従来技術のOpenAI GPTと比較されています。(OpenAI GPTも最先端技術ですが。)

Lab_201911_12_11.png

OpenAI GPTでは、事前学習タスクに「次の単語の予測」を使用しています。予測するべき未来の単語情報はカンニングになるため、予測に用いることができません。

そのため未来の単語位置のネットワークにマスクをかけなければならず、単方向Transformerでした。
BERTでは事前学習タスクに「ランダムにマスクされた単語を周辺情報から予測」つまり穴埋め問題を採用することで、双方向Transformerを実現したのです。

直感的にも、前後の文脈を考慮することができそうですよね。

まとめ

本コラムでは、自然言語処理AIの仕組みを大雑把に解説しました。
ベクトルで評価される単語、その内積を取るAttention、そして連結されたTransformer、双方向TransformerのBERT、と取り上げました。
基本的な仕組みは理解できたということで、応用に活かしていきたいところです。

それでは、読んで頂きまして、ありがとうございました。

参考文献
Attention Is All You Need [Łukasz Kaiser et al., arXiv, 2017/06]
[1810.04805] BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
論文解説 Attention Is All You Need (Transformer)
作って理解する Transformer / Attention
私がTransformerとBERTを理解するまで
汎用言語表現モデルBERTを日本語で動かす(PyTorch)

  • LINE
  • Mail