損失関数の視覚化

ミリメートルm個のサンプルの場合、損失関数としてMSEを使用します。

サンプルに属性が1つしかない場合xix_iバツ、損失関数は次のようになります
。L= 1 m ∑ i(w ∗ xi + yi)2 L = \ frac {1} {m} \ sum_i(w * x_i + y_i)^ 2L=m1Σwバツ+Y2
損失関数のイメージを描きましょう。

import numpy as np
import matplotlib.pyplot as plt

def image(b=0):
    dense = 400
    w = np.linspace(-2,4,dense)
    x_train = np.array([0,   1,	  2,   3,   4,   5])
    y_train = np.array([1.1, 2.2,  3.8, 4.1, 4.9, 5.2])


    for i in range(dense):
        loss = np.square(w[i] * x_train+b - y_train).sum() / len(x_train)
        plt.scatter(w[i],loss,s=1)

    plt.title('Loss Func Line')
    plt.xlabel('w')
    plt.ylabel('loss')
    plt.axis([0,3,0,10])
    plt.axhline(y=1, ls=":", c="black")
    plt.axhline(y=2, ls=":", c="black")
    plt.axhline(y=4, ls=":", c="black")
    plt.axhline(y=7, ls=":", c="black")
    plt.show()

image()

図1
図1では、$ x $軸に平行なオフセット$ b = 0 $が、損失関数の輪郭です。プラスバイアス:
画像(0.5) 画像(1)
画像(1.7) 画像(2.5)

あなたはバイアスbbを見ることができますbの変化は、損失関数の最小値と対応するwwに直接影響します。w

上記でbbを修正していますb w w wと損失の配当。今度は3D座標で重みwwを描きますwとバイアスbbb対応する損失:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D  # Axes3D 包含的是实现3d绘图的各种方法


x_train = np.array([0,   1,	  2,   3,   4,   5])
y_train = np.array([1.1, 2.2,  3.8, 4.1, 4.9, 5.2])

dense = 400
w,b = np.meshgrid(np.linspace(-2,4, dense),np.linspace(-7,10, dense))

# y = wx+b
def get_loss_value(w,b):
    return np.square(w*x_train+b - y_train).sum()/len(x_train)

def loss_point():
    loss_list = []
    for i in range(dense):
        loss_list2=[]
        for j in range(dense):
            loss = get_loss_value(w[i][j], b[i][j])
            loss_list2.append(loss)
        loss_list.append(loss_list2)
    return loss_list



fig = plt.figure()
ax = Axes3D(fig)
loss = np.array(loss_point())

# 添加坐标轴(顺序是Z, Y, X)
ax.set_xlabel('w')
ax.set_ylabel('b')
ax.set_zlabel('L')
ax.plot_surface(w, b, loss, rstride=30,cstride=30, cmap='jet')
plt.show()

ここに写真の説明を挿入

図2
合計400 * 400 = 160000の損失値が上記で計算されているので、これらの多くの損失値のどれが同じですか?$ w $と$ b $で構成される2次元空間にそのような点を描くと、どのように見えますか?
import numpy as np
import matplotlib.pyplot as plt

x_train = np.array([0,   1,	  2,   3,   4,   5])
y_train = np.array([1.1, 2.2,  3.8, 4.1, 4.9, 5.2])

dense = 400

# y = wx+b
def get_loss_value(w,b):
    return np.square(w*x_train+b - y_train).sum()/len(x_train)


w = np.linspace(-2,4,dense)
b = np.linspace(-7,10,dense)

def draw_contour_line(dense,isoheight): #dense表示取值的密度,isoheight表示等高线的值
    list_w = []
    list_b = []
    list_loss = []
    for i in range(dense):
        for j in range(dense):
            loss = get_loss_value(w[i],b[j])
            if 1.05*isoheight>loss>0.95*isoheight:
                list_w.append(w[i])
                list_b.append(b[j])
            else:
                pass
    plt.scatter(list_w,list_b,s=1) #s=0.25比较合适

draw_contour_line(dense,1)
draw_contour_line(dense,4)
draw_contour_line(dense,7)
draw_contour_line(dense,10)
draw_contour_line(dense,20)
draw_contour_line(dense,30)
draw_contour_line(dense,50)
draw_contour_line(dense,100)
draw_contour_line(dense,200)
plt.title('Loss Func Contour Line')
plt.xlabel('w')
plt.ylabel('b')
plt.axis([-2,4,-7,10])
plt.show()

図3:パラメータ空間の損失輪郭

図3は、予想と同じです。図3は、図2と並行してウォブウォブを使用するようなものです。w o b平面は、L軸に​​沿った接平面であり、接平面が接触するポイントの損失は同じです。また、図2から、損失が20未満の場合は楕円形の輪郭が表示され、損失が大きい場合は楕円形ではないことがわかります。

したがって、勾配降下アルゴリズムを学習するときに、この図がよく見られます。

この図の後には通常、文が続きます。勾配降下の方向は、輪郭線の接線方向に垂直です。

パラメータ空間の点の変化は、損失関数の「上り坂」または「下り坂」に相当することがわかります。

参考記事:
https //blog.csdn.net/keeppractice/article/details/105620966
勾配方向が輪郭方向に垂直であることを理解する

おすすめ

転載: blog.csdn.net/weixin_38052918/article/details/108032973