ライフワークバランスを確認するツールを作った話 - 3

:::note info
この記事は[LITALICO Engineers Advent Calendar 2024](https://qiita.com/advent-calendar/2024/litalico) カレンダー3 の 13日目の記事です
:::

# はじめに

[前日の記事](https://qiita.com/nonikeno/private/c4fcdbe9f92e6ceba964)の続きとなります

晴れて、自分以外が使うようになったツールのチューニングを行う話です
また、家事分担の適正化を行うため、それぞれのバイオリズムを考慮する話を書いていきます

# 目的関数の重みのチューニング

組み合わせ最適化の目的を複数設定したい場合、それぞれの目的の数式に重みをかけ、その合計で組み合わせ最適化に使う目的関数とします

```
目的関数: w1 * {家事の予定の登録された日の分散}
        + w2 * {各家事の設定周期と予定間隔の分散}
        + w3 *  {特定家事（掃除や洗濯など、音が大きい家事）の配置曜日、時間の評価}
        + w4 * {設定済みの予定の変更の少なさ}
```

これらの重みづけを変更することで、どの目的の影響が大きいか、小さいかを調整することができるのですが、それぞれの目的の数式の取りうる値の範囲や分布を理解した上で、最終的に望んでいる結果になるよう調整するのって、専門的な知識が必要です

妻に使ってもらうにあたり、直接、重み部分を指定しなくても、良い結果が出る方法を検討しました

## ランダムで重みづけを変更して、パラメータチューニング

まずは、重みの範囲を指定した上で、予定の作成毎に、重みを少しずつ変化させ、結果を評価、強化学習で最適な重みを抽出する方法を試しました

```
目的関数: (w1 + Δw1) * {家事の予定の登録された日の分散}
        + (w2 + Δw2) * {各家事の設定周期と予定間隔の分散}
        + (w3 + Δw3) *  {特定家事（掃除や洗濯など、音が大きい家事）の配置曜日、時間の評価}
        + (w4 + Δw4) * {設定済みの予定の変更の少なさ}
```

始める前から、パラメータチューニングの試行回数がやばい数になりそうだったので、ひとまず、お試しで自分が検証した結果です

![スクリーンショット 2024-12-08 14.25.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2277180/9c57ec36-44fc-8b9b-8ae4-e3290917a952.png)

もう少し収束させたかったのですが、1,500回超えて、力尽きました。今回、ここの検証で一番時間がかかって、危うくアドベントカレンダーの記事落とすところでした

スコアが感覚的なものということを差し引いても、求めている結果が返ってくるまでの試行回数が当初の想定通り、えげつない数になりました、妻に渡す前で良かった！

## 理想の結果からパラメータをリバース

前述の通り、完全ランダムだと、えげつないことになりますね
学生のときに、強化学習を専門にしていたのですが、その際も、収束までの試行回数がえげつないことになり、素晴らしい技術なのですが、現実社会で活用されるのが限定的でした

当時から、データが潤沢にあった碁やチェスでは、かなり良い成果を出していたのですが、将棋はチューニングが必要なパラメータの数が多く、まだまだって感じでした。今は諸々あって、将棋もかなり凄い状態になってますが、強化学習のみでは難しかった領域ですね

人の志向を学習させる際の試行回数と収束はとても面白いと思います
データと正解のセットがあれば、今はDeep learningも気軽に活用できるので、前述の将棋のように、かなりの成果が出せるようになりますよね

ただ、今回のような人の思考に関しては、本人も言語化しづらい場合や、明確な正解がない場合も多いので、なかなか難しい問題です

明確な正解のないことが原因の1つでもありますので、今回は先にこうあったら嬉しいという正解を入力してもらう形をとりました

1. 配置前の家事予定を好きに配置してもらう(=その人にとっての正解を作ってもらう）
1. 好きに配置した家事予定から、目的、制約の数式のスコアをそれぞれ計算
    - 当初、目的のみ行っていたところ、そもそも、制約も物によってはハードな制約と考えるか否かは人次第と思い、その試行のため
1. 複数回の試行を元に、それぞれ、スコアが最小化するよう、最適な重みを抽出（＝初期の重み）

30回の正解の入力から上記を算出し、完全ランダムと同様に、重みを少しずつ変化させ、結果を評価、強化学習で最適な重みを抽出する方法を試しました

![スクリーンショット 2024-12-08 14.43.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2277180/67c2ee0a-8753-8593-4487-60a0ae79a3ba.png)

んー、まだまだの部分もありますが、先ほどよりはかなりマシ！！

最初に、正解を入力してもらうのも作業的には面倒なので、この辺りのバランスや、他の方法はまだ検討が必要ですね、ただ、上記であれば、ひとまず使ってもらっても、ストレスそんなにないだろうと考えました

他の方法としては、複数人の思考を分析して、思考の推定を行うことも可能かなと思います
そもそも、個人による思考の違いがそこまで大きくない場合、万人にウケが良いパラメータの抽出も可能ですし、Δの最適な刻み方も見えてるくるのではないかと思います

# 家事分担の適正化

二人で家事を分担する場合、当然、事前に相談はします
ですが、そのときのバイオリズムや予定によって、お互いに調整したいときはありますし、事前に相談した結果がベストとは限らないですよね

後者に関しては、明日の記事でいよいよライフワークバランスを見える化します（ここまで、家事予定のスケジューリングの話ばかりしていて、ある意味タイトル詐欺になっているなとヒヤヒヤしておりました）、見える化することで、振り返りを行い、改善のためのPDCAサイクルを回します

前者に関しては、相手の体調を把握して自ら家事分担の一時的な変更を提案する、これがさらっとできる人ってかっこいいですよね、理想です

私の家では二人ともGarminを使用しているので、Germinが提供している[Health API](https://developer.garmin.com/gc-developer-program/health-api-japanese/)を用いて、お互いのバイオリズムを確認できるようにしました

バイオリズムの結果と、家事を予定通りこなせたか、及び、Germinから取得できるストレス値を元にDeep learningで、家事の担当変更をサジェストできる機能も追加しました

ただし、前述のパラメータチューニングの試行で時間を使いすぎて、精度がイマイチなのと、かなりパーソナルのデータとなるので、ここでは具体の提示はできません、申し訳ありません

サジェスト機能に関しては、まだ、チューニング必要だなと思うものの、システムとの対話なので、遠慮が要らず、そこは良いと妻は言ってくれました

人と人の対話だと、お互い気を使う部分ってありますよね、もちろん、それはそれで良いんですが、体調の悪い中、DRYにしたいケースもあるので、そう言った場合は、システムからのサジェスト良いかもですね

# 最後に

余談ですが、システムからのサジェストを本人が承認した際に、相手に変更リクエストが届くのですが、この際、大袈裟に騒ぎたてないのが大事、心配なのはわかりますが、さらっと、家事を代わりましょう

さて、明日はいよいよライフワークバランスの見える化について書いていきます
ここまでで、仕事、家事、ついでに余暇もデータが取れる状態にしておりますので、あとはそのバランスを視覚的に確認し、PDCAサイクルを回せるようにします
よろしければ、ご覧ください

※ 家事以外に関しては、お互いのプライバシーを配慮して、具体の予定内容を表示せず、ブロックされていることだけがわかるようにしております