Python用の数値計算ライブラリーTheano超々入門

Python用の数値計算ライブラリーTheano超々入門

Pythonの数値計算ライブラリーと言えば、NumPySciPyなどでしょう。

NumPyなどと異なり、数式そのものを記述するスタイルを取るライブラリーもあります。Theanoです。


https://theano-pymc.readthedocs.io/en/latest/

数式で考えるクセのある数理系の人にとっては、Theanoの方が便利かもしれません。

そして、Theanoディープラーニングを強く意識したライブラリーということもあり、ある程度使いこなせるようになると、そのあたりのモデリングも難なく実現できます。

ということで、今回は「Python用の数値計算ライブラリーTheano超々入門」というお話しです。

基礎のキソの基礎のキソの基礎、といったレベルのお話しです。

Theanoのインストール

Anaconda環境を前提にします。

コマンドプロンプトに、以下のコードを入力しインストールしてください。

conda install theano

 

Theanoのコード化と実行の3ステップ

Theanoは、主に以下の3つのステップで動作します。

  • ステップ1:数式の定義
  • ステップ2:関数の生成(コンパイル)
  • ステップ3:関数の利用

初めての人は意味不明だと思いますので、簡単な例で流れを説明します。

 

超簡単な数式の例

以下の関数を作り、作った関数に値を代入し使ってみます。

\displaystyle f_1(x_1,x_2,x_3)=x_1 \times x_2+x_3

 

先ずは、必要なライブラリーを読み込みます。

以下、コードです。

# ライブラリーの読み込み
import numpy as np
import theano
import theano.tensor as T
from theano import function

 

ステップ1から3を順番に進めて行きます。

 

ステップ1の「数式の定義」です。

以下、コードです。

# ステップ1:数式の定義

## 変数
x1 = T.scalar()
x2 = T.scalar()
x3 = T.scalar()

## 数式
y = x1 * x2 + x3

 

スカラーとベクトル、行列、テンソルなどを変数として指定できます。

ちなみに、Theanoの中では変数と呼ばずシンボルと呼びます。

今回は、スカラーを表すシンボルx1、x2、x3を宣言し、それを使い数式を定義しています。

 

ステップ2の「関数の生成(コンパイル)」です。

以下、コードです。

# ステップ2:関数の生成(コンパイル)
f1 = function(inputs=[x1, x2, x3],
              outputs=y,
             )

 

これで関数f_1(x_1,x_2,x_3)=x_1 \times x_2+x_3が使えるようになります。

 

ステップ3の「関数の利用」です。

以下、コードです。

# ステップ3:関数の利用
print(f1(1, 2, 3))

 

以下、実行結果です。

 

これは、f_1(1,2,3)=1 \times 2+3=5です。

概ね雰囲気を掴めたかと思います。

 

簡単なシグモイド関数の例

以下のような数式を作り、使ってみたいと思います。

\displaystyle f_2(x) = \frac{1}{1+e^{-x}}

 

先ずは、必要なライブラリーを読み込みます。

以下、コードです。

# ライブラリーの読み込み
import numpy as np
import theano
import theano.tensor as T
from theano import function

import matplotlib.pyplot as plt
plt.style.use('ggplot') #グラフスタイル
plt.rcParams['figure.figsize'] = [12, 9] # グラフサイズ

 

ステップ1から3を順番に進めて行きます。

 

ステップ1の「数式の定義」です。

以下、コードです。

# ステップ1:数式の定義

## 変数
x = T.scalar()

## 数式
y = 1/(1 + T.exp(-x))

 

ステップ2の「関数の生成(コンパイル)」です。

以下、コードです。

# ステップ2:関数の生成(コンパイル)
f2 = function(inputs=[x], 
              outputs=y,
             )

 

ステップ3の「関数の利用」です。

以下、コードです。

# ステップ3:関数の利用

## xの値
xs = np.linspace(-10,10,100)

## yの値
ys = []
for x_i in xs:
    ys.append(f2(x_i))
    
## グラフ化
plt.plot(xs,ys)
plt.show()

 

以下、実行結果です。

 

簡単な関数と導関数(1階微分)の例

以下のような数式を作り、さらにxで微分した導関数を作り、使ってみたいと思います。

\displaystyle f_3(x) = 2x^3

\displaystyle \frac{d}{dx}f_3(x)=6x^2

 

先ずは、必要なライブラリーを読み込みます。

以下、コードです。

# ライブラリーの読み込み
import numpy as np
import theano
import theano.tensor as T
from theano import function

 

ステップ1から3を順番に進めて行きます。

 

ステップ1の「数式の定義」です。

以下、コードです。

# ステップ1:数式の定義

## 変数
x = T.scalar()

## 数式
y = 2*(x**3)
z = T.grad(cost=y, #微分する対象
           wrt=x   #微分を取る変数
          )

 

ステップ2の「関数の生成(コンパイル)」です。

以下、コードです。

# ステップ2:関数の生成(コンパイル)
f3 = function(inputs=[x], 
              outputs=y,
             )

f3_grad = function(inputs=[x], 
                   outputs=z,
                  )

 

ステップ3の「関数の利用」です。

今作成した関数と導関数に値を代入してみます。

以下、コードです。

# ステップ3:関数の利用その1

print('f3(1) =',f3(1))
print('f3_grad(1) =',f3_grad(1))

 

以下、実行結果です。

 

これは、f_3(1) = 2 \times 1^3 = 2\frac{d}{dx}f_3(1) = 6 \times 1^2 = 6

今作成した関数と導関数をグラフで見てみます。

以下、コードです。

# ステップ3:関数の利用その2

## xの値
xs = np.linspace(-10,10,100)

## yの値

### f3
f3_ys = []
for x_i in xs:
    f3_ys.append(f3(x_i))
    
### f3_grad
f3_grad_ys = []
for x_i in xs:
    f3_grad_ys.append(f3_grad(x_i))
    
## グラフ化
plt.plot(xs,f3_ys,label='f3(x)')
plt.plot(xs,f3_grad_ys,label='f3_grad(x)')
plt.legend()
plt.show()

 

以下、実行結果です。

 

まとめ

今回は「Python用の数値計算ライブラリーTheano超々入門」というお話しをしました。

なんとなく、どのようなものかイメージが付いたかと思います。Theanoは、ベイズモデリングやディーラーニングなどで利用できます。別の機会に取り上げたいと思います。

また、Theanoの後継としてAesaraというライブラリーが開発されています。こちらも、別の機会にお話しします。

https://aesara.readthedocs.io/en/latest/

基本的なところはほぼ同じように感じられますが、微妙に異なります(互換性という意味において……)。