摘要:神經(jīng)網(wǎng)絡(luò)的模型結(jié)構(gòu)為,其中是輸入?yún)?shù),是權(quán)重,是預(yù)測結(jié)果。損失函數(shù)我們定義為對于損失函數(shù)的優(yōu)化,我們采用梯度下降,這個(gè)方法是神經(jīng)網(wǎng)絡(luò)中常見的優(yōu)化方法。函數(shù)實(shí)現(xiàn)了神經(jīng)網(wǎng)絡(luò)模型,函數(shù)實(shí)現(xiàn)了損失函數(shù)。
作者:chen_h
微信號 & QQ:862251340
微信公眾號:coderpai
簡書地址:https://www.jianshu.com/p/0da...
這篇教程是翻譯Peter Roelants寫的神經(jīng)網(wǎng)絡(luò)教程,作者已經(jīng)授權(quán)翻譯,這是原文。
該教程將介紹如何入門神經(jīng)網(wǎng)絡(luò),一共包含五部分。你可以在以下鏈接找到完整內(nèi)容。
(一)神經(jīng)網(wǎng)絡(luò)入門之線性回歸
Logistic分類函數(shù)
(二)神經(jīng)網(wǎng)絡(luò)入門之Logistic回歸(分類問題)
(三)神經(jīng)網(wǎng)絡(luò)入門之隱藏層設(shè)計(jì)
Softmax分類函數(shù)
(四)神經(jīng)網(wǎng)絡(luò)入門之矢量化
(五)神經(jīng)網(wǎng)絡(luò)入門之構(gòu)建多層網(wǎng)絡(luò)
這篇教程中的代碼是由 Python 2 IPython Notebook產(chǎn)生的,在教程的最后,我會給出全部代碼的鏈接,幫助學(xué)習(xí)。神經(jīng)網(wǎng)絡(luò)中有關(guān)矩陣的運(yùn)算我們采用NumPy來構(gòu)建,畫圖使用Matplotlib來構(gòu)建。如果你來沒有按照這些軟件,那么我強(qiáng)烈建議你使用Anaconda Python來安裝,這個(gè)軟件包中包含了運(yùn)行這個(gè)教程的所有軟件包,非常方便使用。
我們先導(dǎo)入教程需要的軟件包
from __future__ import print_function import numpy as np import matplotlib.pyplot as plt線性回歸
本教程主要包含三部分:
一個(gè)非常簡單的神經(jīng)網(wǎng)絡(luò)
一些概念,比如目標(biāo)函數(shù),損失函數(shù)
梯度下降
首先我們來構(gòu)建一個(gè)最簡單的神經(jīng)網(wǎng)絡(luò),這個(gè)神經(jīng)網(wǎng)絡(luò)只有一個(gè)輸入,一個(gè)輸出,用來構(gòu)建一個(gè)線性回歸模型,從輸入的x來預(yù)測一個(gè)真實(shí)結(jié)果t。神經(jīng)網(wǎng)絡(luò)的模型結(jié)構(gòu)為y = x * w ,其中x是輸入?yún)?shù),w是權(quán)重,y是預(yù)測結(jié)果。神經(jīng)網(wǎng)絡(luò)的模型可以被表示為下圖:
在常規(guī)的神經(jīng)網(wǎng)絡(luò)中,神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)中有多個(gè)層,非線性激活函數(shù)和每個(gè)節(jié)點(diǎn)上面的偏差單元。在這個(gè)教程中,我們只使用一個(gè)只有一個(gè)權(quán)重w的層,并且沒有激活函數(shù)和偏差單元。在簡單線性回歸中,權(quán)重w和偏差單元一般都寫成一個(gè)參數(shù)向量β,其中偏差單元是y軸上面的截距,w是回歸線的斜率。在線性回歸中,我們一般使用最小二乘法來優(yōu)化這些參數(shù)。
在這篇教程中,我們的目的是最小化目標(biāo)損失函數(shù),使得實(shí)際輸出的y和正確結(jié)果t盡可能的接近。損失函數(shù)我們定義為:
對于損失函數(shù)的優(yōu)化,我們采用梯度下降,這個(gè)方法是神經(jīng)網(wǎng)絡(luò)中常見的優(yōu)化方法。
定義目標(biāo)函數(shù)在這個(gè)例子中,我們使用函數(shù)f來產(chǎn)生目標(biāo)結(jié)果t,但是對目標(biāo)結(jié)果加上一些高斯噪聲N(0, 0.2),其中N表示正態(tài)分布,均值是0,方差是0.2,f定義為f(x) = 2x,x是輸入?yún)?shù),回歸線的斜率是2,截距是0。所以最后的t = f(x) + N(0, 0.2)。
我們將產(chǎn)生20個(gè)均勻分布的數(shù)據(jù)作為數(shù)據(jù)樣本x,然后設(shè)計(jì)目標(biāo)結(jié)果t。下面的程序我們生成了x和t,以及畫出了他們之間的線性關(guān)系。
# Define the vector of input samples as x, with 20 values sampled from a uniform distribution # between 0 and 1 x = np.random.uniform(0, 1, 20) # Generate the target values t from x with small gaussian noise so the estimation won"t be perfect. # Define a function f that represents the line that generates t without noise def f(x): return x * 2 # Create the targets t with some gaussian noise noise_variance = 0.2 # Variance of the gaussian noise # Gaussian noise error for each sample in x noise = np.random.randn(x.shape[0]) * noise_variance # Create targets t t = f(x) + noise
# Plot the target t versus the input x plt.plot(x, t, "o", label="t") # Plot the initial line plt.plot([0, 1], [f(0), f(1)], "b-", label="f(x)") plt.xlabel("$x$", fontsize=15) plt.ylabel("$t$", fontsize=15) plt.ylim([0,2]) plt.title("inputs (x) vs targets (t)") plt.grid() plt.legend(loc=2) plt.show()定義損失函數(shù)
我們將優(yōu)化模型y = w * x中的參數(shù)w,使得對于訓(xùn)練集中的N個(gè)樣本,損失函數(shù)達(dá)到最小。
即,我們的優(yōu)化目標(biāo)是:
從函數(shù)中,我們可以發(fā)現(xiàn),我們將所有樣本的誤差都進(jìn)行了累加,這就是所謂的批訓(xùn)練(batch training)。我們也可以在訓(xùn)練的時(shí)候,每次訓(xùn)練一個(gè)樣本,這種方法在在線訓(xùn)練中非常常用。
我們利用以下函數(shù)畫出損失函數(shù)與權(quán)重的關(guān)系。從圖中,我們可以看出損失函數(shù)的值達(dá)到最小時(shí),w的值是2。這個(gè)值就是我們函數(shù)f(x)的斜率。這個(gè)損失函數(shù)是一個(gè)凸函數(shù),并且只有一個(gè)全局最小值。
nn(x, w)函數(shù)實(shí)現(xiàn)了神經(jīng)網(wǎng)絡(luò)模型,cost(y, t)函數(shù)實(shí)現(xiàn)了損失函數(shù)。
# Define the neural network function y = x * w def nn(x, w): return x*w # Define the cost function def cost(y, t): return ((t - y) ** 2).sum()優(yōu)化損失函數(shù)
對于教程中簡單的損失函數(shù),可能你看一眼就能知道最佳的權(quán)重是什么。但是對于復(fù)雜的或者更高維度的損失函數(shù),這就是我們?yōu)槭裁匆褂酶鞣N優(yōu)化方法的原因了。
在訓(xùn)練神經(jīng)網(wǎng)絡(luò)中,梯度下降算法是一種比較常用的優(yōu)化算法。梯度下降算法的原理是損失函數(shù)對于每個(gè)參數(shù)進(jìn)行求導(dǎo),并且利用負(fù)梯度對參數(shù)進(jìn)行更新。權(quán)重w通過循環(huán)進(jìn)行更新:
其中,w(k)表示權(quán)重w更新到第k步時(shí)的值,Δw為定義為:
其中,μ是學(xué)習(xí)率,它的含義是在參數(shù)更新的時(shí)候,每一步的跨度大小。?ξ/?w 表示損失函數(shù) ξ 對于 w 的梯度。對于每一個(gè)訓(xùn)練樣本i,我們可以利用鏈?zhǔn)揭?guī)則推導(dǎo)出對應(yīng)的梯度,如下:
其中,ξi是第i個(gè)樣本的損失函數(shù),因此,?ξi/?yi可以這樣進(jìn)行推導(dǎo):
因?yàn)?b>y(i) = x(i) ? w,所以我們對于?yi/?w可以這樣進(jìn)行推導(dǎo):
因此,對于第i個(gè)訓(xùn)練樣本,Δw的完整推導(dǎo)如下:
在批處理過程中,我們將所有的梯度都進(jìn)行累加:
在進(jìn)行梯度下降之前,我們需要對權(quán)重進(jìn)行一個(gè)初始化,然后再使用梯度下降算法進(jìn)行訓(xùn)練,最后直至算法收斂。學(xué)習(xí)率作為一個(gè)超參數(shù),需要多帶帶調(diào)試。
gradient(w, x, t)函數(shù)實(shí)現(xiàn)了梯度?ξ/?w,delta_w(w_k, x, t, learning_rate)函數(shù)實(shí)現(xiàn)了Δw。
# define the gradient function. Remember that y = nn(x, w) = x * w def gradient(w, x, t): return 2 * x * (nn(x, w) - t) # define the update function delta w def delta_w(w_k, x, t, learning_rate): return learning_rate * gradient(w_k, x, t).sum() # Set the initial weight parameter w = 0.1 # Set the learning rate learning_rate = 0.1 # Start performing the gradient descent updates, and print the weights and cost: nb_of_iterations = 4 # number of gradient descent updates w_cost = [(w, cost(nn(x, w), t))] # List to store the weight, costs values for i in range(nb_of_iterations): dw = delta_w(w, x, t, learning_rate) # Get the delta w update w = w - dw # Update the current weight parameter w_cost.append((w, cost(nn(x, w), t))) # Add weight, cost to list # Print the final w, and cost for i in range(0, len(w_cost)): print("w({}): {:.4f} cost: {:.4f}".format(i, w_cost[i][0], w_cost[i][1])) # output w(0): 0.1000 cost: 23.3917 w(1): 2.3556 cost: 1.0670 w(2): 2.0795 cost: 0.7324 w(3): 2.1133 cost: 0.7274 w(4): 2.1091 cost: 0.7273
從計(jì)算結(jié)果中,我們很容易的看出來了,梯度下降算法很快的收斂到了2.0左右,接下來可視化一下梯度下降過程。
# Plot the first 2 gradient descent updates plt.plot(ws, cost_ws, "r-") # Plot the error curve # Plot the updates for i in range(0, len(w_cost)-2): w1, c1 = w_cost[i] w2, c2 = w_cost[i+1] plt.plot(w1, c1, "bo") plt.plot([w1, w2],[c1, c2], "b-") plt.text(w1, c1+0.5, "$w({})$".format(i)) # Show figure plt.xlabel("$w$", fontsize=15) plt.ylabel("$xi$", fontsize=15) plt.title("Gradient descent updates plotted on cost function") plt.grid() plt.show()
上圖展示了梯度下降的可視化過程。圖中藍(lán)色的點(diǎn)表示在第k輪中w(k)的值。從圖中我們可以得知,w的值越來越收斂于2.0。該模型訓(xùn)練10次就能收斂,如下圖所示。
w = 0 # Start performing the gradient descent updates nb_of_iterations = 10 # number of gradient descent updates for i in range(nb_of_iterations): dw = delta_w(w, x, t, learning_rate) # get the delta w update w = w - dw # update the current weight parameter
# Plot the fitted line agains the target line # Plot the target t versus the input x plt.plot(x, t, "o", label="t") # Plot the initial line plt.plot([0, 1], [f(0), f(1)], "b-", label="f(x)") # plot the fitted line plt.plot([0, 1], [0*w, 1*w], "r-", label="fitted line") plt.xlabel("input x") plt.ylabel("target t") plt.ylim([0,2]) plt.title("input vs. target") plt.grid() plt.legend(loc=2) plt.show()
完整代碼,點(diǎn)擊這里
作者:chen_h
微信號 & QQ:862251340
簡書地址:https://www.jianshu.com/p/0da...
CoderPai 是一個(gè)專注于算法實(shí)戰(zhàn)的平臺,從基礎(chǔ)的算法到人工智能算法都有設(shè)計(jì)。如果你對算法實(shí)戰(zhàn)感興趣,請快快關(guān)注我們吧。加入AI實(shí)戰(zhàn)微信群,AI實(shí)戰(zhàn)QQ群,ACM算法微信群,ACM算法QQ群。長按或者掃描如下二維碼,關(guān)注 “CoderPai” 微信號(coderpai)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/41172.html
摘要:分類問題回到本系列的第一篇文章機(jī)器學(xué)習(xí)從入門到放棄之算法,在里面有這樣的一個(gè)問題黃點(diǎn)代表類電影的分布,綠色代表類電影的分布,紫色代表需要分類的電影樣本。 分類問題 回到本系列的第一篇文章機(jī)器學(xué)習(xí)從入門到放棄之KNN算法,在里面有這樣的一個(gè)問題 showImg(https://sfault-image.b0.upaiyun.com/106/875/1068758747-576918491...
摘要:對于多分類問題,我們使用函數(shù)來處理多項(xiàng)式回歸。概率方程表示輸出根據(jù)函數(shù)得到的值。最大似然估計(jì)可以寫成因?yàn)閷τ诮o定的參數(shù),去產(chǎn)生和,根據(jù)聯(lián)合概率我們又能將似然函數(shù)改寫成。 作者:chen_h微信號 & QQ:862251340微信公眾號:coderpai簡書地址:https://www.jianshu.com/p/abc... 這篇教程是翻譯Peter Roelants寫的神經(jīng)網(wǎng)絡(luò)教程...
閱讀 2325·2021-11-24 10:18
閱讀 3402·2021-09-22 15:35
閱讀 3348·2021-09-13 10:37
閱讀 3769·2021-09-06 15:14
閱讀 2074·2021-09-06 15:02
閱讀 2220·2021-09-02 15:11
閱讀 552·2019-08-30 15:53
閱讀 3079·2019-08-29 16:15