摘要:那么,概率將是神經網絡輸出的,即。函數實現了函數,函數實現了損失函數,實現了神經網絡的輸出結果,實現了神經網絡的預測結果。
作者:chen_h
微信號 & QQ:862251340
微信公眾號:coderpai
簡書地址:https://www.jianshu.com/p/d94...
這篇教程是翻譯Peter Roelants寫的神經網絡教程,作者已經授權翻譯,這是原文。
該教程將介紹如何入門神經網絡,一共包含五部分。你可以在以下鏈接找到完整內容。
(一)神經網絡入門之線性回歸
Logistic分類函數
(二)神經網絡入門之Logistic回歸(分類問題)
(三)神經網絡入門之隱藏層設計
Softmax分類函數
(四)神經網絡入門之矢量化
(五)神經網絡入門之構建多層網絡
Logistic回歸(分類問題)這部分教程將介紹一部分:
Logistic分類模型
我們在上次的教程中給出了一個很簡單的模型,只有一個輸入和一個輸出。在這篇教程中,我們將構建一個二分類模型,輸入參數是兩個變量。這個模型在統計上被稱為Logistic回歸模型,網絡結構可以被描述如下:
我們先導入教程需要使用的軟件包。
import numpy as np import matplotlib.pyplot as plt from matplotlib.colors import colorConverter, ListedColormap from matplotlib import cm定義類分布
在教程中,目標分類t將從兩個獨立分布中產生,當t=1時,用藍色表示。當t=0時,用紅色表示。輸入參數X是一個N*2的矩陣,目標分類t是一個N * 1的向量。更直觀的表現,見下圖。
# Define and generate the samples nb_of_samples_per_class = 20 # The number of sample in each class red_mean = [-1,0] # The mean of the red class blue_mean = [1,0] # The mean of the blue class std_dev = 1.2 # standard deviation of both classes # Generate samples from both classes x_red = np.random.randn(nb_of_samples_per_class, 2) * std_dev + red_mean x_blue = np.random.randn(nb_of_samples_per_class, 2) * std_dev + blue_mean # Merge samples in set of input variables x, and corresponding set of output variables t X = np.vstack((x_red, x_blue)) t = np.vstack((np.zeros((nb_of_samples_per_class,1)), np.ones((nb_of_samples_per_class,1))))
# Plot both classes on the x1, x2 plane plt.plot(x_red[:,0], x_red[:,1], "ro", label="class red") plt.plot(x_blue[:,0], x_blue[:,1], "bo", label="class blue") plt.grid() plt.legend(loc=2) plt.xlabel("$x_1$", fontsize=15) plt.ylabel("$x_2$", fontsize=15) plt.axis([-4, 4, -4, 4]) plt.title("red vs. blue classes in the input space") plt.show()Logistic函數和交叉熵損失函數
我們設計的網絡的目的是從輸入的x去預測目標t。假設,輸入x = [x1, x2],權重w = [w1, w2],預測目標t = 1。那么,概率P(t = 1|x, w)將是神經網絡輸出的y,即y = σ(x?wT)。其中,σ表示Logistic函數,定義如下:
如果,對于Logistic函數和它的導數還不是很清楚的,可以查看這個教程,里面進行了詳細描述。
對于這個分類問題的損失函數優化,我們使用交叉熵誤差函數來解決,對于每個訓練樣本i,交叉熵誤差函數定義如下:
如果我們要計算整個訓練樣本的交叉熵誤差,那么只需要把每一個樣本的值進行累加就可以了,即:
關于交叉熵誤差函數更加詳細的介紹可以看這個教程。
logistic(z)函數實現了Logistic函數,cost(y, t)函數實現了損失函數,nn(x, w)實現了神經網絡的輸出結果,nn_predict(x, w)實現了神經網絡的預測結果。
# Define the logistic function def logistic(z): return 1 / (1 + np.exp(-z)) # Define the neural network function y = 1 / (1 + numpy.exp(-x*w)) def nn(x, w): return logistic(x.dot(w.T)) # Define the neural network prediction function that only returns # 1 or 0 depending on the predicted class def nn_predict(x,w): return np.around(nn(x,w)) # Define the cost function def cost(y, t): return - np.sum(np.multiply(t, np.log(y)) + np.multiply((1-t), np.log(1-y)))
# Plot the cost in function of the weights # Define a vector of weights for which we want to plot the cost nb_of_ws = 100 # compute the cost nb_of_ws times in each dimension ws1 = np.linspace(-5, 5, num=nb_of_ws) # weight 1 ws2 = np.linspace(-5, 5, num=nb_of_ws) # weight 2 ws_x, ws_y = np.meshgrid(ws1, ws2) # generate grid cost_ws = np.zeros((nb_of_ws, nb_of_ws)) # initialize cost matrix # Fill the cost matrix for each combination of weights for i in range(nb_of_ws): for j in range(nb_of_ws): cost_ws[i,j] = cost(nn(X, np.asmatrix([ws_x[i,j], ws_y[i,j]])) , t) # Plot the cost function surface plt.contourf(ws_x, ws_y, cost_ws, 20, cmap=cm.pink) cbar = plt.colorbar() cbar.ax.set_ylabel("$xi$", fontsize=15) plt.xlabel("$w_1$", fontsize=15) plt.ylabel("$w_2$", fontsize=15) plt.title("Cost function surface") plt.grid() plt.show()
梯度下降算法的工作原理是損失函數ξ對于每一個參數的求導,然后沿著負梯度方向進行參數更新。
參數w按照一定的學習率沿著負梯度方向更新,即w(k+1)=w(k)?Δw(k+1),其中Δw可以表示為:
對于每個訓練樣本i,?ξi/?w計算如下:
其中,yi=σ(zi)是神經元的Logistic輸出,zi=xi?wT是神經元的輸入。
在詳細推導損失函數對于權重的導數之前,我們先這個教程中摘取幾個推導。
參考上面的分步推導,我們可以得到下面的詳細推導:
因此,對于每個權重的更新Δwj可以表示為:
在批處理中,我們需要將N個樣本的梯度都進行累加,即:
在開始梯度下降算法之前,你需要對參數都進行一個隨機數賦值過程,然后采用梯度下降算法更新參數,直至收斂。
gradient(w, x, t)函數實現了梯度?ξ/?w,delta_w(w_k, x, t, learning_rate)函數實現了Δw。
# define the gradient function. def gradient(w, x, t): return (nn(x, w) - t).T * x # define the update function delta w which returns the # delta w for each weight in a vector def delta_w(w_k, x, t, learning_rate): return learning_rate * gradient(w_k, x, t)
我們在訓練集X上面運行10次去做預測,下圖中畫出了前三次的結果,圖中藍色的點表示在第k次,w(k)的值。
# Set the initial weight parameter w = np.asmatrix([-4, -2]) # Set the learning rate learning_rate = 0.05 # Start the gradient descent updates and plot the iterations nb_of_iterations = 10 # Number of gradient descent updates w_iter = [w] # List to store the weight values over the iterations 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 weights w_iter.append(w) # Store the weights for plotting
# Plot the first weight updates on the error surface # Plot the error surface plt.contourf(ws_x, ws_y, cost_ws, 20, alpha=0.9, cmap=cm.pink) cbar = plt.colorbar() cbar.ax.set_ylabel("cost") # Plot the updates for i in range(1, 4): w1 = w_iter[i-1] w2 = w_iter[i] # Plot the weight-cost value and the line that represents the update plt.plot(w1[0,0], w1[0,1], "bo") # Plot the weight cost value plt.plot([w1[0,0], w2[0,0]], [w1[0,1], w2[0,1]], "b-") plt.text(w1[0,0]-0.2, w1[0,1]+0.4, "$w({})$".format(i), color="b") w1 = w_iter[3] # Plot the last weight plt.plot(w1[0,0], w1[0,1], "bo") plt.text(w1[0,0]-0.2, w1[0,1]+0.4, "$w({})$".format(4), color="b") # Show figure plt.xlabel("$w_1$", fontsize=15) plt.ylabel("$w_2$", fontsize=15) plt.title("Gradient descent updates on cost surface") plt.grid() plt.show()
下列代碼,我們將訓練的結果進行可視化。
# Plot the resulting decision boundary # Generate a grid over the input space to plot the color of the # classification at that grid point nb_of_xs = 200 xs1 = np.linspace(-4, 4, num=nb_of_xs) xs2 = np.linspace(-4, 4, num=nb_of_xs) xx, yy = np.meshgrid(xs1, xs2) # create the grid # Initialize and fill the classification plane classification_plane = np.zeros((nb_of_xs, nb_of_xs)) for i in range(nb_of_xs): for j in range(nb_of_xs): classification_plane[i,j] = nn_predict(np.asmatrix([xx[i,j], yy[i,j]]) , w) # Create a color map to show the classification colors of each grid point cmap = ListedColormap([ colorConverter.to_rgba("r", alpha=0.30), colorConverter.to_rgba("b", alpha=0.30)]) # Plot the classification plane with decision boundary and input samples plt.contourf(xx, yy, classification_plane, cmap=cmap) plt.plot(x_red[:,0], x_red[:,1], "ro", label="target red") plt.plot(x_blue[:,0], x_blue[:,1], "bo", label="target blue") plt.grid() plt.legend(loc=2) plt.xlabel("$x_1$", fontsize=15) plt.ylabel("$x_2$", fontsize=15) plt.title("red vs. blue classification boundary") plt.show()
完整代碼,點擊這里
作者:chen_h
微信號 & QQ:862251340
簡書地址:https://www.jianshu.com/p/d94...
CoderPai 是一個專注于算法實戰的平臺,從基礎的算法到人工智能算法都有設計。如果你對算法實戰感興趣,請快快關注我們吧。加入AI實戰微信群,AI實戰QQ群,ACM算法微信群,ACM算法QQ群。長按或者掃描如下二維碼,關注 “CoderPai” 微信號(coderpai)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/41174.html
摘要:對于多分類問題,我們使用函數來處理多項式回歸。概率方程表示輸出根據函數得到的值。最大似然估計可以寫成因為對于給定的參數,去產生和,根據聯合概率我們又能將似然函數改寫成。 作者:chen_h微信號 & QQ:862251340微信公眾號:coderpai簡書地址:https://www.jianshu.com/p/abc... 這篇教程是翻譯Peter Roelants寫的神經網絡教程...
摘要:對于多分類問題,我們可以使用多項回歸,該方法也被稱之為函數。函數的交叉熵損失函數的推導損失函數對于的導數求解如下上式已經求解了當和的兩種情況。最終的結果為,這個求導結果和函數的交叉熵損失函數求導是一樣的,再次證明函數是函數的一個擴展板。 作者:chen_h微信號 & QQ:862251340微信公眾號:coderpai簡書地址:https://www.jianshu.com/p/8eb...
摘要:神經網絡的模型結構為,其中是輸入參數,是權重,是預測結果。損失函數我們定義為對于損失函數的優化,我們采用梯度下降,這個方法是神經網絡中常見的優化方法。函數實現了神經網絡模型,函數實現了損失函數。 作者:chen_h微信號 & QQ:862251340微信公眾號:coderpai簡書地址:https://www.jianshu.com/p/0da... 這篇教程是翻譯Peter Roe...
摘要:在這個教程中,我們也將設計一個二分類神經網絡模型,其中輸入數據是一個維度,隱藏層只有一個神經元,并且使用非線性函數作為激活函數,模型結構能用圖表示為我們先導入教程需要使用的軟件包。 作者:chen_h微信號 & QQ:862251340微信公眾號:coderpai簡書地址:https://www.jianshu.com/p/8e1... 這篇教程是翻譯Peter Roelants寫的...
閱讀 2436·2019-08-30 15:52
閱讀 2237·2019-08-30 12:51
閱讀 2833·2019-08-29 18:41
閱讀 2812·2019-08-29 17:04
閱讀 814·2019-08-29 15:11
閱讀 1720·2019-08-28 18:02
閱讀 3603·2019-08-26 10:22
閱讀 2510·2019-08-26 10:12