前向传播(Frontpropagation)
我们之前学习了几种线性的分类回归方法,但是当我们有大量的数据时这种回归方式的效率可能会较为低下。由此,我们模拟了我们人体的神经元的工作方式设计出了神经网路。其模式图如下:
X向量为输入的数据,经过Sigmoid运算之后输出,这就是一个简单的神经网络。通常,在上方我们还会有一个的“偏置单元”,同样也参与运算,随着我们增加网络的层级,神经网络的模式图如下:
我们称图中第一层为输入层(Input Layer),第三层为输出层(Output Layer),其余所有层级我们都称为隐藏层(Hidden Layer),在每一层之间我们有不同的向量来对向量进行Sigmoid运算。
以第一层到第二层为例,,,其中1皆为偏置单元,图中并未画出,,A向量又作为下一层的输入进行下一层的运算,a的上角标(2)表示这是第二层的数据,以此类推,将每一层的数据的都进行乘积以及SIgmoid计算之后由输出层输出即可得到最终神经网路运算的结果。然后就可以直接计算代价函数
下为Octave/Matlab描述:
function [J grad] = nnCostFunction(nn_params, ...
input_layer_size, ...
hidden_layer_size, ...
num_labels, ...
X, y, lambda)
Theta1 = reshape(nn_params(1:hidden_layer_size * (input_layer_size + 1)), ...
hidden_layer_size, (input_layer_size + 1));
Theta2 = reshape(nn_params((1 + (hidden_layer_size * (input_layer_size + 1))):end), ...
num_labels, (hidden_layer_size + 1));
m = size(X, 1);
J = 0;
Theta1_grad = zeros(size(Theta1));
Theta2_grad = zeros(size(Theta2));
Y = zeros(m, size(Theta2, 1));
for i = 1: size(Theta2, 1);
Y(find(y == i), i) = 1;
end;
a1 = [ones(m, 1), X];
z2 = a1 * Theta1';
a2 = sigmoid(z2);
a2 = [ones(m, 1), a2];
z3 = a2 * Theta2';
a3 = sigmoid(z3);
J = (-1 / m) * sum(sum(Y .* log(a3) + (1 - Y) .* log(1 - a3))) ...
+ (lambda / (2*m)) * (sum(sum(Theta1 .^ 2)) + sum(sum(Theta2 .^ 2)));
end