機器學習看得見Lesson 1 — 視覺化訓練過程的模型決策邊界

施威銘研究室
5 min readSep 3, 2021

--

到底怎麼知道模型過程是否有問題呢?只能看訓練過程中螢幕上面顯示的損失或是準確率數字嗎?

今天要用Logistic Regression為例,告訴大家怎麼將訓練過程視覺化,幫助我們判斷模型訓練的狀況。

一、建立Logistic Regression

首先,我們先準備一些訓練Logistic Regression需要的函式,其中包含產生資料(func_gen_data)、做預測(func_predict)、計算激活函數的輸出(func_activation)、計算梯度(func_gradient)。

import numpy as np
import matplotlib.pyplot as plt
def func_gen_data(N):

x1 = np.random.normal(loc = -3, scale = 1, size = 100)
y1 = np.array([0 for i in range(N)])

x2 = np.random.normal(loc = 3, scale = 1, size = 100)
y2 = np.array([1 for i in range(N)])

x = np.concatenate((x1, x2))
y = np.concatenate((y1, y2))

return x, y, x1, y1, x2, y2
def func_predict(x, w, b):

return w * x + b
def func_activation(y):

return 1 / (1 + np.exp(-y))
def func_gradient(x, t, z):

gradient_w = sum(-(t — z) * x) / len(z)
gradient_b = sum(-(t — z)) / len(z)

return np.array([gradient_w, gradient_b])

二、訓練模型的前置作業

首先,我們使用func_gen_data產生100筆訓練資料以及對應的標籤。由於這個範例的每一筆訓練資料只有一個特徵,因此我們只需要初始化一個模型權重(w)、一個模型偏值(b)。此外,學習率固定為0.1。

接著,我們為了要知道模型輸出預測值的變化,因此定義一組特徵值x,範圍是從-5到5,之後我們將會看到模型預測這組特徵值的變化,也就是程式中y的變化。為了讓y的變化可以視覺化,我們定義一個line物件,它是matplotlib.pyplot的plot結果,接下來我們每更新一次模型參數,就會一起更新line物件然後重新畫出圖。

N = 100
np.random.seed(1)
feature, label, f1, label_1, f2, label_2 = func_gen_data(N)
lr = 0.1
w = 0
b = 0
x = np.linspace(start = -5, stop = 5, num = 1000)
y = func_predict(x, w, b)
z = func_activation(y)
# Set up the plotting:
fig = plt.figure(1,figsize=(6,4))
line, = plt.plot(x, z, color = “red”, label=”Decision Boundary”)
plt.scatter(f1,
label_1,
color = “green”,
label = “Class 0 Data”)
plt.scatter(f2,
label_2,
color = “blue”,
label = “Class 1 Data”)
plt.legend()

三、開始訓練模型

接下來這段程式有2個部分,上半部分是使用Gradient Descent來訓練模型,Gradient Descent的操作可以參考旗標出版的「資料科學的建模基礎 — 別急著coding!你知道模型的陷阱嗎?」。

下半部分是更新圖形,每一次修改模型參數後,我們就會用新的模型去預測x,並且得到新的y,將y通過激活函數之後,就可以用來更新圖形。

for i in range(100): 
pred = func_predict(feature, w, b)
z = func_activation(pred)
g = func_gradient(feature, label, z)
w = w — lr * g[0]
b = b — lr * g[1]

y = func_predict(x, w, b)
z = func_activation(y)

# Update plot:
line.set_ydata(z)
plt.title(“epoch = “+str(i))
fig.canvas.draw()
plt.pause(0.1)

四、結果

執行上述程式之後,大家就可以看到模型訓練的過程中,模型預測x的變化,也就是決策邊界的變化。藉此就可以知道模型是否更新太慢、或是走向發散、又或是有慢慢改善效能。

關於作者

Chia-Hao Li received the M.S. degree in computer science from Durham University, United Kingdom. He engages in computer algorithm, machine learning, and hardware/software codesign. He was former senior engineer in Mediatek, Taiwan. His currently research topic is the application of machine learning techniques for fault detection in the high-performance computing systems.

--

--

施威銘研究室
施威銘研究室

Written by 施威銘研究室

致力開發AI領域的圖書、創客、教具,希望培養更多的AI人才。整合各種人才,投入創客產品的開發,推廣「實作學習」,希望實踐學以致用的理想。

No responses yet