class chainer.FunctionNode[source]

計算グラフの関数ノード。

 

FunctionNodeは計算グラフのノードを表しているクラスです。このノードは入力値に微分可能な関数を適用することに相当します。

微分可能な関数が  Variable オブジェクトに適用される時、FunctionNode実装のインスタンスを生成し、その apply() メソッドを呼び出します。この apply() メソッドは基本的に下記の3つのことを行います。 

  1. FunctionノードからVariableノードの対応する入力へエッジを加えます。それぞれのノードの入力は Variable.nodeによって抽出されます。
  2. この関数の出力配列を計算します。
  3. 各出力配列に Variable オブジェクトを生成し、 このVariableのノードからFunctionノードへ向けてエッジを加えます。

出力Variableが返されます。

例)

xをVariableのインスタンス、fを1つ引数をとるFunctionNodeのインスタンスとします。

 

         
>>> import numpy, chainer, chainer.functions as F
>>> x = chainer.Variable(numpy.zeros(10))
>>> f = F.Identity()
>>> y = f.apply((x,))[0]

最後の行で、新しいVariableのyを計算し、後方参照を生成します。

 

実際に、後方参照は下図のようにセットされます。 (*訳注:<----がエッジ)

x.node <--- f <--- y.node 

 

もし、下図のように他のfunction(g)が適用されると


>>> g = F.Identity()
>>> z = g.apply((x,))[0]

 

グラフは下図のように枝分かれします。


|--- f <--- y.node
x.node <-+
|--- g <--- z.node

 

この枝分かれは逆方向の計算の際、正確に管理されることに留意してください。 つまり、fとgの勾配は、xの勾配に累算されます。

全てのFunctionNode実装は forward() と backward()を提供しなければなりません。CPU配列とGPU配列が完全に分けて実装されている場合、forward()をオーバーライドする代わりに、 forward_cpu() や forward_gpu() を実装することも可能です。

 

入力と出力のVariableは、デフォルトでは backward() からアクセス出来ませんので、注意してください。これらのVariablesにアクセスする必要がある場合は、 forward() メソッド (もしくはそのCPU/GPU版) が retain_inputs() や retain_outputs() を適切に呼び出さなければなりません。保持されている入力/出力Variableは backward()からget_retained_inputs() や get_retained_outputs()を呼び出すことでアクセスが可能です。

Note
Chainerには(v3以降)2タイプの微分可能な関数があります。1番目のタイプは、 Functionのサブクラスを使用する関数で、旧スタイルの微分可能な関数から呼び出されます。2番めのタイプは、FunctionNodeのサブクラスを使用する関数で、新スタイルの微分可能関数とも呼ばれます。 この新スタイルの微分可能関数を使用することにはいくつか利点があります。
  • 新スタイルの微分可能関数は微分可能なバックプロパゲーションをサポートしています。新スタイルの微分可能関数自信をを通して計算された逆伝搬された勾配は、自動で高次の微分が利用可能になるように、さらなるバックプロパゲーションをサポートしています。
  • 新スタイルの微分可能関数のバックプロパゲーションは、インタフェースが不必要な入力勾配の計算を省略する実装を許可しているので、計算時間を節約することが可能です。

Chainerにおいて、この新スタイルの微分可能関数は計算グラフの関数ノードを定義する標準的な方法であることに留意してください。そのため、旧スタイルの微分可能な関数は新スタイルの微分可能な関数のラッパーとして実装されています。

Variables:
  • inputs –  入力VariableNode オブジェクトのタプル.
  • outputs –出力VariableNode オブジェクトへの弱参照のタプル
  • rank (int) – 計算グラフの位置をたどる順番
  • stack – 順方向への計算で取得したスタックトレース。このスタックトレースはデバッグモードでのみ、利用可能です。

 

version 3.0.0.の新機能

 

Methods

add_hook(hook, name=None)[source]

関数フックを登録する。

 

Parameters:
  • hook (FunctionHook) – 登録する関数フック
  • name (str) – 関数フックの名称。この名前は登録されている関数フック群の中でユニークである必要があります。 Noneの場合、関数フックのデフォルト名が使用されます。
apply(inputs)[source]

出力Variableを計算し、計算グラフを増大させる。

 

基本的な動作は FunctionNodeのドキュメントに記載されています。(*訳注:このページの上部)

Note
この入力Variableの data 属性がGPUデバイス上にあるとき、このデバイスは forward(), を呼び出す前にカレントデバイスとされるので、多くの場合、実装者はデバイス選択について気にする必要はありません。
Parameters: inputs – 入力Variableのタプル。各要素は、 Variablenumpy.ndarray、 cupy.ndarrayのいずれかの可能性があります。要素がndarrayだった場合は、自動的にVariableでラップされます。
Returns: 出力Variable オブジェクトのタプル

 

backward(target_input_indexes, grad_outputs)[source]

出力勾配が与えられた指定した入力について、勾配を計算する

 

このメソッドは、このFunctionNodeの順方向への計算に相応するバックプロパゲーションの計算の1ステップに用いられます。出力Variableについて勾配が与えられ、このメソッドは指定された入力Variableについて勾配を計算します。このメソッドではtarget_input_indicesによって指定された入力勾配を計算する必要はありません。

Function.backward(),とは異なり、勾配は  Variable オブジェクトで与えられ、このメソッド自身が入力勾配をVariable オブジェクトとして返さなければなりません。これは、FunctionNodeが入力勾配を全計算履歴とともに返すことを可能にします。その場合、微分可能なバックプロパゲーションもしくは高次微分をサポートします。

 

デフォルト実装はNoneを返します。これは、この関数が微分不可能だという意味です。

 

Parameters:
  • target_input_indexes (tuple of int) –配が要求される入力Variableのインデクス。このタプルが少なくとも1つの要素を含むことは保障されている。
  • grad_outputs (tuple of Variable) –出力Variableの勾配。 出力Variableの勾配が与えられていない場合、それに相応する様相はNoneになります。
Returns:

指定した入力Variableの勾配を表すVariableのタプル。タプルの長さは  len(target_input_indexes) や入力の長さと同じ値をとり得る。後者の場合、target_input_indexes によって指定されていない要素は破棄されます。

 

See also
backward_accumulate() は、勾配の累算と融合した逆方向の演算の実装を行えるようにする代わりとなるインタフェースを提供します。
backward_accumulate(target_input_indexes, grad_outputs, grad_inputs)[source]

指定された入力の勾配を計算し、累積する。

 

このメソッドは複数のFunctionが同じVariableに適用される場合に、逆方向の計算と勾配積算を融合する方法を提供しています。

ユーザはこのメソッドもしくはbackward()をオーバライドしなければなりません。 backward() を実装するほうがシンプルになる場合が多いですし、効率的な勾配累算を提供する必要なければ、この方法が推奨されます。

 

Parameters:
  • target_input_indexes (tuple of int) – 勾配が要求される入力Variableのインデクスすくなくとも、1つの要素を含むタプルであることが保証されています。
  • grad_outputs (tuple of Variable) – 出力Variableの勾配。出力Variableが与えられていない場合、対応する要素はNoneになります。
  • grad_inputs (tuple of Variable) – target_input_indexesで指定された入力Variableの勾配。この値は他の計算パスによって計算されたものですこのVariableの勾配が存在しない場合、対応する要素はNoneになります。下記のNoteもお読みください。
Returns:

指定した入力Variableの勾配を表すタプル backward()とは異なり、タプルの長さはtarget_input_indicesと同じでなければなりません。

Note
When the same variable is passed to the multiple input arguments of a function,同じVariableがFunctionの複数の入力引数を通る時、この入力引数に対応する最初の位置のgrad_inputsだけが 入力Variableに対応する勾配変数を含んでいるかもしれません。他の要素は Noneがセットされます。これは、このような場合の、正確な勾配関さんの複雑化を回避するための実装詳細規定です。この動作は将来のバージョンで変更されるかもしれません。
check_type_forward(in_types)[source]

順伝播の前に入力データの型をチェックする。

 

このメソッドは forward() の前に呼び出され、 the type checking utilitiesを用いて入力Variableの型を検証します。

Parameters: in_types (TypeInfoTuple) – The type information of input variables for forward().

 

delete_hook(name)[source]

関数フックの登録を解除します。

 

Parameters: name (str) – 登録削除する関数フックの名称

 

forward(inputs)[source]

入力配列から出力配列を計算します。

 

デフォルトで、forward_cpu() か forward_gpu() へ処理を委譲します。この関数がどちらのメソッドを選択するかは、入力配列の型によって決定されます。 FunctionNode の実装はかならずCPU/GPU methods か、このメソッドを実装しなければなりません。

Parameters: inputs – 入力配列のタプル
Returns: 出力配列のタプル
Warning
FunctionNode の実装は、戻り値が1つの配列である場合でもタプルでなければいけないことに気をつけてください。
forward_cpu(inputs)[source]

入力NumPy配列から出力配列を計算する。

 

Parameters: inputs – 入力 numpy.ndarray オブジェクトのタプル。
Returns: 出力配列のタプル。各エレメントは NumPy 配列か、CuPy配列であることが可能。
Warning
FunctionNode の実装は、戻り値が1つの配列である場合でもタプルでなければいけないことに気をつけてください。
forward_gpu(inputs)[source]

入力CuPy 配列から出力配列を計算する。

 

Parameters: inputs –入力 cupy.ndarrayオブジェクトのタプル。
Returns: 出力配列のタプル。各エレメントは NumPy 配列か、CuPy配列であることが可能。
Warning
FunctionNode の実装は、戻り値が1つの配列である場合でもタプルでなければいけないことに気をつけてください。
get_retained_inputs()[source]

保持された入力Variableのタプルを返す。

 

このメソッドは forward()で保持された入力Variableを取得するのに用いられる。

Returns: 保持された入力Variableのタプル

 

get_retained_outputs()[source]

保持された出力Variableのタプルを返す。

 

このメソッドは forward()で保持された出力Variableを取得するのに用いられる。

Returns: 保時された入力Variableのタプル
Note
このメソッドは、このメソッドが呼ばれる前に出力ノードがガベッジコレクションされる場合をサポートするためにトリッキーなことをしています。この場合、このメソッドはFunctionNodeの出力ノードとして動作する新たなVariableを生成します。
retain_inputs(indexes)[source]

指定した入力Variableノードにデータ配列を保持させる。

 

このメソッドを forward()から呼び出すことによって、この関数ノードは逆伝播に要求される入力を指定することができます。 この保存している配列を持つ入力Variableは、 get_retained_inputs() によって backward()から取得することが可能です。

 Functionと異なり、FunctionNodeはデフォルトでは入力配列を保持しません 。入力配列の一部、もしくは全てを保持したい場合、このメソッドを呼び出すことを忘れないでください。

 

このメソッドはforwardメソッドの外側から呼び出してはいけないことを留意してください。

Parameters: indexes (iterable of int) –関数が逆伝播に要求しない入力Variableのインデックス
retain_outputs(indexes)[source]

指定した出力Variableノードにデータ配列を保持させる。

 

このメソッドを forward()から呼び出すことによって、この関数ノードは逆伝播に要求される出力を指定することができます。このメソッドが呼び出されない場合、どの出力Variableも apply()から戻るポイントのデータ配列を保持するためマークされません。保持した配列を持つ出力Variableはget_retained_outputs() によって backward()から種痘することができます。

 

Note
Functionが出力配列の一部もしくは全部を逆伝播で要求するとき、このメソッドを使用することを推奨します。Functionは出力配列を自身への直接の参照を保持するだけで使用することが可能ですが、あとから出力VariableへこのFunctionを適用する際のパフォーマンスに影響するかもしれません。

 

このメソッドはforwardメソッドの外側から呼び出してはいけないことを留意してください。

Parameters: indexes (iterable of int) –この関数が逆伝播のために要求しない入力Variableのインデクス 
unchain()[source]

入力/出力ノードとこのFunctionNode自信をグラフから消去する。

 

Attributes

inputs = None
label

この関数を表す短いテキスト。(ラベル)

 

デフォルト実装は型の名称を返します。情報を与えるために(わかりやすくなるように)各functionをオーバーライドすべきです。

local_function_hooks

登録された関数フックのディクショナリを整える。

 

chainer.thread_local.function_hooksと違い その要素を全てのFunctionに登録します。プロパティの関数フックはこの関数に特化されています。

 

詳細は FunctionNode.local_function_hooks をお読みください。

output_data

.保持された出力配列のタプル。

 

このプロパティは主に Functionによって用いられます。ユーザは基本的にこのプロパティを使用する必要はありません。かわりに  get_retained_outputs() をお使いください。.

outputs = None
rank = 0
stack = None