アラカン"BOKU"のITな日常

文系システムエンジニアの”BOKU”が勉強したこと、経験したこと、日々思うこと。

専門用語ナシ!ニューラルネットワークの仕組みを15分で説明しろという無茶振りに対応してみた。

専門用語や数式・数学用語がでてくるとフリーズしてしまう人達相手に、15分程度の持ち時間で、専門用語は一切つかわず、ディープラーニングについて説明して理解させろという、相当に、無茶な依頼に対応する機会がありました。

 

そんな資料は見たことないので、仕方なく自分で資料をつくりました。せっかくなので、ブログでも紹介しておこうと思います。

 

とりあえず、ニューラルネットワークディープラーニングの2つの言葉以外は、極力専門用語を使わないということでやりました。

 

そもそも、ニューラルネットワークは何ができるのか?

用途としては、おおまかに2種類あります。

 

入力したデータに対して、予め用意されている選択肢のどれである確率が一番高いのかを推測する(分類)か、入力されたデータから予測する(回帰)です。

 

ただ、巷でよく取り上げられるのは、分類の方です。

 

手書き数字を認識するとか、モノ(きゅうりとか)を分別するとかですね。

 

なので、ここからは、そちらに絞って説明します。

 

分類ですけど、例えば、入力されたデータ(写真とでもしましょう)が「りんご」なのか「みかん」なのかを推測する時のイメージはこんな感じです。

 

すべての選択肢に対して、正解である確率が一番高いものを選んで、答えにします。

f:id:arakan_no_boku:20170415130344j:plain

 

ポイントは「予め用意された選択肢」が必要であることです。

 

人間のように、「これは、用意された中にはないけど、ひょっとしたら、栗かもしれない」みたいに、用意されてない選択肢を推測するようなことはしません。

 

 どういう仕組みで推測を行うのか?

 

最初から最後まで計算です。

 

データを細かい単位に分割します。

 

それと「重み」と呼ぶ数字を掛け算していきます。

 

最終段階で、その答えを、全部足しこんでいって、事前に用意された選択肢ごとの確率(上記例なら、りんごである確率、みかんである確率)を計算します。

f:id:arakan_no_boku:20170415143150j:plain

 

ポイントが2つあります。

 

ひとつは「重み」です。

 

正解率を左右するのは、この「重み」です。

 

「重み」を、正解率がいちばん高くなるような数値に設定することで、計算だけで答えを導きだせるようにしているわけです。

 

つまり、ニューラルネットワークで「学習する」というのは、この「重み」の数値を適切な値に調整していく作業のことを言います。

 

もうひとつは「掛け算した結果に一手間加えている」ことです。

 

その一手間とは、データと重みを掛け算した結果をそのまま全部合計するわけではなく、計算結果を整えることをやってます。

 

例えば、計算結果が「0以上」の場合は答えとして出力するけど、「0より小さい」場合は出力しない(0を合計する)みたいな判断するわけですね。

 

これは、そのデータの特徴(他との違い)をより明確にして、解答の精度をあげるためにやってます

 

例えば、上記の例で言えば、違いの小さな部分を切り落とせば(0にすれば)、特徴の部分だけが残り、判断しやすくなって正解率もあがるという仕掛けです。

 

正解率が高い「重み」はどうやって見つけるのか?

 

人間と同じで学習をします。

 

学習のイメージはこんな感じです。

f:id:arakan_no_boku:20170415150205j:plain

 

学習するには、入力データと答えがセットになった「学習用データ」が必要です。

 

学習用データを今の重みで計算して答えを出します。

 

それで予め用意されている正解と計算結果で答え合わせをして、どのくらい間違っているか「正解との差」として求めます。

 

そして、その正解との差が小さくなるように「重み」の数値を、少しだけ増やしたり減らしたりするわけです。

 

一度の学習だと、もちろん重みの変化はほんの少しです。

 

なので、これを何万回も繰り返さすことで、だんだんと正解率の高い「重み」に調整されていくわけです。

 

まさしく「学習」ですね。

 

なぜ、”ディープ”ラーニングと言うのか?

さっきまで、ニューラルネットワークと言ってました。

 

ただ、ディープラーニングという言葉の方が馴染みがある。

 

そんな人は多いと思います。

 

でも、この2つは同じものです。

 

さっきまでの例は、わかりやすくするために単純化していますが、実際には重みを使って掛け算していく部分は1回やって終わりではありません。

 

下図のように、複数の階層で上位の結果を入力データにして計算して、結果を次の階層に渡すようにして、繰り返し計算していくのが普通です。

f:id:arakan_no_boku:20170415153739j:plain

 

 理由は「そうすると正解率があがる=性能がよくなる」からです。

 

ただ、単純い深くするのではダメで、階層を深くするためには色々の乗り越えなければならないハードルがあったりするのですけどね。

 

そのあたりの研究はすすんでて、最初の頃は18階層とか20階層くらいでしたが、最近は150階層を超えるような構成まででてきています。

 

このように複数階層を積み重ねて処理を行うので、深い階層のニューラルネットワークのことを、ディープ(深い)ラーニングと呼ぶわけですね。

 

以上・・です。

 

ゆっくり喋って、だいたい15分くらいだとこんなもんです。

 

エッセンスだけですけど、こんな感じでアウトラインがわかってから本を読むと、上で書いていた「正解との差」が「損失率」のことだったのか、とか、「そのデータの特徴(他との違い)をより明確にするために、違いの小さな部分は切り落として(0にして)」の部分が「reLu関数」のことなのかなどと、多少は理解できる部分が増えたみたいです。

 

この記事も、どなたかのお役にたてば、いいんですけど。 

 

f:id:arakan_no_boku:20170404211107j:plain