2008-05-01

Computational Intelligence 2

今日から一限が無い日は、9時に友達と集まってspeakingの練習をはじめました。TopicはAdvance Englishで、今まで放置プレイしてきたacademic word list "570"。周りの視線をやけに浴びてる気がするけど、きっと気のせいだろう。

ところで、先週のTOEFLの前日に、ちょっと面白いイベントに参加したらなんと某企業のT-shirtを手に入った!キタコレ!でもそれ着て外に行くのは、色々と勘違いを起こしそうだから遠慮がちだったり。


またまた話し変わって、今週の月曜日はVijay Saswat Doctorの講義が早稲田理工学部であったので、参加しました。内容は「Programming for concurrency and distribution」。

今、IBM researchが研究しているX10 programmingの説明みたいな講義です。
並行処理をどう実現するか、って説明からX10 programmingの概要、
最後にX10 programmingのサンプルソースコードの解説といった内容。
threadの知識が既に乏しい自分は蚊帳の外ですたorz

まぁとりあえず凄くいいと思ったのは、X10 programmingで作ったソースコードはJVMでもC compilerでも動くらしい。すげぇwでも、原理は理解できずw

参考
http://x10.sourceforge.net/x10home.shtml

講義に関して言えば、最初はゆっくりしゃべってくれたたから理解できたけど、だんだんスピードアップしてきて、イミフワールドへww言ってることをスライドと照らし合わせながら、大まかにしか理解できなかったorzまぁ理解度は1,2割ってところかorz orz orzアメリカの理工系講義もこんな感じなんかなぁ。まだまだ、今のレベルじゃ太刀打ちできないね。


今年は早稲田CS学科主宰(?)のGlobal COE programがある関係で、今後も色々なCSの著名人を大久保キャンパスに招待するらしい。次の講義では、最低でも、講義で示される理論の5割は理解できるようになりたいもんです。


------ assignment memo -----
Take8easy俺。情報数学復習しないとまずいっぽいなorz

【課題内容】
主張1:「コンピュータが知的なはずが無い(P1),だって、プログラムされたことしか出来ない(Q1)のだから」
Q1は正しいか?Q1はP1を含意するか?

主張2:「人間が知的なはずが無い(P2),だって、遺伝子に組み込まれたことしか出来ない(Q2)のだから」
Q2は正しいか?Q2はP2を含意するか?
以上に関する自分の意見をレポートにまとめて提出。両主張の関係をよく分析してください。

主張1と主張2は全く同じ格好をしている。
同じロジックなら同じ答えになるはず。
答えが違っていたらどこかで言葉の認識のズレがある。
→「知的」の定義?
→人間ににとっての「知的」とコンピュータにとっての「知的」は同じ尺度か?


【与えられた命題の整理】
P1 = コンピュータが知的なはずが無い
¬P1 = コンピュータは知的なはずである。

Q1 = プログラムされたことしか出来ない
¬Q1 = プログラムされたこと(以外)も出来る。
Q1'= プログラムされていないことは出来ない。
→Q1 = Q1' ??

P2 = 人間が知的なはずが無い
¬P2 = 人間は知的なはずである。


Q2 = 遺伝子に組み込まれたことしか出来ない
¬Q2 = 遺伝子に組み込まれたこと(以外)も出来る。
Q2'= 遺伝子に組み込まれなかったことは出来ない
Q2 = Q2' ??

・命題の否定、置換
Q1 → P1 プログラムされたことしか出来ないのだから、コンピュータは知的ではない。
¬Q1 →¬P1 プログラムされたこと以外も出来るのだから、コンピュータは知的である。
Q1'→ P1 プログラムされていないことは出来ないのだから、コンピュータは知的ではない。

Q2 → P2 遺伝子に組み込まれたことしか出来ないのだから、人間は知的ではない。
¬Q2'→¬P2 遺伝子に組み込まれたこと以外も出来るのだから、人間は知的である。
Q2'→ P2 遺伝子に組み込まれなかったことは出来ないのだから、人間は知的ではない。


【言葉の定義】
・「プログラムされたことしか出来ない」とは?
→プログラムに書かれたことしか出来ない。

・「遺伝子に組み込まれたことしか出来ない」とは?
遺伝子に組み込まれたこと≒本能? ←定義できない?
→本能でしか行動できない。


・「○○しか出来ない」とは?
コンピュータにしか出来ないことがある。
→複雑な計算、膨大なデータの処理

人間にしか出来ないことがある。
→人の顔の判別(現在の段階では)


・○○しかできない = 知的ではない。
ならば、「知的である」とは与えられたこと以外も出来ることになる。

・与えられたこととは?
→その人、モノが生まれた目的・使命?

コンピュータの場合:プログラムの仕様、目的
人間の場合:本能 = 子孫を増やすこと?


・「知的=与えられたこと以外のことも出来る」とすると
知的とは?

コンピュータにとっての知的:プログラムの仕様、作られた目的以外のことも出来ること
人間にとっての知的:子孫を増やす以外のことも出来ること


・エラー発生
脳内メモリが足りません

orz

------ note@Artificial Intelligence -----
計算知能(Computational Intelligence, CI)@wikipedia

a successor of artificial intelligence. As an alternative to GOFAI it rather relies on heuristic algorithms such as in fuzzy systems, neural networks and evolutionary computation. In addition, computational intelligence also embraces techniques that use Swarm intelligence, Fractals and Chaos Theory, Artificial immune systems, Wavelets, etc.

Computational intelligence combines elements of learning, adaptation, evolution and Fuzzy logic (rough sets) to create programs that are, in some sense, intelligent. Computational intelligence research does not reject statistical methods, but often gives a complementary view (as is the case with fuzzy systems). Artificial neural networks is a branch of computational intelligence that is closely related to machine learning.

Computational intelligence is further closely associated with soft computing, connectionist systems and cybernetics.


人工知能研究の一分野であり、数理論理学に基づく従来的な人工知能とは一線を画すものである。計算知能の研究は、ファジィシステムやニューラルネットワークや進化的計算といったヒューリスティック的アルゴリズムを中心とする。その他にも、群知能、フラクタル、カオス理論、人工免疫系、ウェーブレットといった技法も利用する。

計算知能の研究では、学習や適応や進化やファジィ論理(ラフ集合)といった要素を駆使して、ある意味で知的なプログラムを作成することを目指している。計算知能の研究では、統計的手法を拒絶するものではなく、しばしば相補的な考え方を提供することもある(例えば、ファジィシステム)。ニューラルネットワーク研究は計算知能研究の一部であり、機械学習と密接に関連している。

計算知能はソフトコンピューティング、みすぼらしい(scruffy)AI、コネクショニズムのシステム、およびサイバネティックスと密接に関連している。


・課題補足
プログラムしたことしか、主張できないのか。
人間は遺伝子に組み込まれたことしか出来ない。だったら知的とはいえない。
主張の1と2がねじれてなかったら一貫する。
ずれていたら、どこがずれているのか?そこを良く分析する。

提出先の変更:63号館の1階

4月28日 Global COE Vijay Saswat Doctor
Programming for concurrency and distribution
マルチコアを使いこなすときの考え方:並列処理、並行処理、分散処理
今回は並行処理
今まで見たいなプログラムではいけない、という話。

X10という言語について。
IBMは、クラスターとか作ってる。javaの普及に貢献。
APGASという考え方に基づいて。
明日、X10の演習できる。

Ambient Global COE
--------------------------------------------

今日の目的:prologを使ってみよう。
疑問文から始まる。
最初はプログラムを読み込む。

コマンドpwd.
cd('c:/~~')
もしくはconsultボタン
list.
→読み込んだものを確認


家計図
赤 女、
青 男。
この家計図をコンピュータに入れるためには
述語部分に値する関数を作ってあげればよい。
is_parent_of(parent, chile).
female(human).

ex:
is_parent_of(pam, bob)
femail(pam).

↑ここまでが具体的な事実。
これらはデータみたいなもの。
prologはデータとプログラムの境目が薄い。

ある家計図のある家族のことが書ける。
辞書にはどういうことが書いてあるのか。

用語の意味の定義。
is_mother_of(X,Y) :- is_parent_of(X,Y) , female(X).
:- = ⇒ ⊂
, = ∧

is_sister_of(X,Y) :-
自分が自分の兄弟かどうかは適当に。

アンダーライン = ワイルドカード

XはYの祖先である。
父親、おじいちゃん、色々ある→再帰呼び出しにする必要がある。
is_ancestor_of() :- is_parent_of()

もうちょっと定義すると
is_ancestor_of(X,Y):-
is_parent_of(X,Y),
is_ancestor_of(Z,Y)

[bobの状況]
bobには子供が二人いるが、もしかしたらそれ以上の子供がいるかもしれない。

yes / noの処理系と(昔)
true / failの処理系がある。(今)

noとfailの違いは微妙。
証拠が無いという意味がfail。

Who, whatの場合:
Whoは変数みたいなもの。
is_parent_of(Who,bob).
Who = pam .

is_parent_of(Who,bob).
Who = pam ;
Who = tom ;
fail.(わかんない)

・もっと複雑な疑問
is_parent_of(X,Y).
データベースにあるものを片っ端から調べる。
→入れた順番に六通りの答えが存在する。
X=
Y=
X=
Y=
......

・条件を並べる
is_parent_of(X,Who), is_parent_of(X,pat).
共通の親がbobで
X = bob
Who = ann
自分が自分の兄弟としているので、
X= bob
Who = pat

・定義を見るとき
listing(is_mother_of).

・is_mother_of(Who,bob).
同じ格好のものを見つけて、当てはまるものを返すだけ。
→データベース検索と同じ

・デバッグ - 中の人が何やってるか知りたいとき
trace.
ワンステップずつ実行する。
Exit = 無事確認された。

・is_ancestor_of(Who,bob).
誰がbobの祖先ですか、と見えるが
子孫も同時に探索できる。

Ex
is_ancestor_of(pam, Who).
bob,ann,pat,jim
G507とかはシステム内部で作った変数。
子孫は二通りある。

Redo:一つ見つかったけど、それだけじゃ満足しないでやり直しをする。続きをする。
→子供の子孫を探しに行っている。

問い14,15は簡単なので各自やっておく。

・論理式
A&BもB&Aも同じ。
→兄弟もひっくり返しても良い


・is_ancestor_of(X,Y) :-
is_parent_of
is_ancestor_of
↑上と下を入れ替えても構わない。

・祖先の定義の仕方は一杯ある。
X ------ Z -------- Y
parent ancestor

X -------- Z ------ Y
ancestor parent

・問15
再帰呼び出しは、下手に書くと止まらない。
→is_ancestor_of -> is_ancestor_of -> is_ancestor_of ....... loop


・足し算のプログラム
非常に原始的な足し算が出来る。
→物事を根本から考える

add(0,Y,Y)
0の次と次は自然数

s(X) = sの次を読む。
xの次の数にyを足したらzの次の数になる。
= add(X,Y,Z).

multiply(0,_,0)

・読み込みコマンド
['prologファイル名']

add(s(s(0)),s(s(s(0))),X)
X = s(s(s(s(s(0))))))) = 5

add(X,Y,s(s(s(0)))).
X + Y = 3となるX,Yを出力できる。

・add(X,Y,Z).
プログラムはこうやって答える↓
X=0のとき
Y=Zが同じ。

X=s(0)
Z = s(Y)
…こんな感じで一般解を永遠と繰り返す。

→prologは一般解を扱う力がある。

変数を含んでいないものをground termという。
問:三つの足し算を計算するprologを書いてみよう!

勿論X is 1234+ 1234なんてことも出来るが、
足し算を根本的に計算すると、
遅い代わりに逆向きに走ることが出来る!


・半加算器と全加算器(half adder, full adder)
FA = 前の繰り上がりも考慮した加算器。

fa fa haという回路を作る。
加算器という述語。
これをつなげていけばaddが出来る。

・prologには二つあって
事実(fact)と規則(rule)がある。

if sentence:rule
足し算はruleで出来る。

3ビットだから2+3とかやってみる。
add(0,1,0 ,0,1,1, X3,X2,X1,X0)

add(X2, X1,X0, Y2,Y1,Y0, 0,1,0,1).

順番はともかくとして、答えが出てくる。
出力を入れると入力を出すこともできる!

house.pl
人工知能→モノが何故動くのか、何故動かないのかの診断に使う

炊く無い敗戦データベース
cd curcuit braiker
l light
w wire
s switch

dynamic宣言の説明は省略。
down(s1) = s1 is down

lit = 電気がつく
lit :- light(L) , ok(L), live(l)

live(outside)
live(Y)

この状態で初めて、家中に電気がつく!
lit(L) このうちで光るものはなんだ!

・switchを落とすには
データを書き換える→プログラムを書き換える。
retract(down(s1)). 入れた知識を引っ込める
assert(up(s1)). 新たな知識を入れる。

こんな感じで、家の状況を論理式で書くことが出来る。
w0とp1は繋がっているのか、とか質問できる。

0 件のコメント: