심층 학습/정칙화의 효과를 보이게 한다

1. 소개



심층 학습 공부를 시작했습니다. 이번에는 정규화에 대해 간단히 정리해 보겠습니다.

2. 데이터 생성



방정식 $y=-x^3+x^2+x$ 를 기준으로 x는 -10~10을 50분할한 값, y는 방정식에 그 x를 대입한 결과에 0~0.05의 난수를 더했다. 값으로 데이터를 만듭니다.
from sklearn.preprocessing import PolynomialFeatures
from sklearn import linear_model
import numpy as np
import matplotlib.pyplot as plt

# データの生成
np.random.seed(0)
X = np.linspace(-10, 10, 50)
Y_truth = 0.001 * (-X **3 + X**2 + X)
Y = Y_truth + np.random.normal(0, 0.05, len(X))

plt.figure(figsize=(5, 5))
plt.plot(X, Y_truth, color='gray')
plt.plot(X, Y, '.', color='k')
plt.show()


작성한 데이터입니다. 실선이 참값(방정식의 값), 점이 실제로 관측하는 값(y에 노이즈를 더한 값)이라고 하는 가정입니다.

3. 다항식 회귀 도입



과학은 자유도가 높을수록 일어나기 쉽기 때문에 굳이 30차원의 다항식 회귀를 도입합니다.
# グラフ表示
def graph(Y_lr, name):
    plt.figure(figsize=(6, 6))
    plt.plot(X, Y_truth, color='gray', label='truth')
    plt.plot(xs, Y_lr, color='r', markersize=2, label=name)
    plt.plot(X, Y, '.', color='k')
    plt.legend()
    plt.ylim(-1, 1)
    plt.show()

# 表示設定
xs = np.linspace(-10, 10, 200)  

# 多項式回帰の導入    
poly = PolynomialFeatures(degree=30, include_bias=False)  
X_poly = poly.fit_transform(X[:, np.newaxis])   

그래프 표시나 표시의 설정을 한 후, PolynomialFeatures를 인스턴스화해, 피트하고 있습니다. 차원은 30차원(degree=30)입니다.

4. 정규화 없음



우선, 정규화 없이 다항식 회귀를 실시합니다.
# 正則化なし           
lr0 = linear_model.LinearRegression(normalize=True)
lr0.fit(X_poly, Y)
Y_lr0 = lr0.predict(poly.fit_transform(xs[:, np.newaxis]))
graph(Y_lr0, 'No Regularization')



30차원의 다항식과 자유도가 높기 때문에, 수많은 점을 기용으로 통과할 수 있어 버려, 전형적인 과학습에 빠지고 있습니다. 진정한 값과는 멀어져 버려, 이것으로는 일반화 성능은 바랄 수 없습니다.

5.L2 정규화



L2 정칙화란, Ridge(리지) 회귀로 알려진 수법으로, 계수가 지나치게 커지지 않도록 제한을 더하는 것으로, 파라미터의 L2 놈을 손실에 더합니다(C는 정수).
$L(W)+c|w|^2$
# L2正則化
lr2 = linear_model.Ridge(normalize=True, alpha=0.5)
lr2.fit(X_poly, Y)
Y_lr2 = lr2.predict(poly.fit_transform(xs[:, np.newaxis]))
graph(Y_lr2, 'L2')


글쎄, 잘 회귀 할 수있는 느낌입니다.

6.L1 정규화



L1 정규화란, Lasso(라소) 회귀로 알려진 수법으로, 마찬가지로 계수가 지나치게 커지지 않도록 제한을 더하는 것으로, 파라미터의 L1 놈을 손실에 더합니다(C는 정수).
$L(W)+c|w|$
# L1正則化
lr1 = linear_model.LassoLars(normalize=True, alpha=0.001)
lr1.fit(X_poly, Y)
Y_lr1 = lr1.predict(poly.fit_transform(xs[:, np.newaxis]))
graph(Y_lr1, 'L1')


저스트 피트에 꽤 가까운 형태입니다. L1 정칙화와 비교하면 L2 정칙화가 더 잘 회귀 할 수있는 것 같습니다.

7. 차원 계수 비교



정규화 없음, L2 정칙화, L1 정칙화 각각 30개의 차원 계수를 비교합니다(차원이 낮은 쪽에서 나란히 있습니다).
import pandas as pd
result = []
for i in range(len(lr0.coef_)):
      tmp = lr0.coef_[i], lr2.coef_[i], lr1.coef_[i]
      result.append(tmp)
df = pd.DataFrame(result)
df.columns = ['No Regularization', 'L2', 'L1']
print(df)


L2는 No Regularization에 비해 계수가 작아지고 있는 것을 알 수 있다고 생각합니다. L1은 한층 더, 완전하게 0의 곳이 많은 표현(스퍼스인 표현)이 되어 있습니다.

L1 정칙화는, 과학습 억제+차원 삭감도 할 수 있는 것은, 기쁘네요.

좋은 웹페이지 즐겨찾기