見出し画像

包除積分ニューラルネットワークについて

はじめまして、九州工業大学情報工学府、本田あおい研究室の福島です。研究や、大学生活等をnoteで記していきます。よろしくお願いします。

今回は、本研究室で開発・研究を行っている包除積分ニューラルネットワークについて紹介したいと思います。

はじめに

近年、機械学習の手法の一つであるディープラーニングがデータ分析の分野で高い成果を上げています。しかし、一般的に解釈性と精度はトレードオフの関係性にあると考えられ、複雑であるために解釈性が損なわれるブラックボックス問題といわれる問題があります。

ブラックボックス問題へのアプローチとしては、入出力の関係を解析し解釈する手法とモデル自体をホワイトボックス化する手法があります。
包除積分ニューラルネットワークはモデル自体をホワイトボックス化することでブラックボックス問題へアプローチする手法となります。

包除積分

包除積分は非加法的測度であるファジィ測度と多項演算により定義される積分です。

・Ω={1,2,…,𝑛}を有限集合
・|𝐴|は有限集合𝐴の要素の個数
・𝒫(Ω)はΩの部分集合全体からなる集合、つまりΩのべき集合
このとき、𝜇をファジィ測度、⨂を[0,K]上の演算t-ノルムとすると
Ω上の非負有界関数𝑓=($${x_1}$$,$${x_2}$$,…,$${x_n}$$)∈$${[0,𝐾]^𝑛}$$の𝜇と⨂による包除積分は次で定義されます。

包除積分

包除積分ニューラルネットワークとはこの包除積分を組み込んだニューラルネットワークモデルとなり、学習後のパラメータから情報抽出することが可能です。

包除積分ニューラルネットワーク

ここからは実際に包除積分ニューラルネットワーク(ieinn)を用いて学習・推論を行う方法を紹介します。ieinnライブラリはPythonのオープン機械学習ライブラリであるPyTorchを用いて実装しています。

ここでは、Google Colaboratory (以下 Google Colab)を利用した ieinn ライブラリの使用例を紹介します。
本記事で紹介するieinnライブラリ、プログラムは下記GitHubで公開しています。

ieinnライブラリ

まず、Google Colabでieinnライブラリを使用するために、GitHubからダウンロードしたライブラリをGoogle driveにアップロードします。
その後、Google ColabでGoogle driveをマウントします。

マウントしたdriveまでパスも通します

インポート

続いて必要なライブラリのインポートを行います。一番下のインポートがieinnライブラリです。ieinnライブラリはPyTorchを使用しているのでPyTorchのライブラリもインポートします。

その他、データに従って必要なライブラリをインポート

deviceの設定

GPUが使える場合は deviceに cuda を設定、そうでなければ cpu を設定します。

データの読み込み

続いて、データの読み込みを行います。今回はcsvファイルから読み込みを行います。また、目的変数の[0,1]正規化、訓練データとデータの分類などの処理も行っています。

データセット、データローダを作成

訓練データ、テストデータでそれぞれデータセットを作成し、これらを引数としてデータローダを作成します。データローダではミニバッチサイズやシャッフルの指定をします。

モデルの生成

ieinn の IE クラスでモデルを生成します。引数として、訓練データローダ、ファジィ測度の加法性の次数、積分に用いる多項演算、前処理の種類を渡します。

  • 訓練データローダは、上で作成した train_loader

  • 加法性の次数は1から説明変数の数までの整数

  • 多項演算は、論理積:Min、代数積:Algebraic、限界積:Lukasiewiczなどのt-norm が準備されています。

  • 前処理は、

    1. PreprocessingLayerPercentile,

    2. PreprocessingLayerStandardDeviation,

    3. PreprocessingLayerMaxMin から選べます。

加法性次数、多項演算、前処理手法を指定しない場合、デフォルトはそれぞれ、完全非加法、代数積、PreprocessingLayerPercentile となっています。

損失関数と最適化手法も定義しています。


学習前パラメータを確認

state_dictメソッドによりモデル内のパラメータを確認します。
下図の赤枠で囲ったoutput.weightの部分が包除積分におけるファジィ測度のメビウス変換値と対応しており、この値を読み取ることで情報抽出を行ことが出来ます。

学習

PyTorchでは学習のfor文を書く必要がありますが、少々長いためIEクラスのメソッドとして用意しています。学習のメソッドのほかに学習曲線や決定係数を出力するメソッドも用意しています。

ここではIEクラスのfit_and_validメソッドを使用して学習を行ってみます。
引数として訓練データローダ、テストデータローダ、criterion:損失関数、 optimizer:最適化手法、エポック数、device(cpu or cuda) を渡します。

学習終了後に学習にかかった時間も表示します。

学習結果の表示

決定係数と学習曲線を出力するメソッドにより学習結果を表示していきます。

まず、決定係数をr2_scoreメソッドで表示します。
引数はテストローダとdevice(cpu or cuda)です。

つづいて、学習曲線です。
学習曲線をプロットするメソッドは3つ作成しており、
・plot_train():訓練データによる学習曲線
・plot_test()テストデータによる学習曲線
・plot()上記2つを同時にプロット
があります。それぞれ引数はありません。ここではplotメソッドのみ表示します。

青が訓練データ、赤がテストデータの学習曲線
横軸:エポック数、縦軸:損失の値

学習後パラメータの確認

最後に学習後のパラメータを表示します。
赤枠のパラメータから学習後のファジィ測度を読み取ることが出来ます。

おわりに

今回は本研究室で開発・研究を行っている包除積分ニューラルネットワークについて紹介しました。ぜひ、ieinnライブラリを使っていただけたらと思います。

最後まで読んでいただきありがとうございました。

この記事が気に入ったらサポートをしてみませんか?