元生技データサイエンティストのメモ帳

勉強したことの備忘録とか雑記とか

小型無人機(ドローン等)の飛行ルール(G検定対策)

f:id:sue124:20210709141705p:plain

こんにちは、sue124です。
久しぶりの更新です。

今G検定の勉強中で練習問題を見ているとたまにドローンの飛行のルールについて出題されることがあったので、昔某ベンチャーでドローン開発に携わっていた時に調べたことを思い出しながら、行政が定めるドローンの飛行に関するルールをまとめていきたいと思います。

1. はじめに

ドローンを飛ばすための手続きについて、まずはざっくりとポイントをまとめます。

  • 国土交通省が「飛行が制限されるエリア/行為」(申請して許可されれば飛ばせる)と「飛行が禁止されるエリア/行為」を定めている
    (試験問題になることがあるので、ここを次項で詳しく説明します)
  • 国土交通省のルールに追加して、地方自治体等が定めるローカルルールがある
     (〇〇公園はドローン飛行禁止、〇〇号線は○月○日に聖火リレーが行われるので飛行禁止、など。
      おそらくここが試験問題になることはないので、今回は省略します)

2. 国土交通省が定めるドローン飛行ルール

2-1. 飛行ルールの対象となる機体

国交省のサイトで以下のように定められています。

遠隔操作又は自動操縦により飛行させることができるもの(200g未満の重量(機体本体の重量とバッテリーの重量の合計)のものを除く)

www.mlit.go.jp

2-2. 飛行の許可が必要な空域、行為と飛行禁止空域、禁止行為

国交省の以下のサイトから引用しながら解説します。

www.mlit.go.jp

まずは「空域」に関して。
以下の図のように、3つに分類できます。

  • 安全性を確保し、許可を受けた場合は飛行可能
    (A)空港等の周辺(進入面等※)の上空の空域
    (C)150m以上の高さの空域
    (D)国土地理院の「地理院地図」で人口集中地区となっている地区の上空
  • 原則飛行禁止
    (B)緊急用務空域
  • 許可不要
    (A)〜(D)以外の空域

f:id:sue124:20210709133541p:plain

※空港の進入面は空港ごとに定められており、以下のサイトで確認できます。

www.mlit.go.jp

例えば関東近郊の地図を見ると、羽田空港や成田空港などなどの空港、飛行場の進入面が赤線で示されていることを確認できます。

f:id:sue124:20210709134429p:plain

続いて「行為」に関してです。
<遵守行為>
行為に関しては、以下が遵守すべき行為として定められています。
(申請しても免除されることがないものです)

  • アルコール又は薬物等の影響下で飛行させないこと
  • 飛行前確認を行うこと
  • 航空機又は他の無人航空機との衝突を予防するよう飛行させること
  • 他人に迷惑を及ぼすような方法で飛行させないこと

f:id:sue124:20210709135050p:plain

<事前承認が必要な行為>
また以下の行為を伴う飛行は、「事前の承認」が必要です。

  • 夜間飛行
  • 目視外飛行
  • 人(第三者)又は物件(第三者の建物、自動車など)との間が30m未満となる飛行
  • イベント上空の飛行
  • 危険物輸送
  • 物件投下

f:id:sue124:20210709135108p:plain

※余談
私は以前、某ベンチャーで「農薬を散布するドローン」の開発に携わっていたのですが、「農薬散布」は上記の「危険物輸送」と「物件投下」に該当するので、その申請をしていました。

https://www.mlit.go.jp/common/001218251.pdf

2-3. 申請先

前項で「許可、承認」が必要な飛行をする場合の申請先は、以下の通りとなります。

空港等の周辺又は地上等から150m以上の高さの空域における飛行の許可の申請(法第132条第1号の空域における許可申請): 空港事務所長 それ以外の許可・承認申請: 地方航空局長

www.mlit.go.jp

2-4. 飛行計画の登録

令和元年7月26日から、許可、承認を受けた飛行を行う前に、「飛行情報共有システム」で他の無人飛行機の飛行予定の確認と、自分の飛行情報の登録が必要となりました。

www.mlit.go.jp

3. さいごに

本記事執筆時点で国土交通省が定めている主だった飛行ルールをまとめてみました。
これからG検定を受ける人の参考になれば幸いです。
※ドローン自体がまだ発展途上の技術であり、技術の変化等に合わせてこのルールが変更される可能性があるので、実際に飛行させる場合は最新のルールを参照するようお願いします。

Azure AI Days Day2 まとめ(基調講演、MS社 自然言語処理技術 最新の動向)

f:id:sue124:20210519221701p:plain

こんにちは。sue124です。

5月20日の Azure AI Days の Day2 に出席したので、備忘録的に内容をまとめたいと思います。
長くなったので、まずは基調講演の分だけ。

Day1がビジネスリーダー向けセッションで、ノーコード、ローコードでの開発の話が多かったのに対して、2日目はデータサイエンティスト向けセッションで、技術的に突っ込んだ話が多かったです。
技術的な難しさと、参加してからブログに書くまで日が空いてしまったので、書くのに苦労しました。

実施されたSessionは、Microsoftの以下のページをご参照ください。

www.microsoft.com

1. 基調講演(MicrosoftNLP 最新動向)

Day2の基調講演は、Microsoft が取り組んでいる「自然言語処理 (NLP)」についての話でした。
細かく分けると、以下の3つのパートがありました。

  • Microsoft が取り組む NLP モデル開発
  • Bing における検索技術
  • 会話できるAI(りんな)開発

細かくみていきましょう。

1-1. Microsoft が取り組む NLP モデル開発

おなじみの「word2vec」から「Transformer」や2020年5月にOpenAIから発表された「GPT-3」までの近年の技術歩みを振り返ってから、Microsoft の最近の NLP モデル開発についての説明がありました。 まずはTuring-NLG(T-NLG)について。
T-NLG はMicrosoft が2020年2月に発表した、約175億個のパラメータを持つ言語生成ができる事前学習モデルです。

ニューラルネットワークではパラメータ数が多ければ多いほど、より複雑なものを表現できるので、パラメータ数が多ければ多いほどモデルの性能が上がります。(ただし、工夫せずにパラメータを増やすと、学習が現実的な時間で終わらなかったり、そもそもGPUのメモリ上にデータが乗り切らなかったりする)
この「175億個」というパラメータ数は、当時としてはダントツで多いモデルでした。  

f:id:sue124:20210523202656p:plain

上図は下記のサイトから抜粋したものですが、講演の中でも同じ図を使ったスライドが使われていました。

www.microsoft.com

ちなみにパラメータ数が13億を超えると、32GBのGPUを持ったメモリでもモデルが単一GPUに収まらないので、上記のサイトによると以下の方法で対処しているようです。(講演でもサラッと同様の説明がありました)

  1. We leverage a NVIDIA DGX-2 hardware setup, with InfiniBand connections so that communication between GPUs is faster than previously achieved.
  2. We apply tensor slicing to shard the model across four NVIDIA V100 GPUs on the NVIDIA Megatron-LM framework.
  3. DeepSpeed with ZeRO allowed us to reduce the model-parallelism degree (from 16 to 4), increase batch size per node by fourfold, and reduce training time by three times. DeepSpeed makes training very large models more efficient with fewer GPUs, and it trains at batch size of 512 with only 256 NVIDIA GPUs compared to 1024 NVIDIA GPUs needed by using Megatron-LM alone. DeepSpeed is compatible with PyTorch.

講演では、T-NLGの事前学習モデルを使って文章を生成するデモが流れました。
デモでは、inputとして「How was the universe created?」と入力すると、「ビッグバン」の説明を返してくれる様子が紹介されました。

上記のように175億個のパラメータで性能をT-NLGなわけですが、これを上回るパワメータ数を誇るのが先ほどチラッと話に出た、2020年5月にOpenAIから発表された「GPT-3」です。   GPT-3の事前学習モデルのパラメータ数は約1750億個と、T-NLGの10倍です。  

arxiv.org

このモデル、文章生成能力は高いのに倫理観はないことから「fake newsや差別的な表現が量産される危険がある」などの理由から、APIは公開されておらず、OpenAIに利用申請をして承認されないと使えないそうです。
利用申請にあたっては、用途を細かく回答しないといけないそうです。  

qiita.com

ちなみに先に出てきた OpenAI と Microsoft は、2019年に「コンピューティングパートナーシップ」を締結しています。  

news.microsoft.com

2020年9月には、Microsoft は GPT-3 の独占ライセンスを取得しています。

news.microsoft.com

そしてMicrosoftは目下、OpenAIと協業で「AIスーパーコンピュータ」なるものを開発しているそうです。
「AIスーパーコンピュータ」の構成は以下の通りで、「世界のスーパーコンピュータ上位5位以内」に相当する性能だそうです。
- 285,000基のCPU、10,000基のGPU
- NVLink、Infinibandによる高速通信

ここに並列分散ライブラリDeepSpeedの新バージョンを適用することによって、大規模データの高速学習が実現できるのだとか。
この「AIスーパーコンピュータ」を使って活用して作ろうとしているのが、パラメータ数がなんと1兆個の事前学習モデルとのことです。

ここで先ほどの図に GPT-3 や開発中のモデルのパラメータ数を書き加えると、以下のようになります。

f:id:sue124:20210601084436p:plain

パラメータ数のインフレが進んでいきますね💦
GPT-3ですら発表直後は業界がざわついたので、ここまで来ると世界が変わるかもしれません。
AIが書く文章のクオリティが上がったら、こうやって人間がブログを書く目的が「備忘録のため」以外はなくなったりして。。

1-2. Bing における検索技術

続いて検索エンジン Bing について。
近年の検索エンジンの主要な開発トレンドは、「雪国は誰が書いたの?」と言うような口語調の質問に対して、質問の意図を理解して回答を提示できるようになることです。
上記の質問の例だと、質問中には「筆者」という言葉は出てきませんが、「質問している人は雪国の筆者を知りたい」という意図を理解して、「川端康成」と回答する必要があります。

これに対する Microsoft の取り組みとしては、先ほども登場した Turing NLG を含む「Turing Family」と呼ばれる自然言語処理モデル群をファインチューニングすることで、検索語句の理解性能や検索結果の品質評価が可能となったそうです。 「Turing Family」に関しては以下の Microsoft のサイトに詳細がありました。

msturing.org

このサイトの「Microsoft details how it improved Bing’s autosuggest recommendations with AI」というページを開くと、近年 Microsoft検索エンジンをどう改良しているかを見ることができます。
今回の発表と関係のありそうなところだと、以下の記載があります。

For example, instead of highlighting the words “Germany” and “population” in response to the search “German population,” semantic highlighting bolds the actual figure of 81,453,631 as the population of Germany in 2019.

f:id:sue124:20210603231820p:plain

ドイツ語で「ドイツの人口」と検索すると検索ワードの意図を理解して、実際のドイツの人口にあたる数字を太字で表示してくれていますね。

このセッションの後半は、今後のさらなる性能向上に必要な「より大きなモデル」で学習、推論するための取り組みに関してでした。
これに対して Microsoft は「DeepSpeed」の新バージョンの開発に取り組んでいます。これによって分散学習を効率よく行うことができ、先のセッションで出てきた「1兆個」のパラメータを持つモデル開発を進める、とのことでした。

Microsoft は「AI の民主化」も掲げており、Pytorch のコードを数行変更するだけで使えるようになっているそうです。
あとはより速く学習、推論ができるONNX runtime を開発しているとのことでした。
(この辺は、自分の勉強不足な領域。。)
この辺の情報をキャッチアップしていきたいです。

1-3. 会話できるAI(りんな)開発

最後の基調講演は、会話できる AI「りんな」についてです。
twitter とか LINE に実際アカウントがある、あのりんなです。

f:id:sue124:20210603233817p:plain

twitter.com

今は会社が Microsoft から独立して、「rinna株式会社」が開発をしています。

corp.rinna.co.jp

このセッションの冒頭は「会話ができるAIが目指すところはなんぞや」の話で、昔からある「Turing Test」が紹介されました。
「Turing Test」に関して詳しく書くとブログ1本では収まりきらないので wikipedia のリンクを貼るに留めますが、ざっくり言うと「お互い姿が見えない状態で会話して、AIであると見抜かれずに人間と会話すること」が「会話できるAI」の基準のようです。

ja.wikipedia.org

現段階の技術で「言われた文章を理解して、返答する」ことはできていますが、「文脈を理解して、返答する」ということが厳しいようです。

この問題に対処するために、人間の会話データの一部を「文脈」、それに対する「返答」を学習させて、確率分布 p ( response | context ) を予測するモデルを作成したとのことです。

このような考え方のモデルはいろんな団体から作られており、Microsoft は DialoGPT というモデルを作ったとのことです。

arxiv.org

ただこのようなモデルでも対処しきれない問題があります。
それは「楽しそう/ 悲しそうな トーン」「フォーマル / カジュアル なトーン」のような言葉として現れない情報に対処することです。
(「今日は飲みたい」と言われても、思い悩んだ感じで言われるか、楽しそうに言われるかで、返すべき言葉は変わりますよね)

これに対応するために行われたのは「会話の流れごとにモデルを作る」ということでした。
例えば「明るい話題」「悲しい話題」......とモデルごとに学習させる話題を変える、という形です。

そしてAIが話題を理解して使うモデルを選ぶ際に、「知識探索モデル」というのが使われているそうです。
このセッションのこの辺りを聴いてる時に追いつけなかったので後で調べ直したのですが、「知識探索モデル」についてはこのサイトが分かりやすかったです。

news.microsoft.com

この「知識探索モデル」の軽量化のための取り組みとして Microsoft が実施しているのが「Low-Resource Knowledge-Grounded Dialogue Generation」(低リソースの知識に基づいた会話の生成)という取り組みだそうで、こんな論文が出ていました。(まだ全然読めてませんが)

arxiv.org

「りんな」自体の技術的な取り組みに関しては以上で、残りは「事前学習済みモデル」を使った展開に関しての紹介でした。 rinna 株式会社で「Rinna Character Platform」というサービスを展開しており、これを使うと「りんな」開発の過程でできた、会話を生成するモデルのベースとなる事前学習済みモデルに新たに作りたいキャラクターに沿ったデータを追加学習させることで、簡単に新しいキャラクターの「会話してくれるAI」が作れます。有名どころだとローソンのマスコットキャラクターのLINEボットは、これを活用しているそうです。

corp.rinna.co.jp

あとはこのサービスを活用して、こんなサービスを作ったのだとか。

www.chararu.jp

これから事前学習済みモデルでの「人間と同じように会話ができるAI」によるチャットボットが増えていきそうですね。

2. まとめ

まだ基調講演についてしか書けていないですが、内容が濃くて文章量が多くなったので、ここで一旦まとめます。

Azure AI Days の Day2 の基調講演は「自然言語処理技術」についてでした。
全てのベースとなる、モデルのパラメータ数を如何に増やすか、の話から始まり、それらのモデルを活用した検索エンジン改良や、「人間と同じように会話できるAI りんな」の開発についての講演がありました。
全体を通して、ここ最近の自然言語処理技術の動向から話が始まり、最新の取り組みまで話をしてくれたので、内容的には難しい話ではありましたが、知識がそこまで深いわけではない私でもなんとかついていくことができました。

こういう話を聞いて最新技術、動向をキャッチアップすると、学習意欲が高まりますね。 またこういう話を聞く場があれば、積極的に発信していきたいと思います。

ここまでお読みいただき、ありがとうございました。

Azure AI Days Day1 まとめ

f:id:sue124:20210519221701p:plain

こんにちは。sue124です。

5月19日の Azure AI Days の Day1 に出席したので、備忘録的に内容をまとめたいと思います。
世間でどのようにクラウドコンピューティングが活用されているかを知ることができたので、出席してよかったと感じています。
途中で仕事が割り込んできたりして一部聞き逃したところがあり、完全でないのはご了承ください。

実施されたSessionは、Microsoftの以下のページをご参照ください。

www.microsoft.com

1. 基調講演

概論的な話でした。
ためになりそうな話が多くありそうでしたが、早速仕事が割り込んできて、あまり聞けず。
『ながら』で聞いていたので正確じゃないかもしれませんが、松尾先生の「DXは既存の業務のデジタル化だけでなく、そもそもを「デジタルありき」で考えるべき」や「判断を下すトップがリテラシーを身につけて、社内のイノベーションの芽を育てられるようにするべき」というようなお話が印象に残りました。

2. Francfrancの事例紹介(ノーコード AI で実現する DX - 顧客理解が事業を成長させる -)

Azure上のAutoMLやDesignerの機能を活用することで、データ分析の専門家不在の状態でもデータ分析を半内製化できた、という事例の紹介でした。
上記の2つの機能はGUIが整っているので、専門家じゃなくても扱いやすい、というのがメリットですね。
自社ポイントサービスで、これから上位ステージに上がりそうな潜在的な「上位顧客」を見つけ出すことに成功したそうです。

この発表と同じ内容が以下のサイトにまとまっていたので、詳細が気になる方はこちらをご覧ください。

customers.microsoft.com

ここにある通り、「データに基づいた施策を打つために必要な人材がいない」状態から、「Azure Machine Learning の Automated Machine Learning(自動機械学習)機能によって、コードを記述せずとも 95% の確率で 40 万人から上位顧客会員を当てるモデルを作ることができた」この取り組みは、多くの企業の参考になるのではないかと感じました。

3. メルカリの事例紹介(画像による違反商品検知 on Azure ML Designer)

ノーコード、ローコードでAIを活用した事例。
Azure上のDesignerの機能から、PytorchのDenseNetのモデルに「違反商品かどうか」を学習させて、「違反の可能性が高い場合は、人の目でのチェックに回す」かどうかを判断してくれるシステムを作ったそうです。
これ、真面目に自分でコードを書いて実装しようとすると、下記のリンクの内容を理解しないといけないわけですが、

pytorch.org

qiita.com

AzurenoDesignerの機能を使えば、マウスだけで実装することができてしまいます。   下記のgifは厳密には「Pytorch DenseNet」のものではないですが、下記のような画面でと書かれた箱を「Pytorch DenseNet」ドラック&ドロップしてきて、データセットを示す箱と線でつなぐだけで使うことができます。  

f:id:sue124:20210519224338g:plain
デザイナー
(gifは以下のサイトから引用) docs.microsoft.com

上記のようにしてトレーニングしたモデルで、新たに出品されたモノが違反商品かどうかをバッチで判定して、「違反の可能性が高い」ものがあった場合はSlackに通知が上がって人の目で確認するんだそうです。   最後は不完全な部分を運用でカバーしている事例ですが、Designerで実装した画像分類モデルが実用に耐えらることを示す良い事例だと思います。

4. 丹青社の事例紹介(point 0 参画企業の共創を促進するコグニティブサーチを活用したナレッジマイニングソリューション)

仕事の割り込みであまり聞けず。 今まで検索しづらかった文字がアウトライン化されている画像や資料を、Azureの画像認識等を使って文字を認識して検索可能にし、ナレッジ共有できるようにしたお話だったか? 話を聞けた方がいれば、詳細教えていただけるとありがたいです。

5. カルビーの事例紹介(カルビーのデジタルマーケティングを支える Azure Cognitive Services)

「自社の懸賞応募で送られてくるデータを元にマーケティングしたいが、懸賞応募がハガキに応募券を貼って送るスタイルだったので抜本的に変えました」というお話。
色々検討して、下記リンクのようにパッケージを折ったものを写真に撮ってポイントを貯める形式にしたそうです。

www.calbee.co.jp

この話のいいところは、「製品の制約を満たしつつ、既に世の中でサービスとしてリリースされているものを活用して保守にかかる手間を抑えつつ、データの収集を行うプラットホームの構築ができた」という点です。   スライドにあったシステム構成図はPaaSで構成されており、保守コストが低そうなものでした。
システムの細かいところとしては、食べ終わったあとのパッケージを折りたたんだ時に写真に映る位置に製造番号が出てくるように印刷しておいて、Custom Vision等を使って製造番号を読み取る仕組みにしているそうです。

上記のようなシステムでデータを集められるようになり、色々マーケティングの施策を打てるようになったそうです。

6. エイベックス・デジタルの事例(Cognitive Services を活用した感情の可視化とリアルタイム演出の可能性)

エイベックスの事例は大きく分けて2つの案件に分けられます。

6−1. 観客の表情からの感情リアルタイム分析

下記リンクにあるAzure Cognitive Services の Face の「感情認識」の機能を活用して、観客の感情のリアルタイム分析をできるようになったそうです。 azure.microsoft.com アーティストが「次で最後の曲です」と言った時に悲しみの感情を示す値が一瞬上がるのを捉えられるレベルでの解析が可能なようです。
調べてみると3年前にはできていたようで、こちらの記事にまとまっていました。   japan.cnet.com

6-2. AIが解析した観客の感情から即興で演出を変える「HUMANOID DJ」

2つ目が「HUMANOID DJ」です。
1つ目の感情リアルタイム分析を土台にして、観客の反応を見ながら演出をその場応じてで変えてくれるサービスです。
HUMANOID DJは、Azure Cognitive Servicesがリアルタイムで分析した感情データを元にDJコントローラ(人間のDJも使うソフト)を制御したり、Azure IoT Hubを介して投影する色を変化させたりしているとのことです。
本事例は、以下のサイトにもまとまっていました。 ascii.jp

この事例は、AIを活用することで今までできなかったことを実現できた「まさにDX」と言える事例ですね。

7. 富士フイルムソフトウエアの事例(自社 SaaS サービスへの Azure Cognitive Services の活用事例)

最後のこの案件の時に仕事が入ってきて、ほぼ丸々聞き逃した形です。
あまりちゃんと視聴できなかったのでおぼろげなのですが、おそらく以下の事例の紹介のようです。   Azure Cognitive Servicesを使って写真の判別をできるサービスだそうで、例えばプロ野球で球団職員が撮った選手の写真に「誰が写ってるか」の仕分けの援助をやっているそうです。   ただ、Azure Cognitive Servicesの顔での人の判別は、正面を向いていないと精度が悪いので、カメラを向いていることがないプレー中の写真の仕分けに手こずっているとのこと。   顔だけでなく画像全体で判別させようとすると、背景が邪魔をしてうまくいかないという、画像解析あるあるの壁にぶつかっているようです。   技術的には、ピクセル単位で「どこからどこまでが人か?」の判別をかませれば技術的には解決するでしょう。

news.mynavi.jp

8. まとめ

ざっくりとではありますが、Azure AI Days Day 1 で紹介された事例をまとめてきました。
Microsoft Azure はノーコード、ローコードでAIを活用する基盤が整っているので、専門家がいなくてもAIを活用できた事例が多く出てきたのが印象的でした。
データサイエンティストが今ほど必要とされない日も近いかもしれません(汗

今日の昼からDay 2 があるので、こちらもまとめられればと思います。
お読みいただき、ありがとうございました。

「異常音検知の現状と展望」まとめ

こんにちは。 sue124です。

先日産総研の第46回AIセミナー「AIによる音環境理解を目的とした環境音分析」というセミナーを受けたので、それに関してまとめてみたいと思います。

第46回AIセミナー「AIによる音環境理解を目的とした環境音分析」リンク

このセミナーは2つプレゼンがありました。

今回は資料がすでに公開されている後半のプレゼン「異常音検知の現状と展望」についてをまとめます。

「異常音検知の現状と展望」資料 リンク

今回のテーマ

今回のプレゼンのゴールは「機械の異常、故障を検知するために、未知のものも含めてどうやって異常音を検知するか」でした。

機械学習に詳しい方ならお気づきかと思いますが、「未知のものも含めて」というのがこの問題の非常に難しいところです。

今回のプレゼンは「正常な状態と、未知の異常を見分けるための現状のノウハウの紹介」と言ってもいいかもしれません。

未知の異常を見分けるための方策の変遷

「異常音」というのは滅多に発生しないので、そもそも既知の異常でもデータは少ないです。 まして未知の異常に関しては、データがありません。

そのような状態に対して、以下のような方策が取られたようです。

DCASE2020以前

「DCASE2020」というコンペ以前は、以下のような方策を試したそうですが、うまくいかなかったそうです。

  • エンコードした音に対して、正常音を元通りに復元できるようにトレーニングしたエンコーダを作って、元の音とエンコードした音の差を「異常度」として異常を見分ける

 → エンコーダの汎化性能が良いと、異常音の異常度が上がらず。

  • 正常音に別の音(叩く音、擦れる音など)を足したものを「異常音」として、正常/異常を見分けるモデルを作成

 → 正常を異常と判定する誤報が増えた。

DCASE2020で出た解法

そんな中「DCASE2020」というコンペが開かれました。

このコンペは「ミニ四駆やファンなどの全個体の正常音と一部個体の異常音が与えられた状態で、異常音が与えられていない個体の正常音と異常音(未知の異常含む)を見分ける」というものです。

興味深いのは、上位チームがすべて以下のような解法に辿り着いた、というところです。

  • ある個体Aの正常音に対して、別の個体の正常音を「個体A」の異常音として、モデルを作る

イメージとしては「下図のように各個体の正常音をマッピングして、別個体の正常音は異常とする」というものです。

f:id:sue124:20210228072355p:plain

一見奇抜に見えますが、よくよく考えると合理的だな、と感じました。

「異常」を見分ける問題は、「異常と正常を分ける境界面をどうやってうまく作るか」という点に尽きます。 そしてその「境界面」をうまく引くためには「ギリギリ正常でない異常音」がないと、妥当なところに境界面を置けず、誤報や異常見逃しが増える、という自体を招きます。

それに対して「別個体の正常音をその個体の異常音とする」というのは「正常音と少ししか違わないが、人間が明確に『正常とは異なる』と明確にアノテーションできる」ものとして、最適だったわけです。

ただこの手法に問題がないわけではなく、各個体の音が違いすぎる、または違いが少ない場合は機能しないらしく、この問題にうまく対処できなかったチームがコンペでは順位を落としたそうです。

今後の展望

色々あったのですが要約すると

「DCASE2021 を今年やるからよろしく!」

とのことです。

あとは「どこで異常音が発生しているか」を判別する取り組みをやっていくそうです。

まとめ

  • 異常検知においては「正常音と少ししか違わないが、人間が明確に『正常とは異なる』と明確にアノテーションできる」データを如何にして用意できるかが大事
  • DCASE2020では、「ある個体Aの正常音に対して、別の個体の正常音を「個体A」の異常音として、モデルを作る」という解法を使ったチームが上位に
  • DCASE2021も開催されるとのこと

エントロピーとジニ不純度の比較

こんにちは、sue124です。
昔書いた「Python実践データ分析100本ノック」に関して書いた記事で、「決定木のモデル作成には平均情報量(エントロピーを使っている」と書いたものの、書籍の中で使用している「sklearn.tree.DecisionTreeClassifier」のモジュールではCARTというアルゴリズムジニ不純度を指標にして決定木を構築していることがわかったので、今回はエントロピーとジニ不純度の違いをまとめてみました。

決定木の基本的なことは以前書いた以下の記事を参照願います。

sue124.hatenablog.com


ノード t内でクラス i(全 c個)に属するサンプル数を n_{i}とするとクラス iに属するサンプルの割合を以下のように書くとします。

{ \displaystyle
 p(i|t) = \frac{n_{i}}{n}
}

このとき、エントロピー、ジニ不純度の定義はそれぞれ以下の通りとなります。

エントロピー
{ \displaystyle
 I_{H} = -\sum_{i=1}^{c} p(i|t)\ log\ p(i|t)
}

<ジニ不純度>
{ \displaystyle
 I_{G} = 1 - \sum_{i=1}^{c}p(i|t)^{2}
}


ここで以下の場合を考えてみます。

  • ノード tに単一のクラスしか入っていない場合(最も不純度が低い状態)

エントロピー
{ \displaystyle
 I_{H} = -\sum_{i=1}^{1}\frac{n}{n} \ log\ (\frac{n}{n}) = 0
}

<ジニ不純度>
{ \displaystyle
 I_{G} = 1 - \sum_{i=1}^{1}(\frac{n}{n})^{2} = 0
}

いずれの場合も0になります。

  • ノード tの全てのサンプルが異なるクラスである場合(最も不純度が高い状態)

エントロピー
{ \displaystyle
 I_{H} = -\sum_{i=1}^{c}\frac{1}{c} \ log\ (\frac{1}{c}) = log\ c
}

<ジニ不純度>
{ \displaystyle
 I_{G} = 1 - \sum_{i=1}^{c}(\frac{1}{c})^{2} = 1 - \frac{1}{c}
}

それぞれの上限はクラス数 c次第。


ここで簡単の為にクラスが2個の場合を考え、片方のクラスのデータ数を xとおくと、
エントロピー
{ \displaystyle
 I_{H}(x) = -\frac{x}{n}\ log\ \frac{x}{n} - \frac{n-x}{n}\ log\ \frac{n-x}{n}
}

<ジニ不純度>
{ \displaystyle
 I_{G}(x) = 1 - (\frac{x}{n})^{2} - (\frac{n-x}{n})^{2} = \frac{2nx-2x^{2}}{n^{2}}
}


これらを x微分すると、
エントロピー

{ \displaystyle \frac{d}{dx}I_{H}(x) = -\frac{2}{n}\ log\ \frac{x}{n} + \frac{2}{n}\ log\ \frac{n-x}{n}
}

<ジニ不純度>
{ \displaystyle
 \frac{d}{dx}I_{G}(x) = \frac{2-4x}{n^{2}}
}


これらから、ともに 0\leq x <\frac{1}{2}n で単調増加、 \frac{1}{2} < x \leq nで単調減少となることがわかります。
{ \displaystyle \frac{d}{dx}I_{H}(x)} x=0,nで∞となるので、このエントロピーの方が 0,n周辺での立ち上がりが急になりますね。

以上、エントロピーとジニ不純度の違いを比べてみました。
数式に若干の違いはあれど、表しているものの意味としては大差のない印象でした。

Pythonで作った決定木のモデルを可視化する

こんにちは、sue124です。
前回は以下の書籍の写経を終えた感想を書きましたが、その中で本書の良くない点として挙げた「特に決定木のモデルの可視化が省略されている」ことに関して、自分でやり方を調べたので、書いていきたいと思います。

今回は巷で良く使われているアヤメのデータから品種を特定する決定木のモデルを作って、それを可視化していきます。

import pandas as pd
#対応する名前に変換する関数
def name(num):
    if num == 0:
        return 'Setosa'
    elif num == 1:
        return 'Veriscolour'
    else:
        return 'Virginica'

#アヤメのデータを格納する(説明変数をdataX, 目的変数をdataYとする)
from sklearn import datasets

data = datasets.load_iris()

iris_dataX_df = pd.DataFrame(data=data.data, columns=data.feature_names)

iris_dataY_df = pd.DataFrame(data=data.target)
iris_dataY_df = iris_dataY_df.rename(columns={0: "Species"})
iris_dataY_df["Species"] = iris_dataY_df["Species"].apply(name)

iris_dataX_df, iris_dataY_df の中身はそれぞれこんな感じです。

iris_dataX_df.head()

f:id:sue124:20200419205659p:plain

iris_dataY_df.head()

f:id:sue124:20200419205723p:plain

このデータから決定木のモデルを作ります。

#データを分割する(訓練用:評価用 = 7:3)
from sklearn.model_selection import train_test_split
X_train, X_test, Y_train, Y_test = train_test_split(iris_dataX_df, iris_dataY_df, test_size=0.3)

#決定木モデル作成
from sklearn.tree import DecisionTreeClassifier
model = DecisionTreeClassifier()
model.fit(X_train, Y_train)

上記で作ったモデルの可視化するには、以下のようにします。

#決定木モデルの可視化
import matplotlib.pyplot as plt
from sklearn.tree import plot_tree
%matplotlib inline

fig = plt.figure(figsize=(20, 10))
plot_tree(model, fontsize=14);

f:id:sue124:20200419210050p:plain

たったこれだけで可視化できます。数行でかけるのだから、書籍の中で省略してほしくなかったなーと思います。
決定木って作ったモデルを可視化してナンボですし。
あと図中には明示されていませんが、左に分岐すると枠内に書いている条件が「True」、右に分岐すると「False」です。


ところで図を良く見ると「gini」の文字が。よくよく確認すると、このモジュールでは決定木のモデル生成に「エントロピー」でなく「ジニ不純度」を使っているそうです。公式ドキュメントを見てても良く「impurity」という単語が出てくるなぁと思ったら、そういうことだったらしいです。

###2020/06/07 追記###
エントロピーとジニ不純度の違いについてまとめてみました。
sue124.hatenablog.com

「Python実践データ分析100本ノック」をやり切った感想

こんにちは、sue124です。
また前回ブログを更新してから1ヶ月、その間に↓の書籍の写経をやり終えたので、今回はその感想(レビュー?)を書いていきたいと思います。


本書の良かった点
本に付いているサンプルデータを使ってとにかく手を動かして、Pythonのモジュールを使ってみる、という構成でした。ノック10本ごとにアウトプットが出るので、達成感があります。
私はこの本をやるまでは「pandasでcsvのデータを少し触れる」程度でしたが、この本の写経で「機械学習や画像分析、最適化問題自然言語分析等、一通りなんとなくはやり方がわかったかな?」ぐらいにはなりました。データ分析をやってみたいけど、取っ掛かりがないという人に本書はとてもおすすめ本書の良くなかった点
機械学習最適化問題の数学的な解説は全カット。(自分で調べてカバーするしかない)
・サンプルデータを使ってのデータ分析はもう少し深堀して欲しかった。特に決定木のモデルの可視化は一番肝心なところなのに省略とは。。
・サンプルコード内の記法が安定しない。特に演算子の前後にスペースがあったりなかったりする。ひどいときは1行のスペース有無が混在している。
・サンプルコードのデバッグで使ったと思われる「#print(変数)」がそのまま本に書かれている。
・ノック87本目から90本目までのサンプルコードがグダグダで、「書きかけのものを本に掲載しちゃったの?」ってぐらいの内容が載っている。サンプルデータと一緒にサンプルコードをダウンロードできるので、そちらから書き写せばなんとかなるが、これは売り物としてちょっと、、というレベル。


色々書いたら良かった点より良くなかった点の方が内容が多くなりましたが、Pythonでのデータ分析初学者が本書で勉強することでデータ分析実践への取っ掛かりができてレベルアップできることは間違いないと思います。
最後に本書を具体的におすすめしたい人を書きたいと思います。

おすすめしたい人
Pythonの基本的な部分をある程度勉強して、次のステップとしてデータ分析をやってみたい人
・画像分析とか機械学習に興味があるけど、Pythonのモジュールを動かしたことがない人

おすすめできない人
・画像分析も機械学習自然言語処理もすでにPythonでやったことのある人
 (物足りないと思います)