2021年5月3日月曜日

小学校で習う「平均」されど「平均」(揺れる平均値)

 【what is this】前回の記事の簡略化バンディット問題では、各ボタンBnが発する乱数(符号付き実数)は、平均Mnで標準偏差1の正規分布としました。このMnは、1ゲーム(1エピソード)中は変わりませんが、操作者には知らせていません。今回は、このMnが(雑音が入るように)ある程度変動する場合を扱います。この条件下で、ある与えられた回数だけ、いずれかのボタンを押して、得られる合計点をできるだけ高くしたい、という問題です。

■設定平均値が変動する場合の正規分布乱数
 ボタンnが発する乱数は、前回と同様に、平均Mnで標準偏差1の正規分布とします。前回は、このMnは、1ゲーム(1エピソード)中は変わりませんでしたが、今回は、変動します。すなわち、今回はゲーム中に、Mnに、平均0で標準偏差sd(例えば、sd = 0.01)の正規分布の雑音が加算されます。現実の世界では、こういうケースの方が一般的です。
 図1は、あるボタンを1万回押した場合に発生した乱数の分布例です。図1(a)は前回のとおり(設定)平均値が固定の場合、図1(b)は変動する場合であり、平均には、平均0で標準偏差0.01という正規分布乱数が毎回加算されていきます。図のとおり、両者には一定の差異が生じます。



■設定平均値が変動する場合の解法の戦略
 どのボタンを選ぶべきかという行動のポリシーは、前回と同じε-greedyです(最適値としてε = 0.1を設定しています)。その「活用」フェーズでは、その時点で得られている各ボタンの乱数情報から、推定平均が最も高いボタンを選択してきました。しかし、上記図1(b)のように、毎回設定平均値が変動する場合は、必ずしもそれがうまく働かないようです。詳細は参考文献[1]を参照戴きたいのですが、「新しいパラメータαを用いた、推定平均値のような新たな量」を定義し、それが最大のボタンを選択していく戦略があります。それを「非定常状態対応戦略」としておきます。

 図2にはその戦略による評価結果を示してあります。詳細は図の右側の説明をご覧下さい。この新しい戦略で、前回の「推定平均値を求める戦略」よりも良い結果が得られています。


[参考文献]
[1] 中井悦司:ITエンジニアのための強化学習理論入門、技術評論社、2020年7月

2021年5月1日土曜日

小学校で習う「平均」されど「平均」(基本編)

【what is this】日常生活にも多く出現する「平均」は、小学校高学年の算数で習います。それは、AIの重要分野である強化学習(Reinforcement Learning)においても不可欠です。実際、強化学習の書籍[1][2]でもそのように扱われています。そこで、本記事では書籍[1]を参考にさせていただき、改めて「平均」をプログラミングしながら再考したいと思います。
(→続編はこちらです)

■簡略化した多腕バンディット問題
 ここでは、簡略化したバンディット問題を扱います。具体的には、6個のボタンがあり、それを押すと、それぞれ乱数で得点が得られます。各ボタンBnが発する乱数(符号付き実数)は、平均Mnで標準偏差1の正規分布になっています。ただし、操作者は、それらの平均値Mnを知りません。この条件下で、ある与えられた回数だけ、いずれかのボタンを押して、それらからの合計点をできるだけ高くしたい、という問題です。
 図1には、合計で2,000回、全くランダムにボタンを選んで押した場合の乱数の分布を一例として示しました。(どのボタンでも、設定平均値と実際に発生した乱数の平均値はぼぼ合致しています。)


■ε-greedyポリシーに基づくボタンの選択
 この問題に対する戦略として、「ε-greedyポリシー」があります。与えられた回数の範囲で、各ボタンの平均値Mnを推定しながら進めます。とにかく、ボタンが選択される毎に、そのボタンの乱数の推定平均値は正確な値に近づくはずです。しかし、いつまでも広く異なるボタンを選択し続けると、(回数の制約上)高い推定平均値のボタンを選択する機会が減り、総合得点が高くなりません。逆に、ある時点での推定平均値の高いボタンを固定的に押し続けると、他により好ましいボタンがあってもそれを活用できません。そのバランスを取るために、パラメータεを導入します。ボタン選択にあたって、乱数p(0.0 < p <1.0)を発生させて、

(1) p < εならば、ランダムにボタンを選択する。
(2) p >= εならば、この時点での推定平均値が最大のボタンを選択する。

 この戦略で、ε = 1.0, 0.5, 0.1について、それぞれ200回(=1エピソード)ボタンを選択した場合の総得点の比較を、図2に示します。乱数を使っているため、常にこのとおりとはなりませんが、多くの場合、図2のように、ε = 0.1の場合が最適になります。すなわち、その時点の推定平均値が最大のボタンを選ぶことを基本とするが、10回に1回程度は、ランダムにボタンを選ぶのが最適だということです。



■グリッドサーチで、パラメータε の最適値を求める
 上に述べた「ε = 0.1が最適」というのは、各ボタンの元々の設定平均値が変わった場合でも成り立つでしょうか。それを確認するため、ε = 0.0〜1.0の範囲の11刻みで、設定平均値を変えてそれぞれ1,000エピソード(=1,000 x 200回)実行させた(グリッドサーチ)結果を図3に示します。ここでは、中央値を「箱ひげ図」で比較しましたが、統計学的に予想どおりの結果となりました。




 この図によれば、ε = 0.0、すなわち、常にその時点での推定平均値が最大のボタンを選択するのもかなり良い。しかし、とくに初期段階では最大値を与えるボタンが変動しやすいので、その最大値はあまりあてにならない。そのため、一定の間隔で、それをご破算にして、あらたに最大値を求めた方がよいということでしょう。

■ボタンの選択状況をさらに詳しく分析する
 ここまでで、本記事は一応終わりなのですが、上記のパラメータε= 1.0, 0.5, 0.1の場合それぞれで、どのようにボタンが選択されたのかを、さらに詳しく確認したいと思います。以下は、図2の実行時の分析です。プログラミングの観点からも、下図のような作図は有用と考えました。

 ε= 1.0の場合は、推定平均値のより高いボタンがないかを探索しすぎたため、好ましいボタン1を選択(活用)する機会を失ったと言える。これに対して、ε= 0.1の場合は、開始直後は他のボタンの推定平均値の方が高かったが、途中からボタン1の方が有利になり、ほぼその選択を維持できたのが勝因と言えます。


   

■感想
 本記事は、ほとんど「平均値を推定する」という話題につきますが、状況を徹底的に調べることで理解が深まると感じました。その際のプログラミングは、言語はどれでも良いのですが、今回は、PythonのListやDictionary、それとPandasのplot機能を有効に活用できたと思います。

[参考文献]
[1] 中井悦司:ITエンジニアのための強化学習理論入門、技術評論社、2020年7月
[2] 曽我部東馬:強化学習アルゴリズム入門、オーム社、2019年5月

2021年4月29日木曜日

ゴールデンウィークだが、家で山の景色を楽しむ

今年も、5月のゴールデンウィークが始まりました。本来であれば、山へでも出かけたいところですが、このコロナ禍では、遠くへの旅行もかないません。しばし、家にいて、自作のAndroidアプリで懐かしい山の姿を(ほぼリアルタイムに)見て、気を紛らわせています。本日(4月29日)は、こちらはあいにくの雨模様ですが、北海道北部は晴れ渡っているようです。そこへ行って、空気を吸いたい。

利尻島-沓形から(残雪が美しい)

対岸の礼文島から(雲や霧が多いので、頂上まで見えるのは希)


2021年4月24日土曜日

国立国語研究所 学術情報リポジトリに論文が登録されました

以前のブログ記事にも書きましたが、国立国語研究所の「言語資源活用ワークショップ2020」で発表した以下の論文が、同所学術情報リポジトリに登録され,DOIが付与されました。(ワークショップ講演論文集全体がリポジトリに登録された結果、そうなったにすぎませんが。)

山本富士男:植物に関する自由形式説明文からのJSON形式テキストの自動生成

https://repository.ninjal.ac.jp/records/3167

(info:doi/10.15084/00003151)

小生は元々、コンピュータソフトウェアなどを専門としてきましたが、近年の自然言語処理(特に機械学習を用いた)に興味を持ち、基本的な事項を学んできました。本論文は、その過程で得た知見に基づいて纏めたひとつの拙論ですが、これを機にさらに深めて行きたいと考えています。


2021年4月17日土曜日

口形から「あ/い/う/え/お/閉」を識別(補足)

先の記事の補足です。

「あ、い、う、え、お、X」の6種類の口形が、awbとcwaという2つの特徴量によって、かなり明確に分離できるという実験結果を先に示しました。今回は、これをより明確にリアルタイムに確認するために、アプリを若干改訂しました。詳しくは、下図の中の説明文をご覧下さい。

(1)上段のボタンを押す、(2)「続行」を押す、(3)その母音を発話、(4)自動プロット

(注)本件は、母音の単独の口形を識別するものであり、単語の発話での連続口形の認識について述べたものではありません。

2021年4月12日月曜日

ML4K(Machine Learning for Kids)で学習済みモデルを利用

  【what is this】ML4K(Machine Learning for Kids)は、機械学習を利用したアプリケーションの作成を容易にするものです。このブログでもいくつかご紹介してきました。今回は、その後のさらなる発展状況の短いサーベイです。

■Kidsは大学生も含む?ので、遠慮なく使おう!
 ML4KのKidsというのは、小学校低学年くらいと思っていました。しかし、ちょっとレベルが高いのでは?という内容も含まれています。では、Kidsって、何歳までなのか?調べて見ると、実は一般に、子供、若者、初心者の意味で使われており、親しみを込めて(あるいは少し見下げて)若者を指すらしい。もちろん、大学生も含むようです。実際に、"英辞郎on the web Pro"には、以下のような例文もありました。

    He is still acting like a college kid. ->あの子は行動がまだ大学生のようですね。
    too expensive for college kids ->学生には高過ぎる
    As kids reach high school, college, and so on ->高校、大学、社会人と成長するにつれ

 ですから、大学生も、自分に必要なAIアプリを簡単に作りたい場合は、遠慮なく利用してはどうでしょうか。それで研究が促進できれば素晴らしいです。

■ML4Kで使えるScratch3用のAI拡張機能(学習済みモデル)
 ML4Kは、もともと、IBM WatsonのAI機能をラップして使えるようにしていました。最近はさらに進化して、図1に示すように、色々なAI関連の学習済みモデルをScratch3で使えるようにしています。すなわち、顔や手や身体の状態と動作を認識するFace, Hand, Pose detectionなどが含まれます。
 また、自然言語処理分野では、Toxicity(好ましくない、不適切な表現)の認識などもあります。さらに、Pythonをある程度できる人は、TensorFlowを使った自分用のモデルを作成してここで使えるようにもできます。Pythonを使わなくても、GoogleのTeachable Machineで非常に簡単に独自モデルを作成することも含まれています。


■Hand detectionを使って指の折り方で数値を認識する
 上記のように、利用できる学習済みモデルは多いのですが、ここでは、「Hand detectionを使って指の折り方で数値を認識」をやってみます。実は、この課題は、Media Pipe Handsを利用してPythonでやったものです。それと同じことを、ML4Kの使い勝手を確認するために行いました。ただし、Pythonの場合は、0〜31まででしたが、今回は簡単にして、0, 1, 2だけにしてあります。もちろん、31までやることも可能ですが。
 図2は、これを実現したScratch3プログラムの主要部です。学習と予測(認識)の両方が含まれています。

 学習に必要なラベル付きデータは図3のようなものです。内容は、親指の先端と付け根、人差し指の先端と付け根などのポイントの座標値の組を収集したものになっています。例えば、親指だけを折った場合は、ボタン"1"を押すことで、図2のプログラム中のラベル1に対するブロックが反応して、図3のラベル"1"の枠に、その時点の指の座標値が自動的に格納されます。このように各ラベルのデータが揃ったところで、あるボタンを押すと(自動的に IBM Watsonが働き)学習が行われます。

 学習が済んだ後に、改めてカメラに向かって指を折り、図1の「予測(認識)」ブロックを起動させます。すると、図4に示すような認識結果がえられました。図では、"1"と"2"がそれぞれ正しく認識されています。



■感想 
 AIの教育を支える環境は種々あると思いますが、このML4Kは、大学生レベルの人にも、すばやく自分のアイディアを実現するプロトタイピングに大いに役立つのではないでしょうか。その後、本格的な課題に取り組む場合は、ここでの経験が生きるはずです。また、低学年のAI教育において、少しでも各自のアイディアを取り入れた演習をしやすくなるように思われます。

2021年4月7日水曜日

Identify the position from the key point number in Facemesh

This article is a sequel to "Using the MIT App Inventor Facemesh Extension". In Facemesh, the key points of the face are numbered from 1 to 450, and the map that associates the number with the position in the face is provided by Google on GitHub. However, at present, this map does not show the correct position in the face (probably due to version upgrade). Therefore, I made a tool to get the correspondence between the number and the actual position.

Most desirable is to get that number by touching a Facemesh key point. However, there are 450 points in total, including dense parts, so even if it is enlarged, it is difficult to operate it on the screen of the smartphone. Therefore, as a second method, I decided to search for the necessary key points while increasing or decreasing the number. In this case, a partial map that is already known (like the handwritten map in Fig. 1) is useful.

In the Fig.1, start from the specified value (255 in the figure), and increase or decrease the number with the "+" and "-" buttons. This makes it easy to search around 255, for example. In this example, the red dot for number 256 is clearly visible among the green keypoints. This app also uses the Facemesh extension from MIT App Inventor. Fig.2 shows the main parts of the program. I won't explain it in detail, but it's fairly easy to make because it uses Ball, which is an animation function of App Inventor.

In fact, in the "mask wearing" shown in the previous task [Exercise-1], the key points that form the periphery of the mask were acquired by the above method.

2021年4月5日月曜日

口形から「あ/い/う/え/お/閉」を識別

 【what is this】MIT App Inventor のExtension利用の続編です。今回は、口形から、「あ/い/う/え/お/閉」を識別することを試みました。口の周りを含む、顔の多数のキーポイントがリアルタイムに得られるので、口形パタンの画像をdeep learningさせることなく、簡単な計算で識別します。

■[Exercise-4] 顔のキーポイントを利用して口形から「あ/い/う/え/お/閉」を識別
 これは、前回記事に続く、練習問題です。スマホで撮影した顔から口形を認識して、それが、「あ/い/う/え/お/閉」のいずれであるかを、リアルタイムに識別するアプリを作成しましょう。

 図1の上段は、これらの母音を発話した時の顔のキーポイント(全450点)の状況です。一方、その下段は、口の周りの6点だけで口形を扱うために考えたフレームモデルです。どの発話なのかを判断するために、このフレームから、ある2つの特徴量(awb, cwa)を定義します。これらの特徴量は、口の開き具合や角度を反映するように、簡単な計算で決めました。



 各発話について、32回の試行を行い、これら2つの特徴量(awb, cwa)の相関を示したものが図2です。この結果から、6種類の口形が、余裕をもって、分類(分離)できることが分かりました。また、「あ」と「え」は比較的近いことが分かります。実感と合致します。一方、「う」と「閉」は、フレームでは似ていますが、図2によればかなり明確に分離されているのが面白い。


 それならば、ということで、これらの口形をリアルタイムに認識するデモアプリを作成しました。下図は、「あ-え-い-お-う-い-閉」の順に発話した場合です。ほぼ良好に6種の口形を識別できているようです。



 むやみに、画像を沢山用意して、それをdeep learningさせる前に、ちょって待て。何とか特徴量を見つけて、それらの関係を観察し、それに基づく簡単なプログラムで識別できる場合もある。今回は、そのような一例のように思います。

2021年4月2日金曜日

MIT App Inventorの公式Twitterで紹介されました

 MIT App Inventorで公開されたFacemesh Extension(顔認識用の拡張機能)を使って書いたこの記事ですが、App Inventor公式Twitterでご紹介いただきました。(2021年4月1日)


2021年3月30日火曜日

MIT App Inventorで顔認識学習モデルFacemeshを

 【what is this】MIT App Inventor のExtensionとして、Googleの顔認識(主要450点)学習モデルFacemeshが利用できるようになりました[1][2]。これにより、顔認識関係のスマホアプリがさらに作りやすくなりました。さっそく、簡単なアプリ3つを作ってみましょう。

■[Exercise-1] 顔の向きを考慮して、口の開閉でスイッチOn/Off
 これは、前のブログ記事で取り上げた例題です。その際は、PythonからFacemeshに関するAPIを利用して作りました。今回は、これと同じことを、MIT App Inventor のExtensionを利用して行います。

 解答例は、Fig.1 のようなApp Inventorプログラムです。これがソースプログラムの全てですから、「こんなに簡単に!?」と思う人も多いでしょう。プログラムは読みやすく、そのロジックも明解そのものです。
 図にはコメントがありますので、説明は特に必要ないと思います。口の開閉を上下の唇中央点のy座標の差分で、顔の向きを鼻筋2点のx座標の差分で検出していることにご注目下さい。それらが、ブロック(when...FaceUpdated)に纏められ、顔や口が動いた場合にリアルタイムに起動される仕組みです。


 簡単な拡張として、以下のように、マスクを付けたり外したりもやってみましょう。

■
[
Exercise-2] - 顔の動きで、"はい", "いいえ", "どっちかな"を識別
 上の[Ecercise-1]では、顔の現時点の特定の「状態」を検出しました。一方、顔の「連続した動き」を得たい場合もあります。例えば、「うなずく」「顔を横に振る」「顔を傾ける」などです。これらを検出するには、顔の揺れた方向(上下、左右、斜め)、および、その振幅を得る必要があるでしょう。このような処理も、同様にApp Inventor(Facemesh extension付き)の世界でできます。その実現例を下図に示します。以下の3つの振幅を正規化して、そのうち、最も大きい値を与えた動作を検出します。

●Yes:うなずき(はい)→ 鼻の頂点の上下(y軸方向)の変動
●No:いやいや(いいえ)→ 鼻の頂点の左右(x軸方向)の変動
●N/A:どうかな(?)→ 額の上の2点間の線分とx軸がなす角度の変動




■[Exercise-3] - 発話時の口形面積の変化を可視化して楽しむ
 MIT App Inventorの強みのひとつは、GUIとの連携の容易さです。Fig.4 に示すこの練習問題も、それを生かしたアプリの作成です。Facemeshでは、顔の主要450点を検出できるのですが、ここでは、口(くち)回りの4点だけ使います。The simpler the better. この菱形の口の面積の推移(青い線)とその変化率(赤い線)をグラフにします。口の動きとその波形を見て楽しむ練習問題です。遊びが何らかのヒントを与えることもあり得る。

 このような口(くち)パクから、例えば、"イノシシ" / "トラ"、あるいは"apple" / "orange"をきちんと区別する課題に取り組む場合には、さらに面積変化の加速度の波形が必要かもしれない。そのような波形(またはその周波数解析結果)を、発話種類ごとに数百件用意して、それらを学習させることになるでしょう。
 なお、身体の動きの加速度の周波数解析に関しては、参考文献[3]に丁寧な解説があり有用です。また、口の動きを入力とする機械読唇に関しては、参考文献[4]に基本事項と手法が詳しく叙述されています。

■感想
 今回のMIT App Inventor Extension for Facemeshによって、顔認識関係スマホアプリの開発がかなり容易になります。[Exercise-2]では、App InventorのBallコンポーネントを使っており、タッチ、ドラッグなどによるインタラクションも可能です。他にも、Facemeshと連携できる場面がありそうです。MIT App inventor leads us to a new frontier in smartphone programming.

References
[1] Artificial Intelligence with MIT App Inventor, http://appinventor.mit.edu/explore/ai-with-mit-app-inventor
[2] Facemesh Filter Camera, http://appinventor.mit.edu/explore/resources/ai/facemesh

[3] 田中博、五百蔵重典:IoT時代のデータ処理の基本と実践、コロナ社刊、2018年3月(特に、第5章フーリエ解析)
[4] 宮崎 剛、中島豊四郎:[推薦論文]日本語の発話映像における初口形の検出方法提案、情報処理学会論文誌、Vol.53、No.3、pp.1472-1479、2012.