优达学城《DeepLearning》1-1:神经网络概论
本次目標
使用邏輯回歸分類器,實現一個線性二分類器。
問題的分析
data.csv文件形式如下,共80個點,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()
結果:
技術介紹1:邏輯回歸
查閱了很多資料,目前難以從頭到尾的講清楚邏輯回歸的所有內容和前因后果,大概是知道了,但疑問很多,第二輪時再來看這個問題。
- 機器學習算法之邏輯回歸https://www.biaodianfu.com/logistic-regression.html
?
技術介紹2:梯度下降算法
“梯度”概述
梯度(矢量)是微積分中的一個概念:
- 在單變量的函數中,梯度其實就是函數的導數(帶方向),代表著函數在某個給定點的切線的斜率
- 在多變量函數中,梯度是一個向量,向量有方向,梯度的方向就指出了函數在給定點的上升最快的方向。梯度是偏導數(標量)的矢量和。
看待微分的意義,可以有不同的角度:
- 函數某點切線的斜率。
- 函數的變化率。
單變量微分例子:
多變量微分例子:
求多變量梯度的例子:
我們可以看到,梯度就是分別對每個變量進行微分,然后用逗號分割開,梯度是用<>包括起來,說明梯度其實一個向量。
梯度下降法簡述
梯度下降它的主要目的和實現方法是:沿著目標函數梯度的方向更新參數值,通過迭代以期望達到到目標函數的最小值(或最大值)。
在機器學習中,常見的有:隨機梯度下降法和批量梯度下降法。
梯度下降算法的數學表達
下面我們就開始從數學上解釋梯度下降算法的計算過程和思想!
此公式的意義是:J是關于Θ的一個函數,我們當前位置在Θ0點,要從這個點走到J的最小值點,也就是山底。首先我們先確定前進的方向,也就是梯度的反向,然后走一段距離的步長,也就是α,走完這個段步長,就到達了Θ1這個點!
下面就這個公式的幾個常見的疑問:
- α的含義:
- 學習率或者步長。α不能太大也不能太小,太小導致遲遲走不到最低點,太大導致無法收斂或錯過最低點!
- 為什么用減法而不是加法?
- 梯度前加一個負號,就意味著朝著梯度相反的方向前進!我們需要朝著下降最快的方向走,自然就是負的梯度的方向,所以此處需要加上負號。
單變量函數的梯度下降
假設有如下單變量函數,我們利用梯度下降法,試圖找到一個參數θ的最佳值,使得損失函數J(θ)的值最小:
?
函數的微分:
初始化,起點為:
? ?(注意這里0不是次方,而是序號意思。即先設定單變量θ的初始值為2,至于函數值為多少需要去計算。
學習率為:
根據梯度下降的計算公式:
我們開始進行梯度下降的迭代計算過程:
可視化收斂過程如下:
局部放大圖:
從可視化中可看出,梯度下降法在趨近函數最小值(1, -1)點,那個點位的單變量值為1。
首先本案例函數是我自己設計并可視化后選定的,我在動手計算時,發現學習率對梯度下降太敏感了,本來設定的學習率為0.4,但一下就跑到左邊曲線很遠地方去了,0.1也會跑到左邊去,最終發現0.05對于這個函數而言是比較好的學習率。所以說,花點時間親自動手,對算法的理解還是會生動的多。
多變量函數的梯度下降
我們假設有一個損失函數:
現在要通過梯度下降法計算這個函數的最小值。我們通過觀察就能發現最小值其實就是 (0,0)點。但是接下來,我們會從梯度下降算法開始一步步計算到這個最小值!
我們假設初始的起點為:
初始的學習率為:
函數的梯度為:
進行多次迭代:
我們發現,已經基本靠近函數的最小值點:
從上面能看出,多變量的函數梯度下降和單變量沒有本質區別,計算的時候各變量基本是隔離的,有點像矩陣計算。
邏輯回歸+梯度下降法在本項目中應用
1 sigmoid激勵函數
2 輸出公式
3 損失函數
其中 y 是真值標簽值,y^是預測標簽值。
4 更新權值的函數
代碼和輸出
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)#開始一個epoch的梯度下降計算for x, y in zip(features, targets): #zip:逐個元素打包成元組。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: #無論多少epoch,都只打印10次結果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: #每個epoch繪制一次‘分割線’display(-weights[0]/weights[1], -bias/weights[1])# 繪制預測效果圖plt.title("Solution boundary")display(-weights[0]/weights[1], -bias/weights[1], 'black') # 繪制最終的分割線plot_points(features, targets)# 繪制所有樣本點plt.show()# 繪制loss曲線plt.title("Error Plot")plt.xlabel('Number of epochs')plt.ylabel('Error')plt.plot(errors)plt.show()"""
X:point坐標集
y:標簽集(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
?
總結
學習如何編碼實現梯度下降算法,并且在一個小數據集上應用。
即:使用梯度下降算法,找到一條直線,使之能最大程度的分隔兩類數據點。
?
參考:
- 梯度下降法和反向傳播算法是什么關系?https://www.zhihu.com/question/311616761/answer/608618557
- ★★深入淺出--梯度下降法及其實現https://www.jianshu.com/p/c7e642877b0e
-
★多元函數的偏導數、方向導數、梯度以及微分之間的關系思考https://zhuanlan.zhihu.com/p/31942912
-
邏輯回歸和神經網絡之間有什么關系?https://blog.csdn.net/tz_zs/article/details/79069499
?
?
?
?
?
總結
以上是生活随笔為你收集整理的优达学城《DeepLearning》1-1:神经网络概论的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 原创:尖叫之夜男明星红毯造型在韩国爆红,
- 下一篇: 优达学城《DeepLearning》大纲