"機械学習","信号解析","ディープラーニング"の勉強

HELLO CYBERNETICS

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

線形層と比較した畳み込み層

 

 

f:id:s0sem0y:20180310185018p:plain

はじめに

今回はニューラルネットワークの基本的な構成要素である線形(全結合)層と畳み込み層について簡単に説明します。

 

これを説明するモチベーションは、「畳み込み層は線形層よりも優れた発展的手法、複雑な手法であるという勘違いが 初学者の中であるのではないかと感じ、それの解消をするためです。

 

以降、畳み込み層と線形層の最たる違いを主張するために、線形層のことを全結合層と呼ぶことにします。 この呼び名は、TensorFlowやKerasなどのフレームワークで採用されています(layers.dense)。

全結合層

全結合層の数式

まず全結合層について数式を以下に示します。 入力ベクトル$x \in \mathbb R^{D}$に対して、行列$W \in \mathbb R^{d\times D}$とベクトル$b \in \mathbb R^{d}$をパラメータに持ち、

$$ y = Wx +b $$

という変換が施されます。入力を線形変換して、あるベクトル$b$を加えるという単純な構成です。 これをより詳しく見るために、入力ベクトルの成分を明記して$x=(x_1, x_2, ... x_D)^T$と表記します。 更に行列$W$の$(j, i)$成分を$w_{j,i}$と表記します。同様に$b = (b_1, ..., b_d)^T$と表します。

 

ここで、$d=D=3$ということで具体的に計算式を書けば、

$$ \begin{pmatrix} y_{1} \\ y_{2} \\ y_{3} \end{pmatrix} = \begin{pmatrix} w_{1,1} & w_{1,2} & w_{1,3} \\ w_{2,1} & w_{2,2} & w_{2,3} \\ w_{3,1} & w_{3,2} & w_{3,3} \end{pmatrix} \begin{pmatrix} x_{1} \\ x_{2} \\ x_{3} \end{pmatrix} + \begin{pmatrix} b_{1} \\ b_{2} \\ b_{3} \end{pmatrix} $$

となっています。ここで、全結合層で変換された結果である$y$のとある1つの成分を見てみましょう。例えば、一番最初の成分に関しては

$$ y_1 = w_{1,1}x_1 + w_{1,2}x_2 + w_{1, 3}x_3 + b_1 $$

という値になっています。入力ベクトル$x$の各成分を適当に重み付けして、$b_1$というスカラーを加えた形です。

 

より一般的に表しておくために、全結合層の出力$y_j$が、 $$ \begin{align} y_j &= w_{j,1}x_1 + w_{j,2}x_2 + w_{j, 3}x_3 + b_j \\ &= \sum_i w_{j,i}x_i +b_j \end{align} $$ となるような変換であると覚えておくと良いでしょう。

 

$j$の取れる範囲は行列のサイズで決まるわけですが、特徴量を沢山準備したければ行列のサイズを大きくすれば良いということになります。 しかし、どれだけ増やそうが、いつでも全結合層の出力のとある成分$y_j$は上記の形式です。$w_{j,i}$をいろいろ調整することで、 各成分が多様性のある値を取ってくれるというわけです。

 

ここでなぜ、これが「全結合層」と呼ばれるのかについて説明します。

非全結合層

ここで形式的に非全結合層なるものを与えてしまいます。 難しいことではありません。

\begin{align} y_j &= w_{j,1}x_1 + w_{j,2}x_2 + w_{j, 3}x_3 + b_j \\ &= \sum_i w_{j,i}x_i +b_j \end{align}

という計算に置いて、とある$w_{j,i}$を$0$だと決めつけてしまうのです。 一度$0$だと決めつけてしまい、その後、学習において更新も一切行わないことにします。 具体的には、

\begin{align} y_j &= w_{j,1}x_1 + 0\cdot x_2 + w_{j, 3}x_3 + b_j \\ \end{align}

と設定するかもしれません。 この場合、$y_j$という新しい値を算出する上では$x_2$は全く関係ありません!と最初から決めていることに相当します。

 

そんなことするんだったら最初から$x_2$を入力しなければ良いじゃないか? と思うかもしれません。それは中々筋の考えだと思います。不要と分かっているものを学習データとして突っ込む理由などありません。 しかし例えば、$y_1$に対しては$x_2$が関係ないとして、$y_2$に対しては$x_3$が関係ないとして、$y_3$は全ての$x$の成分と関係がある、 という形で仮定を置きたいのであれば、

\begin{align} y_1 &= w_{1,1}x_1 + 0\cdot x_2 + w_{1, 3}x_3 + b_1 \\ y_2 &= w_{2,1}x_1 + w_{2,2}\cdot x_2 + 0\cdot x_3 + b_2 \\ y_3 &= w_{3,1}x_1 + w_{3,2} x_2 + w_{3,3}x_3 + b_3 \end{align}

という変換を考えておくことができます。これは行列の表現を思い出せば、

$$ \begin{pmatrix} y_{1} \\ y_{2} \\ y_{3} \end{pmatrix} = \begin{pmatrix} w_{1,1} & 0 & w_{1,3} \\ w_{2,1} & w_{2,2} & 0 \\ w_{3,1} & w_{3,2} & w_{3,3} \end{pmatrix} \begin{pmatrix} x_{1} \\ x_{2} \\ x_{3} \end{pmatrix} + \begin{pmatrix} b_{1} \\ b_{2} \\ b_{3} \end{pmatrix} $$

と言うことに相当します。実はニューラルネットワークに突っ込むような状況に置いて、 どの成分がどの入力の成分と関係してそうかなんて全くわかんないので、このような使い方はほとんどしないと思います。

 

そもそも非全結合層なんて言葉は今私が作りました(他の人も使ったりしてるかもしれませんが、特に意味はないと思います)。

 

ともかく、「最初からある入力の成分とある出力の成分に対して、関係性が無い(繋がりがない)と仮定した層」を非全結合層と言うことにします。

f:id:s0sem0y:20180310180518p:plain

畳み込み層

入力成分のindexに着目した非全結合層

畳み込み層とは非全結合層の一種のようなものです。 しかし、畳み込み層の数式を見ると、大抵は目がくらくらしてくるので、もう少し 非全結合層の話にお付き合いください。

 

今回は、非全結合であることを「入力$x$の成分のindexが離れている場合には繋がりがない」という形で導入します。 例えば、「隣り合う2つの成分以外は繋がりを持ちません」ということを仮定した、非全結合層は

$$ \begin{pmatrix} y_{1} \\ y_{2} \\ \end{pmatrix} = \begin{pmatrix} w_{1,1} & w_{1,2} & 0 \\ 0 & w_{2,2} & w_{2,3} \end{pmatrix} \begin{pmatrix} x_{1} \\ x_{2} \\ x_{3} \end{pmatrix} + \begin{pmatrix} b_{1} \\ b_{2} \\ \end{pmatrix} $$

という形になるでしょう。ここで出力が2次元になっていることに注意してください。 入力が$(x_1, x_2, x_3)$の時、indexが隣り合う成分を取り出すと$(x_1, x_2)$と$(x_2,x_3)$だけしかありません。 ですから、これに関する線型結合だけを考えればよく、結果的に出力は2次元となります。

 

f:id:s0sem0y:20180310180931p:plain

 

今回考えた層の概要としては、全結合層に比べて、線形変換に制約を加えていることになります。 更にもっと大きなサイズのベクトルを考えて、例えば「入力$x$が1000次元のときに、隣り合う5つの成分以外は繋がりを持ちません」 という仮定を入れたとすれば、これは極めて強い制約になっているはずです。

 

 

非全結合・重み共有層

ここで重み共有という概念を導入します。これも難しいことではありません。 先に絵柄で見てしまいましょう。先程まで考えていた非全結合層を以下の絵で表します。

f:id:s0sem0y:20180310181132p:plain

色が違う矢印は、異なる値の重みとなっています。再度数式を見れば、先程見たまま

$$ \begin{pmatrix} y_{1} \\ y_{2} \\ \end{pmatrix} = \begin{pmatrix} w_{1,1} & w_{1,2} & 0 \\ 0 & w_{2,2} & w_{2,3} \end{pmatrix} \begin{pmatrix} x_{1} \\ x_{2} \\ x_{3} \end{pmatrix} + \begin{pmatrix} b_{1} \\ b_{2} \\ \end{pmatrix} $$

となっています。

 

続いて、非全結合・重み共有層なるものを絵で見ると以下のようになっています。

f:id:s0sem0y:20180310181252p:plain

 

見ての通り、同じ色の矢印が使われています。重み共有というのは、同じ重みを使いまわしますということです。 数式で表すと以下の形になっているでしょう。

$$ \begin{pmatrix} y_{1} \\ y_{2} \\ \end{pmatrix} = \begin{pmatrix} w_{1} & w_{2} & 0 \\ 0 & w_{1} & w_{2} \end{pmatrix} \begin{pmatrix} x_{1} \\ x_{2} \\ x_{3} \end{pmatrix} + \begin{pmatrix} b_{1} \\ b_{2} \\ \end{pmatrix} $$

 

これも極めて強い制約になっていることがすぐに分かるはずです。 結合自体の数も少ない上に、ネットワークが学習で調整できるのはたった2つのパラメータになってしまったのです。 実は(1D)畳み込み層というのは、まさにこの形式の層のことを言います。

 

1D畳み込み層

ニューラルネットでの畳み込みというのはフィルタを少しずつずらしながら作用させていく操作です(正確にはフィルタと入力の相関)。 この操作を非全結合・重み共有層と比較して見れば一目了然で同じものになっています。

 

f:id:s0sem0y:20180310182110p:plain

 

つまり畳み込み層というのは極めてニューラルネットに対して強い制約を課した層であると言えます。 ここで使われる1D畳み込み層は音声などに対して用いられ、 時系列的に得られたサンプル点に関して、時間が近い物同士にしか結合を認めないという形の制約を与えていることになります。

 

 

 

ただし今回は「全結合層に比べて、畳み込み層は制約が強い(自由度が低い)」ということの強調でこの話をしましたが、 実際にはこれではあまりにも表現力に乏しいため、そのままでは使いません。

 

制約を残しつつ、表現力を与えるためにフィルタの異なる畳み込み処理を複数個同時に行います。

これは要するに非全結合・重み共有層を複数個準備するということになります。以下にその概念図を示します。

 

f:id:s0sem0y:20180310183039p:plain

 

矢印が同じ色の場合、同じ重みだと思ってください。まず入力を複製しておきます。 そして、複製された入力に対してそれぞれ異なる重み共有層を使って値を算出します。 それぞれの重み共有層は大して表現力を有していませんが、制限された状態での表現を幾つか準備しておくことで、 あまりにめちゃくちゃすぎないけど、だけど表現力はあります、という層を実現しています。

 

これが実際の1D畳み込み層の振る舞いになります。 このとき準備した重み共有層の数のことを「畳み込み層のチャンネル」と言ったりします。 仮にチャンネルを1つにした場合には、ただの非全結合・重み共有層にすぎないので、極めて強い制約を課すことが可能です。

 

ここで、一度畳み込み層を通して、チャンネルが増えてしまった後に 再度畳み込みを行ったらどのように振る舞うのですか? と疑問に思う方もいらっしゃると思います。

 

これは図で表すととんでもなく大変なのでサボらせてください(ある程度概要を掴んだら、数式見るのが早いし、それは教科書でもフレームワークのドキュメントでも書いてあります)。 言葉で説明すると、あるタイミングで入力の全チャンネルに関する和を計算するという工程が入ります。 そして出力の方は畳み込み層で設定したチャンネルになるように計算がなされます。

2Dの畳み込み層

2Dの畳み込み層はというと、入力が2次元的なものである場合に、indexが近い物同士にしか結合を与えないという制約を課すことになります。 画像などが代表的ですね(そもそも畳み込み層はここから始まった)。

f:id:s0sem0y:20180310184344p:plain

conv_arithmetic/README.md at master · vdumoulin/conv_arithmetic · GitHub

 

これも、実際にはチャンネルという概念を入れて、制約を課しつつ表現力の向上がなされています。

 

特にMNISTなどで畳み込み層と全結合層を比較するチュートリアルは多くの方がチャレンジなされていると思います。

仮に画像に対して畳み込み層が有効であることを前提にしてしまえば、非全結合層という考えでいけば2D畳み込み層のとある計算は以下のように絵で表すことができます。

 

f:id:s0sem0y:20180310185018p:plain

 

これがもし、全結合層を使った場合には、出力層のとある成分は(灰色の□)は、全ての入力の重みづけ和となっているわけです。 これは随分乱暴な計算をしているように見えると感じるわけです(最初から不要なものが含まれている!)。

そして、畳み込み層では重み共有という概念も入っているので、畳み込みでずらした際に使われる結合の仕方も同じです。

 

f:id:s0sem0y:20180310185249p:plain

 

これが全結合層だったら、全く別の重みが使われるのです。畳み込み層に比べたらあまりに自由度が大きすぎる!と感じるはずです。 これは間違いなく過学習の原因になってしまうでしょう(考えてみれば、中間層がたくさんあれば任意の関数を表せるのですから)。

 

最後に

今回、この記事では畳み込み層というのが、全結合層をより複雑にしたものというよりは、 むしろ簡素にしたものであるということを伝えたく、非全結合や重み共有の概念を強調してきました。

 

この概念は畳み込み層という形にこだわらなくとも、表現力が豊かすぎるニューラルネットワークに制約を与える手がかりになると思っています。 例えばLSTMも、時系列に展開した1つのデータを扱うと考えた時には、繰り返し同じ重みを用いた層を使う「重み共有」がなされていると見ることができます。

 

ニューラルネットワークは何も考えなければ、最強の表現力を平気で獲得してしまい、容易に過学習を引き起こします。 したがってニューラルネットワークを使う場合には、強くするというよりは、むしろ能力を制限していくという発想のほうが良いように思います。

 

それはすなわち、冗長すぎるモデルを、手持ちのデータに見合うレベルまで落としていくということです。 ニューラルネットワークでは決して特徴量抽出や前処理から解放されたわけではありません。 データの構造を再現しうる適切な制約を課すという作業に置き換わったのです。

 

s0sem0y.hatenablog.com

s0sem0y.hatenablog.com

s0sem0y.hatenablog.com

s0sem0y.hatenablog.com

 

少なくとも、闇雲にフレームワークでいろいろ作ってみても、おそらくあまり良い結果は出ないでしょう。