自己組織化マップと視覚野の構造#

視覚野にはコラム構造が存在する.こうした構造は神経活動依存的な発生 (activity dependent development)により獲得される.本節では視覚野のコラム構造を生み出す数理モデルの中で,自己組織化マップ (self-organizing map) [Kohonen, 1982], [Kohonen, 2013]を取り上げる.

自己組織化マップを視覚野の構造に適応したのは[Obermayer et al., 1990] [N. V. Swindale, 1998]などの研究である.視覚野マップの数理モデルとして自己組織化マップは受容野を考慮しないなどの簡略化がなされているが,単純な手法にして視覚野の構造に関する良い予測を与える.他の数理モデルとしては自己組織化マップと発想が類似している Elastic net [Durbin and Willshaw, 1987] [Durbin and Mitchison, 1990] [Carreira-Perpiñán et al., 2005] (ここでのElastic netは正則化手法としてのElastic net regularizationとは異なる)や受容野を明示的に設定した [Tanaka et al., 2004][Ringach, 2007]などのモデルがある.総説としては[Das, 2005][Goodhill, 2007] ,数理モデル同士の関係については[田中, 2002]が詳しい.

自己組織化マップでは「抹消から中枢への伝達過程で損失される情報量」,および「近い性質を持ったニューロン同士が結合するような配線長」の両者を最小化するような学習が行われる.包括性 (coverage) と連続性 (continuity) のトレードオフとも呼ばれる [Carreira-Perpiñán et al., 2005] (Elastic netは両者を明示的に計算し,線形結合で表されるエネルギー関数を最小化する.Elastic netは本書では取り扱わないが,MATLAB実装が公開されている [https://faculty.ucmerced.edu/mcarreira-perpinan/research/EN.html]). 連続性と関連する事項として,近い性質を持つ細胞が脳内で近傍に存在する現象があり,これをトポグラフィックマッピング (topographic mapping) と呼ぶ.トポグラフィックマッピングの数理モデルの初期の研究としては[von der Malsburg, 1973] [Willshaw et al., 1976] [Takeuchi and Amari, 1979]などがある.

発生の数理モデルに関する総説 [van Ooyen, 2011], [Goodhill, 2018]

単純なデータセット#

SOMにおける\(n\)番目の入力を \(\mathbf{v}(t)=\mathbf{v}_n\in \mathbb{R}^{D} (n=1, \ldots, N)\)\(m\)番目のニューロン\((m=1, \ldots, M)\)の重みベクトル (または活動ベクトル, 参照ベクトル)を\(\mathbf{w}_m(t)\in \mathbb{R}^{D}\)とする [Kohonen, 2013].また,各ニューロンの物理的な位置を\(\mathbf{x}_m\)とする.このとき,\(\mathbf{v}(t)\)に対して\(\mathbf{w}_m(t)\)を次のように更新する.

まず,\(\mathbf{v}(t)\)\(\mathbf{w}_m(t)\)の間の距離が最も小さい(類似度が最も大きい)ニューロンを見つける.距離や類似度としてはユークリッド距離やコサイン類似度などが考えられる.

\[\begin{split} \begin{aligned} &[\text{ユークリッド距離}]: c = \underset{m}{\operatorname{argmin}}\left[\|\mathbf{v}(t)-\mathbf{w}_m(t)\|^2\right]\\ &[\text{コサイン類似度}]: c = \underset{m}{\operatorname{argmax}}\left[\frac{\mathbf{w}_m(t)^\top\mathbf{v}(t)}{\|\mathbf{w}_m(t)\|\|\mathbf{v}(t)\|}\right] \end{aligned} \end{split}\]

この,\(c\)番目のニューロンを勝者ユニット(best matching unit; BMU) と呼ぶ.コサイン類似度において,\(\mathbf{w}_m(t)^\top\mathbf{v}(t)\)は線形ニューロンモデルの出力となる.このため,コサイン距離を採用する方が生理学的に妥当でありSOMの初期の研究ではコサイン類似度が用いられている [Kohonen, 1982].しかし,コサイン類似度を用いる場合は\(\mathbf{w}_m\)および\(\mathbf{v}\)を正規化する必要がある.ユークリッド距離を用いると正規化なしでも学習できるため,SOMを応用する上ではユークリッド距離が採用される事が多い.ユークリッド距離を用いる場合,\(\mathbf{w}_m\)は重みベクトルではなくなるため,活動ベクトルや参照ベクトルと呼ばれる.ここでは結果の安定性を優先してユークリッド距離を用いることとする.

こうして得られた\(c\)を用いて\(\mathbf{w}_m\)を次のように更新する.

\[ \mathbf{w}_m(t+1)=\mathbf{w}_m(t)+h_{cm}(t)[\mathbf{v}(t)-\mathbf{w}_m(t)] \]

ここで\(h_{cm}(t)\)は近傍関数 (neighborhood function) と呼ばれ,\(c\)番目と\(m\)番目のニューロンの距離が近いほど大きな値を取る.ガウス関数を用いるのが一般的である.

\[ h_{cm}(t)=\alpha(t)\exp\left(-\frac{\|\mathbf{x}_c-\mathbf{x}_m\|^2}{2\sigma^2(t)}\right) \]

ここで\(\mathbf{x}\)はニューロンの位置を表すベクトルである.また,\(\alpha(t), \sigma(t)\)は単調に減少するように設定する.

Note

Generative topographic map (GTM)を用いれば\(\alpha(t), \sigma(t)\)の縮小は必要ない.また,SOMとGTMの間を取ったモデルとしてS-mapがある.

using Random, PyPlot, ProgressMeter
# inputs 
N = 400 # num of inputs
dims = 2  # dims of inputs 
Random.seed!(1234);
σv, σw = 0.2, 0.05
v = [σv*randn(Int(N/2), dims);  1.0 .+ σv*randn(Int(N/2), dims)]
map_width = 10
w = σw*randn(map_width, map_width, dims) .+ 0.5;
function plot_som(v, w)
    scatter(v[:, 1], v[:, 2], s=10)
    plot(w[:, :, 1], w[:, :, 2], "k", alpha=0.8); plot(w[:, :, 1]', w[:, :, 2]', "k", alpha=0.8)
    scatter(w[:, :, 1], w[:, :, 2], s=10) # w[i, j, 1]とw[i, j, 2]の点をプロット
end;

近傍関数 (neighborhood function)のための二次元ガウス関数を実装する.Winnerニューロンからの距離に応じて値が減弱する関数である.ここでは一つの入力に対して全てのニューロンの活動ベクトルを更新するということはせず,winner neuronの近傍のニューロンのみ更新を行う.つまり,更新においてはglobalではなくlocalな処理のみを行うということである (Winner neuronの決定にはWTAによるglobalな評価が必要ではあるが).

# Gaussian mask for inputs
function gaussian_mask(sizex=9, sizey=9; σ=5)
    x, y = 0:sizex-1, 0:sizey-1
    X, Y = ones(sizey) * x', y * ones(sizex)' 
    x0, y0 = (sizex-1) / 2, (sizey-1) / 2
    mask = exp.(-((X .- x0) .^2 + (Y .- y0) .^2) / (2.0(σ^2)))
    return mask ./ sum(mask)
end;

自己組織化マップのメインとなる関数を書く.

function SOM!(v, w; α0=1.0, σ0=6, T=500)
    # α0: update rate, σ0 : width, T : training steps
    map_width = size(w)[1]
    N = size(v)[1]
    w_history = [copy(w)] # history of w
    @showprogress for t in 1:T
        α = α0 * (1 - t/T); # update rate
        σ = (σ0 - 1) * (1 - t/T) + 1; # decay from large to small
        wm = ceil(Int, σ)
        h = gaussian_mask(2wm+1, 2wm+1, σ=σ);
        # loop for the N inputs
        for i in 1:N
            dist = sum([(v[i, j] .- w[:, :, j]).^2 for j in 1:dims]) # distance between input and neurons
            win_idx = argmin(dist) # winner index
            idx = [max(1,win_idx[j] - wm):min(map_width, win_idx[j] + wm) for j in 1:2] # neighbor indices
            # update the winner & neighbor neuron
            η = α * h[1:length(idx[1]), 1:length(idx[2])]
            for j in 1:dims
                w[idx..., j] += η .* (v[i, j] .- w[idx..., j])
            end
        end
        append!(w_history, [copy(w)]) # save w
    end
    return w_history
end;
w_history = SOM!(v, w, α0=1.0, σ0=6, T=100);

青点が\(\mathbf{v}\),オレンジの点が\(\mathbf{w}\)である.黒線はニューロン間の位置関係を表す.下段のヒートマップは\(\mathbf{w}\)の一番目の次元を表す.学習が進むとともに近傍のニューロンが近い活動ベクトルを持つことがわかる.

figure(figsize=(6, 4)) 
idx = [1, 50, 100]
for i in 1:length(idx)
    wh = w_history[idx[i]]
    subplot(2,length(idx),i)
    title("Epoch : "*string(idx[i]))
    plot_som(v, wh); axis("off")
    subplot(2,length(idx),i+length(idx))
    imshow(wh[:, :, 1]); axis("off")
end
tight_layout()
../_images/self-organizing-map_12_0.png

視覚野マップ#

集合の直積を配列として返す関数 productと極座標を直交座標に変換する関数 pol2cartを用意する.

product(sets...) = hcat([collect(x) for x in Iterators.product(sets...)]...)' # Array of Cartesian product of sets 
pol2cart(θ, r) = r*[cos(θ), sin(θ)];

刺激と初期の活動ベクトルは[Carreira-Perpiñán et al., 2005] を参考に作成.直積productで全ての組の入力を作成する.

# generate stimulus
Random.seed!(1234);
Nx, Ny, NOD, NOR = 10, 10, 2, 12
dims = 5  # dims of inputs 
l, r = 0.14, 0.2

rx, ry = range(0, 1, length=Nx), range(0, 1, length=Ny)
rOD = range(-l, l, length=NOD)
rORθ = range(-π/2, π/2, length=NOR+1)[1:end-1]

# stimuli
v = product(rx, ry, rOD, rORθ, r)
rORxy = hcat(pol2cart.(2v[:, 4], v[:, 5])...)
v[:, 4], v[:, 5] = rORxy[1, :], rORxy[2, :];
v += (rand(size(v)...) .- 1) * 1e-5;

# initial neurons
map_width = 64
M = map_width^2
w = product(range(0, 1, length=map_width), range(0, 1, length=map_width))
w += (rand(size(w)...) .- 1) * 0.05;
w = [w 2l*(rand(M) .- 0.5) hcat(pol2cart.(4π*(rand(M) .- 0.5), r*rand(M))...)']
w = reshape(w, (map_width, map_width, dims));
SOM!(v, w, α0=1.0, σ0=5, T=50);

描画用関数を実装する. w_historyを用いてアニメーションを作成すると発達の過程が可視化されるが,これは読者への課題とする.

function plot_visual_maps(v, w)
    figure(figsize=(9, 8))
    subplot(2,2,1, adjustable="box", aspect=1); title("Retinotopic map")
    plot_som(v, w)

    ax1 = subplot(2,2,2, adjustable="box", aspect=1); title("Ocular dominance (OD) map")
    imshow(w[:, :, 3], cmap="gray", origin="lower") 
    
    ins1 = ax1.inset_axes([1.05,0,0.05,1])
    colorbar(cax=ins1, aspect=40, pad=0.08, shrink=0.6)
    ins1.text(0, -0.15, "Left", ha="center", va="center")
    ins1.text(0, 0.15, "Right", ha="center", va="center")
    
    subplot(2,2,3, adjustable="box", aspect=1); title("Contours of OD and OR")
    ORmap = atan.(w[:, :, 5], w[:, :, 4]); # get angle of polar 
    sizex, sizey = map_width, map_width
    x, y = 0:sizex-1, 0:sizey-1
    X, Y = ones(sizey) * x', y * ones(sizex)';
    contour(X, Y, ORmap, cmap="hsv")
    contour(X, Y, w[:, :, 3], colors="k", levels=1)

    ax2 = subplot(2,2,4, adjustable="box", aspect=1); title("Orientation (OR) angle map")
    imshow(ORmap, cmap="hsv", origin="lower")
    
    cm = get_cmap(:hsv)
    lines, colors = [], []
    for i in 1:9
        θ = (i-1)/8*π
        c, s = cos(θ), sin(θ)
        push!(lines, [(-c/2, 15-1.5i -s/2), (c/2, 15-1.5i + s/2)])
        push!(colors, cm(1/8*(i-1)))
    end
    
    ins2 = ax2.inset_axes([1,0,0.2,1])
    ins2.add_collection(matplotlib.collections.LineCollection(lines, linewidths=3,color=colors))
    ins2.set_aspect("equal")
    ins2.axis("off")
    ins2.set_xlim(-1, 1); ins2.set_ylim(0, 15)
    
    tight_layout()
end;
plot_visual_maps(v, w)
../_images/self-organizing-map_21_0.png

参考文献#

CPerpinanLG05(1,2,3)

Miguel A Carreira-Perpiñán, Richard J Lister, and Geoffrey J Goodhill. A computational model for the development of multiple maps in primary visual cortex. Cereb. Cortex, 15(8):1222–1233, August 2005.

Das05

Aniruddha Das. Cortical maps: where theory meets experiments. Neuron, 47(2):168–171, July 2005.

DW87

R Durbin and D Willshaw. An analogue approach to the travelling salesman problem using an elastic net method. Nature, 326(6114):689–691, 1987.

DM90

Richard Durbin and Graeme Mitchison. A dimension reduction framework for understanding cortical maps. Nature, 343(6259):644–647, February 1990.

Goo07

Geoffrey J Goodhill. Contributions of theoretical modeling to the understanding of neural map development. Neuron, 56(2):301–311, October 2007.

Goo18

Geoffrey J Goodhill. Theoretical models of neural development. iScience, 8:183–199, October 2018.

Koh82(1,2)

Teuvo Kohonen. Self-organized formation of topologically correct feature maps. Biol. Cybern., 43(1):59–69, January 1982.

Koh13(1,2)

Teuvo Kohonen. Essentials of the self-organizing map. Neural Netw., 37:52–65, January 2013.

NVS98

H-U Bauer N. V. Swindale. Application of kohonen's self-organizing feature map algorithm to cortical maps of orientation and direction preference. Proceedings of the Royal Society B: Biological Sciences, 265(1398):827, May 1998.

ORS90

K Obermayer, H Ritter, and K Schulten. A principle for the formation of the spatial structure of cortical feature maps. Proc. Natl. Acad. Sci. U. S. A., 87(21):8345–8349, November 1990.

Rin07

Dario L Ringach. On the origin of the functional architecture of the cortex. PLoS One, 2(2):e251, February 2007.

TA79

A Takeuchi and S Amari. Formation of topographic maps and columnar microstructures in nerve fields. Biol. Cybern., 35(2):63–72, November 1979.

TMR04

Shigeru Tanaka, Masanobu Miyashita, and Jérôme Ribot. Roles of visual experience and intrinsic mechanism in the activity-dependent self-organization of orientation maps: theory and experiment. Neural Netw., 17(8-9):1363–1375, October 2004.

vO11

Arjen van Ooyen. Using theoretical models to analyse neural development. Nat. Rev. Neurosci., 12(6):311–326, June 2011.

vdM73

C von der Malsburg. Self-organization of orientation sensitive cells in the striate cortex. Kybernetik, 14(2):85–100, December 1973.

WVDMLH76

D J Willshaw, C Von Der Malsburg, and Hugh Christopher Longuet-Higgins. How patterned neural connections can be set up by self-organization. Proceedings of the Royal Society of London. Series B. Biological Sciences, 194(1117):431–445, November 1976.

02

繁 田中. 神経情報科学サマースクールNISS2001講義録 視覚野神経回路の自己組織化. 日本神経回路学会誌, 9(1):41–48, 2002.