実践的なディープラーニングノート(2)-線形ニューラルネットワーク

ディープニューラルネットワークについて学ぶ前に、ニューラルネットワークトレーニングの基本を理解する必要があります。含まれるもの:単純なニューラルネットワークアーキテクチャの定義、データ処理、損失関数の指定、およびモデルのトレーニング方法。学習を容易にするために、古典的なアルゴリズムである線形ニューラルネットワークから始めて、ニューラルネットワークの基本を学びます。

1.1線形回帰の基本要素

線形回帰は、いくつかの単純な仮定に基づいています。
まず、独立変数xと従属変数yの関係が線形であると仮定します。つまり、yはxの要素の加重和として表すことができ、通常はノイズが発生します。観測では、2番目に、ノイズが正規分布に従うなど、ノイズは比較的正常であると想定しています。
家のサイズ(平方メートル)と年齢(年)に基づいて住宅価格を推定するための非常に古典的なモデルを考えてみましょう。
まず、训练数据集(training data set) 或训练集(training set)実際の住宅価格、サイズ、年齢などを準備する必要があります。
予測しようとしている目標(家の価格の予測など)をと呼びます标签(label)或目标(target)予測の基礎となる独立変数(面積と年齢)はと呼ばれ特征(feature)或协变量(covariate)ます。

1.1.1線形モデル

最初の線形仮定によれば、予測目標(住宅価格)は、(面積と住宅年齢)の加重和として表すことができ、次のように数式で表すことができます。
ここに画像の説明を挿入

この式は、入力機能の1つと見なすことができます仿射变换(affine transformation)アフィン変換は、特徴の加重和线性变换(linear transformation)とバイアス項によって特徴付けられます平移(translation)

w面積とw年齢は、と呼ばれます权重(weight)重みは、予測値に対する各特徴の影響を決定します。
bはと呼ばれ偏置(bias)、偏移量(offset)或截距(intercept)ます。(切片として表現する方がおなじみかもしれません。)すべての特徴が0の場合、bは予測値を表すことができることがはっきりとわかります。実際には、面積が0または正確に0歳の家がない場合でも、オフセット期間が必要です。バイアス項がないと、モデルの表現力は制限されます

機械学習では、通常、高次元のデータセット
ここに画像の説明を挿入
を使用し、線形代数では多くの特徴入力が使用されます。ベクトルを使用してそれらを表す方が便利です。次の形式に簡略化されます。
ここに画像の説明を挿入
この数学モデルを表現すると、次のようになります。式に2つの模型参数(model parameters)wとbがあること。次のステップは、これら2つのパラメーターを決定することであり、他に2つの概念を導入します。

  • 损失函数:モデル品質の尺度
  • 随机梯度下降:モデルの予測の品質を向上させるためにモデルを更新できる方法。

1.1.2損失関数

損失関数は、ターゲットの実際の値と予測値の差を定量化します。
通常、損失として非負の数を選択します。値が小さいほど、損失は小さくなり、完全な予測の損失は0になります。
回帰問題で最も一般的に使用される損失関数は、二乗誤差関数です。サンプルiの予測値がy^(i)であり、対応する真のラベルがy(i)である場合、二乗誤差は次の式で定義できます。
ここに画像の説明を挿入

定数1/2は本質的な違いはありませんが、形式は少し単純です(損失関数の導関数をとると、定数係数は1であるため)。

線形モデルを使用したデータのフィッティング
推定値y^(i)と観測値y (i)の差が大きいほど、二次誤差関数の2次項による損失が大きくなります。データセット全体でモデルの品質を測定するには、トレーニングセットのn個のサンプルの損失の平均(合計にも相当)を計算する必要があります。
ここに画像の説明を挿入
モデルをトレーニングするときは、次のセットを見つけます。パラメータ(w ∗、b ∗)、このパラメータのセットは、すべてのトレーニングサンプルの総損失を最小限に抑えます。
ここに画像の説明を挿入

1.1.3確率的勾配降下法

梯度下降(gradient descent)、この方法は、ほぼすべての深層学習モデルを最適化できます。損失関数を減少させる方向にパラメータを継続的に更新することにより、エラーを低減します。
最急降下法の最も簡単な使用法は、モデルパラメーターに関する損失関数の導関数を計算することです。(ここではグラデーションとも呼ばれます)。
ただし、実際には、実行が非常に遅くなる可能性があります。すべてのパラメーターを更新する前に、データセット全体をトラバースする必要があります。したがって、通常、更新を計算する必要があるたびにサンプルの小さなバッチをランダムに選択します。このバリアントは小批量随机梯度下降(minibatch stochastic gradient descent)
アルゴリズムステップと呼ばれます:
(1)ランダム初期化などのモデルパラメーターの値を初期化します;
(2)ランダムにサンプルしますデータセットからの小さなバッチバッチサンプルは、ミニバッチのモデルパラメーターに関する平均損失の導関数(勾配とも呼ばれます)を計算します。最後に、勾配に所定の正の数ηを掛け、それを現在のパラメータ値から減算します。そして、このステップを繰り返し続けます。
ここに画像の説明を挿入

| B |は、各ミニバッチのサンプル数を表します。これは、とも呼ばれ批量大小(batch size)ます。nはを表し学习率(learning rate)ます。バッチサイズと学習率の値は、通常、モデルトレーニングではなく、手動で事前に指定されています。トレーニング中に調整できるが更新できないこれらのパラメータは、と呼ばれ超参数(hyperparameter)ます。
调参(hyperparameter tuning)ハイパーパラメータを選択するプロセスです。ハイパーパラメータは通常、独立した検証データセットで評価されるトレーニングの反復結果に基づいて調整されます。

たとえば、損失の2乗のwBの場合:
ここに画像の説明を挿入
線形回帰は、ドメイン全体で最小値が1つしかない学習問題です。しかし、ディープニューラルネットワークのような複雑なモデルの場合、損失平面には通常、複数の最小値が含まれます。トレーニングセットの損失を最小限に抑えるようなパラメータのセットを見つけるには、多大な労力が必要です。実際、これまでに見たことのないデータの損失を低く抑える一連のパラメーターを見つけるのが難しいのは、一般化と呼ばれる課題です。

1.2ベクトル化の加速

実際、操作プロセスを簡素化するために、forループの代わりに線形代数ライブラリを使用するだけです。2つのベクトルを2つの方法で追加して、それらの間の効率の違いを表すプロセスの時間を計ります。

n = 100000
a = torch.ones(n)
b = torch.ones(n)

一般的に使用されるタイマー:

class Timer:  #@save
    """记录多次运行时间"""
    def __init__(self):
        self.times = []
        self.start()

    def start(self):
        """启动计时器"""
        self.tik = time.time()

    def stop(self):
        """停止计时器并将时间记录在列表中"""
        self.times.append(time.time() - self.tik)
        return self.times[-1]

    def avg(self):
        """返回平均时间"""
        return sum(self.times) / len(self.times)

    def sum(self):
        """返回时间总和"""
        return sum(self.times)

    def cumsum(self):
        """返回累计时间"""
        return np.array(self.times).cumsum().tolist()

1つ目:forループを使用して、一度に1ビットの加算を実行します。

c = torch.zeros(n)
timer = Timer()
for i in range(n):
    c[i] = a[i] + b[i]
f'{
      
      timer.stop():.5f} sec'

出力期間:

'0.76498 sec'

2番目:オーバーロードされた+演算子を使用して、要素ごとの合計を計算します。

timer.start()
d = a + b
f'{
      
      timer.stop():.5f} sec'

出力期間:

'0.00100 sec'

2番目の方法は最初の方法よりもはるかに高速であることがわかります。コードをベクトル化すると、多くの場合、桁違いに高速化されます。さらに、自分で計算をたくさん書く代わりに、ライブラリにもっと多くの数学を入れて、エラーの可能性を減らします。

1.3正規分布と二乗損失

正規分布と線形回帰の関係は密接です。、正規分布確率密度関数と正态分布(normal distribution)も呼ばれます。以下では、正規分布を計算するPython関数を定義します。高斯分布(Gaussian distribution)
ここに画像の説明を挿入

def normal(x, mu, sigma):
    p = 1 / math.sqrt(2 * math.pi * sigma**2)
    return p * np.exp(-0.5 / sigma**2 * (x - mu)**2)

視覚化するには:

# 再次使用numpy进行可视化
x = np.arange(-7, 7, 0.01)

# 均值和标准差对
params = [(0, 1), (0, 2), (3, 1)]
d2l.plot(x, [normal(x, mu, sigma) for mu, sigma in params], xlabel='x',
         ylabel='p(x)', figsize=(4.5, 2.5),
         legend=[f'mu {
      
      mu}, sigma {
      
      sigma}' for mu, sigma in params])

ここに画像の説明を挿入
図に示すように、これは正規分布の理解です。平均(mu)を変更すると、x軸に沿ってシフトが発生し、分散(sigma)を増やすと、分布が広がり、ピークが減少します。
平均二乗損失を線形回帰に使用できる理由の1つは、次のとおりです。観測値にノイズが含まれていると仮定します。ノイズは正規分布に従います。ノイズの正規分布は次のとおりです:
ここに画像の説明を挿入
特定のyを特定のxで観測する可能性は次のように記述できます:
ここに画像の説明を挿入
最尤推定法によれば、パラメーターwとbの最適値は全体を構成する可能性ですデータセット最大値
ここに画像の説明を挿入
最尤推定法に従って選択された推定量は、最尤推定量と呼ばれます。多くの指数関数の積を最大化することは難しいように思われるかもしれませんが、確率論で尤度の最大化対数を計算することによってそれを単純化することができます。歴史的な理由から、最適化とは通常、最大化ではなく最小化を意味します。代わりに、負の対数尤度-logP(y∣X)を最小化できます。
ここに画像の説明を挿入
ここで、σは固定定数であると仮定し、wとbに依存しないため、最初の項を無視する必要があります。ここで、第2項は、定数1 / σ2を除いて、前に紹介した平均二乗誤差と同じです。
したがって、ガウスノイズを想定すると、平均二乗誤差を最小化することは、線形モデルの最尤推定と同等です。

1.4線形回帰からディープネットワークへ

ニューラルネットワークはより多くのより豊富なモデルをカバーしていますが、線形モデルをニューラルネットワークと見なすために、ニューラルネットワークを説明するのと同じ方法で線形モデルを説明することができます。この図は、接続モードのみを示しています。 、各入力のみが示され、重みとバイアスの値を省略して、出力に接続する方法が示されています。

ここに画像の説明を挿入
この図では、入力はx 1、…、x dであるため、入力レイヤーのd输入数(或称为特征维度,feature dimensionality)です。ネットワークの出力はo1であるため、出力層の出力数は1です入力値はすべて与えられており、計算ニューロンは1つしかないことに注意してください。
モデルは計算が行われる場所に焦点を合わせているため、通常、レイヤー数を計算するときに入力レイヤーは考慮されません。したがって、図のニューラルネットワークの層の数は1です。線形回帰モデルは、単一の人工ニューロンのみで構成されるニューラルネットワーク、または単層ニューラルネットワークとも呼ばれるニューラルネットワークと考えることができます。
線形回帰の場合、各入力は各出力に接続され(この場合、出力は1つだけです)、この変換をこの変換(図3の出力層)と呼びます全连接层(fully-connected layer)或称为稠密层(dense layer)

1.5まとめ

  • 機械学習モデルの重要な要素は、トレーニングデータ、損失関数、最適化アルゴリズム、およびモデル自体です。
  • ベクトル化により、計算がより簡単かつ高速になります。
  • 目的関数を最小化することは、最尤推定を実行することと同じです。
  • 線形回帰モデルも単純なニューラルネットワークです。

おすすめ

転載: blog.csdn.net/qq_52118067/article/details/122510573