Representational Similarity Encoding を実装した

最終更新日: 2020年12月15日

この記事は fMRILab Advent Calendar 2020 の 12/15 分の記事です。


Representational Similarity Encoding とは

fMRI で刺激に関する計算論的モデルと脳反応を比較する場合には、主に次の2つの方法があります

  • Stimulus-model-based Encoding (Encoding) :
    • 「刺激の特徴量」と「ボクセル」をマッピングすることで、神経活動パターンを予測する。
    • 予測の結果でモデルを評価できる。
  • Representational Similarity Analysis (RSA):
    • 「刺激の特徴量のパターン類似性」と「神経活動のパターン類似性」を測定し、全ペア間の類似性構造を比較する。
    • 類似性構造の一致度でモデルを評価できる。
    • モデル適合がないので過剰適合しない。
以前の記事

Encoding については fMRI解析の基礎 (13):エンコーディング で、RSA については fMRI解析の基礎 (15):表現類似性分析 で触れています。

Anderson et al., (2016) で提案された Representational Similarity Encoding では RSA と Encoding を組み合わせて、RSA の過剰適合しないという利点と Encoding の予測ベースの評価という利点を両立します

Representational Similarity Encoding では、RSA で推定した次の値を

  • 神経活動パターン b\boldsymbol{b} \to 基底関数
  • 類似性構造 corr(s,s)\text{corr}(\boldsymbol{s}, \boldsymbol{s}') \to 重み

として新たな刺激に対する神経活動パターンを予測することになります。

定式化

NN 個の刺激からなる学習用データを {(s1,b1),,(sN,bN)}\{(\boldsymbol{s}_1, \boldsymbol{b}_1), \dots, (\boldsymbol{s}_N, \boldsymbol{b}_N)\} とします。

Train data: {(s1,b1),,(sN,bN)}b:neural-activity-vectors:feature-vector\text{Train data: } \{(\boldsymbol{s}_1, \boldsymbol{b}_1), \dots, (\boldsymbol{s}_N, \boldsymbol{b}_N)\} \\[0.5em] \begin{aligned} \boldsymbol{b}&: \text{neural-activity-vector} \\ \boldsymbol{s}&: \text{feature-vector} \end{aligned}

新しい刺激に対する神経活動パターン bnew\boldsymbol{b}_{new} は、その刺激の特徴ベクトル snew\boldsymbol{s}_{new} を用いて以下の計算で予測します

bnew=1Ci=1Ncorr(snew,si) biC=i=1Ncorr(snew,si)\begin{aligned} \boldsymbol{b}_{new} &= \frac{1}{C} \sum_{i=1}^N \text{corr}(\boldsymbol{s}_{new}, \boldsymbol{s}_i) \ \boldsymbol{b}_i \\ C &= \sum_{i=1}^N |\text{corr}(\boldsymbol{s}_{new}, \boldsymbol{s}_i)| \end{aligned}

論文中では相関指標にピアソン相関が用いられています。

次のような利点と欠点が挙げられています。とにかく、過剰適合せずに脳の計算論モデルを予測ベースで評価できるのが嬉しいわけですね!

  • 利点:
    • 単純な計算で予測ができる。
    • 過剰適合しない。
  • 欠点:
    • 各ボクセルの寄与がわからない。\to サーチライトすればよい。
    • ピアソンの相関係数によるスケーリングの問題 \to ガウス基底関数などを使ってパラメーターを入れるとよい1

Pythonによる実装

全ての実装は GitHub に載せました。Scikit-learn 準拠にして docstring も書いておきました。

github-link-card.png

使い方は Scikit-learn の予測器と同じです

simulation.py
from sklearn.datasets import make_regression
from sklearn.model_selection import cross_validate
from sklearn.metrics import make_scorer, mean_absolute_error
from rse import RSE

# S is Stimulus Featues, B is Neural Activity.  
S, B = make_regression(n_samples=100, n_features=500, n_targets=500, random_state=0)
print(f'the shape of S (Stimulus Featues): { S.shape } \nthe shape of B (Neural Activity): { B.shape }')
cv_results = cross_validate(estimator=RSE(), X=S, y=B, scoring=make_scorer(mean_absolute_error))
print('MAE score:', cv_results['test_score'])
output
the shape of S (Stimulus Featues): (100, 500) 
the shape of B (Neural Activity): (100, 500)
MAE score: [153.16376721 156.01156413 132.29871222 125.02879147 139.89512202]

また、3つの特徴量(S1,S2,S3)を生成して予測誤差を比較してみました。S1が最善のモデルなため、誤差が小さくなっているのがわかります。 simulation.png

計算量も少ないので手軽にデータ駆動型分析ができますね。emoji-+1


References

  • Kriegeskorte, N. (2011). Pattern-information analysis: From stimulus decoding to computational-model testing. NeuroImage, 56(2), 411–421. url
  • Anderson, A. J., Zinszer, B. D., & Raizada, R. D. S. (2016). Representational similarity encoding for fMRI: Pattern-based synthesis to predict brain activity using stimulus-model-similarities. NeuroImage, 128, 44–53. url

  1. これはこれで、過剰適合の問題がありそう。