AutoGrad 是一個(gè)老少皆宜的 Python 梯度計(jì)算模塊。
對(duì)于初高中生而言,它可以用來(lái)輕易計(jì)算一條曲線在任意一個(gè)點(diǎn)上的斜率。
對(duì)于大學(xué)生、機(jī)器學(xué)習(xí)愛(ài)好者而言,你只需要傳遞給它Numpy這樣的標(biāo)準(zhǔn)數(shù)據(jù)庫(kù)下編寫(xiě)的損失函數(shù),它就可以自動(dòng)計(jì)算損失函數(shù)的導(dǎo)數(shù)(梯度)。
我們將從普通斜率計(jì)算開(kāi)始,介紹到如何只使用它來(lái)實(shí)現(xiàn)一個(gè)邏輯回歸模型。
1.準(zhǔn)備
開(kāi)始之前,你要確保Python和pip已經(jīng)成功安裝在電腦上,如果沒(méi)有,可以訪問(wèn)這篇文章:超詳細(xì)Python安裝指南 進(jìn)行安裝。
**(可選1) **如果你用Python的目的是數(shù)據(jù)分析,可以直接安裝Anaconda:Python數(shù)據(jù)分析與挖掘好幫手—Anaconda,它內(nèi)置了Python和pip.
**(可選2) **此外,推薦大家用VSCode編輯器,它有許多的優(yōu)點(diǎn):Python 編程的最好搭檔—VSCode 詳細(xì)指南。
請(qǐng)選擇以下任一種方式輸入命令安裝依賴(lài) :
- Windows 環(huán)境 打開(kāi) Cmd (開(kāi)始-運(yùn)行-CMD)。
- MacOS 環(huán)境 打開(kāi) Terminal (command+空格輸入Terminal)。
- 如果你用的是 VSCode編輯器 或 Pycharm,可以直接使用界面下方的Terminal.
pip install autograd
2.計(jì)算斜率
對(duì)于初高中生同學(xué)而言,它可以用來(lái)輕松計(jì)算斜率,比如我編寫(xiě)一個(gè)斜率為0.5的直線函數(shù):
# 公眾號(hào) Python實(shí)用寶典
import autograd.numpy as np
from autograd import grad
def oneline(x):
y = x/2
return y
grad_oneline = grad(oneline)
print(grad_oneline(3.0))
運(yùn)行代碼,傳入任意X值,你就能得到在該X值下的斜率:
(base) G:push20220724 >python 1.py
0.5
由于這是一條直線,因此無(wú)論你傳什么值,都只會(huì)得到0.5的結(jié)果。
那么讓我們?cè)僭囋囈粋€(gè)tanh函數(shù):
# 公眾號(hào) Python實(shí)用寶典
import autograd.numpy as np
from autograd import grad
def tanh(x):
y = np.exp(-2.0 * x)
return (1.0 - y) / (1.0 + y)
grad_tanh = grad(tanh)
print(grad_tanh(1.0))
此時(shí)你會(huì)獲得 1.0 這個(gè) x 在tanh上的曲線的斜率:
(base) G:push20220724 >python 1.py
0.419974341614026
我們還可以繪制出tanh的斜率的變化的曲線:
# 公眾號(hào) Python實(shí)用寶典
import autograd.numpy as np
from autograd import grad
def tanh(x):
y = np.exp(-2.0 * x)
return (1.0 - y) / (1.0 + y)
grad_tanh = grad(tanh)
print(grad_tanh(1.0))
import matplotlib.pyplot as plt
from autograd import elementwise_grad as egrad
x = np.linspace(-7, 7, 200)
plt.plot(x, tanh(x), x, egrad(tanh)(x))
plt.show()
圖中藍(lán)色的線是tanh,橙色的線是tanh的斜率,你可以非常清晰明了地看到tanh的斜率的變化。非常便于學(xué)習(xí)和理解斜率概念。
3.實(shí)現(xiàn)一個(gè)邏輯回歸模型
有了Autograd,我們甚至不需要借用scikit-learn就能實(shí)現(xiàn)一個(gè)回歸模型:
邏輯回歸的底層分類(lèi)就是基于一個(gè)sigmoid函數(shù):
import autograd.numpy as np
from autograd import grad
# Build a toy dataset.
inputs = np.array([[0.52, 1.12, 0.77],
[0.88, -1.08, 0.15],
[0.52, 0.06, -1.30],
[0.74, -2.49, 1.39]])
targets = np.array([True, True, False, True])
def sigmoid(x):
return 0.5 * (np.tanh(x / 2.) + 1)
def logistic_predictions(weights, inputs):
# Outputs probability of a label being true according to logistic model.
return sigmoid(np.dot(inputs, weights))
從下面的損失函數(shù)可以看到,預(yù)測(cè)結(jié)果的好壞取決于weights的好壞,因此我們的問(wèn)題轉(zhuǎn)化為怎么優(yōu)化這個(gè) weights 變量:
def training_loss(weights):
# Training loss is the negative log-likelihood of the training labels.
preds = logistic_predictions(weights, inputs)
label_probabilities = preds * targets + (1 - preds) * (1 - targets)
return -np.sum(np.log(label_probabilities))
知道了優(yōu)化目標(biāo)后,又有Autograd這個(gè)工具,我們的問(wèn)題便迎刃而解了,我們只需要讓weights往損失函數(shù)不斷下降的方向移動(dòng)即可:
# Define a function that returns gradients of training loss using Autograd.
training_gradient_fun = grad(training_loss)
# Optimize weights using gradient descent.
weights = np.array([0.0, 0.0, 0.0])
print("Initial loss:", training_loss(weights))
for i in range(100):
weights -= training_gradient_fun(weights) * 0.01
print("Trained loss:", training_loss(weights))
運(yùn)行結(jié)果如下:
(base) G:push20220724 >python regress.py
Initial loss: 2.772588722239781
Trained loss: 1.067270675787016
由此可見(jiàn)損失函數(shù)以及下降方式的重要性,損失函數(shù)不正確,你可能無(wú)法優(yōu)化模型。損失下降幅度太單一或者太快,你可能會(huì)錯(cuò)過(guò)損失的最低點(diǎn)。
總而言之,AutoGrad是一個(gè)你用來(lái)優(yōu)化模型的一個(gè)好工具,它可以給你提供更加直觀的損失走勢(shì),進(jìn)而讓你有更多優(yōu)化想象力。
-
模塊
+關(guān)注
關(guān)注
7文章
2713瀏覽量
47485 -
數(shù)據(jù)庫(kù)
+關(guān)注
關(guān)注
7文章
3800瀏覽量
64402 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4331瀏覽量
62633 -
模型
+關(guān)注
關(guān)注
1文章
3244瀏覽量
48849 -
python
+關(guān)注
關(guān)注
56文章
4797瀏覽量
84695
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論