化学系エンジニアがAIを学ぶ

PyTorchでディープラーニング、強化学習を学び、主に化学工学の問題に取り組みます

ディープラーニングによる化学プラントの異常検知の簡単な例題

はじめに

例えば連続で運転し化学品を製造するプラントにおいて、何らかの原因で反応温度や圧力が異常に上昇したり、製品中の不純物が増加するなどして運転が継続できず、プラント停止を余儀なくされることがある。この場合、プラント設備の復旧や製品在庫管理・販売計画見直しに多大な人手・費用が必要となる。

異常の兆候に早い段階で気付くことができれば、対策を講じることで必要な人手・費用を抑えることができる。このためAI(ディープラーニング)による化学プラントの異常検知が注目されており、例えば下記の三井化学の例がある。ここでは簡単な例題でディープラーニングによる異常検知をやってみる。

人工知能(AI)を用いて、化学プラントの製造過程で製品の品質予測に成功|2016|ニュースリリース|三井化学株式会社

例題

下記の原料Aから生成物Bを製造する反応器を考える。①原料流量、②原料温度、③反応圧力、④熱媒体温度を制御して、⑤出口温度をある一定の温度範囲内に収めるように運転している(範囲から外れると製品品質悪化)。

f:id:schemer1341:20190915012130p:plain:w500

以下のグラフはある1000日間の運転データである。900日を過ぎたあたりで出口温度がこのプラントの管理上限値である320℃を超え異常が認識された。出口温度の上昇は反応副生物の分解によるもので、急激に反応が起こるのでなく、ゆっくりと時間をかけて分解量が増加していくことがわかっているものとする。

f:id:schemer1341:20190916230731p:plain

反応量が少ないうちに出口温度の僅かな上昇で異常を検知できることが好ましいが、制御値①②③④の振れが出口温度を振れさせてしまい、副生物分解による僅かな温度上昇を見分けることは難しい状況である。

ディープラーニングを用いて早い段階で異常を検知することができるか?

※このデータは下記コードから人工的に生成した。気になる人は参考に。制御値①②③④はランダムで振れを発生させ、出口温度は①②③④を変数とした所定の関数から算出している。さらに700日目から日数に応じて増加する異常値を出口温度に加えている。ここで使用したデータそのものもリンク先に置いてある。

chemical-engineer-learns-ai/20190921_anomaly_detection at master · nakamura-13/chemical-engineer-learns-ai · GitHub

異常検知の手順

次の手順でディープラーニングを用いて異常を検知する。

  1. 正常な期間のデータをディープラーニングで学習し、制御値①②③④と出口温度を相関するモデルを作る
  2. 上記1.のモデルを使って異常な期間の出口温度の予測値を得る
  3. 異常な期間の実際の出口温度とディープラーニングで予測した出口温度の差を異常度とする

正常期間データを学習したモデルから得た異常期間の予測値は副生物分解による温度上昇を含まない値となる。したがって、この値と異常期間の実際の値の差を取ることで異常さの度合いが見えるはずである。

正常期間データの学習

700日目までは正常だったと考えて、その期間のデータを再現するようネットワークを学習させた。

f:id:schemer1341:20190918004339p:plain:w500

なお用いたネットワークは下記の通りで、ノード数20の中間層を2つ入れた。

## ニューラルネットワークモデル設定
class Model(nn.Module):
    def __init__(self):
        super(Model, self).__init__()
        self.l1 = nn.Linear(4, 20) # 入力4つ (原料流量、原料温度、反応圧力、熱媒体温度)
        self.l2 = nn.Linear(20, 20)
        self.l3 = nn.Linear(20, 1) # 出力1つ (出口温度)

    def forward(self, x):
        x = F.relu(self.l1(x))
        x = F.relu(self.l2(x))
        return self.l3(x)

学習させた結果、次のグラフとなった。色々と試行錯誤したものの初期の乖離は解消されなかった。しかしながら、それ以外の期間についてはほぼデータを再現できている。

f:id:schemer1341:20190918010556p:plain:w500

学習したモデルによる出口温度予測および異常度の算出

異常と考えられる期間も含めたデータとモデル予測値は次のグラフとなる。異常を認識したタイミングよりも早い時点でデータとモデル予測値に差が生じていることが見て取れる。

f:id:schemer1341:20190919000843p:plain:w500

データとモデル予測値の差の絶対値を「異常度」と定義し、それをグラフにプロットすると次の図となる。異常度がいくつになったら異常と判断するかがポイントとなってくるが、例えば初期を除き10℃以上を異常と考えるなら、100日程度早めに異常兆候を知ることができる。100日あれば事前に十分な対策を講じることができるだろう。

f:id:schemer1341:20190921175844p:plain:w500

おわりに

実際のプラントでは様々なノイズが制御値や計測値に影響するため、こう簡単にはいかないかもしれないが、実務でも適用をトライしたいと思う。

使用したコード

chemical-engineer-learns-ai/20190921_anomaly_detection at master · nakamura-13/chemical-engineer-learns-ai · GitHub