自然言語処理の機械学習によるSemantic Textual Similarity (STS)(1)

ゆるーく自然言語処理(NLP)について書く。

コンピュータには文の意味が理解できない?

多くのAIなんちゃら関係の書籍やそれを要約紹介するYoutubeを見たことはあるだろうか?その中でもNLPに関連する有名なセリフがあります。(特に有名Youtuberが広めている)

Siriで「この近くのおいしいイタリア料理の店は?」と聞くのと、「この近くのおいしいイタリア料理以外の店は?」と聞くので同じ結果になる

そのため、AIは文を理解できないとのこと。これは「AI VS. 教科書が読めないこどもたち」の引用と思われるが、この例はあくまでSiriについてである。

また、この書籍が出版されたのは2018年である。はたしてコンピュータはまだ文を理解できないのか?

Semantic Textual Similarity(STS) – 意味類似度

これに多少関連しているのだが、NLPタスクの一つにSemantic Textual Similarity(STS)というものがあり、これは、2つの文の意味がどのくらい近いかを測定するものだ。

  1. 私は車を走らせビールを買いに行った。
  2. 私は車でビールを買い出しに行った。

上記の2つの文は少し言い回しが異なり、すこーしだけニュアンスが異なるように思えるが、意味はほぼ同じなので、類似度として0.95以上が正解と言っていいだろう。

正直この2つの文なら、古来から伝わるTF-IDFや、Word2Vec平均でその類似度は正確に測れそうである。しかし、このSTSは一見簡単そうに見えてかなり難しいタスクであることがわかる。
例えば以下の2つの文を考える。

  1. ビールを飲んだので、酔っぱらってしまった。
  2. 酔っぱらったので、ビールを飲んでしまった。

2.の方の文は少し違和感があるが、完全に変な文章とは言い切れない。我々人間には、これらの2つの文は意味が異なると簡単にわかる。しかし、コンピュータ的にはこれが異なる意味だと認識するのはやや難しい。TF-IDFで類似度スコアを出すとほぼ1になる(品詞がすべて同じなので)し、Word2Vecを使用しても単語の出現位置によってそれぞれのfeatureは変化しないので、2つの文は同じ意味になってしまう。

また以下の文も同じようにやや難しいタスクになる。

  1. 私はスルメをつまみにビールを飲むのが大好きである。
  2. 私はスルメをつまみにビールを飲むのが大好きではない。

この2つの文は逆のことを言っているが、文中のwordは「である」と「ではない」以外すべて同じなので、かなり高い類似度スコアを出してしまうのだ。

つまり、TF-IDFやWord2Vecなどでは文の意味を正確に認識して特徴量を計算することは不可能なのである。

BERT(Electra)による日本語STSの奮闘

BERTが世に出てきて久しく、BERTやその派生形(RoBERTa、ALBERTなど)の紹介がネット上に転がっている。そのほとんどがGoogleのペーパーの中身を紹介しているようだが、このBERTなら上記のSTSタスクを正確にこなせるのか?BERTはBidirectionalなので、前後の単語との位置関係で特徴量を算出するため、一見これらのタスクをこなせそうである。

この期待からBERTによってSTSの精度高めて、これを利用したサービスを展開することにした。しかしその道のりは長く、簡単なものではなかった。今回、ElectraというBERTの学習方法を効率化したモデルを使用した。(詳細は追記予定)その奮闘の軌跡をつらつら記していくことにする。

結論から述べるとBERTでも人間と同じように意味を認識するのは難しい。しかしある程度の精度は出すことができる。おそらくこんな記事のニーズはないけど、この長い試みの中で得た考えや奮闘を書いていきたい。