Theano(ソフトウェア)
| テアノ | |
|---|---|
| 原作者 | モントリオール大学モントリオール学習アルゴリズム研究所(MILA) |
| 開発者 | PyMC開発チーム |
| 初回リリース | 2007年 |
| 最終リリース | 2.35.1 [1] / 2025年10月20日 |
| リポジトリ |
|
| 書かれた | Python、CUDA |
| プラットフォーム | Linux、macOS、Windows |
| タイプ | 機械学習 ライブラリ |
| ライセンス | 3条項BSDライセンス |
| Webサイト | pytensor.readthedocs.io/en/latest/ |
TheanoはPythonライブラリであり、数式、特に行列値の式を操作および評価するための最適化コンパイラです。[2] Theanoでは、計算はNumPy風の構文を使用して表現され、 CPUまたはGPUアーキテクチャのいずれかで効率的に実行できるようにコンパイルされます。
歴史
Theanoはオープンソースプロジェクト[3]であり、主にモントリオール大学のモントリオール学習アルゴリズム研究所(MILA)によって開発されています。[4]
このソフトウェアの名前は、黄金比の発展に長く関係付けられてきた古代哲学者テアノに由来しています。
2017年9月28日、パスカル・ランブリンはMILAの責任者であるヨシュア・ベンジオからのメッセージを投稿しました。強力な業界プレーヤーによる競合製品のため、1.0リリース以降は主要な開発は停止される予定です。[5]その後、Theano 1.0.0は2017年11月15日にリリースされました。[6]
2018年5月17日、クリス・フォネスベックはPyMC開発チームを代表して、MILA開発チームの退任後、PyMC開発者が正式にTheanoのメンテナンスを引き継ぐと発表しました[7]。2021年1月29日、彼らはTheanoのフォークにAesaraという名称を使い始めました[8] 。
2022年11月29日、PyMC開発チームは、PyMC開発者がAesaraプロジェクトをPyTensorという名前でフォークすることを発表しました。[9]
サンプルコード
以下のコードはTheanoのオリジナルの例です。double型の2つのスカラー値aとb 、そしてそれらの間の演算(加算)を持つ計算グラフを定義し、実際の計算を行うPython関数fを作成します。[10]
theanoインポートテンソルからtheano をインポート # 2つのシンボリック浮動小数点スカラーを宣言します。a = tensor.dscalar ( ) b = tensor.dscalar ( ) # 単純な式c = a + bを作成する# 式を、(a, b)の値を入力として受け取り、c の値を計算する呼び出し可能なオブジェクトに変換します。f = theano . function ( [ a , b ], c )# 1.5 を 'a' に、2.5 を 'b' にバインドし、 'c' を評価するassert 4.0 == f ( 1.5 , 2.5 )例
行列の乗算(ドット積)
次のコードは、多くの機械学習タスクにおける線形代数演算に不可欠な、Theano を使用して行列乗算を実行する方法を示しています。
theanoインポートテンソルからtheano をインポート # 2つのシンボリック2次元配列(行列)を宣言するA = tensor . dmatrix ( "A" ) B = tensor . dmatrix ( "B" )# 行列乗算(ドット積)演算を定義するC = tensor . dot ( A , B )# 行列乗算の結果を計算する関数を作成します。 f = theano . function ([ A , B ], C )# サンプル行列A_val = [[ 1 , 2 ], [ 3 , 4 ]] B_val = [[ 5 , 6 ], [ 7 , 8 ]]# 行列の乗算を評価するresult = f ( A_val , B_val ) print ( result )勾配計算
以下のコードは、Theanoを使用して、単純な演算(ニューロンなど)の入力に対する勾配を計算します。これは機械学習モデルの学習(バックプロパゲーション)に役立ちます。
theanoインポートテンソルからtheano をインポート #シンボリック変数を定義するx = tensor.dscalar ( " x" ) # 入力スカラーy = tensor.dscalar ( " y" ) # 重みスカラー # 単純な関数(y * x、単純な線形関数)を定義するz = y * x# x に関する z の勾配(x に関する z の偏微分)を計算するdz_dx = tensor . grad ( z , x )# zとdz/dxの値を計算する関数を作成するf = theano.function ( [ x , y ] , [ z , dz_dx ]) # サンプル値x_val = 2.0 y_val = 3.0# zとその勾配を計算するresult = f ( x_val , y_val ) print ( "z:" , result [ 0 ]) # z = y * x = 3 * 2 = 6 print ( "dz/dx:" , result [ 1 ]) # dz/dx = y = 3シンプルなニューラルネットワークの構築
以下のコードは、シンプルなニューラルネットワークの構築方法を示しています。これは、隠れ層が1つしかない非常に基本的なニューラルネットワークです。
theano をtheanoからインポートし、 Tとしてtensorをインポートし、 npとしてnumpy をインポートします。 # 入力と出力の記号変数を定義するX = T . matrix ( "X" ) # 入力特徴y = T . ivector ( "y" ) # ターゲットラベル(整数ベクトル)# 層のサイズを定義しますinput_size = 2 # 入力特徴の数hidden_size = 3 # 隠れ層のニューロンの数output_size = 2 # 出力クラスの数# 入力から隠し層(2x3 行列)と隠し層から出力(3x2 行列)への重みを初期化します。W1 = theano . shared ( np . random . randn ( input_size , Hidden_size ), name = "W1" ) b1 = theano . shared ( np . zeros ( Hidden_size ), name = "b1" ) W2 = theano . shared ( np . random . randn ( Hidden_size , Output_size ), name = "W2" ) b2 = theano . shared ( np . zeros ( output_size ), name = "b2" )#フォワードパス(隠れ層と出力層)を定義しますhidden_ output = T.nnet.sigmoid ( T.dot ( X , W1 ) + b1 ) #シグモイド活性化output = T.nnet.softmax ( T.dot ( hidden_ output , W2 ) + b2 ) #ソフトマックス出力 # コスト関数(クロスエントロピー)を定義するcost = T . nnet . categorical_crossentropy ( output , y ) . mean ()# 勾配を計算するgrad_W1 , grad_b1 , grad_W2 , grad_b2 = T . grad ( cost , [ W1 , b1 , W2 , b2 ])# コストと勾配を計算する関数を作成するtrain = theano . function ( inputs = [ X , y ], outputs = [ cost , grad_W1 , grad_b1 , grad_W2 , grad_b2 ])# サンプル入力データとラベル(2つの特徴、2つのサンプル)X_val = np . array ([[ 0.1 , 0.2 ], [ 0.3 , 0.4 ]]) y_val = np . array ([ 0 , 1 ])# ネットワークを 1 ステップだけトレーニングします (実際には反復します) cost_val , grad_W1_val , grad_b1_val , grad_W2_val , grad_b2_val = train ( X_val , y_val ) print ( "Cost:" , cost_val ) print ( "Gradients for W1:" , grad_W1_val )テアノでの放送
以下のコードは、Theano におけるブロードキャストの仕組みを示しています。ブロードキャストを使用すると、明示的に配列の形状を変更することなく、異なる形状の配列間で操作を行うことができます。
theano をtheanoからインポートし、 Tとしてtensorをインポートし、 npとしてnumpy をインポートします。 # シンボリック配列を宣言するA = T . dmatrix ( "A" ) B = T . dvector ( "B" )# B を A の形にブロードキャストし、それらを加算しますC = A + B # B を A の形に一致するようにブロードキャストします# 演算を評価する関数を作成するf = theano . function ([ A , B ], C )# サンプルデータ (A は 3x2 行列、B は 2 要素ベクトル) A_val = np . array ([[ 1 , 2 ], [ 3 , 4 ], [ 5 , 6 ]]) B_val = np . array ([ 10 , 20 ])# ブロードキャストによる加算を評価するresult = f ( A_val , B_val ) print ( result )参照
参考文献
- ^ “リリース 2.35.1”. 2025年10月20日. 2025年10月21日閲覧。
- ^ Bergstra, J.; O. Breuleux; F. Bastien; P. Lamblin; R. Pascanu; G. Desjardins; J. Turian; D. Warde-Farley; Y. Bengio (2010年6月30日). 「Theano: CPUとGPU向けの数式コンパイラ」(PDF) . Python for Scientific Computing Conference (SciPy) 2010 Proceedings .
- ^ 「Githubリポジトリ」。GitHub 。
- ^ 「deeplearning.net」.
- ^ ランブリン、パスカル (2017 年 9 月 28 日)。 「MILAとテアノの未来」。theano-users (メーリングリスト) 。2017 年9 月 28 日に取得。
- ^ 「リリースノート – Theano 1.0.0 ドキュメント」。
- ^ Developers, PyMC (2019年6月1日). 「Theano、TensorFlow、そしてPyMCの将来」. Medium . 2019年8月27日閲覧。
- ^ “Theano-2.0.0”. GitHub .
- ^ Developers, PyMC (2022年11月20日). 「PyMCがAesaraをPyTensorにフォーク」. pymc.io . 2023年7月19日閲覧。
- ^ 「Theanoドキュメントリリース1.0.0」(PDF) LISAラボ、モントリオール大学。2017年11月21日。p. 22。2018年8月31日閲覧。
外部リンク
- 公式サイト(GitHub)
- モントリオール大学ディープラーニングでの Theano