deeplearning系列(一)浅层神经网络
来源:互联网 发布:数据魔方 免费 编辑:程序博客网 时间:2024/06/04 19:30
因为项目的需要,这周开始学习深度学习。为了了解深度神经网络,则需要从浅层网络学起,尤其是通过浅层神经网络的推导,掌握反向传播算法的实现原理。本文以一个3层神经网络为例,对从前向传播到反向传播的整个训练过程进行推导,并给出了python代码实现。
1. 前向传播算法
上图给出一个简单的三层神经网络,最左边一层为输入层
本神经网络有参数
其中隐藏层的激活函数为双曲正切函数(tanh):
输出层的激活函数为softmax函数,该函数将一个包含任意实数值的向量转化为包含取值范围为[0,1]的实数且实数的和为1的向量。在本例中
转换后向量中的每个元素可以理解神经网络输出该类别的概率。使用这个函数的好处是可以方便地将模型推广到包含多个输出(大于等于三个)的情况。
前向传播过程的矩阵化表示为:
2. 反向传播算法
给定一个样本集
最小化误差相当于最大化预测正确的概率。
然后可以通过批量梯度下降法最小化目标函数来求得神经网络的最优参数
其中
输出层之前的几层的残差则需要通过反向传播算法求出。反向传播算法类似于动态规划的思想,当前层(
反向传播过程矩阵化表示为:
3. 权重衰减
神经网络因其参数多,对数据的表达能力强,因此很容易过拟合。为了防止过拟合,措施之一是在原目标函数的基础上加上一项正则化项,也称为权重衰减项,用来减小权重的幅度,防止过拟合。需要注意的是在权重衰减项里面不使用偏置项
加上权重衰减项之后,反向传播的过程不受任何影响,仅需要在反向传播过程结束后,在偏导数项中加入权重衰减项的偏导。
完整的反向传播过程矩阵化表示为:
4. python代码实现
根据前向传播和反向传播的矩阵化表示,批量梯度下降法的一次迭代的步骤的代码如下:
#Parameter setup nn_input_dim = 2 nn_hdim = 3 nn_output_dim = 2 epsilion = 0.01 #learning rate reg_lambda = 0.01 #regularization parameter #Initialize the parameter to random values W1 = np.random.randn(nn_hdim, nn_input_dim)/np.sqrt(nn_input_dim) b1 = np.zeros((nn_hdim, 1)) W2 = np.random.randn(nn_output_dim, nn_hdim)/np.sqrt(nn_hdim) b2 = np.zeros((nn_output_dim, 1)) #Forward propagation z2 = W1.dot(X) + b1 a2 = np.tanh(z2) z3 = W2.dot(a2) + b2 exp_scores = np.exp(z3) probs = exp_scores/np.sum(exp_scores, axis=0, keepdims=True) # Back propagation delta3 = probs delta3[y, range(num_examples)] -= 1 dW2 = delta3.dot(a2.T) db2 = np.sum(delta3, axis=1, keepdims=True) delta2 = W2.T.dot(delta3)*(1-np.power(a2, 2)) dW1 = delta2.dot(X) db1 = np.sum(delta2, axis=1, keepdims=True) # add regularization term dW2 += reg_lambda*W2 dW1 += reg_lambda*W1 # gradient descent parameter update W1 += -epsilion*dW1 b1 += -epsilion*db1 W2 += -epsilion*dW2 b2 += -epsilion*db2
对于下面这样数据库,使用隐藏层包含3个单元的网络训练出的结果为:
完整的python代码地址为:
https://github.com/dumengnanbuaa/neuralnetwork_python
参考内容:
1.https://github.com/dennybritz/nn-from-scratch/blob/master/nn-from-scratch.ipynb
2.http://ufldl.stanford.edu/wiki/index.php/UFLDL_Tutorial
3.台湾大学机器学习技法课程
- deeplearning系列(一)浅层神经网络
- DeepLearning.ai学习笔记(一)神经网络和深度学习--Week3浅层神经网络
- 深度学习DeepLearning.ai系列课程学习总结:5. 浅层神经网络
- deeplearning系列(二)自编码神经网络
- deeplearning系列(六)卷积神经网络
- DeepLearning#之浅层与深层的训练(一)
- 吴恩达Coursera深度学习课程 DeepLearning.ai 提炼笔记(1-3)-- 浅层神经网络
- Coursera深度学习课程DeepLearning.ai 提炼笔记(1-3)-- 浅层神经网络
- deeplearning系列(五)实现一个简单的深度神经网络
- 吴恩达Deeplearning.ai专项课程笔记(一)-- 神经网络基础
- 吴恩达Coursera深度学习课程 DeepLearning.ai 提炼笔记(1-3)-- 浅层神经网络(转载)
- DeepLearning.ai学习笔记(一)神经网络和深度学习--Week4深层神经网络
- 【deeplearning.ai】Neural Networks and Deep Learning——浅层神经网络
- Andrew Ng's deeplearning Course1Week3 Shallow neural networks(浅层神经网络)
- 吴恩达深度学习笔记(一)week3 浅层神经网络
- Coursera deeplearning.ai 深度学习笔记1-3-Shallow Neural Networks-浅层神经网络原理推导与代码实现
- deep learning 专项课程一 浅层神经网络(两层算法)
- 神经网络基础整理系列(一)
- linux下U盘内容为只读文件的解决办法
- 一次奇怪的问题定位过程
- 记录一些常用的utils方法
- JavaScript(二)
- 黑马程序员------享元模式
- deeplearning系列(一)浅层神经网络
- hdu 5491
- 学习ThinkPHP3.2.2(二):第二个入门例子
- Struts2图片文件上传,判断图片格式和图片大小
- i++和++i区别
- Xcode各个版本下载地址
- git fetch /rebase /merge 使用
- spring-mvc.xml文件的配置(官方文件)
- Android View 事件分发机制 && Android ViewGroup 事件分发机制 源码解析 --总结