AIを使って会社でのトイレQoLを向上させたい

2020年12月08日 火曜日


【この記事を書いた人】
三好 貴大

システムクラウド本部に所属、パブリッククラウドの開発、運用をしています。 日本酒とPCゲームが好きです。

「AIを使って会社でのトイレQoLを向上させたい」のイメージ

IIJ 2020 TECHアドベントカレンダー 12/8(火)の記事です】

こんにちは、システムクラウド本部の三好です。
普段の業務では弊社が提供している、GIOインフラストラクチャーP2 パブリックリソースの開発、運用を行なっています。
また、昨年のIIJ 2019 TECHアドベントカレンダーではCiscoルータ導入してお蔵入りした話を新人連合の一人として執筆しました。
今年度は一人で記事を書きますが、お手柔らかにお願い致します。

イントロダクション

皆さんは最近の生活リズムはいかがですか?
自分は決して生活リズムが整っている人間とは言えないのですが、そんな中でも毎日同じリズムを保っているものがあります。
そう

です。
2020年度についてはリモートワークが増え、弊社では出社の機会が減っている状況ではありますが、必要な日に出社した際は、大抵、午前中に1回トイレの個室に入ります。

(ここからはコロナ禍前の話になります)

しかし、午前中から昼過ぎまでの時間帯は利用者が多く、トイレの前に列が出来ていることもしばしばありました。
弊社ではそのような状況を受け、男子トイレの空き状況を常にモニター可能なIoTセンサーが導入されており、自分の席からトイレの空き状況を確認することが出来ます。(トイレに設置されたIoTセンサーについては以前の記事をご覧くださいトイレから始まった「IoTとメッセンジャーボットの連携」とは )

(トイレモニターのイメージ)

しかし、トイレモニターを見て自席を立ったはいいものの、移動中に満室になってしまうこともよくあり、その場合は自席に戻るか、並んで待つしか無く、時間のロスが発生していました。

トイレの空室状況を予測したい

そんな中、ふと、トイレがあと何秒で空くのかを予測する事が出来れば、事前に席を立ち、トイレが空いた瞬間に入室する事が出来て、無駄な時間を減らす事が出来るのでは?と考えました。
また、自分は以前より、時系列データを使い次の時刻の状態を予測することを得意とするAIモデルであるRNN(再帰型ニューラルネットワーク)に興味があり、勉強してみたいと考えていました。
そこで、今回考案したのは、トイレ空室状況データを時系列順に読み込み、AIモデルに学習させる事で特定の時刻から数十秒後のトイレ空室情報を予測するというアイデアです。
会社でのトイレQoLを向上させるために、トイレシステムを運用・開発されている同じ課の先輩にログデータを準備していただき、データの処理と並行してRNNモデルの実装を始めました。

データの下処理

初めに、RNNモデルに読み込ませる時系列データの定義から始めました。
主なデータの要件は以下です。

  • 2年分のトイレ空き状況のログを利用
  • 9時から14時まで、平日のログを利用
  • 特定時刻のデータは8フロア分 x 個室5部屋
  • 入力用時系列データのシーケンスは1時間分
  • 入力用時系列データのシーケンスの単位時間は30秒
  • 1つ先の入力データ(input)を教師データ(answer)として利用

上記の条件にてデータのサンプリングを行い、下記の様な空室状況のデータを、学習用に99600個, 検証用に11040個作成しました。

# それぞれ1時間 * 40個室分
>>> input_tensor.shape
torch.Size([120, 40])
>>> input_tensor[0]
tensor([0., 0., 1., 1., 0., 0., 0., 1., 0., 0., 1., 1., 0., 0., 0., 0., 0., 1.,
		1., 0., 1., 1., 1., 0., 1., 0., 1., 0., 0., 0., 1., 0., 1., 1., 1., 1.,
        1., 1., 0., 1.], grad_fn=<SelectBackward>)
 
>>> answer_tensor.shape
torch.Size([120, 40])
>>> answer_tensor[0]
tensor([0., 1., 1., 1., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.,
        1., 0., 1., 1., 1., 0., 1., 0., 0., 0., 0., 0., 0., 0., 1., 1., 1., 1.,
        1., 1., 0., 1.])

RNNモデルの構築

RNNモデルの構築はLSTMを用いて行いました。


モデルの構築と学習には機械学習向けライブラリのPyTorchを使いましたが、LSTMクラスはPyTorch標準ではなく、
Variational Dropoutに対応したLSTMモデル(mourga/variational-lstm)を利用しました。
また、出力層のSigmoid関数は区間[0, 1]の連続な値を取るため、評価の際は以下の関数を通して、0か1の離散値に変換し、誤差から直接正答率を計算出来る様にしました。

パラメータの調整

自分は機械学習について、大学でFFNNとCNNを少し触った程度でしたので、模索しながらのパラメータ調整でしたが、最終的には大まかに以下の手順でパラメータ調整を行いました。

Step 1. 小さなモデルを少ないデータで学習させる

パラメータ調整は、LSTMの隠れ層のニューロン40個、データの数は200個でスタートしました。

初めはこの段階で学習誤差が十分に小さくなるまで、モデルを学習させることが可能か確かめました。
自分の場合、この段階でモデルの構築や誤差計算などのフローが誤っており、学習誤差が0にあまり近づかなかったことから、ミスに気がつき、AIモデルや学習フローの実装を修正する事が出来ました。

Step 2. データの数とネットワークの形を調整

最終的に99600個のデータをLSTMモデルに学習させたいので、それらのデータを学習可能な表現力を持つように、ニューロンの数とネットワークの深さを調整しました。

Step 3. L2正則化、Dropoutの適用行い、汎化性能の向上を狙う

Step 2を終えたモデルでは、過学習を起こしていた為、汎化性能を上げる手段を講じました。
L2正則化、Dropoutのパラメータを調節して、過学習を起こさず、汎化誤差が小さくなるようにパラメータを調節しました。

学習曲線

汎化曲線

汎化誤差は0.0821でしたので、正答率は91.79%になります。

評価

今回学習させたAIモデルでは検証用データに対し、30秒後のトイレ空室状況を91.79%で予測する事が出来ました。
この予測精度が高いのか、低いのかを評価する際には、入力をそのまま出力とするような関数の誤差、すなわち、

のように現在の空室状況が30秒後も同じであると予測した場合の誤差と比較する事が、評価の一手段になるかと思います。
なぜなら、この誤差から求められる確率は特定の個室が30秒後も同じ空室状況である確率と等しく、多くの場合、トイレモニターの利用者は確認した空室状況が数十秒後も同じであると予想して自席を立つはずだからです。
ですのでAIモデルの予測がこの誤差を上回る事が出来れば、AIを用いた予測が有意義であると言えそうです。
今回、検証用データにおいて、(1)の誤差を計算したところ、その値は0.0839でした。(下図)

従って、検証用データにおいて現在の空室状況が30秒後も同じである確率は91.61%となり、今回の実験結果としては、AIモデルの方が30秒後の空室状況を0.18%正しく予測したというものになりました。

所感と今後

今回、初めてLSTMを使ったAIモデルを実装しましたが、何度も躓いて、2週間前までは、91.61%の壁を越えられず途方に暮れていました。。
しかし、最終的には最低限の結果を出す事が出来て良かったです。
今後はAIモデルの形や読み込ませるデータを追加するなど、見直しを行い、汎化誤差92.61%を目指せればと思います。
その暁にはAIを使ったトイレモニターを実装し、自分の様な経験をする人を減らす事が出来れば嬉しいです。
他には、RNNが頻繁に利用されている自然言語処理についても興味があるので、勉強したいと考えています。
長くなりましたが、貴重なお時間の中、最後までお読みいただきありがとうございました。

IIJ Engineers blog読者プレゼントキャンペーン
  • Twitterフォロー&条件付きツイートで「IoT米」を抽選で20名にプレゼント!
    応募期間は2020/12/01~2020/12/31まで。詳細はこちらをご覧ください。
    今すぐツイートするならこちら→ フォローもお忘れなく!

三好 貴大

2020年12月08日 火曜日

システムクラウド本部に所属、パブリッククラウドの開発、運用をしています。 日本酒とPCゲームが好きです。

Related
関連記事