計算グラフの関数ノード。
FunctionNodeは計算グラフのノードを表しているクラスです。このノードは入力値に微分可能な関数を適用することに相当します。
微分可能な関数が Variable オブジェクトに適用される時、FunctionNode実装のインスタンスを生成し、その apply() メソッドを呼び出します。この apply() メソッドは基本的に下記の3つのことを行います。
出力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()を呼び出すことでアクセスが可能です。
Chainerにおいて、この新スタイルの微分可能関数は計算グラフの関数ノードを定義する標準的な方法であることに留意してください。そのため、旧スタイルの微分可能な関数は新スタイルの微分可能な関数のラッパーとして実装されています。
Variables: |
---|
version 3.0.0.の新機能
Methods
関数フックを登録する。
Parameters: |
|
---|
出力Variableを計算し、計算グラフを増大させる。
基本的な動作は FunctionNodeのドキュメントに記載されています。(*訳注:このページの上部)
Parameters: | inputs – 入力Variableのタプル。各要素は、 Variable、numpy.ndarray、 cupy.ndarrayのいずれかの可能性があります。要素がndarrayだった場合は、自動的にVariableでラップされます。 |
---|---|
Returns: | 出力Variable オブジェクトのタプル |
出力勾配が与えられた指定した入力について、勾配を計算する
このメソッドは、このFunctionNodeの順方向への計算に相応するバックプロパゲーションの計算の1ステップに用いられます。出力Variableについて勾配が与えられ、このメソッドは指定された入力Variableについて勾配を計算します。このメソッドではtarget_input_indicesによって指定された入力勾配を計算する必要はありません。
Function.backward(),とは異なり、勾配は Variable オブジェクトで与えられ、このメソッド自身が入力勾配をVariable オブジェクトとして返さなければなりません。これは、FunctionNodeが入力勾配を全計算履歴とともに返すことを可能にします。その場合、微分可能なバックプロパゲーションもしくは高次微分をサポートします。
デフォルト実装はNoneを返します。これは、この関数が微分不可能だという意味です。
Parameters: |
|
---|---|
Returns: |
指定した入力Variableの勾配を表すVariableのタプル。タプルの長さは len(target_input_indexes) や入力の長さと同じ値をとり得る。後者の場合、target_input_indexes によって指定されていない要素は破棄されます。 |
指定された入力の勾配を計算し、累積する。
このメソッドは複数のFunctionが同じVariableに適用される場合に、逆方向の計算と勾配積算を融合する方法を提供しています。
ユーザはこのメソッドもしくはbackward()をオーバライドしなければなりません。 backward() を実装するほうがシンプルになる場合が多いですし、効率的な勾配累算を提供する必要なければ、この方法が推奨されます。
Parameters: |
|
---|---|
Returns: |
指定した入力Variableの勾配を表すタプル backward()とは異なり、タプルの長さはtarget_input_indicesと同じでなければなりません。 |
順伝播の前に入力データの型をチェックする。
このメソッドは forward() の前に呼び出され、 the type checking utilitiesを用いて入力Variableの型を検証します。
Parameters: | in_types (TypeInfoTuple) – The type information of input variables for forward(). |
---|
入力配列から出力配列を計算します。
デフォルトで、forward_cpu() か forward_gpu() へ処理を委譲します。この関数がどちらのメソッドを選択するかは、入力配列の型によって決定されます。 FunctionNode の実装はかならずCPU/GPU methods か、このメソッドを実装しなければなりません。
Parameters: | inputs – 入力配列のタプル |
---|---|
Returns: | 出力配列のタプル |
入力NumPy配列から出力配列を計算する。
Parameters: | inputs – 入力 numpy.ndarray オブジェクトのタプル。 |
---|---|
Returns: | 出力配列のタプル。各エレメントは NumPy 配列か、CuPy配列であることが可能。 |
入力CuPy 配列から出力配列を計算する。
Parameters: | inputs –入力 cupy.ndarrayオブジェクトのタプル。 |
---|---|
Returns: | 出力配列のタプル。各エレメントは NumPy 配列か、CuPy配列であることが可能。 |
保持された入力Variableのタプルを返す。
このメソッドは forward()で保持された入力Variableを取得するのに用いられる。
Returns: | 保持された入力Variableのタプル |
---|
保持された出力Variableのタプルを返す。
このメソッドは forward()で保持された出力Variableを取得するのに用いられる。
Returns: | 保時された入力Variableのタプル |
---|
指定した入力Variableノードにデータ配列を保持させる。
このメソッドを forward()から呼び出すことによって、この関数ノードは逆伝播に要求される入力を指定することができます。 この保存している配列を持つ入力Variableは、 get_retained_inputs() によって backward()から取得することが可能です。
Functionと異なり、FunctionNodeはデフォルトでは入力配列を保持しません 。入力配列の一部、もしくは全てを保持したい場合、このメソッドを呼び出すことを忘れないでください。
このメソッドはforwardメソッドの外側から呼び出してはいけないことを留意してください。
Parameters: | indexes (iterable of int) –関数が逆伝播に要求しない入力Variableのインデックス |
---|
指定した出力Variableノードにデータ配列を保持させる。
このメソッドを forward()から呼び出すことによって、この関数ノードは逆伝播に要求される出力を指定することができます。このメソッドが呼び出されない場合、どの出力Variableも apply()から戻るポイントのデータ配列を保持するためマークされません。保持した配列を持つ出力Variableはget_retained_outputs() によって backward()から種痘することができます。
このメソッドはforwardメソッドの外側から呼び出してはいけないことを留意してください。
Parameters: | indexes (iterable of int) –この関数が逆伝播のために要求しない入力Variableのインデクス |
---|
入力/出力ノードとこのFunctionNode自信をグラフから消去する。
Attributes
この関数を表す短いテキスト。(ラベル)
デフォルト実装は型の名称を返します。情報を与えるために(わかりやすくなるように)各functionをオーバーライドすべきです。
登録された関数フックのディクショナリを整える。
chainer.thread_local.function_hooksと違い その要素を全てのFunctionに登録します。プロパティの関数フックはこの関数に特化されています。
詳細は FunctionNode.local_function_hooks
をお読みください。
.保持された出力配列のタプル。
このプロパティは主に Functionによって用いられます。ユーザは基本的にこのプロパティを使用する必要はありません。かわりに get_retained_outputs() をお使いください。.