United Statesからアクセスのようです。言語設定をEnglishに切り替えますか?
Switch to English site
Skip to main content

TinyML:マイコンを使った機械学習

最近の電子機器は「人工知能」や「AI」と呼ばれるものを搭載しない限り、“ハイテク”製品とはみなされません。そのような”ハイテク”製品には非常に高度なアプリケーションと、それを支える驚異的なコンピュータパワーが必要になります。

では、このような状況下で地味なマイクロコントローラには何ができるでしょうか?それを考える前にまずは、AIやニューラルネットワークの基本事項についてお話します。

eta compute「エッジ」での組み込みAIに最適化されたハードウェアを搭載した新世代のマイコンボードの1つ 画像:イータ・コンピュート

AIとは?

人工知能の説明や議論をしようとすると、素人であれ科学者・技術者であれ、誰もがこのテーマについて確固たる意見を持っていることが大きな問題になります。これは、人工知能には制限や境界線が引かれた、誰もが納得する客観的な定義がないためです。なので、例えば技術に触れたことのない素人は現在のテクノロジーは本当に自ら考え、私たちの仕事を代わりにこなし、自己複製ができると思いがちです。加えて最終的には、その技術を作った私たち人類を劣った存在と見なして人類を滅ぼしてしまうような機械ができる、ほんの一歩手前だと過度に妄想しています。しかし、このディストピアなビジョンには必要不可欠な”力”があります。そして現在のAIはその力を持ち合わせていません。その力とは“想像力”です。

AIを研究している科学者や数学者にその力について尋ねると難しい専門用語に圧倒され、けれど本当に高度なものだろうと納得することになります。これをエンジニアに尋ねると「上司の上司が経営誌でAIのことを全部読んでいて、今後の製品に搭載することを望んでいる」と、おそらく至極業務的な返答が返ってきます。そして、とにかくマーケティングは「スマート」や「インテリジェント」といった古いラベルから「Powered by AI」に置き換える必要があると主張し、そうでなければ売り上げ一気に谷底へと落ちていくだろうと言い張ることだと思います。偏見が過ぎますか?かなり実際の事です。

定義の話に戻りましょう。エンジニアリングの観点から言うと、現在のAIの概念は人間の脳に見られるニューラルネットワークの人工版に基づく、非常に強力なパターン検出アルゴリズムを中心に展開されています。人工ニューラルネットワーク(ANN)は通常、従来のマルチコアコンピュータ上でシミュレーションを用いて実行されます。最終的には、タイミング電気パルスや「スパイク」を用いて相互通信を行う、人工ニューロンのネットワークを利用してハードウェアでANNを実現することを目指しています。その過程で、SNN(Spiking Neural Network)という用語が生まれました。実現したいニューラルネットワークの作成には次のような3つの作業が重要になります。アプリケーションに適したネットワークモデルの設計、ネットワークの学習、そしてネットワークモデルからの結果の推論です。

モデル

ANNの一種にCNN(Convolutional Neural Network、畳み込みニューラルネットワーク)と呼ばれるものがありますが、これは標準的なデジタル技術に基づくパーセプトロン(Perceptrons) 図1)が相互に接続された配列で構成されています。図1の例では1つの4ポイント入力層、2つの中間層(隠れ層)、そして1つの2ポイント出力層から構成されています。ゼロから設計を始めるときには入力と出力の数、そして重要なのは隠れ層の数をどのように決めるかです。

CNN

入力と出力の数の決定は比較的簡単です。例えば、320x200ピクセルのデジタルカメラのカラーRGB画像データからオブジェクトを検出・分類する場合、320x200x3=192000の入力が必要になります。出力はネットワークが認識して学習させるオブジェクトの数を反映します。例えば、10個のオブジェクトに対しては「何も認識されない」ものを含む11個の出力になります。隠れ層は少なくとも192000のノードから始まりますが、問題は何層必要であるかです。この「高密度モデル」では1つの層の全てのノードが次の層の全てのノードの重み付けリンクで接続されているため、膨大な量の低レベル処理が必要となります。最初に隠れ層の各ノードが、192000倍(各重み付きリンクに1つ)必要となり、数値フォーマットが32ビット浮動小数点の場合、組み込みプロセッサには少なくともハードウェア浮動小数点演算ユニット(FPU)が必要になります。

入力が30fpsのフレームレートで変化するHDビデオで、数百個の異なる物体を認識するように学習されたネットワークを駆動するために必要な処理能力を想像してみてください。加えて、各フレームには数十もの物体が出現・消失している可能性さえある状況です。実際、このような性能は自律走行車の画像認識システムに必要になるわけです...。もし、そのようなMLアプリケーション(機械学習アプリケーション)を考えているのであれば、非常に高価なマルチプロセッサシステムが必要です。このプロセッサは数ペタクラスの浮動小数点(1秒間に1015 回の浮動小数点演算)単位で測定できます。Tesla社は、自社の自動運転コンピュータである「オートパイロット」がその名に恥じないものになるには、エクサクラスの浮動小数点(1秒間に1018 回の浮動小数点演算)学習が必要であることを認識しています。同社は、362テラ浮動小数点(1秒間に1012 回の浮動小数点演算)の学習を可能にするD1 chipを独自に開発し、「学習用タイル」上で他の119個のチップと組み合わせることを発表しています。25個のタイルを数台のキャビネットに分散させれば、エクサレベルの処理量が得られるはずであると予見しています。そこでやっと性能が到達できる段階になります。 

MegaMLでできても、TinyMLはどうでしょうか?

今までの説明から人間のような自然界の知能は、地球上で最も洗練された機械と比較してもあらゆる点で、圧倒的に優れていることが上記の数値からも理解していただけたと思います。これほどのコンピュータ能力を発揮するために膨大な電力を消費しているにも関わらず、CNNをベースにした映像入力のみのビジョンシステムでは、自律走行車に求められる精度には到底及ばない可能性が高いです。だとすると、シングルマイクロプロセッサベースのSBCで何ができるのでしょうか?実は、工夫をして高望みをしなければ意外と様々なことができます。

近年、TinyMLIoT(Internet of Things)の世界で大きな盛り上がりを見せています。何百万台もの家電製品やその他のデータソースをインターネット経由で「クラウド」に接続するというコンセプトは、その当時は素晴らしいアイデアのように思えました。データは家電製品などの機器によって収集し、クラウドサーバーで処理され、結果や制御信号が返されるという形式でした。ですが、残念ながら膨大な処理量と医療機器やフィットネス機器などのセキュリティの問題から実現には至らず、話題は冷めてしまいました。

しかし、クラウドに送る前にローカルでデータ処理の一部を行う、いわゆる“エッジ処理”を思いついた人がいました。

エッジにおけるAIの例

インダストリー4.0(Industry 4.0)の基盤となる自動化された工場では、常に最高の効率で稼働し続けなければならない機械がたくさんあります。その場には故障の兆候を発見する人間が居ないため、機械は電子センサーを使ってコンピュータによって監視する必要があります。ですが、1つのセンサーで故障の兆候を確実に捉えることは難しいです。例えば、ベアリングに異常が発生した電気モーターはシャフトの回転に連動して、特例の周波数の高周波音を発し始めます。これが低周波振動へと進展して電機子電流の増加、回転数の低下、ケース温度の上昇を伴うことがあります。これらの変化は、最初は非常に小さく、人間は変化を捉えることができずに機械の大きな破損を招く恐れがあります。一方、監視用コンピュータではベアリングに取り付けられた加速度センサーや温度センサー、周囲温度センサー、マイクからの信号を処理することで、シャフトタコメーターや電源電流センサーなどの既存データも活用でき、早い段階で故障の兆候に気づくことができます。これにより、改善処置を軽く済ませることが可能になるのです。これらのデータはIF...THEN...ELSE構造に基づく標準的なコンピュータプログラミングでも実装可能ですが、AIでは実機から取得した「実データ」を用いてCNNを学習させるという選択肢を提供します。

これらの状況でAIを使用する利点は、学習データ一式があるとネットワークが故障につながる既知の入力パターンをすべて検出することができ、さらに人間による検査では見落とされるような、より微妙なパターンを新しく発見することができることです(新入力パターン)。生成された重み付けのパターンを見れば分析にほとんど、あるいは全く寄与しない冗長な入力が見つかるかもしれません。もし、使用された入力が偽陽性または偽陰性を発生させた場合、追加のセンサーが必要であることを示唆することもあるかもしれません。

上記よりTinyMLはその名の通り、入出力が少なくて認識する物体/状況の数が少ない、比較的小規模なアプリケーション向けであることが分かります。そのため、組み込まれた「モノ」を大幅にスマートにしてインターネットの通信回線やサーバーの負荷を軽減するのに理想的と言えます。

ハードウェア

リアルタイムビデオでの物体検出・分類には、スーパーコンピュータ並みの処理能力が必要であることは今までの説明で理解していただけたと思います。しかし、それほど野心的でないプロジェクトであれば、要求能力よりも強力でありつつも安価なSBCやARM Cortex-Mマイコンボードで十分と言えます。例えば、低解像度画像の物体検出であればRaspberry Pi 4 (182-2096) , BeagleBone AISony SPRESENSE (178-3376) Arduino Nano 33 Sense (192-7592) 、及びRaspberry Pi Pico (212-2162) でさえも十分に性能の範囲内です。最初の2つのSBCについては、Linuxオペレーティングシステムのバージョンを実行している比較的処理能力の高いものです。3つ目のものはそれほど強力ではないマイコンボードですが、多数のオンボードセンサーを搭載しています。また、非常に基本的なAIであればFPUを非搭載で最小16KBのメモリを持つ32ビットマイクロコントローラのRaspberry Pi Picoでも動作可能です。今、例で紹介したような低消費電力のプロセッサを使用する場合には、処理速度を上げるいくつかの方法があります。以下はその一例です:

  • 32ビット浮動小数点を使用する代わりに8ビット整数を使用する
    この分解能の低下は自動車の自律走行用の画像認識システムのような非常に大規模なネットワークでは、検出精度に深刻な影響を及ぼします。しかし、マイコンに実装可能な比較的小規模なアプリケーションであれば、8ビット整数は十分すぎるほどです。
  • プーリング層を挿入して後続の層のノード数を減らす
    このテクニックは検出に必要な特徴が強い画像データで頻繁に使用されており、解像度(分解能)を下げることでそれらの特徴は一層で「ブロック化」されます。一見、特徴の詳細が検知できなくなったように思えますが、後続の小さな層では認識可能です。
  • RGBカラー画像(3つの入力)を処理する際に、1つのカラーチャンネルだけを利用する
    R、G、Bの入力を一気に使うのではなく、1つのカラーチャンネルだけを利用すると検出性能が改善されることがあります。

モデルを学習させる

現在、AI開発環境の主流となっているのはGoogleのTensorFlowです。当初はスーパーコンピュータを必要とするアプリケーションを対象としていましたが、現在はTensorflow Liteと呼ばれる、より控えめなシステム向けの縮小版が登場しています。加えて、FPUの有無にかかわらず、最低16KBのメモリを搭載したマイコン向けのさらなる縮小版も提供されています。その名も「TensorFlow Lite for Microcontrollers」です。

マイコンでCNNを学習させてそれなりに動かせることは簡単ですが、生死に関わるような状況でミスをしないように学習させるのは困難を極めます。事実、現在の無人自動車用に開発されている物体検出システムは、許容レベルの信頼性を達成できるものにはほど遠いです。近年の視覚データの不正確な解釈によって引き起こされた、多くの死亡事故がそれを証明しています。幸い、TinyMLネットワークは規模が小さいので学習させるのが非常に簡単です。大規模なネットワークの学習は非常に高性能なコンピュータが必要なため、通常はクラウドベースのツールで行われます。しかし、TinyMLでは一部のツールはローカルPCで実行できます。学習プロセスはとてもシンプルです。では、機械診断のアプリケーションの例を見ていきましょう:

  1. 多数のセンサーデータセットを収集して、故障していることが分かっている機械からのデータか、通常運転している機械からのデータかに基づいてそれぞれ「タグ付け」します。もし、ネットワークに異なる種類の故障を報告するための複数の出力を持つ場合、対応するすべての入力データセットにさらにタグを付ける必要があります。最初のステップとしては、検出されるべき各状態の例を多く持つことが非常に重要です。
  2. シミュレーションされたネットワークは通常、最初はランダムな重み値で埋められます。これは全ての重み(乗数)が0であれば、学習を開始しても何も変わらないためです。
  3. 学習プログラムはCNN入力に一組の入力データセットを提示し、シミュレーションを実行して出力がタグ付けされた(正しい)答えと一致するかどうかを確認します。答えが一致しない場合、重みが調整されてネットワークを再度実行します。必要であれば、このプロセスをネットワークが正しい答えに「収束」するまで繰り返します。これは非常に単純化して表現しましたが、バックプロパゲーション(誤差逆伝播法)として知られる学習プロセスを大まかに説明しています。

実際、ネットワークが許容できる結果を達成するためには、パラメータ調整で多くの人が介入することになるので、この学習プロセスには長い時間がかかります。学習が一通り終わるとテストを行います、正しく評価するためにネットワークの学習に使用されていない新しい入力データをシミュレーションで実行します。これだけで、TinyMLネットワークがタスクに対して十分に「インテリジェント」であることが検証できるはずです。対して自律走行車向けの物体検知に取り組んでいる人たちから、実験室で95%の精度を達成できたシステムでも、路上に出ると50%未満の精度しか達成できないことが分かっています。少なくとも自律走行車用アプリケーションのような用途では十分な学習データが得られないようです。

結果の推論

「学習」が完了したら「推論」フェーズに入ります。ネットワークに実際の生データが入力され、学習によって生成されたパターンと一致するものを探します。この結果は計算するというよりはむしろ「推論」されて、一致する確率の観点から導かれます。シミュレーションで満足のいく結果が得られれば、ネットワークを組み込みマイコンのメモリにフラッシュして、リアルタイムシステムでテストすることができます。

カンニング、偏見、洞察力

CNNを学習させたものは、自然の脳の能力の足元にも及ばないものの最初は少しドキッとさせるような挙動を見せることがあります。まず、CNNは「学習プロセスでカンニング」をすることがあります。「正しい」答えを出すのですが、答えとなる理由が間違っているのです。これは、学習データのバリエーションが不十分な場合に起こることがあります。例えば、倉庫ロボットは緑色のダンボール箱を認識するように学習されたとします。そこで、学習セットにはあらゆる形や大きさの緑の箱の写真を使用します。そして、初めてロボットを起動させたときロボットは人間の倉庫作業員を掴みます。なぜか?なぜならその人は緑のオーバーオールを着ていたからです。ネットワークは学習中に緑色のものは何でも箱に違いないと「推論」してしまったのです。これは中々の「近道」ですが、強力なロボットがこれをしてしまうと人的被害など致命的なものになる可能性があります。第二に、似たような理由で機械が偏った結果を出すことがあります。最後に、良い特徴として洞察力が挙げられます。CNNは人間の脳が見逃した、大量のデータからパターンを見つけることに長けています。例えば、膨大な警察のデータベースから連続殺人犯の特定ができるような微妙な行動パターンを見出せるのです。また、フィットネスウォッチ(スマートウォッチなど)から得られる(匿名化された)データを分析することで、大規模な人口集団における新たな健康傾向を見つけ出すこともできます。

最後に

スーパーコンピュータ上で実行される巨大な人工ニューラルネットワークは、チェスや囲碁などのボードゲームで人間を打ち負かすと、見出しを飾るかもしれません。一方、はるかに小さなTinyMLネットワークはゲームをプレイしたり、科学や医学の分野で新発見をしたりするような、明らかな洞察力を持っていないかもしれません。しかしながら、センサー入力に基づく単純な推論によって人間の命を救ったり、機械の不調を見つけたりすることはできます。また、運転中の車の前の道路を横切る連結ローリーを道路にかかる橋と勘違いするような、破滅的な推論をする可能性も低くいと言えます。

誰もが次の大物になると信じている、TinyML/Edgeコンピューティング市場に狙いを定めた新しいハードウェアが多数登場し始めています。Eta Compute社ECM3532チップ(見出しの写真)は組み込みAI向けに設計されており、NXP DSPコアと共に動作するARM Cortex-M3コアをベースにしています。また、Greenwaves Technologies社の新デバイスGAP 9は、RISC-Vアーキテクチャを実装した10コアのクラスタを搭載しています。両社とも、自社製品でAIアプリケーションを開発するためのツールチェーン一式も提供しています。この流れを見ると来年あたりから、TinyML用に最適化されたマイコンチップが続々と登場することが期待されます。将来的には、AIがIoTの世界を支配することになりそうです。しかし、人間の世界を支配することは無いようです、いまのところは...。

何か困ったことがありましたら、Twitterで私の投稿をフォローしてください。新しいエレクトロニクスや関連技術に関する興味深い記事をリンクしたり、ロボットや宇宙開発に関して見つけた投稿をリツイートしたりしています。

Engineer, PhD, lecturer, freelance technical writer, blogger & tweeter interested in robots, AI, planetary explorers and all things electronic. STEM ambassador. Designed, built and programmed my first microcomputer in 1976. Still learning, still building, still coding today.