ナンクル力学系

学んだ事を書き連ねていこう。

Archive for November 2008

グラフを見て分かるNeural Networksシリーズ〜数式抜きで解説してみる〜

with one comment

ニューラルネットを数式抜きで解説してみようという画期的なシリーズを始めます!
多分すぐ終わるけどねw

ここで言うニューラルネットは人工ニューラルネット(ANN)のことで,生物の脳神経系のニューラルネットとはアイディアと名前を借りてきたくらいでほとんど関係は無いと思ってOKです.

ニューラルネットは下図のようなニューロンが結合したものです.

nn0

ニューラルネットで扱うニューロンはこんな感じ

  • Input x
    • ニューロンの入力です.
  • Weight W
    • ニューロンの結合荷重と呼ばれます.ここではweightと言うことにします.それぞれの入力信号をどれだけ増幅するかを決定します.負の値(入力の反転)や,0(結合していない)をとることもあります.
  • Bias b
    • ニューロンへ,ひたすら同じ値を入力します.
  • Internal Value u
    • biasと入力にweightを掛けた値の総和です.
  • Output y
    • ニューロンの出力です.
  • Activation :
    • internal value uからoutput yへの変換です.この変換のお陰で,ニューラルネットは多様な入出力関係を作り出すことが出来ます.

ニューロンの(というかactivation)の入出力関係を図で表すと下の図のようになります.

右下のグラフの波形が,左上の波形に,右上(一番大きい)のグラフの入出力関係を用いて変換されます.(グラフを書く関係上,入力と出力とでグラフが90度回転しているので注意してください.)

色の対応を見ると,

  • 0に近い入力は似た形を出力
  • 0から離れると1に張り付いた出力

になることが分かります.

neunet0

ニューラルネットに用いるactivationの入出力の非線形性はこんな感じ

ではまず,下のような一番簡単な入力が1つだけのニューラルネットワークを考えてみましょう!

nn1

入力が1つだけのニューロン

このweight wとbias bを変化させると多様な出力を得ることが出来ます.wとbの値を変化させてみたニューロンに,波形を入力した時の出力をグラフで表してみます.

一段目が入力で,二段目がweightを固定してbiasを動かしてみた例,三段目がbias固定でweightを動かしてみた例です.

  • biasを動かすと入力に反応したりしなくなったりする
    • → 入力に「着目」するかを選んでいるように見える!
  • weightを動かすと入力が伸縮している
    • → 入力にどの程度「着目」するかを決めているように見える!
neunet1

同じ入出力に対して、weightとbiasを変化させると出力はこのように変化する

だんだん面白くなってきました!

この多様な入出力関係を使うことで,様々な入出力関係を構成することが出来ます.組み合わせのもっとも簡単な例として下のような2入力,1出力,1ニューロンのニューラルネットを考えて見ます.

nn2

入力が2つのニューロン

このニューラルネットを使って実現されたand回路を見てみます.(ここでは,weightとbiasを(2.0, 2.0),-1.6としました.)

and回路とは,2つの入力が真ならば真を,それ以外なら偽を出力する(論理)回路です.全部書き下すと,

  • 真,真 ⇒ 真 ・・・ (真かつ真ならば真)
  • 真,偽 ⇒ 偽 ・・・ (真かつ偽ならば偽)
  • 偽,真 ⇒ 偽 ・・・ (偽かつ真ならば偽)
  • 偽,偽 ⇒ 偽 ・・・ (偽かつ偽ならば偽)

という関係です.ここでは,-1を偽,1を真とします.

二つの入力に今まで同様,波形を入力してみます.同じ入力だと面白くないので周期をずらしてみました.

二つの入力が共に1に近くなった時だけ,Outputが反応していることが分かると思います.

ニューラルネットのこんな簡単な仕組みで,入力からある情報(ここでは二つの入力が両方1に近い)を取り出せるなんて凄いね!感動して下さい.

neunet2

and回路を作ってみて、sin波のピークが合わさった時だけ反応するネットワークが出来た

今回は簡単な構造ニューラルネットしか扱わなかったし,ニューラルネットのメインのテーマである「学習」にも触れませんでした.さらに,入力と出力の関係だけでなく,過去の入力との関係を扱えるニューラルネットも存在します.

という訳で,かなりディープな世界になっています!

...疲れた.次回はないな.(ぉw

ついでに...

~数式を自重しないニューラルネットワーク入門~

今回扱ったニューラルネットの一つ,(一層)パーセプトロンは

y_i = \tanh( \sum_j w_{ij} x_j + b_i ) i \in {\cal O} j \in {\cal I}
ただし {\cal O}, {\cal I}は入出力空間

です.

数式のほうがわかりやすいね!!w

Written by tkf

November 29, 2008 at 3:41 am

グラフを見て分かるNeural Networksシリーズ〜グラフ描くためのpythonのコード〜

leave a comment »

neunet0

ニューラルネットワークで用いるアクティベーション関数の入出力の非線形性はこんな感じ

import pylab
import scipy
pylab.clf()

gx0, gx1, gx2 = 0.1, 0.3, 0.95
gy0, gy1, gy2 = 0.1, 0.3, 0.95

x = scipy.arange(-5,5,0.5)

a = pylab.axes([gx1, gy1, gx2-gx1, gy2-gy1])
pylab.plot(x,scipy.tanh(x))
pylab.axis((-5,5,-1.1,1.1))
pylab.setp(a,xticks=[],yticks=[])

t = scipy.arange(0,20,0.1)
x1 = 0.5 * scipy.sin(t)
x2 = 0.5 * scipy.sin(t) + 2.0
x3 = 0.5 * scipy.sin(t) + 4.0

a = pylab.axes([gx1, gy0, gx2-gx1, gy1-gy0])
pylab.plot(x1,t)
pylab.plot(x2,t)
pylab.plot(x3,t)
pylab.axis((-5,5,None,None))
pylab.setp(a,xticks=[-5,0,5],yticks=[])
pylab.xlabel("Input")

a = pylab.axes([gx0, gy1, gx1-gx0, gy2-gy1])
pylab.plot(t,scipy.tanh(x1))
pylab.plot(t,scipy.tanh(x2))
pylab.plot(t,scipy.tanh(x3))
pylab.axis((None,None,-1.1,1.1))
pylab.setp(a,xticks=[],yticks=[-1,0,1])
pylab.ylabel("Output")

#pylab.show()
pylab.savefig("neunet0.png")
neunet1

同じ入出力に対して、weightとbiasを変化させると出力はこのように変化する

import pylab
import scipy

t = scipy.arange(0,50,0.1)
x = scipy.sin(t)

NeuNets = [
    #( w , b )
    [ (0.5,-2.0),
      (0.5,-1.0),
      (0.5,-0.5),
      (0.5,-0.0) ],
    [ (10.,-2.0),
      (3.0,-2.0),
      (2.0,-2.0),
      (0.5,-2.0) ],
    ]
col_num=len(NeuNets)+1

pylab.clf()
pylab.subplot(col_num,1,1)
pylab.plot(t,x)
pylab.axis((None,None,-1,1))
pylab.ylabel("Input")

for i,NN in enumerate(NeuNets):
    pylab.subplot(col_num,1,i+2)
    for (w,b) in NN:
        pylab.plot(t,scipy.tanh(w*x+b),
                   label="w=%.01f b=%.01f"%(w,b))
        pylab.axis((None,None,-1,1))
        pylab.ylabel("Output")
    pylab.legend()

#pylab.show()
pylab.savefig("neunet1.png")
neunet2

and回路を作ってみて、sin波のピークが合わさった時だけ反応するネットワークが出来た

import pylab
import scipy

t  = scipy.arange(0,50,0.1)
x1 = scipy.sin(t)
x2 = scipy.sin(2*t)

pylab.clf()
pylab.subplot(2,1,1)
pylab.plot(t,x1,label="x1")
pylab.plot(t,x2,label="x2")
pylab.axis((None,None,-1,1))
pylab.ylabel("Input")
pylab.legend()

pylab.subplot(2,1,2)
pylab.plot(t,scipy.tanh( 2.0*(x1 + x2 - 0.8)))
pylab.axis((None,None,-1,1))
pylab.ylabel("Output")
pylab.legend()

#pylab.show()
pylab.savefig("neunet2.png")

Written by tkf

November 29, 2008 at 1:08 am

sshログインなどでX windowが使えない環境でgnuplotを使う方法

leave a comment »

gnuplot-dumb

家に居て,ラボにsshで接続して,gnuplotでグラフ書こうと思ったらX飛んでこなかった.これは大変!

そんな時,「グラフをテキストで出力する」という記事を思い出したので早速,

set term dumb

し,グラフの出力先をテキストに.無事グラフが見れた:

gnuplot-dumb

大体の感じはつかめる...よね?w

まあ,正確なグラフ欲しかったらpngに吐いてダウンロードするか,そもそもデータファイルをダウンロードすべきだよね.(ぉ

研究忙しいからブログに逃げてるわけではないんだから!

Written by tkf

November 15, 2008 at 10:22 pm

Posted in PC

Tagged with

YASnippetでshell-script-mode

leave a comment »

「snippets/text-mode/shell-script-mode/」以下に置くだけかな、と思ったらそうじゃなかった。「snippets/text-mode/sh-mode/」に置かなきゃいけなかった。

これでグラフ書いたりファイル処理したりするスクリプト書くのが少し早くなる、かも。

Written by tkf

November 14, 2008 at 11:48 pm

Posted in PC

Tagged with , ,

立ち止まって考えないと。

leave a comment »

異常に多いワークスペース

今週はボス+M1と共同でやっている研究でド激務な日々。上の画像みたいにワークスペースを30個くらい使ってプログラムをまわしている。このプログラムは実行すると必ずX Winodwが立ち上がるという激しい仕様(笑)なので一つの実験を回すために一つワークスペースを使うことにしている。linux機二つあって良かったー。メインのubuntuでこれはやりたくないw

関係ないけど、上の画像は非常にブロガーっぽいので気に入ってる。Picnik良いよPicnik。吹き出しの根元がずれているのはご愛嬌。

最近、ボスのボスから来年のテーマこれやってねオーラがひしひしと伝わってくる。ボスもやって欲しいことをかなり提示してくる。もうすこし今の分野全般と周辺の知識を手に入れて、自分の場所をしっかり確かめてから歩き出したいのに。ボス曰く「今は勉強する時間、なんてとれないから研究と並行してやらないと。」いや実際そうですよね。もう来年から院生ですもんね。でも、「そこは深く考えないの?」「定式化そんな適当でいいの?」「数学的ツールの使い方あってんの?」みたいな質問をとばしてどんどん先に研究を進めている様子を見ていると焦ってくる。しっかり勉強した後には、そこには枯れたテーマしか残っていないんじゃないかとも思えてくる。

ほぼ毎日夕方に、ラボの人たち数名集まってコーヒーを飲む会があって最近それに参加し出した。この会で、最近のもやもやした疑問をぶちまけてみようかと思っている。そのためには、下調べと自分の考えの整理をしなければいけない。来週の月曜までにもう少し本読んでまとめてみるか。

自分で時間確保して本を読んでいくしか無いことは分かっているんだけど、今週みたいに全然時間が取れないとかなり焦るな。

Written by tkf

November 14, 2008 at 10:05 pm

Posted in 研究日誌

Tagged with

そうか、地続きじゃないから不安なんだ

with 2 comments

数学は定義・公理から定理まで、物理は原理・基礎方程式から法則まで理論的に地続きだ。そして地続きなことが科学的だ、と言える理由なんだと思う。

なら、今の自分の研究はどうだろう、と考えてみた。分からなかった。だから最近不安なんだ、と気づいた。分かっていたけどこうして書いてみるとなぜかすっきりする。

人の認知的な働きを理解するためにモデルを考えてロボット実験で検証する、ってのが今のラボでの研究の方法。問題となる認知的な働きは認知心理学から、モデルのアイディアは脳・神経学から引っ張って来る。このモデルというのが曲者。そもそも人工ニューラルネットワークで実験して出来る、ってことが脳でも起こっていると結論付けることの論理は飛躍しすぎていないか。当然そういう議論はされてきたはずで、それが分かっているならここまで不安にはならないんだろうな。

数学や物理にも○○予想、実験法則の形で論理の飛躍はある。脳と人工ニューラルネットワークの飛躍もそれに似たものなのか?前者(数学・物理)はそう期待するだけの理由があるのだけど、後者(脳科学)にはあるのか?

早く理由を見つければ不安はなくなる。

はず。

Written by tkf

November 8, 2008 at 1:29 pm

shell scriptでテンポラリファイルを作成する方法

leave a comment »

「mktemp」というコマンドを使う。

tmp_file=`mktemp` || exit 1
# $tmp_file を使った処理
rm -f $tmp_file

本当は$tmp_file を使った処理中にエラーで終了しても「rm -f $tmp_file」が実行されてテンポラリファイルが消えるように、とかしないといけないんだろうけど。

直前の記事のスクリプトを書くために調べた。

Written by tkf

November 8, 2008 at 4:04 am

Posted in PC

Tagged with