神经网络及其实现

神经网络及其实现

神经网络的表示

最小的神经网络

两层神经网络

在下图的表示中将参数b放到了中,每一层增加了一个值为1的隐藏单元

X为输入变量

为权重矩阵(所要计算的参数)

为隐藏层变量

g为激活函数

反向传播算法

下面我们从一个简单的例子入手考虑如何从数学上计算代价函数的梯度,考虑如下简单的神经网络,该神经网络有三层神经元,对应的两个权重矩阵,为了计算梯度我们只需要计算两个偏导数即可:

首先计算第二个权重矩阵的偏导数,即

首先需要在之间建立联系,很容易可以看到的值取决于,而,而又是由取sigmoid得到,最后,所以他们之间的联系可以如下表示:

按照求导的链式法则,我们可以先求对的导数,然后乘以对的导数,即

由于

不难计算

上式可以重写为

接下来仅需要计算即可,由于

忽略前面的

设k=1得到

这里只对一个example推导,最后累加即可

因此

得到下面的求导过程

由于

,计算如下,得

至此我们得到了

接下去我们需要求的偏导数,的依赖关系如下:

根据链式求导法则有

分别计算等式右边的三项可得

带入后得

上式可以重写为

将上面的结果放在一起,我们得到对两个权重矩阵的偏导数为:

观察上面的四个等式,我们发现

  • 偏导数可以由当层神经元向量与下一层的误差向量相乘得到
  • 当前层的误差向量可以由下一层的误差向量与权重矩阵的乘积得到

所以可以从后往前逐层计算误差向量,然后通过简单的乘法运算得到代价函数对每一层权重矩阵的偏导数。

假设我们有m个训练example,L层神经网络即

初始化:设置(理解为对第l层的权重矩阵的偏导累加值,每一个训练的偏导数累加值,最后再除以样本数得到均值)

参数w和b的初始化

For k=1:m

设置 =

通过前向传播算法(FP)计算对各层的预测值,其中l=1,2,3,4…,L

计算最后一层的误差向量,利用后向传播算法(BP)从后至前逐层计算误差向量,计算公式为

更新

End//

计算梯度:

通过梯度下降的方法来更新梯度,从而使代价函数达到最小的目的。

激活函数

上式例子中的激活函数g为SIGMOID

常见的激活函数还有TANH,RELU,LEAKY RELU

sigmoid激活函数的数学表达式如下

tanh激活函数的数学表达式如下

RELU激活函数

Leak RELU激活函数

注意:神经网络中的激活函数不能为非线性

如果激活函数为线性函数的话,不管你加多少隐藏层,都会和logistic回归一样

正则化

正则化可以用来帮助神经网络减少方差防止过拟合

常见的正则化有L1,L2

神经网络的matlab实现

sigmoid函数

function g = sigmoid(z)

g = 1.0 ./ (1.0 + exp(-z));

end

sigmoid函数求导

function g = sigmoidGradient(z)

g = zeros(size(z));

g = sigmoid(z) .* (1 - sigmoid(z));

end

初始化权重参数

function W = randInitializeWeights(L_in, L_out)

W = zeros(L_out, 1 + L_in);

epsilon_init = 0.12;

W = rand(L_out, 1 + L_in) * 2 * epsilon_init - epsilon_init;

end

计算代价函数(包含实现了前向传播和反向传播)

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));

% Setup some useful variables

m = size(X, 1);

J = 0;

Theta1_grad = zeros(size(Theta1));

Theta2_grad = zeros(size(Theta2));

%% Part 1 前向传播的实现

a1 = [ones(m, 1) X];

z2 = a1 * Theta1‘;

a2 = sigmoid(z2);

a2 = [ones(size(a2,1), 1) a2];

z3 = a2 * Theta2‘;

a3 = sigmoid(z3);

hThetaX = a3;

yVec = zeros(m,num_labels);

for i = 1:m

yVec(i,y(i)) = 1;

end

%% 计算代价函数

J = 1/m * sum(sum(-1 * yVec .* log(hThetaX)-(1-yVec) .* log(1-hThetaX)));

%% 正则化项

regularator = (sum(sum(Theta1(:,2:end).^2)) + sum(sum(Theta2(:,2:end).^2))) * (lambda/(2*m));

J = J + regularator;

%% Part 2 反向传播的实现

for t = 1:m

% For the input layer, where l=1:

a1 = [1; X(t,:)‘];

% For the hidden layers, where l=2:

z2 = Theta1 * a1;

a2 = [1; sigmoid(z2)];

z3 = Theta2 * a2;

a3 = sigmoid(z3);

yy = ([1:num_labels]==y(t))‘;

% For the delta values:

delta_3 = a3 - yy;

delta_2 = (Theta2‘ * delta_3) .* [1; sigmoidGradient(z2)];

delta_2 = delta_2(2:end); % Taking of the bias row

% delta_1 is not calculated because we do not associate error with the input

% Big delta update

Theta1_grad = Theta1_grad + delta_2 * a1‘;

Theta2_grad = Theta2_grad + delta_3 * a2‘;

end

Theta1_grad = (1/m) * Theta1_grad + (lambda/m) * [zeros(size(Theta1, 1), 1) Theta1(:,2:end)];

Theta2_grad = (1/m) * Theta2_grad + (lambda/m) * [zeros(size(Theta2, 1), 1) Theta2(:,2:end)];

% Unroll gradients

grad = [Theta1_grad(:) ; Theta2_grad(:)];

end

训练神经网络及预测

%% Initialization

clear ; close all; clc

%% Setup the parameters you will use for this exercise

input_layer_size = 400; % 20x20 Input Images of Digits

hidden_layer_size = 25; % 25 hidden units

num_labels = 10; % 10 labels, from 1 to 10

% (note that we have mapped "0" to label 10)

% 加载训练数据

load(‘data.mat‘);

% 初始化权重参数

initial_Theta1 = randInitializeWeights(input_layer_size, hidden_layer_size);

initial_Theta2 = randInitializeWeights(hidden_layer_size, num_labels);

% Unroll parameters

initial_nn_params = [initial_Theta1(:) ; initial_Theta2(:)];

options = optimset(‘MaxIter‘, 50);

lambda = 1;

costFunction = @(p) nnCostFunction(p, ...

input_layer_size, ...

hidden_layer_size, ...

num_labels, X, y, lambda);

% 实现迭代计算梯度

[nn_params, cost] = fmincg(costFunction, initial_nn_params, options);

% 获得训练好的权重参数

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));

% 实现预测

pred = predict(Theta1, Theta2, X);

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

原文地址:https://www.cnblogs.com/kexinxin/p/9858596.html

时间: 2024-10-12 03:54:28

神经网络及其实现的相关文章

Neural Networks and Deep Learning学习笔记ch1 - 神经网络

近期開始看一些深度学习的资料.想学习一下深度学习的基础知识.找到了一个比較好的tutorial,Neural Networks and Deep Learning,认真看完了之后觉得收获还是非常多的.从最主要的感知机開始讲起.到后来使用logistic函数作为激活函数的sigmoid neuron,和非常多其它如今深度学习中常使用的trick. 把深度学习的一个发展过程讲得非常清楚,并且还有非常多源代码和实验帮助理解.看完了整个tutorial后打算再又一次梳理一遍,来写点总结.以后再看其它资料

深度学习方法(十):卷积神经网络结构变化——Maxout Networks,Network In Network,Global Average Pooling

技术交流QQ群:433250724,欢迎对算法.技术感兴趣的同学加入. 最近接下来几篇博文会回到神经网络结构的讨论上来,前面我在"深度学习方法(五):卷积神经网络CNN经典模型整理Lenet,Alexnet,Googlenet,VGG,Deep Residual Learning"一文中介绍了经典的CNN网络结构模型,这些可以说已经是家喻户晓的网络结构,在那一文结尾,我提到"是时候动一动卷积计算的形式了",原因是很多工作证明了,在基本的CNN卷积计算模式之外,很多简

对抗神经网络(Adversarial Nets)的介绍[1]

对抗NN简介 概念介绍 对抗名字的由来及对抗过程 对抗NN的模型 对抗NN的模型和训练 判别网络D的最优值 模拟学习高斯分布 对抗NN实验结果 <生成对抗NN>代码的安装与运行 对抗网络相关论文 论文引用 一.对抗NN简介 大牛Ian J. Goodfellow 的2014年的<Generative Adversative Nets>第一次提出了对抗网络模型,短短两年的时间,这个模型在深度学习生成模型领域已经取得了不错的成果.论文提出了一个新的框架,可以利用对抗过程估计生成模型,相

第五章 神经网络

读书笔记 周志华老师的<机器学习> 因为边看边记,所以写在随笔里,如果涉及版权问题,请您联系我立马删除,[email protected] 5.1 神经元模型 “神经网络是由具有适应性的简单单元组成的广泛并行互连的网络,它的组织能够模拟生物神经系统对真实世界物体所作出的交互反应.” 神经元模型:生物神经网络中,每个神经元与其他神经元相连,当它“兴奋”时,就会向相连的神经元发送化学物质,从而改变这些神经元内的电位:如果某神经元的电位超过了一个“阈值”,那么它就会被激活,即“兴奋”起来,向其他神经

中国首款嵌入式神经网络处理器发布

中国首款嵌入式神经网络处理器(NPU)芯片在北京正式发布,该芯片颠覆传统计算机架构,是由中星微“数字多媒体芯片技术”国家重点实验室研发,已于今年3月6日实现量产. 据介绍,有别于传统的冯诺依曼计算机架构,NPU采用了“数据驱动并行计算”架构,其具有低功耗的特点,擅长视频.图像类的多媒体数据处理,有助于人工智能在嵌入式机器视觉应用中稳定发挥. 中星微日前展示了型号为VC0758的国内首款NPU芯片产品,其内部集成了四个NPU内核,同时其还集成了[email protected]的SVAC国家标准音

Spark MLlib Deep Learning Convolution Neural Network (深度学习-卷积神经网络)3.1

3.Spark MLlib Deep Learning Convolution Neural Network (深度学习-卷积神经网络)3.1 http://blog.csdn.net/sunbow0 Spark MLlib Deep Learning工具箱,是根据现有深度学习教程<UFLDL教程>中的算法,在SparkMLlib中的实现.具体Spark MLlib Deep Learning(深度学习)目录结构: 第一章Neural Net(NN) 1.源码 2.源码解析 3.实例 第二章D

Spark MLlib Deep Learning Convolution Neural Network (深度学习-卷积神经网络)3.2

3.Spark MLlib Deep Learning Convolution Neural Network(深度学习-卷积神经网络)3.2 http://blog.csdn.net/sunbow0 第三章Convolution Neural Network (卷积神经网络) 2基础及源码解析 2.1 Convolution Neural Network卷积神经网络基础知识 1)基础知识: 自行google,百度,基础方面的非常多,随便看看就可以,只是很多没有把细节说得清楚和明白: 能把细节说清

Spark MLlib Deep Learning Convolution Neural Network (深度学习-卷积神经网络)3.3

3.Spark MLlib Deep Learning Convolution Neural Network(深度学习-卷积神经网络)3.3 http://blog.csdn.net/sunbow0 第三章Convolution Neural Network (卷积神经网络) 3实例 3.1 测试数据 按照上例数据,或者新建图片识别数据. 3.2 CNN实例 //2 测试数据 Logger.getRootLogger.setLevel(Level.WARN) valdata_path="/use

【原创】连“霍金”都想学习的“人工智能”---【自己动手写神经网络】小白入门连载开始了(1)

欢迎关注[自己动手写神经网络]的博客连载!!! 第1章 神经网络简介 神经网络这个词,相信大家都不陌生.就在你打开本书,并试图了解神经网络时,你已经在使用一个世界上最复杂的神经网络——你的大脑,一个由大约1000亿个神经元(每个单元拥有约1万个连接)构成的复杂系统.但人的大脑太过复杂,以至于科学家们到目前为止仍然无法准确解释大脑的工作原理和方式.但有幸的是,生物神经网络的最最基本的元素已经能够被识别,而这就构成了本书想为你介绍的人工神经网络(Artificial Neural Network).

CNN卷积神经网络新想法

最近一直在看卷积神经网络,想改进改进弄出点新东西来,看了好多论文,写了一篇综述,对深度学习中卷积神经网络有了一些新认识,和大家分享下. 其实卷积神经网络并不是一项新兴的算法,早在上世纪八十年代就已经被提出来,但当时硬件运算能力有限,所以当时只用来识别支票上的手写体数字,并且应用于实际.2006年深度学习的泰斗在<科学>上发表一篇文章,论证了深度结构在特征提取问题上的潜在实力,从而掀起了深度结构研究的浪潮,卷积神经网络作为一种已经存在的.有一定应用经验的深度结构,重新回到人们视线,此时硬件的运算