簡単な深層学習 - PyTorch での自動微分

目次

ディープラーニングとは何ですか? どのように機能するのでしょうか?

勾配降下法とは何ですか? 勾配降下法はどのようにして最適解を計算するのでしょうか?

デリバティブとは何ですか? 深層学習における導出の重要性は何ですか?

PyTorch自動微分(自動微分


深層学習の中核となるデータ構造であるテンソルを紹介するのではなく、この章を最初の章として選んだのはなぜですか? その理由は、テンソル演算は実際には行列演算であるためです。また、PyTorch にはテンソルに関するデータ処理関数が多数用意されており、いちいち導入する必要はなく、使用するときはドキュメントを確認するだけで十分です。テンソル計算方法を導入しすぎます。

ディープラーニングを始めるにあたって、初心者が一番気になるのはディープラーニングではないでしょうか?代数式をたくさん並べて、さまざまなデータ計算を行うのではなく、その基本原理は何なのか。さて、読者は「tensor」が PyTorch の最も基本的なデータ構造であることだけを知っておく必要があります。それは配列です。より明確にしたい場合は、次のように記述できます。

PyTorch では、テンソル (Tensor) は最も基本的なデータ構造であり、NumPy の配列と同様に、さまざまなモデルやアルゴリズムを実装するための基礎となります。数値、ベクトル、行列、テンソルなどのさまざまなデータ形式を表すために使用でき、GPU コンピューティング アクセラレーションをサポートします。


テンソルは、スカラー (0 次元)、ベクトル (1 次元)、行列 (2 次元)、高次元テンソル (3 次元以上) など、さまざまな次元を持つことができます。ディメンションに加えて、各テンソルにはデータ型 (float、int、bool など) とデバイス タイプ (CPU または GPU) もあります。


それでは本題に戻ります 

ディープラーニングとは何ですか? どのように機能するのでしょうか?

ディープラーニングの原理は、コンピューターにデータから特徴を抽出し、それらの特徴を使用して問題を解決することを学習させることです。従来のコンピューター プログラムとは異なり、ディープ ラーニング モデルは特徴抽出方法を手動で設計する必要がなく、コンピューターが自動的に学習できるようにします。このプロセスは、人間が言語や楽器を学習するのと似ており、事前にすべての単語や音符を覚える必要はなく、文脈やメロディーから有用な情報を抽出し、ゆっくりと経験を積み、自分自身を向上させます。


具体的には、深層学習モデルはニューラル ネットワークで構成されており、各ニューロンは入力を受け取り、出力を生成します。これらの入力と出力は、特徴の異なる表現とみなすことができ、たとえば、画像データの場合、ピクセル値を入力として使用し、各ニューロンが対応する画像特徴を出力します。ニューラル ネットワークが有用な機能を自動的に学習できるようにするには、ニューラル ネットワークに大量のデータを提供し、バックプロパゲーション アルゴリズムを通じてパラメーターを継続的に調整させる必要があります。


逆伝播アルゴリズムの基本的な考え方は、導関数情報を使用して出力端からニューラル ネットワーク内の各パラメーターの寄与を逆推定し、この寄与に応じてパラメーターを調整して、予測結果を作成することです。モデルをより正確にします。このプロセスは、子供が絵を描くことを学ぶのと似ており、最初は醜い絵かもしれませんが、間違っている点を指摘されるたびに改善を続け、最終的には美しい絵を描くことができます。


一般に、深層学習の原理は、ニューラル ネットワークを通じてデータの特徴を自動的に学習し、バックプロパゲーション アルゴリズムを使用してモデル パラメーターを継続的に最適化し、モデルの予測結果がより正確になるようにすることです。

 より簡単に言うと、次のように説明できます。

ディープラーニングとは、データから特徴を抽出し、特徴の法則を見つけて結果を導き出すことです。この法則は関数であり、データは関数の独立変数、結果は関数の従属変数です。法則とは関数の重みと偏りであり、深層学習では大量のデータから関数の重みを求め、正しい結果を得ることが求められます。ただし、一般的なデータは非常に複雑で、結果に影響を与える独立変数も多数あるため、これらの関数は非常に複雑な関数群 (ニューラル ネットワーク) を形成します。簡単な例を挙げてください

機械が学習する関数が y = kx + b であるとします。 

このとき、k, b を求めるために必要なデータは (1, 5) (2, 7) の 2 つだけです。


したがって、関数式は y = 2x+3 として得られ、k と b を計算するプロセスを「学習」と呼びます。

このとき、見慣れない独立変数、例えば 3 を入力します。このとき、機械は 2 つのデータから「学習」して関数の式を取得しますので、機械は 3 を代入すると 9 という正しい結果を得ることができます。表現の中に。

しかし、そのような単純な関数モデルは実際の非常に複雑な問題には対応できません。では、マシンは非常に複雑な関数の k と b をどのように計算するのでしょうか?

バックプロパゲーション法は上で紹介しました。これは、結果の品質からモデルのパラメーターを修正し、結果を逆最適化することです。

深層学習の基礎となるアルゴリズムを以下に紹介します: 勾配降下法アルゴリズム

勾配降下法とは何ですか?また、勾配降下法では最適解をどのように計算しますか?

あなたが山に登っていて、頂上に到達したいと考えているとします。あなたの目標は山の頂上に着くことですが、どの方向に行けば一番早く山の頂上に着くことができるのかわかりません。自分の位置と山の形が記された地図が手元にあります。


このとき、勾配情報を使用して、山の頂上までの最速の方法を見つけることができます。勾配とは関数が最も早く変化する方向のことで、地図上で「坂」の方向のように高さが最も早く変化する場所と考えることができます。

勾配の方向に歩き続けると、どんどん山頂に近づいていきます。毎回実行されるステップのサイズは、学習率によって制御できます。学習率が大きいほど、実行されるステップは大きくなりますが、山の頂上を「越え」て最適な解を逃す可能性があります。学習率が小さいほど、実行されるステップは大きくなります。 、実行するステップは小さくなりますが、最適なソリューションに到達するには、より多くのステップが必要になります。


深層学習における私たちの目標は、損失関数を最小化し、最適なソリューションを見つけることです。勾配降下法は、一般的に使用される最適化アルゴリズムであり、パラメータに対する損失関数の勾配を継続的に計算することにより、勾配の方向にパラメータが調整され、損失関数が継続的に減少し、最終的に最適解が得られます。見つかった。

次に、読者は別の疑問を持つかもしれません。コンピュータはどのようにして谷の高さの最も速い変化の方向を見つけ、その方向に沿って答えを見つけるのでしょうか?

答えはデリバティブです。導関数は特定の点での関数の変化率を表すことは誰もが知っているため、導関数は次の値を見つけるのに役立ちます。

最速の方向

デリバティブとは何ですか? 深層学習における導出の重要性は何ですか?

導関数は、特定の点における関数の変化率または傾きを表す微積分の概念です。機械学習と深層学習では、導関数 (より一般的には、勾配 (谷の斜面の高さとして理解できます)) が重要な役割を果たします。


まず、導関数は関数の極値点 (最大または最小) を見つけるのに役立ちます。深層学習では、通常、損失関数 (各ステップ、行くべき道である山の頂上までの最適な直線距離からの偏差。関数内の損失として定義されます) を使用してモデルの測定を行います。予測と現実の値間の誤差、私たちの目標は、この損失関数を最小限に抑えることです。モデルパラメータに関して損失関数の導関数を計算することで、損失関数を最小化するパラメータ値を見つけることができ、それによってモデルを最適化します。


第二に、導関数は、関数の単調性や凸性など、関数の変化する法則を理解するのに役立ちます。深層学習では通常、モデルパラメータによる損失関数の変化傾向を観察することで、モデルの学習状況や性能を判断します。

このような複雑な関数モデルの場合、手動で導出するのは明らかに大変な作業です。次に、上記の理解に基づいて、このセクションの知識ポイントである自動微分を紹介します。

最後に、自動微分 (または自動導出) はディープ ラーニングにおける非常に重要なテクノロジの 1 つであり、複雑なモデルの導関数を自動的に計算するのに役立ち、モデルの最適化が容易になります。 

PyTorch 深層学習フレームワークは自動微分機能を提供しており、モデル開発プロセスにおける計算難易度や計算量を大幅に簡素化できます。

PyTorch自動微分(自動導出)

PyTorch における自動微分 (自動導出) は主にtorch.autogradモジュールを通じて実現されます。その中で最もよく使われる関数はtorch.Tensor.backward()で、テンソルの勾配 (勾配は微分値です) を自動的に計算し、結果をgrad属性に格納できます。テンソルの導関数を計算する前に、テンソルを導出可能に設定する必要があります ( requires_grad=True)。

簡単な例を挙げると、関数 y = 2x^2 + 3x + 1 があるとします。その自動微分は次のコードで実現できます。

import torch

x = torch.tensor(2.0, requires_grad=True) # 定义张量x,并开启梯度追踪
y = 2 * x**2 + 3 * x + 1

y.backward() # 自动计算y对x的梯度

print(x.grad) # 输出梯度

出力結果は11です。以下を手動で検証します。

y = 2x^2 + 3x + 1 の導関数は y = 4x +3 で、x=2 は次のように代入されます。

y = 4 * 2 + 3 = 11 

検証は正しいです。

別の例を示します

import torch

x = torch.tensor([[1.0,2.0],[3.0,4.0]],requires_grad = True)

y = torch.sum(x**2+2*x+1)
#sum函数:将x的每一个值带入表达式的值,然后求和
print(y) # 54 = 4 + 9 + 16 + 25
y.backward() # 求解y关于x的导数
print(x.grad)

次のように確認します。

 y = x^2+ 2*x +1 は y = 2x +2 として導出されます。

1、2、3、4を代入します

4、6、8、10

正しいことを確認してください

おすすめ

転載: blog.csdn.net/weixin_40582034/article/details/129425848