pog_horse_selector

過去に作ったPOGドラフト会議での指名馬入力ツールをオープンソースにしてなかったことに気付いたので今更ながらgithubにあげました。

このツールは過去の記事で紹介しています

sanshonoki.hatenablog.com

リリース当時は簡素な画面デザインでしたが vuetify を導入して少しだけ洗練されてます。

さて、肝心なコードはこちらです。

github.com

2024年度用のサンプルのデータも含めているので、すぐにでも自分のFirebaseホストにデプロイ可能です。

デプロイするのが面倒な方はこちらからご利用できます。

2019年の秋に開発開始して2020年のPOGドラフトに合わせてリリース。今年度用に再デプロイしようとしたら4年前からメンテナンスを全くしてないせいもあり、エラーでビルドできなくなっていました..。(昨年はビルドできた)

yarn install から動かなくなっていたので node.js のバージョンを上げたりいろいろと手当てして、いちおうビルドしてデプロイできる最低限の状態には復旧できました。

ただ、npmパッケージ関係のバージョンは維持したこともありビルドで大量のWarningがでます..(汗)

年度ごとのデータカタログの作り方

README に horse_catalogue.json の作成方法までは記載してないのでこちらに書きます。

ステップ1

netkeiba_data_collector をgit cloneし、仮想環境を作って必要なパッケージをインストール

その後、2歳馬データのリストを取得する

$ python get_horse_data.py --age 2 --include_no_debut -o 2024_horse_data.csv
ステップ2

pog_horse_selector の toolディレクトリにあるスクリプトcsvjsonに変換する

$ python csv2json.py -o horse_catalogue.json 2024_horse_data.csv

あとは 作成した horse_catalogue.jsonsrc/assets/ に配置すればそのデータがアプリケーションのビルドに使われます。

つぶやき

1年は早いですね。 商用ベースではない個人開発サービスのメンテナンスの難しさを身にしみて感じます..

が、いちおうまだ動くのでPOG愛好家の方々にとって少しでもお役に立てれば幸いです

昨年のPOGドラフトでメンバーから改善要望をもらってたので時間があれば反映させたい。。

NILMTKのdockerイメージ

MacIntelからApple Siliconに変わったこともあり、nilmtkを新しいマシンでも使えるようにしてみました。ただ、毎度、新規に環境構築をするのも面倒なのでdockerイメージを作ることにしました。

出来上がったものはこちら

github.com

NILMの代表的なデータセット(REDD, UKDALE, REFIT)を導入するためのスクリプトも入れてあるので素早く実験を開始することができます。

苦労した点

過去の記事 のときもうまくいかなかったように今回も公式手順 にある以下の conda install の方法はうまくいきませんでした 😞

$ conda config --add channels conda-forge
$ conda install -c nilmtk nilmtk

IntelマシンではなくMac M1でビルドしていることもありますが、 約15000秒(約4.2時間)かかったあとに無情のエラーでビルド失敗..

ERROR: failed to solve: process "/bin/sh -c conda install -c nilmtk nilmtk -y" did not complete successfully: exit code: 1

過去の手順でやるしかないのかな..と思っていたところ pip install でインストールできる方法が偶然見つかりました

Unable to download nilmtk · Issue #953 · nilmtk/nilmtk · GitHub

In summary, for the most up-to-date installation instructions, here're the steps

  1. Create environment for python=3.8
  2. pip install git+https://github.com/nilmtk/nilmtk@0.4.3 Ref from here
  3. pip install git+https://github.com/nilmtk/nilm_metadata@0.2.4 Verify installation
  4. startup python console environment and enter import nilmtk

これの通りやるとnilmtkを問題なくインストールできました✨

ただ、DNN系のアルゴリズムを使えるnilmtk-contribを合わせてインストールしようとするとパッケージの依存関係が解決できずエラーになってしまいます..

解決方法としては、依存パッケージをインストールせずに本体のみをまずpipインストールし、そのあとに依存パッケージを別途インストールすることにしました。

Dockerfileでの該当箇所は以下

COPY files/requirements.nilmtk_contrib.txt /tmp
RUN conda init bash && . ~/.bashrc && conda activate nilmtk-env \
  && pip install git+https://github.com/nilmtk/nilmtk@0.4.3 \
  && pip install git+https://github.com/nilmtk/nilm_metadata@0.2.4 \
  && pip install --no-deps git+https://github.com/nilmtk/nilmtk-contrib \
  && pip install -r /tmp/requirements.nilmtk_contrib.txt

あと、試しにPython3.8ではなくPython3.9に変えてみたところインスールNGだったので、Python3.8を使う必要があります

NILMデータセット

datasetディレクトリ以下に redd、refit、ukdaleのディレクトリがあり、各サブディレクトリに入って download.shconvert.py を実行すれば nilmtkで使えるh5形式のファイルが生成されます

ただ、REDDは配布サイトであるhttps://redd.csail.mit.edu/にアクセスしても応答が返ってこなくダウンロードできません(場所が変わったのだろうか? 🤔)

以前にダウンロードしたファイルが手元にあったのでconvertできることは確認しています。

あと、UKDALEも一部のファイルがでかいので(house_1のmains.datで4.1Gある)、Dockerのメモリが16GBぐらい必要です。足りないとconvert中に Killed されます

Python3.11版のdockerイメージ

pipの方法だとPython3.8でしか動かせないので Python3.11版のdockerイメージも作りました。

github.com

こちらは 過去の記事 の方法に沿ってやらないといけませんが、無事イメージ作成 & インストールすることができました。

こちらも依存関係が難しくオリジナルのsetup.py を改修したファイルをコピーしてインストールするようにしました。

また、nilmtk-contribが古いKerasベースのコードになっており 新しいKerasのバージョンではライブラリのロード時にエラーになってしまい、こちらに関しても修正したファイルを別途用意しておき上書きコピーしてインストールするようにしました。

論文紹介:DiffNILM: A Novel Framework for Non-Intrusive Load Monitoring Based on the Conditional Diffusion Model

NILM(Non-Intrusive Load Monitoring)の論文紹介 3回目です。 今回は2023年に発表された論文の1つを紹介します。

www.mdpi.com

3行で説明する

  • NILMの分野で初めてDiffusion modelを使った
  • 全体電力と埋込み時間情報を入力とする条件付きDiffusionモデル
  • 計算量には目をつぶるが既存手法を上回る結果を達成した

アプローチ

拡散モデル(Diffusion model)は 以下の図のように 拡散過程 と 逆拡散過程 から成り、逆拡散過程によってランダムノイズからデータを生成します。

DiffNILM論文よりFigure1

NILMは分離のタスクなので

  • 入力:家全体の消費電力の系列
  • 出力:(そのうちの)ある家電の消費電力系列

となります。

単純に拡散モデルを適用してもランダムに電力データが出力されるだけとなり目的には合いません

条件付き拡散モデル

そこで条件付きの拡散モデルの出番です。 DALL・Eなどの画像生成AIではプロンプトがそれ(条件)に当たり、条件に応じた生成データを出力してくれます。

図中のConditional inputsとなるところが条件入力となり、

  • Aggregated power data: 家の全体電力の系列
  • Embedded temporal features: 時間系列の埋め込み情報

が入力されます。

DiffNILM論文よりFigure4

これにより、家全体の消費電力情報と時間情報に応じて各家電の消費電力データ(Diffused appliance-level power data)を生成できるようになります

(拡散モデルなのでモデル自体は真の家電消費電力データに近づくように取り除くべきノイズ成分 $ \epsilon_{\theta} $ を出力します)

時間情報埋め込み

家電は季節や時間帯によって使われやすい/使われにくいが変わってくるので時間情報を埋め込みとして入力するのは Make sense です

DiffNILM論文よりFigure3

  • Month of year:何月
  • Hour of day: 何時
  • Day of week: 何曜日

の3次元情報を ~0.5~+0.5 の範囲で埋め込みます

アーキテクチャ

推定ノイズ成分 $ \epsilon_{\theta} $ を出力するネットワークです

DiffNILM論文よりFigure5

  • $ X_\overline{a} $:ノイズ含む家電消費電力系列
  • $ \sqrt{\overline{a}} $:ノイズレベル
  • $ X_{aggre} $ : 家全体の消費電力系列
  • $ X_{time} $:時間埋め込み情報

実験情報では 残差レイヤーは10個 とのことで大きいネットワークです。

活性化関数としては SiLu (Sigmoid Linear Unit)が使われています。

学習とサンプリングの手順

学習フェーズ

DiffNILM論文より

実験情報では T = 1000 となっています

  1. 開始
  2. 学習データセットから家電正解電力 $ x_0 $ を取り出す
  3. 1~1000の一様分布から $ t $ をサンプリング
  4. 時刻 $ t $ でのノイズ率 $ \sqrt{\overline{\alpha}_{t}} $ 〜 $ \sqrt{\overline{\alpha}_{t-1}} $ の一様分布から ノイズ率 $ \sqrt{\overline{\alpha}} $ をサンプリング
  5. 標準正規分布から ノイズ $ \epsilon $ をサンプリング
  6. モデルで予測したノイズ成分 $ \epsilon_{\theta} $ と $ \epsilon $ の L1対数誤差 を損失関数として 逆伝搬させる
    • $ \sqrt{\overline{\alpha}} $ :ステップ4のノイズ率
    • $ x_{\overline{\alpha}} $ :正解電力 $ x_0 $ にノイズ率 $ \sqrt{\overline{\alpha}} $ に応じてノイズを付加したデータ
    • $ x_d $ : 全体電力データと時刻情報埋め込みデータ
  7. 収束するまで続ける

L1損失ではなく対数L1損失を使うほうが収束も速く、結果も良かったとのことです。

サンプリングフェーズ

DiffNILM論文より

  1. 標準正規分布からランダムノイズ $ x_T $ をサンプリング
  2. $ T_{infer} $ ステップ分、以降の処理(3. ~ 6.)を繰り返す
  3. 標準正規分布からランダムノイズ $ z $ をサンプリング
  4. ノイズスケジューラから時刻 $ t $ における $ \overline{\beta}_{t} (= 分散)$ を計算
  5. モデルにノイズ成分 $ \epsilon_{\theta} $ を予測させ、$ x_t $ から引き算する(→時刻 $ t $ での $ x_t $ の平均値 $ \mu_{\theta} $)
  6. 時刻 $ t $ での平均値 $ \mu_{\theta} $ に ステップ3のランダムノイズ $ z $ に分散をかけたものを加算し、$ x_{t-1} $ とする
  7. $ t = 0 $ になるまで繰り返す
  8. $ t = 0 $ 時点での 生成電力データ $ x_0 $ (=家電の予測電力データ)を返す

実験情報からは $ T_{infer} = 8 $ ということで たった8ステップで生成できるのは驚きました

fast sampling([2106.00132] On Fast Sampling of Diffusion Probabilistic Models)という手法らしいです。

評価

データセット

データセットデファクトとも言える

  • REDD
    • 6家庭、約4ヶ月分のデータ
  • UKDALE
    • House1:3年分のデータ
    • House2~5:数ヶ月分のデータ

が使われています

評価指標

  • 分類
    • Accuracy
    • F1-score
  • 回帰
    • MAE
    • MRE (Mean Relative Error)

DiffNILM論文より

MRE は分母が 正解値と予測値のmaxとなっており、正解値を分母とするMAPEとは若干違っています

MAPEでは正解値が小さいときに大きく外すと分母が小さいため大きなペナルティが課されますが、MREではそれが緩和されています。

正解値 予測値 誤差 MAPE MRE
100 1000 900 9.0 0.9
1000 100 900 0.9 0.9

リファレンスモデル

リファレンスモデルは以下の4つです

cGANの論文はIEEEの有料論文となっていて購入しない限り読めないですが ICASSPでの発表スライド(SEQUENCE-TO-SUBSEQUENCE LEARNING WITH CONDITIONAL GAN FOR POWER DISAGGREGATION | SigPort)は閲覧可能です

評価結果

<REDDでの評価結果>

DiffNILM論文よりTable3

提案手法であるDiffNILMが分類タスク(F1スコア)でも回帰タスク(MAE、MRE)でも全体を通して良い結果になっています。

特に、電力パターンが複雑なWasher(洗濯機)、Dish washer(食洗機)において良いスコアを示しています。

<UKDALEでの評価結果>

DiffNILM論文よりTable4

REDDでの結果よりもDiffNILMの優勢さが目立つ結果になっています。

もう1つの生成モデルであるcGANもスコアがREDDに比べて改善しており、学習データ量が増えたことにより性能を発揮するようになったと考えられます。(REDDの4ヶ月に対してUKDALEは3年)

学習データが十分にないときに生成モデルを使うことは不適当であることを示唆しています

所感

計算量は膨大だと思われますが分離性能は有望そうであり、今後、計算コストの改善を期待したいです。(すぐに思いつくのは潜在拡散モデルの導入ですがどうなんだろう)

以下のような色々な細かい工夫がなされているので

  • ReLuではなく、SiLu
  • L1損失ではなく、対数L1損失
  • fastサンプリング

安定的に学習&予測させるのは大変なんだろうなぁと思いつつ、 サンプル実装が公開されたら追試してみたいところです。

GCEインスタンスに急にsshログインできなくなったときの対応

ローカルマシンを新調したら今までsshでログイン出来ていたリモートホストに突然ログインできなくなりました。

$ gcloud compute ssh REMOTE_HOST

USER@IP_ADDRESS: Permission denied (publickey).

sshに関してよくあるエラーメッセージです。

ただ、新旧マシンで .sshディレクトリやファイルの権限、鍵の中身を確認しても同一であり問題なさそうでした。

原因

no mutual signature algorithm という署名アルゴリズムのミスマッチが原因でした

調べ方

ssh時にvTオプションをつけることで原因が分かりました

$ ssh -vT -i ~/.ssh/google_compute_engine USER@REMOTE_HOST
...
...
debug1: send_pubkey_test: no mutual signature algorithm
debug1: No more authentication methods to try.
...

と、出力メッセージの中にエラーの原因が出力されてます

コマンドヘルプによると

     -T      Disable pseudo-terminal allocation.
     -v      Verbose mode.  Causes ssh to print debugging messages about its progress.  This is helpful in debugging connection, authentication, and configuration
             problems.  Multiple -v options increase the verbosity.  The maximum is 3.

とのことです。

対処方法

参考記事そのままになりますが

PubkeyAcceptedKeyTypesのオプションをつけて接続する

$ ssh -o 'PubkeyAcceptedKeyTypes +ssh-rsa' -i ~/.ssh/google_compute_engine USER@REMOTE_HOST

あるいは、 ~/.ssh/config に以下を記述

Host {REMOTE_HOST}
  HostKeyAlgorithms ssh-rsa
  PubkeyAcceptedKeyTypes ssh-rsa
  IdentityFile ~/.ssh/google_compute_engine

これで問題なく今まで通りログインできるようになりました

(参考)各マシンのsshのバージョン

# Remote Host (GCEのVM)
OpenSSH_6.7p1 Debian-5+deb8u1, OpenSSL 1.0.1k 8 Jan 2015

# Old Mac (Remote HostへのSSH OK)
OpenSSH_8.1p1, LibreSSL 2.7.3

# New Mac (Remote HostへのSSH NG)
OpenSSH_9.0p1, LibreSSL 3.3.6

バージョン乖離が大きいときは要注意ということですね

追記

後で見つけた記事、これこれによると OpenSSH 8.8 から RSA方式が使えなくなったようです。

自分の場合は同じ鍵をそのまま使いたかったので暫定的な対処をしましたが、本来は強度の強い暗号化形式で鍵を新規作成すべきでしょう

$ ssh-keygen -t ed25519

参考記事

論文紹介: SAED: self-attentive energy disaggregation

今回もNILM(Non-Intrusive Load Monitoring)論文紹介です。 前回のNeural Fourier Energy Disaggregationの論文紹介でリファレンス手法として挙げられていた論文です。

link.springer.com

2行で説明すると

  • BidirectionalGRUの代わりにシンプルなAttention機構を組み込んでみたよ
  • 軽量かつ特に汎化性能に関して良い性能を示したよ

モデルアーキテクチャ

モデルアーキテクチャは以下のようになっています

基本的には、WGRU手法の最初のBidirectional GRU層がAttention層に置き換わっただけですが 後半のBidirectional GRU層のサイズやDense層のサイズも 128 -> 64 と減少しています

<WGRUのアーキテクチャNFED論文より引用)

軽量を謳っているように、モデルのパラメータサイズは圧倒的にリファレンスモデルと比べて小さくなっています。

Attention層を導入することにより性能を落とさず全結合層のサイズを小さくできたためと解釈するのが良さそうです。

Additive or Dot

Attention層は 論文の図中にもあるようにシンプルなもので Additive と Dot の2種類のAttentionが使われています

それぞれ

に対応しています。

それぞれのkeras実装はこちらになります

Luongの論文ではconcat含む以下の3種類のやり方が示されているのですがこのうちの dot が Luongスタイルということみたいです。

(https://arxiv.org/pdf/1508.04025.pdf より)

dot手法のSAED-dotのほうが高速であり、以下の表を見ると性能としてもSAED-dotのほうがadditive手法のSAED-addのほうより若干優勢と読み取れます。

性能評価

データセット

データセットは UK-DALEと REDD、REFITが使われています。

DW(食洗機)、FZ(冷蔵庫)、KT(ケトル)、MW(電子レンジ)、WM(洗濯機)については、

Category1 Category2 Category3 Category4
Train UK-DALE 1家庭
UK-DALE 1家庭
UK-DALE 2~4家庭 UK-DALE 2~3家庭
Test UK-DALE 1家庭(trainと同じ) UK-DALE 2~4家庭(trainと別) UK-DALE 1家庭(trainと別) REDDの4~5家庭

TVとPCに関しては、

Category1 Category2 Category3 Category4
Train REFIT 1家庭
REFIT 1家庭
REFIT 2家庭 REFIT 2家庭
Test REFIT 1家庭(trainと同じ) REFIT 1家庭(trainと別) REFIT 2家庭(trainと別) UK-DALEの1~2家庭

という学習/テスト条件になっています

Category1は汎化性能を確認するための比較条件となり、基本的にはCategory2~4の結果に注目すべきでしょう

評価指標

F1スコア、MAEといった馴染みのある指標に加えて 汎化性能を示すための指標としてAUH、EUH、MGLが使われています。

  • AUH: Accuracy on Unseen Houses
  • EUH: Error on Unseen Houses
  • MGL: Mean Generalization Loss

AUHとEUHの定義はこちら

学習に使ってない家庭の平均F1スコア、平均MAEということであり、素直に理解できます。AccuracyとなってますがF1スコアの平均です。

MGLの定義はこちら

F1スコアベースでもMAEベースでも 直感的には、

  • seen家庭スコア > unseen家庭スコア: 正の値
  • seen家庭スコア = unseen家庭スコア: 0
  • seen家庭スコア < unseen家庭スコア:負の値 (あり得る??)

となります

つまり、0や負の値に近づくなどマイナスも含めて数値が小さくなればなるほど汎化性能が良いということを表します。

リファレンスモデル

Seq2Point NFED論文より引用)

色々なNILM論文で引用されるSeq2PointやWGRUが比較対象となっており、基本的には信頼できそうです

定量評価結果

論文中はすべて表ベースになっていて比較がやりにくく分かりにくいのでグラフにしてみました

Time/ep

まず、一番わかり易い Time/ep(1エポックあたりの学習時間)から

Time/ep

WGRUが断トツに遅くなっており、Seq2PointはSAED-dotはほぼ同等レベル(若干SAED-dotのほうがより速い)、SAED-addはこれら2つに比べるとやや遅い という結果になっています。

F1スコア

F1

category1~2ではWGRUであったりSeq2Pointが若干良さそうですが category3~4ではSAEDの2手法がやや良さそうに見えます。

MAE

MAE

F1スコアと同様の結果(優劣)になってます

(参考)家電別 F1スコア

F1(家電別)

(参考)家電別 MAE

MAE(家電別)

感想

実験結果からは SAEDはcategory3~4といったところで相対的に成績が良く、汎化性能について優れているという主張でした。

アテンション機構の強力さだったりやパラメータ数の少なさから良い汎化性能を示すという流れは理解できますが 同じ家庭の学習/評価のcategory1より学習家庭と異なる家庭を評価したcategory2のほうがスコアが良かったりする箇所が至るところであり(家電別 F1スコアのグラフでよく分かる)、結果に関して??な所が残ります。

単にリファレンス手法が過学習気味になっている可能性も頭に入れておきたいです。

引用数も17件と多くなく、他の著者の論文で本手法がリファレンスとして登場するのか注目したい所です

Mac (Apple Silicon) で gcsfuse を使う方法

意外と参考記事がなかったのでメモを残します。 インストールまではスムーズですがその後のセキュリティ絡みのところが面倒でした。

前提

手順

1. Macfuseのインストール

$ brew install --cask macfuse

過去記事では macfuse ではなくosxfuse をインストールするものもありますが osxfuse has been succeeded by macfuse as of version 4.0.0. ということのようなので macfuseをインストールします

2. Goのインストール

$ brew install gcsfuse では、

gcsfuse: Linux is required for this software. libfuse: Linux is required for this software. Error: gcsfuse: Unsatisfied requirements failed this build.

となり、Apple SiliconのMacへは直接インストールできないのでGoをインストールしてビルドします。

$ brew install go

インストールできたらバージョン確認できるはずです

$  go version
go version go1.22.0 darwin/arm64

3. gcsfuseのインストール

$ go install github.com/googlecloudplatform/gcsfuse@master

でインストールはすんなり完了

インストールできたら .zshrc でパスを追加します

export PATH=$HOME/go/bin:$PATH

参考記事に書かれている

GO111MODULE=auto go get -u github.com/googlecloudplatform/gcsfuse

だと、

go: go.mod file not found in current directory or any parent directory.
    'go get' is no longer supported outside a module.
    To build and install a command, use 'go install' with a version,
    like 'go install example.com/cmd@latest'

となっちゃいます。古い情報になってしまっています

ちなみに、Go関連の環境変数は以下で確認できます。インストール後のデフォルト設定を変更する必要はありませんでした

$ go env
GOPATH='/Users/xxx/go'
GOROOT='/opt/homebrew/Cellar/go/1.22.0/libexec'
GOTOOLDIR='/opt/homebrew/Cellar/go/1.22.0/libexec/pkg/tool/darwin_arm64'

4. Cloud Storage への Cloud Storage FUSE リクエストを認証する

Cloud Storage FUSE を使用して Cloud Storage バケットをマウントする  |  Google Cloud に書かれている通り、

$ gcloud auth application-default login
$ gcloud auth login

でok

5. Macのシステム機能拡張を有効にする

ここがかなり面倒です。

この状態で 次の6.のステップでマウントしようとすると

となり、機能拡張を有効にする必要があることがわかります。

システム設定 > プライバシーとセキュリティ

から システム機能拡張を有効にする… をクリックします

すると、

となり、起動セキュリティユーティリティを起動することになります。

起動セキュリティユーティリティの起動

メッセージの通り、システム終了させて電源ボタン押したままで起動させます。

手順はオフィシャルのページに書かれています

Appleシリコンを搭載したMacの起動ディスクのセキュリティ設定を変更する - Apple サポート (日本)

「起動オプションを読み込み中..」と表示されるまで電源ボタンを押し続けます。表示されたら電源ボタンは離してokです

  1. 「オプション」をクリック
  2. 「続ける」をクリック
  3. パスワードが分かっているユーザーを選択
  4. 選択して、「次へ」をクリック
  5. 上部メニューの 「ユーティリティ」から 「起動セキュリティユーティリティを起動」 をクリック
  6. セキュリティポリシーの設定に使用したいシステムを選択してください」と出るので ディスクを選択して 「ロック解除」をクリック
  7. セキュリティポリシー で 「低セキュリティ」を選択し、「確認済みの開発元から提供されたカーネル機能拡張のユーザ管理を強化」 をチェック
  8. OKをクリック
  9. 起動ディスクのメニューから「システム終了」をクリック

再起動後、

再び、システム設定 > プライバシーとセキュリティ を開き、

App Storeと確認済みの開発元からのアプリケーションを許可」を選び、「開発元”Benjamin Fleischer”のシステムソフトウェアの読み込みがブロックされました」 を 「許可」します

新しいシステム機能拡張を使用するには再起動が必要です となるので 再度、Mac再起動させます。

6. バケットのマウント

お疲れさまでした。ここまでできたらあとはバケットをマウントするだけです

# マウント
$ gcsfuse バケット名 マウント先ディレクトリ

# アンマウント
$ umount マウント先ディレクトリ

参考記事

論文紹介: Neural Fourier Energy Disaggregation

2023年に読んだNILM(Non-Intrusive Load Monitoring)論文の1つ、Neural Fourier Energy Disaggregation の簡単な紹介をします。

法名は NFED (Neural Fourier Energy Disaggregation) と命名されています。

www.mdpi.com

2行で説明

簡単に言えば、

  • 電力分離(NILM、Energy Disaggregation)の分野で FNet を使ったよ
  • エッジデバイスでも使えそうな計算量、メモリ量になり性能も良かったよ

という論文です。

FNet

コアとなるのがFNetです。 Google Researchの研究者によって提案されたモデルとなります。

arxiv.org

ポイントは

  • トークン混合の手段としてAttention層の代わりにFFTを使った。学習パラメータなしで高速かつ学習も安定しやすい
  • BERTにやや劣るがそれに迫る精度を達成

アーキテクチャは以下のようになっています。

AttentionレイヤーがFourierレイヤーに置き換えられているだけです。

FFTしたあとにその実部だけを使うのが最も性能が出たとされていて、オフィシャルのコードでもそうなっています。

Ablation studyもされており、

トークン混合手段として

  • 通常self-attention
  • 線形モデル
  • FFT
  • ランダム行列
  • トークン混合なし

を比較することによってトークン混合が大事であることを示しています。

この結果は トークン混合手段は何でもよい という[2111.11418] MetaFormer Is Actually What You Need for Vision にも合致しており、納得のいく結果です。

NFEDモデルアーキテクチャ

基本的にFNetと同じです。 ただ、FNetとの違いとしてNFEDでは FFT結果のRealとImagを結合しています。(コードだと51行目)

https://github.com/ChristoferNal/Neural-Fourier-Energy-Disaggregation/blob/main/nfed.py#L51

ここの意図は論文中に特に記載されておらず、気になるところではあります。

性能評価

評価データセット

UK-DALE と REFIT、REDD が使われています。 基本的には UK-DALEでの評価で 異なるデータセットをテストデータとしたときにREFITとREDDが使われています。

Category1 Category2 Category3 Category4
Train UK-DALE 1家庭
UK-DALE 1家庭
UK-DALE 2~3家庭 UK-DALE 2~3家庭
Test UK-DALE 1家庭(trainと同じ) UK-DALE 1家庭(trainと別) UK-DALE 1家庭(trainと別) REFIT or REDDの1家庭

Category3, 4が最もハードな条件、ただ現実世界に近い条件になっています。

リファレンスモデル(ベースラインモデル)

  • S2P (Sequence-to-Point)
  • WGRU (Window GRU)
  • SAED (Self-attentive energy disaggregator)

の3つがリファレンスモデルとして使われています。

SAEDは同じ著者による提案手法ですが S2P、WGRUは他のNILM論文でもベースラインとしてよく登場する馴染みの手法です。

それぞれのアーキテクチャは次の通り。

S2P

WGRU

SAED

結果

今回はモデルの軽量化というのが狙いでもあり、F値やMAEと言った精度評価以外に メモリ容量、推論速度も評価対象に含まれています。

以下、5家電の結果です。

食洗機

洗濯機

冷蔵庫

電子レンジ

ケトル

提案手法であるNFED(青線)が4カテゴリにおける精度面でもシステム面(メモリ、処理速度)でもtopレベルであり良いという主張でした。

ただ、個人的にはオレンジ線のSAEDのほうが良さそうに見えてしまいます。。

所感

どんなに精度が高いモデルであってもシステム要求が厳しいのでは現実世界で使うことが難しいので実用性に目を向けた検討は(特にNILMの世界では)非常に良い方向性だと思いました。

性能比較結果からはリファレンス手法の1つであるSAEDのほうがどうしても良さそうに見えてしまうので、モヤモヤは残ります。

うがった見方をすれば、SAEDも同じ著者の提案手法なので引き立て役だったりするのかもしれませんw

論文の引用数もあまり多くないですし(本日時点で17件。ベースラインモデルのS2Pは505件、WGRUは147件)、今後、他の著者論文でも本論文が引用されるか注目していきたい所です。