プログラミングを学ぶ人「畳み込みニューラルネットワークって何?」
こんな方に向けた記事です。
今回はPython機械学習で画像認識や音声認識などで用いられる畳み込みニューラルネットワーク(convolutional neural network: CNN)て一緒に勉強していきましょう。
畳み込みニューラルネットワークは人間の視覚をモデルとして考案されたディープラーニングの手法の一つです。
今回は人間の視覚認識について簡単にご紹介した後、畳み込みニューラルネットワークの原理について一緒に学んでいきます。
早速内容を見て参りましょう。
本記事の学習目標
- 人間の視覚認識について理解する。
- 畳み込みニューラルネットワークの原理を理解する。
目次
畳み込みニューラルネットワークをわかりやすく解説【python】
畳み込みニューラルネットワークの説明の前に基本的なニューラルネットワークについてこちらの記事で解説しております。是非一度目を通してみてください。
前述の通り畳み込みニューラルネットワークは人間の視覚認識をモデルに作られたディープラーニング手法の一つです。
畳み込みニューラルネットワークは画像認識や音声認識など至るところで使用されています。画像認識のコンペティションではディープラーニングによる手法のほとんどが畳み込みニューラルネットワークをベースとしているほどです。
畳み込みニューラルネットワークを理解するにあたり、まずは簡単に人間の視覚認識について一緒に勉強していきましょう。
人間の視覚認識
人間が物体を見た際、最初に物体から反射された光が目の奥の網膜に像を結びます。その後、視神経を通じて脳に刺激が達し、物体が何であるかの認識がなされます。
その際、物体の像全体を一度に把握するのではなく、ある限定された領域ごとに像をスキャンするように認識していきます。この限定された領域のことを「局所受容野」と呼びます。
局所受容野の光の刺激は、電気信号に変換されて脳に達し、視覚認識に関係するニューロンが反応します。このニューロンには単純型細胞、複雑型細胞の2種類が存在します。
単純型細胞は、ある特定の形状に反応します。さまざまな形状に反応する単純型細胞があり、それらが連携して活動することで複雑な形状の物体を認識することが可能になります。
例えば、以下の①、②の図で考えてみましょう。+の位置に光が当たるとニューロンが反応し、−の位置に光が当たるとニューロンの反応が抑えられるとします。①は斜めの明るい線分の検出に ②は縦の暗い線分の検出に有効であると言えます。
このように単純型細胞は視野内で明暗の境界がどこにあり、それがどのような傾きを持っているかを検出する機能を持っています。多種多様な大きさや方位性を持った単純型細胞の受容野が網膜に敷き詰められており、それらからの様々な入力情報を統合することで外界を認識しています。
一方、複雑型細胞は、形状の空間的なずれを吸収するように機能します。単純型細胞だけだと、ある形状の位置がずれると別の形状と見なすが、複雑型細胞は空間的な位置ずれを吸収し、同一形状と見なすことを可能にします。
つまり、検出されるべき特徴的構造(線など)が、受容野の中に入ってさえいれば、それらの位置に関わらずニューロンが反応します。
以下の図では縦方向の線分に反応する受容野を想定しています。線分の位置に関わらず縦方向の線分には反応しますが、斜め方向や横方向の線分には反応しません。このように検出対象の構造的特徴が受容野の中に入ってさえいれば位置に関わらずニューロンが反応します。
畳み込みネットワークはこの2つの細胞の働きを模倣するように考案されています。単純型細胞に対応する「畳み込み層」、複雑型細胞に対応する「プーリング層」が用意されています。
それでは畳み込みニューラルネットワークの構造について見て参りましょう。
畳み込みニューラルネットワークの構造
最も典型的な畳み込みニューラルネットワークは上記の図のような構造になっています。
「入力層」、「畳み込み層」、「プーリング層」、「全結合層」、「出力層」と順に接続されます。
先述の視覚認識に対応して考えると、物体は入力層として視覚に飛び込んできます。1ピクセルつまり図の1マスが1ニューロンに対応します。次に単純型細胞に相当する畳み込み層、複雑型細胞に相当するプーリング層と続きます。全結合層はプーリング層からの出力をまとめるために存在し、出力層で認識として出力されます。
それでは畳み込みニューラルネットワークの肝である畳み込み層、プーリング層について詳しく見て参りましょう。
畳み込み層
畳み込み層では畳み込み演算という処理が行われます。これはいわゆるフィルター演算にあたります。
単純型細胞と同様、特定の形状に反応するように構成されています。この特定の形状はフィルタと呼ばれます。
畳み込みニューラルネットワークでは入出力データを特徴マップと呼ぶことがあります。畳み込み層の入力データを入力特徴マップ、出力データを出力特徴マップと呼びます。
畳み込み層では入力特徴マップにフィルタをかけることで出力特徴マップとして出力します。
具体例を見てみましょう。
上記の例では入力サイズは 4 x 4、フィルターは 2 x 2、出力サイズは 3 x 3になります。
フィルターはカーネルとも呼ばれ基本的には同じ意味を指します。混乱しないようにしてください。
上記の畳み込み演算では入力データに対してフィルターのウィンドウを一定の間隔でスライドさせながら適応します。ウィンドウとは以下の図の灰色部分を指します。
それぞれのウィンドウ部位でフィルターの要素と入力データの要素を掛け算しその和を算出し出力データとして格納します。これをウィンドウを移動させながら繰り返すことで出力データとします。
畳み込み層ではストライド、パディングという考え方が登場します。ひとつずつ勉強していきましょう。
ストライド
フィルターを適応する間隔のことをストライドと呼びます。
上記の例はすべてストライドが1です。ストライドを2とすると以下のようになります。
ストライドを2とすると、入力サイズは 4 x 4、出力サイズは 2 x 2 となります。
このようにストライドの大きさを選択することで出力サイズを調整することができます。
パディング
畳み込み処理を行う前に入力データの周囲に固定のデータ(0など)を埋めること、これをパディングと呼びます。
今まで使用していた例に幅1のパディングを適応してみましょう。
入力データ 4 x 4 に1のパディングを適応することで出力データが 5 x 5になりました。幅1のパディングとは周囲を幅1ピクセルの0で埋めることを意味します。
パディング、ストライドの調整を行うことで出力データのサイズを調整することができます。
プーリング層
プーリング層は、特徴として重要な情報を残しながら元の画像の縦・横の空間を小さくする手法です。
上記の例で見て参りましょう。
今回は 2 x 2 のMaxプーリングをストライド1で行った場合を想定しています。
Maxプーリングとはその名の通り最大値をとる演算です。2 x 2 は対象サイズを表します。2 x 2 の領域を移動させながらそれぞれ最大の値を抽出して出力していきます。
今回はプーリングによって 3 x 3 の入力データが 2 x 2 の出力データとなりました。
プーリングには、特徴の位置感度を低下することで、位置に影響を受けにくくする効果があります。プーリング処理することによって、画像が数ピクセル移動したり、回転したりしても、それらの違いを吸収してほぼ同じ値を出力することができます。いわゆる前述の複雑型ニューロンのような役割を果たしています。
全結合層
複数個のフィルターによって出力された特徴マップは重み付けされた後、全結合層によって結果が判定されます。
今回は結果がAであるかBであるかの2択の場合を想定しました。それぞれの出力特徴マップはフィルターがより結果に直結しているとみなされる場合にはそれぞれに重み付けがなされます。今回は0.95 vs 0.05でよりAである確率が高いとみなし入力画像はAであるという判定になりました。
このようにノードからノードに全て結合する出力方法を全結合と呼びます。非全結合と比較するとより正確な出力を得ることができますが、処理数が膨大になるため時間を要するというデメリットがあります。
【参考にさせていただきました】
・AISIA様 畳み込みニューラルネットワーク_CNN(Vol.16) (sint.co.jp)
・imagazine様 畳み込みネットワークの「基礎の基礎」を理解する ~ディープラーニング入門|第2回 - アイマガジン|i Magazine|IS magazine
・IMACEL Academy様 Deep learningで画像認識②〜視覚野と畳み込みニューラルネットワーク 〜 - IMACEL Academy -人工知能・画像解析の技術応用に向けて-| エルピクセル株式会社 (lp-tech.net)
さいごに
いかがでしょうか。今回はディープラーニングの代表的な手法である畳み込みニューラルネットワークについて一緒に勉強しました。
畳み込みニューラルネットワークは人間の視覚認識で代表的な単純型細胞、複雑型細胞の原理を再現したディープラーニング手法でした。
実際に医療画像認識などで広く用いられる手法になります。この記事が少しでも皆様の役に立てば幸いです。
機械学習はプログラミング言語のPythonを用いれば、今持っている自分のパソコンですぐに実践することができます。
英語論文になっている手法もしっかりと勉強すれば、自分のパソコンで出来ます。
このサイトでは、プログラミングに興味のある医学生、医師のための情報を発信しております。
プログラミングの学習方法には大きく分けて、「独学」と「プログラミングスクール」の2つがあります。
当サイトでは一貫してプログラミングスクールを利用することをおすすめしています。
なぜなら、独学で勉強した私が非常に苦労したからです。
また私はプログラミングを学習するにあたり、師匠・メンターのような存在がいました。
わからないところは教えてもらっていました。
そのような環境でなければ0から独学で勉強するのはとても効率が悪いと思います。
詳しくは、プログラミングの独学は難しいです【私の失敗談】で紹介しています。
この記事が一人でも多くのプログラミングに興味のある方のお役に立てば幸いです。