🙌

記憶のメカニズムをコーディングしてみた

2021/03/08に公開

はじめに

日々の集中力をあげるために脳の仕組みを学びたいと思って、最近、進化しすぎた脳―中高生と語る「大脳生理学」の最前線 (ブルーバックス)という本を読みました。脳科学を学ぶ初心者入門のような本で、誰でも簡単にスラスラと読むことができます。目の錯覚の仕組みや、睡眠など、脳に関するあらゆるトピックをカバーしていま。読み進めると巻末に、行列計算で記憶の仕組みを再現するという内容がありまして、せっかくなので、typescript でコード化してみました。(こちらで著者が内容を公開しています。)

あくまでイメージなので、厳密な仕組みではないことをご了承ください。

ざっくりとした記憶のメカニズム

前提の用語解説

  • 脳で情報処理を行っている細胞をニューロン(=神経細胞)と言う。
  • ニューロン間の情報の受け渡しを行っている機関をシナプスと言う。

仕組みの解説

  • シナプスの強化によって、情報の伝達効率が上がり、思い出しやすくなる。
  • シナプスの強化は、そのシナプスにひもづくニューロン同士が同時に活動したことで行われる。
  • ニューロン A と、ニューロン B が同時に活動したとき、シナプスの強度が上昇する。同時に活動したイベントを 1,活動しなかったイベントを-1 と表すと、(A,B,C)=(1,1,-1)(以下パターン A と呼ぶ)であったとき、AB のシナプスが強化され、AC、AB のシナプスが弱化する。シナプスの強化を 1、弱化を-1 と表すとすると、以下のように表せる。

行列

初期値

パターン A を数値で起こした結果

パターン A が、もう二回起きると、上記のシナプス強度は

思い出す時には、パターン A を以上の行列にかける。すると、

となりパターン A が出力される。これが思い出したと言うことになる。

  • 以上の説明を実装する。
  • 詳しい説明はこちらをチェック

モデリング

  • ニューロン同士の活動の状態(同時に活動したかしてないか)を NeuralActivity とすると type = NeuralActivity = 1 | 0
  • これがニューロンそれぞれで行われるので、export type NeuralActivityPattern = NeuralActivity[]
  • 上記の配列の length はニューロンの数に依存する。
  • シナプスの強度を行列にしたものをtype SynapseMatrix = number[][]とする

実装例

ニューロンの活動パターンを脳に入力するメソッド

input(pattern: NeuralActivityPattern) {
		pattern.forEach((act, actIndex) => {
			for (var _i = 0; _i < pattern.length; _i++) {
				if (actIndex !== _i) {
					this._synapse_matrix[actIndex][_i] += act;
				}
			}
		});
		return this._synapse_matrix;
	}

入力されたパターンが覚えているかを確認するメソッド

hasRecalled(pattern: NeuralActivityPattern) {
		let _hasRecalled = false;
		const result = pattern.map((num, index) => {
			const innerd = this._synapse_matrix[0][index] * num;
			return innerd > 0 ? 1 : -1;
		});
		result.forEach((resultNum, index) => {
			if (pattern[index] !== resultNum) {
				_hasRecalled = false;
			} else {
				_hasRecalled = true;
			}
		});
		return _hasRecalled;
	}

感想

  • この本のおかげで、脳もコンピュータはとても似通った性質を持っており、脳科学を学ぶことで、プログラミングのエッセンスを逆輸入できるのでは?(ディープラーニングもその一つ)と感じたので、もうちょっと脳の仕組みを調べたいと思いました。
  • typescript で行列計算は難しい。コードももっとうまい具合にできると思います。PR 待ってます!(github の Repository はこちら)

Discussion