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.