.. _sec_why-conv: 全結合層から畳み込みへ ====================== 今日に至るまで、 これまで議論してきたモデルは、 表形式データを扱う場合には 依然として適切な選択肢である。 表形式とは、データが 例に対応する行と特徴量に対応する列から 構成されていることを意味する。 表形式データでは、私たちは 探したいパターンが特徴量間の相互作用を 含むかもしれないと予想できるが、 特徴量がどのように相互作用するかについての構造を *先験的に*\ 仮定しない。 ときには、より洗練されたアーキテクチャの構築を導くための知識が 本当に不足していることがある。 このような場合、MLPが 私たちにできる最善の方法かもしれない。 しかし、高次元の知覚データでは、 このような構造を持たないネットワークは扱いにくくなりがちである。 たとえば、猫と犬を見分けるという これまでの例に戻ろう。 十分に丁寧なデータ収集を行い、 1メガピクセルの写真からなる注釈付きデータセットを 集めたとする。 これは、ネットワークへの各入力が 100万次元を持つことを意味する。 たとえ1000個の隠れ次元へと強引に削減したとしても、 :math:`10^6 \times 10^3 = 10^9` 個のパラメータを持つ 全結合層が必要になる。 大量のGPU、分散最適化の才能、 そして並外れた忍耐力がない限り、 このネットワークのパラメータを学習することは 実行不可能かもしれない。 注意深い読者は、 1メガピクセルの解像度は必要ないのではないかと この議論に異を唱えるかもしれない。 しかし、10万画素で済ませられるとしても、 サイズ1000の隠れ層は、 画像の良い表現を学習するのに必要な 隠れユニット数を大幅に過小評価している。 したがって、実用的なシステムでは 依然として数十億個のパラメータが必要になるだろう。 さらに、これほど多くのパラメータを当てはめて分類器を学習するには、 膨大なデータセットの収集が必要になるかもしれない。 それにもかかわらず、今日では人間もコンピュータも 猫と犬をかなりうまく見分けることができ、 これらの直感に反しているように見える。 それは、画像には 人間にも機械学習モデルにも活用できる 豊かな構造があるからである。 畳み込みニューラルネットワーク(CNN)は、 自然画像に存在する既知の構造の一部を活用するために 機械学習が取り入れた創造的な方法の一つである。 不変性 ------ 画像中の物体を検出したいとしよう。 物体を認識するために用いる方法は、 画像内でその物体がどこにあるかという 正確な位置を過度に気にすべきではない、 というのはもっともらしく思える。 理想的には、私たちのシステムはこの知識を活用すべきである。 豚は普通は飛ばず、飛行機は普通は泳がない。 それでも、画像の上部に豚が現れたとしても、 私たちはそれを豚だと認識できるべきである。 ここでは、子どものゲーム「ウォーリーをさがせ」から いくらか着想を得ることができる (このゲーム自体も、 :numref:`img_waldo` に示すような 多くの実世界の模倣を生み出した)。 このゲームは、さまざまな活動であふれた 混沌とした場面がいくつも並んでいる。 ウォーリーはそれぞれの場面のどこかに現れ、 たいていはありそうもない場所にひそんでいる。 読者の目標は彼を見つけることである。 彼の特徴的な服装にもかかわらず、 多くの気を散らす要素のために、 これは驚くほど難しいことがある。 しかし、\ *ウォーリーがどのように見えるか*\ は、 *ウォーリーがどこにいるか*\ には依存しない。 私たちは画像全体をウォーリー検出器で走査し、 各パッチにスコアを割り当てて、 そのパッチにウォーリーが含まれている確率を示すことができる。 実際、多くの物体検出やセグメンテーションのアルゴリズムは このアプローチに基づいている :cite:`Long.Shelhamer.Darrell.2015`\ 。 CNNは、この\ *空間的不変性*\ という考えを体系化し、 より少ないパラメータで有用な表現を学習するために これを活用する。 .. _img_waldo: .. figure:: ../img/waldo-football.jpg :width: 400px ウォーリーを見つけられるだろうか(画像提供: William Murphy (Infomatique))? ここで、これらの直感をより具体的にし、 コンピュータビジョンに適したニューラルネットワークアーキテクチャの設計を導く いくつかの要件を列挙してみよう。 1. 最初の層では、画像内のどこに現れても、 同じパッチに対してネットワークが同様に反応すべきである。 この原理は\ *平行移動不変性*\ (または\ *平行移動等価性*\ )と呼ばれる。 2. ネットワークの最初の層は、画像の遠く離れた領域の内容に関係なく、 局所領域に注目すべきである。これが\ *局所性*\ の原理である。 最終的には、これらの局所表現を集約して 画像全体レベルで予測を行える。 3. 進むにつれて、より深い層は、 自然界における高次の視覚に似た形で、 画像のより長距離の特徴を捉えられるべきである。 これが数学にどう対応するかを見ていこう。 MLPへの制約 ----------- まず、2次元画像 :math:`\mathbf{X}` を入力とし、 その直後の隠れ表現 :math:`\mathbf{H}` も同様に行列として表される (コード上では2次元テンソルです)MLPを考える。 ここで、\ :math:`\mathbf{X}` と :math:`\mathbf{H}` は同じ形状を持つとする。 少し考えてみてほしい。 ここでは、入力だけでなく 隠れ表現も空間構造を持つと考える。 :math:`\mathbf{X}` の位置 :math:`(i,j)` にある画素と :math:`\mathbf{H}` の位置 :math:`(i,j)` にある画素をそれぞれ :math:`[\mathbf{X}]_{i, j}` と :math:`[\mathbf{H}]_{i, j}` で表す。 したがって、各隠れユニットが 各入力画素から入力を受け取るようにするには、 (これまでMLPで行っていたように)重み行列を使う代わりに、 パラメータを4階の重みテンソル :math:`\mathsf{W}` として表現することになる。 :math:`\mathbf{U}` がバイアスを含むとすると、 全結合層は形式的に次のように表せる。 .. math:: \begin{aligned} \left[\mathbf{H}\right]_{i, j} &= [\mathbf{U}]_{i, j} + \sum_k \sum_l[\mathsf{W}]_{i, j, k, l} [\mathbf{X}]_{k, l}\\ &= [\mathbf{U}]_{i, j} + \sum_a \sum_b [\mathsf{V}]_{i, j, a, b} [\mathbf{X}]_{i+a, j+b}.\end{aligned} :math:`\mathsf{W}` から :math:`\mathsf{V}` への切り替えは、 今のところは単なる表記上の変更にすぎない。 というのも、両方の4階テンソルの係数の間には 1対1対応があるからである。 添字 :math:`(k, l)` を :math:`k = i+a` および :math:`l = j+b` となるように 単に付け替えただけである。 言い換えると、 :math:`[\mathsf{V}]_{i, j, a, b} = [\mathsf{W}]_{i, j, i+a, j+b}` と置いている。 添字 :math:`a` と :math:`b` は正負両方のオフセットを取り、 画像全体を覆う。 隠れ表現 :math:`[\mathbf{H}]_{i, j}` の任意の位置 :math:`(i,j)` に対して、 その値は、\ :math:`(i, j)` を中心とする :math:`x` の画素を :math:`[\mathsf{V}]_{i, j, a, b}` で重み付けして和を取ることで計算される。 先へ進む前に、このパラメータ化で *1層*\ に必要なパラメータ総数を考えてみよう。 :math:`1000 \times 1000` の画像(1メガピクセル)が :math:`1000 \times 1000` の隠れ表現へ写像されるとする。 この場合、\ :math:`10^{12}` 個のパラメータが必要であり、 これは現在のコンピュータでは到底扱えない。 平行移動不変性 ~~~~~~~~~~~~~~ では、上で述べた第一の原理、 平行移動不変性 :cite:`Zhang.ea.1988` を適用しよう。 これは、入力 :math:`\mathbf{X}` のシフトが 隠れ表現 :math:`\mathbf{H}` のシフトを 単に引き起こすべきであることを意味する。 これが可能なのは、 :math:`\mathsf{V}` と :math:`\mathbf{U}` が実際には :math:`(i, j)` に依存しない場合だけである。 したがって、 :math:`[\mathsf{V}]_{i, j, a, b} = [\mathbf{V}]_{a, b}` かつ :math:`\mathbf{U}` は定数、たとえば :math:`u` となる。 その結果、\ :math:`\mathbf{H}` の定義は次のように簡単になる。 .. math:: [\mathbf{H}]_{i, j} = u + \sum_a\sum_b [\mathbf{V}]_{a, b} [\mathbf{X}]_{i+a, j+b}. これは\ *畳み込み*\ である! 私たちは実質的に、位置 :math:`(i, j)` の近傍にある :math:`(i+a, j+b)` の画素を 係数 :math:`[\mathbf{V}]_{a, b}` で重み付けして、 :math:`[\mathbf{H}]_{i, j}` の値を得ている。 :math:`[\mathbf{V}]_{a, b}` は画像内の位置に依存しなくなったため、 :math:`[\mathsf{V}]_{i, j, a, b}` よりもはるかに少ない係数で済むことに注意してほしい。 したがって、必要なパラメータ数はもはや :math:`10^{12}` ではなく、 はるかに現実的な :math:`4 \times 10^6` になる。 それでもなお、\ :math:`a, b \in (-1000, 1000)` への依存は残っている。 要するに、私たちは大きく前進したのである。 時間遅延ニューラルネットワーク(TDNN)は、 この考えを活用した最初期の例の一つである :cite:`Waibel.Hanazawa.Hinton.ea.1989`\ 。 局所性 ~~~~~~ 次に、第二の原理である局所性を適用しよう。 上で動機づけたように、 位置 :math:`(i, j)` の周囲からあまり遠くまで見なくても、 :math:`[\mathbf{H}]_{i, j}` で何が起きているかを評価するのに 必要な情報を得られるはずだと考える。 これは、ある範囲 :math:`|a|> \Delta` または :math:`|b| > \Delta` の外側では、 :math:`[\mathbf{V}]_{a, b} = 0` とすべきことを意味する。 同値に、\ :math:`[\mathbf{H}]_{i, j}` は次のように書き直せる。 .. math:: [\mathbf{H}]_{i, j} = u + \sum_{a = -\Delta}^{\Delta} \sum_{b = -\Delta}^{\Delta} [\mathbf{V}]_{a, b} [\mathbf{X}]_{i+a, j+b}. :label: eq_conv-layer これにより、パラメータ数は :math:`4 \times 10^6` から :math:`4 \Delta^2` に減る。 ここで、\ :math:`\Delta` は通常 10 より小さい。 このようにして、私たちはさらに4桁のオーダーでパラメータ数を削減した。 :eq:`eq_conv-layer` は、要するに\ *畳み込み層*\ と呼ばれるものである。 *畳み込みニューラルネットワーク*\ (CNN)は、 畳み込み層を含むニューラルネットワークの特別な一族である。 深層学習研究コミュニティでは、 :math:`\mathbf{V}` は\ *畳み込みカーネル*\ 、 *フィルタ*\ 、あるいは単に学習可能パラメータとしての 層の\ *重み*\ と呼ばれる。 以前は、画像処理ネットワークのたった1層を表現するのに 数十億個のパラメータが必要だったかもしれないが、 今では通常、入力や隠れ表現の次元を変えずに、 数百個程度で済む。 この劇的なパラメータ削減の代償として、 特徴が平行移動不変になり、 各隠れ活性の値を決める際に 層が局所情報しか取り込めなくなることがある。 すべての学習は、帰納バイアスを課すことに依存している。 そのバイアスが現実と一致していれば、 少ないサンプルで学習でき、 未見データにもよく一般化するモデルが得られる。 しかしもちろん、そのバイアスが現実と一致しなければ、 たとえば画像が実際には平行移動不変でなかったなら、 モデルは訓練データにさえうまく適合できないかもしれない。 この劇的なパラメータ削減は、最後の要件へと私たちを導く。 すなわち、より深い層は画像のより大きく複雑な側面を表現すべきだということである。 これは、非線形性と畳み込み層を何度も交互に重ねることで実現できる。 畳み込み -------- なぜ :eq:`eq_conv-layer` が畳み込みと呼ばれるのかを、 簡単に復習しよう。 数学では、2つの関数 :cite:`Rudin.1973`\ 、 たとえば :math:`f, g: \mathbb{R}^d \to \mathbb{R}` の間の\ *畳み込み*\ は次のように定義される。 .. math:: (f * g)(\mathbf{x}) = \int f(\mathbf{z}) g(\mathbf{x}-\mathbf{z}) d\mathbf{z}. つまり、一方の関数を「反転」して :math:`\mathbf{x}` だけ平行移動したときの、 :math:`f` と :math:`g` の重なりを測っている。 離散的な対象を扱う場合には、積分は和に変わる。 たとえば、添字が :math:`\mathbb{Z}` を走る 二乗和可能な無限次元ベクトルの集合からのベクトルについては、 次の定義が得られる。 .. math:: (f * g)(i) = \sum_a f(a) g(i-a). 2次元テンソルでは、\ :math:`f` に対して添字 :math:`(a, b)`\ 、 :math:`g` に対して添字 :math:`(i-a, j-b)` を用いる対応する和を持つ。 .. math:: (f * g)(i, j) = \sum_a\sum_b f(a, b) g(i-a, j-b). :label: eq_2d-conv-discrete これは :eq:`eq_conv-layer` に似ているが、1つ大きな違いがある。 :math:`(i+a, j+b)` を使う代わりに、差を使っているのである。 ただし、この違いは主として表記上のものにすぎない。 というのも、:eq:`eq_conv-layer` と :eq:`eq_2d-conv-discrete` の間で いつでも記法を対応づけられるからである。 元の :eq:`eq_conv-layer` の定義は、より正確には *相互相関*\ を表している。 これについては次の節で戻ってくる。 .. _subsec_why-conv-channels: チャネル -------- ウォーリー検出器に戻って、これがどう見えるかを見てみよう。 畳み込み層は、 :numref:`fig_waldo_mask` に示すように、 所定のサイズの窓を取り出し、フィルタ :math:`\mathsf{V}` に従って強度に重みを付ける。 私たちは、どこで「ウォーリーらしさ」が最も高いかに応じて、 隠れ層表現にピークが現れるようなモデルを学習したいと考えるかもしれない。 .. _fig_waldo_mask: .. figure:: ../img/waldo-mask.jpg :width: 400px ウォーリーを検出する(画像提供: William Murphy (Infomatique))。 この方法には1つ問題がある。 これまで私たちは、画像が3つのチャネル、 すなわち赤・緑・青から成ることをうっかり無視していた。 要するに、画像は2次元の対象ではなく、 高さ・幅・チャネルで特徴づけられる3階テンソルであり、 たとえば :math:`1024 \times 1024 \times 3` ピクセルの形状を持つ。 最初の2つの軸は空間的関係に関わるが、 3つ目の軸は各画素位置に多次元表現を割り当てるものと見なせる。 したがって、\ :math:`\mathsf{X}` は :math:`[\mathsf{X}]_{i, j, k}` としてインデックス付けする。 畳み込みフィルタもそれに応じて適応しなければならない。 :math:`[\mathbf{V}]_{a,b}` の代わりに、今度は :math:`[\mathsf{V}]_{a,b,c}` を持つ。 さらに、入力が3階テンソルであるのと同様に、 隠れ表現も同様に3階テンソル :math:`\mathsf{H}` として定式化するのが 良い考えであることがわかる。 言い換えると、各空間位置に対応する単一の隠れ表現を持つのではなく、 各空間位置に対応する隠れ表現のベクトル全体を 持ちたいのである。 隠れ表現は、いくつもの2次元グリッドを 積み重ねたものと考えられる。 入力と同様に、これらはしばしば\ *チャネル*\ と呼ばれる。 また、各層が次の層のために学習された特徴の 空間化された集合を提供することから、 *特徴マップ*\ とも呼ばれる。 直感的には、入力に近い低い層では、 あるチャネルはエッジの認識に特化し、 別のチャネルはテクスチャの認識に特化する、と考えられる。 入力(\ :math:`\mathsf{X}`\ )と隠れ表現(\ :math:`\mathsf{H}`\ )の両方で複数チャネルを扱うために、 :math:`\mathsf{V}` に4つ目の座標を追加できる: :math:`[\mathsf{V}]_{a, b, c, d}`\ 。 すべてをまとめると、次のようになる。 .. math:: [\mathsf{H}]_{i,j,d} = \sum_{a = -\Delta}^{\Delta} \sum_{b = -\Delta}^{\Delta} \sum_c [\mathsf{V}]_{a, b, c, d} [\mathsf{X}]_{i+a, j+b, c}, :label: eq_conv-layer-channels ここで :math:`d` は隠れ表現 :math:`\mathsf{H}` における出力チャネルを表す。続く畳み込み層は、3階テンソル :math:`\mathsf{H}` を入力として受け取る。 一般性のために、 :eq:`eq_conv-layer-channels` を 複数チャネルに対する畳み込み層の定義とみなし、 :math:`\mathsf{V}` をその層のカーネルまたはフィルタとする。 まだ対処すべき操作はたくさんある。 たとえば、すべての隠れ表現を 1つの出力にどうまとめるか、 たとえば画像のどこかにウォーリーが\ *いる*\ のかを 判定する方法を考える必要がある。 また、どのように効率よく計算するか、 複数層をどう組み合わせるか、 適切な活性化関数は何か、 そして実際に有効なネットワークを得るために どのような設計選択が妥当かも決める必要がある。 これらの問題については、本章の残りで扱う。 要約と考察 ---------- この節では、畳み込みニューラルネットワークの構造を 第一原理から導出した。 これがCNNの発明に至った経路だったかは不明だが、 少なくとも低次のレベルでは、 画像処理やコンピュータビジョンのアルゴリズムが どのように動作すべきかについて妥当な原理を適用すると、 CNNが\ *正しい*\ 選択であることがわかり、満足感がある。 特に、画像における平行移動不変性は、 画像のすべてのパッチが同じように扱われることを意味する。 局所性とは、対応する隠れ表現を計算するために 画素の小さな近傍だけを使うことを意味する。 CNNに関する最も初期の文献の一部は、 ネオコグニトロンの形で現れている :cite:`Fukushima.1982`\ 。 推論の中で出てきた第二の原理は、 ある仮定がモデルに成り立つ限り、 表現力を制限せずに関数クラスのパラメータ数を どう減らすかということであった。 この制約の結果として複雑さが劇的に減少し、 計算的にも統計的にも実行不可能だった問題が 扱えるモデルへと変わった。 チャネルを追加することで、 局所性と平行移動不変性によって 畳み込みカーネルに課された制約のために失われた 複雑さの一部を取り戻すことができた。 赤・緑・青以外のチャネルを追加するのは ごく自然なことである。 特に農業や気象学で用いられる多くの衛星画像は、 数十から数百のチャネルを持ち、 代わりにハイパースペクトル画像を生成する。 それらは多くの異なる波長に関するデータを報告する。 以下では、畳み込みを効果的に使って それが作用する画像の次元を操作する方法、 位置ベースの表現からチャネルベースの表現へ移る方法、 そして多数のカテゴリを効率よく扱う方法を見ていく。 演習 ---- 1. 畳み込みカーネルのサイズが :math:`\Delta = 0` であると仮定する。 このとき、畳み込みカーネルが 各チャネル集合ごとに独立にMLPを実装することを示せ。 これは Network in Network アーキテクチャにつながる :cite:`Lin.Chen.Yan.2013`\ 。 2. 音声データはしばしば1次元の系列として表される。 1. 音声に対して局所性と平行移動不変性を課したいのは、どのような場合だろうか。 2. 音声に対する畳み込み演算を導出せよ。 3. コンピュータビジョンと同じ道具で音声を扱えるだろうか。ヒント: スペクトログラムを使え。 3. 平行移動不変性は、結局のところ良い考えではないかもしれない。なぜだろうか。例を挙げよ。 4. 畳み込み層はテキストデータにも適用できると思うか? 言語ではどのような問題に直面するだろうか。 5. 物体が画像の境界にあるとき、畳み込みでは何が起こるだろうか。 6. 畳み込みが対称、すなわち :math:`f * g = g * f` であることを証明せよ。