メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

accelerate

(非推奨) ニューラル ネットワークに基づく近似器オブジェクトの勾配計算を高速化するオプション

R2022a 以降

    accelerate は推奨されません。代わりに、損失関数で dlaccelerate を使用してください。詳細については、accelerate は非推奨を参照してください。

    説明

    newAppx = accelerate(oldAppx,useAcceleration) は、元のオブジェクト oldAppx と同じ構成をもち、勾配計算を高速化するオプションが logical 値 useAcceleration に設定された、新しいニューラルネットワークベースの関数近似器オブジェクト newAppx を返します。

    すべて折りたたむ

    観測仕様およびアクション仕様オブジェクトを作成します (または、getObservationInfo および getActionInfo を使用して、環境から仕様オブジェクトを抽出します)。この例では、2 つのチャネルをもつ観測空間を定義します。最初のチャネルは、連続した 4 次元空間からの観測値を搬送します。2 番目は、0 または 1 のいずれかになる離散スカラー観測値を搬送します。最後に、行動空間は連続行動空間内の 3 次元ベクトルです。

    obsInfo = [rlNumericSpec([4 1]) 
               rlFiniteSetSpec([0 1])];
    
    actInfo =  rlNumericSpec([3 1]);

    クリティック内で Q 値関数を近似するには、再帰型深層ニューラル ネットワークを作成します。出力層は、観測値に基づいてアクションを実行する値を表すスカラーでなければなりません。

    各ネットワーク パスを layer オブジェクトの配列として定義します。環境仕様オブジェクトから観測空間と行動空間の次元を取得し、入力層の名前を指定して、後で適切な環境チャネルに明示的に関連付けることができるようにします。ネットワークは再帰型であるため、入力層として sequenceInputLayer を使用し、他のネットワーク層の 1 つとして lstmLayer を含めます。

    % Define paths
    inPath1 = [ 
        sequenceInputLayer( ...
            prod(obsInfo(1).Dimension), ...
            Name="netObsIn1")
        fullyConnectedLayer(5,Name="infc1")
        ];
    
    inPath2 = [ 
        sequenceInputLayer( ...
            prod(obsInfo(2).Dimension), ...
            Name="netObsIn2")
        fullyConnectedLayer(5,Name="infc2")
        ];
    
    inPath3 = [
        sequenceInputLayer( ...
            prod(actInfo(1).Dimension), ...
            Name="netActIn")
         fullyConnectedLayer(5,Name="infc3") 
         ];
    
    % Concatenate 3 previous layer outputs along dim 1
    jointPath = [ 
        concatenationLayer(1,3,Name="cct")
        tanhLayer
        lstmLayer(8,"OutputMode","sequence")
        fullyConnectedLayer(1,Name="jntfc") 
        ];

    dlnetwork オブジェクトを組み立てます。

    net = dlnetwork;
    net = addLayers(net,inPath1);
    net = addLayers(net,inPath2);
    net = addLayers(net,inPath3);
    net = addLayers(net,jointPath);

    層を接続します。

    net = connectLayers(net,"infc1","cct/in1");
    net = connectLayers(net,"infc2","cct/in2");
    net = connectLayers(net,"infc3","cct/in3");

    ネットワークをプロットします。

    plot(net)

    ネットワークを初期化し、重みの数を表示します。

    net = initialize(net);
    summary(net)
       Initialized: true
    
       Number of learnables: 832
    
       Inputs:
          1   'netObsIn1'   Sequence input with 4 dimensions
          2   'netObsIn2'   Sequence input with 1 dimensions
          3   'netActIn'    Sequence input with 3 dimensions
    

    ネットワーク、観測仕様オブジェクト、およびアクション仕様オブジェクトを使用して、rlQValueFunction でクリティックを作成します。

    critic = rlQValueFunction(net, ...
                obsInfo, ...
                actInfo, ...
                ObservationInputNames=["netObsIn1","netObsIn2"], ...
                ActionInputNames="netActIn");

    現在の観測値の関数としてアクションの値を返すには、getValue または evaluate を使用します。

    val = evaluate(critic, ...
                    { rand(obsInfo(1).Dimension), ...
                      rand(obsInfo(2).Dimension), ...
                      rand(actInfo(1).Dimension) })
    val = 1×1 cell array
        {[0.0089]}
    
    

    evaluate を使用すると、結果は、観測値に基づいて入力内のアクションの値が格納された単一要素の cell 配列になります。

    val{1}
    ans = single
        0.0089
    

    ランダムな観測値が与えられた場合、入力に対する 3 つの出力の合計の勾配を計算します。

    gro = gradient(critic,"output-input", ...
                    { rand(obsInfo(1).Dimension) , ...
                      rand(obsInfo(2).Dimension) , ...
                      rand(actInfo(1).Dimension) } )
    gro=3×1 cell array
        {4×1 single}
        {[ -0.0945]}
        {3×1 single}
    
    

    結果は、入力チャネルの数と同じ数の要素をもつ cell 配列になります。各要素には、入力チャネルの各コンポーネントに関する出力の合計の微分が格納されます。2 番目のチャネルの要素に対する勾配を表示します。

    gro{2}
    ans = single
        -0.0945
    

    それぞれが 9 つの連続した観測値で構成される 5 つの独立したシーケンスに関する勾配を取得します。

    gro_batch = gradient(critic,"output-input", ...
                    { rand([obsInfo(1).Dimension 5 9]) , ...
                      rand([obsInfo(2).Dimension 5 9]) , ...
                      rand([actInfo(1).Dimension 5 9]) } )
    gro_batch=3×1 cell array
        {4×1×5×9 single}
        {1×1×5×9 single}
        {3×1×5×9 single}
    
    

    4 番目の独立したバッチ内の 7 番目の連続観測値の後にある、最初の入力チャネルの 3 番目の観測要素に対する出力の合計の微分を表示します。

    gro_batch{1}(3,1,4,7)
    ans = single
        0.0693
    

    勾配計算を高速化するためのオプションを設定します。

    critic = accelerate(critic,true);

    ランダムな観測値が与えられた場合、パラメーターに対する出力の合計の勾配を計算します。

    grp = gradient(critic,"output-parameters", ...
                    { rand(obsInfo(1).Dimension) , ...
                      rand(obsInfo(2).Dimension) , ...
                      rand(actInfo(1).Dimension) } )
    grp=11×1 cell array
        { 5×4  single                                                   }
        { 5×1  single                                                   }
        { 5×1  single                                                   }
        { 5×1  single                                                   }
        { 5×3  single                                                   }
        { 5×1  single                                                   }
        {32×15 single                                                   }
        {32×8  single                                                   }
        {32×1  single                                                   }
        {[-0.0140 -0.0424 -0.0676 -0.0266 -0.0166 -0.0915 0.0405 0.0315]}
        {[                                                            1]}
    
    

    cell 内の各配列には、パラメーターのグループに関する出力の合計の勾配が格納されます。

    grp_batch = gradient(critic,"output-parameters", ...
                    { rand([obsInfo(1).Dimension 5 9]) , ...
                      rand([obsInfo(2).Dimension 5 9]) , ...
                      rand([actInfo(1).Dimension 5 9]) } )
    grp_batch=11×1 cell array
        { 5×4  single                                                     }
        { 5×1  single                                                     }
        { 5×1  single                                                     }
        { 5×1  single                                                     }
        { 5×3  single                                                     }
        { 5×1  single                                                     }
        {32×15 single                                                     }
        {32×8  single                                                     }
        {32×1  single                                                     }
        {[-2.0333 -10.3220 -10.6084 -1.2850 -4.4681 -8.0848 9.0716 3.0989]}
        {[                                                             45]}
    
    

    入力のバッチを使用する場合、gradient は入力シーケンス全体 (この場合は 9 つのステップ) を使用し、独立したバッチ次元 (この場合は 5 つ) に関するすべての勾配が合計されます。したがって、返される勾配のサイズは常にgetLearnableParametersからの出力と同じになります。

    観測仕様およびアクション仕様オブジェクトを作成します (または、getObservationInfo および getActionInfo を使用して、環境から仕様オブジェクトを抽出します)。この例では、2 つのチャネルをもつ観測空間を定義します。最初のチャネルは、連続した 4 次元空間からの観測値を搬送します。2 番目は、0 または 1 のいずれかになる離散スカラー観測値を搬送します。最後に、行動空間は -10、または 1 になるスカラーで構成されます。

    obsInfo = [rlNumericSpec([4 1]) 
               rlFiniteSetSpec([0 1])];
    
    actInfo =  rlFiniteSetSpec([-1 0 1]);

    アクター内の近似モデルとして使用する深層ニューラル ネットワークを作成します。出力層には 3 つの要素が必要であり、各要素は観測値に基づいて対応するアクションを実行する値を表します。再帰型ニューラル ネットワークを作成するには、入力層として sequenceInputLayer を使用し、他のネットワーク層の 1 つとして lstmLayer を含めます。

    % Define paths
    inPath1 = [ 
        sequenceInputLayer(prod(obsInfo(1).Dimension))
        fullyConnectedLayer(prod(actInfo.Dimension),Name="fc1") 
        ];
    
    inPath2 = [ 
        sequenceInputLayer(prod(obsInfo(2).Dimension))
        fullyConnectedLayer(prod(actInfo.Dimension),Name="fc2") 
        ];
    
    % Concatenate previous paths outputs along first dimension
    jointPath = [ 
        concatenationLayer(1,2,Name="cct")
        tanhLayer
        lstmLayer(8,OutputMode="sequence")
        fullyConnectedLayer( ...
            prod(numel(actInfo.Elements)), ...
            Name="jntfc")
            ];
    
    % Assemble dlnetwork object
    net = dlnetwork;
    net = addLayers(net,inPath1);
    net = addLayers(net,inPath2);
    net = addLayers(net,jointPath);
    
    % Connect layers
    net = connectLayers(net,"fc1","cct/in1");
    net = connectLayers(net,"fc2","cct/in2");
    
    % Plot network
    plot(net)

    Figure contains an axes object. The axes object contains an object of type graphplot.

    % initialize network and display the number of weights.
    net = initialize(net);
    summary(net)
       Initialized: true
    
       Number of learnables: 386
    
       Inputs:
          1   'sequenceinput'     Sequence input with 4 dimensions
          2   'sequenceinput_1'   Sequence input with 1 dimensions
    

    出力層の各要素は、可能なアクションの 1 つを実行する確率を表す必要があるため、明示的に指定しなかった場合、ソフトウェアによって最終出力層として softmaxLayer が自動的に追加されます。

    ネットワーク、観測仕様オブジェクト、およびアクション仕様オブジェクトを使用して、rlDiscreteCategoricalActor でアクターを作成します。ネットワークに複数の入力層がある場合、それらは obsInfo の次元仕様に従って環境観測チャネルに自動的に関連付けられます。

    actor = rlDiscreteCategoricalActor(net, obsInfo, actInfo);

    それぞれの可能なアクションの確率のベクトルを返すには、evaluate を使用します。

    [prob,state] = evaluate(actor, ...
                    { rand(obsInfo(1).Dimension) , ...
                      rand(obsInfo(2).Dimension) });
    prob{1}
    ans = 3x1 single column vector
    
        0.3403
        0.3114
        0.3483
    
    

    分布からサンプリングされたアクションを返すには、getAction を使用します。

    act = getAction(actor, ...
                    { rand(obsInfo(1).Dimension) , ...
                      rand(obsInfo(2).Dimension) });
    act{1}
    ans = 1
    

    勾配計算を高速化するためのオプションを設定します。

    actor = accelerate(actor,true);

    cell 内の各配列には、パラメーターのグループに関する出力の合計の勾配が格納されます。

    grp_batch = gradient(actor,"output-parameters", ...
                            { rand([obsInfo(1).Dimension 5 9]) , ...
                              rand([obsInfo(2).Dimension 5 9])} )
    grp_batch=9×1 cell array
        {[-3.1996e-09 -4.5687e-09 -4.4820e-09 -4.6439e-09]}
        {[                                    -1.1544e-08]}
        {[                                    -1.1321e-08]}
        {[                                    -2.8436e-08]}
        {32x2 single                                      }
        {32x8 single                                      }
        {32x1 single                                      }
        { 3x8 single                                      }
        { 3x1 single                                      }
    
    

    入力のバッチを使用する場合、gradient は入力シーケンス全体 (この場合は 9 つのステップ) を使用し、独立したバッチ次元 (この場合は 5 つ) に関するすべての勾配が合計されます。したがって、返される勾配のサイズは常にgetLearnableParametersからの出力と同じになります。

    入力引数

    すべて折りたたむ

    関数近似器オブジェクト。次のいずれかとして指定します。

    勾配計算に高速化を使用するオプション。logical 値として指定します。useAccelerationtrue の場合、自動微分計算グラフに必要な一部の入力が最適化され、キャッシュされることにより、勾配計算が高速化されます。詳細については、Deep Learning Function Acceleration for Custom Training Loopsを参照してください。

    出力引数

    すべて折りたたむ

    新しいアクターまたはクリティック。近似器オブジェクトとして返されます。oldAppx と同じ型をもちますが、勾配高速化オプションは useAcceleration に設定されます。

    バージョン履歴

    R2022a で導入

    すべて展開する