BERTの単語ベクトルをさらに覗いてみる

##はじめに

[前回の記事](https://qiita.com/age884/items/ed3b167d216e56e39440)で、BERTで抽出した単語ベクトルを使って同義語、同音異義語の判別ができるかどうかということを試してみました。

具体的には、下記のテキスト[^1][^2][^3]をBERTに入力し、企業名のアマゾン（Amazon）と地名のアマゾン（Amazon）の単語ベクトル（768次元）を抽出しました。可視化するために2次元に次元削減し、その分布を調べました。

```txt:sentence_gafa.txt
[1]GAFA（ガーファ）またはGAFAMなどと往時には呼ばれ、最近はむしろビッグテックまたはビッグテク（Big Tech）と呼ばれているのは、米国の多国籍企業でコンピューターやソフトウェアを駆使してサイバースペースを2010年代に支配するに至った企業のことで、具体的にはグーグル・アマゾン・フェイスブック・アップル（およびマイクロソフト）の4/5つの主要IT企業である。
・・・
[6]Amazon.com, Inc.（アマゾン・ドット・コム）は、アメリカ合衆国・ワシントン州シアトルに本拠を構えるECサイト、Webサービス会社である。
・・・
[9]2019年現在、Amazon.comがアメリカ国外でサイトを運営している国はイギリス、フランス、ドイツ、カナダ、日本、中国、イタリア、スペイン、ブラジル、インド、メキシコ、オーストラリア、オランダ、トルコ、アラブ首長国連邦の15か国である。
・・・
[17]アマゾン熱帯雨林（アマゾンねったいうりん、英: Amazon Rainforest、西: Selva Amazónica、葡: Floresta Amazônica）とは、南アメリカ大陸アマゾン川流域に大きく広がる、世界最大面積を誇る熱帯雨林である。
・・・
```
[^1]: 先頭の[1]、[2]、…は、今回の記事用に追記した行番号で、実際のデータには含まれていません
[^2]: 今回の記事に関係のない行は省略してあります
[^3]: 引用元：「GAFA」「Google」「Amazon.com」「Facebook」「アップル (企業)」「アマゾン熱帯雨林」『フリー百科事典　ウィキペディア日本語版』。2019年11月18日 (日) 6:00　UTC、URL: https://ja.wikipedia.org

下の図がその結果です（単語の後の番号は、その単語が含まれる文の行番号です。同一文内に複数回出現する単語の場合は、17-1、17-2、…のように出現順序も付与しています）。
![単語ベクトルの分布](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146659/48d7a1cf-4d05-bfa4-c641-5f7b941e568c.png "単語ベクトルの分布")
企業名のアマゾン（アマゾン[1]、アマゾン[6]、Amazon[6]、Amazon[9]）と地名のアマゾン（アマゾン[17-1]、アマゾン[17-2]、アマゾン[17-3]、Amazon[17]）の2つのグループに分かれることを期待していましたが、期待外れな結果でした。

この原因は、BERTの単語ベクトルには、意味だけではなく、単語の字面、前後の単語、品詞、・・・など様々な要素が含まれていることにあるのだろうと[前回](https://qiita.com/age884/items/ed3b167d216e56e39440)は考察しました。

おそらくそうなんだろうけど、少し気になることがあるので、今回はもう少し探ってみたいと思います。


##各層の単語ベクトル

　[前回の記事](https://qiita.com/age884/items/ed3b167d216e56e39440)で使用したのは、12個の中間層を持つBERTのモデルでした。各階層がそれぞれ単語ベクトルを持っていますが、[この記事](http://jalammar.github.io/illustrated-bert/)を参考にして、出力に近い4つの層のベクトルの平均で単語ベクトルを作りました。

本当にこれでよかったのか？もっと良いベクトルの作り方があったかも？

そこで、今回は各層の単語ベクトルの分布を調べてみることにしました（単語ベクトルの抽出方法は、[前回の記事](https://qiita.com/age884/items/ed3b167d216e56e39440)をご覧下さい）。もしかしたら、どこかの層で単語の意味が表現されているかもしれません。
　
下の12個の図がその結果です。上から1層目、2層目、…、12層目となっています。
![distribution_l0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146659/ba1f0603-dc29-3355-0c28-2ff428a6fc88.png)
これは1層目。縦軸の-1を境に企業名と地名が分かれていますが、アマゾンとAmazonとがもっとまとまって欲しいところです。
![distribution_l1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146659/7f09fcc9-2c79-b5da-70dc-19bc13e9525f.png)
これは2層目。1層目と似たような傾向ですが、地名のアマゾン、企業名のAmazonそれぞれがきれいにクラスターになってます。
![distribution_l2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146659/95df94b5-0e63-4f23-7aee-09d1d5f167a2.png)
これは3層目。特に変化はありません。
![distribution_l3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146659/f4c45fd6-2c7a-fe81-270c-161ba31a9e06.png)
これは4層目。特に変化はありません。
![distribution_l4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146659/a9f50f7f-22e9-0660-94b6-fa0162cfefb8.png)
これは5層目。特に変化はありません。
![distribution_l5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146659/23932fe1-d7eb-6958-f02d-b6a3a0f405dd.png)
これは6層目。特に変化はありません。
![distribution_l6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146659/3e5e9c11-d802-272c-9478-bac81aa42552.png)
これは7層目。特に変化はありません。
![distribution_l7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146659/830b0329-2e34-def5-3754-1dc3813a7383.png)
これは8層目。Amazonに企業名、地名の区別が見えなくなりました。
![distribution_l8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146659/fa2ec17c-9d7b-d8b5-35af-bc7a1e54111f.png)
これは9層目。アマゾン[6]がアマゾン[17-3]を誘い出しに来ました。
![distribution_l9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146659/c975a350-b0b9-adbc-8172-10019f171d83.png)
これは10層目。
![distribution_l10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146659/0b2ba456-16a0-2934-f2ce-df095b4210c4.png)
これは11層目。
![distribution_l11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146659/42b1b709-0ab8-2a8f-7ddb-71bd235d1a78.png)
これは12層目。もう何だかわかりません（笑）。


##類似度の計算
ここまでは、単語ベクトルの分布を可視化するために、768次元の単語ベクトルを2次元に次元削減しましたが、だいぶ情報が失われてしまっているのでは？という疑問があります。

そこで、768次元の単語ベクトルのままで、各単語のベクトル間の類似度を計算してみます。類似度の計算方法はいろいろありますが、今回は、コサイン類似度、ユークリッド距離を使用します。

下に結果を示します。数字をそのまま眺めても特徴がわかりづらいので、グレースケールのマトリックスで表示します。類似度が高いほど黒に近く、低いほど白に近くなるように表現してあります。
![similarity_l0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146659/260e28a8-26a4-83b5-3c52-6eac22f321a7.png)
これは1層目。字面の同じペアでの類似度が高くなっています。ちなみに完全に意味で別れた場合には下の図の様になりますが、これとは程遠い結果です。
![similarity_expected.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146659/e60bc11d-bc6c-ed71-a0da-ed9ca8410ac0.png)
![similarity_l1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146659/6392ec96-ad70-83f5-5201-eaf88c93135f.png)
これは2層目。
![similarity_l2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146659/a3dd8f75-ec11-1f35-0b49-43bbf3b89252.png)
これは3層目。
![similarity_l3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146659/79151706-85c0-898f-5eea-52b70e20b833.png)
これは4層目。
![similarity_l4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146659/18454a0f-d82a-1fbe-8476-d2bdc7119e02.png)
これは5層目。
![similarity_l5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146659/5cb9fe69-ea99-5ce6-31a0-a8803b050d84.png)
これは6層目。
![similarity_l6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146659/25deb1b4-aa2e-bcf2-03a2-19dce455dafa.png)
これは7層目。
![similarity_l7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146659/8f86785e-41ee-f526-b718-9f9aa5d0951d.png)
これは8層目。
![similarity_l8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146659/4dc7af31-2541-8ad9-d905-fa3a57dd9ebf.png)
これは9層目。
![similarity_l9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146659/ed6cd578-25e2-6b55-d400-4719eff07257.png)
これは10層目。
![similarity_l10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146659/de4512f7-4bcc-20e2-7cd1-dc3ce8483b4f.png)
これは11層目。
![similarity_l11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146659/5168721d-7249-4200-dfb9-49ff9eaae7b1.png)
これは12層目。

結果を見ると、出力に近い層になるほど、字面の情報が弱くなっていることがわかります。BERTに入力するベクトルは、字面の情報だけを持ったOne-hotベクトルなので、入力に近いほど字面の情報が濃く表れるのは当然といえば当然です。

また、コサイン類似度よりもユークリッド距離の方が字面の情報が弱いこともわかります。これは下の図で説明ができます。

2つの単語ベクトルが、この様になっている場合には、コサイン類似度での類似度は大きくなり、ユークリッド距離での類似度は小さくなるからです。
![similarity_diff_sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146659/54d1b6ad-8fad-4f8a-924e-4527730cf765.png)

##まとめ
今回は、各層の単語ベクトルの分布を見てみましたが、入力に近い層で縦軸に意味の境界線がありそうな感じでした。[前回](https://qiita.com/age884/items/ed3b167d216e56e39440)考察した通り、768次元のベクトルのどこかの次元、もしくは次元の組み合わせで意味が表現されている可能性を予想させるような結果です。

また、単語ベクトル間の類似度を計算した結果から、類似度には単語の字面が強く反映されていることがわかりました。意味を取り扱う場合には、単語ベクトルそのまま使わないほうが良さそうです。

[前回](https://qiita.com/age884/items/ed3b167d216e56e39440)と同じ結論ですが、やはり意味を表す軸を探す難行が必要そうです。