1. 程式人生 > >機器學習筆記(六)神經網路引入及多分類問題實踐

機器學習筆記(六)神經網路引入及多分類問題實踐

一、 神經網路引入

我們將從計算機視覺直觀的問題入手,提出引入非線性分類器的必要性。首先,我們希望計算機能夠識別圖片中的車。顯然,這個問題對於計算機來說是很困難的,因為它只能看到畫素點的數值。

應用機器學習,我們需要做的就是提供大量帶標籤的圖片作為訓練集,有的圖片是一輛車,有的圖片不是一輛車,最終我們希望我們給出一張圖片,計算機可以準確地告訴我們這是不是一輛車。

顯然這需要一個非線性分類模型。相對於Logistic模型,神經網路被證明是更好的非線性分類模型。

1. 神經元結構

下面我們來看單獨的一個神經元:

這是我們人體的神經元結構,神經元是一個基本的資訊計算單元,神經元之間輸出與輸入通道依次相互連線完成資訊的傳遞,我們在計算機中模擬這種複雜的結構與資訊傳遞機制,下面是一個非常簡單的人工神經網路模型的例子。

這是一個單個神經元,在繪製神經網路時,通常只繪製輸入節點,必要時增加一個額外的節點,這個節點有時被稱作偏置單元或偏置神經元。另外,在神經網路描述中,我們使用術語“啟用函式”(表示為)、“權重”,代替“模型”(Sigmoid)和“引數”(theta)。神經網路實際上就是多個神經元連線在一起的集合。

第一層稱為輸入層,最後一層稱為輸出層,因為它輸出假設(hyoptheses)的最終計算結果,中間層稱為隱藏層因為在監督學習中,我們看不到中間層的輸出與輸出是什麼。

強調一些重要引數:


:第 j 層的第 i 個神經元或單元的啟用項

:權重(矩陣),它控制從第 j 層到第 j+1 層的權重 map。

控制著從三個輸入單元到三個隱藏單元的對映引數矩陣,。如果一個神經網路在第 j 層有個單元,在 j+1 層有個單元,則的維度為

2. 向量化

對應圖中所做標記:

  1. 我們給出定義:其中上標 (2) 代表,它們與神經網路的第二層相關,此處 z 表示式為輸入值的加權線性組合。
  2. 如圖右,將向量化表示後,我們可以將表示成,在此基礎上對的每個元素求函式值得到,所以它們的維度相同。
  3. 表示成
  4. 現在我們經計算得到了的值,還需新增偏置單元
  5. 特別地是輸出層唯一的單元,是一個實數。

這個計算的過程,被稱為“向前傳播”,因為我們從輸入單元的啟用項開始,進行向前傳播給隱藏層,計算隱藏層的啟用項,繼續向前傳播並計算輸出層的啟用項。這種從輸入層到隱藏層再到輸出層的過程叫做向前傳播。

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)

 總結:學過本章的課程,通過自己簡單的動手實踐,對神經網路的基本結構、完成其功能的工作方式有了初步的認識(即拿到權重矩陣如何去預測樣本),在下一章會進一步去學習如何去進行神經網路的訓練得到權重矩陣。