ミニバッチ勾配降下法 – ミニバッチ

ミニバッチ勾配効果法の説明として正しくないものを選択肢 1 ~ 4 から選んでください.

1. 大きな訓練セットに対しても比較的早く計算が完了する.
2. scikit-learn にはミニバッチ勾配降下法のクラスがある.
3. 確率的勾配効果法よりも、最適な解に近づける.
4. アウトオブコアアルゴリズムとして実装できない.

ミニバッチ勾配降下法の実装

次のコードで空欄になっている行に入る適切な選択肢を 1 ~ 3 から選び、
ミニバッチ勾配降下法で X、y を学習し傾きと切片を求めてください.

import numpy as np

np.random.seed(0)
X = 2 * np.random.rand(100,1)
y = 4 + 3 * X + np.random.rand(100,1)

X_b = np.c_[np.ones((100, 1)), X]

epochs = 50
minibatch_size = 20
m = len(X_b)

np.random.seed(0)
theta = np.random.randn(2,1)

t0, t1 = 200, 1000
def learning_schedule(t):
return t0 / (t + t1)

t = 0
for epoch in range(epochs):
shuffle = np.random.permutation(m)

# Q1:X_b、y の配列をランダムに並び替え、をそれぞれX_b_shuffled、y_shuffled に代入してください.
X_b_shuffled = X_b[##########]
y_shuffled = y[##########]
for i in range(0, m, minibatch_size):
t += 1
xi = X_b_shuffled[i:i+minibatch_size]
yi = y_shuffled[i:i+minibatch_size]

[Q1の選択肢]
1. epoch
2. shuffle
3. m

# Q2:勾配を求めてください.
gradients = ##########
eta = learning_schedule(t)
theta = theta – eta * gradients

print(theta)

[Q2の選択肢]
1. 2/shuffle * xi.T.dot(xi.dot(theta) – yi)
2. 2/minibatch_size * xi.T.dot(xi.dot(theta) – yi)
3. 2/epoch * xi.T.dot(xi.dot(theta) – yi)

ミニバッチ勾配降下法の実装

次のコードで空欄になっている行に入る適切な選択肢を 1 ~ 3 から選び、
ミニバッチ勾配降下法で X、y を学習し傾きと切片を予測してください.

import numpy as np

np.random.seed(0)
X = 2 * np.random.rand(100,1)
y = 4 + 3 * X + np.random.rand(100,1)

X_b = np.c_[np.ones((100, 1)), X]

epochs = 50
minibatch_size = 20
m = len(X_b)

np.random.seed(0)
theta = np.random.randn(2,1)

t0, t1 = 200, 1000
def learning_schedule(t):
return t0 / (t + t1)

t = 0
for epoch in range(epochs):
shuffle = np.random.permutation(m)

# Q1:X_b、y の配列をランダムに並び替え、をそれぞれX_b_shuffled、y_shuffled に代入してください.
X_b_shuffled = X_b[##########]
y_shuffled = y[##########]
for i in range(0, m, minibatch_size):
t += 1
xi = X_b_shuffled[i:i+minibatch_size]
yi = y_shuffled[i:i+minibatch_size]

[Q1の選択肢]
1. m
2. epoch
3. shuffle

# Q2:勾配を求めてください.
gradients = ##########
eta = learning_schedule(t)
theta = theta – eta * gradients

print(theta)

[Q2の選択肢]
1. 2/epoch * xi.T.dot(xi.dot(theta) – yi)
2. 2/shuffle * xi.T.dot(xi.dot(theta) – yi)
3. 2/minibatch_size * xi.T.dot(xi.dot(theta) – yi)

多項式回帰とは

次のコードで空欄になっている行に入る適切な選択肢を 1 ~ 3 から選び、多項式回帰モデルを訓練してください.

import numpy as np

#Q1: PolynomialFeatures クラスをインポートしてください.
from ########## import PolynomialFeatures

[Q1 選択肢]
1. sklearn.model_selection
2. sklearn.metircs
3. sklearn.preprocessing

#Q2:多項式回帰モデル用のクラスをインポートしてください.
from sklearn.linear_model import ##########

[Q2 選択肢]
1. LinearRegression
2. ElasticNet
3. Rasso

np.random.seed(0)

m = 100
X = 6 * np.random.rand(m, 1) – 3
y = 3 * X ** 2 + 4 * X + 2 + np.random.randn(m, 1)

# Q3:各特徴量の二乗を新特徴量として追加するための非線型変換をしてください.バイアス項はなしとします.
poly_f = ##########

[Q3の選択肢]
1. PolynomialFeatures(degree=1, include_bias=False)
2. PolynomialFeatures(degree=2, include_bias=True)
3. PolynomialFeatures(degree=2, include_bias=False)

# Q4:各特徴量を 2 乗とした新特徴量を用意してください.
X_poly = ##########

mdoel = LinearRegression()
model.fit(X_poly, y)

print(model.intercept_, model.coef_)

[Q4の選択肢]
1. poly_f.fit_transform(X)
2. poly_f.fit(X)
3. poly_f.fit_transform(X, y)

バッチ勾配降下法の実装

次のコードで空欄になっている行に入る適切な選択肢を 1 ~ 3 から選び、バッチ勾配降下法で X、y を学習し傾きと切片を予測してください.
また今回は、学習率を 0.1 として訓練してください.
(変数 eta、 gradients はそれぞれ学習率と勾配ベクトルを表しています.)

import numpy as np

np.random.seed(0)
X = 2 * np.random.rand(100,1)
y = 4 + 3 * X + np.random.rand(100,1)

# Q1:X の各インスタンスに x0 = 1 を加え、変数 X_b に代入してください.
X_b = ##########

eta = 0.1
iterations = 1000
m = len(X_b)
theta = np.random.randn(2,1)

for iteration in range(iterations):
#Q2:勾配を計算し変数 gradients に代入してください.
gradients = ##########
#Q3:変数 gradients を用いてモデルパラメータを更新してください.
theta = ##########

print(theta)

[Q1 の選択肢]
1. np.concat([np.ones((100,1), X])
2. np.c_([X, np.ones((100,1)])
3. np.c_([np.ones((100,1), X])

[Q2 の選択肢]
1. 2 * X_b.T.dot(X_b.dot(theta) – y)
2. 2/m * X_b.T.dot(X_b.dot(theta) – y)
3. 2/m * X_b.dot(X_b.dot(theta) – y)

[Q3 の選択肢]
1. theta – eta * gradients
2. eta – (theta + gradients)
3. (theta + eta) – gradients

バッチ勾配降下法の実装

次のコードで空欄になっている行に入る適切な選択肢を 1 ~ 3 から選び、バッチ勾配降下法で X、y を学習し傾きと切片を予測してください.
また今回は、学習率を 0.1 として訓練してください.
(変数 eta、 gradients はそれぞれ学習率と勾配ベクトルを表しています.)

import numpy as np

np.random.seed(0)
X = 2 * np.random.rand(100,1)
y = 4 + 3 * X + np.random.rand(100,1)

# Q1:X の各インスタンスに x0 = 1 を加え、変数 X_b に代入してください.
X_b = ##########

eta = 0.1
iterations = 1000
m = len(X_b)
theta = np.random.randn(2,1)

for iteration in range(iterations):
#Q2:勾配を計算し変数 gradients に代入してください.
gradients = ##########
#Q3:変数 gradients を用いてモデルパラメータを更新してください.
theta = ##########

print(theta)

[Q1 の選択肢]
1. np.c_([np.ones((100,1), X])
2. np.c_([X, np.ones((100,1)])
3. np.concat([np.ones((100,1), X])

[Q2 の選択肢]
1. 2/m * X_b.dot(X_b.dot(theta) – y)
2. 2/m * X_b.T.dot(X_b.dot(theta) – y)
3. 2 * X_b.T.dot(X_b.dot(theta) – y)

[Q3 の選択肢]
1. theta – eta * gradients
2. eta – (theta + gradients)
3. (theta + eta) – gradients

確率的勾配降下法 (SGD)

確率的勾配降下法の説明として正しくないものを選択肢 1 ~ 4 から選んでください.

1. ステップごとに、訓練セットから無作為にインスタンス選び出し勾配を計算する.
2. バッチ勾配降下法と比べて計算に時間がかかる.
3. 巨大な訓練セットに対しても、SGD はアウトコアアルゴリズムとして利用できる.
4. 最適な解を求めることはできないが、十分近い解は得られる.

確率的勾配降下法

バッチ勾配効果法の説明として正しいものを選択肢 1 ~ 4 から選んでください.

[選択肢]
1. イテレーションごとにランダムにサンプリングされたサンプルを用いて、偏微分によって勾配を計算するため解への収束スピードが早いが、
 解が 1 つに定まらない不規則性をもつ.しかし、モデルが局所的な最小値に収束してしまうのを避けることができる.
2. 無策にいくつかのインスタンスをサンプリングすることでミニバッチを用意し、そのミニバッチを用いて勾配を計算していく.
 収束スピードは早く、また、十分最適な解へ収束することができる.また、 GPU との相性も良い.
3. 全ての訓練インスタンスを用いて勾配を計算するため、安定して最適解に収束することができる.
 しかし、訓練セットが大きくなると収束までに非常に時間がかかる.
4. 最適な解に近くことはできるが、1 つに定まらない.しかし、訓練が進むにつれて徐々に学習率を小さくしていくことで、
 最適解にたどり着くことができる.