生命情報

  1. 脳科学( 8 回目)
  2. 遺伝子情報( 9 回目)
  「人工知能と認知科学」の分野や「情報学とは?」の中で述べたように,コンピュータの知能を高める,体内に流れる情報を利用して直接外部の機械を動作させる(義手を自分の思ったとおりに動作させる,・・・),自己修復可能な機械を実現する,などの目的のためには,人間の情報処理方法をその内部から知ることも重要です.このような人間(生物)内部の情報処理を対象とするのが,生命情報分野です.これらの分野について学ぶためには,まず,生物学に関する基本的知識について学ぶ必要があります.

  1. 脳科学

      感覚器官を通して入ってきた情報を脳は巧妙に処理しています.その結果を外部から見たのが心理学分野の「感覚知覚」,内部から見たのが「感覚生理」という分野であるといえます.また,脳はそれらの情報を単純に処理するだけでなく,学習や記憶といった高度な情報処理に結びつけています(「脳と情報」).

      ここで,学習という行動について少し詳しく見てみます.生体の神経系は,神経細胞(ニューロン)から構成されています.更に,神経細胞は,右図に示すように,細胞体,樹状突起,軸索という 3 つから構成されています.各神経細胞は,樹状突起や細胞体によって多くの神経細胞から信号を受け取り,軸索を通して他の多くの神経細胞へ信号を伝達します.細胞間の結合部はシナプスと呼ばれますが,実際に結合されているわけではなく,わずかな隙間があり,軸索先端から放出される化学物質が隙間を移動することによって信号が伝達されます.神経細胞の動作の基本は以上のようですが,実際には,非常に多くの種類の神経細胞が存在します.また,学習は結合方法やシナプスの結合の強さの変化によって行われると考えられています.

      このような神経細胞網をコンピュータ上に実現しようとしたものがニューラルネットワークです.ここでは,最も簡単なニューラルネットワークについて考えてみます.各神経細胞は,右図のようにモデル化されます.u1~un が樹状突起を通して入ってくる他の神経細胞からの信号,w1~wn がシナプス結合の強さ,及び,un+1 が軸索から出て行く信号になります.他の神経細胞から入ってくる信号は -1,+1 のいずれかの値であり,また,un+1 も,図に示すような値を取ることとします.

      このようにすると,w0~wn の値(重み)によって,un+1 の値も異なってきます.そこで,このネットワークを使用して,与えられた例を 2 つのグループ,つまり,-1 を出力するグループと +1 を出力するグループに分類したいとします.具体的には,以下に示すような 3 つの例を考えます.なお,u0 は,w0 を修正するための仮想的な入力であり,常に +1 の値を取ります.

    E1 = [u0 u1 u2 u3] = [+1 -1 -1 -1] のとき u4 = +1
    E2 = [u0 u1 u2 u3] = [+1 +1 -1 -1] のとき u4 = -1
    E3 = [u0 u1 u2 u3] = [+1 +1 +1 +1] のとき u4 = +1

      重みの修正方法(学習方法)として,以下の方法を採用します.

    1. すべての重みを 0 とする

    2. ランダムに Ei を選択する

    3. Ei を入力したとき,そのときの出力が対応する u4 に等しければ何も行わない.等しくなければ,各重みに Ei を u4 (上に示した目標とする出力)倍した値を加え,それを新しい重みとする.

    4. 現在の重みで,すべての Ei に対して正しい出力が得られれば終了する,そうでなければ,b に戻る.

    この方法に従って,例えば,

    E1E2E1E3E1E3E1E2E1

    の順番で Ei を与えたとき,学習は以下に示すように進展します.4 番目以降の重みの変化を埋めてみてください(最初の重みは,w = [w0 w1 w2 w3] = [0 0 0 0]).

    1. E1 を入力したとき

      • s = u0 * w0 + u1 * w1 + u2 * w2 + u3 * w3 = (+1) * 0 + (-1) * 0 + (-1) * 0 + (-1) * 0 = 0  ∴ s = 0

      • 目標とする出力( +1 )と異なるため誤りである.

      • c に述べた手順(各重みに E1 を u4倍した値を加える)に従い重みを修正する

        • w0 = w0 + u4 * u0 = 0 + (+1) * (+1) = +1
        • w1 = w1 + u4 * u1 = 0 + (+1) * (-1) = -1
        • w2 = w2 + u4 * u2 = 0 + (+1) * (-1) = -1
        • w3 = w3 + u4 * u3 = 0 + (+1) * (-1) = -1
          w = [w0 w1 w2 w3] = [+1 -1 -1 -1]

    2. E2 を入力したとき

      • s = u0 * w0 + u1 * w1 + u2 * w2 + u3 * w3 = (+1) * (+1) + (+1) * (-1) + (-1) * (-1) + (-1) * (-1) = 2  ∴ s = 2

      • 目標とする出力( -1 )と異なるため誤りである.

      • c に述べた手順(各重みに E2 を u4倍した値を加える)に従い重みを修正する

        • w0 = w0 + u4 * u0 = (+1) + (-1) * (+1) = 0
        • w1 = w1 + u4 * u1 = (-1) + (-1) * (+1) = -2
        • w2 = w2 + u4 * u2 = (-1) + (-1) * (-1) = 0
        • w3 = w3 + u4 * u3 = (-1) + (-1) * (-1) = 0
          w = [w0 w1 w2 w3] = [0 -2 0 0]

    3. E1 を入力したとき

      • s = u0 * w0 + u1 * w1 + u2 * w2 + u3 * w3 = (+1) * 0 + (-1) * (-2) + (-1) * 0 + (-1) * 0 = 2  ∴ s = 2

      • 目標とする出力( +1 )と一致するため,重みはそのままとする.
        w = [w0 w1 w2 w3] = [0 -2 0 0]

    4. E3 を入力したとき
          ・・・・・

  2. 遺伝子情報

      遺伝子に関する知識は,医療・医薬品・食品分野で広く利用されていますが,その中で情報学の果たす役割は非常に大きくなっています(「遺伝子情報の解析などで情報学における分析手法等が使用されるのは当然の帰結といえます.逆に,生命現象の中で行われている情報処理をコンピュータに取り入れることも今後の重要な課題です.

      人間を含めたすべての生物は,たった一つの受精卵から分裂を繰り返しながら完成された個体が形成されていきます(「発生学と生命システム」).さらに,発達と学習を繰り返しながら,1人前の個体に成長していきます.これらの情報のかなりの部分(個体を生成する手順,発達の方向,学習方法やその範囲,・・・)が遺伝子に組み込まれていると考えられます.そのような意味で,遺伝子は一種のプログラムとみなすことができますが,残念ながら,現在の我々にはそのようなプログラムを作成することはできません.

      遺伝子に記述されたプログラムの一部でも明らかになれば,故障した箇所を自己修復できる機械,自分自身で発達・学習し知的能力を高めていくことができるコンピュータなどの実現が夢ではなくなります.そのような状況にはほど遠い状況ですが,ここでは,遺伝現象を最適化問題に応用した「遺伝的アルゴリズム( Genetic Algorithm,GA )」について見てみます.なお,「遺伝的アルゴリズム」は,「人工生命」の分野でも多く利用されています.

      「生物は,交叉,突然変異,淘汰を繰り返しながら,環境に適合するように進化していく」と言われています.環境に適合する度合い(以後,適合度と呼びます)を数値で表せば,進化して生き残った個体の適合度は徐々に高くなっていくことになります.適合度を,最適化問題において最大値(又は,最小値)を求めたい関数(目的関数)と考えると,目的関数の値が進化と共に徐々に大きくなっていくことになります.つまり,目的関数を最大にするという最適化問題の解に近づいていくことになります.

      そこで,コンピュータ内に仮想生命を複数生成し,その環境に対する適合度を最適化問題の目的関数に一致させ,仮想生命による集団が進化する過程をシミュレーションすることによって,最適化問題を解くことが可能になります.これが,「遺伝的アルゴリズム」の基本的考え方です.「遺伝的アルゴリズム」の基本手続きは以下に示すようになります.

    1. 交叉: 子を生成する過程です.最も簡単な 1 点交叉の手続きは以下のようになります(下図参照).まず,個体の集団から 2 つの親をランダムに選択します.親の染色体(遺伝子の並び)をランダムに決めた1点(下図の赤線部分)で切り離し,その組合せを変えたものを子とします( 2 つの子が生成されます).
                  01001|101             01001110
              親              →  子供
                  01100|110             01100101
              

    2. 突然変異: 突然変異にも様々な方法がありますが,最も基本的な方法は,突然変異が起こる遺伝子を選択し,その値を対立遺伝子(遺伝子が取り得る値)のいずれかにランダムに変える方法です.

    3. 淘汰: 上の2つの操作だけでは,個体の数が増加する一方です.そこで,余分な個体を削除し,子を作る前の数に戻してやる操作です.単純に考えると,適合度が高い個体だけを残してやれば良さそうですが,そのような方法では,局所的最適解に陥りやすい,環境の変化に適応できない,などの問題が発生します.そこで,「適合度が高い個体が生き残りやすくはなるが,適合度が低い個体も生き残る可能性がある」ような確率的な方法を使用します.ここまでの手順が,1世代に対応します.

      1. エリート選択 単純に,適応度が高い個体を残す方法です.例えば,現在の個体数が 5 で,かつ,各個体の適応度が,

        • 個体 A  40
        • 個体 B  20
        • 個体 C  20
        • 個体 D  10
        • 個体 E  10

        であり,かつ,3 つの個体を残す場合は,個体 A,B,及び,C を残すことになります.

      2. ルーレット選択 適応度に基づいたルーレット版を作成し,そのルーレット版を使用してランダムに選択する方法です.たとえば,上の例の場合,右図のようなルーレット版ができます.このルーレット版を回し個体を選択すれば,個体 A が選ばれる確率が最も高くなりますが,個体 E が選ばれる確率も 0 ではありません.

    4. 1 に戻る.

    [例: 関数の最大値] GA の例として,x が [0, 1] のとき,次の関数の最大値を GA を使用して求めてみます.

    f(x) = sin(3x) + 0.5sin(9x) + sin(15x + 50)

      GA を適用するに当たり,まず,各個体の遺伝子型,表現型,適応度の計算方法等を決めてやる必要があります.遺伝子型は,0 と 1 の並びとし,変数 x の値に相当するものとします.実際の x の値(表現型)は,遺伝子長が n であれば,

    x = (染色体を2進数とみなした値) / (2n - 1)

    のようにして,計算できます.例えば,n = 5 で,かつ,ある個体の染色体が 01001 であれば,x = 9 / 31 = 0.29 となります.また,適応度は,得られた x を関数に代入した値とします.

      その他,以下のような設定で GA を実行します.

    • 遺伝子長: 20
    • 集団サイズ: 20
    • 交叉時の親のペア数: 10
    • 交叉方法: 1点交叉
    • 突然変異方法: 通常(突然変異率: 0.03)
    • 淘汰方法: ルーレット選択.ただし,上位2つはエリート選択で選ぶものとする.

      この結果,以下のような結果が得られます.各行の 2 番目が変数 x の値,最後が関数の値(適応度)です.第1世代(初期世代)では,x の値が区間 [0, 1] に散らばっていますが,世代を経る毎に,最適値の周りに集まっていくのが分かると思います(最も適応度が高い固体を緑色で示してあります).
      第 1 世代
        1 0.664669    0.487323
        2 0.449878    0.779902
        3 0.421274    0.423158
        4 0.0939523   1.56253
        5 0.915608    1.63245
        6 0.62815     0.921525
        7 0.0661469   1.14195
        8 0.248805    0.75209
        9 0.905189    1.57068
       10 0.035594    0.529243
       11 0.349932   -0.10005
       12 0.536941    1.50067
       13 0.435383    0.596746
       14 0.00834561 -0.0772843
       15 0.16543     1.77348
       16 0.318222   -0.0260138
       17 0.941928    1.67931
       18 0.789944    0.233126
       19 0.467931    1.00069
       20 0.032279    0.456871
    
      第 5 世代
        1 0.916775   1.63794
        2 0.945149   1.67341
        3 0.0939523  1.56253
        4 0.915608   1.63245
        5 0.915554   1.63219
        6 0.165365   1.77387
        7 0.893734   1.47846
        8 0.165431   1.77348
        9 0.941928   1.67931
       10 0.91576    1.63318
       11 0.915429   1.63158
       12 0.168628   1.75312
       13 0.935384   1.68326
       14 0.943199   1.6773
       15 0.165608   1.77241
       16 0.165432   1.77347
       17 0.978233   1.45976
       18 0.165366   1.77387
       19 0.917806   1.64254
       20 0.035677   0.531044
    
      第 10 世代
        1 0.1639    1.78243
        2 0.945149  1.67341
        3 0.943196  1.6773
        4 0.165758  1.7715
        5 0.157613  1.81349
        6 0.165731  1.77167
        7 0.165431  1.77348
        8 0.908102  1.59019
        9 0.970421  1.53517
       10 0.133137  1.84168
       11 0.907919  1.58902
       12 0.918663  1.64618
       13 0.157947  1.81207
       14 0.165443  1.77341
       15 0.134053  1.8434
       16 0.168616  1.7532
       17 0.106131  1.69155
       18 0.111654  1.73778
       19 0.134542  1.84423
       20 0.106116  1.69142
    
      第 15 世代
        1 0.130696  1.83601
        2 0.134681  1.84445
        3 0.945149  1.67341
        4 0.165758  1.7715
        5 0.165761  1.77148
        6 0.943987  1.67585
        7 0.134543  1.84423
        8 0.134542  1.84423
        9 0.915759  1.63317
       10 0.181477  1.64957
       11 0.165667  1.77206
       12 0.134725  1.84452
       13 0.944008  1.6758
       14 0.107258  1.70162
       15 0.134602  1.84433
       16 0.195106  1.50613
       17 0.1061    1.69127
       18 0.169673  1.74597
       19 0.88456   1.38873
       20 0.111685  1.73801
    
      第 20 世代
        1 0.121695  1.80149
        2 0.134681  1.84445
        3 0.150306  1.83773
        4 0.127601  1.82656
        5 0.165914  1.77055
        6 0.149603  1.83937
        7 0.164312  1.78007
        8 0.165762  1.77148
        9 0.140982  1.84931
       10 0.149573  1.83944
       11 0.134673  1.84444
       12 0.126868  1.82395
       13 0.133169  1.84174
       14 0.944008  1.6758
       15 0.126364  1.82207
       16 0.165916  1.77054
       17 0.134528  1.84421
       18 0.121692  1.80148
       19 0.943991  1.67584
       20 0.140983  1.84931
    				

      ここで,実際に問題を解いてみます.最初(1世代目),次に示すような 5 つの個体が存在したとします.各個体の染色体は,0 か 1 の 10 個の並びであり,その適合度は,染色体中の 1 の数であるとします.
    	(a)  0 1 1 0 0 0 0 1 0 1  適合度: 4
    	(b)  1 0 1 0 0 1 1 0 0 1  適合度: 5
    	(c)  0 1 0 0 1 0 0 1 0 0  適合度: 3
    	(d)  0 0 0 1 0 0 1 1 0 0  適合度: 3
    	(e)  1 1 0 1 1 0 0 1 1 1  適合度: 7
    				
      このとき,先に述べた手順における 1 点交叉と淘汰を 2 回繰り返してみてください(突然変異は行わない).その際,1 点交叉では,親を選び子を作る手順を 2 回繰り返してください.従って,交叉を終了した時点で,個体の数は 9 になるはずです.また,淘汰においては,適合度の高い 5 つの個体だけを残すようにしてください.なお,親の選択や交叉位置は,できるだけランダムに決めて下さい.
    	選択した親: (  ),(  )  交叉位置: (  )
    	  2つの子の染色体: (f)           適合度:
    	            (g)           適合度:
    	選択した親: (  ),(  )  交叉位置: (  )
    	  2つの子の染色体: (h)           適合度:
    	            (i)           適合度:
    	淘汰結果: (a)           適合度:
    	      (b)           適合度:
    	      (c)           適合度:
    	      (d)           適合度:
    	      (e)           適合度:
    	選択した親: (  ),(  )  交叉位置: (  )
    	  2つの子の染色体: (f)           適合度:
    	            (g)           適合度:
    	選択した親: (  ),(  )  交叉位置: (  )
    	  2つの子の染色体: (h)           適合度:
    	            (i)           適合度:
    	淘汰結果: (a)           適合度:
    	      (b)           適合度:
    	      (c)           適合度:
    	      (d)           適合度:
    	      (e)           適合度:
    				

目次