【机器学习】神经网络(一)——多类分类问题

一、问题引入
早在监督学习中我们已经使用Logistic回归很好地解决二类分类问题。但现实生活中,更多的是多类分类问题(比如识别10个手写数字)。本文引入神经网络模型解决多类分类问题。

二、神经网络模型介绍

神经网络模型是一个非常强大的模型,起源于尝试让机器模仿大脑的算法,在80年代和90年代早期非常流行。同时它又是一个十分复杂的模型,导致其计算量非常巨大,所以在90年代后期逐渐衰落。近年来得益于计算机硬件能力,又开始流行起来。人类的大脑是一个十分神奇的东西,尽管当今人工智能科技已经十分发达,但很大程度上,无论建立一个多么完美的模型,其学习能力目前仍然逊色于大脑。因此神经网络是人工智能领域的一个热门研究方向。
1.神经网络模型
为了描述神经网络模型,我们先从最简单的神经网络讲起,这个神经网络仅由一个“神经元”构成,以下即是这个“神经元”的图示:
这里写图片描述
其中x1, x2, x3称为输入(来自与其他神经元的输入信号), x0称为偏置单元(bias unit), θ称为权重或参数, hθ(x)称为激活函数(activation function), 这里的激活函数用了sigmoid(logistic) 函数:这里写图片描述
多个神经元组合在一起,便形成了神经网络,如下图:
这里写图片描述
第一层称为输入层(input layer),第二层是隐藏层(hidden layer),第三层是输出层(output layer),注意输入层和隐藏层都存在一个偏置单元(bias unit)。其中,x0 是第一层的偏置单元(设置为1),这里写图片描述是对应该偏置单元 x0 的权值;这里写图片描述是第二层的偏置单元,这里写图片描述是对应的权值。 以此类推,这里写图片描述是第j层的第i个激活函数,这里写图片描述从第j层映射到第j+1层的控制函数的权重矩阵。计算激活值时(以这里写图片描述为例)按照下式计算:
这里写图片描述
以此类推,上述神经网络模型可表示为:
这里写图片描述
从该计算过程可以看出,神经网络在对样本进行预测时,是从第一层(输入层)开始,层层向前计算激活值,直观上看这是一种层层向前传播特征或者说层层向前激活的过程,最终计算出这里写图片描述,这个过程称之为前向传播(forward propagation)。
其实,激活函数的作用可以看作是从原始特征学习出新特征,或者说是将原始特征从低维空间映射到高维空间。一开始也许无法很好的理解激活函数的意义和作用,但一定要记住,引入激活函数是神经网络具有优异性能的关键所在,多层级联的结构加上激活函数,令多层神经网络可以逼近任意函数,从而可以学习出非常复杂的假设函数。

2.学习布尔代数

(1)学习AND
AND运算应该非常熟悉了,表达式如下:
这里写图片描述
真值表如下:
这里写图片描述
我们可以用以下模型学习AND函数:
这里写图片描述
输出函数可用下式表示:
这里写图片描述
当我们依次按照真值表把输入值代入此式,并根据sigmoid函数的性质,得到:
这里写图片描述

(2)学习OR函数
同样地,学习OR函数的模型如下:
这里写图片描述
根据真值表输入这个模型,得到:
这里写图片描述

(3)学习NOT函数
这里写图片描述
这里写图片描述

(4)学习XOR(异或)函数
学习XOR函数就不能使用单层神经网络实现了。因为XOR函数不是线性可分的(如图所示,无法画一条直线把0和1输出值分开)
这里写图片描述
单层神经网络只能近似学习线性函数,而XOR函数需要先转化AND、OR、NOT函数组合再建立多层神经网络模型。

3.多类分类问题
对于一张输入图片,需要识别其属于行人、轿车、摩托车或者卡车中的一个类型,就是一个多类分类的问题。用神经网络表示如下:
这里写图片描述
可以说,神经网络就是由一个个逻辑回归模型连接而成的,它们彼此作为输入和输出。最终输出结果可表示为:
这里写图片描述
这与之前逻辑回归中的多类分类表示不同,在逻辑回归中,输出y属于类似于{1, 2, 3, 4}中的某个值,而这里输出的是一个向量。因此,神经网络解决多类分类问题的本质是把原分类问题分解为一类对其他类(one-vs-all)的二类分类问题。
神经网络比直接使用Logistic回归的优势在于:如果给定基础特征的数量为100,那么在利用Logistic回归解决复杂分类问题时会遇到特征项爆炸增长,造成过拟合以及运算量过大问题。而对于神经网络,可以通过隐藏层数量和隐藏单元数量来控制假设函数的复杂程度,并且在计算时只计算一次项特征变量。其实本质上来说,神经网络是通过这样一个网络结构隐含地找到了所需要的高次特征项,从而化简了繁重的计算。

三、代码实现
1.计算激活值

function p = predict(Theta1, Theta2, X)
m = size(X, 1);
num_labels = size(Theta2, 1);
a1 = [ones(m,1), X];
a2 = sigmoid(a1 * Theta1');
a2 = [ones(m,1), a2];
a3 = sigmoid(a2 * Theta2');
[~, p] = max(a3, [], 2);
end

这里我们构建的神经网络有单个隐藏层。

2.导入数据并识别
(1)先导入图像数据

%% =========== Part 1: Loading and Visualizing Data =============
%  We start the exercise by first loading and visualizing the dataset. 
%  You will be working with a dataset that contains handwritten digits.
%

% Load Training Data
fprintf('Loading and Visualizing Data ...\n')

load('ex3data1.mat');
m = size(X, 1);

% Randomly select 100 data points to display
sel = randperm(size(X, 1));
sel = sel(1:100);

displayData(X(sel, :));

fprintf('Part 1 Program paused. Press enter to continue.\n');
pause;

这里写图片描述
图中都是一些手写的数字。

(2)导入模型参数

%% ================ Part 2: Loading Pameters ================
% In this part of the exercise, we load some pre-initialized 
% neural network parameters.

fprintf('\nLoading Saved Neural Network Parameters ...\n')

% Load the weights into variables Theta1 and Theta2
load('ex3weights.mat');

(3)对手写数字进行识别

%% ================= Part 3: Implement Predict =================
%  After training the neural network, we would like to use it to predict
%  the labels. You will now implement the "predict" function to use the
%  neural network to predict the labels of the training set. This lets
%  you compute the training set accuracy.

pred = predict(Theta1, Theta2, X);

fprintf('\nTraining Set Accuracy: %f\n', mean(double(pred == y)) * 100);

fprintf('Part 3 Program paused. Press enter to continue.\n');
pause;

%  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
    fprintf('Program paused. Press enter to continue.\n');
    pause;
end

运行效果如下:
这里写图片描述这里写图片描述这里写图片描述这里写图片描述
很好玩吧!这就是一个比较完备的手写数字识别器了。

四、总结
以上建立的神经网络的权重参数都是已经给好的。那么这些参数是如何得到的呢?下一篇博文会介绍学习这些权重参数的算法。

发布了30 篇原创文章 · 获赞 97 · 访问量 21万+

猜你喜欢

转载自blog.csdn.net/HerosOfEarth/article/details/52165133