水力発電でディープラーニング
この記事はこちらの続きです。
地デジ波を用いて天気予報をするにあたって、集めたデータから天気予報に繋がる傾向をわざわざ人力で統計的に求めるのは面倒なので、人工知能にやらせようと思います。序でにその電力は水力発電で賄います。
人工知能による予測と実際の天気で答え合わせをし、リアルタイム学習していく事で段々賢くなっていくようにします。
最終的に、手元に有り合わせのしょぼいマイコンで動かす事を想定しているため、時代に逆行して全てC言語で記述し、ライブラリも独自実装します。
どうせなら、安いカメラでお天気カメラ的なものを作り、それで現在の天気を人工知能に識別させてみようと思うので、畳み込みニューラルネットの深層学習ライブラリも書いておきます。
GPUではなくCPUで走らせるように並列化はGCDを使いましたが、一応OpenCLカーネルも書いておきました。(とは言ってもCPU用のコードをほぼコピべしただけの手抜きなので最適化もへったくれもありません)
せっかくなので、ネットワークやニューロンの構造もResNet(pre-act型)を魔改造したような、私が勝手に思いついたものを試してみます。
活性化関数に指数関数を用いたELUがありますが、これに学習パラメータαを持たせてみます。層によって情報を捨てる最適な量が違うと思うので、αの大きさによって捨てる量が変わるようにし、それを学習させてみようと思います。
かの有名なバッチ正規化は「知らないヤツは人生損してる」と言われるほど極めて有効な手法ですが、バッチ単位で学習させるため、リアルタイム学習には向きません。そのため、効果が有るのか怪しいですが、物は試しという事で、思いつきでリアルタイム学習可能な正規化法を試してみます。Layer NormalizationはそのままではCNNに向かない事が示されているので、少し弄ります。
正規化層を含んだ1層分のニューロンは以下のようになります。
ここで弄るポイントとして
とします。Aは区間(0,1]の一様乱数で、学習時のみ過学習抑制のために添加します。
以上をまとめて逆伝播はこのような形になります。
ところで、水力発電のセンサレスベクトル制御では、2次磁束スライディングモードオブザーバを離散化し、チャタリングが発生しない独自のアルゴリズムで状態量を切替超平面に拘束しておりますが、このアルゴリズムを勾配降下法の最適化アルゴリズムとして使えるのではないかと思ったので試してみます。なお、そのままでは良くないと思うので少し手を加えます。
このままでも取り敢えず動きますが、p_kの計算をもう少し弄っても良いかもしれません。また、g_k=0に固定してしまっても良いかもしれません。
試しに37層で組んでみます。(実験中のため先に挙げた図と若干違います)
この人工知能の学習のための電力は水力発電で賄います。
全体図と人工知能の使い所は以下のようになります。