2022年2月4日金曜日

GiNZAによる係り受け解析とルールベースマッチングの活用

【what is this】前報は、GiNZA係り受け解析の利用でしたが、今回はさらに、「ルールベースマッチング」を試してみました。例題として、植物の花に関する簡単な記述から、その花についてのwhat flower?(どんな色や形なのか)とhow does it bloom?(どのように、どんな位置に、いつ咲く)という質問に自動応答できるよう、必要情報(単語)を抽出してみました。今回の例文では、概ね成功でしたが、多様な表現を含む自然言語処理の難しさも改めて感じました。

花の記述文からの"what flower?", "how does it bloom?"の抽出方法
 
解析対象例文は以下の8件 (p1)(p8) としましたが、これらは、参考資料[1]に掲載されている植物の記述文を参考に作成しました。各文に含まれる、花に関するwhat flower?と、how does it bloom?とに対応する単語を抽出したいのです。

 その方法として、まず、その文に、「'花'を右端に含む単語が存在し、その後方のどこかに述語が来る」というパタンを見つけます。そのために、以下のように指定して、GiNZAのルールベースマッチングを用います。

    #パタンの定義とMatcherへの追加 ==================
    matcher = Matcher(nlp.vocab, validate=True)
    pat_flw =[{'TEXT':{'REGEX' : '.*花$'}},{'OP':'*'},{'DEP':'ROOT'},]
    matcher.add('flw', None, pat_flw)

 パターンにマッチした単語を元に、その係り受け(子供と親)の種類と、係り先の単語の品詞に応じて、whathowへの帰属を決める必要があります。述語(ROOT)としては、今回は"咲く"にマッチするか否か調べるのですが、正規化(レンマ化)表現を利用することで、"咲かせる""咲けば"などもマッチするようにしています。(具体的なPythonプログラムは、この記事の末尾に示します。)

"what flower?", "how does it bloom?"の答えとなる単語の抽出結果
 
結論を以下に示します。特徴的なこととして、上述のとおり、述語として、"咲かせる", "咲く", "咲けば"が、全てマッチしていて適切に処理されています。また、"花"の前方(左側)の単語が必ずしもwhatではなく、howに属する場合があることにもご注目下さい。例えば、(P1)では、"枝先に" は、"花" の前方にあるのですが、これは当然ながら、howに属する結果となっています。

 なお、(p1)での "濃紫色で" は、whatではなくhowに属する結果となりました。これは、係り受け解析が、"濃紫色で→咲か" という、微妙ですがちょっと不自然と感じられる結果を示したことに起因します。希望としては、 "濃紫色で筒状の" は、  "濃紫色の筒状の" の意味として解釈して欲しかったです。

(P1) 枝先に濃紫色で筒状のを次々咲かせる。
     -> what [筒状の, を]
     -> how  [枝先に, 濃紫色で, 次々, 咲かせる。]

(P2) 紅色等の唇形花を穂状に咲かせる。
     -> what [紅色等の, 唇形花を]
     -> how  [穂状に, 咲かせる。]

(P3) 暗紫色の壺形のを冬咲かせる。
     -> what [暗紫色の, 壺形の, を]
     -> how  [冬咲かせる。]

(P4) 葉腋に青紫色の唇形花が2つ咲く
     -> what [青紫色の, 唇形花が]
     -> how  [葉腋に, 2つ, 咲く。]

(P5) 紅紫色の蝶形花が総状に咲く
     -> what [紅紫色の, 蝶形花が]
     -> how  [総状に, 咲く。]

(P6) 数年すると肉質の咲く
     -> what [肉質の, が]
     -> how  [数年すると, 咲く。]

(P7) 淡紅色のが10月ごろ咲く
     -> what [淡紅色の, が]
     -> how  [10月ごろ, 咲く。]

(P8) 初冬に小さな咲けば良い。
     -> what [小さな, が]
     -> how  [初冬に, 咲けば良い。]

上記例文のGiNZAによる単語間の係り受け
 上記例文のうち、(p2), (p4), (p8) に対する、GiNZAの単語間係り受け解析結果を図示します。下記の抽出プログラムは、ここに示されている係り受けの種類(acl:名詞の節修飾子,  compound:複合名詞,  mark:接続詞,  aux:助動詞,  等々)と品詞の種類に対応して動作するようになっています。

 なお、"唇形花"、"蝶形花"、"4弁花"などはユーザ辞書に登録してあるので、ひとつの単語として認識されています。

"what flower?", "how does it bloom?"の抽出プログラム
 最後に、ご参考までに、今回の抽出プログラム(Python)主要部を以下に示します。このなかで、テキストファイルHanaNoSakikata.txtに、上記の花の記述文が入っているとします。

感想
 花に関する短い例文8件については、概ね想定どおりの結果が得られました。もちろん、上記の方法でうまく行かない例文は多数存在します。人間が話し、理解できる自然言語の世界はとらえきれない多様性を呈するように感じます。しかし、今回の結果には勇気付けられた気がしました。

[1] 渡辺坦:植物の名前を探しやすい デジタル植物写真集
http://plantidentifier.ec-net.jp/

2022年2月1日火曜日

GiNZAによる係り受け解析とユーザ辞書の活用

【what is this】自然言語処理の応用として、以前、係り受け解析器CaboChaを用いた記事(論文)を書きました。その後しばらく間があったのですが、今回は、GiNZAの係り受け解析を調べました。そのなかで、解析対象文章の種類によっては、GiNZAに含まれる解析器spaCyのSudachiPyユーザ辞書機能が非常に有効であることも確認しました。

続編はこちらです

GiNZAによる単語間/文節間係り受け解析
 CaboChaは、文節間係り受けを与えますが、GiNZA4.05に含まれるspaCy2.3はそうではなく、単語間係り受けを提供します。しかし、GiNZAには、ginza.bunsetu_spansという関数があって、spaCyのSpanとして文節を取り出せます。そして、文節bに対するb.leftsを利用すると、文節間係り受け解析が可能になります。このb.leftsですが、京都大学の安岡孝一教授の解説[1]には、以下のように書かれていました。

b.leftsは、文節bから左向き(文頭方向)に出ている単語係り受けのうち、文節の外に出ていくものの一覧だが、これを逆向きに解釈すれば、文節間の係り受けとして扱える。」

 最初にこれを読んだ時、これって何を意味するのか分からず困りました!そこで、簡単な例文について、図1のように、ステップを踏んでトレースした結果、「なるほど!」と納得できました。

(図はクリックすると拡大されます)
 図1は、例文「葉は虎柄の長い卵形である。」の解析結果です。黒矢印は単語間係り受けで、青枠は関数ginza.bunsetu_spansから得られる文節です。そして、赤矢印が、上記の「文節bから左向き(文頭方向)に出ている単語係り受けのうち、文節の外に出ていくものの一覧」となっていることが分かります。この後は、赤矢印の先の単語を含む文節を、関数 ginza.bunsetu_span (末尾にsが付かない) で得て、赤矢印と逆方向に青矢印を付ければ、文節間係り受けとなります。その結果は以下のとおりです。
 葉は→ 卵形である。
 虎柄の→ 卵形である。
 長い→ 卵形である。

別の文章も文節間係り受け解析(with ユーザ辞書)
 他のいくつかの例文に対しても行ってみたいと思います。ここで、参考文献[2]にある以下の記述が気になりました:
「GiNZAの係り受け解析の深層学習モデルは、UD Japanese BCCW v.2.6から新聞系文書を除外したもので学習しています。」

 ということは、一般の話し言葉などには強いが、新聞記事や専門用語を含む学術文書などの「堅い文章」にはあまり強くないということでしょうか?そこで、「堅い文章」に属すと思われる、渡辺坦氏の「デジタル植物写真集」[3]から引用した以下の2つの文章について検討します。
 [例文2] 根生葉は倒被針形で、濃紫色の唇形花が葉腋に咲く。
 [例文3] 2回3出複葉をつけ、花弁状萼が白い花を十字形に開く。

[例文2]の係り受け解析
 上記例文2の解析結果を以下に示します。この文には、植物の専門用語「倒披針形」が含まれています。GiNZA(spaCy)の標準辞書のまま解析すると、下図のとおり、形態素解析でこの用語がバラバラにしか認識されません。それが原因で、文節に対するleftsの集合に不具合(誤り)が生じ、その結果として文節間係り受け解析がうまく行きません。

 次に、この「倒披針形」をユーザ辞書に登録して解析した結果が以下の図です。形態素解析でこの単語が認識され、最終的に妥当な文節間係り受けが得られました。


[例文3]の係り受け解析

 例文3につても同様です。この文には、植物の専門用語「2回3出複葉」が含まれています。標準辞書のままでは、例文2の場合と同じく、うまく行きません。


 そこで、この「2回3出複葉」もユーザ辞書に登録して解析した結果が以下の図です。形態素解析でこの用語が認識され、最終的に妥当な文節間係り受けが得られました。素晴らしい!

SudachiPyユーザ辞書の活用
 上記のとおり、ユーザ辞書登録の効果は絶大です。GiNZAでは、SudachiPyの辞書が使われています。高品質で大規模な辞書のようですが、今回のような特定の専門用語などは載っていない場合も当然あるでしょう。それを補うためのユーザ辞書登録は比較的容易です。今回は試行のため、登録したのは以下3件に過ぎませんが。

2回3出複葉,4786,4786,5000,2回3出複葉,名詞,普通名詞,一般,*,*,*,ニカイサンシュツフクヨウ,2回3出複葉,*,*,*,*,*
2回3出複葉,4786,4786,5000,2回3出複葉,名詞,普通名詞,一般,*,*,*,ニカイサンシュツフクヨウ,2回3出複葉,*,*,*,*,*
倒被針形,4786,4786,5000,倒被針形,名詞,普通名詞,形状詞可能,*,*,*,トウヒシンケイ,倒被針形,*,*,*,*,*

 最初の2件は同じ内容ですが、用語のなかの数字(2と3)が半角でも全角でもOKとするためです。第2項〜第4項の数値は、接続IDやコストですが、標準的な値であり、最適値かどうかは分かりません。

 例文を引用した参考資料[3]には、植物の葉や花の形状や付き方に関する専門用語約160件が説明されています。それら全てをユーザ辞書登録することはさほど困難ではありません。それができれば、この資料にある解説文の係り受け解析の精度は格段に向上するはずです。それを利用したアプリケーションも色々考えられます。

補足
 
当方がこれまでに書いた、「自然言語処理」に関するブログ記事は参考資料[4]に纏めてあります。素人の拙文ですが、ご参考にしていただければ幸いです。

参考資料

[1] yasuokaの日記: 単語間・文節間の係り受け解析システムとしてのGiNZA v4.0.0
https://srad.jp/~yasuoka/journal/641184/

[2] 布留川英一:BERT/GPT-3/DALL-E 自然言語処理・画像処理・音声処理 人工知能プログラミング実線入門、ボーンデジタル、2021年8月

[3] 渡辺坦:植物の名前を探しやすい デジタル植物写真集
http://plantidentifier.ec-net.jp/

[4] 山本富士男:https://www.foyo.pro/自然言語処理

2022年1月24日月曜日

卒論の季節

 今となっては懐かしい卒研の一コマ。(9年前の2013年1月24日の様子:大学のブログ記事を再掲します。)

-----

 明日、1月25日は卒論(卒業研究論文)提出日です。ある研究室の様子をちょっとレポートします。現在、前日の9:00です。この研究室には誰もいませんでした。しかし、中に入ってみると、白板に「日程がんばれ!」と大きく書かれていました。この研究室の指導教員によると、今年度は、卒研生9名全員が、1月23日までに、なんとか卒論OKをもらったそうです。ですから、今日24日は人がいないはずです。

 実はこの研究室は、昨年度も9名の卒研生がいたのですが、卒論を提出できたのは本当に僅かな人だけでした。その提出率は、ここではとても公表できません。今年度は何か秘策があったのでしょうか?→あったそうですが、その効果はまだ十分検証されていないとのことでした。

「がんばれ」と9冊の卒論

 張り出されていた日程表を見ると、毎日、終わった日程に横線を引いて消してありました。まだ、先はだいぶ残っているようですが、卒論提出すると確かに大きな一つのヤマを越えたことになりますでしょう。

1月に入ると毎日のように期限が

 ところで、別のホワイトボードを見ると、以下のような書き込みがありました。2月7日の卒研口頭発表が終わったら(まだ卒業確定ではないですよ!)、すぐにコンパをやろうという呼びかけです。いいでしょう。がんばって。
まだ早いかも

2022年1月17日月曜日

過去5年間のブログ執筆(2017年〜2021年)を振り返る

 Google Bloggerは、気軽にブログ記事を書くのに重宝しています。5年間で、公開記事は310件余りとなりました。一方、日によってテーマが異なる記事を書く場合も多く、テーマ毎にまとめて読みたい場合などに少し不便を感じていました。

 5年間というのは、人生において一つの区切り。大学入学でも普通は4年で卒業なのだから。

 そこで、Google Sitesで新たにwebページを開設し、過去記事を「身近になったAI」「自然言語処理」「強化学習」「データ分析」等に分類し、再度眺めてみます。そして、それを基に、次に何をすべきかを考えます。

 こちらが建設中のそのサイトです。→ https://www.foyo.pro

2021年12月22日水曜日

Thank you for reading

I published 60 articles a year for 4 consecutive years.
I wrote 61 articles this year in 2021 as well.
(61 / 365 = 0.167)

Thank you for reading.

I will take a break for a while.

I hope you all have a wonderful New Year's holiday season.
Winter scenery of Mt. Rishiri, the northernmost beautiful mountain in Japan 
(The mountain is steeper than expected, so winter climbing will be difficult for general climbers.)
The photos shown here are taken from:
http://www.town.rishiri.hokkaido.jp/rishiri/

2021年12月21日火曜日

生成AIによるDeepFakesの倫理に関する授業資料

【what is this】最新のDeep Learningで作られたFake(偽物)DeepFakesは、ポジティブ、ネガティブの両面を持ちます。以下のチュートリアルは、「Artificial Intelligence with MIT App Inventor」の第9弾(beginner level)です。簡単なスマホアプリ作成「Make Your Own Fake Voice!」から始めて、現代のDeepFakesの利用や問題点を議論し、社会に与える影響と将来の姿を考えさせます。主に生徒向けに作られたものですが、一般の大人にも有用な情報が含まれているかと思います。

簡単なFake Voiceアプリの作成
 第一ステップでは、MIT App Inventorを利用した簡単なFake Voiceアプリを作成します。音声認識と音声合成を使いますが、本当の”DeepFakes”ではありません。音声合成の際に、音のpitchとrateを適宜変更するという単純なものです。出来上がったアプリのブロック図は、図1のとおりです。こんな簡単なものですが、それでもFake Voiceの体験ができます。

 例えば、図1のスマホ画面にある「方丈記」の一節「ゆく河の流れは絶えずして、... 」をこのアプリが読み上げます。その際、デフォルトの音声合成よりも、pitchとrateをかなり低くした方が、この随筆にマッチしていて、趣があります。これは、Fake Voiceのポジティブな応用と考えたい。

 一方、例えば、「おれだけど。ちょっと風邪引いてさあ。声が変なんだけど。実わあ...電車の中に鞄を…」をこのアプリで(低pitch、低rateに設定して)電話をかけるとすれば、これは悪用でしょう。

最新AIによるDeepFakesを概観する
 第二ステップでは、最新のDeepFakesはどのように作成され、利用されているかを、ビデオで学びます。適用分野として、音声、音楽、映像、画像、テキスト、などの生成がありますが、ここでは、音声を中心に以下の6件を取り上げてみます。

(1)合成された故ケネディ大統領の声で幻の演説を聴く
 故ケネディ大統領は、凶弾に倒れる前に、ある演説の原稿を用意していました。実現されなかったその演説を、大統領自身だと思えるような声で実現させたプロジェクトがあります。彼が実際に行った831件の演説の録音を元に、AIと音響工学を駆使して、特有の間合いや強調のしかた、それにボストンアクセントも反映させた、彼らしい音声を合成したのです。下記のビデオでそれを聴いてみましたが、なかなかの出来栄えだと思います。“In a world of complex and continuing problems, … America’s leadership must be guided …
 ●President Kennedy Deepfaked
 https://www.youtube.com/watch?v=wZF59wIIBLI

(2)月面着陸に関する「別のバージョンの歴史」
 1969年、米国は人類初の月面着陸に成功しました。しかし、その任務は非常に危険だったので、悲惨な結果になった場合を想定した大統領談話原稿が用意されていました。もちろん、月面着陸はうまくいき、そのスピーチは行われませんでした。しかし、2020年に、MITのチームは、当時のニクソン大統領が沈痛な面持ちでそのスピーチを行う、ディープフェイクビデオを作成しました。これにより、「別のバージョンの歴史」を体験できることを示しました。これがどんなん意味を持ち、どんな影響を与えるかは議論があるところでしょう。
 ●Moon Disaster
 https://moondisaster.org/film

(3)音声データバンクが声を失った人々を救う
 スコットランドのSpeakUnique社は、病気(運動ニューロン疾患)で発声できなくなった人のために、その人らしい声でテキストを読み上げることができるFake voiceを設計製作しています。蓄積された膨大な音声サンプルを利用し、きめ細かく、好みや特性を考慮した調整を行い、個人向けのユニークな高品質音声を作ってくれます。AndroidやiOS向けのアプリとしても、それを提供しています。
 ●Voice Banking Helps People with Motor Neuron Diseases
 https://vimeo.com/403687789

(4)人に代わって美容院やレストランを予約
 米国でも、小規模な店の約60%はネット予約システムを持たずに、電話受付けしているそうです。Googleでは、DeepFake voice(Google Duplex Assistant利用)が美容院やレストランへ予約電話をかけてくれるサービスを始めるとのことです。
 以下のデモビデオでは、客に代わって電話したDeepFake Voiceが、店側の人間から混雑状況を知らされて、最初の希望時間を変更して予約を取っていました!人が発する自然言語をも理解していたのですから、誰しも驚きます。店員は、人間が電話してきたと思っているようでした。(個人向けには需要はなさそうですが、社用で定常的に顧客接待で会食予約する場合などは、人間のコスト削減に繋がるかも。)
 ●Haircut appointment or Restaurant reservation
 https://youtu.be/D5VN56jQMWM

(5)銀行強盗(詐欺)に使われた例
 英国のあるエネルギー会社の従業員は、会社のCEOから、遠く離れた会社に243,000ドルを送るようにという電話を受けました。その従業員は、CEOの声だと信じて、送金してしまいました。その声はFake voiceでした!下記のこのビデオは、このような事件がどのようにして起こるかを説明しています。
 ●Fake Voices Pull a Bank Heist
 https://www.youtube.com/watch?v=EGEID-_XWCM

(6)金融犯罪、金融危機を引き起こす可能性
 以下の短いビデオは、将来、(音声だけでなく、ビデオやドキュメントを巧みに偽造した)ディープフェイクが起こす金融犯罪、さらには金融危機の可能性について、イラストを用いて分かりやすく説明しています。
 ●Could AI-Powered Videos Cause an Economic Collapse?
 https://youtu.be/YE0i7IpqVfk

DeepFakesの適用分野や社会へのインパクトについて考察
 最後の第三ステップでは、ここまでの情報にもとづき、各グループ毎に、DeepFakesの適用分野や将来の可能性について議論させます。さらに、全体会合で、他のグループの見解も聞き、さらに議論を深めるようにしています。指導者に対して、図2のような指針が示されています。(ここでは省略しましたが、もう少し詳しくブレークダウンした指針もこのカリキュラムユニットの資料に含まれています。)


2021年12月19日日曜日

画像の深層学習はどのような領域に着目しているのか

【what is this】ディープラーニングを用いた画像認識は、小学生による体験から実用レベルまで、利用が広がっています。そうなってくると、次の段階は、「どうやって認識しているのか」が気になるはずです。それに答えるのは簡単ではありませんが、少なくとも「画像のどこに着目して認識しているか」を示してくれれば、かなり良いです。簡単な原理でそれを実現する(子供向けの)Scratchプロジェクトがありました。大人でも試してみると楽しい!

■ 認識対象の例とTeachable Machineによる深層学習 
 画像認識の対象として、図1に示した4種の木製の小さな置物を取り上げます。それぞれを300枚程度、Webカメラの位置を変えたり、傾けたりしながら撮影します。それらにラベルをつけて学習させることは容易です。例えば、Google Teachable Machineを利用すれば誰にでもできます。
 その学習結果のモデルに対して、別途撮影した画像を入力した場合、それが4種類のどれであるかは、どの置物でも、99%程度の確かさ(conf = cofidence)で判別できます。

■ 深層学習では画像のどの領域に着目しているか 
 こんなに高いconfidenceで認識されても...  深層学習は画像のどの部分に注目して判断しているのでしょうか?それを調べるための簡単な原理が、Scratch3のプロジェクト「Explainable AI」に示されています。これは、子供向けのAIを開発しているML4K (Machine Learning for Kids) が公開しているものです。

 さっそく試してみましょう。図2(a)はAppleですが、適当なサイズの(紫色の)ブロックで、適当な領域を隠して撮影しています。「へた」の部分を隠した画像に対しての認識では、confidenceはほとんど変わらず99.5%でした。ところが、「中央」を隠した場合は、confidenceが50.1%まで大幅に低下しました。この観察から、「へた」よりも「中央の膨らみ」の方が、より重視されていると推定されます。


 図2(b) は、Salmonですが、「口先」よりも、「エラと腹部」が重要のようです。


 図2(c) は、Bearですが、「尻」よりも、「頭部」が重視されていることが分かります。これは、人間の感性からも納得できます。

■ 注目領域を自動的に検出して表示する 
 ここまでは、画像を隠す小さなブロックの位置を適当に手動で移動させながら調べました。それをもっと組織的にやってみましょう。そのやり方もこの「Explainable AI」に示されていますが、基本的には、手動で調べたのと同じ原理です。

 画像をメッシュにして、その各ブロック部をひとつづつ隠して行き、confidenceの低下を調べます。低下の度合いが大きい(すなわち、重要であった)部分ほど明るくすればよいのです。図3は、Bearの場合ですが、手動で調べた図2(c) のとおり、「目と耳の領域」を最も重視して認識していることが分かりました。こんな簡単な方法なのに素晴らしい!

子供向けのScratchプロジェクトだが、学生などにも有用 
 上に述べたとおり、この方法は図4のScratchプロジェクトで実現されています。主に子供を対象としたものですが、かなり高度な内容と言えそうです。実際、図3を眺めていると、自然言語処理などでも注目されているアテンション(Attention)に通ずるように思います。

 この「Explainable AI」では、TensorFlowをラップして使いやすくしたTeachable Machineの学習結果を取り込みます。そして、それを使った予測(prediction)のための基本的なブロックが用意されていますので、図3のような解析と表示が簡単にできるようになっています。学生や大人にも十分有用だと思います。


2021年12月15日水曜日

タイタニック号データも球面SOMで分析してみる

【what is this】以前、MLB投球の機械学習に関して、球面SOMを用いた分析を行いました。今回は、タイタニック号の乗客データについて、同様に球面SOMで分析しました。技術的なことは別として、SOMの素晴らしさを改めて感じられると思います。

■ タイタニック号の乗客の「生死」の自動分類 
 タイタニック号のデータの詳細は、前の記事をご覧下さい。その記事で扱ったFeatured Dataset には、全部で1,043人乗客データ(生還415名、落命628名)があります。それぞれに、9項目(9の特徴量)の値が記載されています。そして、各人に、「生 / 死」のラベルが付与されています。

 このデータから、乗客の生死を球面SOMで自動分類させるのです。ここで注目すべきことは、球面SOMは、「生 / 死」のラベルは全く利用せずに、(9項目から成る)入力データを何らかのクラスタに分類してくれます。すなわち、ラベル無し(教師信号なし)に機械学習してクラスタを作ります。その結果の一例を図1に示します。

 
 これをみると、何種類かのクラスタにデータが分類されていることが分かります。そして、驚くべきことに、この分類結果に、元々あったラベルをあてはめてみると、この図では、"生"と"死"にほぼ分類されていることが分かります。"生"も"死"も一つではなく、何種類かのクラスタに分かれているようですが、この図では、赤い太線が生死の強い境界線になっているようです。

 なぜ、「生 / 死」のラベルを利用せずに、9次元のベクトルデータをこのように分類できたのでしょうか?不思議にも思いますが、それがこの技術の素晴らしさだと思います。

 さらに詳しくみてみましょう。図2と図3は、図1の場合よりも、ニューラルネットワークのニューロンの個数を増やした場合です。図2は、正面の半球面が、幸いなる「生還者」の世界であることを示しています。。一方、図3は、図2の球面の裏側ですが、そこは恐ろしい死の世界となっています。



2021年12月13日月曜日

機械学習でのFeature Engineering(特徴量設定)体験

【what is this】ディープラーニングでは、「必要な特徴量は自動的に見つけてくれる」とも言われますが、多くの場合、人間による慎重な特徴量設計が必要([1], [2])となるでしょう。この分野の定番MNIST(手書き数字認識)と同様に有名なものとして、「タイタニック号の乗客の生死」に関するデータセット([3], [4])があります。今回はこれに関する機械学習を行うえで、どのように特徴量を設定すべきかを、参考資料[3]に従って体験しました。

■ タイタニック号の乗客のデータの機械学習 
 本稿は、Gant Laborde氏による書籍[3]第9章の解説の追体験記になります。乗客のデータは、図1「(1)原データ」にあるとおり、全部で12種の特徴量(12カラム)からなります。氏名、年齢、性別などの他に、Survived(生/死)が含まれています。整数値、実数値、文字列などの値が含まれています。

 総計1,309名分ありますが、機械学習の観点から、train用891名分、test用418名分に分けられています。そして、目的は、Survived(生/死)をラベル(教師信号)として、train用データを学習させ、その学習結果を使って、test用データ(validation用データとも呼ぶ)の乗客のSurvived(生/死)を予測させ、正解率を計算することです。

■ 機械学習のために、適切に特徴量を設定(Feature Engineering)
 図1(1)原データにおいて、上記の機械学習にとって、寄与度が低いと考えらるものは除外した方がよいです。ここでは、「(2)不要カラム削除」にあるとおり、4要素を除外しました。これを元に、以下の2つのデータセットを作りました。

NaiveDataset
 一つでも空白の(値の無い)セルを含む行を削除します。さらに、SexEmbarkedの値が文字となっているので、これをカテゴライズして、整数値(0,1,2など)に変換します。

FeaturedDataset
 NaiveDatasetに対して、Sexを削除して、新たに2つの特徴量としてmalefeamaleを追加します。さらに、年齢層(10歳未満、40歳未満、40歳以上)を表すAgeBucketを追加します。そして、各特徴量の値を、MinMaxScalerで、0〜1の間の実数値(両端値を含む)にスケーリングします。
 この3つの特徴量を追加した理由は、図2にあります。実は、この悲劇の事故は映画化されたのですが、その中で、多くの乗客が、"Women and children first!"と叫んでいるそうです。図2をみると、それが事実だったことが分かると思います。すなわち、男に比べて女の生存率が圧倒的に高い!また、子供の生存率も大人よりもかなり高いのです。


 この事実は、機械学習に大きな影響を与えるはずです。上で、3つの特徴量を新設したのは、この事実をより強く反映させるためです。maleとfemaleはそれぞれone-hot型にしました。AgeBucketは、3段階に区分けしました。

■ 特徴量の設定の機械学習への効果
 上記のとおり、不要のカラムを削除しただけの「NaiveDataset」と、特徴量を新たに設定した「FeaturedDataset」を用意しました。これらを、図3に示すNeural Network(TensorFlow.js使用)で学習させた結果を示します。


 図3の上段にあるとおり、Validation Accuracyの比較では、FeaturedDatasetに対する正解率0.89は、NaiveDatasetに対する正解率0.83に対して、意味のある向上が得られていると言えます。また、Train AccuracyよりもValidation Accuracyが高くなっていることは、over fittingになっておらず、好ましい学習が行われたことを意味します。つまり、原データにある特徴量をそのまま使うのではなく、データの特性を考慮して特徴量を設計する必要があることを体験できたと思います。

■ Tensorflow.jsについて
 ここで参考にした書籍[3]は、TensorFlow.jsプログラムをNode.jsサーバで動かす例題を示しています。しかし、小生のMac環境では、Nodeを正常に動作させることができなかったので、独自に、通常のWebサーバで実行できるように改変しました。その過程で、TensorFlow.jsの詳細を学ぶことができました。
 また、入力データの様々な加工には、Python環境でのPandasに相当するDanfo.jsを使うことができました。このDanfo.jsの利用によって、上記で述べたFeaturedDatasetの作成を効率的に行うことができました。

参考資料
[1] 
ディープラーニングは自動で特徴を抽出してくれる?
https://www.hellocybernetics.tech/entry/2019/06/23/010201
[2] 機械学習に欠かせない、特徴量とその選択手法とは
https://ainow.ai/2020/07/14/225092/
[3] Gant Laborde:"Learning TensorFlow.js - Powerful Machine Learning in JavaScript", O'Reilly, 2021-05-07.
[4] codexa増田秀人,ウイリアム・スタイメル:"機械学習のプロセス徹底解説-タイタニック号から生還できるのは誰?", 日経ソフトウェア, 2019年1月号, pp.6-27.

2021年12月7日火曜日

Tensorflow.jsのimportなどで遭遇したエラーの対処

【what is this】多くの場合、Tensorflowは、Python環境で使われているようです。しかし、いくつかの理由から(その一例はここにありますが)、JavaScriptで動かすTensorflow.jsへも注目が高まっているようです。本記事は、Tensoflow.jsの基礎を解説したテキスト[1]の例題で発生した、幾つかのエラーに対処した時のメモです。推奨すべき対処法かどうかは分かりませんが、取りあえず正常に動かすための備忘録です。

■ テキスト「Learning Tensorflow.js」
 このテキスト[1]は、今年5月に刊行されたばかりです。Tensorflow.jsの利用に関する基礎知識を与えるものです。例題の解説も分かりやすいです。全部で12章ありますが、8章までは、通常のWebサーバの元で、第9章以降はNode.jsサーバで動かす例題があります。



 第8章の例題を、Visual Studio Codeの環境で実行していて、次のようなエラーメッセージがでました。他の人にもよく起こる?ようであり、対処方法に関する記事をたくさんでていました。それらを参考に対処してみました。

 

■ Tensorflos.jsの例題実行で発生したエラーへの対処
(1)importに関するエラー

例えば、あるJavaScriptファイルindex.jsの中の以下のimportです。
import * as tf from "@tensorflow/tfjs";

これを実行すると以下のエラーが発生しました:
Uncaught SyntaxError: Cannot use import statement outside a module

ネットで調べると、以下のようにすれば良い、という説明がありました:

Add "type": "module" to your package.json file.
{
 // ...
 "type": "module",
  // ...
}

でも、その通りにしても、相変わらずエラーのままです。そこで、以下のようにしてみました。
このimportを削除する。(コメント化して残す。)
htmlの<body>の中に以下を挿入する:
<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@3.0.0/dist/tf.min.js"></script>

以上にようにして、このhtmlファイルをVisual Studio CodeのOpen with Live Serverで起動させたところ、正常動作しました!

(2)moduleに関するエラー
 例えば、あるJavaScriptファイルindex.jsの中にある以下の3つのimportです。
import * as tf from "@tensorflow/tfjs";
import "core-js/stable";
import "regenerator-runtime/runtime";

これに対して、以下のエラーメッセージが出ました:
Uncaught TypeError: Failed to resolve module specifier "@tensorflow/tfjs". Relative references must start with either "/", "./", or "../".

以下のように対処しました:
3行とも削除する。(コメント化して残す。)
さらに、(1)の場合と同じく、htmlの<body>の中に以下を追加。
<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@3.0.0/dist/tf.min.js"></script>

このように改変した結果、正常動作となりました!

(3)Danfo.jsに関するエラー
 Danfo.jsは、PythonのPandas相当の機能を使えるようにするものです。これも、上記(1)、(2)の場合と同様に、JavaScriipt内でのimportに失敗する場合は、htmlのタグで指定すれば正常に使えました。
これをコメント化する-> import dfd from "danfojs-node"
さらに、htmlの<body>の中に以下を追加。
<script src="https://cdn.plot.ly/plotly-1.2.0.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/danfojs@0.3.4/lib/bundle.min.js"></script> 

なお、Dataframe object dfを使って、各カラム毎の統計値を計算できるのですが、その際、非数値(あるいはnull項目)のカラムを取り除いた後に、df.describe().print() を実行する必要があります。

■ 第9章以降の例題の実行
 以上で、第8章までの例題は問題なく動作するようになりました。Mac miniでもLet's NoteでもOKでした。第9章以降では、Node.jsサーバを利用する例題があります。Node.js環境がうまく設定できない場合には、通常のWebサーバで動くように改変しようと思います。

参考資料
[1] Grant Laborde, "Learning Tensorflow.js - Powerful Machine Learning in JavaScript", O'Reilly, 2021-05-07.