Attention Headの可視化

# 導入
[huggingface/transformers](https://github.com/huggingface/transformers)が便利すぎるので、この波に乗ってAttentionで注目ワードを可視化できないかと思い検討したもの。


# 可視化方法
BERTの可視化方法は様々公開されている様子。

* [自然言語処理で使われるAttentionのWeightを可視化する - INOUE-KOBO.COM](https://www.inoue-kobo.com/ai_ml/attention-visualize/index.html)
* [Python - BERTの学習で用いられるattentionの可視化](teratail https://teratail.com/questions/217728)
* [BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding]( https://www.slideshare.net/DeepLearningJP2016/dl-hacksbert-pretraining-of-deep-bidirectional-transformers-for-language-understanding-124880077)
* [汎用言語表現モデルBERTの内部動作を解明してみる](https://qiita.com/Kosuke-Szk/items/d49e2127bf95a1a8e19f)
* [A Visual Guide to Using BERT for the First Time – Jay Alammar – Visualizing machine learning one concept at a time](http://jalammar.github.io/a-visual-guide-to-using-bert-for-the-first-time/)
* ・・・


結局huggingface/transformersを流用可能という以下のライブラリを使ってColab上で可視化してみることに。
## [BertViz](https://github.com/jessevig/bertviz)

>BertViz is a tool for visualizing attention in the Transformer model, supporting all models from the transformers library (BERT, GPT-2, XLNet, RoBERTa, XLM, CTRL, etc.). It extends the Tensor2Tensor visualization tool by Llion Jones and the transformers library from HuggingFace.


公式には以下の３つ可視化の種類が書かれている。

|ビュー|説明|G翻訳!|
|---|---|---|
|Attention-head view|The attention-head view visualizes the attention patterns produced by one or more attention heads in a given transformer layer.|特定のトランスフォーマレイヤーの1つ以上のアテンションヘッドによって生成されたアテンションパターンを視覚化します。|
|Model view|The model view provides a birds-eye view of attention across all of the model’s layers and heads.|モデルのすべてのレイヤーと頭全体の注意の鳥瞰図を提供します。|
|Neuron view|The neuron view visualizes the individual neurons in the query and key vectors and shows how they are used to compute attention.|クエリおよびキーベクトル内の個々のニューロンを視覚化し、それらを使用して注意を計算する方法を示します。|


# 使い方
[githubに載っているColabでのスクリプト](https://colab.research.google.com/drive/1PEHWRHrvxQvYr9NFRC-E_fr3xDq1htCj)をほぼそのまま。
ただし、日本語を扱うので下記の部分を変更。

* [MeCabをインストールしとく](https://qiita.com/niship2/items/b41000a1df2b16b23399)。
* [日本語BERT](https://twitter.com/huggingface/status/1205283603128758277)に対応するため、

 ```python
from transformers import BertTokenizer, AutoTokenizer,BertModel 
 ```
のように「AutoTokenizer」を追加。

* 上記に対応して、

```python
tokenizer = BertTokenizer.from_pretrained(model_version, do_lower_case=do_lower_case) 
```
を

```python
   tokenizer = AutoTokenizer.from_pretrained(model_version)
```

に変更。
その他は下記のnotebook参照（上記変更以外は公式と同じ）。
[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385220/99b419e2-414d-d500-9b33-055ef6c4a4ce.png)](https://colab.research.google.com/drive/1aNPGTtKrG3uJaLi1CXn9GIEUbcxtPgLu)


これだけで、こんな感じに!
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385220/cfb0a55a-9bb6-556c-2269-86c8bb9d5301.png)


長文だと重いのと、キーワードの切り方がなんか嫌なのと、解釈を勉強しないといけないと思う。
しかし、特許調査時のスクリーニングなどに応用できれば、膨大な文章のどこから読めばわからないような孤独な調査業務も、
今回のライブラリが「ココ見てここ！」のような感じで指摘してくれるので、心安らぐ（かも）。
Attentionを疑う論文や記事もちらほら見たことがあるけれど、それでも使えるかのか試してみたい。

# 参照
公式：[BertViz](https://github.com/jessevig/bertviz)
論文：[A Multiscale Visualization of Attention in the Transformer Model](https://arxiv.org/pdf/1906.05714.pdf)
日本語での記事あった：[BERTメモ（BertViz）その1 - ichou1のブログ](https://work-in-progress.hatenablog.com/entry/2019/09/24/222947)