深層学習モデルを用いたノンパラメトリック回帰問題に関する最近の研究

大野 健太
エンジニア

2019-11-05 11:03:46

図1:ReLU-MLPによる2次関数の近似.このネットワークを用いるとHölder関数を効率的に近似できる([Yarotsky, 2017]より引用)

 

深層学習モデルはこれまで様々な機械学習タスクにおいて成功を収めてきています.それに触発され,深層学習モデルの成功要因を理論面から解明する試みが盛んに行われています.特に深層学習の理論研究(特に統計的学習理論と呼ばれる分野)では,主に3つの問題提起がなされ,それに対する様々な回答がなされています [Poggio et al., 2016]:

  • 表現能力:深層学習モデルはどんな関数を(効率的に)推定できるのか [Cybenko, 1989; Telgarsky, 2016; Eldan and Shamir, 2016; Sonoda and Murata, 2017]
  • 最適化:なぜ(確率的)勾配法が「良い」解を見つけることができるのか [Li et al., 2017; Jacot et al, 2018; Du et al., 2018; Allen-Zhu et al., 2018]
  • 汎化能力:深層学習モデルは多数のパラメータを持つにも関わらず,なぜ過学習せずに汎化するのか [Hardt et al., 2016; Belkin et al., 2018; Arora et al., 2018]

(関連文献を網羅することはできませんので代表的な研究や最近注目されている論文のみを挙げました,それぞれのトピックに興味のある方は上記の論文の関連研究を参照ください.また,[Suzuki, 2019b]も参考にしてください)本稿では,ノンパラメトリックな回帰問題における,表現能力と汎化性能に関する一連の研究を紹介します.

続きを読む »

分散深層学習における耐故障性と可塑性

Kota Uenishi

2019-11-01 10:22:40

ImageNetを15分で学習して以来 [1]、Chainerと沢山のGPUを使って深層学習を並列化し、一回の学習に必要な時間を大きく短縮することができるようになりました。その後、ImageNetの学習は深層学習における並列化 ・高速化のデファクト標準ベンチマークとなりました [2]。それと同時に、深層学習の並列化および大規模化は進み、複数GPUどころか複数ノードで学習することは当たり前のこととなりました。深層学習の計算が大規模化し所要時間はどんどん短くなりましたが、一般的にはノードが増えれば増えただけ部分故障の確率は高くなります。また、大規模なクラスタでは個々の分散ジョブをスケールアウトしたりスケールダウンする機能、つまり可塑性をもとにした計算資源のやりくりが運用上重要になってきます。そこでChainerを拡張し、分散深層学習に耐故障性だけでなく可塑性を導入する実験を行いましたので、ここで報告したいと思います。また、実験に利用したライブラリを eChainer として公開しました [3]。

深層学習の計算が大規模化し所要時間はどんどん短くなりましたが、一般的にはノードが増えれば増えただけ部分故障の確率は高くなります。そこで、部分故障があっても計算が継続できるような仕組みがあれば、このような問題に頭を悩ませるようなこともなくなります。

また、ノードが途中で減っても動作継続できるということは、大抵の場合はノードを途中で追加しても動作継続できるということです。これができると、学習を実行中にGPUを追加することで学習を加速することができます。これは、大規模なクラスタ環境ではとてもメリットが大きいことで、例えば、ジョブ終了や失敗などが原因で、クラスタ上の別の場所で余っていた計算資源を動的にジョブに追加することで、ジョブを早く終わらせることができるようになり、クラスタ上のリソース配分の柔軟性が増します。リソース利用効率を上げることができ、同じ計算基盤への投資でより多くのリターン(よいモデル、よい計算結果)を得ることができるようになります。動的に計算資源と追加したり減らしたりできることを、そのシステムに可塑性(Elasticity)があるといいます。 eChainer というプロトタイプ名は、 Elastic Chainer を短縮してつけたものです。

基本設計とシステム構成

Chainerには、分散学習用の内部コンポーネントが含まれており、ChainerMN という名前がついています。これを使ったこれまでの分散深層学習については、弊社鈴木の解説[4] や、その肝となる AllReduce の計算についてはインターンの上野さんの寄稿 [5] をご覧ください。ChainerMNの Communicator [6] [7] は、MPIにおけるCommunicatorをPythonのインターフェースクラスとして表現し、それを実装したものです。ChainerMNにおける分散深層学習は、基本的に全てこのCommunicatorを使っています。Communicator の実装クラス PureNcclCommunicator を通じて NCCLを利用した場合のイメージを図1に示します。NCCLは、NVIDIAが開発しているGPU専用の集団通信ライブラリです[8] 。ChainerMNでは、CuPyのCythonの実装を通じてNCCLを利用します。

図1: Chainerを使った分散深層学習の内部コンポーネントの構成図
図1: Chainerを使った分散深層学習の内部コンポーネントの構成図: PureNcclCommunicator はCuPy を通じてNCCLを呼び出す

いくつかあるCommunicatorの実装は、いずれもシステムの部分故障を前提としたものにはなっていません。最も利用されているのは PureNcclCommunicator ですが、その内部で利用しているNCCLが 2.3 まではシステムの部分故障を前提としたものになっていませんでした。例えば ncclAllReduce() の集団通信に参加しているプロセスがひとつでも故障すると、他のプロセスで呼ばれた ncclAllReduce() は永遠にブロックされたままになります。

このとき、Communicatorの内部で起きていることを詳しく解説します。ChainerMNは内部的にはCuPy経由で ncclAllReduce() を利用します。CuPy は Cython 経由で全ての関数を呼び出します。ところがPythonのC拡張の仕様では、ユーザーから送られるUnixシグナルはPythonが設定したシグナルハンドラによって擬似的にブロックされた状態になり、シグナルに対するコールバックはPython上の実行に戻ってから呼ばれます [9] 。つまり、ncclAllReduce() の呼び出しが戻らない限りは SIGTERM等を全く受け付けず、ずっと ncclAllReduce() の中で止まったままになります。集団通信に参加しているプロセスが一つでも故障すると、その集団通信はずっと終わらないままブロックするということになります。この様子を図 2 に示します。


図2: AllReduce を呼んでいる最中はSIGTERMが擬似的にブロックされ、 ncclAllReduce() 中のループから抜け出すまでユーザー側で処理をすることはできない。ncclAllReduce() は故障プロセスを含む他のプロセスからの通信を待ち続ける。

実用的には、集団通信がハングしていることを検知して、シグナルハンドラを設定できないSIGKILL等で各ノードでひとつひとつ手動でkillしてまわらなければならなくなります。 OpenMPIはこの状態は検知してジョブを強制終了するといったことはできませんから、ジョブが進行しないまま半永久的に計算リソースを占拠し続けることになります。これが、 ncclDestroy() のAPI導入前の状態でした。

ちょうどよいタイミングで、昨年の今頃のことでしたが、NCCL 2.4から導入される ncclDestroy() というAPIをリリース前にテストすることができました [10]。この関数は、NCCLを使ったアプリケーションに耐故障性を導入するために、最小限でありながら十分な機能追加です。個人的なことですが、NCCLの開発者とメールをやり取りしてこのアイディアを聞いたときはに本当に感心しました。わたしが一年近く悩んでいたこの問題について、既存のコードに影響を与えず問題をエレガントに解決するベストなアプローチだったからです。

ChainerMNを利用した分散深層学習が全てCommunicatorに立脚しているということは、これさえ故障に耐えうる仕様になれば、ChainerMN上の分散深層学習は全て耐故障性を備えることができるようになります。ということで、まずはCommunicatorに耐故障性をもたせるためにncclDestroy() を導入することを目指します。 ncclDestroy() は、任意のタイミングで特定の ncclCommunicator (混乱しそうですが、これはNCCLで内部的に利用するオブジェクトです)を破壊して、そのタイミングで実行されていたあらゆる集団通信を強制終了させることができます。つまり、 ncclAllReduce() が故障したプロセスからの永久にこないメッセージを待っているときに横から強制終了させることができるということです。これによって、NCCLの集団通信中にブロックされた状態から戻れなくなるという問題が解決できます。あとは、NCCLを利用するアプリケーションが、どのようにシステムとして故障を検出し、 ncclDestroy() によってどのようにncclAllReduce() の強制終了をハンドリングするかという問題になります。

まず、ノードの死活監視のために etcd を導入します [11]。Chainerを使っている学習プロセス内で etcd クライアントを別スレッド上で動作させ、このスレッドが etcd とKeepAliveをします。これによって、システムの基本構成は図3 のようになります。


図3: eChainer を使った学習プロセスの基本構成:
Communicator 内にetcd を用いた故障検出器を追加した。

このように死活監視するチャンネルを設けることによって、ひとつのプロセスの故障を全体に通知することができるようになります。具体的には、各プロセスは etcd の特定のprefix上にエフェメラルファイルを作って、それをお互いに監視することで死活監視とします。エフェメラルファイルとは、クライアントとサーバーの双方が正常に動作してKeepAliveが維持されているときにだけ保持されるファイルです。例えばクライアントが故障すると、一定時間後にこのエフェメラルファイルが消滅し、他のプロセスはこのエフェメラルファイルが消滅した通知を受け取ることができます。実はここが分散システムで最も難しい故障検出の問題を解決している部分なのですが、etcdを使うことで複雑な実装も簡単に済ませることができました。

この通知をトリガーにして、全てのプロセスは学習(および集団通信)を一旦停止します。このときに ncclDestroy() を利用します。これによって動作中の ncclAllReduce() と、それを利用していた NCCL のリングは全プロセスで破棄されます。ncclAllReduce() は同期的な集団通信で、全てのプロセスが同じ iteration 中にいることが保証されていますから、このように破棄されたことをPythonの例外によって表現することができます。これで、アプリケーションからも故障を検出をできるようになりました。その様子を図4 に示します。


図4: プロセス故障の検出はファイル削除のイベントとして全ノードに通知され、それをもとに ncclDestroy() が呼ばれる。ncclDestory() であれば、通信待ちの ncclAllReduce() を強制的に終了させることができる

このようにノードの離脱を etcd のイベントとして表現しましたが、実は、ノードの追加も同様に etcd のイベント(エフェメラルファイルの追加)として表現することができます。同様に、 ncclDestroy() を発行してNCCLのリングを破棄して、あらたに追加されたノートを加えてNCCLのリングを再構築することにより、分散学習の動的なスケールアウトを実現することができます。

しかしながら、NCCLのリングの破棄と再構築はCommunicator の size や rank の変更を必要とします。つまり、全体のプロセス数が変わった場合は、配った学習データを割り当てなおしたり、学習率のスケールルール[12] に従って、改めて学習率を設定する必要があります。また、新しく追加されたプロセスはモデルのパラメータやオプティマイザのパラメータなどの学習の途中状態を知りませんから、学習を再開するためには、これらの情報を別のプロセスのメモリから集めてやる必要があります。これらの処理はなるべく共通化してユーザーが書かなくてもよいようにしたいところでしたが、今回の実験ではImageNetにフォーカスして学習スクリプト上に作り込むことにしました。基本的には、プロセス増減の例外を受けて、

  1. 学習データの割当をやり直す
  2. Optimizer やモデルのオブジェクトを作り直す
  3. ChainerのTrainerを作り直してプロセス間で配り直す
  4. 学習を再開する

という処理をフラットに while ループの中に実装しました。詳しくは eChainer に付属するサンプルコードをご覧ください。

ここまで基本的な設計を解説しましたが、実はこのアプローチには難しい問題がひとつあります。ノードの追加や故障は、現実的にはそうそう起こるものではありませんが、追加や故障を受けた際に計算を再開してよいかどうかの条件は自明ではありません。以下は簡単な例ですが、

  • 分散深層学習を実行するプロセス数が大きく減ると、学習率の調整によって学習自体は続けることができるが、学習にかかる時間は大きく延びる。例えば48時間で終わると思っていた学習が、途中でプロセスが大きく減って残りETAが64時間まで伸びてしまった。この学習を途中で停止してやり直した方が早くはないか?
  • 分散深層学習を実行するプロセス数が増えると、学習率の調整によって学習を続けることはできるが、例えばバッチサイズが64000まで増えてしまったら、32000のときとは別の学習レシピが必要になる(LARS [13] 等)。バッチサイズをある範囲でコントロールしたい
  • ノード追加のタイミングがすこしバラバラになってしまって、 8プロセス(8GPU)追加するときに1回ずつ認識されてしまい、計8回の例外が投げられてしまい、NCCLのリング再構築やモデルの再同期など重い処理が不必要に走ってしまうと非効率
  • ある学習レシピは32プロセス8GPUでしか動作しない(バッチサイズなどのパラメータが慎重に設計されている)。重要な学習なので、1プロセスの失敗で止まることなく、自動的に動作継続はしてほしいが、1プロセス減った状態で勝手に計算を再開させることなく、再度計算リソースが追加するまで待ちたい
  • ジョブの進捗が8割を過ぎていたら頑張って動作継続をしてほしいが、5割程度の進捗ならまた別途やり直してもよい

といったことがあります。こういった、計算資源の増減に対する複雑な対応や要件をすべて単一の実装で実現したり、設定ファイルで記述させるといったことは簡単ではありません。そこで、Chainerが持っている Define-by-Run という考え方[14]に触発されて、私もこれをDefine-by-Runで実現することができないかと考えました。

Define-by-Run Re-configuration

Define-by-Runの基本的な考え方は、 (1) やりたいことをプログラムで表現する (2) そのプログラム表現と実行が 1:1 で対応する、というものです。こうやって書くと当たり前のことに見えますが、これによって、高い表現力と、任意の条件判断を追加できる、失敗した箇所がスタックトレースと対応するなどのメリットがあります。 Chainerではニューラルネットワークの入力、途中の forward 処理、出力を表現して実行することが目的でしたが、 eChainer では計算資源の増減と、それに対してジョブがとるべき対応を表現して実行することが目的となります。 eChainer では、これを ScalePolicy() の継承クラス として実装してCommunicatorに渡すことで、学習時にポリシーが評価および実行されるようになります。ScalePolicy()を継承して、ok2run(self, hosts, initial) というメソッドを実装するだけです。例えば、Fail-stopといわれる最も簡単なポリシーを表現するには、以下で十分です。

class FailStop(echainer.ScalePolicy):
    def __init__(self, n): self.n = n
    def ok2run(self,  hosts, initial):
        if len(hosts) == self.n: return “ok”
        elif initial: return “wait”
        else: return “fail”

ok2run() は、計算を再開してよければ “ok” を返します。規定の条件を満たすまで待機するべきであれば “wait” を返します。このジョブを失敗として終了するには、 “fail” を返します。このオブジェクトはジョブの実行中は保持されますから、Optimizerなどの任意の状態や条件をこのオブジェクトのメンバーとして持たせることによって、上記で述べたような条件を好きなように設定することができます。ユーザーは計算の再開、待機、中止を決定する任意の条件をプログラムによって表現することができます。

このPolicyとetcdのアクセス先を渡すことで、ChainerMNのCommunicatorと互換で、耐障害性のあるCommunicatorを作ることができます。

policy = YourOwnCoolScalePolicy(...)
etcd = “etcd://e1:2379,e2:2379,e3:2379/your-job-name”
listen = “10.0.0.1:9889”
comm = echainer.NcclCommunicator(policy, etcd, listen)

実験

この eChainer を使って、実際にImageNetの学習をスケールアップさせたり、スケールダウンさせる実験を行いました。

ChainerCVの example にあるImageNetの学習スクリプトをベースにしたので、学習レシピは [12] と同じです。実験に用いた環境はMN-1b上のKubernetesを使ったコンテナです。ncclAllReduce は InfiniBand HDR上で動作しますが、その他の通信は 10GbE上のTCP/IP上で行われます。2-4 ノード(16−32GPU)の間で増減する実験をしました。ノード故障は簡単に SIGTERM で行われています。ScalePolicy は MinMax というものを実装しました。プロセス数が一定範囲内にある限り動作を継続するというものです。

まず、ノードの増減がなく正常に終了した学習の進捗です。以下の図はいずれも横軸に実時間、縦時間にImageNetの学習エポックをプロットしています。


図5: さまざまなGPU数でImageNet を学習した際の速度

GPUの数に応じて学習の速度(線の傾き)が変化しているのがわかります。以降のグラフもそうなのですが、 epoch が離散的に変化するために線が破線状になっています。次に、学習の途中で2ノード(8GPU)追加してみます。


図6: 学習途中でノード追加した場合の学習速度の変化

緑の線と、茶色の線がそれぞれ別のタイミングで途中ノードを追加したものです。追加の前後でも同様に学習が動作していることがわかります。それぞれ、20000秒付近、34000秒付近で学習の速度が変化し、32GPUと同じ速度になっていることがわかります。また、このときのvalidation set に対する最終精度は 76.4% でした。1回だけの測定ですが、元の論文[12]と同程度の精度がノード追加にも関わらず再現できました。

次に、ノードが途中離脱した場合です。32GPUと16GPUで実行していたジョブを、それぞれ途中でプロセスを落とすことでGPU数を減らしています。


図7: 学習途中でノード削除した場合の学習速度の変化

赤線では、GPU数が32から16に途中で減っています。同じタイミングで、線の傾きも16GPUのそれと同じになっています。同様に、16から8に減った緑線の場合でも8GPUと同じ速度に傾きが落ち込んでいることがわかります。また、プロセスが離脱する前後でもジョブ全体が落ちることはなく動作継続することができました。このときのvalidation set に対する最終精度は 76.0% でした(1回測定)。スケールダウンのときと比較して 0.4% 低下していますが、これが常に下がるものなのかどうかは原因も含めて今後調査する必要があります。

このように、分散深層学習のジョブを実行中に動的に計算資源を追加することにより学習の進行速度を上げたり、ジョブを止めることなく動的に計算資源を一部取り除くことができるようになりました。

関連研究および関連システム

分散深層学習の先駆けであるDistBeliefはもともとGoogleの大規模分散システム上で耐障害性を持って動作していました[15]。この系譜を受け継ぐ TensorFlow はパラメーターサーバーを持つモデルで、パラメーターサーバー以外のワーカーノードが故障しても、その部分のミニバッチを別のノードで再計算すれば済みました。これは非同期(Asynchronous) SGD といわれる分散方式で、始めから耐障害性を考慮されたものです。しかしながら、これにはパラメーターサーバーに負荷が集中してボトルネックになりやすい、古い勾配を使って学習してしまうなどの問題がありました。
ChainerMNを始めとするMPIベースの分散深層学習では、同期(Synchronous) SGDといわれる分散方式を採用し、HPC技術の恩恵を受けて上記の問題点を解決し、深層学習の高速化に寄与しました。しかしながら、HPC技術の恩恵を受ける代わりに、非同期SGDが持っていた耐障害性を失うこととなりました。
HPCの分野でも、もちろん同期的な集団通信に耐障害性を与える研究が行われています。中でもULFM (User Level Fault Mitigation) [15][16] はMPIのWGで精力的に標準化が検討されています。これはMPIに障害のハンドリングするAPIを追加しようとするものです。

まとめ

分散深層学習に耐障害性と、可塑性を導入する実験的なライブラリ eChainer と、その実験結果をまとめました。特にプロセス数が増減したときのハンドリングをどう行うかについて、 Define-by-Run の考え方に基づいた表現方法を提案しました。

[1] T. Akiba, S. Suzuki and K. Fukuda, “Extremely Large Minibatch SGD: Training ResNet-50 on ImageNet in 15 Minutes,” arXiv:1711.04325, 2017.
[2] https://mlperf.org
[3] eChainer
[4] 分散深層学習とChainerMNについて
[5] 分散深層学習を支える技術:AllReduceアルゴリズム
[6] 分散深層学習パッケージ ChainerMN 公開
[7] Chainer Doc: Communicators
[8] NVIDIA Collective Communications Library (NCCL) https://developer.nvidia.com/nccl
[9] signal — Set handlers for asynchronous events
[10] Preliminary abort mechanism and an API for querying asynchronous errors.
[11] https://etcd.io
[12] P. Goyal, P. Dollár, R. Girshick, P. Noordhuis, L. Wesolowski, A. Kyrola, A. Tulloch, Y. Jia and K. He, “Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour,” arXiv:1706.02677, 2017.
[13] Y. You, I. Gitman, and B. Ginsburg. Large Batch Training Of Convolutional Networks. arXiv:1708.03888, 2017.
[14] Tokui, Seiya, et al. “Chainer: A Deep Learning Framework for Accelerating the Research Cycle.” Proceedings of the 25th ACM SIGKDD International Conference on Knowledge Discovery & Data Mining. ACM, 2019.
[15] ULFM 2.0 Release
[16] George Bosilca , Aurelien Bouteiller , Amina Guermouche , Thomas Herault , Yves Robert , Pierre Sens , Jack Dongarra, Failure detection and propagation in HPC systems, SC’16.

ニューラルネット3D表現に対する微分可能レンダラー

hkato

2019-10-25 10:42:30

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


PFNの2019年夏季インターンシップに参加させていただいた東京大学大学院・情報理工学系研究科・修士2年の島田直治 (http://ut25252.starfree.jp/) です。大学ではCG (コンピューター・グラフィックス) 関連の研究をしています。インターンでの研究テーマとして、CGとの関わりも深い「微分可能レンダラーを用いた3D再構成」を選びました。研究としては、3D表現としてニューラルネット関数を用いることを着想し、これに対する新たな微分可能なレンダリング方法を考案、実装して数値実験を行い3D再構成の精度を先行研究と比較評価しました。

研究内容に関するまとめスライドをこちらに公開しています。このスライドの内容について、以下で解説していきます。


 
また、作成したプログラムはこちらで公開しています。

微分可能レンダラーを用いた3D再構成

CV (コンピューター・ビジョン) の分野で現在精力的に研究が行われているテーマの一つに、たった1枚の画像が与えられた場合にそこに写っている物体や景色の3D構造を把握しようという “single-view 3D reconstruction” があります。


これは、例えばロボットが目の前にある物体を掴む動作(グラスピングと呼ばれる)を行う場合や、自動運転車が歩行者や障害物を把握して回避する場合などに応用が見込まれます。

問題点として、1枚画像からの3D再構成という課題は明らかに条件不足な不良設定問題であり、他の情報を使わない限りは解くことが出来ないということが挙げられます。我々が日常生活において視覚情報からある程度3D構造を把握できるのは、これまでの人生経験で「学習した常識」を使って形状を「予測」しているからです。パソコンに3D再構成を行わせる場合にも、同様に常識を学習させて予測させる手法が考えられます。

3D supervisionによる学習 [2]

画像を入力とし、3D構造を出力とするような予測モデルをニューラルネットワークで表現し、教師3D構造データとの差分を用いて最適化学習すれば出来そうです。実際数多くの研究が行われています[5-10]。このように3D構造を教師データとして用いる学習を3D supervisionと呼びます。

3D supervisionによる学習の問題点としては、教師データとなる3Dデータを大量に必要とすることです。現状では3Dの教師データを大量に用意するというのはあまり現実的な選択肢ではありません。そこで、画像のみを用いて予測モデルを学習させる、2D supervisionな学習方法が模索されています [1-4]。

2D supervisionによる学習 [2]

予測モデルの出力した3D構造から、2Dの画像を生成する (レンダリングと呼ばれる) ことは容易であり、その生成画像と教師データ画像との差分を計算することができます (この場合、教師画像データはどの位置・方向から撮影されたものであるかというカメラパラメータがわかっているものとし、レンダリングの際にはその位置・方向と同じような仮想カメラを設定して画像生成することになります)。出力画像における差分を誤差逆伝播させて、予測モデルのニューラルネットを学習させることになりますが、この時レンダリング部分が微分可能でないと誤差を逆伝播させることが出来なません (直感的には、3D構造を少し変化させた場合に、それに応じて出力画像がなめらかに変化することが要求されます。例えば、三角形メッシュで表現された3D構造をラスタライズの手法によりレンダリングする場合、ピクセル中央にメッシュが入るか入らないかで不連続にピクセル値が変化してしまいます。メッシュの位置変化に対して出力がなめらかに変化しないので、このままでは微分可能ではありません [1])。このように、2D supervisionな学習には微分可能なレンダラーの開発が必要となります。

3D表現と微分可能レンダラー

3D構造の表現方法にはボクセル、点群、メッシュ、ニューラルネットなどがあります。

各3D表現を可視化した図 [8]

それぞれの3D表現(点群以外)について微分可能レンダラーが提案されています。代表的な手法とその利点欠点を以下の表にまとめています。

メッシュ表現を用いる場合 [1][2]は、何らかの初期形状を仮定して、これを変形させることで3D構造の再構成を行うアプローチが主流です (例えば最初に球を仮定してメッシュ構造を作り、目的のティーポットなどに連続的に変形させていきます)。この場合、トポロジー的にことなる物体(穴が空いていたり、複数であったり)を再構成することが難しいという欠点があります。メッシュ表現のもう一つの難点としては、頂点と面からなる複雑な構造のデータを深層学習のフレームワークでうまく扱うことは容易でないことが挙げられます。また、ボクセル表現を用いたDRC [3]では、解像度を上げるにつれて必要なメモリ容量が解像度の3乗で増大するという欠点があります。さらに、ニューラルネット3D表現を用いたSRN [4]では、上2つの欠点を克服しているが、レンダラー部分までニューラルネットで表現することで微分可能レンダラーとしており、その分学習が大変になっているという欠点があります(1つの物体に対して50視点分もの画像を必要としています)。

今回のインターンでは、これらの欠点をすべて克服するような、ニューラルネット3D表現に対する微分可能レンダラーを開発することを目的としました。SRNのようなレンダラー部分をニューラルネットによるものにするではなく、より直接的に行うようなレンダラーを微分可能な形で実現することで達成出来るはずです。これにはボクセル表現のDRCを参考にして拡張することを考えました。まずはDRCについての簡単な解説を行います。

Differentiable Ray Consistency (DRC) [3]

DRCでは、以下のようなパイプラインで3D再構成とレンダリングを行っています。簡単のため、教師データとして白黒のmask画像を用いる場合に限定します。

3D再構成のパイプライン [3]

まず、RGBの画像 (64×64 ピクセル) をEncoder-DecoderによりVoxel 3D表現 (32×32×32) に変換します。次にカメラから見てレイの通り道にVoxelが存在すれば黒、しなければ白といった形でレンダリングします。

微分可能レンダリングとLoss関数 [3]

ただし、Voxelが存在するかしないかという2値表現では微分可能なレンダリングにはなりません。そこで、Voxelには曖昧な中間状態を許すことにし、[0,1]の実数値でレイの透過確率を表すものと定義します。つまり、レンダリング画像の各ピクセルには、レイが通過する全voxelの透過確率をかけ合わせた値が出てくることになります。ここで、Loss関数を教師画像と出力画像の各ピクセル値の絶対値差分の合計値と定義すると、各voxel値について微分可能であることが示されます(論文参照)。つまり、微分可能レンダラーとなっており、Encoder-Decoderのネットワークを学習させて3D再構成を行うことができます(上図参照)。

DRCによる3D再構成の例 [3]

実際に学習したモデルで3D再構成を行った結果はこのようになります(上左図)。また、教師データとしてmask画像だけでなくRGB画像を用いる場合にもLoss関数を拡張することで対応出来ます(上右図)。

Our algorithm (DRS)

DRCでの3D表現をvoxelからニューラルネットに置き換えることを考えます。

voxel表現というのは、323のメモリにそれぞれ一つの実数が格納されていて、(x,y,z)のindex値を指定するとそれに対応する値が一つ返ってくるようなものと考えることができます。これは一つの関数とみなすことが出来るため、上右図のような3入力-1出力のニューラルネットによる非線形関数で置き換えることが可能です。ニューラルネット表現に置き換えることで、一つ一つの値を保持するvoxelよりメモリ効率が大幅に改善することが見込まれます。さらに、入力のx,y,zには連続的な座標の実数値を直接使うことが出来るようになることで学習やレンダリングの自由度が高まり、またデータ点間が関数の滑らかさにより自動的に補完されるため、表面形状が綺麗に再現されるというメリットがあります。これらの特徴は、3D supervisionでの文脈で近年盛んに行われているニューラルネット表現の研究において確認されています [8-10]。

レンダリングについては、カメラから出たレイを適当な間隔で区切ってサンプリングし、サンプリング点の座標をニューラルネット3D関数に入力することで、その点でのレイ透過確率を計算します。これをかけ合わせた値をピクセル値として扱い、Loss関数はDRCの場合と同じように定義することで微分可能となります (上図)。

全体のパイプラインとしては上図のようになり、Encoder-Decoderはニューラルネット3Dの重みパラメータを出力するようになっています。

Results

学習条件をDRCと同様な設定で行いました。データセットにはshapenet V1を用い、car (chair)クラスについては、全7000 (5000) instancesをおよそ7:1:2の比率でTrain,Valid,Testに分け、教師データとしては各instanceにつきレンダリング画像5枚を使用します。

まずは、ニューラルネットによる3Dの学習および表現力をテストする目的で、1 instanceのみの学習を行いました。つまり、ある特定の1物体に限定して、その物体を様々な角度から見たRGB画像およびシルエット画像を用いてネットワークを学習し、学習データには含まれないような未知視点からの画像を再現出来るかどうかをテストします。

左から順に、InputのRGB画像、学習後に未知視点からのレンダリングを行った結果(Gt, 出力, 差分)、3D構造をスライスして可視化した図(ニューラルネット3Dを一定のthreshold値でvoxel化, 教師3Dデータ, 差分)、3D再構成の精度(voxel IoU)を表しています。DRCと比べても十分な精度が出ています。

次に、複数instanceでの学習を行いました。

3D再構成のQualitativeな結果 (見た目)とQuantitativeな結果 (平均精度) を示しています。DRCと同等の精度が得られました。つまり、ボクセルの予測と同等の精度を保ちつつ、メモリ使用量の問題を解決したことになります。さらに、同じくニューラルネット表現を用いたSRN [4]と比べても、学習に必要な視点数(1つの物体あたりに用いることが出来る画像数)が50→5枚へと大幅に削減することに成功しました (SRNでは3D再構成の精度を計測することが困難であるため、精度の比較に関しては行っていません)。

今後の課題

今後の課題としては、

  • 3D再構成の精度を上げる。
  • メモリ使用量の比較。
  • RGB画像での3D再構成実験。
  • DRC以外の先行研究と同条件での比較。

などが考えられます。

引用文献

微分可能レンダラー (2D supervision)

[1] “Neural 3D Mesh Renderer” (Kato+ CVPR 2018)
[2] “Learning View Priors for Single-view 3D Reconstruction” (Kato and Harada CVPR 2019)
[3] “Multi-view Supervision for Single-view Reconstruction via Differentiable Ray Consistency” (Tulsiani+ CVPR 2019)
[4] “Scene Representation Networks: Continuous 3D-Structure-Aware Neural Scene Representations” (Sitzmann+ NIPS 2019)

3D supervision (メッシュ、ボクセル、点群)

[5] “PM-GANs: Discriminative Representation Learning for Action Recognition Using Partial-modalities” (Wang+ ECCV 2018)
[6] “Octree Generating Networks: Efficient Convolutional Architectures for High-Resolution 3D Outputs” (Tatarchenko+ ICCV 2017)
[7] “A Point Set Generation Network for 3D Object Reconstruction From a Single Image” (Fan+ CVPR 2017)

3D supervision (ニューラルネット関数)

[8] “Occupancy Networks: Learning 3D Reconstruction in Function Space” (Mescheder+ CVPR 2019)
[9] “DeepSDF: Learning Continuous Signed Distance Functions for Shape Representation” (Park+ CVPR 2019)
[10] “Learning Implicit Fields for Generative Shape Modeling” (Chen and Zhang CVPR 2019)


メンターからのコメント

メンターを担当したPFNの加藤と安藤です。CGのスキルを活かしつつ深層学習のスキルを高めたい、という希望をもとに両者が交差するテーマである新規な微分可能レンダラーの開発を担当していただきました。自ら関連研究をサーベイし読み込み手法を開発してゆく能力が高く、本人の主軸とする分野から少し離れるにも関わらずメンターとしてのサポートは最小限で済み、さすがと思わせられました。

ニューラルネットワークによる3D形状の表現は近年急速にホットになりつつあるトピックですが [8, 9, 10]、そのレンダリングと深層学習との接続に関してはほとんど前例がない状況です。その中で、素直なアルゴリズムによって、複雑な学習 [4] を用いずともボクセルによる先行例 [3] と同等程度の性能が出せるという発見は大きな意味があると考えています。一方で、インターンは一ヶ月と少しという短い期間であったため細部の調整は十分ではなく、数値性能の向上や色の扱いなどまだまだ発展の余地があり、もっと長期間取り組めばさらに面白いものが見られたのでは、という無念さも残るインターンでした。

Implicit biasによる正則化効果

Kohei Hayashi

2019-10-23 16:47:09


本記事は,2019年度インターン生だった東京大学 D1 の中島蒼さんによる寄稿です.中島さんはインターンシップにおいて,畳み込みニューラルネットワークの学習について研究を行いました.この記事は,インターンシップ中に文献調査していたimplicit bias に関するレビューとなっています.


NN の学習はなぜうまくいくのか

畳み込みニューラルネットワーク(Convolutional NN; CNN)は画像処理など様々な分野に応用され,大きな成功を納めています.すなわち,様々なデータについて,訓練データから学習したニューラルネットワーク(Neural Network; NN)を用いて未知のデータについての予測や分類が行われています.このようにNN の学習が上手くいく,すなわち未知データに良く汎化することは経験的には分かっていますが,理論的な説明はまだ完全には成功していません.

NN に限らず学習一般において,訓練データだけから未知なデータについて予測をするのは本来原理的に不可能です.未知のデータに対しては,何が起こってもおかしくないからです.それにも関わらず学習が上手くいくのは,未知のデータに関しても何らかの仮定ができ(帰納バイアス; inductive bias),その仮定を利用することで既知のデータから帰納的に推論が行えるためです.例えば,「データの生成過程は単純であり,学習されたモデルが単純なら未知のデータについても予測できる」と仮定し,過学習を抑制し単純なモデルが学習されるようにする正則化が良く行われてきました.NN の学習が上手くいく背景にも,このような正則化が働いていると考えられます.

しかしながら,現実に使われている NN はパラメタ数がデータより非常に多く,一見すると自由度が高すぎて過学習が起きやすいモデルに思えます.それにも関わらず,なぜ NN の学習は上手くいくのでしょうか?実はパラメタ数が多くなっても,学習された NN は過学習を起こしにくいことが実験的に示唆されています.例えば,Neyshabur ら [1] による実験では,NN のパラメタ数が増えても未知のデータに対する予測精度は保たれていて,過学習が防げていることが分かります.Zhang ら [2] による別の実験でも,\(l_2\)-正則化などの明示的な正則化がなくても学習後のNN の性能は良いことが示されています.これらの結果は,パラメタ数が多く明示的に正則化が行われない状況でも,何らかの形で過学習が抑制される正則化がかかっていることを示唆しています.

この暗黙的な正則化(implicit bias)の正体は何なのでしょうか?Neyshabur ら [1] は最適化アルゴリズムの性質によるものだという仮説を提示しました.例えば,確率的勾配降下法 (Stochastic Gradient Descent; SGD) は連続的にパラメタを更新していくアルゴリズムなため,初期値からあまり離れることができません.そのため,初期値が非常に小さい場合は,学習されたパラメタのノルムが小さくなると期待されます(図1).この小ノルム性が正則化として機能し,未知のデータに対する汎化性能に効いているのだというのが彼らの仮説です.Zhang ら [2] も同様に SGD に起因する小ノルム性に基づいた議論を行っています.

図1:SGD に起因する implicit bias.パラメタ \(\boldsymbol{\theta} = (\theta_i)_{i=1,2,\dots,}\) の数がデータより多い場合,大域的最適解(訓練誤差がゼロになる点)は典型的には複数あり,連続的に存在していることもあります.ゼロに近い初期値からSGD で最適化する場合,このように複数ある大域的最適解のうちで,ノルムが小さいものが得られることが期待できます.特に,行列補完という問題では,ノルムが最小な大域的最適解に到達するといくつかの状況で示されています.

Neyshabur ら [1] の議論は,行列補完という問題で,小ノルム性が良い解につながるという既存の知見に着想を得ています.行列補完は,行列 \(X \in \mathbb{R}^{n \times n}\) の成分の線形和がいくつか分かっているときに,すべての成分を求める問題です.具体的には,行列 \(A^{(\lambda)} \in \mathbb{R}^{n \times n}\) \(\lambda = 1,2,\dots, m\) と線形和 \(o^{(\lambda)} := \sum_{i,j = 1}^n A_{i,j}^{(\lambda)} X_{i,j} \) が与えられたとき,行列 \(X\) を推定する問題になります.行列補完は,線形 NN による回帰を具体例として含んでいて,NN の学習を単純化した問題とも捉えられます.線形話の個数 \(m\) が \(X\) の要素数 \(n^2\) より少ない場合,線形和の条件を満たす \(X\) は複数存在するため,元々の \(X\) を決定することは原理的には不可能です.しかし,\(X\) が低ランクであると分かっている場合には,トレースノルムを最小にする手法が上手くいくことが知られています.すなわち,線形和に関する条件を満たす \(X\) のうちで,トレースノルムを最小にするものを求めることで,元々の \(X\) を良く復元できることが知られています [3].ここで,行列 \(X\) のトレースノルムは,\(X\) の特異値が \(\{\sigma_i\}_{i=1,2,\dots,n}\) であるとき,以下の式で定義されます.

\[ \|X\|_{\mathrm{trace}} = \sum_{i=1}^n \sigma_i\].

Implicit bias は存在するのか

では,最適化手法に起因してパラメタのノルムが小さくなるという implicit bias は本当に起こっているのでしょうか?いくつかのモデルについては,implicit bias があることが理論・実験的に検証されています.例えば,先述した行列補完 [4,5,6] や,巡回畳み込みを行う線形 CNN [7] で証明されています.この記事では,行列補完に関する implicit bias について紹介します.

行列補完

先述した行列補完については,implicit bias の存在が理論的に証明されています.すなわち,明示的にトレースノルムを最小にする正則化を行わなくても,初期値が十分小さいなら勾配法の結果としてトレースノルム最小解が得られると,いくつかの状況で示されています.ここで,勾配法では,線形和についての二乗誤差

\[ \sum_{\lambda = 1}^m \left \| o^{\lambda} – \sum_{i,j=1}^n A_{i,j}^{(\lambda)} X_{i,j} \right\|_2^2 \]

を最小化します.また,最適化するパラメタとしては,\(X = U^\top U\) と分解された \(U\) を用います.この設定の下,Gunasekar ら [4] は,線形和を決めている行列 \(A^{(\lambda)}\) たちが可換であるときにimplicit bias の存在を証明しています.また,Li ら [5] は,線形和についてある種の等方性を仮定することで,implicit bias を示しています.一方で,Arora ら [6] は,より多層な分解 \(X = U_1 U_2 \dots U_n\) についての implicit bias を [4] と同じ設定の下で示しています.また,一般にはトレースノルムではなくeffective rank [8] という量が小さくなる正則化が起こっているのではないかと実験的に議論しています.行列補完は線形 NN による回帰を含んでいたので,これらの結果は線形 NN で回帰をする場合には implicit bias が存在することを意味しています.

まとめ

この記事では,パラメタ数が多く一見すると過学習が置きそうに思える NN であっても,学習アルゴリズムによる implicit bias のため過学習が抑制され,良い汎化性能につながっているという仮説を紹介しました.Implicit bias の存在は,限定的な状況ではありますが,いくつかの例では理論的に証明されていました.現実的な状況では,常にノルムの最小化が行われるわけではなく,アルゴリズムに起因する小ノルム性と勾配の関係で学習されるパラメタが決定されていると考えられますが,このような状況での実験・理論の両面での解析は未だに発展の余地があるものになっています.また,NN の学習を説明する試みは, Neural Tangent Kernel [9] のように他にも存在しています.

最後に,NN の学習という挑戦的で面白い課題に取り組む機会を与えてくださった PFN やサポートしてくださった皆さんにこの場を借りて謝意を表します.特に,メンターの林浩平さんと南賢太郎さんには,日々の議論など様々な面でご支援いただきました.本当にありがとうございました.

参考文献

[1] Behnam Neyshabur, Ryota Tomioka, Nathan Srebro: In Search of the Real Inductive Bias: On the Role of Implicit Regularization in Deep Learning. ICLR (Workshop) 2015.

[2] Chiyuan Zhang, Samy Bengio, Moritz Hardt, Benjamin Recht, Oriol Vinyals: Understanding deep learning requires rethinking generalization. ICLR 2017.

[3] Emmanuel J. Candès, Benjamin Recht: Exact matrix completion via convex optimization. Commun. ACM 55(6): 111-119 2012.

[4] Suriya Gunasekar, Blake E. Woodworth, Srinadh Bhojanapalli, Behnam Neyshabur, Nati Srebro: Implicit Regularization in Matrix Factorization. NIPS 2017: 6151-6159.

[5] Yuanzhi Li, Tengyu Ma, Hongyang Zhang: Algorithmic Regularization in Over-parameterized Matrix Sensing and Neural Networks with Quadratic Activations. COLT 2018: 2-47

[6] Sanjeev Arora, Nadav Cohen, Wei Hu, Yuping Luo: Implicit Regularization in Deep Matrix Factorization. NIPS 2019, to appear.

[7] Suriya Gunasekar, Jason D. Lee, Daniel Soudry, Nati Srebro: Implicit Bias of Gradient Descent on Linear Convolutional Networks. NeurIPS 2018: 9482-9491.

[8] Olivier Roy and Martin Vetterli. The effective rank: A measure of effective dimensionality. In15th European Signal Processing Conference, IEEE: 606–610. 2007.

[9] Arthur Jacot, Clément Hongler, Franck Gabriel: Neural Tangent Kernel: Convergence and Generalization in Neural Networks. NeurIPS 2018: 8580-8589.


総評

今回のインターンシップでは,中島さんには「最適化由来の正則化効果」という機械学習の中でも比較的新しいトピックに取り組んでいただきました.本記事で紹介されている implicit bias は理論研究としての側面が強く,正則化効果が発生することは限られた条件下では理論的に証明されているものの,現段階では工学的応用には結びついていません.しかしながら,implicit bias は最適化によって自動的に生じるため,追加の計算量を必要としない「経済的な」手法であるといえます.また,ニューラルネットワークがどのようにしてその強力な汎化能力を得ているのか,その原理の解明につながる一歩としても興味深い存在です.

PFNインターンでは,このような理論的トピックにも果敢に挑戦できる環境を提供しています.同様の興味を持つ学生の方はぜひ次の機会にご応募ください.

リサーチャー 林浩平,リサーチャー 南賢太郎

Chainer Chemistryの大規模グラフのタスクへの拡張

Kosuke Nakago

2019-10-01 13:09:08

本記事は、2019年インターンシップで勤務した 阿部健信 さんによる寄稿です。

こんにちは。2019年夏季インターンに参加した東京大学の阿部健信です。「Chainer Chemistryの大規模グラフのタスクへの拡張」というテーマで取り組んだ内容を説明させていただきます。インターン内容のスライドはこちらにアップロードされています。

PFN Summer Internship 2019 / Kenshin Abe: Extension of Chainer-Chemistry for Large and Sparse Graph from Preferred Networks

 

TLDR;

  • Chainer Chemistryで大規模グラフのデータを扱えるようにしました。
  • convolution演算を\( O(V^2) \)から\( O(E) \)にしました。
  • メモリ使用量も抑えて、PyTorch Geometricでは動かないRedditデータセット(23万頂点, 1100万辺)を16GBのsingle GPU上で学習できるようにしました。

 

はじめに

 

graph convolution [1]

画像に対する2D ConvolutionとGraph Convolutionの比較 [1]

入力としてグラフを受け取ることのできる、Graph Neural Network(GNN)という分野が近年注目を集めています。
その注目の高まりから、PyTorch Geometric [2]やDeep Graph Library (DGL) [3]といった高機能で最適化されたGNNライブラリの開発が盛んに進められています。

Chainer Chemistryは、PFNが開発しているGNNのオープンソースのライブラリです。
名前からも分かるとおり、もともと分子など化学データへの適用を目的として作られたもので、qm9などの化学データセットが手厚くサポートされています。一方、他にGNNの研究でよく用いられるSNSなどのネットワークデータのサポートはなされていませんでした。

 

課題内容

今回のインターンのタスクは、Chainer Chemistryでネットワークデータのサポートを行うことです。そのために、大きく以下の2つの内容を行いました。

1. node classificationのサポート
化学分子データなどたくさんの小さなグラフのデータセットに対してGNNは、graph classification/regressionといった、グラフ全体の性質を学習するのに用いられます。
一方、巨大なネットワークデータに対しては、1つのグラフを入力として各頂点ラベルの分類を行うといった異なるタスクに用いられる事が多いです。
[4]で提案されているようなsemi-supervised node classificationへの対応を行いました。
具体的なフレームワークの違いはスライドをご参照ください。

2. 巨大でsparseなグラフのためのGNNの効率的な実装
こちらが今回のインターン内容のメインで、巨大なグラフを動かすためには必要不可欠な内容でした。
以下、\( V \) 個の頂点、\( E \)個の辺からなるグラフを考えます。
Message passingにもとづくGNNでは、各頂点に対して近傍の頂点の特徴量のaggregationの操作を行います。このaggregationの関数はpermutation invariantな様々な関数が用いられ、例えばよく使われるsumの場合は以下の式になります。
\( H’ = AH \)
(\( H \): 頂点の特徴量行列, \( A \): 隣接行列, \( H’ \): aggregateされた特徴量)

既存の実装は全てこの行列演算に基づくものでしたが、これは2つ問題点があります。
1つめは、グラフが疎な際にメモリ的にも実行時間的にも無駄が生じてしまうことです。
2つめは、batch化の際のゼロパディングのオーバーヘッドです。

これらの問題を解決するために、辺の情報を密な隣接行列ではなく、疎なデータ形式で持たせるという事が考えられます。今回のインターンでは、こちらのレポジトリでsparse patternとして紹介されているデータの持ち方を新たに実装しました。
これは辺の情報を\( [2, E] \)のサイズの行列で持つ手法で、PyTorch Geometricでも採用されています。

Sparse patternでは、scatter演算と呼ばれる命令を用いることでaggregation部分の計算量を\( O(E) \)で行うことができます。
またbatch化の際に、複数のグラフを全体として大きな1つのグラフとしてみなすことによってゼロパディングのオーバーヘッド完全になくすことができます。
こちらも、より詳細な手法が知りたい方はスライドをご覧ください。

 

結果

行列演算による既存実装と、sparse patternによる実装の速度比較は以下のようになりました。
まず、3312頂点、4660辺の疎なネットワークグラフに対しては、CPUでは50倍以上、行列演算との相性が良いGPU上でも2倍以上の速度改善が見られました。
また、1つ予想外だったのは、最大でも38頂点という比較的小さなグラフからなる化学データセットに対してもGPU上でも1.5倍程度の速度改善が見られたことです。
これには、バッチ化のオーバーヘッドをなくす工夫が効いていると考えられます。

sparse patternはグラフのconvolution演算に特化して実装されているため速いもののメモリ使用量にまだ無駄があり、Redditデータセット(23万頂点, 1100万辺)を動かすことはできませんでした。
これについては、ChainerのサポートしているCooMatrix演算によるモデルを用いたところsingle GPU (16GB)で動かすことができました。

これまで触れた、既存の隣接行列・sparse pattern・CooMatrixの3パターンについてまとめると、グラフが疎であったりバッチ化のオーバーヘッドが大きかったりすれば基本的にsparse patternが早く、それではメモリが足りない場合はCooMatrixを使うとよい、という結果になりました。
この結果を踏まえて、3つのパターンを場合に応じて使い分けられるように実装しています。
特に、現状のPyTorch Geometricでは動かすことができないredditなどの超巨大なグラフを動かせるという点は、Chainer Chemistryを使うモチベーションの1つになると思います。
新しいモデルを自分で実装したいときに、ChainerでサポートされているCooMatrix演算を普通の行列演算と同じようなインターフェースで直感的に使えるのも魅力です。

 

 

まとめ

今回の成果はChainer Chemistryにマージされています。新しい実装方針に対応しているモデルはまだ多くはありませんが、これからどんどん対応していく予定です。
exampleのコードを動かすことで簡単に巨大グラフ上での学習ができるようになっているので、ぜひ試してみてください。

 

参考資料

[1] https://arxiv.org/pdf/1901.00596.pdf
[2] https://rlgm.github.io/papers/2.pdf
[3] https://rlgm.github.io/papers/49.pdf
[4] https://arxiv.org/pdf/1609.02907.pdf

 

視覚からの触覚特性の推定 (ICRA2019 Best Conference Paper Award Finalist)

Kuniyuki Takahashi

2019-09-30 09:49:25

リサーチャーの高橋城志(Takahashi Kuniyuki)です.

2019年5月にロボティクス分野のトップ会議であるICRA2019が開催されました.そこに投稿された約2900件の論文から3件だけ選ばれるBest Conference Paper Award Finalistを受賞しました.この論文はリサーチャーのJethro Tanと執筆したもので,その紹介をします.論文,動画,データセットは下記から閲覧できます.

論文タイトル:Deep visuo-tactile learning: Estimation of Tactile Properties from Images

論文のリンク:https://arxiv.org/abs/1803.03435

データセット:https://github.com/pfnet-research/Deep_visuo-tactile_learning_ICRA2019

論文の動画:https://www.youtube.com/watch?v=ys0QtKVVlOQ&feature=youtu.be

視覚からの触覚特性の推定

 Fig. 1に物体の写真を何枚か載せています.人は物体の表面を触ることで,柔らかさや粗さといった触覚特性を知覚することができます.また,画像だけから触覚の特性とその度合い(e.g. 柔らかさとその程度)を推定できます.この能力は物体操作や歩行方法などの判断に必要になります.例えば,柔らかそうなものは優しく把持を行い,滑りそうな床では気をつけて歩くなどです.

Fig. 1 視覚からの触覚特性の推定

関連研究

 これまでの方法では,触覚特性やその度合を手動でラベル付けする,教師あり学習がほとんどでした.しかし,この方法では手動でつけられたラベルの種類や粒度に結果が依存することになります(Fig. 1).特性の種類(e.g. 柔らかさ,滑らかさ,べたつき)やどの程度の粒度を用意するかは事前に決めなければならなず,手動でのラベル付けで想定していない未知の物体や粒度に対しては,既存のラベルに割り振られてしまうという課題があります.

Deep visuo-tactile learning

 そこで,手動でのラベル付けをせずに,教師なし学習で触覚の特徴を獲得する,deep visuo-tactile learningを提案します(Fig. 2).このモデルはエンコーダ・デコーダ型の深層学習の入力を画像情報,出力を触覚情報を用いており,潜在変数に触覚特性を獲得させます.出力は教師信号がある教師あり学習ですが,潜在変数には教師がないため,触覚特性の獲得に関しては教師なし学習です.

Fig. 2 Deep visuo-tactile learning

 このモデルの学習後,潜在変数に触覚特性が連続値として表現されることになります.そのため,度合いの粒度を事前に決める必要がありません.物体の触覚特性の推論には,対象となる物体の画像を入力するだけで物体の触覚特性である潜在変数が得られます(Fig. 3).つまり,触覚センサは学習にのみ必要で,学習後の推論には触覚センサを必要としません.触覚センサは高価で壊れやすいため,触覚センサを使わずに触覚の特性を推論できるという利点があります.さらに,シミュレーションでは接触状態を扱うのが困難で,触覚情報を扱うことは難しいですが,本手法ではシミュレーションでの画像から触覚情報の推定も可能となります.

Fig. 3 学習後のDeep visuo-tactile learning

データセットの作成

モデルの評価のため,25種類の物体を用いて,新たなデータセットを作成しました(Fig. 4).このデータセットは公開していて,自由に使用できます.
https://github.com/pfnet-research/Deep_visuo-tactile_learning_ICRA2019
実験には,Sawyerと呼ばれる7自由度の腕を持ったロボット,及び,その手先にウェブカメラとuSkinと呼ばれる触覚センサを取り付けたものを使用しました.uSkinは16点のそれぞれのセルで圧力方向とせん断方向の力を取得できます.ロボットは物体表面をなぞる動作を行い,そのときの画像と触覚センサのデータを取得します.実際に取得した時系列における触覚センサの各セルの圧力方向とせん断方向の力のグラフをFig. 4に示します.

Fig. 4 データセット作成

評価実験:潜在変数の可視化

 作成したデータセットを学習させて,触覚センサの特性が表現されている潜在変数を可視化したものをFig. 5に示しています.図中の赤色の星は学習に使用した物体で,青色は学習に使用していない未知物体です.取得した触覚センサの値から,物体の摩擦が大きいほど緑色の円の色が濃くなるように描画しています.Fig. 5から布でない物体はLatent varialbe 1の軸の低い値にプロットされる一方,布の物体は高い値でプロットされていることが分かります.これは,触覚センサの表面を布で覆っていたため,触覚センサ表面の布と布の物体との摩擦が大きくなったためだと考えられます.このことから,潜在変数には摩擦情報が表現されていることが示されました.

Fig. 5 摩擦を表現したLatent Variable

 Fig. 5と同じ方法で,センサ情報から硬くて粗い物体ほど円の緑色が濃くなるように描画したものをFig. 6に示しています.図から硬くて粗い物体であるほど,Latent variable 2の軸において小さな値にプロットされていることが分かります.例えば,カーペットは硬くて粗いですが,バスタオルは柔らかくて滑らかと認識されています.また,色のみ異なる物体や似ている物体は近い位置でプロットされていることが分かります.このことから潜在変数に触覚の特性として柔らかさと硬さが表現されていることが示されました.

 本手法の性能限界を調べるため,紙に印刷された畳の画像から触覚特性を推論させました.その結果,印刷された畳は硬くて粗い物体と認識されていますが,本来推定するべきものは紙であるため,実際の特徴とは異なります.今回の手法では入力としては画像のみを使ったために生じた問題です.深さ情報まで含めた入力にすることで,物体表面の形状情報が取得できるようになるため,このような問題を解決できると考えています.

Fig. 6柔らかさと粗さを表現したLatent Variable

まとめ

画像からの触覚特性とその度合を推定するために,教師なし学習であるdeep visuo-tactile learningを提案しました.この研究の新規性は,教師なしで潜在変数に触覚特性を表現したこと,及び,画像と触覚情報を含んだ新たなデータセットを作成したことです.今後の展望として,推定した触覚特性を元にロボットに把持や歩行などの行動をさせることです.

化学反応におけるDeep learningの適用

Kosuke Nakago

2019-09-06 10:57:59

近年様々な分野に対してDeep learningの応用が研究されてきています。

化学の分野でも物性値の予測モデルや、化合物の生成モデルの研究などが盛んになってきています。最近では、有機化合物の合成を行う際に必要な化学反応の予測をDeep learningで行うという試みが行われてきているのでその先行研究サーベイをしました。

サーベイ資料はこちらのSlideshareにアップロードしています。

合成経路探索 -論文まとめ- (PFN中郷孝祐) from Preferred Networks

 

問題設定:反応予測および逆合成経路探索

化学反応で、反応物 (reactant) AとBを触媒 (reagent) Cの下で反応させたときに 生成物 (product) D ができたようなプロセスは Reaction SMILES を用いると “A.B.C>>D” というように表すことができます。

 

 

ここで、 AとBとC から何ができるか? (答えはD)を予測する問題を順方向の反応予測問題と呼び、Dを作るためには何を用いればよいか? (答えはA, B, C)を予測する問題を逆方向と呼ぶことにします。

一般的に、A, B, Cを与えた時に順方向でどういった反応が起こるかは限定されていますが、ある生成物 Dを作る方法は複数可能性がある場合があり、逆方向の解析の方が難しい問題です。

例えば創薬など、目的の性質を持つある有機化合物が先に決まっていて、それを工業的に合成するためにどういった反応物を用いればいいか知りたい場合は、逆合成解析 (retrosynthetic analysis)・逆合成経路探索が必要となります。

機械学習で予測モデルを作る際、順方向の予測問題は実際にデータセットにある反応で生成物が当てられたかどうかの精度で評価することができますが、逆方向の予測問題はデータセットにはないが現実で起こりうる反応物の組み合わせに分解することもできるため評価も難しいです。今回読んだ論文では、既に知られている化合物の合成プロセスを見つけることができたかどうか?で、逆合成経路の性能評価を行っていました。

 

研究動向

従来は、機械学習を用いるのではなく、反応パターンを事前に人が定義しておいて、そのパターンに当てはまるかどうかをルールベースで計算することで反応の予測計算をしていました。しかし、この方法では以下の問題があります

・反応パターンとして事前定義したパターンの適用しかできず、複数パターンにマッチした場合の優先度決めが難しい(精度面)

・パターンのマッチにはグラフのサブグラフマッチングが必要で計算が重い(速度面)

 

そこでデータドリブンで反応を扱う取り組み、特に深層学習を用いるアプローチが考えられ始めました。

2016年頃は合成ルール等をある程度制限し、限定された合成ルールに対して機械学習を適用するといったアプローチが主でした。(上図、一番左側)

これまではそもそも研究用途に使えるデータが整備されておらず、一部の研究機関のみがClosedで研究しているような状況でしたが、最近 アメリカのパテントから化学反応を集めて整備した、USPTOデータセットが公開され、順方向の反応予測に適用されました。

データセットが公開された2017年頃から一気に、Deep learningの適用により順方向の予測精度をあげる研究が盛んになってきました。(上図、真ん中・右側)

現在、2通りのアプローチが競争している状況です。

1.分子をグラフとみなして Graph Convolutionモデルを用いるアプローチ

2.分子をSMILES記法の文字列で表現してNLPの分野で発展した自然言語処理モデル(seq2seq、Transformer)を用いるアプローチ

(それぞれ手法の詳細は割愛します、SlideShare でご覧ください。)

 

どちらのアプローチも高精度で反応を予測できるようになってきており、すでに化学研究者よりもきちんと反応を予測できるという報告もあります (下図は Jin et al. より)

 

現時点では MolecularTransformer という自然言語処理側のモデルがSoTAを達成しているようです。IBM RXNとしてWebサービスでも公開されています。

上記のように順方向の反応予測は精度が向上してきており、今後の課題・発展として逆方向経路探索への適用や合成可能性を考慮した生成モデルの研究などがあげられます。

 

さいごに

今回紹介したような領域では、反応・合成の知識(化学側)と研究スピードの速いDeep learningの最先端の知識(コンピュータ側)双方を深く理解する必要があり、画像などの領域と比べるとまだ参入者がそれほど多くない印象です。

しかし、徐々に論文や公開実装も出てきており、このような領域でもDeep learningの技術優位性がでるかどうかの研究はこれからどんどん盛んになっていくのではないかと感じています。

再計算でニューラルネット学習時のメモリ消費を減らす

楠本充
エンジニア

2019-09-04 11:40:25

エンジニアの楠本です。深層学習で再計算と呼ばれる手法を使って学習時のメモリ消費を削減する研究や実装に取り組んでいるのでその紹介をしたいと思います。

背景

大規模なニューラルネットの学習ではしばしば誤差逆伝播(以下同様)で GPU のメモリ不足に陥ることがあります。

通常、誤差逆伝播ではパラメータについての勾配を求める際に必要な順伝播の計算結果を (途中の計算結果も含めて) すべて覚えた状態で勾配計算を行います。

一方で、例えばコンピュータビジョンの重要なタスクであるセグメンテーションや物体検出では入力画像として高解像度のものがしばしば扱われます。モデルについても高精度を達成するために複雑なネットワーク設計、すなわち層が深くまた中間表現のチャンネル数の多いネットワークが使われることが少なくありません。

このように入力やモデルが巨大である場合には記憶しておくべき途中の計算結果全体が巨大になり、学習中のメモリ不足に繋がります。

GPU のメモリサイズはハードウェアの進歩で大きくなってはいるものの、大規模な学習には足りないことがあります。現状で商用販売されているGPUのメモリは最もハイエンドな Tesla V100でも最大 32 GB であり、大規模な学習ではメモリ不足を回避するためにバッチサイズをかなり小さい値にしなければいけないことがあります。バッチサイズを小さくすることは Batch Normalization で使われる統計情報推定を不正確にし、モデルの精度低下につながることが検出等のタスクで知られています[1]。

メモリ不足は深層学習の根幹的な問題であるため様々な解決方法が試されています。例えば半精度浮動小数点数 (FP16) やネットワークのサイズ削減などはその一例でしょう。しかしこれらは本来学習したいモデルに直接変更を加えることになるため、予測精度を悪化させることに繋がりえます。これから紹介する再計算と呼ばれる手法を使うとモデルの予測精度を変えることなくメモリを削減することができます。この場合、精度ではなく、学習時の計算時間が増えることを引き換えにします。

逆誤差伝播法の復習

ここで少し順番が前後しますが、ニューラルネットの学習方法である誤差逆伝播法について今一度復習します。

ニューラルネットワークは変数と計算の順序関係を示す計算グラフによって表現できます。この計算グラフをどう表現するかはいくつか流儀がありますが、ここでは計算グラフは変数を頂点とするグラフとします。これには入力変数、中間変数、出力変数を含みます。変数から変数の間には直接的な依存関係がある場合に枝が生えているものとします。

誤差逆伝播法は入力変数(モデルパラメータを含む)に対してその勾配を求めるための方法です。誤差逆伝播法の計算は多変数関数のチェインルールに基づいて計算されます。一般に勾配計算ではネットワークの出力を y として、それぞれの変数 z に対して勾配 ∂y/∂z を求めるのが目的です。これは∂y/∂y=1 から出発して再帰的に勾配を求めることができます。いま、z=f(x) のような関係があるときに ∂y/∂z を表すテンソルがわかっているとすると ∂y/∂x = ∂y/∂z ・ ∂z/∂x = ∂y/∂z ・ F(x) (ここで、F(x) := ∂f(x)/∂x とした) となるため、f に対してその勾配関数 F を事前に計算できる状態にしておけば勾配を計算できます。計算グラフの観点からすると、元の計算グラフ (順伝播部分と呼ぶことにします) から勾配の計算部分(逆伝播部分)を足していることになります。例えば3層のニューラルネットの順伝播部と逆伝播部は以下のような図になります (簡単のため、∂y/∂z を gz のように記しています) 。

再計算

計算グラフは勾配計算のための実行手順を与えてくれますが、これをそのまま実行すると順伝播部分での計算結果は逆伝播時に基本的にすべて必要となるため、単純に中間結果もすべて記憶しておくと、大規模学習ではメモリが足りなくなることがあります。しかしよく考えると順伝播ですべてを記憶せずに一部の中間結果を破棄したとしても、残りの中間結果からもう一度順方向に計算して必要な中間結果を復元さえできれば、逆伝播時に勾配計算を行うことができます。これにより計算のオーバーヘッドが発生する代わりにピーク時のメモリ消費を下げることできます。

このような手法を再計算あるいはチェックポインティング (checkpointing) と呼びます。再計算自体はニューラルネット固有の手法ではなく、自動微分のコミュニティで研究されていました[2][3]。再計算はメモリ消費を抑える代わりに追加の計算時間を発生させます。どの変数をどのタイミングで捨てるかという戦略によってメモリ消費とオーバーヘッドは変わります。近年になってディープラーニングの問題設定に特化した再計算手法が提案されるようになりました[4][5]。

ここではその一つである Chen らの手法 [4] を紹介します。簡単のため、計算グラフが n 層の直線的なネットワークになっている場合を考えます。実際の計算ではモデルパラメータが付いているかもしれませんが一旦無視します。いま、グラフを √n 個ごとに切って √n 個のブロックに分けたとします。順伝播ではそれぞれのブロックを計算した後にブロック間の境界となる部分の変数以外をメモリから捨てることにします。逆伝播では捨てた部分が必要になってしまいますが、残しておいた部分を起点として順伝播のブロックを一時的に復元することでそれぞれのブロック内で逆伝播を実行できます。これにより順伝播部分で再計算のオーバーヘッドが順伝播1回分だけ掛かる代わりに、メモリ消費を O(n) から O(√n) 程度に減らすことができます。ResNet のようにスキップ接続がある場合でも、関節点等でグラフを切れば似たようなことができます。

グラフ的形式化による再計算 (我々の提案手法)

ここからは我々が少し前に arXiv に投稿した論文である “A Graph Theoretic Framework of Recomputation Algorithms for Memory-Efficient Backpropagation” の紹介をします。こちらは2018年夏PFNインターンの井上卓哉さんとの研究成果でもあります。

深層学習で知られている再計算手法は適応可能範囲が計算グラフが限定的で、やや砕けた表現をすると「グラフが直線っぽい場合」に特化していました。しかし近年着目されているネットワークには U-Net のように大きなスキップ接続が存在したりして多様な構造を持っています。また、メモリと計算時間について良いトレードオフを取るという点も大事です。つまりメモリ不足がそこまで深刻でない状況ではできるだけオーバーヘッドを少なくするような再計算スケジュールを求めたいはずです。

そこで我々の論文では、任意の構造の (静的な) 計算グラフ *1 と利用可能なメモリ容量が与えられたときに、メモリ容量を超えない範囲でできるだけオーバーヘッドを小さくするスケジュールを求める離散的な最適化問題を考えます。

任意のグラフに対する再計算も、Chen らの手法の核である「グラフをブロックごとに切ってそれぞれのブロックごとに順伝播、再計算、逆伝播を行う」という考えを拡張できます。すなわち、元の計算グラフの頂点集合 V を V1, V2, …, Vk というブロックに分割し、V1→V2→…→Vk と順伝播計算するものだとします。するとこのような分割方法に対してそれに付随する再計算方法も自然に定まります。砕けた言い方をすると、順伝播で各ブロックを計算し終えた後には境界となるところをだけを覚えて、そうでないところは捨て去るようにします。逆伝播では忘れたところを復元します。よって分割方法を決めればそれに付随する自然な再計算方法の消費メモリとオーバーヘッドが定まります。

分割方法は残念ながら指数的に多く存在するので全探索などはできそうにないですが、もし分割列の途中状態の集合 (V1∪…∪Vi) としてありうるパターン数が少ないのだとすると動的計画法によって最適化問題の解を用いて求めることができます。パターン数が多いときでも、近似的に解くことで現実的に性能の良い解を求める方法も提案しています。

実験では PSPNet, ResNet, DenseNet, U-Net などのネットワークに対して提案手法を用いると計算時間が1.3~1.4倍程度になる代わりに40%-80%のメモリ削減を実現できることや、メモリに余裕がある場合には既存手法よりも計算時間のオーバーヘッドを小さくできることを確認しています。

*1 RNN のようなループを含む計算グラフであっても、ループ回数がイテレーションごとに固定であればループを展開して静的なグラフとみなせます。

Chainer-compiler 上での実装

まだ実験的な段階ではありますが、再計算手法を Chainer の学習で使えるようにする取り組みをしています。再計算では事前に計算グラフの構造が分かっている必要があるため、Chainer 本体ではなく計算グラフのコンパイラである Chainer-compiler 上でその実装を進めています。学習させるときの流れは以下のようになります。

  1. まず Python で記された Chainer のモデルを静的な計算グラフとして ONNX 形式にダンプします。これは ONNX-chainer を使えばできます。
  2. ONNX 形式の計算グラフを Chainer-compiler に渡すと学習のための逆伝播部分を足して勾配計算を実行可能な形式にします(Python からは `chainer.Chain` でラップされた状態で見られます)。オプション次第で再計算を含めたスケジュール生成を自動で行います。

Chainer-compiler には Python ラッパーがあり、元の Python コードに少し変更を加えるだけで使えるような形になっています。もし試してみたい方がいらっしゃったらドキュメントの Train your model with chainer-compiler を参考に実行してみてください。

まとめ

深層学習における再計算という手法の紹介と PFN での取り組みについて紹介しました。メモリ不足が深層学習研究開発のボトルネックにならない世の中が来ると素敵なのかもしれません。

ちなみに手動スケジューリングでいいのであれば、Chainer なら functions.forget を使うと比較的カジュアルに再計算ができます。

文献

[1] Chao Peng, Tete Xiao, Zeming Li, Yuning Jiang, Xiangyu Zhang, Kai Jia, Gang Yu, and Jian Sun. MegDet: A large mini-batch object detector. In IEEE Conference on Computer Vision and Pattern Recognition (CVPR), pages 6181–6189, 2018.

[2] Andreas Griewank and Andrea Walther. Evaluating derivatives: principles and techniques of algorithmic differentiation. Vol. 105. Siam, 2008.

[3] Benjamin Dauvergne and Laurent Hascoët. The data-flow equations of checkpointing in reverse automatic differentiation. International Conference on Computational Science. Springer, Berlin, Heidelberg, 2006.

[4] Tianqi Chen, Bing Xu, Chiyuan Zhang, and Carlos Guestrin. Training deep nets with sublinear memory cost. arXiv preprint, arXiv:1604.06174, 2016.

[5] Audrunas Gruslys, Rémi Munos, Ivo Danihelka, Marc Lanctot, and Alex Graves. Memory-efficient backpropagation through time. In Advances in Neural Information Processing Systems (NIPS), pages 4125–4133, 2016.

GraphNVP

Kosuke Nakago

2019-07-16 12:00:06

本記事は、2018年インターンシップ・PEとして勤務した Kaushalya Madhawa さんによる寄稿です。
本記事はこちらの英語ブログの日本語訳です。

本記事では、私たちが最近投稿した論文 “GraphNVP: An Invertible Flow Model for Generating Molecular Graphs” を紹介します。
コードも公開しています → Github repo

分子の生成モデル

望ましい薬理学的な物性値をもつ新しい分子の発見は創薬の分野において重要な問題です。これまで、候補となる化合物を実際に合成して実験を行うといったことがされてきました。
しかし、化合物のとりえる形の可能性は膨大でそれらを合成し、実験するということはとても時間がかかります。
このように望む物性値をもつ分子を探す代わりに、”de novo drug design” では、新しい化合物を興味対象とする物性値とともに設計するということを行います。

近年の深層学習の技術発展、特に深層生成モデルの分野は “de novo drug design” にとって重要な技術となってきています。

分子の表現方法

深層学習で分子の生成モデルを考える際、初めの重要なステップはどのように化合物を表現するかということです。
初期の研究では SMILES という、文字列ベースの表現方法を採用していました。
これらの研究は、 RNN ベースの言語モデルや、Variational AutoEncoder (VAE) を用いることで、SMILES の文字列を生成しそれを分子に変換します。
このアプローチの問題点はSMILES 文字列での小さな変化が分子全体でみると大きく変化するような場合があるということです。
そこで、分子をグラフを用いて表現しようというアプローチが出てきました。この問題は “molecular graph generation” として扱われます。

分子は無向グラフとして表現されます。原子をノード、結合 (bond) を辺に対応させます。この表記を用いると分子の構造・結合情報は Adjacency tensor (隣接テンソル) \( A \) として、また各ノードの原子(酸素、フッ素など)を node feature matrix \( X \) で表すことができます。この定式化の下で、分子の生成問題はグラフの生成問題として扱うことができ、これまでに技術発展してきた GANやVAEといった深層学習のモデルを用いることができます。さらにグラフの生成問題は2つのタイプに分類することができます。1つめは分子のグラフを”順番に” 生成する方法で ノード (原子) や 辺 (結合) を1つずつ生成していきます。もう1つの方法が直接グラフを生成するタイプで、画像の生成と似たように一度に全体を生成します。

可逆性

上記で紹介したVAEやGANと比較して、可逆な Flow を用いたモデルは尤度の最大化を直接行えるという長所があります。

さらに、Flow モデルは可逆な変換のみで構成されているので、逆変換が可能で100% 分子→潜在変数→分子 の再構成を行うことができます。

GANのみの生成モデルなどEncoder がない場合は、特定の分子を操作して生成・最適化を行うことは困難です。例えば、特定のベースとなる分子 (query) に似ている分子を生成して最適化を行っていくということが (創薬の分野で Lead optimization と呼ばれる) 困難です。一方Flow モデルは 分子の潜在変数を直接計算できるので、query 分子に対する潜在変数を簡単に求めることができそこから最適化を行うことも可能です。

提案モデル

model_reverse

提案モデルであるGraphNVPは上図のような構成をとります。GraphNVPは私たちの知る限りではOne-shot Graph生成モデルとして初めてFlow を用いたモデルです。
このモデルは辺に対応する変数とノードに対応する変数の2つの潜在変数を使用し、グラフ構造や原子種類の分布を表現できるようにします。
これらのをFlowの定式下で計算できるよう、 Adjacency Coupling および Node Feature Coupling と呼ばれる2つのCoupling layerを提案しました。
グラフの生成を行う際は、まずAdjacency tensorを生成し、次に Node feature tensor を graph convolutional network を用いて生成します。

結果

訓練データから分子をとり、その潜在変数 \( z_0 \) をGraphNVPで計算します。そして潜在空間上でランダムに選んだ2つの方向の軸に対して \( z_0\) が中心となるような2次元グリッドを構成し、その各点で潜在変数をデコードして分子を生成したものが下図となります。
下図の可視化結果では、似たような分子が並んでおり、隣どおしでは少しの原子が変わっているだけというようなものとなっており、提案モデルがスムーズな潜在空間の学習をできていることが見て取れます。

zinc_neighborhood_2d

 

 

さいごに:メンターより

Kaushalyaさんのメンターを担当した、中郷・石黒です。
今回の研究は2018年夏のインターンシップから始めたものです。このころはGraphの生成モデルの研究が盛んになり様々なアプローチでの生成モデルが提案され始めたころでしたが、まだFlowを用いたグラフの生成モデルはないので取り組んでみたいというKaushalyaさんの持ち込みからはじまったものでした。

グラフ生成モデルとしては初めての取り組みであり、またFlowを用いるモデルはかなり深いネットワークを使用する必要があり計算量も大きくなるということで、研究には時間がかかりましたが、最終的には論文として形にすることができ、コードも公開することができました。

最後に宣伝となりますが、PFNでは今回の “Drug Discovery / Material Discovery” の分野だけでなく、多種多様な業界で機械学習適用の横断プロジェクトを実施しており、中途・新卒の人材募集も通年で行っております!
興味のある方はぜひこちらのページをご覧ください。

プログラミング教育推進月間の教材について

Hiroshi Maruyama

2019-02-18 18:00:37

PFNフェローの丸山です。2月18日に、PFNは文部科学省、総務省及び経済産業省の「未来の学び プログラミング教育推進月間」に協力して、小学校向けのプログラミング教材を作成することを発表しました。この教材は、今年の9月に一部の小学校で、総合学習の一環として利用されることを目指しています(指導案のページはこちらです)。この記事では、私達PFNがなぜこのような活動をしているかをお話ししたいと思います。

PFNは若い会社です。多くの若い社員が次々に家庭を持ち、子どもを育て始めています。社長の西川をはじめ皆、次の世代が活躍し、よりよい社会を作っていくことを強く願っています。これからの社会を考えたとき、マーク・アンドリーセンが「ソフトウェアが世界を侵食する」(Software is eating the world) と言ったことに象徴されるように、社会の価値の多くが情報技術、特にソフトウェアから得られることは明らかです。ですから、私達の次の世代の誰もが、小さい頃から情報技術に親しみ、プログラミングの楽しさを知る機会を持てることは、私達にとっても大変喜ばしいことです。そんな若い人たちが、ソフトウェアに興味を持ち、将来社会のあらゆる場で活躍している、そんな社会の実現をPFNは願っています。

新しいスタイルのプログラミング

同時に私達は、技術の進歩によって、今までとは違う新しいスタイルのプログラミングが現れつつあることも強く認識しています。簡単にするため、プログラムとはある入力Xに対して出力Yを計算する箱であると考えます。

このようなプログラムを作る1つの方法は、計算のルールを書き下すことです。たとえば、商品の価格を入力としてその消費税を出力するプログラムを考えましょう。このようなプログラムは、入力Xに対して「X の0.08倍を計算してYとせよ」 というルールで表現することができます。これが普通のプログラムの作り方で、ここではルールによるプログラミングと呼ぶことにしましょう。

しかし、深層学習という新しい技術によって、別の形のプログラミングが現れてきました。こんな例を考えてみましょう。人とじゃんけんをする機械を作るために、カメラで撮った手の画像を入力として、それがグー・チョキ・パーのいずれであるかを判定して出力するプログラムを作りたいとします。

このようなプログラムを、ルールによるプログラミングで作るのは容易ではありません。カメラで撮影した画像は画素が格子状に並んだものですが、ある画素が肌色だからこれはチョキだ、と判断するわけにはいきません。同じチョキでも位置や角度や光源が違ったりして毎回異なる画像になるからです。

そこで、深層学習では、様々に異なるチョキの画像をプログラムに見せて「これはチョキだよ」と教えていくことによってプログラミングを行います。これを例示によるプログラミングと呼ぶことにします。例示によるプログラミングでは、ルールを書くのが難しいようなプログラムも作ることができます。

一方で、例示によるプログラミングでは、例示に使うデータによっては、必ずしも毎回正解が出ないかもしれません。あるいは例示に偏りがあった場合には、偏りのある結果が出るかもしれません。これは、ルールによるプログラミングが(プログラムに誤りが無い限り)常に正しい答えを出すこととは対照的です。

将来のソフトウェア

例示によるプログラミングは、ここ10年ほどの、深層学習の急速な発展によって可能になってきていて、今までのルールによるプログラミングでは難しかった画像認識、音声認識、機械翻訳などに応用されつつあります。これは、1950年代にデジタル計算機が発明されて以来の最大のパラダイムシフトかもしれません。おそらく、将来のソフトウェアの多くは、ルールによるプログラミングと例示によるプログラミングを組み合わせたハイブリッドなものになるでしょう。

私達が今回の「未来の学び プログラミング教育推進月間」にご協力している真の理由はここにあります。今の子供達が大人になって、社会におけるソフトウェア開発の一翼を担うころには、例示によるプログラミングが広く使われていることは間違いありません。ルールによるプログラミングが苦手でも、例示によるプログラミングは得意だ、という子どももいるでしょう。

「プログラミング」を狭く捉えないで、いろいろな考え方があるのだ、ということを知ってほしい、それが私達の願いです。