Neural Networks:Representation

神经网络:表述(Neural Networks:Representation)

神经元和大脑

Ng试图阐述神经网络与人脑网络的联系(大雾):大脑处理的方法可能是一个简单而完美的学习算法。
人工智能的梦想就是:有一天能制造出真正的智能机器。
而神经网络可能为我们打开一扇进入遥远的人工智能梦的窗户。

非线性假设

线性回归与逻辑回归的缺点:当特征太多,计算负荷会非常大,假如有100个特征,两两组合也需会构成接近5000个新特征。若要处理一个有50x50像素的图片,将所有像素视为特征,两两组合会有接近300万个特征。普通逻辑回归模型不能有效处理。这时需要神经网络。

模型表示(Model Representation)

神经元(neuron)

又叫”激活单元”(activation unit):每一个神经元是一个学习模型,采纳一些特征作为输入,根据本身模型提供一个输出。

  • $x1$,$x2$,$x3$是输入单元(input units)
  • $a_1^{(2)}$,$a_2^{(2)}$,$a_3^{(2)}$是中间单元,负责将数据进行处理,传递到下一层
  • 最后是输出单元,负责计算$h_\theta^{(x)}$
  • 中间的箭头上存在参数,又称为权重(weight)
  • 偏置单元$a_0^{(n)}$是一个单位向量

神经网络是许多逻辑单元按照不同层级组织起来的网络,每一层的输出变量都是下一层的输出变量。

标记法

  • $a_i^{(j)}$代表第j层的第i个激活单元。
  • $\theta^{(j)}$代表从第$j$层映射到第$j+1$层时的权重的矩阵,其尺寸为$S_{j+1}*S_j+1$,S代表激活单元数量,这是因为偏置单元的原因。

上图所示模型(前向传播算法),激活单元和输出分别表达为:

向量化

这幅图值表达了将一个训练实例喂给神经网络的情况。如果输入整个训练集,则需要进行向量化:

从输入开始推导,令:

计算后添加$a_0^{(2)}=1$。计算输出的值为

现在考虑输入整个数据集:

我们可以把$a$看成更为高级的特征值,也就是$x$ 的进化体,并且它们是由$x$与$\theta$ 决定的。因为是梯度下降的,所以$a$是变化的,并且变得越来越厉害,所以这些更高级的特征值远比仅仅将$x$次方厉害,也能更好地预测新数据。
这就是神经网络相比于逻辑回归和线性回归的优势。

直观理解

逻辑运算AND

$$X1,X2 \in {0,1}$$ $$y=x_1 \ AND \ x_2$$ $$\theta_0=-30,\theta_1=20,\theta_2=20$$ $$h_\theta(x)=g(-30+20x_1+20x_2)$$ 画出真值表和图像(略) $$h_\theta(x)\approx x_1\ AND \ x_2$$ ### 逻辑运算OR 原理同上,参数为: $$\theta_0=-10,\theta_1=20,\theta_2=20$$ ### 逻辑运算XNOR(同或) $$XNOR=(x_1 \ AND x_2) \ OR \ ((NOT \ x_1) \ AND \ (NOT \ x_2))$$ 首先构造一个$(NOT \ x_1) \ AND \ (NOT \ x_2)$的神经元: 参数为: $$\theta_0=10,\theta_1=-20,\theta_2=-20$$ 再将表示AND的神经元和表示$(NOT \ x_1) \ AND \ (NOT \ x_2)$的神经元通过$OR$进行组合:

按照这种方法我们可以构造越来越复杂的函数,得到更厉害的特征:

多类分类

要分为多少个类,输出层就会有多少个假设函数,每一个输入在每一个假设函数的输出就代表了这个输入为此类的概率,在输出选取最大值作为分类结果。

作业回顾

逻辑回归多类分类:

lrCostFunction:

1
2
3
4
5
6
7
8
9
function [J, grad] = lrCostFunction(theta, X, y, lambda)
m = length(y);
J = 0;
grad = zeros(size(theta));
J = 1/m * sum(-y.*(log(sigmoid(X*theta)))-(1-y).*log(1-sigmoid(X*theta))) + lambda/(2*m)*(sum(theta.*theta) - theta(1)*theta(1));
grad = 1/m * (X'*(sigmoid(X*theta)-y)) + lambda / m .* (theta);
grad(1) = grad(1) - lambda / m .* (theta(1));
grad = grad(:);
end

oneVsAll:

1
2
3
4
5
6
7
8
9
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];
for c = 1:num_labels,
options = optimset('GradObj', 'on', 'MaxIter', 50);
all_theta(c,:) = fmincg (@(t)(lrCostFunction(t, X, (y == c), lambda)),all_theta(c,:)', options);
end
end

predictOneVsAll:

1
2
3
4
5
6
7
8
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];
p = sigmoid(X*all_theta');
[ma,p] = max(p,[],2);
end

神经网络多类分类

$\theta^{(1)}$和$\theta^{(2)}已经训练完成$
predict:

1
2
3
4
5
6
7
8
9
10
function p = predict(Theta1, Theta2, X)
m = size(X, 1);
num_labels = size(Theta2, 1);
p = zeros(size(X, 1), 1);
X = [ones(m, 1) X];
p = sigmoid(X*Theta1');
p = [ones(m,1) p];
p = sigmoid(p*Theta2');
[ma,p] = max(p,[],2);
end