2020年12月17日木曜日

神奈川工科大学で講義:自然言語処理と機械学習(事後編)

 【what is this】神奈川工科大学_情報工学科向けの「入門:自然言語処理と機械学習」講義後の報告です。前回の続編になります。現状の小生にとって、今年のn大ニュース(n ≦ 3)入りとなりました。 

久しぶりに約140名に90分講義(講演)
 前回記載のとおり、90分のオンライン講演を実施(2020-12-10)。対象は、約140名の2年生ですが、先生方や大学院生にも聴いていただきました。このコロナ禍ゆえ、自宅からZOOMを利用した講演でしたが、特にトラブルもなく終えることができました。
 熱心に聴講し質問もしてくれた学生諸君に、そして準備された担当の先生、応援して質問もしていただいた先生方に感謝したい。当方としてはここ2ヶ月間、構想を練り準備してきた甲斐があり、たいへん嬉しく思っています。下図のスクリーンショット、どこか良い雰囲気を醸し出しているような気がします。

2年生約140名と、院生、先生方にも参加していただいた

質問が出るのはオンラインのメリット
 上図右欄に見えますが、講演後に学生諸君から3件ほどの質問がチャットで寄せられました。対面授業では通常、ほとんど出ませんので、これは、オンライン授業の良い点のようです。ただ、質問時間は限られていたので、その場でパチパチ素早く質問を正確に打つのは難しかったと思います。後でメールでも質問できるように、当方のメールアドレスも講義スライドに記載はしておきました。

その場の反応が分からないデメリットも
 一方、受講状況が掴めません。私は、ユーモアというか、「ここで学生諸君を和ませよう」と、スライドの何カ所かに仕組んでいたものがあります。それに対する反応が分からないのです。対面であれば、大人数の場合でも、ちょっとどよめいたり、笑いが起こったりするのが分かります。それが知りたいのです。それは5カ所位あったのですが、例えば、以下のような所でした。「ここじゃない!ここ!(詳細はこちら)「日曜日は銀行はやっていない!(詳細はこちら)」It happens inevitably.

ここで、小さなどよめきや笑いが起こるのでは...

後日提出の受講レポートから反応を掴む
 ですが、この講義受講ではレポート提出が義務づけられているため、後で状況を掴むことができました。熱心によく受講してもらったことが分かりました。今後の参考にしたい。残念ながら(公式レポートにはそういうことは書かないものだが)、上記の笑いについて触れた学生はいませんでした!ちょっと残念。以下に、学生諸君からの反応をいくつか示します。(原文の意味を損なうことなく、抜粋、編集したところがあります。)
  1. メモは取ったが、講義資料が公開されていなければ、後で理解を深めることは困難だったが、それがあったので非常に助かった。((注)スライドが役立って良かった。)
  2. 資料を見返してしっかりとまとめたメモと見比べなんとなく理解するところまで行けたことは、個人的にとても大きかったです。((注)予習して臨んだようです。)
  3. 内容だけを見たらすごく難しいものを簡単に見せる工夫や見る側が興味を持つようなしゃべり方をしていたので参考にしたいと思いました。((注)よく分かってくれました!)
  4. 最初は基礎的な部分から、徐々に内容を複雑にしていって、尚且つ前のスライドでその話に持っていきやすいように、しっかりその情報の開示・整理を行っていたために理解しやすくて、((注)そこまで、よくぞ分かってくれました!「以心伝心」という言葉が頭に浮かんだ。)
  5. 退職後も自分の興味で調査や実験をしたという事を聞いて、私も自分自身で動く行動力や何にでも興味を持つ好奇心を忘れないようにしたいと思いました。((注)こんなところにも気がついてくれました!)
  6. 自身が気になったから実際に行ってみたという動機や実体験を元にした説明だったので、内容がわかりやすく伝えたい事も明確で、全体的にとても良かった((注)そのとおり。自分でやってみること!)
  7. Google翻訳を使っているが((注)そういう学生が非常に多かった!)、それに関連する技術や動向の概要が分かった。機械翻訳がこれほど凄い技術でなりたっているとは思わなかった。
  8. 数学の知識が不足しているのでそれを身に付けたい。((注)講義では、誤差逆伝播や微分等については直接言及しなかったのだが、学生は、数学的手法を感じ取った!)

時間配分に気を配る
 スライドは全部で62枚ありました。90分のうち、どの辺りにどの位時間をかけるのか、受講者もそれが分かると落ち着いて聴けるように思いした。少し余裕を持った時間配分とするのが良いと思います。結果としては、ある先生から(そして学生のレポートの中にも)、「ほぼ、時間配分どおりでしたね」と言われて、ちょっと安心。

事前に決めておいた時間配分(配布スライドにも記載)

2020年12月12日土曜日

Attention-Seq2Seq翻訳実験での隠れ層ノード数

  【what is this】日英翻訳実験を行う上で、手頃なサイズの日英対訳コーパスが必要です。ここでは、簡単なものですが独自に用意してみました。そして、これまでの記事に書いた方式(Attentionを用いた)での学習実験を行いました。約4万件の和文のうちからランダムに選んだ9割について対訳英文を学習させた結果、残りの1割の和文全てに対して、正解の英訳文を生成できました。その際の、LSTM隠れ層のノード数に対する和英翻訳正解率の違いを観察しました。

独自のミニ和英対訳コーパスを作成する
 図1のフローに従い、左端から右端までのあらゆるパスを辿ると、語彙数38の範囲で和文41,472件が生成できます。一方、図2に従うと、それらの和文に対する英訳文を生成できるようになっています。英文の場合は、人称に応じて動詞(例えばexpectかexpectsか)の形を選択します。また、この動詞を使う場合は、図2の赤丸に示すように"to"を付加する必要があります。


どのような対訳文が生成されるか
 上記にしたがって生成された和文とその英訳文の例を3つほど示します。
[J1] 私は白い小さな花が早春に一斉に咲くのならばそこへ行くだろう
[J2] 彼女は黄色い斑な花が真夏に密集して開くことを期待している
[J3] 我々は紫の丸い花が晩秋に徐々に咲くことを期待している

[E1] I would go there if white small flowers bloom all at once in early spring
[E2] She expects yellow mottled flowers to open densely in midsummer
[E3] We expect purple round flowers to bloom gradually in late autumn

Attentionを利用した翻訳に上記コーパスを適用
 今回の翻訳方式は前回、前々回の記事に述べたとおりです。つまり、Attention付きseq2seqによるものです。それを構成するLSTMの隠れ層のノード数について実験的に検討しました。以下の結果は、いずれの場合も、約4万件の和英文の対の9割を学習させ、残り1割(約4,000件)を検査に使った場合です。

隠れ層のノード数をどう決める
 実用的な翻訳処理では、入力one-hot vectorの次元(語彙数)は50,000前後であり、隠れ層ノード数は500前後とされているようです。しかし、今回のように語彙数38と非常に少ない場合はどうなのでしょうか。それを確認してみました。以下の図3(a)〜(c)では、隠れ層のノード数が違います。検査用の和文に対して生成された英文の正解率の推移を示しています。

 まず、図3(a)は、隠れ層ノード数を16とした場合です。乱数系列を変えた2つのケースについて示しています。なかなか正解率が上がらず、使えそうにありません。


 次の図3(b)は、隠れ層ノード数を32とした場合です。かなり良いようです。epoch = 20では、すでに検査用和文約4,000件の全てに対して妥当な英訳が得られています!正解率100%!


 図3(c)は、隠れ層ノード数を64に倍増した場合です。より早めに正解率が高まるものの、途中の局所解で停滞したり、誤差低減に不安定が生じたりする傾向があります。


一応の結論
 こんな簡単な実験だけで何が言える?という面もありますが、今後の参考になるように思います。隠れ層のノード数が少なすぎると、入力語彙に対するベクトルにその意味情報が正確に盛り込めない。逆に、隠れ層のノード数が多すぎると、該当の語彙のベクトルに雑音が混じりやすいのではないか。それゆえ、今回のように語彙数38くらいでは、語彙数と同程度の隠れ層ノード数を設定するのがよさそうです。こんな見解、どんなものでしょうか。

2020年12月8日火曜日

Attentionを用いたニューラル日英翻訳の実験(続)

 【what is this】Attention機能を利用した日英翻訳実験において、コーパスサイズ(入力データ量)を前回の3倍(約1万件→3万件)に増やしたところ、全検査データに対して100%正解翻訳出力するまでのepoch数は1/3(27回→8回)に激減した。

何をしたのか
 前回の実験結果について、かっての同僚の先生から、「入力データを1/3にしたらどうなる?」とのコメントを戴きました。これがヒントになりました。でも、1/3にしてみるのではなく、前回は本来の1/3でやったのだ、と考えました。したがって、1/3にするのではなく、3倍にして観測する方が意味があると考えました。つまり、本来は3倍のデータでやるべきだったと考え直しました。

Attentionの性能をあらためて実感
 詳細は略して結論を述べます。前回の日本語の(したがって英語の方も)語彙を少し増やして、コーパスサイズを10,368件から31,680件に3倍化しました。それぞれで、訓練用に8割、検査用に2割を使って学習させた結果が以下の図です。

 検査データの全てに対して正解英文を出力するまでに、前回27epochs、今回8epochsという著しい収束性能が明らかとなりました。小さなコーパスを何回も辿るよりも、大きなコーパスを使えば少ない走査で済む、という妥当な結果だと考えます。いずれにしても、Attention機能の素晴らしさを再確認できたように感じます。



 今回の収束状況の一例を示します。以下の図は、和文「夏に丸い赤い花がまばらに咲く」に対する翻訳状況です。epoch=1では、1単語が認識されているだけですが、epoch=2では、英単語は間違っていますがすでに英文の文型としてOKとなっています。つづくepoch=5では正解の英訳に達しました。




2020年12月7日月曜日

Attentionを用いたニューラル日英翻訳の実験

【what is this】Deep Learningでの重要度が高まっているAttention機能の仕組みを理解するため、独自作成の和英対訳コーパスを用いて、簡単な翻訳実験を行った。「はやぶさ2」の地球帰還ほどではないにしても、感動的な結果が得られた。極く限られた語彙だけを使う8,000件の日英対訳データの学習後には、例えば「盛夏に大きい赤い花が徐々に咲く」は、「large red flowers bloom gradually in midsummer」と自動翻訳された。

何をしたいのか
 機械翻訳において、Deep LearningでのAttetion機能を理解しようとしていました。なかなか、コードレベルで実験しながら理解できるような情報が見つからなかったのですが、実は、2年前に購入した「ゼロから作る...自然言語処理編」[参考文献1]全412頁の最後の方(P.325〜)に、素晴らしい解説があることに気づきました。これだ!ということです。

日英対訳コーパスを独自に用意する
 しかし、文献1には対訳コーパスを使った例はありませんでした。ならばと、極く簡単なものですが、図1に示すように、「花」に関して、開花時期、大きさ、形、色、密集の度合いなどを組み合わせて(語順も変えて)、約1万件の和英データを自作しました。なお、英訳の方は、図2に示すように、多様な日本語語順に対して、英文では語順は固定的にしてあります。(もちろん、日本語の単語が一つでも違えば、違う英文にしてあります。)


日英対訳コーパスを使った学習の実験
 詳細は省きますが、さっそく、文献1にあったRNN-AttentionのPythonコードを利用させていただき、上記の対訳コーパスで学習させました。図3に示すとおり、最初は検査データに対する正解率が上がりませんでしたが、epoch = 20を越えるあたりから、急速に上昇し、epoch = 27 では、検査データ2,000件(学習用データは8,000件)に対する英訳がすべて正解となりました!これには感動を覚えました。


 一例として、和文「早春に 大きい 白い 花が 密集して 咲く」に対する翻訳状況を図4に示します。例えば、epoch = 5くらいまでは、僅かに、幾つかの単語が英訳されているに過ぎませんが、epoch = 27では、期待どおりの正解「large white flowers bloom densely in early spring」に達しています。



Attention機能のビジュアル化で素晴らしさを実感
 このAttentionの美しさと能力は、以下の図5からも感じとることができます。学習が済んだ状態で、以下の和文を翻訳させた状況です。もちろん、正解が得られています。

 和文:紫の楕円の花が早春に一気に咲く
 正解:oval purple flowers bloom at once in early spring

 ここでは、何ら英語辞書は使っていません。上記のとおり、自前の対訳コーパスだけを使っています。それにも拘わらず、「紫の」「楕円の」「早春に」「一気に」等に対する英単語を自ら発見していることがわかります。驚異的です!



【参考文献】
斉藤康毅:ゼロから作るDeep Learning (2) 自然言語処理編、オライリージャパン、2018年7月

2020年12月2日水曜日

神奈川工科大学で講義:自然言語処理と機械学習(事前編)

 【what is this】情報工学科2年生向けの「入門:自然言語処理と機械学習」の概要です。90分のオンライン講義用です。(事後編はこちら

久しぶりの90分授業
 縁あって今回(2020-12-10)、神奈川工科大学情報工学科2年生向けに、90分のオンライン講義をすることになりました。全部で15回あるオムニバス形式の情報工学特別講義の1回分です。

 内容は、「自然言語処理と機械学習」です。ここ2,3年、興味をもって調べたり、自分で実験してみた事項に基づいています。自然言語処理の基本的な解析から機械翻訳までの重要と思われる技術について述べます。

 本当は学生諸君の顔を見ながらの対面授業でやりたいのですが、このコロナ禍のもとでは致し方ありません。しかし、自宅の机上から講義するのですから、やりやすい面もあります。

講義のタイトル

講義の全体構成と時間配分目安

講義にあたって留意したこと

  1. スライド枚数を適切に抑えて、講義時間を超過しないこと。最終的には、目次なども含めて、全62枚のスライドを準備し、(90分だが)85分で終了することをめざす。
  2. 全体を大きく4分割し、それぞれ20分程度の話として明確に区分すること。またそれら各部の相互関連も示すこと。
  3. できる限り、独自の例題、独自のプログラム、独自撮影の画像、身近な話題などを使って、当方の取り組み姿勢を示す。
  4. インパクトのある素晴らしい、他の人の成果は積極的に引用させていただく。
  5. 技術の詳細の講義ではないが、「ふわー」としたお話しに終わらずに、なるべく一定の深さまで掘り下げ、具体例をあげ、簡単な計算例なども加えること。
  6. 一方、詳細な技術内容には立ち入れないとしても、何か「凄いぞ!」「こんなことも考えられているのか!」と驚きを感じ興味を持ってもらう場面も作ること。

講義予定のスライド一覧
 以下は、4区分したスライドの縮刷版です。実寸スライドは(先生方にはすでにご覧いただいていますが)講義時までに学生諸君へ公開します。

part1 人工言語、自然言語、機械学習、サービス

part2 基本解析、形態素解析、係り受け解析、分類問題、コーパス

part3 単語の意味理解、共起語、単語の実数ベクトル空間への埋込み

part4 機械翻訳(用例的、統計的、ニューラル、Attention)、参考文献

このあとどうする
 この講義は、「入門」としています。このあとはどうするか、少しギャップがあると思いますが、技術的にさらに深めたものを作りたいと思っています。特に、最新の機械翻訳の仕組みを明確に説明できることを目指したい。

【参考文献】
 以下の文献等から、多くのことを学びました。また、それらにある例題や図表の一部を引用させていただきました。感謝致します。
  1. 黒橋禎夫改訂版 自然言語処理、放送大学教育振興会、2020年:基本概念とアルゴリズムを簡潔かつ精緻に叙述した定評の教科書。手計算できる小さな例題で理解を深める。改訂版では、最近の機械翻訳(20ページ)が追加された。(全202頁)
  2. 杉本徹・岩下志乃Javaで学ぶ自然言語処理と機械学習、オーム社、2018年:基本概念と基本技術が、幅広く丁寧に解説されている。明解なJavaプログラムとその解説があり、それを動かしながら理解を深められる。(全262頁)
  3. 斉藤康毅ゼロから作るDeep Learning(2)自然言語処理編、オライリー、2018年:定番の「ゼロから作る…」の第2弾、自然言語処理編。じっくり一歩づつ(Pythonでプログラムしながら)進む。最初の方にDeep Learningの一般的解説もある。(全412頁)
  4. 柴原一友自然言語解析アルゴリズムBERT(前編)、日経ソフトウェア2020年7月:情報検索や機械翻訳で注目されているBERTの考え方のやさしい解説。BERTの中核であるTransformerとAttentionがどんなものかをイメージすることができる。 (全13頁)
  5. 奥野陽他2自然言語処理の基本と技術、翔泳社、2016年:広範な話題を数式を使わずやさしく解説しようとしている。初心者が技術の概観を得るのに適す。機械翻訳の解説もあるが、発行が少し前のためか、ニューラル機械翻訳は含まれない。(全239頁)

2020年11月20日金曜日

機械翻訳:bankは銀行か土手か

【what is this】機械翻訳に関する下記 [参考文献] を読んだことからヒントを得てこの記事を書いています。ただし、本内容は、小生の独自調査にもとづく見解です。

英語の単語 bank
 bank
には、銀行土手(堤)などの意味があります。人間ならば、それが出現する文脈からどちらの意味かは容易に判断できます。では、現代の機械翻訳はどうなのでしょうか?


 ・文例(a) I got to the bank after crossing the road.
 ・文例(b) One sunny Sunday, I got to the bank after crossing the river.

現代の機械翻訳は人間の常識や感覚も取り入れている
 まず、文例(a)をご覧下さい。これは易しいです。代表的な4つの機械翻訳器(Google, IBM, Amazon, Microsoft)はいずれもほぼ同じ翻訳結果を出力しました。つまり、bank銀行でした。bankroadは何か関係がありそうな気もしますが、特に問題はありません。


 では次に、文例(b)を見てみましょう。文例(a)の末尾のroadriverに置き換えたものです。さらに、先頭にOne sunny Sunday(ある晴れた日曜日に)を追加しました。小生の気持ちとしては、「晴れた日曜日に川を渡った」のですから、銀行へではなく、土手へ(散歩に)行ったのだ、と伝えたかったのです。この文例(b)に対する4つの機械翻訳器の結果は興味深いものがあります。

 GoogleIBMの翻訳結果は、文例(a)の翻訳にあった「道路」を単に「川」に置き換えただけであり、「銀行」はそのままでした。一方、AmazonMicrosoftは、人間の感覚(常識)と同じく、bankを「銀行」ではなく「土手」と捉えています。素晴らしい!

 「銀行は日曜日はやっていない」(ATMは別として)のだから「銀行ではなく土手だろう」という認識を機械翻訳器が持ったとは思えません。そうではなく、bankriver(およびsunnySunday)が共起するケースをどれだけ学習していたかの違いではないでしょうか。そして、RNN系のニューラルネットワークでは、この場合、bankに対してriverSundayがちょっと離れていることが問題なのかも知れない。ああ、そこが分布意味論!

その他の機械翻訳器も試してみる
 上記の4つ以外にも、web上で使える機械翻訳はかなりあるようです。そのいくつかを加えて、翻訳結果をまとめます。文例(b)にあるbankをどう訳したかです。
 ・bank銀行と訳した翻訳器:Google, IBM, Weblio
 ・bank土手と訳した翻訳器:Amazon, Microsoft, Excite, DeepL

日本語の文のsimilarity(類似度、関連度)の計算サービスで確認する
 いろいろあるでしょうが、例えば、NTT CommunicationsKOTOHAを利用して、上記に述べた事項(銀行 or 土手)を判断するための計算結果が得られました。おうー、納得!やはり、日曜日は銀行はやっていない。だから土手へ散歩に行きます!
 ・「晴れた日曜日に川を渡った後に着いた」⇔「銀行」のsimilarity = 0.106
 ・「晴れた日曜日に川を渡った後に着いた」⇔「土手」のsimilarity = 0.515

まとめ
 この一例だけから、上記の機械翻訳器の優劣に言及する意図は全くありません。実際、私にはそれはできません。しかし、ここで見えてきたのは、どの機械翻訳器も、人間の常識(感覚)に沿うように進化を続けているのだろう、ということです。(現在、2020-11-20です。上記結果は短期間のうちに変わる可能性があります。新たな研究開発が進んでいても、一般公開までには時間がかかるでしょう。英-日は、英-独や英-仏よりもサポートが遅れることもあるでしょう。)

[参考文献]
Google AI Blog:
https://ai.googleblog.com/2017/08/transformer-novel-neural-network.html


2020年11月7日土曜日

[算数 ≒ 数学 – 難しい + 楽しい]の解

  自然言語処理では、単語の実数ベクトル空間への埋め込みが重要な役割を担っています。大規模コーパスのもとで、全単語ベクトルはすでに計算されていて(ツールWord2Vec等を用いて)、何種類かが公開されています。これによれば、単語ベクトルから、例えば、以下のような意味関係が成り立つことが分かっています。多くの書籍やweb解説にも掲載されています。

        King - Queen ≒ man - womam
    (KingとQueenの差ベクトルは、manとwomanの差ベクトルと類似)

 さて、そのような大規模コーパスではなく、以下のような単純な10例文だけの世界を考えます。(助詞などは取りあえず考えないので薄字にしてあります。)この世界では、12単語しか出現しません。このような範囲で、単語をベクトル空間へ埋め込んでも、上記と同様に、単語の意味関係は掴めるでしょうか?


 ここでは、注目単語に対して、window size = 2の範囲に共起した単語を認識するよう、ニューラルネットワークを学習させます。例えば、注目単語「確率論」を入力とした場合、「難しい」と「数学」を教師信号として学習させます。これを、全文全単語について行います。学習終了後のニューラルネットワークにおいて、入力から中間層(隠れ層)のノードへの辺の重みが、その単語のベクトル要素となります。このようにして、全単語について、2次元(中間層のノード数が2の場合)のベクトルを得ます。その結果を下図に示します。

12単語に対する2次元ベクトル

 この結果を見ると、「算数、百マス、児童、早朝」および、「確率論、学生、数学、徹夜」など関連性の高い単語がそれぞれ一つのベクトル上(白線矢印)にのっていることがわかります。

 実は、この結果は一つの解に過ぎません。恐らく、無数に解(すなわち、単語ベクトルの組み)は存在するはずです。ここではそのうちの、[解1]と[解2]を示しました。[解2]は、[解1]を原点を中心に30度ほど回転させたものになっているようです。ここで、「数学」と「算数」の差ベクトルと、「難しい」と「楽しい」の差ベクトルに着目します。この2つの差ベクトルは平行に近いです。したがって、下記が成り立ちます。

        数学 - 算数 ≒ 難しい – 楽しい
        算数 ≒ 数学 – 難しい + 楽しい

 こんな小さな実験コーパスでも、単語の意味関係が掴めたと思います。

2種類の2次元単語ベクトルの組み

 上記は2次元ベクトルでしたが、3次元ベクトルを生成(中間層のノード数を3に設定)した結果が下図です。次元を上げれば、見えてくる情報量も増える傾向にある?かも知れません。ここでも2種類の解を示しますが、いずれも、上記の意味関係が保たれていることが分かります。

2種類の3次元単語ベクトルの組み

2020年11月6日金曜日

ニューラル機械翻訳方式の独自解釈

  Google翻訳など、ニューラル機械翻訳技術は近年著しく発展して、実用レベルにあると言われています。実際に使用してみて、確かにそのように感じます。しかし、その処理内容の全貌はなかなか掴みきれません。一例ですが、Google翻訳で、以下の和文を入れてみると、次のように英文に翻訳されました。

「学生は物理学を教授から」→ Students learn physics from a professor

 うん?「学ぶ」とは言っていないのに、なぜ、「learn」と翻訳されたのか?これについて、小生が独自に(勝手に情報を設定して、思い切った簡略化をして)推測してみた結果を以下の図に示します。恐らく、「当たらずと雖も遠からず」と思っていますが、いかがなものでしょうか。いずれにしても、単語(および単語列)のベクトル(分散表現)と、その間のコサイン類似度等が根底にあり、それに基づくAttentionという機能が使われているのはまちがいないようです。

ニューラル機械翻訳の大胆な簡略化による説明


2020年11月3日火曜日

国立国語研究所から届いたマスキングテープ

 最近は、自然言語処理(機械学習は重要な手段の一つ)を勉強しています。それに不可欠なのが、言語コーパスです。言語コーパスとは、言語による文例を大規模に収集して、一定の処理を施した後に、各種の情報(形態素、構文情報等)を付加したデータベースと考えられます。国立国語研究所では、その主要な業務のひとつとして、多様なコーパス群を研究開発し、公開しています。

 少し前に、これらのコーパスを利用した「KOTONOHA検索コンテスト2020」が開催され、小生もこれに作品応募しました。(少しは期待していたのですが)入選はできなかったのですが、参加賞としてマスキングテープ4個が送られてきました。研究所や検索ツールのロゴ(NINJAL、中納言など)がデザインされています。ちょっとうれしかったのですが、はて、これ何につかうもの?目隠し、目張りに使う?

国立国語研究所のマスキングテープ

 そんな時には、「Ok Google, マスキングテープはどのように使う」です。お見事!

 さらに納得!百円ショップへ行った時のこと。カラフルな様々な模様を印刷したマスキングテープが大量に売られていました。上記のとおり、小物やバックやスマホなどのデコレーション用として、今人気上昇中であることが分かりました。粘着性が高いのに、不要になった際に剥がしやすいのもよいらしいです。

市販されているマスキングテープ

 それでは、ということで、小生もiPhoneの裏に、国立国語研究所のマスキングテープで飾ってみました。ちょっと渋いですが、気分転換になりそうです。

iPhoneの裏に国立国語研究所のマスキングテープ

2020年10月8日木曜日

超小型AIカメラをコイン識別器にしてみる

【要旨】前回記事の続編です。雑誌を参考に、超小型AIカメラを(コーデイング無しで)コイン識別器にしてみました。AIの初歩的な体験ですが、いかがでしょうか。

独自画像を学習させたいが、そのデータは?
 前回記事は、このメーカーが提供する種々のアプリ(顔検出や手書き数字識別など)の紹介でした。今回は、独自画像を識別してみます。と言っても、なかなか題材がありませんが、手元に何種類かの外国コインがありました。それを使います。以下の5種類を対象とします。

学習用画像の準備
 この小型AIカメラで、5種類のコインそれぞれ40枚を撮影します。コインはそれぞれ8枚づつ用意しましたが、それを色々な角度から写して40枚にします。合計で200枚の画像です。そのうち、8割は学習用(training)に、残りの2割を検査用(validation)に用いることにします。

画像の学習
 
ここが最も重要なパートなのですが、このメーカーでは、規定に沿った画像を送ると、学習結果を返してくれるという、有り難いサービス(m5stack Training Service)を提供しています。すなわち、自分で何もコーディングせずに、学習済みモデルを入手できるのです。そればかりか、下図のように、学習状況(accuracyとlossのグラフ)も送り返してくれます。さらに、その学習モデルを動かすサンプルプログラム(マイクロPythonによる)も付けてくれます!これは、やってみるしかないです。


■これでコイン識別器のできあがり!
 あとは、送られてきたサンプルプログラムと、学習済みモデルをいっしょにマイクロSDカードに格納して、この超小型AIカメラに挿入するだけです。それを使ったテスト結果を以下に示します。学習時とは別のコインを使ったテストですが、例えば、10_Pfennigや20_EuroCentは0.98〜0.99のconfidenceで認識されました。

感想

 「具体的に自分でコーディングしないとAI技術を学ぶことにならない」というのも確かではあります。しかし、大学などの授業で、AIの考え方や基本技術を学ぶ前に(あるいは後でもいいですが)上記のような体験をすることは意味があるのではないかと思います。AIに馴染む、あるいは、その中味を知りたいという意欲をかき立てることに繋がるようにも思います。

 返送されてくるサンプルプログラムは、上図のように認識結果を表示するだけの非常に短い(40行程度の)ものです。Pythonを少し知っていれば、これを拡張(例えば音声を付けたり、第2候補を示したり)することも難しくないです。


2020年10月7日水曜日

AIチュートリアル:手旗信号(セマフォア)練習

【要旨】この記事は、Scratchを用いたAIアプリのチュートリアル[1]の紹介です。両腕を使った手旗信号(セマフォア信号)の発出練習をゲーム感覚で行います。ML4K(Machine Learning for Kids)[2]が提供しているのですが、レベルは"advanced"ですので、学生諸君にも参考になるでしょう。

作成するAIアプリの概要
 下図は、このAIアプリの使用手順です。"next"の矢印は、次の課題の出題を意味します。この例では、"K"の手旗信号のポーズを要求しています。あなたは両腕でそのポーズを取り、"ready"と叫んで下さい。すると、このアプリは、図中央にあるように、ポーズ認識結果としての線画と、正解のセマフォア画像を提示します。あなたは両者を比較して、自分のポーズが正解か否かを判断し、"yes"または"no"と叫びます。"yes"であれば、得点が加算されます。その後、自動的に"next"の状態になり次の出題を行います。

2つの学習モデルを使ったセマフォアのポーズの認識
 2つの学習モデルを使います。1つ目は、音声認識です。これにより、途中でPCに触れることなく、音声でアプリを制御でき、何回でもゲームを繰り返すことができます。2つ目は、両腕を使ったセマフォアのポーズを認識するためのものです。

(1)音声認識のための学習モデル
 発話によりゲームをコントロールします。上に述べた"ready"、"yes"、"no"を認識させるため、下図のように、それぞれ発話例を16回以上録音します。また、これとは別に環境音(周囲の雑音)も同程度収録します。その後、あるボタンを押すと学習が始まります。実際には、IBM Cloudのsoundサービスが起動されます。学習後は、3種類の発話は95%程度以上のconfidence(確かさ)で認識できるようになるはずです。


(2)ポーズ認識のための学習モデル
 ここでの「学習」とは、身体によるセマフォアの信号表現(画像)そのものの学習ではなく、「身体骨格」を学習するという意味です。つまり、身体画像のなかの左右の手首、肘、肩、膝などがどこにあるか(を示す座標)を認識するために、膨大な身体画像を学習させるという意味です。それは大変なコストを要しますので、ここではそれを実施せず、そのような目的の学習済みのモデルを利用します。下図は、それを利用して、左右両方の手首の位置(xy座標値)を得るためのScratchのブロックの利用例です。


(3)セマフォアのポーズが正しいかどうかの判断
 セマフォアのポーズにおいて、両手首や肘、肩の座標が分かれば、最初の図にある「認識結果」のような線画を描くことができます。この時、同時に正解の綺麗なセマフォア画像も表示しますので、自分で両者を比較し、このポーズが正しかったかどうか判断できます。それを"yes"または"no"の音声で答えると次の出題となります。"yes"であれば得点が加算されますので、練習の励みになります。

感想
 よく考えられた、受講者の興味を惹く優れたチュートリアルだと思います。ポーズの学習済みモデルを利用するので、相当に簡単になるとはいえ、それを使って、実際のセマフォアポーズを線画で表示するところは少し面倒かもしれません。しかし、3番目の図のように、ある程度のところまで、ブロックを提供していますので、敷居はかなり低くなっています。途中に提供されているブロックを削除して挑戦させれば、やや程度の高い問題となるでしょう。

参考資料
[1] 機械学習プロジェクト:Semaphores
https://machinelearningforkids.co.uk/#!/worksheets
https://github.com/IBM/taxinomitis-docs/raw/master/project-worksheets/pdf/worksheet-semaphores.pdf

[2] ML4K Teach a computer to play a game
https://machinelearningforkids.co.uk


2020年10月4日日曜日

AIにおけるフレーム問題や状況依存視点も知りたい

末尾に、【注1】【注2】を追記しました。
--------------------------------------------------------------------------------

AIのおけるフレーム問題など
 AI(人工知能)における「フレーム問題」は重要な未解決問題のひとつと言われている。この問題は、WikiPedia[1]によれば、「有限の情報処理能力しかないロボットには、現実に起こりうる問題全てに対処することができない」という問題だという。参考文献[2]等にも簡単な例をあげた解説がある。

 しかし、小生にはよく分からない。「知らないことはできないわけだから、知っている条件それぞれについて適切な処理を行い、知らない条件の場合は何もしないか、デフォルトの処理を行う。」これしかできないのではなかろうか。でも、これだけ話題になっているということは、もっと深遠な哲学的な難問であり、小生には素養がないだけのことかも知れない。それを少しでも補うつもりもあって、今回、下記のシンポジウムに参加した。

国立国語研究所 NINJALシンポジウム(対面+Webで開催)
「言語コミュニケーションの多様性」2020年10月3日
(1) 配慮の表現・行動から見るコミュニケーションの諸相(主に国語研の研究者による)
(2) 基調講演「AIと対話」(中島秀之 札幌市立大学学長)

 新型コロナウィルスの影響で、ここでの研究集会等も、長らく全てWeb開催であったが、今回、人数限定の現地対面での開催となった。なお、オンラインでも同時開催しており、質問などは、zoomを介して開場で流されていた。

 講演のうち、(1)では5件の研究発表があった。これらは、「対人配慮」という、相手に対する心的・社会的距離のとりいれ方がコミュニケーションにおいてどのように影響しているか、また、その歴史的経過も踏まえて深く入り込んだものであり、たいへん勉強になった。

 基調講演が本記事の対象である。著名なAI学者である中島秀之氏によるものであり、「TensorFlow (keras)による深層学習実践」といった技術論とは全く別の観点からの、「人工知能の根源を考える」といった趣のお話であった。

国立国語研究所(立川市)
初期の南極観測で活躍したカラフト犬たちのモニュメント
(隣接する国立極地研究所の庭にて)

中島秀之氏の講演より
 講演内容をここで正確に伝えることはとてもできない。上記の「AIにおけるフレーム問題」にも触れられていたが、小生の理解力不足もあり、疑問(モヤモヤ)が晴れたわけではない。しかしながら、この講演には優れた観点や考え方が多数示されて、非常に有用であった。以下には、そのうちのごく僅かを掲載させていただく。もちろん、小生の誤解があるかも知れないが、ご容赦いただきたい。

(a) 知能と常識
 「知能」とは、「情報が不足した状況で、適切に判断して処理できる能力」のこと。「常識」は、人間が身体をもってこれまでの生活体験をとおして獲得したものである。ロボットにはそれはできない。できたように見えても、それは人間の常識とはちがうものになっているはず。

(b) 状況依存視点のちがい
 端的に言うと、英語は「鳥の視点」、すなわち外から(上から)の視点に立つ場合が多い。逆に日本語は「虫の視点」、すなわち内から(中から)の視点に立つ傾向がある。その面白い対比例は以下の「雪国」(川端康成著)の冒頭に現れる。

【和文原文】国境の長いトンネルを抜けると雪国であった。
【英語訳文】The train came out of the long tunnel into the snow country.
(↑著名な日本文学研究者エドワード・サイデンスデッカーによる英訳)

 これを、日本語と英語をそれぞれ母国語とする人に見せて、イメージを描いてもらうと下図のようになるという。(この図は、当日発表スライドを見たあとで小生が描画したものである。)


 この類いの、視点の違いの例は他にも沢山あるという。「鳥の視点」にたつと、状況(システムの状況)を全部言わないと行けないが、「虫の視点」に立つと(内部にいるのだから)全部は言わなくてもよい。全部は言わないゆえに、日本語は「あいまい」だと指摘される場合があるが、それは正しい主張とは思われない。

 フレーム問題は、「鳥の視点」に立つ以上、避けられないのか?(by FoYo)

-----------------------------------------------------------
【注1】上記和文原文を、現代の自動翻訳器にかけた結果を以下に示します。いずれも、サイデンスデッカー訳とは異なり、英語特有の「鳥の視点」の立場を取らずに、和文をそのまま「直訳」しているように思います。それも興味深い点です。ロボットは人間にはなれない。
●Google Translate:
  After passing through a long tunnel on the border, it was a snowy country.
●Amazon Translate:
  Through the long tunnel of the border was a snowy country.
●Microsoft Translate:
  It was a snowy country through a long tunnel on the border.
●IBM Watson Language Translate:
  After exiting the long tunnel of the border, there was a snowy country.
----------------------------------------------------------
【注2】上記の和文原文とサイデンスデッカー英訳との対比については、参考資料[3]にも興味深い論考がある。
----------------------------------------------------------

参考資料
[1] フレーム問題(wikipedia)https://ja.wikipedia.org/wiki/%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E5%95%8F%E9%A1%8C
[2] 人工知能の話題-フレーム問題(人工知能学会)
https://www.ai-gakkai.or.jp/whatsai/AItopics1.html
[3] 松野町夫:リベラル21
http://lib21.blog96.fc2.com/blog-entry-357.html

2020年9月23日水曜日

指先に載るAIカメラ

念のため、末尾に(注1)(注2)(注3)を追記しました。)
→続編はこちらにあります。

  掌どころか指先に載ってしまう、この小さなカメラですが、AI(人工知能)のためのニューラルネットワークプロセッサ(CNNやFFTアクセラレータを含む)を搭載しているとのことですから驚きます。日経ソフトウェア最新号(2020年11月号)に紹介記事が出ています。M5StickVという製品ですが、注目度が高く品薄のようです。ようやく、秋葉原の店の通販で、3,500円で購入できました。

AIネットワークプロセッサ搭載の超小型カメラ(レンズは背面)

    初期状態で搭載されているのは、顔検出アプリです。人の顔の膨大なデータを使った学習は既に終了していて、その学習結果を使って、顔をリアルタイムに検出するものです。さっそく試してみました。首相官邸のホームページに、新内閣の閣僚が並んだ写真が載っています。検出結果の一例を以下の図に示します。管総理と麻生副総理のお顔が検出され白い枠線で囲まれています。ベリーグッド。見せますね。

管総理と麻生副総理(首相官邸ホームページの写真からの顔検出)

    これ以外にも、学習済みデータはいくつか用意されています。例えば、有名な手書き数字認識(MNIST)のための学習済データ(モデル)も提供されています。これを利用して、自分で紙に描いた数字をリアルタイムに認識させるには、[入力画像前処理]+[forward計算]+[表示処理]の合計で、マイクロPythonプログラム約25行だけ書けばよいのです。すなわち、学習過程のプログラムは書きませんが、認識するためのプログラムは高レベルで小さく作れますので、AIの初歩の勉強にもなります。こんなに小さな安価なデバイスで、それができるは素晴らしいと思います。

手書き数字「5」を認識した状態(confidence = 0.829)
    
 もうひとつ行ってみます。Brownie 1000というアプリも公開されています。何かものを撮影した場合、1000種のラベルのどれに該当するかを、音声で答えてくれます。以下の例では、犬のぬいぐるみを撮影したところ、日本語で、「いぬです」と返って来ました。なかなかです。

「犬です」と音声で応答(Brownie 1000による)

 以上のような既存のアプリや、提供されている学習済のデータ(モデル)では物足りなくなった場合は、ちゃんとそれに応えてくれます。例えば、自分で多種類のコインを多数持っていて、コインを識別させたいとします。その場合は、種類毎にコインの画像(各ラベル毎に35枚以上)を用意して、指定のwebサイトへ送れば、その学習結果を送り返してくれるサービスもやっています。上記の手書き数字の場合と同様に、返送されてくる学習結果を利用して認識(識別)用の短いプログラムを作れば良いのです。実用性はあまりないかと思いますが、AIの勉強にはとてもよいデバイスではないでしょうか。

(注1)ここで利用する学習済みモデルは、kmodelという形式です。しかし、Google ColabやAnacondaで別途学習させてできるモデル(h5 keras)をkmodelに変換するツールもあります。したがって、中級から上級の人にとっても、このデバイスは色々と使い道があるかもしれませんね。

(注2)ただし、このデバイス、まだ不安定な動作をする場合もあり、色々と調査して対処する必要が生じるかも知れません。実際、小生の経験では、最新のファームウェアに書き換えた場合、上記のいずれの例も不具合が起こるため、少し古いファームウェアにダウングレードしました。

(注3)残念ながら、通信機能(WiFiなど)は搭載されていません。他のデバイスと連結させて何とか通信できないこともないようですが、WiFi機能搭載のM5StickV+はすでに開発済とのことですから、その国内発売を期待したいと思います。

2020年9月15日火曜日

Voice Calculator: well-crafted AI tutorial

Japanese (Summary)
  MIT App Inventorの高校生向けAIチュートリアル6例目として、「Voice Calculator」が追加されました。これは、音声入力「3.14掛ける8はいくら?」や「では、12の3.5倍は?」等々に対して、計算結果を音声で答えます。初歩的とはいえ、自分なりのミニ「Siri」やミニ「OK Google!」もどきなので、受講生の興味を惹くのではと思います。実際にやってみると、"こんなに簡単に!?"と思うはずです。それは、第一にApp Inventor自体の優秀さ、第二に(皆様方の実験の準備などと同じく)適切な手引きが周到に準備されているからです。そして、このアプリは一つの雛形に過ぎないので、自分でいろいろと拡張・発展を考えるよう促しています。そこがひとつ重要なのだと思います。高校生向け講座や、大学低学年のAI導入の参考になるかも知れません。大人でも、スマホで楽しめます!この優れたチュートリアルに、私が補足すべきことはないのですが、この記事では、日本語版にする場合の留意点(文字単位の検査か、あるいは正規表現利用か)を中心に書きましたので、ご参考になれば幸いです。

Creating your very first own voice calculator

    This time, a new tutorial Voice Calculator [1], mainly for high school students, has been added to the "Artificial Intelligence with MIT App Inventor" [2]. It executes basic arithmetic operations given by voice. Although it is a rudimentary application, it is a challenging task because commands are given in natural language. For example, for multiplication, various utterances as shown in Fig. 1 is allowed. Addressing these challenges will help us to understand how Alexa and Siri, which are commonly used on smartphones, understand human speech, and respond appropriately.


Fig.1 Acceptable utterance examples for multiplication

    This project makes use of speech recognition and text processing blocks built into App Inventor. And, the calculation result is responded with a synthetic voice. The explanation of the creation procedure is meticulously assembled and easy to understand. You will be given appropriate hints along the way, so you will be able to complete an app like Fig. 2 without frustration.

Fig.2 Voice Calculator made with MIT App Inventor


    I don't need to add anything to this excellent tutorial. However, there are some things to consider when creating this project in Japanese, so I will show it below.

Extracting numerical values from the uttered text

(1) Splitting at spaces
    Fig. 3 shows an example in which the utterance related to multiplication is converted into text by voice recognition. Note that in the English version numbers are separated by spaces, but in the Japanese version there are no such spaces. In the English version, you can extract numerical values (two in this case) by paying attention to space and using App Inventor's text processing "split at spaces" and "is number?" as shown in Fig.4. However, this method cannot be applied to the Japanese version because there is no such white space. 

Fig.3 Resulting text from speech recognition 


Fig.4 Extracting numbers by splitting at spaces

(2) Character by character inspection in the Japanese version
    In the Japanese version, an alternative method is required such as shown in Fig.5. Here, you need to scan the text character by character to see if it's a number or a period. This seems somewhat complicated but will be useful for beginners to practice string manipulation.

Fig.5 Extracting numbers by examining each character

(3) Using Regular Expressions
    Alternatively, you can use a regular expression search. For real numbers, give the regular expression pattern "[\d.]+" or "[0-9.]+". The simplest way is to use regular expression extension such as [3]. Fig. 6 shows an example of its use.

Fig.6 Extracting numbers using a regular expression extension

    You can also write a short JavaScript program as another way to use regular expressions. Fig.7  illustrates it. A good tutorial on calling JavaScript programs from MIT App Inventor can be found in reference [4].

Fig.7 Extracting numbers with regular expressions in JavaScript

    By the way, recently, the format of the file path given to the WebViewer URL has changed. That is, as shown in Fig.7, specify "http://localhost/..." as the file path for both debug execution and production execution. Please see Evan's posts [5][6] and related post [7] for more details.

Notice

    It has also been shown that recently developed new Text Blocks can be used effectively. For example, as shown in Fig. 8, not only "contains" but also "contains any" and "contains all" are very useful when determining whether the utterance is intended for multiplication.

Fig.8 An example of newly developed Text Block


References

[1] Voice Calculator
http://appinventor.mit.edu/explore/resources/ai/voice-calculator

[2] Artificial Intelligence with MIT App Inventor
http://appinventor.mit.edu/explore/ai-with-mit-app-inventor

[3] Regular expression extension (by kevinkun)
https://community.thunkable.com/t/regular-expression-extension/3657

[4] WebView Javascript Processor for App Inventor
https://appinventor.mit.edu/explore/ai2/webview-javascript

[5] App Inventor nb185 is live
https://community.appinventor.mit.edu/t/app-inventor-nb185-is-live/15563

[6] File Path Updates Starting with Android 10, Aug 8, 2020 evan's Blog
http://appinventor.mit.edu/blogs/evan/2020/08/08/file-path-updates-android-10

[7] How to call a simple Javascript function
https://community.appinventor.mit.edu/t/how-to-call-a-simple-javascript-function/15698