こんにちは。CTOの新井です。
Robitでは機械学習を始めとしたAI技術を活用したものづくりを行っており、先日発売開始したmornin' plusも例外ではありません。
今回はmornin' plus本体に入っているマイコンでの機械学習の活用についてご紹介したいと思います。
機械学習というと高性能のGPUや専用のハードウェアを使って、物体認識や自然言語解析、自動運転といった高度なソリューションを実現するものだという認識が一般的かと思いますが、実は非常に非力なマイコン等でも用途次第では機械学習を活用することができます。
まずはじめに、簡単にmornin' plusの新しい機構についてご説明したいと思います。
初代mornin'からの大きなアップデートの一つとして、mornin' plusでは取り付け後もカーテンを手で開け閉めする機能が加わりました。
この機能を実現している機構自体は非常にシンプルで、カーテンを動かすためにカーテンレールに押し付けているタイヤを本体内部に格納することによって、手で開け閉めする機能を実現しています。
この機能を実現するには、タイヤを十分格納したか、またカーテンを動かすにあたってタイヤを十分押し付けたかを把握する必要があります。これを実現する方法としては
- 上下にスイッチをつけて十分格納したか、または十分押し付けたかを検知する
- 可変抵抗等を活用してタイヤの位置を把握する
- タイヤを上げ下げした時間を計測しタイヤの位置を推測する
といった方法が考えられます。スイッチは比較的信頼性が高く、安価なので1.の方法が良さそうな感じはしますが、mornin' plusの基板は本体下部にあるため、タイヤが格納したことは簡単に検出できても、タイヤを十分押し付けた(=タイヤを上に上げた)事を検知するためのスイッチを上部につけるためには、
- 別途基板を製造
- スイッチを基板上に実装
- メインの基板と配線をつなぐ
- 筐体にねじ等で基板を固定
等々、製造にあたって様々なことを考える必要が出てきます。スイッチ自体は数円もあれば手に入りますが、実際にそのスイッチを機能させるための様々な工程を考えるとかなりのコストアップになってしまいます。2.の方法も同様です。
ではソフト側だけで対応できる3.はどうかというと、理想的な環境であれば完璧に動作しますが、現実的には
- タイヤを上げ下げするためのモーターの性能の個体差
- タイヤを上げ下げする機構とモーターのエイジングによる変化
- 電源電圧(電池残量)による変化
- 筐体や部品のばらつきによる変化
等々、様々な要因を考慮した上でタイヤを上げる時間を推測する必要があります。そして大量生産を前提とした部品選定や設計では、これらのばらつきを理論的に正確に求めることはほとんど不可能に近いといっても過言ではないでしょう。
もちろん、どんな条件でも確実にタイヤを上げ切るようなモーターの動作時間を採用する、という選択肢はありますが、実際にカーテンが動き始めるまでの時間が伸び、電力も消費するため最適なユーザー体験であるとはとても言えません。
そこで、コストアップを避けるために3.のソフト側による対応をしつつ、可能な限り最適なユーザー体験を提供できるよう機械学習を応用する、というアプローチを採用しました。
広く知られている機械学習の応用は分類問題(写真に写っている物体は何か、今の音はなんという言葉か、等)に関するものですが、回帰問題にも応用することができます。
回帰問題の簡単な例としては、「1、2、3、4という数字の羅列があったときに、次に来る数字は何か」といった問に答えようなものになります。先程の例であれば、次に来る数字は5と簡単に予測でき、そのほか、1と2の中間になる値は?といった問が与えられれば、1.5といった推測ができますよね。このような問題に対する答えを推定できるように機械学習を用いてデータから問題をモデル化し、未知な領域を推測する事によってタイヤの上昇時間を推定します。
より具体的には、アプリから設定したタイヤを上げ下げするパワーと現在の電源電圧、今までの動作回数(=どの程度エイジングが進んでいるか)からタイヤの上昇時間を推定します。
これだけ見ると一見簡単そうですが、実際にパワーや電源電圧を変えながら計測してみると、タイヤを上げきるのに必要な時間は非線形的な変化をすることがわかります。また、エイジングの影響もパワーや電源電圧によって非線形的に影響してきます。
このような変化を設計から理論的に定式化することは非常に難しく、単純な多項式からでは変数の取りうる全領域において問題なくタイヤをあげつつ余剰も少なくする、というモデルを推定することは非常に難しい問題となります。
それでは実際にモデル化してみましょう。機械学習を活用する上でまずはデータが必要になりますのでタイヤを十分上昇させるのに必要な時間を様々な条件下で計測します。
今回の問題では変数はパワー、電源電圧、動作回数であると仮定し、これらを変化させながら上昇に必要な時間を計測しました。数千回という単位でタイヤを上げ下げすることになるので、人間がストップウォッチで測るわけにもいかず、専用の計測装置を作ってばらつきを計測しました。
計測結果の一部をご紹介すると、下記のようなグラフが得られることが判明しました。
これらの実験結果から、以下のことが読み取れます。
- ある漸近線をもつ非線形な変化をする
- パワーが低いほうがばらつきが大きい
- 動作回数が増えるとばらつきが減少する
次に、計測したデータから機械学習を用いて上記のような特徴を持つモデルを近似していきます。
今回は最終目的がマイコン上に学習したモデルを実装してタイヤを上昇させる時間を計算することになるので、計算が簡単なReLUを活性層とした全結合層を複数もつネットワークで近似しました。
実際のネットワーク構成やパラメータはこの問題固有のものになるので割愛しますが、似たような問題に挑戦する方へのTipsとして何点か記載しておくと、色々と遊んでみた結果としては
- ユニット数が一定数以下だとネットワークをどんなに深くしてもちゃんと学習できない
- 出力層の一つ前の層にReLUを適用すると精度が落ちる
- 過学習しない程度のネットワークでもL2 Norm等の正則化をしたほうがいいモデルができる
といった結果になりました。実際に学習してみたモデルに対して、各変数(=パワー、電源電圧、動作回数)を連続的に変化させてみると下記のようなグラフが得られました。
保存してあったグラフのアス比が違うのも相まって、若干ぎこちないところやいびつなところもありますが、実験結果から得られた特徴を全域で持っていることがグラフから読み取れます。
また、検証用の学習に使っていない未知のデータを含むすべての計測結果に対して、予測値と実測値の差が目標値以下であることが確認できました。
ただし、機械学習は過学習等により結果が不安定になる可能性もあるため、十分な事前評価が重要です。
以上の結果から、今回学習したモデルは十分な精度があるといえるようになりましたので、次にこのモデルをマイコン上に実装していきましょう。
今回は非常にシンプルな全結合層のみを用いてモデルを学習したため、教師データから下記の式の各層のWとbを推定したことと等価になります。
また、ReLUはその定義から以下のようになります。
ここまでくればあとは簡単で、学習したモデルからWとbを取得し、上記の計算式をマイコン上に実装すればこのモデルをマイコン上に実装したことになります。
上記の式の通り、必要なものはWとbに該当する定数のみで、特殊な数学関数を使う必要もないのためフットプリントも小さく、非常に簡単な演算を行うだけなのでマイコンでも十分リアルタイムに計算を行うことができます。
マイコンによってはVectorizationまで出来ますので、夢が膨らみますね。
以上のようにして、mornin' plusでは上昇完了を検知するスイッチなしでタイヤの昇降機能を実現しています。マイコンだけでモデルを学習することは非常に難しいと思いますが、今回ご紹介した例のように学習結果のみを使えばマイコンでも機械学習を活用することが可能になります。
もちろん機械学習ではなくそのほかの統計的な手法で近似したりすることも可能ですが、オープンソースで様々なライブラリが公開されており、無料で色々と実験・検証を進めることができるのは機械学習を使うメリットの一つであるといえます。
もちろんソフト的な工夫のみならず、ハード的にも様々な工夫を凝らした自信作になっておりますので、めざめにお悩みの方も、どんな感じでmornin' plusが実際に動くか気になった方もぜひともこちらからお買い求めください…!
また、Robitでは目に見えるところも見えないところも様々な工夫を凝らして様々な問題の解決に取り組んでくれる仲間を募集しております。
ご興味のあるかたはぜひこちらからエントリーしてください!