一、 神經網絡引入
我們將從計算機視覺直觀的問題入手,提出引入非線性分類器的必要性。首先,我們希望計算機能夠識別圖片中的車。顯然,這個問題對於計算機來說是很困難的,因為它只能看到像素點的數值。
應用機器學習,我們需要做的就是提供大量帶標簽的圖片作為訓練集,有的圖片是一輛車,有的圖片不是一輛車,最終我們希望我們給出一張圖片,計算機可以准確地告訴我們這是不是一輛車。
顯然這需要一個非線性分類模型。相對於Logistic模型,神經網絡被證明是更好的非線性分類模型。
1. 神經元結構
下面我們來看單獨的一個神經元:
這是我們人體的神經元結構,神經元是一個基本的信息計算單元,神經元之間輸出與輸入通道依次相互連接完成信息的傳遞,我們在計算機中模擬這種復雜的結構與信息傳遞機制,下面是一個非常簡單的人工神經網絡模型的例子。
這是一個單個神經元,在繪制神經網絡時,通常只繪制輸入節點,必要時增加一個額外的節點
,這個
節點有時被稱作偏置單元或偏置神經元。另外,在神經網絡描述中,我們使用術語“激活函數”(表示為
)、“權重”,代替“模型”(Sigmoid)和“參數”(theta)。神經網絡實際上就是多個神經元連接在一起的集合。
第一層稱為輸入層,最后一層稱為輸出層,因為它輸出假設(hyoptheses)的最終計算結果,中間層稱為隱藏層因為在監督學習中,我們看不到中間層的輸出與輸出是什么。
強調一些重要參數:
:第 j 層的第 i 個神經元或單元的激活項
:權重(矩陣),它控制從第 j 層到第 j+1 層的權重 map。
控制着從三個輸入單元到三個隱藏單元的映射參數矩陣,
。如果一個神經網絡在第 j 層有
個單元,在 j+1 層有
個單元,則
的維度為
。
2. 矢量化
對應圖中所做標記:
- 我們給出定義:
其中上標 (2) 代表,它們與神經網絡的第二層相關,此處 z 表達式為輸入值的加權線性組合。
- 如圖右,將
向量化表示后,我們可以將
表示成
,在此基礎上對
的每個元素求
函數值得到
,所以它們的維度相同。
- 將
表示成
。
- 現在我們經計算得到了
的值,還需添加偏置單元
。
- 特別地
是輸出層唯一的單元,是一個實數。
這個計算的過程,被稱為“向前傳播”,因為我們從輸入單元的激活項開始,進行向前傳播給隱藏層,計算隱藏層的激活項,繼續向前傳播並計算輸出層的激活項。這種從輸入層到隱藏層再到輸出層的過程叫做向前傳播。
4. 例:用神經網絡進行簡單計算:
我們希望學習一個非線性的決策邊界來區分正負樣本,神經網絡將怎樣做到呢?我們將右側復雜的數據簡化為左側僅有四個樣本的情況。我們需要計算目標函數或者
(前者取反)。
,當兩個式子中恰好有一個為真時,表達式為真。
,當兩個式子同時為真或同時為假時,表達式為真。
我們該建立一個怎樣的神經網絡來你和這樣的訓練集呢?
為了能擬合XNOR運算,我們從能夠擬合AND運算的網絡入手,首先我們划出一個簡單的神經網絡模型,賦值權重,如下圖左側。
將右下方表格所列出的值一一帶入,對應 g(z) 圖像,得到假設函數的值。觀察發現,
。通過寫出上圖右下這樣的真值表,我們就能看到神經網絡所計算的邏輯函數取值情況。下面的過程實現了邏輯或運算:
邏輯非運算:
這三個例子為我們展示了一個單個神經元的神經網絡,是如何實現計算單一的邏輯操作,如。下面我們將看到一個多層的神經網絡模型是如何被用來計算更復雜的函數的。
最后根據真值表我們可以得出,這個神經網絡最終會得到一個非線性的決策邊界,用以計算XNOR函數。
二、實踐:多分類問題:
如果我們需要識別一張圖片的內容是一個人、一輛小汽車、一個摩托還是一輛貨車,我們可能會建立如下模型,其中輸出層組成一個四維向量,由值為1的元素位置可以看出分類結果。
至此我們對於神經網絡有了基本的一些了解,然而感覺在知識的銜接和神經網絡發展的歷程還不是很清晰,下面的博文中有着特別好的講解,使我們加深理解。
https://www.cnblogs.com/subconscious/p/5058741.html
編程作業:多元分類與神經網絡
用Logistic回歸和神經網絡識別手寫數字(0-9)
訓練集為5000個20 x 20-pixel 的手寫數字,讀入格式化后的數據(矩陣X),每一行為一個圖片的400個像素。結合課堂作業一章詳細的英文講解以及,文件資料中對每一個函數完成功能的英文注釋,我們可以較容易地完成代碼編寫。首先看一下需要完成的四個函數:
lrCostFunction.m Regularized logistic regression
oneVsAll.m One-vs-all classifier training
predictOneVsAll.m One-vs-all classifier prediction
predict.m Neural network prediction function
我們先來可以看一下部分訓練集長什么樣子:
首先,第一個函數lrCostFunction.m 文件看着無比眼熟,沒錯這個和上一篇的costfunctionReg.m 是一模一樣的。計算代價函數和梯度,使用向量化的思想簡化計算,包含正則化項。
function [J, grad] = lrCostFunction(theta, X, y, lambda) %LRCOSTFUNCTION Compute cost and gradient for logistic regression with %regularization % J = LRCOSTFUNCTION(theta, X, y, lambda) computes the cost of using % theta as the parameter for regularized logistic regression and the % gradient of the cost w.r.t. to the parameters. m = length(y); % number of training examples J = 0; grad = zeros(size(theta)); J = 1/m * (-y' * log(sigmoid(X*theta)) - (1 - y') * log(1 - sigmoid(X * theta))) + lambda/2/m*sum(theta(2:end).^2); grad(1,:) = 1/m * (X(:, 1)' * (sigmoid(X*theta) - y)); grad(2:size(theta), :) = 1/m * (X(:, 2:size(theta))' * (sigmoid(X*theta) - y))... + lambda/m*theta(2:size(theta), :); grad = grad(:); end
在Logistic課程筆記中,我們了解到一對多問題的基本概念就是把多個分類轉化為二元分類的問題。分類的過程實際上是求出該樣本屬於每一個類的概率,而函數oneVsAll.m 的作用就是求出這10次預測產生10組 值,每一組作為一行,以矩陣的形式返回。
function [all_theta] = oneVsAll(X, y, num_labels, lambda) m = size(X, 1); n = size(X, 2); all_theta = zeros(num_labels, n + 1); X = [ones(m, 1) X]; % ======================================== % Instructions: You should complete the following code to train num_labels % logistic regression classifiers with regularization % parameter lambda. % % Hint: theta(:) will return a column vector. % % Hint: You can use y == c to obtain a vector of 1's and 0's that tell you % whether the ground truth is true/false for this class % ========================================= options = optimset('GradObj', 'on', 'MaxIter', 400); for i = 1 : num_labels [all_theta(i,:), J, exit_flag] = ... fminunc(@(t)(lrCostFunction(t, X, (y==i), lambda)), all_theta(i,:)', options); end end
有了這些 值,我們就有了訓練好的分類器,接下來可以預測一個圖片是什么數字了。我們可以先分別算出將該圖片判斷為10類中每一類的概率(用sigmoid函數計算概率),取最大值對應的類別作為判別結果。
function p = predictOneVsAll(all_theta, X) m = size(X, 1); num_labels = size(all_theta, 1); p = zeros(size(X, 1), 1); X = [ones(m, 1) X]; [M,p]=max(sigmoid(X * all_theta'),[],2);%在第2維方向上取最大值,結果/每行最大值的列位置。 end
運行ex3.m最終得到訓練集預測准確率為96.46%。
%ex3.m partof input_layer_size = 400; % 20x20 Input Images of Digits num_labels = 10; % 10 labels, from 1 to 10 % (note that we have mapped "0" to label 10) %% =========== Part 1: Loading and Visualizing Data ============= % Load Training Data load('ex3data1.mat'); % training data stored in arrays X, y m = size(X, 1); %% ============ Part 2b: One-vs-All Training ============ fprintf('\nTraining One-vs-All Logistic Regression...\n') lambda = 0.1; [all_theta] = oneVsAll(X, y, num_labels, lambda); %% ================ Part 3: Predict for One-Vs-All ================ pred = predictOneVsAll(all_theta, X); fprintf('\nTraining Set Accuracy: %f\n', mean(double(pred == y)) * 100);
下一個部分就是將剛剛學到的多元分類運用到神經網絡中啦!主要工作是建立一個三層的神經網絡,而且作業里已經有了Theta1 和 Theta2, 分別是 25*401 和 10*26 的矩陣(Theta矩陣的維度為 。先來看一下我們需要建立的三層神經網絡模型:
根據圖示。結合上面矢量化部分所講的計算過程,完成predict.m函數的功能,注意添加偏置單元和矢量化過程。
function p = predict(Theta1, Theta2, X) %PREDICT Predict the label of an input given a trained neural network % p = PREDICT(Theta1, Theta2, X) outputs the predicted label of X given the % trained weights of a neural network (Theta1, Theta2) m = size(X, 1); num_labels = size(Theta2, 1); p = zeros(size(X, 1), 1); a1 = [ones(m, 1) X]; a2 = [ones(m, 1) sigmoid(a1*Theta1')]; [x, p] = max(sigmoid(a2*Theta2'), [], 2); end
結果 Training Set Accuracy: 97.520000
最后一段代碼我們可以拿出每一張圖片來看程序將其識別,就還挺有趣的。
% To give you an idea of the network's output, you can also run % through the examples one at the a time to see what it is predicting. % Randomly permute examples rp = randperm(m); for i = 1:m % Display fprintf('\nDisplaying Example Image\n'); displayData(X(rp(i), :)); pred = predict(Theta1, Theta2, X(rp(i),:)); fprintf('\nNeural Network Prediction: %d (digit %d)\n', pred, mod(pred, 10)); % Pause with quit option s = input('Paused - press enter to continue, q to exit:','s'); if s == 'q' break end end
Neural Network Prediction: 7 (digit 7) Neural Network Prediction: 6 (digit 6)
總結:學過本章的課程,通過自己簡單的動手實踐,對神經網絡的基本結構、完成其功能的工作方式有了初步的認識(即拿到權重矩陣如何去預測樣本),在下一章會進一步去學習如何去進行神經網絡的訓練得到權重矩陣。