Loading [MathJax]/extensions/tex2jax.js

Rainbow Engine

IT技術を分かりやすく簡潔にまとめることによる学習の効率化、また日常の気付きを記録に残すことを目指します。

機械学習 (Machine Learning)

確率的勾配降下法(SGD)をロジスティック回帰に適用しPythonで実装した例をご紹介

投稿日:2022年10月6日 更新日:

 

<目次>

(1) 確率的勾配降下法(SGD)をロジスティック回帰に適用しPythonで実装した例をご紹介
 (1-1) (課題)「勾配降下法」が抱える課題
 (1-2) (対策)確率的勾配降下法(SGD)とは?
 (1-3) (実装)Pythonで実装する際のポイント
 (1-4) (実装例)サンプルプログラム

(1) 確率的勾配降下法(SGD)をロジスティック回帰に適用しPythonで実装した例をご紹介

(1-1) (課題)「勾配降下法」が抱える課題

・パラメータ(重み\(w\)、バイアス\(b\))更新の度に、全N件の総和(Σ)を求める必要があるため、Nの値が膨大になると「計算時間が非常に長くなる」や「処理メモリの不足」といった問題が発生する。
 
(式)「勾配降下法」のパラメータ更新
\( \boldsymbol{w}^{(k+1)} = \boldsymbol{w}^{k}+\eta \sum^{N}_{n=1} (t_n-y_n) \boldsymbol{x_n} \)
\( b^{(k+1)} = b^{k}+\eta \sum^{N}_{n=1} (t_n-y_n) \)

(図111)勾配降下法のイメージ(N=4の例)

(1-2) (対策)確率的勾配降下法(SGD)とは?

・SGD は「Stochastic Gradient Descent」(確率的勾配降下法)の頭文字を取っている略語です。
・「勾配降下法」の課題である「計算時間が非常に長くなる」や「処理メモリの不足」を改善する手法です。
・具体的にはパラメータ(重み\(w\)、バイアス\(b\))更新の度に、データ全N件の中から「ランダムで1件を選択」して更新に使用します。
 
(式)「確率的勾配降下法」のパラメータ更新
\( \boldsymbol{w}^{(k+1)} =\boldsymbol{w}^{k}+\eta (t_n-y_n) \boldsymbol{x_n} \)
\( b^{(k+1)} =b^{k} +\eta (t_n-y_n) \)

・\(n\)の添え字のある文字は、\(N\)個のデータからランダムに選択します。
 
(図121)確率的勾配降下法のイメージ(N=4の例)
 

(1-3) (実装)Pythonで実装する際のポイント

・実装時のポイントは、Epoc(全データN個に対する繰り返し数)の最初で、データをシャッフルして使用する事でランダム性を再現します。
・データをランダムにシャッフルするために「sklearn.utils.shuffle」のライブラリを使用します。
 
(Before)パラメータ(重みw、バイアスb)更新で、入力Xについて「全N件の総和」を求めて更新処理を行う
  1. ############################################
  2. # STEP5:学習
  3. ############################################
  4. for epoc in range(25):
  5. # バッチのデータ数だけ繰り返し
  6. for n1 in range(N):
  7. ############################################
  8. # STEP3:最適化手法の定義(例:勾配降下法)
  9. ############################################
  10. # Σ(t[n]-y[n])の計算
  11. # (tn-yn)、(tn-yn)xnの変数
  12. t_y = 0
  13. t_y_x = tf.Variable(tf.zeros([M],tf.float64), dtype = tf.float64, shape=[M])
  14. for n2 in range(N):
  15. # yの計算(モデルの出力)
  16. y = tf.nn.sigmoid(np.dot(X[n2],weight)+bias)
  17.  
  18. # Σ(t[n]-y[n])の更新
  19. t_y = t_y + (t[n2]-y[0])
  20. # Σ(t[n]-y[n])xnの更新
  21. t_y_x.assign_add(tf.math.scalar_mul((t[n2]-y[0]),X[n2]))
  22.  
  23. # 重みwの勾配(∂E(w,b)/∂w)の計算
  24. dweight.assign(tf.math.scalar_mul((1.0/N),t_y_x))
  25. # バイアスbの勾配(∂E(w,b)/∂b)の計算
  26. dbias.assign([(1.0/N)*t_y])
 
(After)パラメータ(重みw、バイアスb)更新で、入力Xについて「全N件のデータからランダムで1件を選択」して更新処理を行う
  1. from sklearn.utils import shuffle
  2. ############################################
  3. # STEP5:学習
  4. ############################################
  5. for epoc in range(25):
  6. # バッチのデータ数だけ繰り返し
  7. for n in range(N):
  8. # データをシャッフル
  9. X_,t_ = shuffle(X.numpy(),t.numpy())
  10. xn = X_[n]
  11.  
  12. ############################################
  13. # STEP3:最適化手法の定義(例:勾配降下法)
  14. ############################################
  15. # yの計算(モデルの出力)
  16. y = tf.nn.sigmoid(np.dot(xn,weight)+bias)
  17.  
  18. # 重みwの勾配(∂E(w,b)/∂w)の計算
  19. dweight = tf.math.scalar_mul((t_[n]-y[0]),xn)
  20. # バイアスbの勾配(∂E(w,b)/∂b)の計算
  21. dbias.assign([t_[n]-y[0]])
 

(1-4) (実装例)サンプルプログラム

・「確率的勾配降下法」を「ロジスティック回帰」モデルに適用し、「OR回路」を学習させた例。
  1. ############################################
  2. # ロジスティクス回帰 - 確率的勾配降下法(Scotastic Gradient Descent)
  3. ############################################
  4. import numpy as np
  5. import tensorflow as tf
  6. import os
  7. os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'
  8. from sklearn.utils import shuffle
  9.  
  10. # 入力xの次元
  11. M = 2
  12. # 入力データセットの数
  13. N = 4
  14.  
  15. def or_gate(X_arg,t_arg):
  16. ############################################
  17. # STEP1:モデルの定義
  18. ############################################
  19. # 入力の電気信号xの初期化
  20. X = tf.constant(X_arg, dtype = tf.float64, shape=[N,M])
  21. # 重みwの定義 ⇒[1行×M列]
  22. weight = tf.Variable(tf.zeros([M],tf.float64), dtype = tf.float64, shape=[M])
  23. # バイアスbの定義 ⇒[1行] 
  24. bias = tf.Variable([0], dtype = tf.float64, shape=[1])
  25. # シグモイド関数:y = σ(wx + b)の定義 ⇒[1行]
  26. y = tf.Variable([0], dtype = tf.float64, shape=[1])
  27. # 正解値tの定義([[0,1,1,1]) ⇒[n行×1列]
  28. t = tf.Variable(t_arg, dtype = tf.float64, shape=[N])
  29. # 重みwの勾配(∂E(w,b)/∂w)の定義
  30. dweight = tf.Variable(tf.zeros([M],tf.float64), dtype = tf.float64, shape=[M])
  31. # バイアスbの勾配(∂E(w,b)/∂b)の定義
  32. dbias = tf.Variable([0], dtype = tf.float64, shape=[1])
  33. # 学習率ηの定義
  34. eta = 0.1
  35. # Epocの定義
  36. epoc = 0
  37.  
  38. ############################################
  39. # STEP4:セッションの初期化
  40. ############################################
  41. # ⇒今回は不要
  42. # (TensorFlow v2以降はSessionを使用しないため)
  43.  
  44. ############################################
  45. # STEP5:学習
  46. ############################################
  47. for epoc in range(25):
  48. # バッチのデータ数だけ繰り返し
  49. for n in range(N):
  50. # データをシャッフル
  51. X_,t_ = shuffle(X.numpy(),t.numpy())
  52. xn = X_[n]
  53. ############################################
  54. # STEP2:誤差関数の定義
  55. ############################################
  56. # ⇒今回は不要
  57. # (確率的勾配降下法の式を使うため、途中経過の誤差関数Eは計算不要)
  58.  
  59. ############################################
  60. # STEP3:最適化手法の定義(例:勾配降下法)
  61. ############################################
  62. # yの計算(モデルの出力)
  63. y = tf.nn.sigmoid(np.dot(xn,weight)+bias)
  64.  
  65. # 重みwの勾配(∂E(w,b)/∂w)の計算
  66. dweight = tf.math.scalar_mul((t_[n]-y[0]),xn)
  67. # バイアスbの勾配(∂E(w,b)/∂b)の計算
  68. dbias.assign([t_[n]-y[0]])
  69.  
  70. # 重みwの再計算
  71. weight.assign_add(dweight)
  72. # バイアスbの再計算
  73. bias.assign_add(dbias)
  74.  
  75. # コンソール出力
  76. decimals = 4
  77. print("Epoc= ",epoc,
  78. "No. = ", n,
  79. "x1,x2 =", X[n].numpy(),
  80. "t =", '{:01}'.format(tf.convert_to_tensor(t_[n]).numpy()),
  81. "w1,w2 =", np.round(weight.numpy(),decimals),
  82. "theta =", np.round(bias.numpy(),decimals),
  83. "y =", '{:06.4f}'.format(tf.convert_to_tensor(y[0]).numpy()),
  84. "dw1,dw2 =",np.round(dweight.numpy(),decimals),
  85. "db =", np.round(dbias.numpy(),decimals))
  86.  
  87. def main():
  88. # 初期値を設定し学習実行
  89. X = [[0,0],[0,1],[1,0],[1,1]]
  90. t = [0,1,1,1]
  91. or_gate(X,t)
  92.  
  93. if __name__ == "__main__":
  94. main()
(図131)

目次にもどる

Adsense審査用広告コード


Adsense審査用広告コード


-機械学習 (Machine Learning)

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

ディープラーニングのロジスティクス回帰をPythonで実装した例をご紹介

  <目次> (1) ディープラーニングのロジスティック回帰をPythonで実装した例をご紹介  (1-1) 実装のフロー  (1-2) 実装例 (1) ディープラーニングのロジスティック回 …

no image

最尤推定の計算を正規分布で行った例をご紹介

  <目次> (1) 最尤推定の計算を正規分布で行った例をご紹介  (1-1) 最尤推定とは?  (1-2) 最尤推定の計算の流れ  (1-3) STEP1:分布の種類を仮定(例:正規分布、 …

Kerasで「AttributeError: ‘Sequential’ object has no attribute ‘XXX’」エラー原因・対処(+predict_classes関数やpredict_proba関数の解説)

  <目次> (1) Kerasで「AttributeError: ‘Sequential’ object has no attribute ‘XXX&# …

no image

ディープラーニングの論理回路とは?Pythonのサンプルプログラムもご紹介

  <目次> (1) ディープラーニングの論理回路とは?Pythonのサンプルプログラムもご紹介  (1-1) ニューラルネットワークとは?  (1-2) 論理回路とは?  (1-3) AN …

no image

ソフトマックス関数とは?ロジスティック回帰との関係性もご紹介

<目次> (1) ソフトマックス関数とは?ロジスティック回帰との関係性もご紹介  (1-1) 目的  (1-2) ソフトマックス関数とは?  (1-3) ソフトマックス関数の特徴  (1-4) ソフト …

  • English (United States)
  • 日本語
S