Educode -- Python で一般的に使用される損失関数の実装

パス 1: 一般的な損失関数の順伝播を実装する

ミッションの詳細

このレベルのタスク: 一般的な損失関数の順伝播を実装します。

関連情報

このタスクを完了するには、以下を習得する必要があります。 一般的な損失関数の定義。

この研修の内容については、書籍『ディープラーニング入門 Pythonによる理論と実装』の4.1〜4.2章を参照してください。

ニューラルネットワークトレーニング

1990 年代に登場したテクノロジーであるニューラル ネットワークが、2012 年以降に突然再び人々の視野に入り、コンピューター ビジョンや自然言語処理などの分野で前例のない優位性を示したのはなぜでしょうか。その答えには 2 つの要素が含まれます。1 つはディープ ラーニングを強力にサポートするコンピューター ハードウェアの急速な発展であり、2 つ目はデータです。クラウド コンピューティングやその他のテクノロジーの急速な発展により、インターネットはディープ ラーニングに大量のデータを提供します。 。データはディープ ラーニングの生命線であり、ディープ ラーニングはデータによって駆動され、データの品質もニューラル ネットワーク モデルのパフォーマンスを決定する最も重要な要素であると言えます。

では、データを使って、問題を解決できるモデルを取得するにはどうすればよいでしょうか? このプロセスはモデルのトレーニングです。トレーニングの目的は、データ内に存在するパターンをモデルに認識させることです。このパターンは、データの背後にある隠れた共通の特徴として理解できます。モデルをトレーニングするときは、モデルの出力が望む結果に近づくように目標を設定する必要があります。損失関数は、モデルの出力が望ましい結果にどの程度近づいているかを測定するために使用されます。さまざまな種類のタスクでは、さまざまな損失関数が使用されます。以下に、一般的に使用される損失関数を紹介します。

一般的な損失関数の定義

1. クロスエントロピー

分類タスクでは、ネットワークは通常、入力サンプルが各クラスに属する確率を予測します。私たちの目標は、最も高い確率で正しいクラスを期待することです。これが最尤確率の考え方です。この考えに基づいて、クロスエントロピー損失関数を取得できます。その関数式は次のとおりです。

E=−∑i=1C qi log(pi)

ここで、qi はラベル カテゴリのワンホット エンコーディングです。サンプルが i 番目のカテゴリに属する​​場合、qi = 1、それ以外の場合は qi = 0、C はカテゴリの数を表します。pi は予測確率です。各カテゴリ、通常はsoftmaxの出力:

pi=exi/∑j=1Cexj

ここで、xi はネットワーク モデルの出力です。Softmax は、ネットワークの出力を、合計が 1 になるいくつかの正の実数に変換できます。より大きな xi はより大きな pi に対応するため、複数のカテゴリの確率とみなすことができます。

クロスエントロピーを実装する場合、バックプロパゲーション中の導出を簡単にするために、通常はソフトマックスと一緒に実装されます。つまり、モデルの出力に対して、最初にソフトマックスを 1 回実行してから、クロスエントロピー損失を計算します。このアプローチに対応するバックプロパゲーションの利点は、次のレベルで紹介されます。

2. 平均二乗誤差

回帰問題は分類問題よりも単純です。回帰問題では、ネットワーク モデルの出力をターゲットにできるだけ近づけることが目標です。この目標を達成するための最も簡単なアイデアは、平均二乗誤差 (平均二乗誤差) を使用することです。平均二乗誤差は回帰問題で一般的に使用される損失関数であり、その中心的な考え方は、モデルの予測結果とターゲットの差の二乗を最小化することです。その関数式は次のとおりです。

E=0.5∑i=1N (yi −ti )2

ここで、 yi はネットワーク モデルの出力、 ti は目的のターゲット、 N は出力の数です。

一般的な損失関数の順伝播の実装

クロスエントロピー損失関数の場合、トレーニングではソフトマックスとクロスエントロピーの複合実装であるクラスが事前定義されていますSoftmaxWithLossこのクラスの forward 関数を実装する必要がありますforward(x, t)forward(x, t)関数の入力はx次元が 2 numpy.ndarray、形状は (B,C) で、B はバッチ サイズ、C はカテゴリの数です。tバッチ内の各サンプルが属するカテゴリです。 (B,)intタイプの形状ですnumpy.ndarrayまず、x2 次元に沿ってソフトマックスを行う必要があります。このトレーニングでは、直接使用できるソフトマックス関数の実装が提供されています。その後、クロスエントロピー損失関数を実装する必要があります。最終出力は、バッチ内のすべてのサンプルの損失の平均です。

平均二乗誤差損失関数の場合、トレーニングではMeanSquaredErrorクラスが事前定義されています。このクラスの forward 関数を実装する必要がありますforward(y, t)forward()関数の入力はy次元が 2 で、numpy.ndarray形状は (B, N) で、B はバッチ サイズ、N は出力数です。tまた、 (B, N) の形状でもありnumpy.ndarray、期待される値を表します。各出力の値。平均二乗誤差損失関数を実装する必要があり、最終出力はバッチ内のすべてのサンプルの損失の合計です。

上記の 2 つの損失関数の場合、最後の損失値を に記録する必要がありますself.loss

プログラミング要件

プロンプトに従って、右側のエディターの Begin と End の間にコードを追加して、上記の損失関数を実現します。

試験指導

プラットフォームは作成したコードをテストします。テスト方法は次のとおりです: プラットフォームは入力x/yとターゲットをランダムに生成し、t実装コードに従ってSoftmaxWithLoss/クラスのインスタンスを作成しMeanSquaredError、このインスタンスを使用して順伝播計算を実行します。あなたの回答は標準的な回答と比較されます。浮動小数点数の計算では、解答と標準解答との誤差が 10−5 を超えない限り、エラーが発生する可能性があるためです。

入力例:

 
 
  1. # 对于SoftmaxWithLoss损失函数:
  2. x:
  3. [[-1 0 1]
  4. [-2 0 2]]
  5. t:
  6. [1, 2]
  7. # 输出loss
  8. 0.775
  9. # 对于MeanSquaredError损失函数:
  10. y:
  11. [[-1 0 1]
  12. [-2 0 2]]
  13. t:
  14. [[0 0 0]
  15. [0 0 0]]
  16. # 输出loss
  17. 5.0

上記の結果には丸め誤差がありますが、無視してかまいません。


ミッションを始めましょう。成功を祈っています!

コード:

numpyをnpとしてインポート


 

デフォルトソフトマックス(x):

    x = x - np.max(x, axis=1, keepdims=True)

    return np.exp(x) / np.sum(np.exp(x)、axis=1、keepdims=True)


 

クラス SoftmaxWithLoss:

    def __init__(自分自身):

        self.loss = なし

    def forward(self, x, t):

        あー」

        SoftMax + クロスエントロピーの順伝播

        パラメータ:

        - x: numpy.array、(B、C)

        - t: numpy.array、(B)

        戻る:

        - 損失: フロート

        「」

        ########## 始める ##########

        y = ソフトマックス(x)  

        バッチサイズ = y.shape[0]  

        # ログを計算するときに y が小さすぎるのを避けるために、1e-7 を追加して算術エラーを回避します  

        loss = -np.sum(np.log(y[np.arange(バッチサイズ), t] + 1e-7)) / バッチサイズ  

        self.loss = 損失  

        リターンロス  

        ########## 終わり ##########


 

クラス MeanSquaredError:

    def __init__(自分自身):

        self.loss = なし

    def forward(self, y, t):

        あー」

        平均二乗誤差の順伝播

        パラメータ:

        - y: numpy.array、(B、N)

        - t: numpy.array、(B、N)

        戻る:

        - 損失: フロート

        「」

        ########## 始める ##########

        損失 = 0.5 * np.sum((y - t) ** 2)  

        self.loss = 損失  

        リターンロス

        ########## 終わり ##########

コードのスクリーンショット:、

パス 2: 一般的な損失関数のバックプロパゲーションを実装する

ミッションの詳細

このレベルのタスク: 一般的な損失関数の逆伝播を実現します。

関連情報

このタスクを完了するには、以下を習得する必要があります。 一般的な損失関数の定義。

この研修の内容については、書籍『ディープラーニング入門 Pythonによる理論と実装』の4.1〜4.2章を参照してください。

勾配降下法

前のレベルの研究を通じて、損失関数の役割はモデルの出力と期待値の間のギャップを測定することであることがわかりました。次に、損失関数の値が小さいほど、より優れたパフォーマンスのモデルが得られる可能性が高くなります。では、損失関数の値が小さくなり続けるようにモデル内のパラメーターの値を変更するにはどうすればよいでしょうか? ここで、 gradientの概念を導入します勾配とは関数値が最も早く増加するパラメータ変化方向であり、一般的には関数値が最も早く減少するパラメータ変化方向の負の方向でもあります。各パラメーターの勾配 ∂l/∂w を見つけることができれば、すべてのパラメーターに負の勾配方向に沿って小さなステップを実行させ、新しいパラメーターのセットを取得できます。これが勾配降下法の基本的な考え方であり、この小さなステップの距離を学習率ηと呼びます。パラメータ更新のプロセスは次の式で表すことができます。

wi' =wi −η⋅∂wi ∂l

さて、問題は、各パラメータの勾配をどのように見つけることができるかということです。このプロセスは、ニューラル ネットワークの逆伝播(backprop) と呼ばれます。ニューラル ネットワークの場合、その積層構造のため、勾配を見つける問題は少し複雑になります。しかし、この積層構造により、このプロセスは積層順序に従って段階的に解決することもできます。バックプロパゲーションの核となる考え方は、導出の連鎖規則です。つまり、次のとおりです。

∂x∂l =∂f(x)∂l ⋅∂x∂f(x)

このように、ニューラルネットワークの勾配を求める処理は、各層の勾配を求める処理となる。この演習では、損失関数自体の逆伝播である上記の式の最初の項に焦点を当てます。

一般的な損失関数の逆伝播

1. クロスエントロピー

前のレベルでは、クロスエントロピー損失関数の関数式を次のように導入しました。

E=−∑i=1C ti log(yi )

ソフトマックスを組み合わせると、次のようになります。

yiE=∑j=1Cexiexi=−i=1∑Ctilog(yi)

上の式に対応する xi の勾配の計算は次のとおりです。

∂xi ∂l =yi −ti

t がワンホット エンコードされる場合、次のようにさらに単純化できます。

∂xk ∂l =yk −1

ここで、k は正しいカテゴリに対応する番号です。上記の式の導出プロセスは少し面倒なので、興味のある方はこの記事を参照してください。

2. 平均二乗誤差

クロスエントロピーと比較して、平均二乗誤差の逆伝播はより簡単です。平均二乗誤差に対する順伝播の公式を思い出してください。

E=0.5∑i=1N (yi −ti )2

逆伝播の式を直接書くことができます。

∂yi ∂l =yi −ti

ここで、 yi はネットワーク モデルの出力、 ti は目的のターゲット、 N は出力の数です。

一般的な損失関数の順伝播の実装

クロスエントロピー損失関数の場合、トレーニングは、ソフトマックスとクロスエントロピーの複合実装である前のパスで定義されたSoftmaxWithLossクラスを拡張します。トレーニングの実装が行われforward(x, t)、バックプロパゲーションのニーズを満たすように変更されました。このクラスのバックプロパゲーション関数を実装する必要がありますbackward()この関数は入力を必要としません。関数が呼び出されたときに記録された合計の値に従ってbackward()入力の勾配を計算しそれを戻り値として返す必要があります。forward(x, t)self.tself.yforward(x, t)xbackward()

平均二乗誤差損失関数の場合、トレーニングは、ソフトマックスとクロス エントロピーの複合実装である前のパスで定義されたMeanSquaredErrorクラスを拡張します。トレーニングの実装が行われforward(y, t)、バックプロパゲーションのニーズを満たすように変更されました。このクラスのバックプロパゲーション関数を実装する必要がありますbackward()この関数は入力を必要としません。関数が呼び出されたときに記録された合計の値に従ってbackward()入力の勾配を計算しそれを戻り値として返す必要があります。forward(y, t)self.tself.yforward(y, t)ybackward()

プログラミング要件

プロンプトに従って、右側のエディターの Begin と End の間にコードを追加して、上記の損失関数を実現します。

試験指導

プラットフォームは作成したコードをテストします。テスト方法は次のとおりです: プラットフォームは入力x/yとターゲットをランダムに生成し、t実装コードに従ってSoftmaxWithLoss/クラスのインスタンスを作成しMeanSquaredError、このインスタンスを使用して順伝播を実行します。バックプロパゲーション計算。あなたの回答は標準的な回答と比較されます。浮動小数点数の計算では、解答と標準解答との誤差が 10−5 を超えない限り、エラーが発生する可能性があるためです。

入力例:

 
 
  1. # 对于SoftmaxWithLoss损失函数:
  2. x:
  3. [[-1 0 1]
  4. [-2 0 2]]
  5. t:
  6. [1, 2]
  7. # x的梯度
  8. [[ 0.04501529 -0.37763578 0.33262047]
  9. [ 0.00793812 0.05865521 -0.06659332]]
  10. # 对于MeanSquaredError损失函数:
  11. y:
  12. [[-1 0 1]
  13. [-2 0 2]]
  14. t:
  15. [[0 0 0]
  16. [0 0 0]]
  17. # y的梯度
  18. [[-1 0 1]
  19. [-2 0 2]]

上記の結果には丸め誤差がありますが、無視してかまいません。


ミッションを始めましょう。成功を祈っています!

コード:

numpyをnpとしてインポート


 

デフォルトソフトマックス(x):

    x = x - np.max(x, axis=1, keepdims=True)

    return np.exp(x) / np.sum(np.exp(x)、axis=1、keepdims=True)


 

クラス SoftmaxWithLoss:

    def __init__(自分自身):

        self.loss = なし

        self.y = なし

        self.t = なし

    def forward(self, x, t):

        あー」

        SoftMax + クロスエントロピーの順伝播

        パラメータ:

        - x: numpy.array、(B、C)

        - t: numpy.array、(B)

        戻る:

        - 損失: フロート

        「」

        y = ソフトマックス(x)

        バッチサイズ = y.shape[0]

        loss = -np.sum(np.log(y[np.arange(バッチサイズ), t] + 1e-7)) / バッチサイズ

        self.loss = 損失

        self.y = y

        self.t = t

        リターンロス

    def 後方(自分自身):

        あー」

        SoftMax + クロスエントロピーの逆伝播

        戻る:

        - dx: numpy.array、(B、C)

        「」

        ########## 始める ##########

        バッチサイズ = self.t.shape[0]  

        dx = self.y.copy()  

        dx[np.arange(batch_size), self.t] -= 1  

        dx = dx / バッチサイズ  

        リターンDX  

        ########## 終わり ##########


 

クラス MeanSquaredError:

    def __init__(自分自身):

        self.loss = なし

        self.y = なし

        self.t = なし

    def forward(self, y, t):

        あー」

        平均二乗誤差の順伝播

        パラメータ:

        - y: numpy.array、(B、N)

        - t: numpy.array、(B、N)

        戻る:

        - 損失: フロート

        「」

        損失 = 0.5 * np.sum((y - t) ** 2)

        self.loss = 損失

        self.y = y

        self.t = t

        リターンロス

    def 後方(自分自身):

        あー」

        平均二乗誤差の逆伝播

        戻る:

        - dy: numpy.array、(B、N)

        「」

        ########## 始める ##########

        y_grad = self.y - self.t  

        y_gradを返す

        ########## 終わり ##########

コードのスクリーンショット:

 

 

おすすめ

転載: blog.csdn.net/qq_57409899/article/details/124341186