• トップ
  • ブログ一覧
  • 第3世代のニューラルネットワーク「Spiking Neural Networks」とは?
  • 第3世代のニューラルネットワーク「Spiking Neural Networks」とは?

    広告メディア事業部広告メディア事業部
    2019.05.16

    IT技術

    ニューラルネットワークとは?

    では、スパイキングニューラルネットワークに入る前に基本からいってみましょう。

    近年、人工知能の研究が盛んですが、その研究を支えている最もメジャーな技術は『ニューラルネットワーク』です。

    ニューラルネットワークとは、生物の脳の神経細胞(ニューロン)をモデル化したものをネットワーク上に接続したものを指します。

    現在そのニューラルネットワークを用いた、畳み込みニューラルネットワーク(CNN)、いわゆる『ディープラーニング』が至る分野で使われるようになりました。

    しかし、現在使われているニューラルネットワークのほとんどは『形式ニューロンモデル』という、神経細胞をかなり単純化したものを使っています。

    こちらの記事もオススメ!

    featureImg2020.07.28機械学習 特集知識編人工知能・機械学習でよく使われるワード徹底まとめ!機械学習の元祖「パーセプトロン」とは?【人工知能】ニューラルネ...

    では、スパイキングニューラルネットワークとは?

    形式ニューロンモデルにおいて、情報は実数値です。

    例えば、画像の画素値であったり、気温であったり、それらのアナログな数値を正規化して使用します。

    ニューラルネットワークより、緻密に神経細胞をモデリングしたもの

    しかし、実際私たちの脳内で情報として飛び交っているのはスパイク列(電気パルス)と呼ばれる、デジタル信号なのです。

    スパイク列 (出典:7.1 Spike train variability )

    そこで考案されたのが、、、

    スパイキングニューラルネットワーク(SNN: Spiking Neural Networks)です!

    スパイキングニューラルネットワークは、通常のニューラルネットワークより、緻密に神経細胞をモデリングしたものになります。

    難しい内容になるため、少し具体的に説明していきます。

    生物の神経細胞

    生物の神経細胞(ニューロン)は、細胞の内外で電位差があり、これを膜電位と言います。

    膜電位は通常、静止膜電位と呼ばれる約-60~-70mV程度で安定しているといわれています。

    この膜電位は他の神経細胞から入力があると変化し、ある一定の膜電位(しきい値)に達すると、神経細胞はスパイクを出します。

    実際のイメージ



    また、スパイクを生成したニューロンは不応期と呼ばれる、膜電位が変化しない期間(約3ms)に入ります。

    不応期によって、スパイクが極端に密集しないようになっています。

    スパイキングニューロンモデル

    ここで説明した一連の神経細胞の挙動をモデル化したものを『スパイキングニューロンモデル』と言います。

    一度、スパイキングニューラルネットワークで大事なことをまとめてみたいと思います。

    (黒文字部分は、通常のニューラルネットワークと同じです。)

    1. 膜電位があること
    2. しきい値があること
    3. 入出力がスパイク列であること
    4. 不応期があること
    5. 前ニューロンからの入力は加算されること
    6. シナプス結合荷重には可塑性があること

    スパイキングニューラルネットワーク研究について

    それでは、ややこしい数式や実装例をお伝えする前に、スパイキングニューラルネットワークは、現在どのような研究で使われているのか見ていくことにしましょう!

    TrueNorth

    TrueNorthは、米IBMが開発した、スパイキングニューラルネットワークをハードウェア上に組んだコンピュータチップです。

    およそ100万個のニューロン、2億5600万ものシナプスをシミュレーションが可能であるといわれています。

    また低電力で動作可能であることも大きな特徴で、1秒間に32×32の画像を2600枚ほど処理できます。

    ここまでくると、もはや小さな脳です。

    IBMと米空軍が「人間の脳」をヒントにしたAIスパコンを開発へ 「IBM TrueNorth」を使用
    https://www.atmarkit.co.jp/ait/articles/1706/27/news072.html

    スパイキングニューラルネットワークの現状

    生物の脳の構造は、もっと複雑で何十億ものニューロンから構成されています。

    ですのでまだまだ到底及びませんが、とても夢のある研究です。

    他にも探せば研究は出てきますが、このように複雑なスパイキングニューラルネットワークはハードウェア上での脳のシミュレーション研究が盛んなようです。

    また、どちらかというと現在は「脳の働きを解明しよう」という医学(生物学)的研究が盛んなようです。

    もちろん工学的な研究も盛んにおこなわれていますが、まだ効率の良い学習法も確立されておらず発展途上なのです。

    スパイキングニューロンモデルを実装してみる

    では、実際に、簡易的にシミュレーションをしてみましょう!

    実装する前に、まずは必要な数式を見ていきます。

    今回は、IF(integrate-and-fire)モデルと呼ばれる、シンプルなスパイキングニューロンモデルを使っていきます。

    文献によって式の形がやや形が異なりますが、今回は以下の式を用います。

    IFニューロンの膜電位V(t)の式

    1. Iは「前層ニューロンの集合」
    2. wは「前層ニューロンとのシナプス結合荷重」
    3. Eは「静止膜電位」
    4. S(t)は「前層ニューロンのスパイク列」

    入力スパイク列を入力電流に変換する式

    1. *は「畳み込み演算子」
    2. 積の第2項は「スパイク応答関数」
    3. τは「時定数」

    スパイキングニューロンモデルを実装

    それでは、実際にコードを書いてシミュレーションしてみましょう!

    今回は、「Python」と「numpy」、「matplotlib」を使用しています。

    1import numpy as np 
    2import matplotlib.pyplot as plt 
    3E = -65  # 静止膜電位 
    4th = -50 # しきい値 
    5act = 20 # 活動電位 
    6ref = 30 # 不応期 
    7rest = 0 # 残り不応期時間 
    8last = 0 # 最後の不応期終了時間 
    9tau = 15 # スパイク応答関数の時定数 
    10## IF膜電位計算式 
    11def v ( weight, spikes, time ): 
    12    currents = [] 
    13    for sp in spikes: 
    14        currents.append( current( sp, time )) 
    15    m = np.dot( weight, currents ) + E 
    16    global rest, last 
    17    if rest > 0 : # 不応期中は入力を受け付けない 
    18        rest -= 10 
    19        if rest <= 0: 
    20            last = time 
    21        return E 
    22    if m > th : # スパイク!! 
    23        m = act 
    24        rest = ref 
    25    return m 
    26 
    27## スパイク応答関数 
    28def kernel( time ): 
    29    return time * np.exp( -time / tau ) 
    30 
    31## 入力電流 
    32def current( spikes, time ): 
    33    sum = 0 
    34    for spike in spikes: 
    35        if spike > time : 
    36            break 
    37        if spike > last : 
    38            sum += kernel( time - spike ) 
    39    return sum 
    40 
    41spike1 = np.array( np.arange( 100, 1000, 300 ) ) 
    42spike2 = np.array( np.arange( 50, 1000, 200 ) ) 
    43spike3 = np.array( np.arange( 50, 1000, 100 ) ) 
    44spike4 = np.array( np.arange( 100, 1000, 150 ) ) 
    45spikes = np.array( [spike1, spike2, spike3, spike4] ) 
    46 
    47weights = np.array([0.7, 1.2, 0.9, 0.8]) 
    48memV = [] 
    49for t in range(0, 1000) : 
    50    memV.append( v( weights, spikes, t ) ) 
    51plt.plot( memV ) 
    52plt.show()

    シミュレーション

    今回は以下のように、4つのニューロンが生成したスパイク列が1つのニューロンに入力されることを想定してシミュレーションしてみました。

    実行結果は、以下のようになりました。

    膜電位が突出している部分がスパイクです。

    このように簡易ではありますが、スパイキングニューロンを実装して膜電位が観察できました。

    重みの大きさや定数を弄ってみると挙動が異なってくるので、是非色々な条件で動かしてみてください。

    接続されるニューロンを増やしたり、重みに負の値を混ぜるのも面白いかと思います。

    さいごに

    今回は、第3世代のニューラルネットワークと呼ばれる、スパイキングニューラルネットワークを紹介しました。

    少しややこしい部分もありましたが、実際にPythonを用いて挙動を確認できたので、スパイキングニューラルネットワークがどのようなものなのか何となくわかっていただけたかと思います。

    まだ発展途上な研究ですが、これからの人工知能の研究をより発展させてくれる重要な技術になることでしょう!

    こちらの記事もオススメ!

    featureImg2020.07.28機械学習 特集知識編人工知能・機械学習でよく使われるワード徹底まとめ!機械学習の元祖「パーセプトロン」とは?【人工知能】ニューラルネ...

    featureImg2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...

    広告メディア事業部

    広告メディア事業部

    おすすめ記事