image


知識の獲得戦略スペシャリストジェネラリスト 僕がよく使う知識の分布図をコードで生み出して実験ができるようにしようと考えた。

毎ステップ3つの学習対象の選択肢が与えられて、自分の知識獲得戦略に従って一つを学ぶ。 学ぶとランダムな量の知識が得られる。得られる知識領域にもランダムなノイズを加えているので、「学ぼうとしたことのちょっとずれた分野の知識を得る」こともある。 知識獲得戦略以外の条件を同じにして、3つの選択肢の中から「自分がもっとの知識の多い対象」を選ぶ戦略(スペシャリスト戦略)と、「自分がもっとの知識の少ない対象」を選ぶ戦略(ジェネラリスト戦略)で場合でどういう差が出るかを観察した。 image スペシャリストに対してピークが一つだけのようなイメージを持っていたが、複数のピークが発生した。

もっと「大部分の領域でジェネラリストが勝つが、スペシャリストは自分の得意分野でだけ圧倒的に強い」という現象を想像していたが、44%の領域でスペシャリストが勝つ。

この振る舞いは、全部で100ある学習対象のうち、ランダムな3つの選択肢から選ぶという「学びの対象の自由度」が乏しい状況だから起こることである。与えられる選択肢を10個にするとこうなる。 image 選択肢を30、つまり全対象の3割から自由に選べるようにするとこうなる。 image 自分の一番得意なものを選択する「スペシャリスト戦略」は、選択の自由度が高まるほど一つのピークに集中するようになる。 一方、ジェネラリスト戦略は選択の自由度にあまり影響されていない。

3人のスペシャリストと1人のジェネラリスト ジェネラリストは誰も似ているので3人集めても文殊の知恵にならないが、 スペシャリストが集まって自分の強みを発揮すると大部分の領域でジェネラリストの集団より高い知識を発揮するようになる。 image

Colab python

import numpy as np
from matplotlib import pyplot as plt
KNOWLEDGE_WIDTH = 100
TIMES = 10000

def get_knowledge(policy):
  knowledge = np.zeros(KNOWLEDGE_WIDTH)
  for t in range(TIMES):
    targets = np.random.randint(0, KNOWLEDGE_WIDTH, size=3)
    target = targets[policy(knowledge[targets])]
    target = int(np.random.normal(target))
    if target < 0 or target >= KNOWLEDGE_WIDTH: continue
    knowledge[target] += np.random.random()
  return knowledge

specialist = get_knowledge(policy=lambda xs: xs.argmax())
generalist = get_knowledge(policy=lambda xs: xs.argmin())
plt.plot(specialist, label="specialist")
plt.plot(generalist, label="generalist")
plt.legend()