Skip to content

Instantly share code, notes, and snippets.

@tomoki
Created March 10, 2012 10:00
Show Gist options
  • Save tomoki/2011017 to your computer and use it in GitHub Desktop.
Save tomoki/2011017 to your computer and use it in GitHub Desktop.
titech 心理学レポート
\documentclass{article}
\title{人間の記憶のメモリモデル}
\usepackage{xltxtra}
\setmainfont{VL Gothic}
\XeTeXlinebreaklocale "ja"
\author{*******TomokiImai}
\begin{document}
\maketitle
人間の記憶のメモリモデルを設計する。
この文書の中では、メソッド、メンバー変数といったプログラミングの考えを導入する。記法はPythonのようなものとする。
ここでいくつかの仮定を導入する。
\begin{itemize}
\item ハードとしての脳の容量は一定である。
\item 全体としての記憶はノードと呼ばれる小さな記憶の集合体である。
\item 脳(Brain)、メモリ(Memory)、ノード(Node)はオブジェクトである。(オブジェクト指向の意)
\end{itemize}
まず仮定の意味について。\\
「ハードとしての脳の容量は一定」
というのはつまり、
生まれたときからずっと潜在的な脳の容量は変わらない、ということである。この容量自体は、人に依存するものとする。
ただし、潜在的な容量は変わらなくとも、実際に記憶に使うことができる容量は変化しうる。
「全体としての記憶はノードと呼ばれる小さな記憶の集合体である。」\\
これによってノードを定義する。
ノードはまたノードの集合になりうる。
また、第三の仮定により、ノードはオブジェクトである。
つまり、いくつかの性質、機能をもった物として存在する。
「ノードはオブジェクトである」\\
これによってノードはメソッド、メンバー変数を持つオブジェクトと定義する。
そのメソッド、メンバー変数は追って定義する。
また、ノードが存在する限り、脳の容量を使っているとする。
使用される容量はメンバー変数、Node.sizeというメンバー変数に格納される。
ここからは僕の現状を元に、脳の設計を行う。\\
脳は、メモリとノードの集合体である記憶をメンバー変数として所持する。\\
これについては異論はないように思う。\\
脳のメモリはほぼ無尽蔵、もしくは今までの記憶をノードとして持っておくに十分な容量を持つということ。
どこかに、ある。が思い出せないだけということ。\\
脳はある一定期間で、何らかの関数を呼び出しているということ。
この関数はノード、メモリに作用し、何らかの操作をを行う。\\
これらを前提とする。\\
さらにノード(Node)について考える。\\
ノードのもつメンバー変数は以下の通りである。
\begin{itemize}
\item Node.size 大きさ
\item Node.time 記憶した時
\item Node.connections 他のノードとのつながりとつよさ
\item Node.usedfreq 使用される頻度
\end{itemize}
メソッドは以下の通り定義する。
\begin{itemize}
\item Node.Node コンストラクタ。新しい記憶を作成する。
\end{itemize}
今はこの程度。
脳(Brain)は以下のメンバー変数を持つ。
\begin{itemize}
\item Brain.memory 記憶
\item Brain.storage 記憶の置き場としてのメモリ
\end{itemize}
メソッドは以下の通り。
\begin{itemize}
\item Brain.Brain 新しい脳を作る。
\item Brain.makenode 新しいノードを作る。
\item Brain.compress メモリを節約する。
\end{itemize}
メモリ(Memory)は以下のメンバー変数を持つ。
\begin{itemize}
\item Memory.Memory 新しい記憶を作る
\item Memory.makenode 新しいノードを作る
\end{itemize}
実際にこれらのオブジェクトがどう使われていくのかを議論する。\\
まず、人は生まれたときに、一つの脳を生成する。\\
つまりBrain.Brainを呼び出す。
\begin{enumerate}
\item self.memoryを生成する。
\end{enumerate}
その瞬間から人は記憶をはじめる。\\
はじめて経験することを記憶することとはすなわち\\
\begin{enumerate}
\item ノードを生成する。
\item ノードのtime,size,usedfreqを初期化する。
\item ノードのconnectionsを初期化する。
\end{enumerate}
ことである。
また、すでに経験済みのことを思い出す、また体験するということは
\begin{enumerate}
\item 該当ノードのtime,size,usedfreqを更新する。
\item ノードのconnectionsを更新する。
\end{enumerate}
ということである。
Brain.makenodeはMemory.makenodeを間接的に呼び出す。
それをBrain.mamoryに保存する。
また、Brainは定期的にBrain.compressを呼び出す。
これは寝るとき、もしくはほぼいつものように呼び出されている。
このメソッドはメモリをチェック、中のノードを以下の判定法で決まった動作を作用させる。
\begin{enumerate}
\item node.timeをチェックする。
古いのであれば、そのnodeに対するconnectionsを弱くする。
\item node.usedfreq,timeをチェックする。
ある値よりそれが低ければ、他からのconnectionを弱くする。
さらにBrain.memoryからBrain.storageに移動する。
\end{enumerate}
これによって、ある一定の値、人のメモリの上限をnode.sizeの合計が超えないようにしている。
Brain.storageの中に入ったノードは、他のノードからのconnectionがとても弱くなり、
通常参照できなくなる。
しかしながら、とてももともととてもつよいconnectionを持っていたノードからは参照できる可能性がある。
それを僕らは「思い出す」という。
ここで定義した、Brainというものはまさに制限付きのNeural Networkの実装である。
制限とは、サイズの問題である。
人のメモリは基本的に有限であり、コンピュータのように無尽蔵でない。とくに、忘れるという行為をコンピュータはすることができない。
ニューラルネットワークにメモリ制限を加える。
それが人の脳のシステムである。
が、単純にそれでAIは作られないと考える。
人のメモリを理解するには本物のAIを作られるようになる必要があると思われるが、それは人類未踏の地であるのは言うまでもない。
よって、Neural Networkに頼らない人のメモリを作る必要がある。
ニューラルネットワークは、ノード毎のconnectionを重視していた。
が、今回はノードという考えを捨てる。
ここまでは前哨戦。ここからが本番。
僕らのメモリとは本来何なのか。
ただの保存場所?そんなことはない。
メモリは考える道具である。
僕らはある何かの事象が起こった時、メモリの値を参照し、その結果からそれがなんであるかを理解する。
ここではノードの代わりに、eventというものを導入する。
eventはそれが起こった時間、どれくらいの頻度でそれが起こるかを持ち、さらにその事象の特徴のリストを持つ。
人が生まれた時、やはりメモリを新しく生成する。
その時点から、周りの環境からのeventを受け付ける。
eventを受け取ると次の手順でeventをメモリに保存する。
\begin{enumerate}
\item eventの特徴を解析する。
\item 仮にeventがすでにメモリに保存されている場合、別のmethodに移行する。(後述)
\item eventの特徴にeventをひもづける。
\end{enumerate}
後述とした別のmethodは
\begin{enumerate}
\item 時間や頻度を更新する。
\end{enumerate}
である。
この方法では、eventとeventはdirectには結びつきを持たない。
eventとeventは特徴を間に挟んで結び付けられる。
さらに理解できない、経験していないunknowneventが起こった場合のmethodは以下のようになる。
\begin{enumerate}
\item できる限りの特徴を抽出する。
\item それらの特徴に結び付けられるeventを見る。
\item その中で、出てくる頻度が高いものはunknowneventと関係がある可能性が高い。
\item つまりそのイベントの持つ特徴はunknowneventも持っている可能性が高い。
\item 当てはまるか思考する。
\end{enumerate}
という流れで、unknowneventを解析する。
それを通常のeventと同様にメモリに保存する。
これはパターンマッチングと呼ばれる手法に近いと思われる。
もちろんこの方法でも、人のメモリの容量の問題はクリアできない。
そのことは根本的にはまったくかわらない。
その解決法は、前回の方法と基本的に同じである。
ある一定の周期毎にあるmethodを呼ぶ。
\begin{enumerate}
\item メモリにあるeventを走破する。
\item 古い、かつあまり使用されないeventはやはり適当なところに隔離する。
ただし、そのeventの持つ特徴を持つeventがあまりない場合は隔離しづらくなる。
それは、変なものは忘れられない。そういうことである。
\end{enumerate}
特徴をもつeventがあまりないということは、nodeに関するconnectionsが少ないことと対応していると考えることができる。
が、それが意味することは全く違う。前者は特徴的である、あまり見られない珍しいことである、という理由から、メモリから排除されづらくなるのに対し、後者はむしろ排除される流れになる。
それはnodeはnode同士で結合しているのに対し、eventはそうでないからである。
またこのアイデアはまさしく人の大脳新皮質をエミュレートしたものであり、
現在個人的に制作している人工知能のシステムである。
まだ稼働段階に至っていないため、ポテンシャルははかることができないものの、
あたらしいアイデアとしてアリだと思われる。
以後このシステムについて議論する。
このシステムにおける忘却とは、少し前に議論した、適当なところに隔離することである。
このシステムにおいて、思考とは単純なパターンマッチングにすぎず、過去の経験から次の行動を予測できるものである。
これは通常の人の行動としても正しそうである。
さらにメタ記憶について。\\
あるeventを知らないということがすぐにわかるのは、
このシステムにおいて、そのeventが持つ特徴すべてを兼ね備えるものがメモリ上に存在しないことを指す。
これはeventすべてを線形に探索するような効率の悪いアルゴリズムではなく、かなり高速に存在しないことを確かめることができる。
前半に記述したnodeによるシステムの場合、これは線形に探索することになり、効率が悪い。
これも人の脳はニューラルネットワークで実装するAIではないと考える一つの根拠になる。
検索速度に関してもメタ記憶と同じである。
結局、特徴というindexを持つことで、検索の速度はニューラルネットワークよりも飛躍的に向上することができる。
これは人の脳として当然のことであるように思われるが、既存のAIの持つアルゴリズムではそれすらむずかしい。
今回提案するシステムはそれらを打破する可能性のある、有望なシステムである。
以上。
\end{document}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment