2016年06月

2016年06月28日

有名な心理学実験に「逆さメガネ実験」というものがある。
上下左右が反転するメガネを被験者にかけさせ、それで数日間をすごさせる、という実験。
最初、被験者は当然のことながら要領が掴めず、ちょっと体を移動させるだけでも、反対側に歩き始めたり、あちこちに体をぶつけたりするのだが、数日後には完璧に身をこなすことができるようになり、普通に生活できるようになる、という。

この実験が面白いのは、数日後、その逆さメガネを外した後のことである。
本来、すべてのものが上下左右反転する、「ハンディキャップ」であったはずの逆さメガネから開放されてしばらくは、最初に逆さメガネをかけた時と同じように、反対側に歩き出したり、あちこちに体をぶつけたりする、ということだ。

元々の身体にそなわっているレンズ(水晶体)は網膜に上下左右の像を映していて、我々はそれの逆さまに映った像を脳で処理して普通に生活するように学習している
それを逆さメガネを通すことによって上下左右を正しく脳に送るようにするとどうなるか、というのがこの実験だったわけだが、それまで学習してきたことと逆の条件を渡されても、脳はそれに適応できるように再学習する、ということだ。

これは、自動車の運転に似ている。
自動車の運転は、ハンドルを握ってそれを回転させる、という単純な動作で車の方向を変えものであるが、車を運転している人の手元を見てみると、直進中であっても、微妙に左右にハンドルを微調整しているのがわかる。
これはおそらく運転している本人は無意識で、ただ「直進する」という目的を満たすためにしていることである。
つまり、車を運転している者にとってのハンドルは、身体の延長であり、器官として拡張されたものである。

車を運転している者にとってハンドルという人工のものが器官として拡張される、という機能は、先天的に人間に備わっている能力ではない。いわばこれも逆さメガネと同様に、後づけで与えられたハンディキャップに体が適応した結果獲得した能力である。

僕はゲームを作るくせに実はあまりゲームはしない。
プレステなどのゲーム機は持っていない。
だが例外的に幼少期からずっとやっているゲームがある。ピンボールだ。
ピンボールは、左右にあるフリッパーが唯一のコントロールできるものであるが(ウソ、本当は「台を揺らす」というテクニックもある)、ピンボールを初めてする者はこのフリッパーの操作に慣れるまで、そうとう扱いづらいようで、すぐにゲームが終わってしまう。

ところが僕も含めたピンボールの上級者は、まるで自分の体の一部であるかのようにフリッパーを扱うことができる。
ピンボールの球をフリッパーで打つ瞬間に、その球がどちらの方向に向かってどこに当たるかが見えるし、どこに当てたいかというのをちゃんと打ち分けることができる。
これはイチローにとってのバットと同じだろう。

たとえばこのピンボールのフリッパーが別の動きをするもの、たとえばブロック崩しのパッドのようなものに変わったとすれば、おそらく最初はその操作に戸惑うかも知れないが、すぐにそれに適応して、フリッパーを扱うのと同様に使いこなせるようになるのではないか、と思う。
これも逆さメガネと同じく、脳が後天的な条件に適応する能力によるものである。 

myinnerasia at 08:05|Permalinkアジア 

2016年06月27日

プログラムに登場するオブジェクトは、一般的にその性質や状態を表すパラメータを複数持っている。
たとえば、ある生物を表すオブジェクトがあった場合、その形を表すパラメータ(脚の本数、脚の長さ、目の位置など)や身体能力を表すデータ(足の速さ、他の種と戦う時の攻撃力など)、繁殖能力(一度に生まれる子供の数、受精から出産までにかかる時間など)といったように、ある生物の個体は複数のパラメータでその性質が表される。

遺伝的アルゴリズム(GA: Genetic Algorythm)は、このようなオブジェクトのパラメータを「交配」させることにより、最適なパラメータの組み合わせを見つけるための技術である。

従来の線形的な計算では、そのパラメータが無数なるにつれて、その組み合わせ数が爆発し、ある一定時間内には最適解にたどり着くことが非常に困難になる。

遺伝的アルゴリズムは、そのオブジェクトがもつパラメータを一本の遺伝子情報に見立て、それを交配することで新たな個体を発生する。このとき、ダーウィンの進化論に基づき、「より優性な個体どうしを掛けあわせてできる子供は優性である」ということから、交配と選別(=淘汰)を繰り返す。

たとえば先程の生物オブジェクトを一本の遺伝子情報にするというのは下図のようになる。 

ga1
 これと同じデータ構造(=遺伝子情報)を持ったもうひとつのオブジェクトを並べ、任意のある一点を「交差点」として決め、その点で両者の遺伝子情報を入れ替える。

ga2
 上の図の左側は親の世代で、それを交配してできたのが右側である。
この交差点を色々とかえることで微妙に性質が異なる子供をいくつか作ることができる。
そのなかからより優性(=最適解に近いもの)を2つ選び、それらを親としてさらに次の世代をいくつか作る、、、ということを繰り返すうちにどんどん最適解に近づいていく、という考え方が遺伝的アルゴリズムである。

この技術は、たとえば株式の分散投資をする際の最適なポートフォリオを見つける、といったような、無数の組み合わせがあるものの最適解を見つける、というところに応用される。
また、人工生命の分野においては欠かせないものである。これについてはそのうち。 


インターネット上で日本独自に発展したガラパゴスを代表するものは何と言っても2ちゃんねるである。
インターネット創世期より、掲示板というものがあり、さらにはそれ以前のパソコン通信という閉じられた世界や、もうすこしアカデミー寄りになるネットニュース(fjなど)でも掲示板で熱い議論が昼夜問わず繰り広げられていたが、それは2ちゃんねるで爆発することになった。

2ちゃんねるは、まず「社会」や「文化」、「家電製品」、「食文化」などの大カテゴリがあり、その下に「板」と呼ばれる分類がある。ここまでは2ちゃんねるを運営している側が設定するものであるが、その各板に、ユーザーが自由に「スレッド」と呼ばれる話題の場を作ることができる。
ひとつのスレッドは、発言ひとつずつに番号が振られ、それが1000に達したらそのスレッドはもうそれ以上書き込めなくなる。
以上のしくみにより2チャンネルは、UGCとして、圧倒的な量のコンテンツと、管理側のコントロールを超えた発展を遂げることになる。

2ちゃんねるが日本独自のガラパゴスとして発展し、そこでさまざまな「事件」が起こることになったのは、この「板までは運営の管理下にあるが、スレッドは誰もが自由に作ることができる」というある程度管理された自由という点と、もうひとつは「匿名性」にある。
発言時に名前を名乗ることはできるのであるが、基本的に「名無し」のままにしておくという不文律があり、そこにわざわざ名前を書くことは「コテハン(固定ハンドルネームの略)」と言って、そのスレッドでよほどの発言権を持つものか、以前の発言との一貫性を持たせるためにすることが多い。基本的には名無し、つまり匿名である。

よく、「便所の落書き」と揶揄される通り、2ちゃんねるの書き込みはその匿名性のために発言に責任を持つ必要がなく、しばしば便所の落書きのような下品で無責任なものが現れることがある。
だが、その匿名性故に、なかなか手に入れられない生の情報が手に入ることもある。

この「ある程度管理された自由」と「匿名性」という2点の特徴が原因で、2ちゃんねるはさまざまな「事件」を起こすことになる。
まず思い出すのは、2ちゃんねるでしばしば殺人予告めいたものが書き込まれ、逮捕者が出るほどの大騒ぎになることや、2ちゃんねるで知り合った者どうしで犯罪や集団自殺をする、などといったものである。

世間を騒がせる「事件」以外にも、2ちゃんねるで使われる、いわゆる「2ちゃん用語」というものも大きな意味では「事件」である。
 「空気読め」ということばをわざと「空気嫁」と誤変換したり、「既出」を「ガイシュツ」と誤読をすることで新しい言葉が生まれそれが2ちゃんねるでのスラングとなる。

あるいは「ぬるぽ」と誰かが書き込めば「ガッ」と返す、という変なルールがある。
これはプログラマーしか知らないはずなのだが、ヌルポインターという言葉を略して「ヌルポ」というプログラミング用語がある。
その昔、翻訳サイトだか何かで、なぜか「ぬるぽ」と打つと「ガッ」と翻訳されるというバグがあり、それが始まりで、誰かが「ぬるぽ」と書くと「ガッ」と書く、という不文律が生まれ、今も続いている。

以上のような、現実世界までを巻き込む事件もあれば、2ちゃんねるという閉じられた世界だけで独自の文化のようなものが生まれた、というものまでを含め、そこは既にアジアである。
 

myinnerasia at 08:05|Permalinkアジア | ピキピキ

2016年06月26日

世間ではまたまた「第三次人工知能ブーム」などと言って盛り上がっているが、その中でもキーワードとなっている「学習」について。
「機械学習」だとか、「深層学習」、「強化学習」という言葉がバズっていて、「この歳になってまた学習か。。。」などとため息をつく必要はない。
学習するのはあなたではなくて人工知能なのだから。

さて、上記の言葉の関係を説明しておくと、「機械学習」というのは大きなくくりで、その中に「深層学習」や「教科学習」というものが含まれる。

深層学習(ディープラーニング)とは、人間の頭脳でのデータ処理を模したアルゴリズムにより、人間の頭脳が行うような直感的なデータ処理を可能とするものである。
卑近な例では、人間が書いた手書き文字を認識する、というところに使われている技術である。
従来の技術では、人間が書いた文字は、個人差があるため、それを認識させるのは不可能とされていたが、深層学習の技術によって可能となった。

僕が第二次人工知能ブームのまっただ中で大学院で研究していた頃は、深層学習というものはまだなく、今の深層学習の基礎に当たる「ニューラルネットワーク」が全盛期を迎えていた。
「ニューラル(neural)」とは、人間の脳にある神経細胞、ニューロンの形容詞形で、ニューラルネットワークとはその神経細胞で形成されたネットワーク、つまり神経細胞網、という意味である。

neuralNetwork
  
この図の中にある◯がニューロンで、それらニューロンは入力層、中間層、出力層に分けられ、それらの層の間のニューロンがそれぞれ結ばれている。
この図では中間層が2層であるが、深層学習ではこの層を多くする多層構造にする。

ここでの入力データ、出力データは自由に決めることができる。
たとえば手書き文字の認識であれば、入力データはタッチパネル上の数10〜数100の点になり、つまりそれだけの数のニューロンが入力層にあることになる。出力データはすべての文字の数だけ必要になるので、出力層のニューロンの数はすごいことになる。

このニューラルネットワークは「教師あり学習」と呼ばれるもので、入力データと出力データの組み合わせの正解値を予め複数用意し、その正解値の入力("教師信号"という)に対して正しい出力値を出力するように内部の状態を変化させていく。これを「学習」という。

さてここで「内部状態を変化させる」とさらりと書いたが、具体的にはどうするのか?
それがこの図にある青い線である。
この青い線にはそれぞれ繋がりの強さ("重み係数"という)を表す値がある。
一つ前の層のそれぞれのニューロンの出力値とこの青い線の重み係数を掛けあわせたものが、次の層のニューロンにとっての入力となる。
ひとつのニューロンに注目して描いた図が下記である。

neuralNetwork2

この図では、今注目しているニューロンの一つ前の層の8つのニューロンがそれぞれ0.2, 0.7, 0.5,...という出力値を持っている。これは1に近づくほどニューロンが「興奮している」ことを表し、0に近づくほどニューロンが「興奮していない」状態を表す。この値は、最初に入力層に与えた値により変化する。つまり、与えられた入力値により、それに反応して興奮するニューロンとしないニューロンがある、ということである。

それら8つの層とのつながりの重み係数はこの図ではそれぞれ0.1, 0.3 -0.4,...である。
この値は、入力層に与えた値によって変化することはなく、とりあえず固定値である、と今は考えよう。話がややこしくなりすぎるので。
この、入力層側(左側)の各ニューロンの出力値と重み係数を掛けたものの総和が、右側のニューロンの入力値となる。

この「重み係数」について考えてみると、これは「二つのニューロンの関係性」を意味する数値である。
たとえばこの重み係数が0.9という二つのニューロンは、強い関係性を持っており、左側のニューロンの出力値の影響を受ける。左側のニューロンが興奮すれば、右側のニューロンも興奮しやすい、ということだ。

それに対し、0.1というのは関係性がかなり希薄である、といえる。影響を受けにくい。
また、マイナスの値を持つこともあるが、これは「反対の影響を持つ」ということを意味する。
左側のニューロンが大きな値を出力するほど、右側のニューロンの出力値が小さくなる。

こうして計算されたひとつのニューロンにとっての入力値から、そのニューロンが持っているある関数によって出力値を計算し、それを次のさらに右側の層のニューロンに送る、、、というのを繰り返すのである。

たとえば複数の人が書いた「あ」という文字が入力層に与えられ、その正解として、出力層の1番目だけが1という値を出力し(つまり興奮し)、ほかは全部0を出力する。また、「い」の時は出力層の2番めだけが1で、、、といった感じ。
このときの「あ→1番目」「い→2番目」「う→3番目」「え→4番目」という組み合わせが教師信号。 
ニューラルネットワークは最初、デタラメな値を出力するが、学習を繰り返すことにより、やがて教師信号として与えたとおりの入力と出力の組み合わせを出力するようになる。

さて、先ほど「話がややこしくなるので、とりあえず固定値である、と考えよう」と言った各ニューロン間の重み係数であるが、そこで思わせぶりに書いたことから察しているとは思うが、この値は変更されることがある。
入力値によって変化することはなく、確かにどんな入力値に対しても同じ値であり続けるのであるが、結果として出力層から出力される答えが間違っていた場合、その出力値が正解となるように、これらの重み係数がすべて「微調整」される。

これを「学習」と呼んでいる

ここで「学習」という値の変更を、正解に近づけるように一気に変更するのではなく、「微調整」する理由は、入力値と出力値の正解の組み合わせ(教師信号)が複数あるため、それら全てに合うように内部を徐々に変更させていくという考え方なのである。

このとき最も注目すべき点は、「汎化能力(はんかのうりょく)」というものである。
上記の例で、たとえば10人が書いた 「あ」という文字に対して正しく出力層の1番目だけ1を出力するように学習したニューラルネットは、教師信号として与えていない11人目が書いた手書き文字の「あ」に対しても出力層の1番目から1を出力するようになる、ということである。
つまり学習したことを元に、学習していないことについても一般化して答えを導く、ということである。
これが、ニューラルネットが直感的な問題を解くことができる、と言われる所以である。 

【今回のまとめ】
  • 今流行りの「機械学習」とは、人工知能の学習の総称で、それには「深層学習」や「強化学習」などがふくまれている。
  • 「深層学習」の基本は「ニューラルネット」であり、それを多層構造にしたものが「深層学習」である。
  • ニューラルネットは人間の脳を模した計算の方法により、より人間の直感に近い情報処理を行うことができるようにする技術である。
  • ニューラルネットは、入力層と出力層、およびその間にある中間層で構成される。
  • 各層にはニューロン(神経細胞)があり、各層間でニューロンが繋がれている。
  • ニューロン間の繋がりはある値(重み係数)を持ち、それらのニューロン間の影響度を表している。
  • この重み係数を微調整することが「学習」と呼ばれるものである。
  • ある問題について学習したニューラルネットワークは、学習時に与えられた以外の問題にも正しい答えを出力できるようになる。これを「汎化能力」という。 


仮想プログラミング言語で以下のようなものを書いたとする。

1: a=b+c
2: aを表示

1行目の"="は、数学では「左辺は右辺と等しい」という意味になるが、多くのプログラム言語ではそういう意味ではなく、「右辺の値を左辺の変数に代入する」という意味になる。
なので、"b+c=a"というものはありえない。
(aの値をb+cという変数に代入する、というのは明らかにおかしい)
このプログラムを実行した場合、bという変数の値とcという変数の値が足された計算結果が表示される。

僕は中学生の頃のにプログラミングを始めて、それから20年以上後にプロになったのだが、プログラムを学び始めの頃によく書く上記のような簡単なプログラムで、2行めを書くのを忘れたため、何も表示されずにプログラムが終わる、ということがたまにあった。
つまり、コンピューターは1行目の計算とその結果の代入だけをして、その結果を表示することなく終わるのである。
これはコンピューターとしては何も間違っていない。言われたことをそのままやっただけである。なので、何のエラーも出ることはない。
ただ、こちらが思っていることと違う動きをしているので、これはバグである。

やがて、もっと複雑なプログラムを書くようになった今になっても、時々似たようなことをやってしまい、なぜ値が表示されないのか、を探し続けることに時間を費やしてしまう、ということがたまにある。

計算は確かにやっているのだが、その結果を表示することをプログラムに書き忘れたために、何も表示されない、というのは、不思議なことだ。
人に何の結果も知らせることなく、自分だけが分かっているコンピューター。
これはコンピューターがひとり静かに瞑想しているようなものだ。

人工知能というものがまたまたブームになっているが、その多くは実用的な結果で人を驚かせるようなニュースばかりで、僕は退屈している。
人工知能が囲碁で人間を負かしただとか、顔だけで個人を認識することで鍵が解除できるだとか、Siriの性能が上がっただとか。
僕はそういうのはどうでもいい、と思っている。退屈だから。

実学というものは確かに技術を進歩させるために必要なものなのであろうが、人工知能に限っては、「『知能』とは何か?」ということがまず大切な問題として残っている。その考察をスキップしたままで、応用に走るために、何度か起こった人工知能ブームというものはいつも飽きられて終わってしまう。飽きられるのはしかたがないことだ。退屈なのだから。

人工知能の研究を実学ではなく、純粋な学問として扱うためには、一度、何らかの出力をさせることを諦めて、「ただ解っているコンピューター」というものを作るべきである。
つまり、上のプログラムの2行目を意図的に消し去ることで、人工知能はただ瞑想するだけの知能になることができるのである。 

myinnerasia at 10:14|Permalinkコンピューター科学 | 虚構