Main Content

huber

回帰タスクの Huber 損失

R2021a 以降

    説明

    Huber 演算は、回帰タスクのネットワーク予測とターゲット値の間の Huber 損失を計算します。'TransitionPoint' オプションが 1 の場合、これは "滑らかな L1 損失" とも呼ばれます。

    関数 huber は、dlarray データを使用して Huber 損失を計算します。dlarray オブジェクトを使用すると、次元にラベルを付けることができるため、高次元のデータをより簡単に扱うことができます。たとえば、"S""T""C""B" のラベルを使用して、各次元が空間、時間、チャネル、バッチのどの次元に対応するかを示すことができます。特に指定がないその他の次元については、ラベル "U" を使用します。特定の次元に対して演算を行うオブジェクト関数 dlarray の場合、dlarray オブジェクトの形式を直接整えるか、DataFormat オプションを使用することで、次元ラベルを指定できます。

    loss = huber(Y,targets) は、予測を含む形式を整えた dlarray オブジェクト Y と回帰タスクのターゲット値 targets との間の Huber 損失を返します。入力 Y は形式を整えた dlarray です。出力 loss は、形式を整えていない dlarray スカラーです。

    形式を整えていない入力データの場合は、'DataFormat' オプションを使用します。

    loss = huber(Y,targets,weights) は、計算された損失値に重みを適用します。計算された損失値に対し、入力のクラス、入力の観測値、または入力の領域の寄与を重み付けするには、この構文を使用します。

    Y が、形式を整えていない dlarray である場合、loss = huber(___,'DataFormat',FMT) は、次元形式 FMT も指定します。

    loss = huber(___,Name,Value) は、前の構文の入力引数に加えて、1 つ以上の名前と値のペアの引数を使用してオプションを指定します。たとえば、'NormalizationFactor','all-elements' は、縮小された損失を入力要素の数で除算して損失を正規化することを指定します。

    すべて折りたたむ

    10 個の応答に関する 12 個の観測値の予測から成る配列を作成します。

    numResponses = 10;
    numObservations = 12;
    
    Y = rand(numResponses,numObservations);
    dlY = dlarray(Y,'CB');

    予測のサイズと形式を表示します。

    size(dlY)
    ans = 1×2
    
        10    12
    
    
    dims(dlY)
    ans = 
    'CB'
    

    ランダムなターゲットの配列を作成します。

    targets = rand(numResponses,numObservations);

    ターゲットのサイズを表示します。

    size(targets)
    ans = 1×2
    
        10    12
    
    

    予測とターゲットとの間の Huber 損失を計算します。

    loss = huber(dlY,targets)
    loss = 
      1x1 dlarray
    
        0.7374
    
    

    10 個の応答に関するさまざまな長さの 12 個のシーケンスに対して、予測とターゲットから成る配列を作成します。

    numResponses = 10;
    numObservations = 12;
    maxSequenceLength = 15;
    
    sequenceLengths = randi(maxSequenceLength,[1 numObservations]);
    
    Y = cell(numObservations,1);
    targets = cell(numObservations,1);
    
    for i = 1:numObservations
        Y{i} = rand(numResponses,sequenceLengths(i));
        targets{i} = rand(numResponses,sequenceLengths(i));
    end

    予測とターゲットの cell 配列を表示します。

    Y
    Y=12×1 cell array
        {10x13 double}
        {10x14 double}
        {10x2  double}
        {10x14 double}
        {10x10 double}
        {10x2  double}
        {10x5  double}
        {10x9  double}
        {10x15 double}
        {10x15 double}
        {10x3  double}
        {10x15 double}
    
    
    targets
    targets=12×1 cell array
        {10x13 double}
        {10x14 double}
        {10x2  double}
        {10x14 double}
        {10x10 double}
        {10x2  double}
        {10x5  double}
        {10x9  double}
        {10x15 double}
        {10x15 double}
        {10x3  double}
        {10x15 double}
    
    

    関数 padsequences を使用して予測シーケンスとターゲット シーケンスを 2 次元でパディングし、対応するマスクも返します。

    [Y,mask] = padsequences(Y,2);
    targets = padsequences(targets,2);

    パディングされたシーケンスを 'CTB' 形式 (チャネル、時間、バッチ) の dlarray に変換します。形式を整えた dlarray オブジェクトは次元を自動的に並べ替えるため、ターゲットとマスクを同じ形式の、形式を整えた dlarray オブジェクトに変換することによって、ターゲットとマスクの次元の一貫性を保ちます。

    dlY = dlarray(Y,'CTB');
    targets = dlarray(targets,'CTB');
    mask = dlarray(mask,'CTB');

    予測スコア、ターゲット、およびマスクのサイズを表示します。

    size(dlY)
    ans = 1×3
    
        10    12    15
    
    
    size(targets)
    ans = 1×3
    
        10    12    15
    
    
    size(mask)
    ans = 1×3
    
        10    12    15
    
    

    予測とターゲットとの間の Huber 損失を計算します。パディングから計算された損失値が損失に寄与しないようにするために、関数 padsequences によって返されるマスクに 'Mask' オプションを設定します。

    loss = huber(dlY,targets,'Mask',mask)
    loss = 
      1x1 dlarray
    
        8.1834
    
    

    入力引数

    すべて折りたたむ

    予測。形式を整えた dlarray、形式を整えていない dlarray、または数値配列として指定します。Y が、形式を整えた dlarray でない場合、DataFormat オプションを使用して次元形式を指定しなければなりません。

    Y が数値配列の場合、targetsdlarray でなければなりません。

    ターゲット応答。形式を整えた (または形式を整えていない) dlarray、あるいは数値配列として指定します。

    targets の各次元のサイズは、Y の対応する次元のサイズと一致していなければなりません。

    targets が、形式を整えた dlarray の場合、その形式は Y の形式と同じでなければなりません。Y の形式を整えていない場合、その形式は DataFormat の形式と同じでなければなりません。

    targets が、形式を整えていない dlarray または数値配列の場合、関数は、Y の形式または DataFormat の値を targets に適用します。

    ヒント

    形式を整えた dlarray オブジェクトは、"S" (空間)、"C" (チャネル)、"B" (バッチ)、"T" (時間)、"U" (指定なし) の順序となるように、基となるデータの次元を自動的に並べ替えます。さらに、Y が、形式を整えた dlarray の場合、Ytargets の次元が必ず一致するように、形式を整えた dlarray として targets を指定します。

    重み。dlarray または数値配列として指定します。

    応答の重みを指定するには、サイズが Y'C' (チャネル) 次元と同じである 'C' (チャネル) 次元をもつベクトルを指定します。形式を整えた dlarray オブジェクトを使用するか、'WeightsFormat' オプションを使用して、応答の重みの 'C' (チャネル) 次元を指定します。

    観測値の重みを指定するには、サイズが Y'B' (バッチ) 次元と同じである 'B' (バッチ) 次元をもつベクトルを指定します。形式を整えた dlarray オブジェクトを使用するか、'WeightsFormat' オプションを使用して、クラス加重の 'B' (バッチ) 次元を指定します。

    入力の各要素の重みを個別に指定するには、Y と同じサイズの配列として重みを指定します。この場合、weights が、形式を整えていない dlarray オブジェクトであれば、この関数は Y と同じ形式を使用します。または、'WeightsFormat' オプションを使用して加重形式を指定します。

    名前と値の引数

    オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで、Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。

    R2021a より前では、コンマを使用して名前と値をそれぞれ区切り、Name を引用符で囲みます。

    例: 'NormalizationFactor','all-elements' は、縮小された損失を入力要素の数で除算して損失を正規化することを指定します。

    Huber 損失が二次関数から線形関数に遷移する点。'TransitionPoint' と正のスカラーで構成されるコンマ区切りのペアとして指定します。

    'TransitionPoint' が 1 の場合、これは "滑らかな L1 損失" とも呼ばれます。

    データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

    どの要素を損失の計算に含めるかを示すマスク。dlarray オブジェクト、logical 配列、または Y と同じサイズの数値配列として指定します。

    この関数は、入力データの要素を損失の計算に含めるかどうかを、マスク内の対応する値が 1 であるか 0 であるかによって決定します。

    Mask が、形式を整えた dlarray オブジェクトである場合、その形式は Y の形式と一致しなければなりません。Mask が、形式を整えていない dlarray オブジェクトである場合、この関数は Y と同じ形式を使用します。

    DataFormat オプションを指定した場合、この関数は指定された形式もマスクに使用します。

    Mask の各次元のサイズは、Y の対応する次元のサイズと一致していなければなりません。既定値は 1 から成る logical 配列です。

    ヒント

    形式を整えた dlarray オブジェクトは、"S" (空間)、"C" (チャネル)、"B" (バッチ)、"T" (時間)、"U" (指定なし) の順序となるように、基となるデータの次元を自動的に並べ替えます。たとえば、dlarray オブジェクトは、形式が "TSCSBS" であるデータの次元を "SSSCBT" という形式になるように自動的に並べ替えます。

    また、Y が、形式を整えた dlarray である場合、Y とマスクの次元が必ず一致するように、形式を整えた dlarray としてマスクを指定します。

    損失値の配列を縮小するモード。次のいずれかとして指定します。

    • "sum" — 損失値の配列に含まれるすべての要素を加算する。この場合、出力 loss はスカラーです。

    • "none" — 損失値の配列を縮小しない。この場合、出力 loss は、Y と同じサイズの、形式を整えていない dlarray オブジェクトです。

    Reduction"sum" であるときに、縮小された損失を正規化するための除数。次のいずれかとして指定します。

    • "batch-size"Y に含まれる観測値の数で損失を除算して正規化する。

    • "all-elements"Y に含まれる要素の数で損失を除算して正規化する。

    • "mask-included" — 観測値の数と、観測値ごとのマスクによって損失の計算に含めるように指定された要素の数との積で、損失の値を個別に除算し、損失を正規化する。このオプションを使用するには、Mask オプションを使用してマスクを指定しなければなりません。

    • "none" — 損失を正規化しない。

    データの次元の説明。文字ベクトルまたは string スカラーとして指定します。

    データ形式は文字列で、各文字は対応するデータ次元のタイプを表します。

    各文字は以下のとおりです。

    • "S" — 空間

    • "C" — チャネル

    • "B" — バッチ

    • "T" — 時間

    • "U" — 指定なし

    たとえば、シーケンスのバッチを含み、1 番目、2 番目、および 3 番目の次元がそれぞれチャネル、観測値、およびタイム ステップに対応する配列があるとします。この配列の形式を "CBT" (チャネル、バッチ、時間) として指定できます。

    "S" または "U" のラベルが付いた次元については、複数回指定できます。"C""B""T" のラベルについては、1 回のみ使用できます。ソフトウェアは、2 番目の次元の後ろにある大きさが 1 の "U" 次元を無視します。

    入力データが、形式を整えた dlarray オブジェクトでない場合は、DataFormat オプションを指定しなければなりません。

    詳細については、Deep Learning Data Formatsを参照してください。

    データ型: char | string

    重みの次元の説明。文字ベクトルまたは string スカラーとして指定します。

    データ形式は文字列で、各文字は対応するデータ次元のタイプを表します。

    各文字は以下のとおりです。

    • "S" — 空間

    • "C" — チャネル

    • "B" — バッチ

    • "T" — 時間

    • "U" — 指定なし

    たとえば、シーケンスのバッチを含み、1 番目、2 番目、および 3 番目の次元がそれぞれチャネル、観測値、およびタイム ステップに対応する配列があるとします。この配列の形式を "CBT" (チャネル、バッチ、時間) として指定できます。

    "S" または "U" のラベルが付いた次元については、複数回指定できます。"C""B""T" のラベルについては、1 回のみ使用できます。ソフトウェアは、2 番目の次元の後ろにある大きさが 1 の "U" 次元を無視します。

    weights が数値ベクトルで、Y に大きさが 1 でない次元が 2 つ以上含まれている場合は、WeightsFormat オプションを指定しなければなりません。

    weights がベクトルでない場合、または weightsY がベクトルである場合、WeightsFormat の既定値は Y の形式と同じです。

    詳細については、Deep Learning Data Formatsを参照してください。

    データ型: char | string

    出力引数

    すべて折りたたむ

    Huber 損失。形式を整えていない dlarray として返されます。出力 loss は、基となるデータ型が入力 Y のデータ型と同じ、形式を整えていない dlarray です。

    loss のサイズは、Reduction オプションによって異なります。

    アルゴリズム

    すべて折りたたむ

    Huber 損失

    入力の各要素 Yj について、関数 huber は次の式を使用して対応する要素ごとの損失値を計算します。

    lossj={12(YjTj)2if |YjTj|δδ|YjTj|12δ2otherwise,

    ここで、Tj は予測 Yj に対応するターゲット値であり、δ は、損失が二次関数から線形関数に遷移する遷移点です。

    遷移点が 1 の場合、これは "滑らかな L1 損失" とも呼ばれます。

    その後、この関数は、損失値をスカラーに縮小するため、次の式を使用して要素ごとの損失を縮小します。

    loss=1Njmjwjlossj,

    ここで、N は正規化係数、mj は要素 j のマスク値、wj は要素 j の重み値です。

    損失を縮小しないことを選択した場合、この関数は、次のように損失値に対してマスクと重みを直接適用します。

    lossj*=mjwjlossj

    深層学習配列の形式

    深層学習のほとんどのネットワークと関数は、入力データの各次元に対して異なる方法で演算を行います。

    たとえば、LSTM 演算は入力データの時間次元を反復処理し、バッチ正規化演算は入力データのバッチ次元を正規化します。

    ラベルが付いた次元をもつ入力データ、または追加のレイアウト情報をもつ入力データを指定するには、"データ形式" を使用します。

    データ形式は文字列で、各文字は対応するデータ次元のタイプを表します。

    各文字は以下のとおりです。

    • "S" — 空間

    • "C" — チャネル

    • "B" — バッチ

    • "T" — 時間

    • "U" — 指定なし

    たとえば、シーケンスのバッチを含み、1 番目、2 番目、および 3 番目の次元がそれぞれチャネル、観測値、およびタイム ステップに対応する配列があるとします。この配列の形式を "CBT" (チャネル、バッチ、時間) として指定できます。

    形式を整えた入力データを作成するには、dlarray オブジェクトを作成し、2 番目の引数を使用して形式を指定します。

    形式を整えていないデータを使用して追加のレイアウト情報を指定するには、引数 DataFormat および WeightsFormat を使用して形式を指定します。

    詳細については、Deep Learning Data Formatsを参照してください。

    拡張機能

    バージョン履歴

    R2021a で導入