BERTを使った単語の分散表現（ベクトル表現）の獲得

# 概要
BERTのモデルから得られる単語(多義語)の分散表現を可視化することで、どのくらい文脈を理解することが可能となったかを視覚的に確認します。


# これまでの単語の分散表現
単語の意味を表現するためにはコンピュータが理解しやすいようにベクトル表現を使うことが一般的です。このベクトル表現は「**単語の分散表現**」「**単語埋め込み**」「**WordEmbedding**」などと呼ばれます。

単語の分散表現を獲得する手法として、2013年にTomas Mikolvによって**Word2Vec**が発表されました。このWord2Vecでは、１個の単語は１個の分散表現で表現されます。例えば、以下の例文のように「日本一」は「0.20,-0.01,…」、「高い」は「-0.01,0.75,…」という感じで表現されます。

**<例文>** 日本一高い山の富士山には毎年登るようにしている。

|単語  |分散表現|
|---|---|
|日本一 |[&nbsp;0.20,-0.01,-0.05, 0.33, 0.74]|
|高い   |[-0.01, 0.75, 0.45, 0.70,-0.70]|
|山     |[&nbsp;0.77, 0.57, 0.71,-0.36,-0.66]|
|の     |[-0.80,-0.83, 0.76, 0.67, 0.87]|
|富士   |[&nbsp;0.52, 0.17,-0.04,-0.03,-0.08]|
|に     |[&nbsp;0.64, 0.06,-0.75,-0.69, 0.76]|
|は     |[&nbsp;0.45,-0.47, 0.13, 0.17, 0.60]|
|毎年   |[&nbsp;0.63,-0.34, 0.99, 0.34, 0.89]|
|登る   |[-0.19,-0.64, 0.54, 0.17, 0.57]|
|よう   |[-0.04, 0.96, 0.43, 0.17, 0.58]|
|に     |[-0.18, 0.38, 0.28, 0.78, 0.15]|
|し     |[&nbsp;0.62, 0.31,-0.10,-0.73,-0.11]|
|て     |[-0.01, 0.92, 0.67,-0.40, 0.87]|
|いる   |[-0.06,-0.23,-0.23,-0.52, 0.24]|


# 課題
単語の中には複数の意味を持つ**多義語**が存在しています。
例えば、以下の2つの文に存在している「高い」という単語です。

- 日本一**高い**山の富士山には毎年登るようにしている。
- 大きなダイヤモンドが付いている指輪の値段は**高い**。

1文目は「**物理的に上にある**」という意味の「高い」であり、2文目は「**価値がある**」という意味の「高い」です。この2つをコンピュータが区別するためには、私たち人間が、文章を読むときに行っているのと同じように周辺の単語から判断するしかありません。

しかし、周辺の単語と言ってもどこを見ればよいのかをコンピュータに教えるのは、言葉や構文を全く知らない赤ちゃんに教えるのと同じくらい難しいです。
例えば、1つの前の単語のみから判断した場合、「日本一」が登場したからと言って必ず「物理的に上にある」という意味にはなりませんし、「日本一高いマンション」のようなどちらの意味にもとれる曖昧な表現を判断することはできません。




# BERTによる分散表現
2018年10月11日にGoogleによって**BERT(Bidirectional Encoder Representations from Transformers)**が公開されました。BERTは2017年頃から主流となったTransformer/Attention方式をベースにしており、穴埋め問題を解くような学習を加えることで精度が向上し、自然言語系の様々なタスクでより高精度を得ています。

多義語についても、与えられた文章内に含まれる「高い」がどちらの意味の「高い」かを判断する精度が向上しました。判断する精度が向上したというのを言い換えると、1つの単語から複数の分散表現を獲得することが出来るようになったということです。

今回は、BERTを使って多義語の分散表現を確認します。
BERTが本当に多義語を区別できているのか確認するために「**物理的に上にある**」という意味の「高い」と「**価値がある**」という意味の「高い」を含んだ文を5文ずつ与えて、分散表現が綺麗に2パターンに分かれてくれるかどうかをEmbedding projectorで視覚的に確認しました。

<入力文>

- 日本一**高い**山の富士山には毎年登るようにしている。
- 大きなダイヤモンドが付いている指輪の値段は**高い**。
- 身長が**高**すぎて中学生と間違えられることがある。
- 最新のパソコンが欲しかったが、新製品は**高**すぎて手が届かない。
- 蛍光灯は**高い**ところにあるため脚立を使って交換する。
- 都心のマンション価格は非常に**高い**。
- あれほど**高い**バスケットのリングにいとも簡単に手が届く。
- データ通信料金が**高い**のは動画をたくさん見ているからだ。
- 空を見上げると**高い**ビル群がそびえたっている。
- 久しぶりに焼肉店で**高い**ステーキを食べたい。


<結果>

![takai_embedding_projector.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276223/838ac563-b9a2-257e-9143-4af6c330dee9.png)

グラフ上は、どの「高い」かが分かるようにカッコ内に対象物を記載しています。
結果が3次元グラフなので、幾つかの視点から見ないと位置関係を捉えにくいかもしれませんが、「**物理的に上にある**」の「高い」は、「**価値がある**」の「高い」よりも座標的に上の方に位置している傾向であることが分かりました。
ただ、「高(身長)」だけは、少し離れた所に位置しています。これは、あえてこの文だけは「高い」ではなく「高すぎる」にしたのですが、「高すぎる」の例文の数が少なかったことが原因だと考えています。
※全体的に一度に与える例文が少ないときれいに区別できませんでした。


# まとめ
BERTのモデルから得られる単語の分散表現(ベクトル表現)を可視化することで、多義語についてはそれなりに区別出来ていることが分かりました。ただ、文脈を完全に理解しているかどうか確認するには、多義語だけではなく、反対語や反語、二重否定などの紛らわしい微妙な表現も確認が必要です。

ただ、そうはいっても2013年に革命的に変わった自然言語処理は、2018年頃から急激に進化して、今まさにブレイクスルーの真っ只中にいると感じています。

BERT登場以降、派生モデルとして2019年7月26日に**RoBERTa**、9月26日に**ALBERT**が登場して幾つかの改善が行われています。また、2019年10月25日には、Googleの検索エンジンの一部にBERTが採用されると発表されました。米国での英語検索において、全体の10%のクエリが改善されるということで、いよいよ現実社会に組み込まれてきました。

# 補足
日本語の改善はまだのようですが、本家BERTのgitに公開されている多言語モデルを使用する際は注意が必要です。
以下で工藤拓さんがご指摘されているような課題も存在していて、BERT開発者のJacob Devlin氏は、多言語モデルの改善版はいつになるか分からないと回答しています。

- [指摘1(濁音/半濁音を消してしまっている)](https://github.com/google-research/bert/issues/130)
- [指摘2(母音を消してしまっている)](https://github.com/google-research/bert/issues/138)

実際に本家BERTのgithubに公開されている多言語モデルを見てみると、すべての文字を1文字に区切って学習しているようです。そのため、日本語を使用する場合はMecabやSentencepeice等で区切って学習したモデルを使用すると良さそうです。
私の場合は黒橋・河原研究室で公開されていたモデルを使用させていただきました。

- [BERT日本語Pretrainedモデル](http://nlp.ist.i.kyoto-u.ac.jp/index.php?BERT%E6%97%A5%E6%9C%AC%E8%AA%9EPretrained%E3%83%A2%E3%83%87%E3%83%AB)

(2020/1/13追記)
なお、日本語と同様に1文字では意味を捉えることが出来ない問題を抱える中国語に関して、Baiduの先端モデルERNIEで何か工夫している箇所がないか気になりましたので、キーワード抽出処理のtokenization.pyを確認してみました。
しかし、2020年1月13日時点では特に個別の処理は見当たりませんでした。全てのコードを確認していませんが、BERTと同様に詳細は不明かもしれません。

- [ERNIE(github)](https://github.com/PaddlePaddle/ERNIE.git)
- [BERT 単語学習についての説明(github)](https://github.com/google-research/bert#learning-a-new-wordpiece-vocabulary)

以上

# 参考資料
- [本家BERT(github)]
(https://github.com/google-research/bert.git)
- [Google検索エンジンについての記事「Understanding searches better than ever before」]
(https://www.blog.google/products/search/search-language-understanding-bert/)
- [汎用言語表現モデルBERTの内部動作を解明してみる]
(https://qiita.com/Kosuke-Szk/items/d49e2127bf95a1a8e19f)