關于線性
線性的概念:
“線性”=“齊次性” “可加性”,
"齊次性"是指類似于: f(ax)=af(x),
"可加性"是指類似于: f(x y)=f(x) f(y),
而對于單層感知器來說,是無法處理非線性的問題。非線性及不符合上述的條件的集合。
例如異或問題:

無法找到一個合適的直線,將兩邊分離開來。
所以這時候就需要用到了delta法則。
##delta法則
delta 法則的關鍵思想是使用梯度下降(gradient descent)來搜索可能權向量的假設空間, 以找到最佳擬合訓練樣例的權向量。
由于在真實情況下,并不能保證訓練集是線性可分的。因而,當訓練集線性不可分時該如何訓練感知器呢?這時我們使用delta法則,通過這種方式可以找出收斂到目標的最佳近似值。
其原理是:

因為其激活函數是線性的,所以一般被稱為線性單元。
激活函數:

用向量表示就是:

當然在這一種情況下,還需要考慮其每次計算后的結果的誤差,根據誤差來調整權值。
而這就需要用到代價函數:

其中y為期望輸出,y`為實際輸出。
在求得誤差結果最小的情況下,就是我們所求的最優解。注:這里的1/2只是為了后面的計算方便,沒有實際意義。
為了求得代價函數最小,因為:

對路所有的樣本的誤差和來說:

所以公式可以改寫為:

因為對于樣本來說(其實是監督學習的方式),x和y都是已知的,所以上述的公式中其實就是w和E(w)的關系。對整個代價函數來說,其實只有一個變量w。
這樣如果想要獲取E(w)的最小值,及誤差最小,只需要獲取的上述變量的最小值即可。因此我們可以使用導數的方式來求取最小值。當然計算機是不會解方程的,所以只能是一步一步的嘗試出最小值。
因此引進梯度下降算法:

通過不斷的改變w的值,來找到使得E(w)最小的位置:

對w求導結果:

這樣就獲取的權值調整公式。
我們可以來看一下推斷出來的公式和上一章的單層感知器的差異:

其實只有激活函數不一樣!!!
下面舉個簡單的例子說明一下:
問題
輸入一組工作年限 [[5], [3], [8], [1.4], [10.1]];
期望輸出其代表的年薪:[5500, 2300, 7600, 1800, 11400]
通過隨意輸入一個工作年限來預算其的年薪。
代碼
# coding=utf-8
# numpy 支持高級大量的維度數組與矩陣運算
import numpy as np
# Matplotlib 是一個 Python 的 2D繪圖庫
import matplotlib.pyplot as plt
#定義坐標,設定5組輸入數據,每組為(x0,x1,)
X=np.array([[1,5],
[1,3],
[1,8],
[1,1.4],
[1,10.1]]);
#設定輸入向量的期待輸出值
Y=np.array([5500,2300,7600,1800,11400]);
#設定權值向量(w0,w1)
W = np.array([0,0]);
#設定學習率
lr = 0.01;
#計算迭代次數
n=0;
#神經網絡輸出
O=0;
def updateW():
global X,Y,W,lr,n;
n =1;
O=np.dot(X,W.T);
#計算權值
W_Tmp = lr*((Y-O.T).dot(X))/int(X.shape[0]);
#更新權值向量
W = W W_Tmp;
def draw():
global W;
x1=[5,3,8,1.4,10.1];
y1=[5500,2300,7600,1800,11400];
#繪制分割線需要的等差數列
x=np.linspace(0,12);
#創建子圖
plt.figure();
#根據坐標繪圖 激活函數:y=x1W1 w0
plt.plot(x,x*W[1] W[0],'r');
plt.plot(x1,y1,'*');
plt.show();
if __name__ == '__main__':
#設置迭代次數
for index in range (100):
updateW();
#獲取組合器輸出結果
O=np.dot(X,W.T);
#打印 實際值
print O;
draw();
執行結果:

參考:
線性學習器
https://blog.csdn.net/wasd6081058/article/details/7886697
零基礎入門深度學習(2) - 線性單元和梯度下降(寫的非常通俗易懂!!!感謝作者)
https://www./hanbingtao/note/448086
網易視頻課程——深度學習入門系列
http://study.163.com/course/courseMain.htm?courseId=1004111045
來源:http://www./content-1-24611.html
|