优达学城《DeepLearning》1-1:神经网络概论
本次目標(biāo)
使用邏輯回歸分類器,實(shí)現(xiàn)一個(gè)線性二分類器。
問(wèn)題的分析
data.csv文件形式如下,共80個(gè)點(diǎn),0和1兩類。
import matplotlib.pyplot as plt
import numpy as np
import pandas as pddata = pd.read_csv('data.csv', header=None)
X = np.array(data[[0,1]])
y = np.array(data[2])
plot_points(X,y)
plt.show()
結(jié)果:
技術(shù)介紹1:邏輯回歸
查閱了很多資料,目前難以從頭到尾的講清楚邏輯回歸的所有內(nèi)容和前因后果,大概是知道了,但疑問(wèn)很多,第二輪時(shí)再來(lái)看這個(gè)問(wèn)題。
- 機(jī)器學(xué)習(xí)算法之邏輯回歸https://www.biaodianfu.com/logistic-regression.html
?
技術(shù)介紹2:梯度下降算法
“梯度”概述
梯度(矢量)是微積分中的一個(gè)概念:
- 在單變量的函數(shù)中,梯度其實(shí)就是函數(shù)的導(dǎo)數(shù)(帶方向),代表著函數(shù)在某個(gè)給定點(diǎn)的切線的斜率
- 在多變量函數(shù)中,梯度是一個(gè)向量,向量有方向,梯度的方向就指出了函數(shù)在給定點(diǎn)的上升最快的方向。梯度是偏導(dǎo)數(shù)(標(biāo)量)的矢量和。
看待微分的意義,可以有不同的角度:
- 函數(shù)某點(diǎn)切線的斜率。
- 函數(shù)的變化率。
單變量微分例子:
多變量微分例子:
求多變量梯度的例子:
我們可以看到,梯度就是分別對(duì)每個(gè)變量進(jìn)行微分,然后用逗號(hào)分割開(kāi),梯度是用<>包括起來(lái),說(shuō)明梯度其實(shí)一個(gè)向量。
梯度下降法簡(jiǎn)述
梯度下降它的主要目的和實(shí)現(xiàn)方法是:沿著目標(biāo)函數(shù)梯度的方向更新參數(shù)值,通過(guò)迭代以期望達(dá)到到目標(biāo)函數(shù)的最小值(或最大值)。
在機(jī)器學(xué)習(xí)中,常見(jiàn)的有:隨機(jī)梯度下降法和批量梯度下降法。
梯度下降算法的數(shù)學(xué)表達(dá)
下面我們就開(kāi)始從數(shù)學(xué)上解釋梯度下降算法的計(jì)算過(guò)程和思想!
此公式的意義是:J是關(guān)于Θ的一個(gè)函數(shù),我們當(dāng)前位置在Θ0點(diǎn),要從這個(gè)點(diǎn)走到J的最小值點(diǎn),也就是山底。首先我們先確定前進(jìn)的方向,也就是梯度的反向,然后走一段距離的步長(zhǎng),也就是α,走完這個(gè)段步長(zhǎng),就到達(dá)了Θ1這個(gè)點(diǎn)!
下面就這個(gè)公式的幾個(gè)常見(jiàn)的疑問(wèn):
- α的含義:
- 學(xué)習(xí)率或者步長(zhǎng)。α不能太大也不能太小,太小導(dǎo)致遲遲走不到最低點(diǎn),太大導(dǎo)致無(wú)法收斂或錯(cuò)過(guò)最低點(diǎn)!
- 為什么用減法而不是加法?
- 梯度前加一個(gè)負(fù)號(hào),就意味著朝著梯度相反的方向前進(jìn)!我們需要朝著下降最快的方向走,自然就是負(fù)的梯度的方向,所以此處需要加上負(fù)號(hào)。
單變量函數(shù)的梯度下降
假設(shè)有如下單變量函數(shù),我們利用梯度下降法,試圖找到一個(gè)參數(shù)θ的最佳值,使得損失函數(shù)J(θ)的值最小:
?
函數(shù)的微分:
初始化,起點(diǎn)為:
? ?(注意這里0不是次方,而是序號(hào)意思。即先設(shè)定單變量θ的初始值為2,至于函數(shù)值為多少需要去計(jì)算。
學(xué)習(xí)率為:
根據(jù)梯度下降的計(jì)算公式:
我們開(kāi)始進(jìn)行梯度下降的迭代計(jì)算過(guò)程:
可視化收斂過(guò)程如下:
局部放大圖:
從可視化中可看出,梯度下降法在趨近函數(shù)最小值(1, -1)點(diǎn),那個(gè)點(diǎn)位的單變量值為1。
首先本案例函數(shù)是我自己設(shè)計(jì)并可視化后選定的,我在動(dòng)手計(jì)算時(shí),發(fā)現(xiàn)學(xué)習(xí)率對(duì)梯度下降太敏感了,本來(lái)設(shè)定的學(xué)習(xí)率為0.4,但一下就跑到左邊曲線很遠(yuǎn)地方去了,0.1也會(huì)跑到左邊去,最終發(fā)現(xiàn)0.05對(duì)于這個(gè)函數(shù)而言是比較好的學(xué)習(xí)率。所以說(shuō),花點(diǎn)時(shí)間親自動(dòng)手,對(duì)算法的理解還是會(huì)生動(dòng)的多。
多變量函數(shù)的梯度下降
我們假設(shè)有一個(gè)損失函數(shù):
現(xiàn)在要通過(guò)梯度下降法計(jì)算這個(gè)函數(shù)的最小值。我們通過(guò)觀察就能發(fā)現(xiàn)最小值其實(shí)就是 (0,0)點(diǎn)。但是接下來(lái),我們會(huì)從梯度下降算法開(kāi)始一步步計(jì)算到這個(gè)最小值!
我們假設(shè)初始的起點(diǎn)為:
初始的學(xué)習(xí)率為:
函數(shù)的梯度為:
進(jìn)行多次迭代:
我們發(fā)現(xiàn),已經(jīng)基本靠近函數(shù)的最小值點(diǎn):
從上面能看出,多變量的函數(shù)梯度下降和單變量沒(méi)有本質(zhì)區(qū)別,計(jì)算的時(shí)候各變量基本是隔離的,有點(diǎn)像矩陣計(jì)算。
邏輯回歸+梯度下降法在本項(xiàng)目中應(yīng)用
1 sigmoid激勵(lì)函數(shù)
2 輸出公式
3 損失函數(shù)
其中 y 是真值標(biāo)簽值,y^是預(yù)測(cè)標(biāo)簽值。
4 更新權(quán)值的函數(shù)
代碼和輸出
import matplotlib.pyplot as plt
import numpy as np
import pandas as pddef plot_points(X, y):admitted = X[np.argwhere(y==1)]rejected = X[np.argwhere(y==0)]plt.scatter([s[0][0] for s in rejected], [s[0][1] for s in rejected], s = 25, color = 'blue', edgecolor = 'k')plt.scatter([s[0][0] for s in admitted], [s[0][1] for s in admitted], s = 25, color = 'red', edgecolor = 'k')def display(m, b, color='g--'):plt.xlim(-0.05,1.05)plt.ylim(-0.05,1.05)x = np.arange(-10, 10, 0.1)plt.plot(x, m*x+b, color)# Activation (sigmoid) function
def sigmoid(x):return 1 / (1 + np.exp(-x))# Output (prediction) formula
def output_formula(features, weights, bias):return sigmoid(np.dot(features, weights) + bias)# Error (log-loss) formula
def error_formula(y, output):return - y*np.log(output) - (1 - y) * np.log(1-output)# Gradient descent step
def update_weights(x, y, weights, bias, learnrate):output = output_formula(x, weights, bias)d_error = y - outputweights += learnrate * d_error * xbias += learnrate * d_errorreturn weights, biasdef train(features, targets, epochs, learnrate, graph_lines=False):# 初始化errors = []n_records, n_features = features.shapelast_loss = Noneweights = np.random.normal(scale=1 / n_features**.5, size=n_features)bias = 0for e in range(epochs):del_w = np.zeros(weights.shape)#開(kāi)始一個(gè)epoch的梯度下降計(jì)算for x, y in zip(features, targets): #zip:逐個(gè)元素打包成元組。weights, bias = update_weights(x, y, weights, bias, learnrate)# Printing out the log-loss error on the training setout = output_formula(features, weights, bias)loss = np.mean(error_formula(targets, out))errors.append(loss)if e % (epochs / 10) == 0: #無(wú)論多少epoch,都只打印10次結(jié)果print("\n========== Epoch", e,"==========")if last_loss and last_loss < loss:print("Train loss: ", loss, " WARNING - Loss Increasing")else:print("Train loss: ", loss)last_loss = loss# e.g. 0.95 --> True (= 1), 0.31 --> False (= 0)predictions = out > 0.5# print(out)# print(targets)accuracy = np.mean(predictions == targets)#相等為1,不相等為0,均值就是精度。print("Accuracy: ", accuracy)if graph_lines and e % (epochs / 100) == 0: #每個(gè)epoch繪制一次‘分割線’display(-weights[0]/weights[1], -bias/weights[1])# 繪制預(yù)測(cè)效果圖plt.title("Solution boundary")display(-weights[0]/weights[1], -bias/weights[1], 'black') # 繪制最終的分割線plot_points(features, targets)# 繪制所有樣本點(diǎn)plt.show()# 繪制loss曲線plt.title("Error Plot")plt.xlabel('Number of epochs')plt.ylabel('Error')plt.plot(errors)plt.show()"""
X:point坐標(biāo)集
y:標(biāo)簽集(0或1)
"""
data = pd.read_csv('data.csv', header=None)
X = np.array(data[[0,1]])
y = np.array(data[2])np.random.seed(44)
epochs = 100
learnrate = 0.01
train(X, y, epochs, learnrate, True)
?
========== Epoch 0 ==========
Train loss: 0.7135845195381634
Accuracy: 0.4========== Epoch 10 ==========
Train loss: 0.6225835210454962
Accuracy: 0.59========== Epoch 20 ==========
Train loss: 0.5548744083669508
Accuracy: 0.74========== Epoch 30 ==========
Train loss: 0.501606141872473
Accuracy: 0.84========== Epoch 40 ==========
Train loss: 0.4593334641861401
Accuracy: 0.86========== Epoch 50 ==========
Train loss: 0.42525543433469976
Accuracy: 0.93========== Epoch 60 ==========
Train loss: 0.3973461571671399
Accuracy: 0.93========== Epoch 70 ==========
Train loss: 0.3741469765239074
Accuracy: 0.93========== Epoch 80 ==========
Train loss: 0.35459973368161973
Accuracy: 0.94========== Epoch 90 ==========
Train loss: 0.3379273658879921
Accuracy: 0.94
?
總結(jié)
學(xué)習(xí)如何編碼實(shí)現(xiàn)梯度下降算法,并且在一個(gè)小數(shù)據(jù)集上應(yīng)用。
即:使用梯度下降算法,找到一條直線,使之能最大程度的分隔兩類數(shù)據(jù)點(diǎn)。
?
參考:
- 梯度下降法和反向傳播算法是什么關(guān)系?https://www.zhihu.com/question/311616761/answer/608618557
- ★★深入淺出--梯度下降法及其實(shí)現(xiàn)https://www.jianshu.com/p/c7e642877b0e
-
★多元函數(shù)的偏導(dǎo)數(shù)、方向?qū)?shù)、梯度以及微分之間的關(guān)系思考https://zhuanlan.zhihu.com/p/31942912
-
邏輯回歸和神經(jīng)網(wǎng)絡(luò)之間有什么關(guān)系?https://blog.csdn.net/tz_zs/article/details/79069499
?
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的优达学城《DeepLearning》1-1:神经网络概论的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 原创:尖叫之夜男明星红毯造型在韩国爆红,
- 下一篇: 优达学城《DeepLearning》大纲