IT-LIFEブログ

主にIT系のことや時事ネタや、たまに雑記

【図解】ニューラルネットワークのソフトマックス関数とは? & Pythonで実装してみた。【連載⑤】

f:id:nok-0930-ss:20171203174342p:plain

こんにちは、あつかんです。

今回はニューラルネットワークの出力層の設計について説明していこうと思います。

ゼロから作るDeep Learningという本を参考にさせていただいております。

またこの記事は連載形式ですので、下の記事を読んでから読むことおすすめします。

nok-lab-life.hatenablog.com


出力層の設計

ニューラルネットワークは、分類問題と回帰問題の両方に利用できます。

分類問題というのは、データのクラス分けです。

例えば、猫の画像を見せたときにそれは猫か?犬か?を分類するような問題です。

回帰問題は、ある入力から何かしらの数値を予測するものです。

たとえば、猫の画像を見せてその画像から猫の身長や体重を予測するような問題です。

 

分類問題と回帰問題によって出力層の活性化関数の種類が変わってきます。

分類問題ならソフトマックス関数を使い、回帰問題なら前のブログで説明した恒等関数を使用します。

今回は分類問題の焦点をあてていこうと思います。

 

ソフトマックス関数について

まずは、あらたにソフトマックス関数というものが出てきたので、それについて説明します。

ソフトマックス関数の式は以下のように表わされます。

f:id:nok-0930-ss:20171203165831p:plain

kはk番目のニューロンの出力であり、nは出力層のニューロンの数です。

分子は入力信号の指数関数、分母はすべての入力信号の指数関数の和です。

図で表すと以下のようになります。

f:id:nok-0930-ss:20171203173559p:plain

式の通り、一つの出力層に対して、すべての入力が結びついていることが確認できます。

ではソフトマックス関数を使って実際に数値を使って計算してみます。

f:id:nok-0930-ss:20171203165636p:plain

の時、y1,y2,y3は以下のようになります。

f:id:nok-0930-ss:20171203170119p:plain

f:id:nok-0930-ss:20171203170216p:plain

f:id:nok-0930-ss:20171203170253p:plain

 

だからなに?って感じですよね笑

次の説明でその疑問を解決します笑

 

ちなみにPythonで書くとこんな感じになります。

 

なぜソフトマックス関数なのか?

先ほどの計算結果で示したように、ソフトマックス関数の出力は0~1の実数値に落とし込むことができています。

どんな値を使っても0~1の実数値が出力されるので試してみてください。

この0~1の実数値に収めることができるというのがソフトマックス関数の重要なところです。

なぜなら、出力値を確率として解釈することができるからです。

0.1なら10%、0.25なら25%のように。

確率として解釈できるということは、例えば以下の図のようにニューラルネットワークを利用できますね(かなり強引ですが)。

f:id:nok-0930-ss:20171203171806p:plain

上図より、ニューラルネットワークに信号(画像のピクセル値)を入力した結果、猫である確率が高いと判断されたました。

つまり、確率として扱うことにより画像に写っているモノは猫であると予測できるわけですね。

猫の画像を入力して、それが猫であるって判断を行うためにはニューラルネットワークを学習させなければなりません。

それについては今後説明します。

 

まとめ

今回は出力層に使われる活性化関数の一つとしてソフトマックス関数についてまとめました。

出力層にソフトマックス関数を使うと、出力の結果を0~1の範囲に実数値として落とし込めるので、確率的な表現ができることが可能になりました。

確率的な表現ができるということは、予測ができるということなので、なにかを分類するような問題に応用できます。

しかし、なにかを分類するためにはニューラルネットワークの重みなどを適切に設定しなければ正しく分類することができません。

では、ニューラルネットワークの重みはどのようにして設定するのでしょうか?

それはデータから学習させて重みを設定させます。

ニューラルネットワークの特徴はデータを学習し、重みのパラメータを自動で決定できるという点です。

次のブログではどのようにして、データを学習するのかについて述べていこうと思います!

では!

【図解】ニューラルネットワークの実装【連載④】

こんにちは、あつかんです。

今回はニューラルネットワークの実装を行っていきます。

ゼロから作るDeep Learningという本を参考にさせていただいております。

このブログは連載形式ですので、過去のブログ↓を読んでから読み進めることをお勧めします。

nok-lab-life.hatenablog.com


3層ニューラルネットワーク

ここでは図に示すような3層のニューラルネットワークを対象に実装していきます。

今回はforward側の流れ、つまり入力層から出力層への信号の伝達の仕方について説明します。

f:id:nok-0930-ss:20171202170006p:plain

第0層目から第1層目

まずは入力層から第1層への信号の伝達の様子を見てみましょう。

f:id:nok-0930-ss:20171202170838p:plain

a1(1)を数式で表すと以下のようになります。

f:id:nok-0930-ss:20171202171114p:plain

 

f:id:nok-0930-ss:20171202171452p:plain

 

a2(1)を数式で表すと以下のようになります。

f:id:nok-0930-ss:20171202171544p:plain

 

a3(1)の図は省略しますが、以下の式のようになりますね。

f:id:nok-0930-ss:20171202171645p:plain

上記の3つの式は以下のように行列の式でまとめられます。f:id:nok-0930-ss:20171202173053p:plain

ここで、

f:id:nok-0930-ss:20171202173110p:plain

です。

このように各ニューロンに対して、信号の総和を計算できました。

ニューロンは信号を受け取ったら、活性化関数h()を通して出力するので、次はそのプロセスを見ていきます。

第1層目のニューロンの中身を詳しく書きました。

 

f:id:nok-0930-ss:20171202180144p:plain

上図より、活性化関数を通して出力される信号の式z1(1)は以下のようにあらわされます。

f:id:nok-0930-ss:20171202174751p:plain

ここで、シグモイド関数を活性化関数として使用すると、以下のようになります。

f:id:nok-0930-ss:20171202174804p:plain

z2(1)も同様に計算して

f:id:nok-0930-ss:20171202174923p:plain

z3(1)も同様に計算して

f:id:nok-0930-ss:20171202174938p:plain

のようになります。

これらを行列の式でまとめると以下のようになりますね。

f:id:nok-0930-ss:20171202175333p:plain

ここで、

f:id:nok-0930-ss:20171202175345p:plain

です。

 

これで第0層目から第1層目までの信号の伝達の様子を確認しました。

 

第1層目から第2層目

次は第1層目から第2層目までの実装を行います。

f:id:nok-0930-ss:20171202181046p:plain

上記のような図の流れですので、

f:id:nok-0930-ss:20171202181829p:plain

つまり、

f:id:nok-0930-ss:20171202181615p:plain

となります。Z2(2)も同様に

f:id:nok-0930-ss:20171202181837p:plain

つまり

f:id:nok-0930-ss:20171202181903p:plain

となります。

これらを一つの行列式にまとめると以下のようになります。

 

f:id:nok-0930-ss:20171202182221p:plain

ここで、

f:id:nok-0930-ss:20171202182242p:plain

です。

これで第1層目から第2層目までは終了。

 

第2層目から第3層目

次は第2層目から出力層までの実装をしていきます。

f:id:nok-0930-ss:20171203161353p:plain

ここで出てきたσ()は恒等関数といいます。

これは出力層の活性化関数として利用されます。

恒等関数は入力をそのまま出力関数です。

出力層の活性化関数には、恒等関数、シグモイド関数、ソフトマックス関数のどれかが使われるのですが、今回は恒等関数としました。

出力層の活性化関数に関しては、次の記事で説明してきます。

 

つまり、出力の結果として

f:id:nok-0930-ss:20171203161543p:plain

f:id:nok-0930-ss:20171203161722p:plain

 

y2もy1と同様にして、

f:id:nok-0930-ss:20171203161818p:plain

f:id:nok-0930-ss:20171203161824p:plain

 

といった式になります。

以上で3層ニューラルネットワークのforward側の説明は終わりです。

 

まとめ

今回はforwardの流れ、つまり入力から出力方向への伝達処理を理解しました。

実はニューラルネットワークは学習するためにはbackwardの流れ、つまり出力から入力方向への処理も行わなければなりません。

これについて、後ほどの記事に出てくるので少々お待ちくださいw

次回は、出力層の活性化関数について詳しく述べていこうと思います。

続きはこちら

nok-lab-life.hatenablog.com


【図解】ニューラルネットワークの活性化関数とは?【連載③】

どうもあつかんです。

今回はニューラルネットワークに使用される活性化関数について説明していこうと思います。

ゼロから作るDeep Learningという本を参考にさせていただいております。

 

また、このブログは連載形式ですので下の記事を読んでから読むことおすすめします。
 

nok-lab-life.hatenablog.com

 

活性化関数とは?

活性化関数については

【初心者向け】ニューラルネットワークとは?【連載②】 - IT-LIFEブログ

で簡単な説明がしてありますが、ここでも少し説明しようと思います。

活性化関数とは入力信号の総和をどのように活性化(発火)させるを決定する役割があります。

活性化関数にも複数の種類があり、ステップ関数、シグモイド関数、ReLU関数というものがあります。

過去記事からわかるようにパーセプトロンでは活性化関数としてステップ関数が使われていましたね。

ステップ関数とは下図のように閾値を超えていたら1を出力、閾値を超えていなかったら0を出力するような関数でした。

ここで質問です。

パーセプトロンニューラルネットワークの世界に拡張させるためにはどうしたらよいでしょうか?

 

答えは、パーセプトロンで使われている活性化関数を別の関数に置き換えることで、ニューラルネットワークの世界へ進むことができます。

では、ニューラルネットワークで使われている活性化関数を見ていきましょう。

 

様々な活性化関数

シグモイド関数

シグモイド関数ニューラルネットワークでよく使われる関数の一つです。

式は以下のようにあらわされます。

f:id:nok-0930-ss:20171201171513p:plain

exp(-x)はeの-x乗という意味です。eはネイピア数で2.7182.......の実数です。

グラフは下図のような形になります。

ニューラルネットワークパーセプトロンの主な違いは、この活性化関数だけです。

パーセプトロンはステップ関数、ニューラルネットワークシグモイド関数など。

これだけなのです。

 

それではステップ関数とシグモイド関数を比較するためにグラフを重ねてみます。

この図をみて気づく点は、グラフの”滑らかさ”の違いだと思います。

シグモイド関数は入力に対して連続的(滑らかに)に変化していますが、ステップ関数は0を境にして急激に値が変化しています。

この違い、つまりシグモイド関数の滑らかさがニューラルネットワークの学習において重要な意味をもっています。

その理由は今後の記事で紹介していきます。

また、ステップ関数は1か0の値のみしか出力しませんが、シグモイド関数は0から1の間の実数(0.37469や0.98893など)を返します。

つまり、デジタル的な変化でなく、アナログ的な変化を含ませたわけです。

人間の脳はアナログの情報でやり取りしていますので、それに近づいたわけですね。

ステップ関数とシグモイド関数の共通点として、両者とも入力が小さいときほど小さい値を出力し、入力が大きい値ほど大きい値を出力しています。

つまり、重要な信号であれば大きな値を出力し、重要でない信号であれば小さな値を出力します。

また、出力の値は0から1の間のみだということもわかります。

 

ReLU関数

これまでに、活性化関数としてステップ関数とシグモイド関数を紹介しました。

シグモイド関数ニューラルネットワークの歴史において古くから使用されています。

しかし、近年ではReLU (Rectified Linear Unit) 関数という活性化関数が主流となっているようです。

この関数は0を超えていれば入力の値をそのまま出力し、0を超えていない場合は0を出力するといった単純な関数です。

図で表すとこんな感じ。

式で表すとこんな感じ。

f:id:nok-0930-ss:20171201174141p:plain

とても簡単な式ですね。

閾値以下の入力は0(重要でない)、閾値以上の入力は入力の値をそのまま出力、つまり重要度に比例した値を出力するといった機構ですね。

 

以上で活性化関数の説明は終わりです。

 

まとめ

今回は活性化関数について紹介していきました。

パーセプトロンの活性化関数はステップ関数であり、その活性化関数をステップ関数以外の関数に置き換えることにより、パーセプトロンニューラルネットワークの世界に持っていけるということが分かりました。

ステップ関数以外の関数とは、シグモイド関数、ReLU関数などでした。

ではなぜ、シグモイド関数や、ReLU関数がニューラルネットワークに使用されるのか?

それは二つの関数にはステップ関数にはない”滑らかさ”があるからでした。

その”滑らかさ”が、ニューラルネットワークの得とする”学習”にとって非常に大切な意味を持ちます。

なぜなのか?

それについては今後のブログで書いていきますのでご安心を♪

 

ではでは。

続きの連載④はこちらです。

nok-lab-life.hatenablog.com


【ブログ一ヶ月目】2017年11月の収益&アクセス数報告

f:id:nok-0930-ss:20171201163859p:plain

こんにちは、あつかんです。

今日で12月ということで、先月の収益&アクセス数を報告していこうと思います!

はい!皆様が大好きなお金に関する話ですw

実は、ブログ開設は今年の3月にしていたのですが、本格的に始めたのは今年の11月ですのでブログを始めてから一ヶ月目という目線でみていってください(; ・`д・´)

 

先月の目標として

・アクセス数:1000

・収益:まずはアドセンスの審査通過(通過したら100円以上)

を目標としておりました。

 

まずはアクセス数について述べていきます!

アクセス数

結論から申し上げますと、先月のアクセス数は2615でした!

f:id:nok-0930-ss:20171201153205p:plain

 

第一の目標は達成( ;∀;)うれしい~~

ちなみに一番アクセス数を稼いだブログはこれでした。

www.it-lifelog.com

近年トレンドの人工知能系のブログですね。

ホットなニュースを記事にしたら、ぷちバズが起こりました。

時事ネタ最高!

 

また、アクセス数の時系列データはこちら↓のような結果に。

f:id:nok-0930-ss:20171201153000p:plain

ぷちバズを起こした記事は28日の21時頃に投稿していたので、やはり29日が盛り上がってますね。

あと、一回バズった記事は日がたってもアクセス数を稼いでくれます。

つまりバズ記事は残しておけば財産となるわけですね笑

 

アクセス元はというと、ほとんどがGoogle検索でした。

f:id:nok-0930-ss:20171201182714p:plain

Google検索の結果、私のブログが検索の上位に反映されたってことですよね!

これはうれしいです! 

 

てなわけで先月のアクセス数でした!

 

収益

先月の時点ではアドセンスが通ってなかったので、まずはアドセンス通過を目標に掲げてました。

結果は、、、、、

 

通過!!

 

いや~通過した時はうれしかったです。

それについて詳しくはこのブログに書いてあります。

 

www.it-lifelog.com

 

11月21日に通過の結果がきたので、収益は21日~30日の10日間の収益となります。

ちなみに収益はアドセンスのみです。

収益の結果は、、、

 

牛丼大盛一杯くらい

 

です。

具体的な数値はGoogleさんに怒られそうなので控えました笑

一ヶ月目にしてはいいほうだと思っています。

 

てなわけで、収益に関しても目標は達成!

 

今月の目標

先月はブログの記事数を目標に設定していなかったので、今月はそれも組み込もうと思います。

 

・ブログ数:20記事

・アクセス数:3000

・収益:800円以上

 

が目標です!

がんばらねば~~~。

 

終わりに

今日もたくさんの読者様がこのブログに来てくれていることに感謝しています。

そのおかげで私はブログを続けられています。

ありがとうございます。

今後とも頑張っていきますので、よろしくお願いします。

また、最後まで読んでくださいまして、ありがとうございます。

もしよろしければ、読者登録していただけると大変励みになります。

よろしくお願いします。

 

では、あつかんでした!

【図解】ニューラルネットワークとは?【連載②】

どうも、あつかんです。

今回はニューラルネットワークについて述べていこうと思います。

ゼロから作るDeep Learningという本を参考にさせていただいております。

ニューラルネットワークについて述べるといっても、この記事ではすべては述べません。

全て述べると、本一冊書けちゃいますからねw

なので理解するにあたって必要最低限な知識を一歩一歩、順に複数のブログで連載形式で説明していきます。

遠回りのように見えますが、これが一番の近道だと思います。

まず、ニューラルネットワークを学ぶためにはパーセプトロンについての知識が必要です。

パーセプトロンについては下の記事にまとめてあります。

このブログは連載形式ですので、下の記事を読んでからこのブログを読むことをお勧めします。

nok-lab-life.hatenablog.com

 

ニューラルネットワークは簡単に言うとパーセプトロンの弱点を補ったものです。

では、パーセプトロンの弱点とはなにか。

それは、重みを設定する作業が人の手によって行われているという点です。

これは大変な作業であり、汎用性が生まれません。

このような弱点はニューラルネットワークによって解決できます。

具体的に言うと、適切な重みパラメータはデータから自動で学習できるという点です。

これがニューラルネットワークの重要な性質の一つになります。

では、その学習する方法を述べる前にまずはニューラルネットワークの概要について説明していこうとおもいます。

ニューラルネットワークの導入

ニューラルネットワークの例を図で表すと下の図のようになります。

f:id:nok-0930-ss:20171130110515p:plain

入力層から始まって中間層(隠れ層)を経て出力層に伝わります。

 

ここで少しパーセプトロンの説明をします。

パーセプトロンは前のブログでも述べた通り、例として以下の図で表現できます。

f:id:nok-0930-ss:20171129090216p:plain

パーセプトロンを数式で表すと以下のように表わせました。

 

b+x1w1+x2w2<=0の時

y=0

b+x1w1+x2w2>0の時

y=1

 

ここでbはバイアスパラメータといいます。

この値は任意で設定でき、ニューロンの発火のしやすさをコントロールできます。

w1、w2は各信号の重みを表わすパラメータであり、これは各信号の重要度をコントールできます。

しかし図にはbが定義されていません。

bを図に表わすと以下のような図になります。

f:id:nok-0930-ss:20171130112017p:plain

ここで、パーセプトロンの式をシンプルな式に書き換えたいと思います。

 

y = h(b + x1w1 + w2x2)

h(a) =  0   (a <= 0)

h(a) = 1    (a > 0)

 

上記の式は

a= b + x1w1 + w2x2が0以下の時は

h(b + x1w1 + w2x2) = 0

つまりy = 0

a = b + x1w1 + w2x2が0を超過した時は

h(b + x1w1 + w2x2) = 1

つまりy = 1

ということを表わしています。

 

活性化関数h(a)について

いきなりh(a)が出てきて困惑したと思いますが、これは活性化関数と呼ばれるものです。

活性化関数は式の通り、入力の総和をどのように発火(活性化)させるかを決定します。

もう一度活性化関数の式を書きます。

 

a = b + x1w1 + x2w2

y = h(a)

 

aでは総和が計算され、aをh()の中にいれてyで出力するという機構になっています。

活性化関数を図の中に組み込むと以下のような感じ。

f:id:nok-0930-ss:20171130113342p:plain

この図より、入力の重み付き信号の総和がaに入り、そしてaが活性化関数h()を通ってyに変換されていることが分かります。

活性化関数はここでは一つを紹介しましたが、実は複数存在します。

 

次のブログではどんな活性化関数があるのか?なぜ複数あるのか?について詳しく述べていこうと思います。

この段階ではニューラルネットワークについてまだ全然理解できていないと思いますが、まだ大丈夫です。

これから徐々に書いていきますので!

では!

 

次の連載はこちらです。

nok-lab-life.hatenablog.com


【図解】ディープラーニングの起源であるパーセプトロンとは?【連載①】

 

こんにちは。あつかんです。

近年話題の人工知能の一種であるDeep Learning

理系の血が騒ぎ、これは勉強しなければならないという使命感にかられたため、現在、ゼロから作るDeep Learningという本を読んでいます。

学んだことの知識整理と情報共有のためにブログにまとめていこうと思います。

だれにでもわかるように書いているつもりです(; ・`д・´)

 

パーセプトロンとは?

パーセプトロンとは、ローゼンブラットというアメリカの研究者によって考案されたアルゴリズムです。

パーセプトロンディープラーニングの起源となるアルゴリズムであるため、ディープラーニングを学ぶためにはパーセプトロンの仕組みを理解しなければなりません。

ここでは、パーセプトロンについて説明をしていこうと思います。

パーセプトロンは複数の信号である入力を受け取り、ある一つの信号を出力します。

信号とは「1」と「0」の二値です。

次に二つの信号を受け取り、一つの信号を出力するパーセプトロンのモデルを図で示します。

f:id:nok-0930-ss:20171129090216p:plain

この図のx1とx2は入力、yは出力です。

w1とw2は重みを表しています。

〇がいわゆるニューロン(ノード)です。

入力信号はニューロンに送られた後に、それぞれの重みで乗算されます。

そして、送られてきた信号の総和を計算し、yとして計算します。

つまり、

y=x1w1+x2w2

となります。

そして、そのyが任意で設定した限界値(閾値θを超えていた場合のみ1を出力します。

これを「ニューロンの発火」と呼びます。

これを式で表すと以下のようになります。

 

x1w1+x2w2<=θの時

y=0

x1w1+x2w2>θの時

y=1

 

一般的にはθ = -bと表され、以下のように上記の式を変形できます。

b+x1w1+x2w2<=0の時

y=0

b+x1w1+x2w2>0の時

y=1

 

bをバイアスパラメータといいます。

表現としてはどちらも等価です。

 

ここまでがパーセプトロンの基本です。

次は実際にパーセプトロンを使って簡単な問題を考えてみます。

 

パーセプトロン論理回路を表現

ここでは、論地回路のANDゲートについて考えてみたいと思います。

ANDゲートというものは左図のように表わされ、皆さんのスマホの中に集積回路としてたくさん入っている電子回路です。

f:id:nok-0930-ss:20171129095616p:plainf:id:nok-0930-ss:20171129095450p:plain

これをパーセプトロンで表現していきます!

ANDゲートは2入力1出力で二つの入力信号が1の時だけ1を出力し、それ以外は0を出力します。

入力に対する出力の関係表である真理値表を以下に示します。

入力 出力
x1 x2 y
0 0 0
0 1 0
1 0 0
1 1 1

 

ここで、このANDゲートをパーセプトロンで表現していきたいと思います。

パーセプトロンのパラメータであるw1,w2,θの値を調整動作に基づき設定していきます。

例えば、適当に(w1, w2, θ) = (0.5, 0.5, 0.7)としたとしましょう。

f:id:nok-0930-ss:20171129092212p:plain

入力が(x1, x2) = (0, 0)の時

x1w1 + x2w2 = 0*0.5 + 0*0.5 = 0 <= θ

となり総和が閾値を下回っているため0を出力します。

 

入力が(x1, x2) = (0, 1)の時

x1w1 + x2w2 = 0*0.5 + 1*0.5 = 0.5 <= θ

となり総和が閾値を下回っているため0を出力します。

 

入力が(x1, x2) = (1, 0)の時

x1w1 + x2w2 = 1*0.5 + 0*0.5 = 0 <= θ

となり総和が閾値を下回っているため0を出力します。

 

入力が(x1, x2) = (1, 1)の時

x1w1 + x2w2 = 1*0.5 + 1*0.5 = 1.0 > θ

となり総和が閾値を上回っているため1を出力します。

ちなみに Pythonで書くとこんな感じです。

# coding: utf-8
import numpy as np
def AND(x1, x2): x = np.array([x1, x2]) w = np.array([0.5, 0.5]) b = -0.7 tmp = np.sum(w*x) + b if tmp <= 0: return 0 else: return 1
if __name__ == '__main__': for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]: y = AND(xs[0], xs[1]) print(str(xs) + " -> " + str(y))

 

このように(w1, w2, θ) = (0.5, 0.5, 0.7)と設定した場合は、真理値表通りの出力が得られたので、パーセプトロンでANDゲートを表現できたことになります。

また、(w1, w2, θ) の選び方は、無数に存在します。

例えば、(w1, w2, θ) = (0.59786, 0.3432425, 0.7123131)としても、ANDゲート同じ表現になります。

つまりパーセプトロンというのは、何か入力を与えたらこの入力に対する出力の判断をニューロンが行い応答するという作業をしています。

 

これはAIの得意とする画像認識の処理に似ています。

例えば、以下の画像のように猫の画像を入力したとします。

ニューロンは入力信号である猫の画像に対して何か判断を行います。

猫だと判断されれば、yで猫である確率が高いといった判断をします(かなり、強引ですが)。

f:id:nok-0930-ss:20171129093808p:plain

そのためには、猫に対応する適切な重み(w1, w2, θ)を設定しなければなりません。 

猫に対応する適切な重みは何か?

知りません笑

 

重みの設定方法について

では、(w1, w2, θ) はどのように設定するのか?という疑問がわくと思います。

 

重みはデータから学習させて設定させていきます。

パーセプトロンでは学習できません。

パーセプトロンニューラルネットワークに拡張することによって学習できます。

ニューラルネットワークは、適切な重みパラメータをデータから自動で学習できるという性質を持っています。

 

次のブログではニューラルネットワークの基礎と、重みの学習について書いていこうと思います!

では!

 

次の連載はこちらです。

nok-lab-life.hatenablog.com

【AI】カプセルネットワークとは?【元論文あり】

 

どうも、あつかんです_φ( ̄ー ̄ )

本日以下のニュース記事を拝見しました。

wired.jp

これを見た瞬間、ニューラルネットワークを超えるものがとうとう出てきたか!Googleさんやべええええ!という印象をうけました。

Twitterでも様々な反応が。

 

ニューラルネットワークはここ数年で、急速な発展を遂げ、Deep MindのAlpha Goは、囲碁で世界一の棋士に勝ち、IBMのWatsonは専門医でもできなかった白血病の型の特定までをもしています。

そして、そのニューラルネットワークよりも高い性能を示すカプセルネットワークというものが発表された。

いや〜徐々にシンギュラリティ―が近づいてますね~~。

ちなみにシンギュラリティーとは、人工知能が人間の能力を超え、人間の文明に計り知れない変化をもたらすという仮説のことです。  

はやく、シンギュラリティー来ないかなw

 元論文

カプセルネットワークについて調べたくなったので元論文を探したところ、ありました。↓

http://papers.nips.cc/paper/6975-dynamic-routing-between-capsules.pdf

とりあえず、アブストを日本語訳しておきますね。

 

------------------------------------------------------------------------------------

カプセルは、オブジェクトまたはオブジェクト部分などの特定のタイプのエンティティのインスタンス化パラメータを表すアクティビティベクトルを持つニューロンのグループです。

エンティティが存在する確率とインスタンス化パラメータを表す向きを表すために、アクティビティベクトルの長さを使用します。

あるレベルのアクティブなカプセルは、より高いレベルのカプセルのインスタンス化パラメータに対して、変換行列を介して予測を行います。

複数の予測が一致すると、より高いレベルのカプセルがアクティブになります。

我々は、識別可能に訓練された多層カプセルシステムが、MNISTにおいて最先端の性能を達成し、非常に重複する数字を認識する際に畳み込みネットよりもかなり優れていることを示す。

これらの結果を達成するために、我々は反復的なルーティング・アグリーメントメカニズムを使用します。

低レベルのカプセルは、低レベルのカプセルから来る予測を伴う大きなスカラ積を持つ高次のカプセルにその出力を送ることを好む。

------------------------------------------------------------------------------------

よくわからんな~~~

検索したら分かりやすい説明があった↓

kndrck.co

hackernoon.com

つまり、カプセルの中にニューロンが詰められていて、そのカプセルで自己学習を促進していくと、従来法よりも良い結果が得られたわけですね。

 

カプセルネットワーク(CapsNet)のGitHubがあったので載せておきます。

 

 

.....なるほどわからん笑 

 YouTubeの解説動画

わかんなかったので、YouTubeで調べてみた。

www.youtube.com

 

ん~~~なんとなく。。。。

AIの専門家助けて(T ^ T)w

 

結局、なにがよくなったの?

従来法であるニューラルネットワークはあるモノを別の新しい視点から見ても同じものだと判断する作業はあまり得意ではないです。

例えば、ある猫がいたとして、猫の顔写真をみせたらニューラルネットワークは猫だと判断できました。

しかし、別視点から撮った猫の画像をニューラルネットワークに判別してもらうという作業をしてもらうと、良い結果は得られないということです。

人間であれば、猫の様々な別視点の画像をみたとしても、猫として認識できますよね。

それがカプセルネットワークだとできる。

カプセルネットワークでは、あるものを別視点から見た画像の情報の間を埋め、今までのニューラルネットワークでは難しかった新たな場面の判断を可能にするとのことだそう。

 

これってすごいですよね。

 

具体的な方法はよくわかんないから、勉強が必要だなー。

カプセルネットワークはディープラーニングが元になっているため、理解するためにはディープラーーニングの勉強が必要ですね。

ちなみに、ディープラーニングを勉強する際にオススメの本はこちらです。