かわみのメモ帳

趣味に関するメモを書いていきます。

アボ「カ」ド?アボ「ガ」ド?ディープラーニングで識別させてみた

おはようございます。かわみです。
突然ですがみなさん、普段アボガドを食べていますか?
アボカドは森のバターとも呼ばれ、主にサラダの一部として摂ることが多いと思います。

アボカド。アボガド。

そう、Avocadoの日本語表記には表記ゆれが存在しています。
ということで本記事では、文章中の空欄にアボ「カ」ドとアボ「ガ」ドのどちらが入るのかをディープラーニングで自動識別させます。

アボカドとアボガドの自動識別の歴史

近年、技術の進歩で農業にもAIを活用する時代になってきました。
きゅうりをAIで自動識別して仕分けするシステムや、

business.nikkei.com

AIを活用したトマトの水やりなど、その例は枚挙にいとまがありません。

www.jst.go.jp

この例の一つとして、こちらの記事をご存じでしょうか。

kyoko-np.net

人工知能(AI)を使って果物のアボカドとアボガドを識別するシステムを、千葉電波大学の鰐梨教授らが開発した。 専門家並みの精度で見分けることができるという。研究結果は英科学誌フェノメノン」5月特大号に掲載された。 (虚構新聞『アボカドとアボガド、深層学習で識別 プロ並み精度誇る これは嘘ニュースです』 / 2019年5月29日付)

アボカドとアボガドを自動で識別する画期的なシステムが発表されました。 また、

判別前の果物を見せたところ、99.7%の確率でアボカドとアボガドをほぼ正しく区別した。 (虚構新聞『アボカドとアボガド、深層学習で識別 プロ並み精度誇る これは嘘ニュースです』 / 2019年5月29日付)

と記載されており、高い精度を誇っています。 このシステムは今後、スマートフォン向けアプリなどへの応用が期待されるそうで、前述のきゅうりのように手軽に仕分けができるようになるのでしょう。

さらにこちらの記事には、アボカドとアボガドの識別システムの歴史が紹介されています。

1957年、アボカドとアボガドを区別するために作られた日本初の国産コンピューター「AVCAD」では、処理能力の制約から、濁点の有無で文字を識別する程度にとどまっていた。 また、CPU(中央演算処理装置)や認識技術の向上によって、1996年には「カ」と「ガ」の発音に着目した音声識別も達成。 画像識別だけが最後の課題として残されていたが、AIと深層学習の進歩により、ついに完全解決へと至った。 (虚構新聞『アボカドとアボガド、深層学習で識別 プロ並み精度誇る これは嘘ニュースです』 / 2019年5月29日付)

「アボカド」と「アボガド」といった文字列の識別、音声の識別、そして今回、画像識別が達成されました。











冗談はこの辺りまでにしておいて、この歴史を一部誠のものにしてみましょう。

なお「アボカド」と「アボガド」の表記ゆれの議論はインターネット上で活発に行われており、
このようなツイッターアカウントまで存在しています。恐ろしい。

twitter.com

近年[要出展]ではこの委員会の努力が実ったのか、「アボカド」のほうがマジョリティでしょう。(後述)

タスク概要

文字列における「アボカド」と「アボガド」の識別に挑戦してみましょう。
ただし、単に「アボカド」「アボガド」と入力するのではなく、一部が空欄になった文章を入力し、そこに「アボカド」と「アボガド」のどちらが入るのかを識別させます。
つまり、

人工知能(AI)を使って果物の[空欄][空欄]を識別するシステムを、千葉電波大学の鰐梨教授らが開発した。

といった文章を入力したとき、それぞれの空欄に「アボカド」「アボガド」のどちらが入るのかを予測します。

関連研究

空欄を予測するモデルの一つとしては、Googleが発表したBERTが有名です。

arxiv.org

これは双方向Transformerを何層にも積み、

  • 空欄の穴埋め
  • 2文の関係(連続した文かどうか)

の二つのタスクを学習するモデルです。

このBERTをEncoderに用いてファインチューニングしたら様々なタスクでてっぺんを取ってしまった(SOTA)ため、界隈を騒がせました。

BERTの事前学習済みモデルを用いると、以下の記事で記載されているように、空欄の穴埋めができます。

qiita.com

モデル

さて、本記事のタスクは「アボカド」と「アボガド」を予想することです。
BERTをそのまま使った空欄の穴埋め(マスク)では、学習に使用した約3万語ぶんの確率を出力してくれますが、今回は二つだけでよいのです。

BERTでは入力時に[CLS]という特殊なタグを頭に付けますが、これはこの箇所の出力を分類に使用するために存在しています。
主に1文ないし2文が連結されて入力されたとき、それらを何かに分類する際に使用します。
一方、今回は文中の空欄一つ一つについて2値分類をするわけですから、文頭の[CLS]ではなく、空欄の位置の出力を用います。
つまり、マスクの予測を単語数2で行う、というイメージが的確でしょう。
アボカドとアボガドでもない場合は知りません。あくまでもどちらっぽいかを出力します。

f:id:kawamix:20190620233510p:plain

データ

どの一般家庭にもある、約1億件のツイートデータから、「アボカド」と「アボガド」を含んだツイートを抽出します。 すると、約1万件のデータが抽出できました。1億件からたったの1万件です。1個数百円するような高級な卵くらい、いやそれ以上に希少価値が高いと言えるでしょう。意外とみなさんアボカドについて何も呟いていないようです。

その中から、有名イラストレーター「アボカド6」や定数で有名な「アボガドロ」を含んだツイートを除外します。大事です。

さて、ここで「アボカド」と「アボガド」の割合を算出してみます。
データから個数を数え上げると、アボカドが9123箇所、アボガドが1698箇所でした。
今更ながら正しいほうは「アボカド」です。今ではしっかり浸透しているのでしょう。

機械学習屋さんならこの偏りに少し頭を抱えるでしょう。そうでもないですか。
もし何も考えずにこの割合のまま学習をしてしまうと、圧倒的にデータ数の多い「アボカド」に偏りかねません。

qiita.com

データ数を揃える方法が一番分かりやすいのですが、アボカドのほうを1698箇所に減らしてしまうとあまりにもデータ量が少なすぎるので、今回は損失関数に手を加えます。

qiita.com

上記の記事にあるように、損失関数にweightを与えます。
今回はデータの偏りがアボカド:アボガド=5:1であったため、アボガドの重みが5倍になるように調整させます。

学習

さて、揃ったデータを入力する形に加工し、学習を始めてみましょう。

今回は日本語Wikipediaの学習済みモデルを使用させていただきます。

yoheikikuta.github.io

もう少し欲を言えば、ツイッターのデータで学習したモデルのほうが好ましいのですが、気軽に配布している方がいませんでした。当然か。

前処理

アボカド/アボガドコーパスを、SentencePieceを用いてサブワードに分割してみます。
するとどうでしょう。「アボカド」も「アボガド」も辞書に入っていないのです。

きっとナポレオンの辞書にもあったであろう、アボカドとアボガド。

データの入力時には[MASK]という空欄を表すタグに置き換えるので学習には問題ないのですが、きれいに分割してから[MASK]に置き換えようと思っていたので、前処理が少し面倒になりました。 最終的には一単語として分割される適当な未知語に置き換えて分割してから[MASK]に置き換えることにしました。

ただしアボカドやアボガドが複数連なったときの処理では、複数ならんだ適当な未知語も一単語として分割されてしまったので、少し頭をひねりました。

さて、データも揃ったので、学習データとテストデータを5:1に分割して、ファインチューニングします。

評価と具体例

やっと本記事のメインへと辿り着きました。自動評価とその難しさ、実際の識別事例を紹介します。

自動評価

約35Epochほど学習をさせたところ、テストデータの各評価値は以下のようになりました。

テストデータ 箇所
アボカド 1811か所
アボガド 365か所
評価指標 評価値
正解率(accuracy) 0.886
F値 0.605
適合率(precision) 0.727
再現率(recall) 0.518

およそ90%の確率で文章中のアボカドとアボガドを見分けることに成功しました。
しかしF値があまり良くありません。無念。適合率が高く、再現率が低いため、アボガドを機械が出力する確率がだいぶ低くなってしまっているのでしょう。
ただしこれはそもそも人間でも頭をかかえる場合があるので、非常に難しいタスクではあるのです。

その難しさを、実際の文章から体感いただきましょう。

識別してみる

入力は機械に入力した文、正解は空欄に実際に入ることば、予測は機械による予測結果を示します。

入力: 人工知能(AI)を使って果物の[空欄(1)]と[空欄(2)]を識別するシステムを、千葉電波大学の鰐梨教授らが開発した。
正解: (1)アボカド, (2)アボガド
予測: (1)アボカド, (2)アボカド
入力: [空欄]とは、クスノキ科ワニナシ属の常緑高木である。
正解: アボカド
予測: アボカド
入力: 「[空欄(1)]」と「[空欄(2)]」どっちの発音が正しい?
正解: (1)アボガド, (2)アボカド
予測: (1)アボカド, (2)アボガド
入力: 99.7%の確率で[空欄(2)]と[空欄(2)]をほぼ正しく区別した。
正解: (1)アボカド, (2)アボガド
予測: (1)アボカド, (2)アボガド
入力: ねえーーーーーーーーーーーーなんで[空欄(1)]のこと[空欄(2)]っていうの💢 💢 💢 💢💢 💢 💢 💢
正解: (1)アボカド, (2)アボガド
予測: (1)アボカド, (2)アボガド
入力: エビとサーモンと[空欄]のサラダが食べたい
正解: アボガド
予測: アボカド
入力: 焼く!?[空欄]焼くんですか?美味しそう😋
正解: アボガド
予測: アボカド

後半の例のように、「アボガド」を完全に「アボカド」の文脈で使われているものに関しては、人間でも正解するのが難しいでしょう。 正解するには発言者のスキーマを理解する必要があります。

おわりに

正解率99.7%は達成できませんでしたが、アボカドとアボガドの識別はある程度なら可能であると分かりました。
識別精度がさらに向上した際には、スマートフォンアプリなどへ応用し、音声認識を組み合わせれば、一般家庭でもアボカドと言ったのかアボガドと言ったのか識別ができるようになるでしょう。

実験時にクックパッドで「アボカド」と「アボガド」を検索してみたのですが、驚くことに(?)どちらも同じ検索結果を得られました。おそらく表記ゆれの対策がしてあるのでしょう。 この点からもやはりアボガド/アボガド問題は重要な問題といえます。
なお今回書いたコードはこちらに掲載しておきます。是非、ご家庭でもご調理ください。

github.com

今回は日本語Wikipediaで学習されたBERTモデルを使いましたが、学習環境があれば、ツイートデータでBERTを学習して公開してみたいですね。
おそらく無理でしょうけれども。

というわけで、アボカドとアボガド、理解していただけましたか?
是非とも日常生活でお役立てください。