HELLO CYBERNETICS

深層学習、機械学習、強化学習、信号処理、制御工学、量子計算などをテーマに扱っていきます

ディープラーニングは自動で特徴を抽出してくれる?

 

 

follow us in feedly

はじめに

未だに強く主張されることの多い「ディープラーニングは人手の特徴抽出作業を自動で実施してくれる」という話。 このことについては肯定も否定もしないというのが私の立場ですが、基本的に「思っているより思い通りには行かない」という事実があることは主張しておきたいです。

そのために、今回「ディープラーニングが自動で特徴抽出を行ってくれる」ということがどういうことなのかを簡単に説明します。

特徴抽出とは

まず特徴抽出とは何かを説明していきましょう。特に断りが無い限りは大文字は行列、小文字はベクトルあるいはスカラーだと思って差し支えありません(今回は特に細かい数式の設定が議論に影響することはありません)。

今、入力 $x$ で出力が $y$ となるような適当なデータセット $D = \{(x_1, y_1), \cdots, (x_N, y_N)\}$ があるとしましょう。教師あり機械学習の主な目的は

$$ y = f(x) $$

をデータセット $D$ に基づいて上手に構築することで、新しい入力 $x'$ に対して関数 $f$ を用いて $y' = f(x')$ と出力を当てることです。 この時 $y$ が連続値ならば回帰と呼ばれますし、離散値なら分類と呼ばれます。

さて、この時、最も単純なケースでは下記の線形モデルを利用することができます。

$$ y = w\cdot x + b $$

このように入出力関係をおいてしまえば、パラメータ $w, b$ を上手に設定してあげることでモデルを構築することができます。ところで、 $y$ と $x$ の間にこのような関係があるのかは自分で検討をつけないといけないことに注意してください。

さて、もしも $y$ と $x$ の間に上記の単純な関係がどうにも見いだせそうに無いときはどうしましょう。大抵の場合がそうです。そのようなときには $x$ に何らかの加工を施し、 $y$ との関係性をうまく見出だせるように手を加えてあげる必要があります。 それが特徴抽出の大きな役割です。上手な特徴量を見つけることができれば、上記の単純な関係に持ち込める可能性があるからです。

ここで特徴量を見つけるための加工を $\phi(\cdot)$ という関数で表すことにします。この関数が具体的にどのようなものであるかは指定しません(それは問題に応じて変わるでしょうし、特徴抽出の力の見せ所です)。 仮にこのような特徴抽出関数が $x$ を上手に加工してくれたとして $\phi(x)$ と $y$ との間になら下記の単純な関係を見出だせるとしましょう。

$$ y = w \cdot \phi(x) + b $$

このような形式を「一般線形モデル」などと言います。 $\phi$ に多項式関数を選ぶ例は山ほど見てきたことでしょう。ちなみに $\phi(x)$ のことを世間では特徴ベクトルと言ったり、基底関数と言ったりもします。

実際には、 $x$ に対しては試行錯誤的に特徴抽出作業を行いつつ、加工された $x$ に対して、更によく知られている基底関数 $\phi(x)$ を使って一般線形モデル作るということもよく行われます。それは単に、試行錯誤的に特徴抽出を行う部分と、ある程度予想の付いている必要な特徴抽出作業を分離しているということになります。具体的には試行錯誤的にやってみる特徴抽出を $g(\cdot)$ と置いてみて、基底関数に $\phi(\cdot)$ を使うことにすれば、モデルは全体として

$$ y = w \cdot \phi(g(x)) + b $$

というように構築されているようなものです。このとき $g$ の方は試行錯誤的にいろいろ試して見るわけですから、 $g _ 1, g _ 2, ..., g _ K$ といくつかパターンを試していき

$$ \begin{align} y &= w \cdot \phi(g _ 1(x)) + b \\ y &= w \cdot \phi(g _ 2(x)) + b \\ &\vdots \\ y &= w \cdot \phi(g _ K(x)) + b \end{align} $$

でよさ気なものを選んで見るということが行われます(特徴抽出に慣れていれば、$g$ という加工を施してみたところで、それが使えそうかどうかの検討はつくので、最後まで手当たりしだいにモデルを作ってみるということはなかなか行われないはずであるが)。ここまでで、若干気づいてきた人もいらっしゃるかと思われます。ニューラルネットワークの話に移りましょう。

ニューラルネットワークによる特徴抽出

ニューラルネットワークの基本的な構成は

$$ y = w \cdot \sigma (V \cdot \sigma(x) + c) + b $$

というものになります。ここで、 $\sigma$ は何らかの活性化関数です。もっと多層になっていても構いませんが、簡単のため、二層(入力層を含むならば三層)のニューラルネットワークを記しました。いま、$\phi(x) = \sigma (x)$ とおいて、 $g(x) = v \cdot \sigma (x) + c$ とおいてやれば

$$ y = w \cdot \phi(g(x)) + b $$

と書きなおすことができます。これは、最後の層を単に一般線形モデルと思って扱い、中間層を何らかの試行錯誤的な特徴抽出の加工だと思ってしまうことができるということです。中間層を手当たりしだいに増やしまくればもっと複雑な特徴抽出の加工が施されることになります。このニューラルネットワークをデータセット $D$ で学習させた後に、関数 $g(x)$ だけを取り出して、別の( $D$ に似た)データセット $D'$ に対して、

$$ y = w' \cdot \phi(g(x)) + b' $$

というモデルを構築し、 $w', b'$ を学習させることを「転移学習」と呼びます(この転移学習が割とうまく行くということで、「ニューラルネットは特徴抽出を自動で行ってくれていた」という主張を後押ししてます)。ついでに、 $D$ で学習させたニューラルネットワーク

$$ y = w \cdot \phi(g(x)) + b $$

を別のデータセット $D'$ で丸々再学習させることを「ファインチューニング」と呼びます。これは、 $g(x)$ を特徴抽出器として固定せずに使うことに注意しましょう。ニューラルネットワークが $D$ を学習しおえたときに、「 $D'$ にとって都合の良いパラメータの初期値を得てくれていた」と信ずれば、このような方針を取ることもできます。

深層学習は特徴抽出を自動で行うのか

さて、本題の自動で特徴抽出を行うのかという話に関して、ニューラルネットワークを実際に学習させてみたことがあれば「んー、特徴抽出してくれるかはわからん」というのが結論になるでしょう。 個人的には、世間で言われる「深層学習は特徴抽出を自動で行ってくれる」という期待に対しては、「No」と答えたほうが良いと思っています。

なぜなら世間で言うこの言葉は、文字通り「自動で行ってくれる」ことを期待しているからです。より具体的には「深層学習は自動で特徴抽出をしてくれる → 深層学習を使えば人手の作業を排除できる」ということを望んでいるのです。

しかし実態は違います。「人手の作業を無しに深層学習で高い性能が得られる場合があった → そのモデルを使えば同じタスクでは人手の作業を排除できる」というものなのです。要するに学習をすれば自動で特徴抽出してくれるのではなく、特徴抽出がたまたまできたモデルを使えば、(当たり前だが)特徴抽出を人手でやらなくても済むということなのです。

そして、当然、深いニューラルネットワークの学習はそれほど容易ではありません。莫大な量のパラメータを決定するために莫大な量のデータが必要です。そして、極めて解釈性に乏しいニューラルネットワークですから、その評価は慎重に行う必要があります。本当に期待している性能を達成できているのでしょうか(多くの場合、ただ過学習です)。そしてニューラルネットワークに入門した時に扱うMNISTの例のように、全結合層を使うより畳み込み層を使ったほうが性能が出るという「モデリングによる差異」があります。

もしも目の前にある新たなタスクに対して「どのような層を使えば良いのか」を瞬時に判断でき、モデルの検証を必ず正しく実施できるというのであれば、それは自動で特徴抽出してくれるも同然かもしれません。しかし、実際には多くの試行錯誤と繰り返しの評価を実施する必要があり、とても「自動で…」などという話ではありません。特徴抽出の試行錯誤が、層の構築の仕方やハイパーパラメータのチューニングの試行錯誤に変わっただけです。

補足:本当に自動機械学習に向けて

しかし、自動での学習への夢を人間は捨てたわけではありません。そのためにAutoMLという分野が最近では発展してきているようです。AutoMLとは様々な試行錯誤の部分を学習の中に含める試み(実験の進め方を何らかの方法で自動化する)です。

www.hellocybernetics.tech

ただ、これはモデル構築と評価の実験サイクルを肩代わりしてくれるだけであり、「そのタスクが機械学習で解くべき問題であるか」の判断をしてくれるわけではありません。 実問題においては「タスクを機械学習で解ける問題に置き換える」という能力は非常に重要で、この部分をクリアできれば「使えるモデル」が構築できるはずです。その「使える」の度合い、特に「精度」を良くするという面でAutoMLなりが有効に働くということになります。

なぜこんな話をするかというと、「ディープラーニングが自動で特徴抽出を行い、高い精度を達成する」という言葉が独り歩きし、さらには「AutoMLは自動で予測モデルを作ってくれる」という言葉が独り歩きし、やがて、「機械学習で解ける問題への翻訳」無しにトンデモなプロジェクトがどんどん乱立したりするのではないかと思ったからです(誰やねんお前)。

これはネガティブな話をしているのではなく、正しく利用すればディープラーニングもAutoMLも強力だということを言いたいのです(その「正しく利用する」の部分を強調しているだけで…)。