時間方向に集約されたデータを用いた時系列予測

Masashi Yoshikawa

2019-10-11 13:26:38

本記事は、2019年夏のインターンシップに参加された太田真人さんによる寄稿です。

 

こんにちは、2019年夏のインターン生だった関西学院大学大学院M1の太田です。大学では、ベイズモデリングの応用で研究しています。インターンでおこなった業務について紹介します。

 

概要

 

私は、時系列予測に取り組みました。実問題では、データを細かい時間スケールで長期間保存できず、過去のデータから秒を分スケールに集約して保存することがあります。

他にも、数年前までは、1ヶ月や1日単位で来場者数(売り上げ)をカウントしていましたが、最近は、高い時間分解能(日にち、時間単位)で予測したい需要が高まり、細かくデータを取り始めることもあると考えます。

その場合、データを集めたばかりの頃は、時系列長が短く予測が難しいことがあります。そこで、集約されていない時系列データは直近の短い期間しかないが、集約された時系列データは長期間あるという問題設定を考え、本研究に取り組みました。毎分計測されるデータを例に出すと、集約されていない時系列データとは1分単位のデータ1つ1つを、集約された時系列データとは1時間ごとの合計等を表します。

ここで、本研究で扱う時系列データを図1に示します。青色が観測値で白色は未観測値になります。タスクは、これらの時系列データが与えられたもとで、集約されていない時系列の予測になります。

 

図1. 本研究で扱う時系列データ

提案アプローチにより、直近の短期間の時系列データから、高い精度で予測ができるような手法を検討しました。つまり、集約されていないデータが貯まるまで数年や数十ヶ月待つ必要が無く、なるべく早い段階で予測が行えるようになります。

 

アプローチ

素朴なアプローチとしては、短期間の時系列データだけで予測モデルを作ることですが、トレンドが捉えられず、予測が難しいです。

そこで、時間方向に集約された時系列データを分解(Disaggregation)することが考えられます。その素朴なアプローチは、直近の集約されていない時系列データから分解の割合の平均を計算して、過去の集約された時系列データに適応することです。

これは直近の集約されていない時系列データが少ない場合、データによっては分解が不適切になることがあります。例えば、数週間分のデータから1週間で金曜日が一番売り上げが良いとわかると、このアプローチだと過去の集約されたデータを分解するときに、金曜に多く売り上げが割り振られてしまいます。本当は、夏季休暇と通常時で売り上げの量が変わるなど、違う場合は多くあると思います。1週間や2週間分のデータで過去の全てに適応するのは不適切です。

提案アプローチはこれらを解決する方法を作りました。まず、提案アプローチを図2を用いて簡単に説明すると、上段の集約された時系列データを分解しつつ、下段の分解された赤色の推定値と青色の集約されていない時系列データを合わせて、時系列モデルを学習し、未来の集約されていない時系列データを予測する確率モデルです。

図2. 提案アプローチの概略

詳しく説明していくと、集約された時系列データは、図2の上段のように\({C}_{\tilde t}\ ({\tilde t}=1,\dots,{\tilde T})\)と集約されていない時系列データは下段のように \({x}_{t}\ (t=1,…,T)\)と表します。このとき、集約されていない時系列データは\(x_{t_H}\)まで未観測のデータになります。この集約された時系列データとされていない時系列データの関係は,時間方向の合計\(C_{\tilde t}= \frac{1}{K}\sum_{i =1}^K x_{i+({\tilde t}-1)K}\)によって求まります。ここで、集約された方の時系列長は\({\tilde T}=T/K\)と表せ、\(K\)は自分で決定するパラメータになります。例えば、1日のデータを24時間に分解したければ、\(K=24\)になります。

集約された時系列データの分解比率は, \({\rho} = {\rho}_1,…,{\rho}_K\)とあらわし、この分解比率は時間に依存しない確率変数として扱い、ディリクレ分布 \({\mathrm Dir}({\alpha})\)に従うと仮定します。ディリクレ分布を用いることで、分解した後のデータの総和がまた集約されたデータに戻ることを保証します。

尤度関数は \(\prod_{t}{\mathcal N}({x}_t|f_{\theta}( {x}_{<t}),{\sigma}^2)\)とします。 \(f_{\theta}( {x}_{<t})\) は,時系列モデルであり,本研究では,AR(Auto Regressive)モデルとFacebookが開発したProphet[1]を使用しました。\({\theta}\)は時系列モデルのパラメータになります。

同時分布は、\(p(x_{\le T},{\mathbf \rho}|C_{\le \tilde{T}}) = p(x_{\le T}|{\mathbf \rho}, C_{\le \tilde {T}}) p_{\alpha}({\mathbf \rho})\)となります。ここで、\(p_{\alpha}({\mathbf \rho})\)のディリクレ分布のパラメータは、完全に一様分布にするのではなく、直近の集約されていない時系列データから求まる分解比率をほどよく生成するような値にします。(一様分布にすると、分解比率の事前の信念として、全て均等に分解されることを表します。)

では、そのようなパラメータ値を求めるために、次の同時分布\(p(x_{t_H:T},{\mathbf \rho}|C_{{\tilde t_{H}}:{\tilde T}})=p(x_{t_H:T},{\mathbf \rho}|C_{{\tilde t_{H}}:{\tilde T}})p({\mathbf \rho})\)について説明します。この分布は、直近の集約されていない時系列データと分解比率の同時分布です。尤度関数にあたる\(p(x_{t_H:T},{\mathbf \rho}|C_{{\tilde t_{H}}:{\tilde T}})\)は、\(\prod_{{\tilde t}={\tilde t}_H}^{\tilde T}{\mathcal N}({\mathbf x}_{\tilde t}|C_{\tilde t}{\mathbf \rho},\sigma^2)\)と表します。ここで、\({\mathbf x}_{\tilde t}=(x_t,…,x_{t+K})^{\rm T}\)となります。また、\({\tilde t_{H}}\)は、集約されていない時系列データが観測され始めた時の集約された時系列データでの時刻です。

事前分布\(p({\mathbf \rho})\)は、ディリクレ分布です。ただし、ここでは、\({\mathbf \alpha}=1\)として、一様分布にしました。この同時分布から事後分布\(p({\mathbf \rho}|x_{t_H:T},C_{{\tilde t_{H}}:{\tilde T}})\)を、変分推論により求めます。近似事後分布には、ディリクレ分布を仮定します。この近似事後分布は、先ほど事前分布に求めていた「直近の集約されていない時系列データから求まる分解比率をほどよく生成する」ことを実現しています。したがって、近似事後分布の変分パラメータ\({\tilde \alpha}\)を先ほどの事前分布\(p_{\alpha}({\mathbf \rho})\)のパラメータとして用います。つまり、事後分布を事前分布として用いることになります。

また、グラフィカルモデルは図のようになります。

図3a. 直近の観測している集約されていない時系列データから事前分布を学習するグラフィカルモデル。

図3b. 時系列予測のグラフィカルモデル。図の左側のプレートが集約されていない時系列データが未観測時刻のグラフィカルモデルを表し、右側のプレートが観測され始めた時刻のそれを表します。θは、ARモデルのときパラメータであり、Prophetのとき確率変数になります。

この後は、時系列モデルのパラメータの学習と近似推論について説明していきます。

モデルパラメータの学習は、周辺尤度の最大化をおこないます。これは、2つのELBO(Evidence Lower BOund)の最大化により達成されます。1つ目は、

 

$$\log p({\bf x}_{t_H:T}|C_{{\tilde t_{H}}:{\tilde T}}) \ge \mathbb{E}_{q_{\tilde \alpha}({ \rho})}[ \sum_{t=t_H}^T \log p_{\theta}( {\bf x}_t | {\mathbf \rho}, C_{\tilde t}) ]-KL(q_{\tilde \alpha}({\mathbf \rho})|p({\mathbf \rho})).$$

 

このELBO最大化により、近似事後分布\(q_{\tilde \alpha}({\mathbf \rho})\)を学習します。

このELBOの1項目は、集約されていない時系列データから、分解の比率\({\rho}\)が尤もらしい値をサンプルするように\({\tilde \alpha}\)を学習する再構成誤差項です。

2項目のKL項が、\({\tilde \alpha}\)が過剰適合しないようにする正則化の役割を果たします。近似事後分布は、ディリクレ分布を仮定しており、\(p({\rho})\)のディリクレ分布(一様分布)に近づくよう変分パラメータ\({\tilde \alpha}\)を学習します。この正則化によって、素朴なアプローチのような過去のデータに対して分解を強く仮定しないため、分解時の規則性がはっきりしないノイズのあるデータに対しても予測がうまくいく可能性があります。ちなみにディリクレ分布のreparameterization trick はFigurnovら[2]が提案しています。

求めた近似事後分布\(q_{\tilde \alpha}({\mathbf \rho})\)を事前分布\(p_{\tilde \alpha}({\mathbf \rho})\)として用いて,次のELBOを最大化します。

 

$$\log p({\bf x}_{ \le T}|C_{\le {\tilde T}}) \ge \mathbb{E}_{q_{\alpha}({\mathbf \rho})}[\sum_{t=1}^T \log p_{\theta}({\bf x}_t|{\bf x}_{<t},{\mathbf \rho},C_{\le {\tilde T}})]-KL(q_{\alpha}({\mathbf \rho})|p_{\tilde \alpha}({\mathbf \rho})).$$

 

このELBOは、時系列モデルの出力を平均とするガウス分布を尤度関数に、事前確率は先ほど求めた近似事後分布をもとに、近似事後分布\(q_{\alpha}({\mathbf \rho})\)を求めながら、時系列モデルのパラメータを学習する段階になります。ARを時系列モデルに使う場合、ARモデルのパラメータは、VAE(Variational AutoEncoder)[3]のdecorderの学習方法に習い、近似事後分布を求めるELBO最大化と同時に学習します。また、Prophetを時系列モデルに用いる場合は、別途モデルパラメータの事前確率を用い、また近似事後分布を仮定し、KL項がさらに増えます。

予測分布は、以下の式で与えられます。

 

$$p(x_{T+1}|x_{\le T},C_{\le {\tilde T}})=\int p_{\theta}(x_{T+1}|x_{\le T, },{\mathbf \rho},C_{\le {\tilde T}})q_{{\alpha}}(\mathbf \rho){\rm d}{\mathbf \rho}.$$

 

ここまでを数式を使わずに説明すると、直近の時間方向に集約されているデータの分解比率を、事前分布に組み込み、過去の集約されたデータから集約されていないデータを推定しつつ、時系列モデルを学習しようというアプローチです。

以後、提案アプローチの時系列モデルにARモデルを用いた場合、TDAR (Temporal Disaggregation AR)と呼び、Prophetを用いた場合、TDProphet (Temporally Disaggregation Prophet)と呼びます。

 

実験

実験は、集約されていない時系列の予測精度の比較と集約さていない時系列データの量がどのくらい少なくても精度が高いのかを実験しました。データセットは、アメリカの複数地区の1時間毎の消費電力を記録したHourly Energy Consumption[4]、毎月の飛行機の乗客数を記録したAir passengers[5]、複数のレストランの毎日の来場者数を記録したRecruit Restaurant Visitor Forecasting[6]です。また、集約の方法は図4のように、毎時は毎日に、毎日は毎週に、毎月は四半期に集約しデータセットを作成しました。

図4a. Hourly Energy Consumptionの1地区のデータを集約した時系列データ。赤枠が学習データに使用します。

図4b. Recruit Restaurant Visitor Forecastingのデータセットの1店舗分のデータを集約した時系列データ

図4c. Air passengersのデータを集約した時系列データ

比較手法は、短い期間の時系列データだけで学習したARモデルと直近の集約されていない時系列データから分解比率の平均を求め、過去の集約されたデータを分解し、分解されたデータを含めて学習したARモデル(MDAR:Mean Disaggregation AR)を使用しました。また時系列モデルにProphetを使用した方は、Recruit Restaurant Visitor Forecasting (RRVF) のデータセットとAir Passengersのデータセットで試しました。

評価指標に関しては、RRVFのデータセットに対する予測にはRMLSEを用いて、他はRMSEで評価しました。予測範囲は、スケールがそれぞれ違いますが、集約されたデータ3点分の分解されたデータです。RRVFのデータなら21日分、Air passengersのデータなら9ヶ月分、Hourly Energy Consumptionデータなら72時間分になります。

表1. 予測精度の比較

表1が実験結果になります。予測精度を比較した結果、提案手法のTDARがRRVFのデータセットとHourly Energy Consumptionのデータセットに対して精度が一番高いです。提案アプローチは、データにノイズが乗りやすく、集約されていないデータが少ない場合に効果がありました。それゆえに、Air Passengers のデータセットでは、提案アプローチはMDARに予測精度が劣りました。このデータセットは、データにノイズが少なく、直近の観測された分解比率から精度高く集約されたデータを分解できてしまうからです。また集約されたデータを活かすことにより、長期的なトレンドを捉えることができます。Air Passengers のデータセットには右上がりのトレンドがあり、直近のデータだけで学習したARモデルの場合、トレンドは捉えられないですが、集約されたデータを活かすことでトレンドは捉えることができます。

TDProphetの精度が高くないと考えられる理由は、それ以外のProphetは、MAP推定でパラメータ推定しているのに対し、提案アプローチはELBOの計算をしているため、近似事後分布のパラメータの初期値に依存し、局所解に落ちて精度が振るわなかったのかもしれません。

実験2:集約されていない時系列データの量に伴う予測精度の比較

RRVFデータセットに対して、集約されたデータは固定し、集約されていないデータがどれだけ少なくても、精度が出るのかを実験しました。図5は、横軸が集約されていないデータを2週間隔で増やし10週分、縦軸に予測精度RMLSEをとりました。

図5. 学習に使用する集約されていない時系列の長さを変えて予測精度の比較

縦軸の値が低いほど精度が高いことを示します。集約されていないデータ量が少ないときに提案手法の赤線が2か月分のデータ量が手に入る段階では、他の手法より精度が高いことがわかりました。

関連研究

本研究と一番関連のある研究は、階層時系列予測 (Hierarchical time series forecasting)[7] になります。それは、各層が異なる時間スケールで集約された時系列データを表し、一番下の層が最も細かい粒度の時系列データになります。そのデータがあたえられたもとで、どの層の予測もおこなう研究です。本研究の集約されていないデータが過去にも多く手に入っていると階層時系列予測と同じ問題設定になります。

データが少ない場合、転移学習が考えられます。時系列データの転移学習[8]は、分類や予測、分解があります。転移学習で行われている時系列分解は、多変量の時系列とそれらを集約した時系列が与えられたもとで、ある変量の時系列予測をおこなう研究です。例えば、各家の家電の消費電力とその家の合計の消費電力が複数の家が与えられたとき、ある家の家電の消費電力を予測しようという応用があります。本研究の分解は時間方向の分解なので、この転移学習で行われている時系列分解とは異なります。

最後に、時系列データではありませんが、空間的に集約されたデータの高解像度化をおこなう研究として[9]があります。この研究は、州ごとに集計されたデータを、共変量データを補助的に使用しつつ、ガウス過程を用いた確率モデルから、空間の高解像度化をしています。さらに、ガウス過程を用いながらも、100万件を超える観測データがあっても計算できるように工夫されています。

 

Future Work

本研究で用いた事前分布は、無情報を意味する一様分布を使用しましたが、ここにデータのドメイン知識を詰め込むことができます。例えば、長期休暇期間とそれ以外の期間でデータの分布が変わるとわかっているなら、その事前の信念を事前分布に組み込む事も考えられます。また、時系列モデルに素朴なARモデルとProphetを用いましたが、場合によってはRNNを用いることもできます。さらに、集約データの分解の比率も今回は時間に対して独立でしたが、時間方向に依存関係のあるようなモデルの拡張も考えられます。

まとめ

本研究では、集約された時系列データは長期間あり、集約されていない時系列データは直近の短期間しか手に入らない状況下で、集約されていない時系列の予測をおこなうタスクに取り組みました。アプローチとして、集約された時系列データを細かい粒度に分解しつつ時系列モデルから予測する確率モデルを構築しました。実際に集約されていないデータが少ないとき、予測精度が高いことを実験的に示しました。

最後に、インターンの中盤にこのテーマに切り替え、残りの短い時間の中で、メンターのお二人の指導があったおかげで最後までやり遂げれました。本当にありがとうございました。

参考文献

[1] Taylor, S. J., & Letham, B. (2018). Forecasting at scale. The American Statistician, 72(1), 37-45.

[2] Figurnov, M., Mohamed, S., & Mnih, A. (2018). Implicit reparameterization gradients. In Advances in Neural Information Processing Systems (pp. 441-452).

[3] Kingma, D. P., & Welling, M. (2013). Auto-encoding variational bayes. arXiv preprint arXiv:1312.6114.

[4] Hourly Energy Consumption https://www.kaggle.com/robikscube/hourly-energy-consumption

[5] Air Passengers https://www.kaggle.com/abhishekmamidi/air-passengers

[6] Recruit Restaurant Visitor Forecasting https://www.kaggle.com/c/recruit-restaurant-visitor-forecasting

[7] Hyndman, R. J., & Athanasopoulos, G. (2018). Forecasting: principles and practice. OTexts.

[8] Laptev, N., Yu, J., & Rajagopal, R. (2018). Applied time series transfer learning.

[9] Law, H. C., Sejdinovic, D., Cameron, E., Lucas, T., Flaxman, S., Battle, K., & Fukumizu, K. (2018). Variational learning on aggregate outputs with Gaussian processes. In Advances in Neural Information Processing Systems (pp. 6081-6091).

PFNが提供する教育コンテンツについて

Hiroshi Maruyama

2019-10-07 15:38:56

PFNフェローの丸山(宏)です。2月にプログラミング教育についてのブログを書きました。またそれに合わせて制作した教材を利用して、6月に弊社カフェテリアで、小学生を対象にした体験教室を開催しました。この体験教室については、丸山(史郎)がロボットカーの体験教室について西澤が火星語翻訳を題材にした教材について書いています。今回、山梨大学と共同で、高専・大学学部向けの教材 ロボットカーで学ぶ深層学習の基礎 を開発しました。このブログでは、これら一連の教育関連の活動について、その意義と全体像をもう一度整理してみたいと思います。

また、付録に、現在PFNが提供する教育用コンテンツのリストがありますので、そちらもご利用ください。

古典的プログラミング

2016年に文部科学省が主宰する「小学校段階における論理的思考力や創造性、問題解決能力等の育成とプログラミング教育に関する有識者会議」は、議論の取りまとめを公表し、その中で

自分が意図する一連の活動を実現するために、どのような動きの組合せが必要であり、一つ一つの動きに対応した記号を、どのように組み合わせたらいいのか、記号の組合せをどのように改善していけば、より意図した活動に近づくのか、といったことを論理的に考えていく力

プログラミング的思考と呼び、それをこれからの時代における普遍的な能力として教育課程に組み込んでいく必要を訴えました。ここで言う「プログラミング」は、アルゴリズムを実行するステップを明示的に書き下すタイプの通常のプログラミングで、このようなプログラミング作られたソフトウェアをここでは古典的ソフトウェアと呼ぶことにしましょう。

ソフトウェア2.0

古典的プログラミングでは、「計算機にやってほしいこと」を記述するのに、計算のステップを明示的に計算機に指示するプログラミング方法しかありませんでした。しかし、それが計算機に対する唯一のプログラミング方法でしょうか。深層学習による帰納的プログラミングにおいては、入出力の例示(訓練データセット)を与えることによって「やってほしいこと」を記述します。Optunaのようなベイズ最適化ツールは最大化(最小化)したい関数の、特定の点の値を返す「オラクル」を記述することによって「やってほしいこと」を記述します。どちらも、計算のステップは記述しません。このようなプログラミングによるソフトウェアをTeslaのAndrej Karpathy氏はソフトウェア2.0と呼んでいます。

ソフトウェア2.0では、計算機内部で実行されるアルゴリズムを知らなくても構いません。「やってほしいこと」を伝える方法さえ知っていれば計算機というツールを使うことができのです。たとえば乗換案内というツールを考えてみましょう。「やりたいこと」は出発地と目的地を指定することで伝えることができます。場合によっては、航空便を使わない、とか時間よりも価格を重視する、とかの最適化もできます。乗換案内を実装している中のアルゴリズムをご存知でしょうか。基本は初期の人工知能研究の成果、たとえば手段目的分析(means-end analysis)などの探索アルゴリズムのようなものだと思います(私は中身を見たわけではないので、想像にすぎません)が、中身を知らなくても乗換案内を効果的に使うことができます。

乗換案内のような道具を使う際に大事なのは、その中身がどのようなメカニズムで実装されているかではなく、それが提供する機能、すなわち「A地点からB地点まで移動する最短時間(最短コスト)の経路を表示する」というものだと思います。機能さえ知っていれば、中のメカニズムを知らなくても使えるのです。私達が毎日使っているテレビ、スマホ、電車などは、その機能はよく知っていますが、中のメカニズムを正確に知っている人はほとんどいないと思います。それでも上手に使えます。同様に、これからの計算機は、古典的プログラミングを知らなくても、深層学習やベイズ最適化の「機能」だけ知っていれば使える時代が来るのだと思います。

小学生に対して私たちが教育コンテンツを提供するのは、このような未来を想定しているからです。

深層学習の正しい理解と普及

長期的には「やってほしいこと」を記述するだけのソフトウェア2.0的なプログラミングが可能になると思いますが、一方で、直近では深層学習という新しい技術を正しく理解し、社会問題の解決に効果的に使っていくスキルが求められます。深層学習は人工知能研究における偉大なブレークスルーですが、それだけで人間の知性のような、いわゆる「汎用人工知能」が実現できるわけではありません。ホーキング博士が言う「人間を超えるAI」は、まだSFの世界の話であり、現在の深層学習技術の延長上にはない、というのが多くの人工知能研究者の意見です。深層学習にできること、できないことを正しく理解し、それを等身大に発信していくことが私たちには求められています。

PFNが提供する「ディープラーニング入門 Chainerチュートリアル」などの教育コンテンツは、これは社会で実際に深層学習を利用する社会人の方々、あるいは卒業後にそのような職種につきたいという大学生・大学院生の方々に対して、この技術を正しく理解して、正しく有効に活用していただきたい、という意図で提供しているものです。このため、深層学習のベースとなる数学や確率・統計の理解を含め、記述の正確性に重点を置いたコンテンツになっています。

今回山梨大学の牧野先生・西﨑先生と共同で作らせていただいたコンテンツは、より間口を広くして、高等専門学校から大学学部レベルの学生の方々に、深層学習に興味を持っていただく内容になっています。このため、レゴ(R) マインドストーム(R) EV3というロボットカーを実際に深層学習で制御して走らせてみる、というハンズオンスタイルの教材になっています。また、ルールベースの古典的プログラミングと深層学習によるSoftware2.0のプログラミングを対比して学べるようになっています。深層学習の訓練(学習)を含めすべてのPythonプログラミングがRaspberry Pi上で完結するように設計されていて、クラウドに依存することなく、授業を実施することができます。このあたりは、ワークショップ型の授業の経験豊富な牧野先生・西﨑先生のノウハウが存分に活かされています。

今後もPFNは、将来を見通して、社会にとって必要な教育コンテンツを、初等教育からリカレント教育まで幅広く提供していきます。

PFN提供教育用コンテンツ一覧

いずれのコンテンツも、自習や学校での授業には自由にお使いいただけます。

大学・大学院・社会人向け

高校・高専・大学学部向け

初等教育向け 

 

PFN Dayの紹介

海野 裕也
リサーチャー

2019-09-27 12:31:38

5月から執行役員になった海野です。Preferred Networksでは昨年の7月より、PFNDayという全社員参加の社内カンファレンスを3〜4ヶ月に1回開催しており、私はその運営をやっております。

続きを読む »

Chainerモデルのさらなる高速化、デプロイの簡便化、可搬性の向上に向けた実験的な取り組みについて

Shinichiro Hamaji

2019-01-25 16:06:16

PFN のエンジニアの浜地です。入社以来取り組んできた実験的なプロジェクト Chainer-compiler を github で公開しました。まだ実運用に投入していける段階では無いですが、面白いものになってきているのではないかと思うので、紹介させてもらいたいと思います。

https://github.com/pfnet-research/chainer-compiler

昨年末、 PFN は ChainerX をベータリリースしました。 ChainerX は Chainer の使いやすさを維持しつつ、 Python で実装されていた部分を C++ 実装で置き換え、以下の3つを実現するものでした。

  • モデルの実行を高速化する
  • Python の無い環境でもデプロイ可能にする
  • CPU/GPU以外への移植を容易にする

Chainer-compiler プロジェクトは ChainerX を利用して、上記の ChainerX の目標をさらに押し進めるツールチェインを開発しています。現状、以下のようなコンポーネントからなります。

  1. Python 構文木を解釈して、計算グラフを、拡張された ONNX フォーマットとして取り出す
  2. 拡張 ONNX で表現された計算グラフを変換して、高速化や自動微分をし、コード生成をする
  3. ChainerX の C++ 部分を用いて、生成されたコードを実行する

想定している使い方の例をいくつか紹介すると

  • オペレーションが逐次実行される Chainer/CuPy/ChainerX の計算モデルと違って、いったん複数のオペレーションからなる計算グラフが作られるので、オペレーションをまたいだ命令融合や、データフォーマットの事前変換などの最適化ができる
  • 上記の1,2を事前に実行して、3の部分だけをデプロイ環境で実行することによって Python の無い環境でのデプロイが手軽にできる
  • 2のコード生成部のターゲットを追加することによって、特に静的グラフを前提としたモデル実行系や用途特化チップ(例えば MN-Core)での実行をサポートしていける
  • 2,3の部分のみを使うことによって、 ONNX-chainer や他の ONNX 生成系で作られた ONNX モデルを実行する。また、これに限らず、他のツールとの連携は、色々な組み合わせが考えられると考えています

などがあります。上記以外にも、色々と実験的なことをやっていきたいと考えています。

深層学習用コンパイラは、他の深層学習の領域同様、競争が激化していて、とても面白い領域だと思います。深層学習用コンパイラとひとことで言っても、用途や目標によって色々なものがあるのですが、 chainer-compiler プロジェクトでは Chainer のフレキシビリティをなるべく損なわない形でモデルをコンパイルすることを、重要な目標の一つとして考えています。そのため、次元が固定されていない tensor や Python の条件分岐・ループ、 Python のリストなども表現できるようにしています。多くの深層学習コンパイラは最適化に集中していて次元が静的であることを前提にしているものが多いので、この点は少しユニークな点になりえるのではないかと思っています。

この投稿では、 Chainer モデルをコンパイル・実行する実験的なプロジェクトについて紹介しました。結構広い領域について、色々とやりたいことがあって、楽しく作業しています。こういう作業に興味がある方は、ぜひ PFN への応募をご検討ください。この投稿では説明しきれなかった点も多くあります。技術的な話でも採用の話でも、なんでも疑問点がある方はご連絡いただければ、と思います。

最後に、 chainer-compiler プロジェクトに協力して下さっている全ての方々に感謝します。特に、「Chainer を使った Python コードを ONNX に変換する」というテーマに取り組んでもらった、インターンの佐藤さんの多大な貢献に感謝します。

Google Colaboratoryを用いた機械学習・深層学習の入門教材を無料公開(健康・医療向けデータを用いた実践編も含む)

Shunta Saito
リサーチャー

2018-12-20 13:13:56

PFNのリサーチャの齋藤です。今年は色々な仕事に取り組みました。本記事では、日本メディカルAI学会が新しく始める公認資格へ向けたオンライン講義資料について書きます。

昨今、機械学習や深層学習といった技術はIT企業のみならず様々な分野で活用されるようになってきました。その一つに医療分野があります。しかし、忙しい臨床医・研究医・その他医療従事者の方々の中には機械学習や深層学習の可能性を知りつつも、なかなか自ら手を動かして学び、それを医学の研究や医療の現場へ生かしていく時間がとれない方もいらっしゃいます。その大きな理由の一部には、特に深層学習を実践的に用いる方法を学ぶ場合に必要となる計算機環境の用意および環境構築が難しいといった点があります。

そこで、PFNは、Google Colaboratory(以下、colab)を用いた学習教材を作成しました(なお、資料の一部は株式会社キカガクの協力を得て執筆されています)。本資料は、日本メディカルAI学会公認資格:メディカルAI専門コースのオンライン講義資料として作られたものですが、メディカルAI学会所属でない方にも自由にご覧いただけるよう、全ての資料をウェブで無料公開しています。colabを用いると、Googleアカウントさえあれば誰でも無料でGPUが有効な環境の上でPythonコードを実行することができます。従来は、GPUを搭載したコンピュータを自前で用意したり、また用意できたとしても様々な深層学習フレームワークを動作させられるように環境構築を行う部分などでつまづいてしまうケースも多くありましたが、colabを用いればこれらの行程をスキップして本質的に重要なコーディングの部分から学び始めることができます。

今回の学習資料は、全てcolab上で執筆を行い、colabから直接GitHubへ.ipynb形式のファイルをpushし、Pythonパッケージのnbsphinxを用いてそれをHTMLへ変換してドキュメントサイトを構築するというワークフローで作成されました。また、colabで書いたプログラムが実行時に生成したファイルは、簡単にGoogle Driveへコピーすることができるため、学習の結果得られた成果物を再利用するといったことも行いました。具体的には、本資料は1章が2〜3時間で終えられるように作られていますが、中には深いニューラルネットワークの学習に必要な時間だけで数時間かかってしまうものもあります。そういった場合には、あらかじめ筆者らで途中までcolab上で学習を行って学習途中のスナップショット(ある時点のネットワークの重みなどをファイルに保存したもの)を作成しておき、記事中ではそれをダウンロードしてきて途中から学習を再開するという形にすることで、資料中のコードを実行したあと待機する時間を減らしつつ、実際に学習が行われる様子を体験することができるよう工夫しています。

本資料は全8章からなり、機械学習に必要な数学の基礎から深層学習を用いたMRI画像のセグメンテーション、血液の顕微鏡画像からの物体検出、DNA配列解析、心電図の信号波形データの時系列解析といった具体的な応用まで、その背景にある理論の概説から実行可能なコードを用いた実践的な解説まで広く扱っています。目次は次の通りです。

1章:機械学習に必要な数学の基礎

1章では、深層学習に限らず、機械学習の様々な手法を学んでいく際に必須となる微分の知識、線形代数の基礎、そして確率・統計の基礎について、最低限の知識をおさえるために簡潔にまとめています。

2章:機械学習ライブラリの基礎

2章では、機械学習や深層学習の領域では広く用いられているPythonと、その代表的な数値計算ライブラリであるNumPyに慣れるために、重回帰分析をNumPyのみを使って実装する方法をコードを実行しながら学んでいけるようになっています。また、様々な機械学習アルゴリズムを実装しているScikit-learnというライブラリの使い方も紹介しています。

3章:ニューラルネットワークの基礎

3章では、ニューラルネットワークの基礎について、図や動画を用いてできるだけ分かりやすく說明しました。NumPyを用いて誤差逆伝播法(バックプロパゲーション)を実装し、colab上で実行してみることで、具体的な数値を見ながらニューラルネットワークの学習の仕組みを理解することができます。

4章:Deep Learningフレームワークの基礎

4章では、より複雑なニューラルネットワークを扱いやすくするために深層学習フレームワークの一つであるChainerを用いた画像分類の問題に取り組みます。ここからは、colab上でGPUを使ったより実践に近いプログラムを実行することで深層学習を活用していく際のエッセンスを効率よく学びます。

5章:実践編: MRI画像のセグメンテーション

5章では、心臓MRI画像の中から左心室の領域を抽出するセマンティックセグメンテーションのタスクに取り組みます。Chainerを用いて色々なニューラルネットワークを実装し、そのパフォーマンスの違いを見てみます。ChainerCVという画像を取り扱う場合に便利なChainerの追加パッケージの使い方も簡単に說明しています。

6章:実践編: 血液の顕微鏡画像からの細胞検出

6章では、血液の顕微鏡画像の中から赤血球、白血球、血小板の3種類の物体を検出する物体検出タスクに取り組みます。物体検出のためにデザインされたニューラルネットワークの中から代表的なものをいくつか概説し、ここではSingle Shot Multibox Detector (SSD)という手法を使って自ら用意したデータセット(ここでは血液の顕微鏡画像)を用いるモデルの訓練方法を解説しています。本章でもニューラルネットワーク自体の実装コードの転用や評価のためにChainerCVを活用しています。

7章:実践編: ディープラーニングを使った配列解析

7章では、DNA塩基配列を入力として受け取り、配列中の長距離相互作用を考慮した上でDNA塩基配列と特定の転写調節因子の結合可能性を予測するために1次元Dilated Convolutionを使ったニューラルネットワークを訓練する方法を說明しています。

8章:実践編: ディープラーニングを使ったモニタリングデータの時系列解析

8章では、心電図の信号波形データを入力として、不整脈を検出するという時系列解析の問題に取り組んでいます。この章では1次元Convolutionと1次元Dilated Convolutionを使った教師あり学習による時系列データの分類方法について解説しています。

本資料を通じて、機械学習や深層学習の分野について学び始める方が増えることを期待しています。

また、本資料のうち1章〜3章の作成にあたっては株式会社キカガクの吉崎様にご協力をいただきました。この場を借りてお礼申し上げます。そしてGoogle Colaboratoryがなければこのような文章を中心としつつも実行可能なコードを埋め込むことで実践的な資料としても成り立たせることはできませんでした。合わせてお礼申し上げます。

【関連リンク】

日本メディカルAI学会:https://www.japan-medical-ai.org/
株式会社キカガク:https://www.kikagaku.co.jp/
深層学習フレームワークChainer https://chainer.org/

ChainerとTensorRTの間をつなぐchainer-trtの公開

Daichi Suzuo
エンジニア

2018-12-13 17:00:28

この度、Chainerで開発したモデルをNVIDIAの推論エンジンTensorRTに変換しNVIDIA GPU上で高速に推論するための実験的ツールchainer-trtをOSSで公開しました。この記事ではその概要、開発の背景と位置づけを簡単に紹介したいと思います。

https://github.com/pfnet-research/chainer-trt.git

はじめまして。PFNエンジニアの鈴尾(すずお)です。いつも同じアバターを使っているので、社内や社外でお魚さんと呼んでいただけることもあります。

深層学習技術の急速な発展に伴って、いよいよエッジへの推論器のデプロイという形での実用化が進んできました。学習時の速度がモデル開発の効率に直結するように、推論時の速度は製品に載せるハードウェアのコストに直結するため、高速に推論できることは極めて重要です。ここで推論とは、ニューラルネット(NN)の順伝搬処理のみを実行し解釈可能な出力(例えば、物体検出の結果など)を得るプロセスを指します。Chainerは一般に非常に高速な深層学習フレームワークとして知られ、また学習に用いたコードをほとんどそのまま推論に用いることができます。しかしながら、特定の種類のデバイス上で、入力の大きさやアーキテクチャおよびパラメータが固定されたNNの順伝搬処理のみに注目した場合、最適化の余地はまだまだあります。

NVIDIAのTensorRTはこのような需要に対応するため開発された推論エンジンの一つです。
Deploying Deep Neural Networks with NVIDIA TensorRT
How to Speed Up Deep Learning Inference Using TensorRT | NVIDIA Developer Blog

TensorRTは完全に静的なNNと固定のデバイス(GPU)を前提とし、あらかじめ深さ方向ないしは幅方向に隣接する層を可能な限り統合するなどの計算グラフレベルの最適化、指定されたGPU上で最も実性能の良いCUDAカーネルを計測に基づいて自動選択するなどの実装レベルの最適化、計算グラフ中の破棄可能なメモリ領域を同定し再使用するなどのメモリレベルの最適化、および16bit浮動小数点数や8bit整数を用いた低精度計算へのpost-training変換などを施します。これをビルド段階と呼びます。

推論時は、このビルド段階で構築した実行計画に基づいて処理を行うだけであるため、NVIDIA GPU上で極めて高速に順伝搬処理を行うことができます。

これまでChainerで開発・学習したモデルをTensorRT推論器に変換する仕組みはONNXを介する方法しかありませんでした。この場合少々複雑なTensorRTのC++ APIを理解し、CPUおよびGPU上の生ポインタを責任持って管理するなどの作業が生じるため、これらを可能な限り吸収しかつChainerからTensorRT化をスムーズに行うことができないかを検証するべく、実験的ツールchainer-trtを開発しました。

一言でまとめるとchainer-trtは、TensorRTのC++ APIを用いてTensorRTにNNの構造とパラメータを教え最適化を走らせることによってChainerのモデルをTensorRT推論器に変換し、またそれを実行する、といった作業を行うための薄いラッパーです。

chainer-trtの仕組み

chainer-trtを使う上では、大きく3段階の作業が必要です。

1段階目は、PythonによってChainerの流儀で書かれた順伝搬コードをもとに、計算グラフをchainer-trt独自の中間形式に書き出すプロセスです。chainer-trtでは、これをModelRetrieverと呼ぶPythonパートが担当します。

計算グラフの全ての情報を得るのは、ちょうどChainerの機能の一つであるComputationalGraphと同じ仕組みで行われています。すなわち、順伝搬後に得られる出力Variable(chainer.VariableNode)から計算グラフを終端(入力側)まで順にたどっていく方法です。多くの場合、順伝搬のコードそのものに対するchainer-trt対応のための特別な変更は必要ありません。

中間形式の実体は1つのディレクトリであり、これは計算グラフの構造を表すmodel.jsonと各層の重みを表す*.weightsファイルを含みます。

下記のスニペットは、ImageNet学習済みのResNet50モデルを中間形式に書き出す処理です。見ての通り、通常の推論コードに少しchainer-trtの要素を外付けしているだけです。

import numpy as np
import chainer
import chainer_trt

# NNを用意
net = chainer.links.ResNet50Layers()

# ダミー入力を作成
x = chainer.Variable(np.random.random((1, 3, 224, 224)).astype(np.float32))

# ModelRetrieverを作成し、入力に名前をつける(任意)
retriever = chainer_trt.ModelRetriever("resnet50")
retriever.register_inputs(x, name="input")

# ダミー入力を用いて順伝搬を実行
with chainer.using_config('train', False):
    with chainer_trt.RetainHook():    # おまじない
        y = net(x)['prob']

# 計算グラフを取得し、全ての情報を保存する
retriever(y, name="prob")
retriever.save()

2段階目は、先程書き出した中間形式の情報を読み込みTensorRTのC++ APIを用いて推論器のビルドを走らせるプロセスで、chainer-trtのC++パートがこれを行います。推論を実行させたい対象デバイスの上でchainer-trtのビルド実行関数を呼ぶと、まもなくそのデバイス専用の推論器(実体は1つのファイル)ができあがります。

#include <chainer_trt/chainer_trt.hpp>
...

// ModelRetrieverの出力ディレクトリを指定し、推論エンジンを構築・保存する
auto m = chainer_trt::model::build_fp32("resnet50");
m->serialize("resnet50/fp32.trt");

上記のスニペットはユーザの書いたC++からこのビルド処理を行う例ですが、TensorRTの機能であるINT8量子化を行わない場合については標準でコンパイルされる小さなツールを下記のように呼ぶだけでも全く等価な推論器が構築できます。
(INT8量子化を伴う場合は、キャリブレーションと呼ばれるプロセスをNNごとに行う必要があるため、専用のビルドツールをユーザが実装する必要があります。)

% tensorrt_builder -i resnet50 -o resnet50/fp32.trt

3段階目は、その推論器を用いて推論を実行するプロセスで、chainer-trtのC++パートがこれを行います。ユーザはまず入力データと出力先バッファをCPU上ないしGPU上に用意し、それぞれがNNのどの入力・出力に対応するか(1つのNNは複数の入力や出力を持つことができ、これを名前で識別できます)などの情報とともにchainer-trtの推論実行関数を呼び出します。すると推論処理が走り、出力結果が返ってきます。

厳密にはビルドされた推論器のファイルはchainer-trtに依存するものではなく、chainer-trtを経由せず直接TensorRTのC++ APIを呼んで利用することができます。しかしながらchainer-trtは典型的なユースケースに関してメモリ管理や入出力の指定方法などを簡易化しCUDAの煩雑なコーディングをある程度隠蔽しているため、chainer-trtでビルドした推論器はchainer-trtで実行するのが便利でしょう。

#include <chainer_trt/chainer_trt.hpp>
...

// 構築した実行エンジンを読み込み、ランタイムを作成
auto m = chainer_trt::model::deserialize("renet50/fp32.trt");
chainer_trt::infer rt(m);

// CPU上の入力・出力バッファを用意し、入力バッファに入力データを読み込んでおく
std::vector<float> x(...);
std::vector<float> y(...);
load_input(x, ...);

rt.infer_from_cpu(1, {{"input"s, x.data}}, {{"prob"s, y.data}});

// 出力がyに入っている

同梱されているImageNetおよびYOLOv2のサンプルを用いた場合の1バッチ推論の平均実効時間、すなわち画像を入力して結果が得られるまでの推論レイテンシを測定してみました。

モデル Chainer FP32 (ms/img) TensorRT FP32 (ms/img) TensorRT INT8 (ms/img)
VGG16 4.713 2.259 1.384
GoogLeNet 13.809 0.974 0.624
ResNet50 19.062 2.145 0.851
YOLO v2 20.749 (12月14日訂正) 6.151 4.579

環境: GeForce GTX 1080Ti, i7 7700K, CUDA 10, TensorRT 5.0, Ubuntu 18.04, Chainer 5.1.0, ChainerCV 0.11.0

GoogLeNetなどの細かな層が多数積み重なったようなNNでは演算量に対して計算グラフ構築のオーバヘッドが相対的に多くなるため、特にTensorRTの活用による高速化の恩恵を受けやすい傾向があります。ただしChainerベースの推論であっても、バッチ数を大きくし複数のCUDAストリームで推論を並列実行するなどの工夫によってスループットはかなりTensorRTベースの推論に近づけることができます。推論のレイテンシが特に重要な場合は、TensorRTで推論器を構成することがきわめて有効です。

コードに同梱しているREADMEドキュメントでは、導入方法(現在のところ、手動でのコンパイル作業が必要です)、より詳細な動作原理、並列化・バッチ化による高スループット化の方法、INT8量子化の使い方、numpy/cupy arrayから直接推論を走らせることのできるPythonインタフェースの使い方など詳細を解説しています。

社内での活用

社内ではいくつかのプロジェクトでchainer-trtを活用して推論を高速化しています。

最も典型的な活用例としては、実製品となる組み込み機器上での画像認識器の開発が挙げられます。計算能力上の制約が多い現場では、TensorRTの活用による高速化が必要不可欠でした。

面白いところでは、探索問題における評価関数を近似するNNを学習しこれをTensorRTで高速化することで全体の処理時間を大幅に短縮するという活用例がありました。別の例としては、強化学習のような問題設定において正確だが計算時間かかる物理シミュレータを同様にNNで近似後TensorRTで高速化することで学習全体を高速化するという例もあります。

Menohとの関係

次に、Menohとの関係についても述べておきたいと思います。

PFNでは、ONNXベースの推論ライブラリMenoh(R)を今年6月にリリースし、現在も活発に開発しています。MenohはONNXとして書き出したNNをもとに推論を行うライブラリで、主に以下のような極めて優れた特長を持っています。

  • Python/C++に限らない豊富な言語バインディング
  • ONNXを用いることで、Chainerのみに必ずしも依存しない汎用性
  • プラガブルなバックエンド

特にバックエンドとして、もともとMenohはIntel製CPU上で深層学習のための演算を高速に実行するためのライブラリMKL-DNNを用いていましたが、現在TensorRTバックエンドを選択できるようにするべく開発を進めています。

これに対してchainer-trtは、

  • ChainerのモデルをTensorRTに迅速に変換することのみを目的とする
  • ONNXに依存しない

といった思想で設計されています。

2点目は特に重要で、ONNXに依存する選択をしている限りは現在のONNXで表現できないオペレータを含むようなNNは原理的に扱えないという困難があります(※1)。TensorRTの場合はプラグインという仕組みにより、TensorRTさえも標準サポートしていないような任意のオペレータをユーザが自らCUDA実装しNN内で使うことができますが、ONNXを中間形式とした場合この自由度がONNXの表現能力によって制約されてしまいます。chainer-trtはONNX非依存の独自中間形式をとるという選択をすることで、実装さえすれば提案されたばかりのオペレータなどを迅速に利用可能にできるような作りにしました(※2)。
※1: ONNXに任意の拡張を施せるようにする構想はいくつか検討されているそうですが、当面の間は使えるオペレータの種類に制約がある状態は続くと考えられます。
※2: もちろんこのように実装されたプラグインオペレータに関してはTensorRTによる自動的かつ高度な最適化の対象とはなりませんが、そのようなオペレータの存在のみによってNNのTensorRT化自体を諦める必要がなくなります。

これらのことから、ごく一般的なオペレータのみで構成されるほとんどのNNは、Menohによって十分にその超高速推論の恩恵に与れることと思います。ONNXで表現できないオペレータを使いたい、またそのオペレータの独自実装を自ら行うことができる方にはchainer-trtが役に立つでしょう。

歴史的には、実はchainer-trtはONNXが昨秋発表される前より社内で開発しています。したがってONNX非依存という選択をしたというよりは、そうするより他になかった当初の設計のまま今に至っていると言う方が正確な表現です。技術的には、Menohとchainer-trtは全く異なるコードベースから始まっており、情報交換をしつつ独立に開発が進んでいます。

Menohは今後も汎用的な推論ライブラリとして最新の高度な需要に追従するため大規模に開発が継続されていく見込みです。chainer-trtはChainerとTensorRTの間をとりもつ実験的プロジェクトとして、TensorRT本体の各種新機能への追従やカスタムオペレータの拡張などを中心に、またインタフェースやドキュメント改善なども含めた開発をしていく見込みです。

ぜひ実機での推論に課題を抱えている皆様のお役に立てればと考えております。また、皆様からのフィードバックをお待ちしています。

「人間中心のAI社会原則検討会議」に参加しました。

土井 裕介

2018-05-10 15:39:51

5/8に開催された内閣府主催の「人間中心のAI社会原則検討会議」に出席してきました。

土井と申します。普段は細々とネットワークの研究を行いつつクラスタ関係とりまとめをやっています。出身大学がinterdisciplinaryなところなので、いろいろな領域に首を突っ込んでいます。そのような活動の一環で、社内のslackにAIと社会に関して考えるチャネルを作り、PFNフェローの丸山を中心として何人かの興味あるメンバーとで、社会動向のウォッチングや、必要な意見表明[1]などをしています。例えば、2017年頭に「AI開発ガイドライン(仮称)」へのパブリックコメントをPFN名で提出しましたが、そのパブリックコメントの最初のドラフトは私が書いたものでした。

そんな中、弊社丸山が掲題の「人間中心のAI社会原則検討会議」にお誘いいただきました。ただ、丸山は残念ながらこの日に外せない終日の予定が入っており、代理で土井が参加してきました。参加にあたり、PFNの意見を事前に文書でまとめるようにしたほうが良いだろう、とのことで、「『人間中心のAI社会原則検討会議』に対する意見」[2]としてまとめ、会議に提出しました。あくまで参考資料としてではありますが会議で配布されたので、こちらでもご紹介させてください。

この文書は特に何か難しいことが書いてあるわけではなく、「人工知能」または「AI」と呼んだ時にそれが何を指し示すのかを明確にして議論しないといけない、という話と、ある前提で議論した内容を別の前提に適用するとおかしなことになりますよ、という当たり前の話が書いてあるものです。

PFNとして提出した文書には、世間で「AI」として議論されている内容は主として以下の3つに分類できるのではないか? としています。

  • A. いわゆる汎用人工知能
  • B. ネットワーク化された情報システム
  • C. 機械学習システム

AとCはみなさん何となく理解されるかもしれませんが、これらを混同しているような議論も多いです。ただ個人的には、案外「AI」の文脈でBの話をされる方が多いことに驚いています。例えば証券市場のFlash Crash(自動取引による証券取引の不安定化)を「AIがもたらす問題」として挙げる方がいます。実は、今回の会議の委員にもこういう考えの方がいらっしゃいました。ただ、いわゆる単純なフィードバック制御であっても発散してしまい問題になるケースがあるのと同様、これはソフトウェアによる自動化とこれにともなう高速化、およびその影響範囲を拡大するネットワーク化に起因する具体的な問題です。PFNとしては、こういった問題をわざわざ「AI」などというあいまいな単語を使って議論する必然性はないと考えています。

また、会議の中でタイミングがなく発言できなかった内容をひとつ。「AI」が主語になった議論は個人的にはとてもおかしな議論に見えています。[3]でも書きましたが、上のABCどの定義であっても「AI」の中核はソフトウェアとして実現されます。現実の世界に何かの影響を与えるためには例外なく人間が与えたハードウェア(ソフトウェアを実行させるコンピュータ、コンピュータに供給される電源、外界と作用するためのセンサ・アクチュエータ、等)が必要です。言い換えると、どんな場合であれ「AIの性質を持つソフトウェアを構成要素として持つ何らかのシステム」があってはじめて議論がスタートします。システムには、通常「AI」とはみなされない、様々な技術や安全装置が含まれていて、それらと外界との作用の総体でシステム全体が機能します。我々が考えるべきは、このシステム総体が、人類社会とどのように調和していくかではないでしょうか。個人的には、PFNが機械学習の本質を理解して新しい学習の仕組みを作るように、社会も機械学習やAIと呼ばれる技術・仕組みの性質や限界を理解して、きちんと使いこなす、つまり社会システムの構成要素として人間がAIを主体的に位置付けることが、あるべき「人間中心のAI社会」の姿なのではないかと思います。

今回議論していて「なるほど確かに」と思ったのは、本来AIというのは知能を機械で模倣することで知能を理解しようとする研究の営みあるいはその研究分野を指すことばであった、という点です。これを、特定の機能や製品のラベルに転用した結果、現在はあいまいな単語となってしまいました。ことばは本来他者とのコミュニケーションに用いるものである以上、あいまいな単語を用いた議論では精度が出ません。いくらAIという冠をつけると見栄えが良いからといって、このあいまいさに無自覚なままAIということばにふりまわされた議論を重ねても何も得られません。この機会を有意義な成果につなげるために、引き続き社内でも議論を深めていこうと考えていますし、また議論の立脚点となるべき事実についても情報発信を続けていこうと思います。

references
[1] 人工知能技術の健全な発展のために
[2] 「人間中心のAI社会原則検討会議」に対する意見
[3] ソフトウェアとしての人工知能に関する論点整理 信学技報, vol. 117, no. 471, SITE2017-75, pp. 209-212, 2018年3月.

コミックマーケット93 参加レポート

Taizan Yonetsuji

2018-02-06 11:33:30

コミックマーケット93

PFNでは、2017年12月29日から31日まで、東京ビッグサイトで開催されたコミックマーケット93に我々が開発しているPaintsChainerの企業ブースとして出展してまいりました。

年末にも関わらず、非常に多くの方々にご来展頂き、3日間で1000人を超える方に、プロジェクションマッピングを用いた新しいユーザーインターフェースを体験いただきました。

また、PaintsChainer公式キャラクター「絵愛ちえな」ちゃんのお披露目も行う事が出来ました。


PaintsChainer(ペインツチェイナー)とは

PFNが開発・提供するオンライン線画自動着色サービス。白黒等で描かれた線画ファイルや写真画像をアップロードするだけで、イラスト上の顔や服装、風景等を認識し、完全自動着色または色指定による自動着色をおこないます。

線画に対する自動着色のWebサービス化は世界初で、大きな反響を頂きました。その後、モデルの追加やサイトのリニューリアル等に取り組んでいます。

https://paintschainer.preferred.tech/

 

プロジェクションマッピング上での自動着色

今回のコミックマーケット93のPFNブースでは、紙に書いた絵に色がつくという新たな体験を提供しました。

デジタルデータではなく、実際の紙に描いた線画を専用着色ブースにセットすることで、その線画を4K高画質カメラで読み込み、PaintsChainerが着色し、プロジェクションマッピングを用いて実際の紙に着色されたように投影しました。実際にその場で書いた絵を着色できるということで、時間をかけて力作を描いて下さった方々もおられました。

さらに、着色結果にカラーヒントを与えることで、好きな色に変える機能もプロジェクションマッピング上で提供しました。

例えば、自動着色で黄色に塗られた髪の色を、カラーヒントを与えることにより一瞬にして青や赤など好きな色に変えることができます。

こちらは、もともとWeb版のPaintsChainerにも搭載されている機能ですが、今回は投影により着色された線画紙自体に、絵の具や色鉛筆で着色するかのように色指定ができるインターフェースに作り変えました。こちらもまるで魔法のようだという事で非常に楽しんでいただくことが出来ました。

 

スタイラスペンによって線画に対し直接カラーヒントを与えられるようにし、認識は、テーブルに埋め込んだペンタブレットにて行っています。

 

マンガ向けの着色モデルを限定公開

通常のイラスト向けの着色モデルに加えて、コミケ会場ではマンガ向けの着色モデルも選択できるようにしました。こちらは、今回が初公開のモデルです。

マンガ向けモデルは、Webで無料公開しているイラスト向けモデル(現在は、「たんぽぽ」「さつき」「かんな」の3つのスタイルを公開中)とは異なる学習を行い、マンガが持つセリフ、吹き出し、枠といった特徴に適した着色モデルとなっています。


イラスト用さつきモデルで着色(ノーヒント)マンガモデルで着色(ノーヒント)

(ブラックジャックによろしく 佐藤秀峰 Give My Regards to Black Jack SHUHO SATO )

こちらのマンガモデルは、現在出版社・デジタル配信事業者と共に実用化を目指しています。

 

漫画版は公開利用行っておりませんが、通常のPaintsChainerの3モデルは今回コミックマーケット93で体験いただいたものと同じものがWeb上で無料でご利用頂けます。是非ご利用ください。

https://paintschainer.preferred.tech/

Amazon Picking Challenge 2016 ~ドイツ・ライプチヒにて~

神谷保徳

2016-09-02 16:25:17

神谷です。

7月上旬、ドイツ・ライプチヒで開催されたAmazon Picking Challenge(以降APC)に、PFNとして参加しました。これは、Amazonが主催しているロボット競技会で、Amazonの倉庫内に在庫された商品から、購入された商品を棚から集めるタスクの自動化を想定した競技です。今回で2回目で、前回からのタスクである、指定された商品を棚からロボットで取得しカゴに入れるPickタスクと、新しく加わった、カゴに入っている商品を棚に入れるStowタスクの、二つのタスクがあります。Pickタスクは、前回から商品の種類や難易度も上昇しています。

実際に我々が作り上げたシステムの技術内容に関しては、PFI&PFNセミナーで概要ではありますが既に発表しており[1][2]、また日経Roboticsに弊社システムの解説記事や弊社岡野原のコラム、APC全体の技術解説も載る予定ですので、今回はドイツ・ライプチヒにおいて、実際に我々がどんなことを行っていたか、旅行記風に紹介しようと思います。


6/28、お昼頃、会場入りしました。スーツケースをたくさん持っているのは、手持ちのロボット部材や、工具があるためです。ぎりぎりまで開発を行っていたため、手持ちとなった物が多くあります。
DSC01675

輸送されたロボットアーム達。実は、輸送に時間がかかるため、本番用ロボットアームは先に送り、直前までの開発には別のロボットを使用していました。それにまつわる様々なトラブル回避もありました。そうまでしたのは、それだけ短期間での開発だったためでもあります。
DSC01691

箱開け。きれいに、きっちりと梱包されています。ぎりぎりまでの輸送タイミング交渉、また税関など、この輸送自体に関してもかなりの問題解決/回避が行われました。
DSC01701
DSC01699

設置の様子。設置に関しても準備を凝らしていましたが、それでも電圧の違いによるトラブルが少しありました。ロジスティクスの方と協力し、短時間で完了しました。
DSC01707

本番前々日
設置後、調整と改良が続きました。
本番前の調整では、奇跡的に隣にあった、ホームセンターが大活躍しました。例えば、照明条件の違いから、ライトを購入したり。ロボット競技では、現地でのイレギュラーがつきものです。
DSC01840

本番前日
調整と改良を続けます。
DSC01847

また、Amazon.deの見学にも行きました。
DSC01775

試走のスケジュール表。試走では本気を出していない(動作の確認に徹している)チームもあり、まだまだ分かりません。
DSC01789

本番直前。ぎりぎりまで改良を行いました。
DSC01999

そして本番。オレンジのTシャツの人が、Amazonの委員の人です。ターゲットのアイテムと、棚内のアイテムの配置は数パターンあり、くじで選択する形です。委員の人がアイテムを慎重に配置していました。また、棚のずらしも、配置前に行われます。
DSC02006

本番中。ハラハラドキドキ。本番のロボットの動作の様子はYouTubeに上がっています[3]。
DSC02007

終わりました。幾つかミスはありましたが、満足のいく動作でした。
DSC02009

そして表彰式
DSC02015

表彰式後の一コマ
DSC02018

その夜のパーティ。みんな笑顔。
他のチームの方やAmazonの方ともいろいろなお話をしました。
DSC02026

次の日はデモです。試合までは調整であまり見られなかった他チームのシステムについて、拝見、質問をしました。我々が開発中に気付かなかったアイディアも幾つかありました。また、我々のシステムについてもいくつも質問を受けました。
DSC02036

お片付け。ロボット達はまたPFNに戻ってきます。おつかれさまです。
DSC02038



この数か月間、非常に大変でしたが、結果も伴い、とても良い形となりました。
DSC02011

—————————————————————————
[1]http://www.slideshare.net/pfi/amazon-picking-challenge
[2]https://www.youtube.com/watch?v=gqcO8ZX0jB8
[3]https://www.youtube.com/watch?v=w7NgejZMSsA

Deep Learningと音声認識

preferred

2015-07-16 13:00:10

西鳥羽です。こんにちは。

本日セミナーで「Deep Learningと音声認識」という内容で(ustreamで公開されているけども)社内セミナーで紹介させて頂きました。タイトルは前回の「Deep Learningと自然言語処理」に被せてます。

Broadcast live streaming video on Ustream

こちらがその資料になります。尚、セミナーでは「話し言葉コーパス」とすべきところを「書き言葉コーパス」としてしまっていました。資料では訂正してあります。

また、個々の参照は以下の通りです。

CTC関数に関しては以下が詳しいです。Chainerで実装してますがちゃんと動くようになったら公開したいですね。