Theanoをつかってみた(2) - 共有変数

今日はパラメータと変数の使い方の違いについて。

そもそも「パラメータ」と「変数」って表現はあまり良くない気がするので、 実例を上げながら説明。例えば、
{ \displaystyle
K(x,x') = \exp(-\sigma||x-x'||^2)
}
という関数があったとすると(RBFカーネル)、 \sigma はパラメータ、  x, x' は変数ということ。

 \sigmaなんて計算中に変化するものではないので、いちいち

import theano.tensor as T
import theano

x1 = T.dscalar()
x2 = T.dscalar()
sigma = T.dscalar()
func = T.exp(-sigma*T.pow((x1-x2), 2))
valFunc = theano.function([sigma,x1,x2], func)
print valFunc(1, 2, 1)    #0.367879441171
print valFunc(1, 2, 2)    #1.0

こうやるのは面倒。というより、コードを見たときに第一引数(=パラメータ)も変えるのかな??という疑念を持たせてしまうので可読性が悪い。

そこで以下のようにする。

import theano.tensor as T
import theano

x1 = T.dscalar()
x2 = T.dscalar()
sigma = theano.shared(1, name='sigma')
func = T.exp(-sigma*T.pow((x1-x2), 2))
valFunc = theano.function([x1,x2], func)
print valFunc(2, 1)    #0.367879441171
print valFunc(2, 2)    #1.0

要点はtheano.shared。これを共有変数とか言うらしい。