Trực quan hóa python gốc gradient

Trong ML, giảm độ dốc là một kỹ thuật tối ưu hóa được sử dụng để tính toán các tham số [hệ số và độ quét] cho các thuật toán như hồi quy tuyến tính, hồi quy logistic, mạng nơ-ron, v. v. Trong kỹ thuật này, chúng ta lặp đi lặp lại nhiều lần qua tập luyện và cập nhật mô hình các tham số phù hợp với độ dốc của lỗi đối với tập huấn luyện

Tùy thuộc vào số lượng các ví dụ đào tạo được xem xét trong quá trình cập nhật các tham số mô hình, chúng tôi có 3 loại mô tả gradient

  1. Giảm dần hàng loạt. Các thông số được cập nhật sau khi tính toán độ dốc của lỗi liên quan đến toàn bộ tập huấn luyện
  2. Độ dốc ngẫu nhiên. Các thông số được cập nhật sau khi tính toán độ dốc của lỗi liên quan đến một ví dụ đào tạo duy nhất
  3. Độ dốc chuyển màu theo lô nhỏ. Các thông số được cập nhật sau khi tính toán độ dốc của lỗi đối với một tập hợp con của tập huấn luyện
Batch Gradient Descent StochasticGradient DescentMini-Batch Gradient DescentVì toàn bộ dữ liệu huấn luyện viên được xem xét trước khi thực hiện một bước theo gradient hướng, làm điều đó, cần rất nhiều thời gian để thực hiện một bản cập nhật duy nhất Vì chỉ một ví dụ huấn luyện . Nó thực hiện cập nhật trơn tru các thông số mô hình Nó tạo ra các bản cập nhật thông số rất ồn ào Tùy thuộc vào kích thước lô, các bản cập nhật or có thể được thực hiện ít ồn hơn – kích thước lô lớn hơn ít ồn ào hơn

Do đó, sự giảm dần độ dốc theo lô nhỏ tạo ra sự kết hiệp giữa hội tụ nhanh chóng và nhiễu liên quan đến cập nhật độ dốc, điều này làm cho nó trở thành một thuật toán linh hoạt và mạnh mẽ hơn

1. Độ dốc chuyển tiếp theo lô nhỏ

Thuật toán

Set theta = thông số mô hình và max_iters = số nguyên

cho itr = 1, 2, 3,…, max_iters

cho mini_batch [X_mini, y_mini]

  • Chuyển tiếp trên lô X_mini
    • đưa ra dự đoán về lô nhỏ
    • Tính toán lỗi trong dự đoán [J [theta]] với giá trị hiện tại của các tham số
  • Thẻ tiến
    • Tính gradient [theta] = đạo hàm riêng của J [theta] w. r. t. theta
  • Cập nhật các thông số
    • theta = theta – learning_rate * gradient [theta]

2. Dưới đây là sự phát triển của Python

Bước #1. Bước đầu tiên là nhập các phần phụ thuộc, tạo dữ liệu để hồi quy tuyến tính và trực quan hóa dữ liệu đã được tạo. Chúng ta đã tạo ra 8000 ví dụ dữ liệu, mỗi ví dụ có 2 thuộc tính / tính năng. Các ví dụ dữ liệu này được chia thành tập huấn luyện [X_train, y_train] và tập thử nghiệm [X_test, y_test] có 7200 và 800 ví dụ tương ứng

# -----------------------------------------------------------
#Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
#@author cafedevn
#Contact: cafedevn@gmail.com
#Fanpage: //www.facebook.com/cafedevn
#Group: //www.facebook.com/groups/cafedev.vn/
#Instagram: //instagram.com/cafedevn
#Twitter: //twitter.com/CafedeVn
#Linkedin: //www.linkedin.com/in/cafe-dev-407054199/
#Pinterest: //www.pinterest.com/cafedevvn/
#YouTube: //www.youtube.com/channel/UCE7zpY_SlHGEgo67pHxqIoA/
# -----------------------------------------------------------

# importing dependencies 
import numpy as np 
import matplotlib.pyplot as plt 
  
# creating data 
mean = np.array[[5.0, 6.0]] 
cov = np.array[[[1.0, 0.95], [0.95, 1.2]]] 
data = np.random.multivariate_normal[mean, cov, 8000] 
  
# visualising data 
plt.scatter[data[:500, 0], data[:500, 1], marker = '.'] 
plt.show[] 
  
# train-test-split 
data = np.hstack[[np.ones[[data.shape[0], 1]], data]] 
  
split_factor = 0.90
split = int[split_factor * data.shape[0]] 
  
X_train = data[:split, :-1] 
y_train = data[:split, -1].reshape[[-1, 1]] 
X_test = data[split:, :-1] 
y_test = data[split:, -1].reshape[[-1, 1]] 
  
print["Number of examples in training set = % d"%[X_train.shape[0]]] 
print["Number of examples in testing set = % d"%[X_test.shape[0]]] 

đầu ra

Số lượng ví dụ trong tập huấn luyện = 7200

Number of ví dụ trong bộ thử nghiệm = 800

Bước #2. Tiếp theo, chúng ta viết mã để thực hiện hồi quy tuyến tính bằng cách sử dụng giảm dần độ dốc theo lô nhỏ

gradientDescent[] là hàm điều khiển chính và các hàm khác là hàm trợ giúp được sử dụng để đưa ra dự đoán – giả thuyết[], độ dốc tính toán – gradient[], lỗi tính toán – chi phí[] và tạo lô nhỏ . Hàm điều khiển khởi động tạo các tham số, tính toán bộ tham số tốt nhất cho mô hình và trả về các tham số này cùng với danh sách chứa lịch sử lỗi khi các tham số được cập nhật

# -----------------------------------------------------------
#Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
#@author cafedevn
#Contact: cafedevn@gmail.com
#Fanpage: //www.facebook.com/cafedevn
#Group: //www.facebook.com/groups/cafedev.vn/
#Instagram: //instagram.com/cafedevn
#Twitter: //twitter.com/CafedeVn
#Linkedin: //www.linkedin.com/in/cafe-dev-407054199/
#Pinterest: //www.pinterest.com/cafedevvn/
#YouTube: //www.youtube.com/channel/UCE7zpY_SlHGEgo67pHxqIoA/
# -----------------------------------------------------------

# linear regression using "mini-batch" gradient descent 
# function to compute hypothesis / predictions 
def hypothesis[X, theta]: 
    return np.dot[X, theta] 
  
# function to compute gradient of error function w.r.t. theta 
def gradient[X, y, theta]: 
    h = hypothesis[X, theta] 
    grad = np.dot[X.transpose[], [h - y]] 
    return grad 
  
# function to compute the error for current values of theta 
def cost[X, y, theta]: 
    h = hypothesis[X, theta] 
    J = np.dot[[h - y].transpose[], [h - y]] 
    J /= 2
    return J[0] 
  
# function to create a list containing mini-batches 
def create_mini_batches[X, y, batch_size]: 
    mini_batches = [] 
    data = np.hstack[[X, y]] 
    np.random.shuffle[data] 
    n_minibatches = data.shape[0] // batch_size 
    i = 0
  
    for i in range[n_minibatches + 1]: 
        mini_batch = data[i * batch_size:[i + 1]*batch_size, :] 
        X_mini = mini_batch[:, :-1] 
        Y_mini = mini_batch[:, -1].reshape[[-1, 1]] 
        mini_batches.append[[X_mini, Y_mini]] 
    if data.shape[0] % batch_size != 0: 
        mini_batch = data[i * batch_size:data.shape[0]] 
        X_mini = mini_batch[:, :-1] 
        Y_mini = mini_batch[:, -1].reshape[[-1, 1]] 
        mini_batches.append[[X_mini, Y_mini]] 
    return mini_batches 
  
# function to perform mini-batch gradient descent 
def gradientDescent[X, y, learning_rate = 0.001, batch_size = 32]: 
    theta = np.zeros[[X.shape[1], 1]] 
    error_list = [] 
    max_iters = 3
    for itr in range[max_iters]: 
        mini_batches = create_mini_batches[X, y, batch_size] 
        for mini_batch in mini_batches: 
            X_mini, y_mini = mini_batch 
            theta = theta - learning_rate * gradient[X_mini, y_mini, theta] 
            error_list.append[cost[X_mini, y_mini, theta]] 
  
    return theta, error_list 

Gọi hàm gradientDescent[] để tính toán các tham số của mô hình [theta] và sự thay đổi cấu hình trong hàm lỗi

theta, error_list = gradientDescent[X_train, y_train] 
print["Bias = ", theta[0]] 
print["Coefficients = ", theta[1:]] 
  
# visualising gradient descent 
plt.plot[error_list] 
plt.xlabel["Number of iterations"] 
plt.ylabel["Cost"] 
plt.show[] 

đầu ra

Bias = [0.81830471]
Coefficients = [[1.04586595]]

Bước #3. Cuối cùng, chúng tôi đưa ra dự đoán trong bộ thử nghiệm và tính toán sai số tuyệt đối trung bình trong các dự đoán.

# predicting output for X_test 
y_pred = hypothesis[X_test, theta] 
plt.scatter[X_test[:, 1], y_test[:, ], marker = '.'] 
plt.plot[X_test[:, 1], y_pred, color = 'orange'] 
plt.show[] 
  
# calculating error in predictions 
error = np.sum[np.abs[y_test - y_pred] / y_test.shape[0]] 
print["Mean absolute error = ", error] 

đầu ra

Sai số tuyệt đối trung bình = 0,4366644295854125

Đường cam màu biểu thị hàm giả thuyết cuối cùng. theta [0] + theta [1] * X_test [. , 1] + theta [2] * X_test [. , 2] = 0

Cài đặt ứng dụng cafedev để dễ dàng cập nhật tin tức và học lập trình mọi lúc mọi nơi tại đây

Nguồn và Tài liệu tiếng anh tham khảo

  • w3school
  • con trăn. tổ chức
  • chuyên viên máy tính

Tài liệu từ cafedev

  • Trọn bộ tự học Python từ cơ bản tăng cao tại đây nha
  • Tự học ML bằng Python từ cơ bản để nâng cao
  • Ebook về python tại đây
  • Các chuỗi tự học lập trình phụ khác
  • Nơi liên hệ hợp tác hoặc quảng cáo cùng Cafedevn tại đây

Nếu thấy hay và hữu ích, bạn có thể tham gia các kênh sau của cafedev để nhận được nhiều hơn nữa

Chủ Đề