作って遊ぶ機械学習。

~基礎的な確率モデルから最新の機械学習技術まで~

深層学習はガウス過程

おつかれさまです. 僕はあまり深層学習に関して記事を書くことはないのですが,ちょっと気になった論文があったので紹介します.

[1711.00165] Deep Neural Networks as Gaussian Processes

論文はGoogle Brainの研究者らによるもので,NIPS2017 Bayesian Deep Learning WorkshopICLR2018にacceptされています.実は深層学習をガウス過程(Gaussian process)で構築するのはこの論文が初出ではないのですが,論文ではベイズ学習,深層学習,カーネル法を簡略かつ包括的に説明している内容になっているので非常に参考になります.

さて,「深層学習はガウス過程」というのはちょっぴり宣伝的なタイトルにし過ぎてしまったのですが,もう少しだけ正確に論文の要点をまとめると次のようになります.

  • 背景
  • やったこと
    • 深層学習に対するカーネル関数(kernel function)をガウス過程の共分散関数(covariance function)として使用し,深層学習モデルの完全なベイズ推論を1度の行列計算で行えるようにした
    • 効率よく共分散関数を計算できるパイプラインを開発した.
    • 実験ではベイズ推論による予測の不確かさがテストデータに対する予測誤差に相関していることが確認された.

今回の記事では,ガウス過程の基礎から論文の内容までをざっくり説明したいと思います.

ベイズ線形回帰からガウス過程まで

簡単に言うと,ここから紹介するガウス過程とはノンパラメトリックな回帰モデルです. まず始めにベイズ線形回帰から始めてガウス過程の成り立ちを説明しようと思います. 線形回帰モデルでは,実数の出力値{y_n}は,入力値{x_n}{D}次元への特徴量変換を行う関数{\phi()},パラメータ{w}を使って次のように生成されると仮定します. f:id:sammy-suyama:20180113122750p:plain ここでλは観測に対する固定の精度パラメータです. また,パラメータ{w}に仮定する事前分布として次のようなガウス分布を置きます. f:id:sammy-suyama:20180113122833p:plain ここで{Λ}{D}x{D}の精度行列です. 学習用に{N}組の入出力データ{X,Y}が与えられたとき,新規のテスト入力{x}*に対する出力{y}*の予測分布は,次のようにパラメータ{w}を事後分布で周辺化することによって得ることができます. f:id:sammy-suyama:20180113122900p:plain ただし,ガウス分布の平均と精度は次のようになります. f:id:sammy-suyama:20180113122934p:plain 詳細な計算方法に関しては拙著にまったく同じものが載っているのでよかったらご参考ください.

さて,式(4)の予測平均と予測分散を次のように書き直してみます. f:id:sammy-suyama:20180113123003p:plain ただし, f:id:sammy-suyama:20180113123018p:plain と置きました.また,大文字の{\Phi}{D}x{N}の行列であり,各{(d,n)}成分が{phi(x_n)}{d}次元目の値を表しています. ここでは行列のinverse lammaを使って式変形を行っています1. 式(5)および式(6)の結果を見てみると,特徴量関数{\phi}は常に f:id:sammy-suyama:20180113123120p:plain のような形に集約されていることがわかります.{k(x,x')}カーネル関数または共分散関数と呼びます.これはつまり,特徴量抽出を行う関数{\phi}を設計するのではなく,共分散関数{k(x,x')}を直接設計することによっても回帰が行えることを示しています.共分散関数は2つの入力点に関する相関を定義するものであるため,ある意味異なるデータ間の類似度のようなものを設計しているとも言えます.また当然ですが,共分散行列はガウス分布の共分散なので正定値である必要があります.

共分散関数の選択

さて,具体的な共分散関数にはどのようなものがあるのでしょうか.ガウス過程で最もよく使われている共分散関数の1つに,次のような指数2次カーネル(exponentiated quadratic kernel)と呼ばれるものがあります(RBF kernel, squared exponential kernel, gaussian kernelなどと呼ばれることもあります). f:id:sammy-suyama:20180113123054p:plain {\alpha}{\beta}はこの共分散関数のパラメータです.ガウス分布と同じ関数の形をしていますが,これはただ単にたまたまであり,ガウス分布のように正規化されている必要はありません.ちなみにこの共分散関数に対応する特徴量{\phi}というのも実は存在しており,無限次元の特徴量抽出になります2

さて,式(8)で表される共分散関数以外にも多くのものが提案されています.ニューラルネットに関連するものであれば,次のような無限ユニット数を持つERFやReLUといった非線形関数に対応した共分散関数が存在しますf:id:sammy-suyama:20180113123146p:plain また,複数の共分散関数を足したり掛けたりして組み合わせることによって新しい共分散関数を構築することも可能です3

いくつかの(解析的に計算できる)共分散関数に対して,単純な一次元の回帰を行ってみたのが次のアニメーションです.上段はそれぞれの事前分布からサンプルされた関数の例で,下段は順次データ点を与えていった場合の予測分布の推移を示しています. f:id:sammy-suyama:20180113123653g:plain 左から順に,多項式関数(3次関数),RBFカーネルニューラルネット(ERF),ニューラルネット(ReLU),ディープニューラルネット(ReLU)です.最後のディープに対する共分散関数の構成方法に関しては次の節で解説します.

また,この結果を生成するコードは下記Githubに置きました.コアな部分は20行程度ですhttps://github.com/sammy-suyama/MLBlog/blob/master/src/demo_GPDNN.jl

ガウス過程としての深層学習

さて,ここからは本題である深層学習モデルの共分散関数の導出に関して見ていきましょう. まず,非線形変換が1層だけのニューラルネットワークの回帰モデルを考えてみます. f:id:sammy-suyama:20180113123359p:plain {x_k}{k}次元目の入力データの値で,{z_i}{i}番目の出力です.{W}{b}はネットワークのパラメータであり,各要素が次のような1次元の独立なガウス分布に従って生成されていると仮定します. f:id:sammy-suyama:20180113123425p:plain 各パラメータが独立なので,異なる{N}個の{\phi}も独立に値が決定されることになります. ここで,隠れユニットの数{N}を無限にしたらどうなるでしょうか.ここでは{\phi}はもはや何の確率分布に従っているかは不明ですが,各{\phi}は独立であることがわかっているので,無限に足し合わせれば中心極限定理によりガウス分布に近づいていくことになります.最後に足される{{b_i}^1}ガウス分布に従うので,結果として出力{z}ガウス分布に従うことになります. したがって,非線形関数に関する共分散を期待値を使って書けば,{z}は次のような共分散関数を持つガウス過程として表せます. f:id:sammy-suyama:20180113123515p:plain この議論は一般的なL層のモデルに拡張しても成り立ちます.ある{l}{-}{1}層目の出力がガウス過程に従うならば,次の{l}層目の共分散もガウス過程に従うので同様にして共分散関数を計算できるわけです.この関係性を書いてみると, f:id:sammy-suyama:20180113123550p:plain となります.{F}{l}層目の非線形変換{\phi}から決定的に求められます. 具体的にReLUを非線形関数として選んだ場合の再帰式は次のようになります. f:id:sammy-suyama:20180113123614p:plain このカーネルを計算し,あとは一般的なガウス過程の予測の式(5)に入れて計算すれば,基本的には行列演算のみで深層学習のベイズ予測ができることになります.

下記の図は論文で示されている実験結果の1つです. f:id:sammy-suyama:20180113123813p:plain 横軸は予測分布が出力した分散で,縦軸はテストデータにおける二乗誤差です.図からわかるように,予測分散が大きくなるにつれて,テスト誤差も大きくなっていく傾向が見て取れます.すなわち,「予測に自信がない(=分散が大きい)場合は,実際に予測の間違えも大きくなっている」ということになります. これはベイズ学習を深層学習に用いた場合のもっとも重要な利点です.残念ながら現在の機械学習の評価方法は専ら予測誤差を使って精度評価のみを行うという慣習がついてしまっており,不確かさを表現できることの重要性が軽視されがちです.しかし,このような予測の不確かさの定量化は,少ないデータで効率良く学習したり,「過剰な自信」による誤判断を未然に防いだりすることができます.これが(深層学習に限らず)機械学習モデルをベイズ化することが,自動運転などのアプリケーションに重要であると考えられている所以です.また,環境を学習しながら報酬を最大化していくような強化学習などの枠組みでは,このような不確かさの定量化が効率的な探索を行う(explorationとexploitationのトレードオフを取る)ために不可欠になってきます.

論文には他にも計算効率の良い共分散の構成方法や,超パラメータに関する相転移の解析などが含まれており,そちらも大変興味深いです.今回の記事ではガウス過程と深層学習の関係性に注目したかったので割愛します.

所感と今後

ガウス過程で解釈することの利点

深層学習を共分散関数の中で表現し,ガウス過程として解釈する有用性はざっくり挙げるとすれば次のようにまとめられるでしょう.

  1. 原理的に過学習をしない
  2. 予測の不確実性を出力できる
  3. 共分散関数を自動的に最適化・選択できる

1と2はベイズ推論から来る当然の特性です.3に関しては,深層学習におけるネットワークの構造や非線形変換の自動学習を行っていることに対応するでしょう.現在はガウス過程を使って既存の深層学習の超パラメータを調整する方法(ベイズ的最適化)が流行っていますが,皮肉にも深層学習自体をガウス過程にしてしまった方が手っ取り早いということになりますね.

また,これらに付随して,モデルのデザイン性や解釈性に関しても今後は重要になるでしょう.Oxford大学教授でDeepMindのリサーチャーであるTeh先生は,NIPS2017の講演で「解釈のできないパラメータ空間ではなく,関数空間で考えよう」と言っています.

www.youtube.com このように,これからは深層学習をベイジアンノンパラメトリクスの文脈で組みなおす研究が増えてくるんじゃないかと思っています.

ガウス過程で解釈することの課題点

ところで,ガウス過程にしてしまうことで課題点もあります. 1つは,隠れユニットの数を無限にしてしまうと,出力の各次元が統計的に独立になってしまうことです.これにより,ニューラルネットワークに特有の「中間層で特徴量を表現する」みたいなことが原理的にできなくなります.ただし,論文では無限の中間層を持つガウス過程が伝統的な深層学習よりも実験的に良い結果を示しているので,この議論自体に意味があるかは疑問の残るところです.

これに関連する課題として,実はこちらの方が重要なのですが,出力が独立になってししまったことにより,多次元回帰やマルチタスク学習が原理的に行えないことが挙げられます.しかし,後述しますが,ガウス過程の研究では出力の次元間に関して相関を導入できる方法がすでにいくつか存在しています.

関連研究メモ

さて,他にも個人的に気になるガウス過程や深層学習の関連研究を思いつくまま並べておきます.

1.畳み込みモデル,時系列モデル

最新の論文ですが,畳み込みニューラルネット(convolutional neural network)のような構造をガウス過程に取り込む研究があります.

[1709.01894] Convolutional Gaussian Processes

また,LSTM(Long short-term memory)の出力をガウス過程の入力に使うような話もあります.

[1610.08936] Learning Scalable Deep Kernels with Recurrent Structure

2.カーネル関数の最適化や自動選択

興味深い事例として,与えられたデータに対してガウス過程のカーネル関数(共分散関数)を自動探索し,解析結果を自然言語で説明するようなシステムが考案されています.

Automatic Construction and Natural-Language Description of Nonparametric Regression Models

3.能動学習および強化学習

ベイズ推論を使えば不確実性に基づいて環境を探索できるので,直接強化学習の問題に応用することができます.

PILCO: A Model-Based and Data-Efficient Approach to Policy Search

4.マルチタスク学習

ガウス過程の出力ベクトルの次元間に相関を持たせる方法はいくつか提案されています.

Efficient Multioutput Gaussian Processes through Variational Inducing Kernels

5.潜在変数モデル

ガウス過程にはGPLVM(Gaussian process latent variable models)と呼ばれる潜在変数モデル版も存在します.GPLVMに今回のようなdeepなカーネルを使えば,VAE(variational auto encoder)などとは別の深層生成モデルが作れることになりそうです.

Bayesian Gaussian Process Latent Variable Model

また,通常のGPLVMをスタックする(GPの出力を別のGPの潜在的な入力にする)ことによって,deepなガウス過程を構成することもできます.

Deep Gaussian Processes

このような構成方法であれば,低層で抽出された潜在構造を次の層へシェアすることができます. 論文では「150個のデータに対して5層が最適」のような推定もできており,小規模データでも過学習しないベイズの強みが理解できますね.

6.スケーラビリティ

ガウス過程の最大の課題は大規模データに対するスケーラビリティです.まともに予測分布を計算しようとすると,データ数をNとしたときO(N3)の計算時間がかかってしまうため,普通にやるとビッグデータの時代には使い物になりません.幸いなことに,これまでに数多くの近似推論手法が開発されてきています.中でも有望なのが本ブログでも何度か紹介している変分推論法(variational inference)です.下記の論文で変分法を用いてガウス過程をスケーラブルにするテクニックが網羅的に紹介されています.

Scalable Gaussian Process Inference using Variational Methods

今後も深層学習と近似ベイズ推論の両研究分野で技術的な輸出入が起こると思います.いろいろな手法の理論的な一致や拡張・一般化が見られると面白そうですね.

7.ガウス過程以外を使う

例えばStudentのt過程は,ガウス過程と同じような特性を持ち合わせていながら,外れ値に頑強であるという特徴を持つので,これをディープなモデルに対して使ってみても良いかもしれません.

Student-t Processes as Alternatives to Gaussian Processes

基礎を知りたい方

最後になってしまって申し訳ないですが,今回の記事の内容を理解するために必要な基礎理論を解説した教科書・資料や,古典的な論文等を紹介しておきます.

Gaussian Process for Machine Learning

http://www.gaussianprocess.org/gpml/

Carl Edward Rasumussen先生によるガウス過程の教科書の決定版です. 2006年なのでちょっと古くなってきてしまいましたが,ガウス過程による回帰・分類はもちろん,共分散関数の構成法,モデル選択,大量データに対する近似学習法まで網羅しています.SVMなどの類似手法との関係性も解説しています.

Bayesian Learning for Neural Networks

http://www.springer.com/jp/book/9780387947242

1996年に執筆されたRadford Neal先生の伝説的論文ですが,高い先見性と深い洞察に驚かされます.ベイズニューラルネットハミルトニアンモンテカルロによる学習のほか,本記事で解説したニューラルネットガウス過程の関係性もここで解説されています.事実,近年の機械学習におけるガウス過程のブームはここから始まりました.また,無限に深くした場合のニューラルネットの挙動に関しても考察があります.

ガウス過程の基礎

日本語の解説スライドはこちらです.非常にわかりやすくまとめられています.

松井先生:

http://www.ism.ac.jp/~daichi/lectures/H26-GaussianProcess/gp-lecture1-matsui.pdf

持橋先生:

http://www.ism.ac.jp/~daichi/lectures/H26-GaussianProcess/gp-lecture2-daichi.pdf

ベイズ学習の基礎

拙著です.

ベイズ推論による機械学習入門 機械学習スタートアップシリーズ | 書籍情報 | 株式会社 講談社サイエンティフィクwww.kspub.co.jp