アイディア発想法にBERTを利用してアイディア創出のスピードアップを試みた

# はじめに

皆さん、こんにちわ！

[ABEJAアドベントカレンダー2020](https://qiita.com/advent-calendar/2020/abeja)の18日目の記事です。

ABEJAではPMをやっておりますが、前職は15年くらい新商品開発、新規開発をおこなう部署で機械設計、研究をしていたという経歴です。（たぶん珍しい経歴だと思います。）
2年くらい前からAIに可能性を感じて勉強を始め、趣味でJDLA G検定とE資格を取得しました。

今回はアナロジーを利用したアイディア発想法である**NM法**に**BERT**を利用することで、**新しいアイディアを早く発想する手助けができないか**ということにGoogle Colaboratoryを使用してトライしてみます。
Google Colaboratoryなら試すのにお金もかからないし、黒い画面で環境構築頑張ることなく、ここに書いた内容をペタペタとコピペすれば５分もかからず試せると思うのでぜひビジネスサイドの方も試してみてください。

# アイディア発想法との出会い

機械設計をやっていたころには多くの特許出願をしていました。これらのアイディアは簡単に思いつくものではなく時間がかかるものが多いです。**偶然の出会いやひらめき**みたいなものがないとなかなか思いつかないものです。

ところが、世の中の変化が早くなっている現代では、製品開発や解決しなければいけない期間はますます短くなっています。
そこで、**素早く発想できることでリードタイムを短縮しよう**と思い、いい方法はないものかと調べていた時に出会ったのがこちらの本です。

**アイデア大全　創造力とブレイクスルーを生み出す42のツール**
https://www.forestpub.co.jp/author/dokushozaru/lp/idea/

こちらの本は多くの事例を挙げながらアイディアの発想方法を紹介しています。過去の発明がいかにして生まれたのか単純に読み物としてもおもしろいです！
私がこの本の中で自分のこれまでの発想方法と近いと感じて実践していたのが**NM法**でした。

## NM法について
NM法は**アナロジーを活用したアイディア発想法**です。簡単に言うと他の似ているものをヒントに新しい発想を行います。こちらは、ものづくりだけでなく、新規ビジネスの発案にも使われているそうです。

具体的には下記のステップで行われます。

1. QK (Question of Keyword)
テーマに対して簡潔に表現した**キーワード**を決める。

2. QA (Question of Analogy)
キーワードについて**類似する事例**を集める。

3. QB (Question of Background)
類似する事例に対して、**背景を探る**。（そこで何が起きているのかを詳しく検討する）

4. QC (Question of Conception)
背景のイメージをヒントに**テーマに応用することができないか**考える。

## NM法の事例
アイデア大全の中では実際にNM法で発明された事例として缶入り飲料のプルタブが紹介されています。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370070/bb2ee61a-c0c9-655d-d9e5-b1786da18c03.png" width=50%>
この缶を開けるところですね。缶詰のように缶切り等の道具を用いずに、液体入りの缶を開けるにはどうしたらいいかという課題に対して下記のステップで発明したそうです。

1. QK (Question of Keyword)
テーマに対して簡潔に表現した**キーワード**を決める。
→「しっかり閉じたものが開く」

2. QA (Question of Analogy)
キーワードについて**類似する事例**を集める。
→「ハマグリ」、「天の岩戸」、「火山の噴火口」

3. QB (Question of Background)
類似する事例に対して、**背景を探る**。（そこで何が起きているのかを詳しく検討する）
→「ハマグリで何が起きているか？」→「閉じ合わせた貝殻の貝柱が緩むと開く」
→「天の岩戸で何が起きているか？」→「人力で岩を動かすと開く」
→「火山の噴火口で何が起きているか？」→「マグマの圧力でひび割れが広がって開く」

4. QC (Question of Conception)
背景のイメージをヒントに**テーマに応用することができないか**考える。
→「閉じ合わせた貝殻の貝柱が緩むと開く」→「閉じ合わせた隙間が分かれて開く」
→「人力で岩を動かすと開く」→「人力で閉じているものを動かす」
→「マグマの圧力でひび割れが広がって開く」→「あらかじめ切れ目を入れておいて、そこから開く」

これらのアイディアを組み合わせることでプルタブが開発されたそうです。

## 実際にNM法を行った時に時間のかかるところ
こちらのNM法を過去に何度か実践してみましたが、一番時間がかかるとともに重要なのが**QAの類似事例を集めるところです。**似ているものが何であるかを考えるのは結局これまでの経験や知識によって差があります。これまでと同じように偶然の出会いが必要だったりします。また、網羅しきれるものでもなく「なんでこれ思いつかなかったんだろう。。。」とだいぶ後になって思いつくこともあります。

いい方法ないかなーとずっと考えていたのですが、BERTの実装をしていたときに「あれ？これ使えるんじゃないか？」と思いつきました。


# アプローチと期待する結果

BERTは、2018年10月にGoogleの論文で発表された自然言語処理モデルです。
多くの自然言語処理タスクで当時の最高スコアを更新し、人間の理解力を超えたとして話題になりました。そのタスクの中で**Masked Language Model**に注目しました。

Masked Language Modelは簡単にいえば**穴埋め問題**です。
例えば
`my dog is [MASK]`
の`[MASK]`に相当する部分には何が入るか？ということを前後の文脈から当てるものです。

これを利用して先ほどのプルタブの事例の中の
「しっかり閉じた**もの**が開く」
の**もの**部分を`[MASK]`にすれば、**「ハマグリ」とか「噴火口」にあたる類似のもの**を出してくれるんではないかと期待して試してみます。

# 実装
Google Colaboratoryを使います。

### インストール
必要なライブラリをインストールします。

```python
!pip install transformers
!pip install fugashi
!pip install ipadic
```

### モデルとTokenizerの読み込み
今回は東北大学 乾・鈴木研究室が作成、公開した事前学習済みモデルと、Tokenizerを読み込みます。

```python
import torch
from transformers import BertForMaskedLM, BertJapaneseTokenizer

model_name = "cl-tohoku/bert-base-japanese-whole-word-masking"
model = BertForMaskedLM.from_pretrained(model_name)
tokenizer = BertJapaneseTokenizer.from_pretrained(model_name)
```

### 対象テキストの入力とトークン化
「しっかり閉じた**もの**が開く」の**もの**部分を`[MASK]`して、トークン化します。実行結果をみるとどのように分かち書きされているかと、**もの**部分が`[MASK]`されていることが確認できます。

```python
text = f'''しっかり閉じた{tokenizer.mask_token}を開く。'''
input_ids = tokenizer.encode(text, return_tensors='pt')
tokenizer.convert_ids_to_tokens(input_ids[0].tolist())
```
実行結果

```python
['[CLS]', 'しっかり', '閉じ', 'た', '[MASK]', 'を', '開く', '。', '[SEP]']
```

### マスクトークンの予測
こちらが予測部分になります。`[MASK]`部分に入る確率の高い上位30件を表示してみます。

```python
mask_token_index = torch.where(input_ids == tokenizer.mask_token_id)[1].tolist()[0]
output = model(input_ids)
pred_ids = output[0][:, mask_token_index].topk(30).indices.tolist()[0]
for pred_id in pred_ids:
   output_ids = input_ids.tolist()[0]
   output_ids[mask_token_index] = pred_id
   print(tokenizer.decode(output_ids))
```


# 予測結果
こちらが３０件の予測結果になります。

```python
[CLS] しっかり 閉じ た 扉 を 開く 。 [SEP]
[CLS] しっかり 閉じ た ドア を 開く 。 [SEP]
[CLS] しっかり 閉じ た 口 を 開く 。 [SEP]
[CLS] しっかり 閉じ た 窓 を 開く 。 [SEP]
[CLS] しっかり 閉じ た 蓋 を 開く 。 [SEP]
[CLS] しっかり 閉じ た 穴 を 開く 。 [SEP]
[CLS] しっかり 閉じ た もの を 開く 。 [SEP]
[CLS] しっかり 閉じ た 門 を 開く 。 [SEP]
[CLS] しっかり 閉じ た 手 を 開く 。 [SEP]
[CLS] しっかり 閉じ た シャッター を 開く 。 [SEP]
[CLS] しっかり 閉じ た ゲート を 開く 。 [SEP]
[CLS] しっかり 閉じ た 箱 を 開く 。 [SEP]
[CLS] しっかり 閉じ た 容器 を 開く 。 [SEP]
[CLS] しっかり 閉じ た 板 を 開く 。 [SEP]
[CLS] しっかり 閉じ た 部屋 を 開く 。 [SEP]
[CLS] しっかり 閉じ た 目 を 開く 。 [SEP]
[CLS] しっかり 閉じ た 指 を 開く 。 [SEP]
[CLS] しっかり 閉じ た [UNK] を 開く 。 [SEP]
[CLS] しっかり 閉じ た 空間 を 開く 。 [SEP]
[CLS] しっかり 閉じ た パイプ を 開く 。 [SEP]
[CLS] しっかり 閉じ た シリンダー を 開く 。 [SEP]
[CLS] しっかり 閉じ た バルブ を 開く 。 [SEP]
[CLS] しっかり 閉じ た ページ を 開く 。 [SEP]
[CLS] しっかり 閉じ た 弁 を 開く 。 [SEP]
[CLS] しっかり 閉じ た 鍵 を 開く 。 [SEP]
[CLS] しっかり 閉じ た 錠 を 開く 。 [SEP]
[CLS] しっかり 閉じ た ポケット を 開く 。 [SEP]
[CLS] しっかり 閉じ た 部分 を 開く 。 [SEP]
[CLS] しっかり 閉じ た 状態 を 開く 。 [SEP]
[CLS] しっかり 閉じ た 器 を 開く 。 [SEP]
```

残念ながら「ハマグリ」などはありませんでしたが、なるほどなーと思うものがリストアップされていました。

# 考察
期待していたものは出てこなかったものの**ある程度思いつきそうなものを素早くリストアップしてくれた**ところに価値を感じました。実際に新しい発想が必要になった時に試してみようと思います。

今回使用した事前学習モデルは日本語Wikipediaを使って学習されているので常識的な内容がリストアップされている印象です。
思い掛けない類似事例を出してくれることを期待するのであれば、もっとくだけたソースで学習したものがいいかもしれません。
「天の岩戸」なんかは青空文庫とか物語をベースにしたものだったらリストアップしてくれるかもしれませんね。
社内文書でファインチューニングしてあげると社内の似た技術を拾ってきてくれたりするのかな？とか色々と妄想が広がります。

# 最後に
製造業、機械の設計開発において、どこにAIが活用できるのか個人的に色々と考えてきました。
シミュレーションへの活用が最初に思いつきそうですが、発展している自然言語処理を利用してアイディア発想の部分でも活用できるのではないでしょうか。FMEAの観点出しにも応用できるんじゃないかと思っています。

製造業などの設計開発で、AIを活用して開発リードタイム短縮を考えている方がいればお気軽にお話しさせてください！

ABEJAには技術・事業双方に知見を持つメンバーがたくさんいます。少しでもご興味のある方、[採用募集](https://hrmos.co/pages/abeja)しておりますのでぜひお声がけください！