机器学习:神经网络实现中的技巧
文章目录
- 矩阵展开与复原
- 展开
- 复原
- 梯度检验
- 随机初始化
矩阵展开与复原
展开
当我们不想自己手写梯度下降或者别的什么算法,而是想直接调用已有函数的话,都要考虑兼容性问题。比如matlab自带的fminunc
函数,它可以比梯度下降更快的找到使函数值最小的参数,但它要求使用者提供代价-梯度函数,且返回的代价、梯度和作为自变量的参数都要是向量形式。但在神经网络原理部分,参数、梯度都是矩阵形式,这个时候就需要我们对矩阵进行展开,使其变成向量。
对于单个矩阵A
,要将它变成列向量,直接使用A=A(:)
即可。若想把多个矩阵合并为一个列向量,将它们分别展开为列向量后再沿列组合即可:
A=[A1(:);A2(:);A3(:)];
复原
用列向量形式求出了优化值,但要在神经网络中运算的话,还是矩阵形式更方便,于是我们还需要把矩阵从列向量中复原回来。我们利用reshape
函数,把列向量中对应的部分提取出来,按照给定的参数构成矩阵:
A1=reshape(A(k+1:k+n*m),n,m);
梯度检验
反向传播计算梯度是一个效率很高、很精妙的算法,但精妙意味着容易写错,有时候我们想确认我们写出来的反向传播算法是否有错误,我们可以写一个虽然效率低但更容易实现的算法计算梯度,将两个算法的结果放在一起比较,若每个元素都基本一致,就可以放心的使用了。
这个低效率的算法就是利用定义去计算梯度,对于函数J(Θ)J(\Theta)J(Θ),它的偏导数为
∂∂ΘjJ(Θ)≈J(Θ1,⋯,Θj+ε,⋯,Θn)−J(Θ1,⋯,Θj−ε,⋯,Θn)2ε\frac{\partial}{\partial \Theta_j}J(\Theta)\approx\frac{J(\Theta_1,\cdots,\Theta_j+\varepsilon,\cdots,\Theta_n)-J(\Theta_1,\cdots,\Theta_j-\varepsilon,\cdots,\Theta_n)}{2\varepsilon} ∂Θj∂J(Θ)≈2εJ(Θ1,⋯,Θj+ε,⋯,Θn)−J(Θ1,⋯,Θj−ε,⋯,Θn)
为了使这个值比较精确,ε\varepsilonε一般取10−410^{-4}10−4,我们对每个参数都执行一遍该过程,就可以得到梯度矩阵。
可以发现,这个方法的确很慢,每计算一个导数就要得到两个代价函数值,意味着要做两次向前传播,而反向传播计算所有单元的偏差值只需要反向传播一次,高下立判。
随机初始化
在前面的算法中,我们一般都将参数初始化为全0,但这在神经网络中是不可行的。
考虑上图所示的神经网络,若参数都为0,那么输入值和参数矩阵相乘后还是0,则隐藏层的值都为g(0)=0.5g(0)=0.5g(0)=0.5,以此类推,所有的隐藏层单元都会是0.50.50.5。相应地,在计算偏差的时候它们也会保持一致,之后计算出的梯度也会一致,这样隐藏层的多个单元都没有意义,因为它们更新之后都是一样的值。
所以,在初始化的时候,我们会采用随机初始化的办法对参数进行赋值,用rand(n,m)
就可以生成一个n×mn\times mn×m的随机矩阵,元素的值都在[0,1][0,1][0,1]之间。若想要改变取值范围为[−a,a][-a,a][−a,a],使用
A=rand(n,m)*(2*a)-a;
即可。
机器学习:神经网络实现中的技巧相关推荐
- 机器学习算法应用中常用技巧-1
参考:Udacity ML纳米学位 1. 取样 数据量很大的时候,想要先选取少量数据来观察一下细节. indices = [100,200,300]# 把sample原来的序号去掉重新分配 sampl ...
- 转载 干货 | 1400篇机器学习的文章中,这10篇是最棒的!
[导读]在过去的一个月中, 作者从近 1400 篇有关机器学习的文章中挑选了最有可能帮助职业生涯发展的 10 篇推荐给大家(入选比率为0.7%). (此前发布过多篇收藏党喜欢的文章,也是来自Mybri ...
- 机器学习在分子模拟中的应用
文章目录 一.背景 二.分子动力学模拟介绍 简史 基本步骤 应用 发展方向 三.AlphaFold **前言** **Alphafold2做了什么改进** **Alphafold2会议具体细节:** ...
- sklearn 神经网络_sklearn中的数据预处理和特征工程
小伙伴们大家好~o( ̄▽ ̄)ブ,今天我们看一下Sklearn中的数据预处理和特征工程,老规矩还是先强调一下,我的开发环境是Jupyter lab,所用的库和版本大家参考: Python 3.7.1(你 ...
- pandas用众数填充缺失值_【机器学习】scikit-learn中的数据预处理小结(归一化、缺失值填充、离散特征编码、连续值分箱)...
一.概述 1. 数据预处理 数据预处理是从数据中检测,修改或删除不准确或不适用于模型的记录的过程 可能面对的问题有:数据类型不同,比如有的是文字,有的是数字,有的含时间序列,有的连续,有的间断. 也可 ...
- 收藏 | 神经网络debug 6大技巧!
点上方计算机视觉联盟获取更多干货 仅作学术分享,不代表本公众号立场,侵权联系删除 转载于:机器之心 AI博士笔记系列推荐 周志华<机器学习>手推笔记正式开源!可打印版本附pdf下载链接 神 ...
- 神经网络训练中的Tricks之高效BP(反向传播算法)
神经网络训练中的Tricks之高效BP(反向传播算法) zouxy09@qq.com http://blog.csdn.net/zouxy09 Tricks!这是一个让人听了充满神秘和好奇的词.对于我 ...
- 长文解读|Progress in Neurobiology:监督式机器学习在神经科学中的应用
<本文同步发布于"脑之说"微信公众号,欢迎搜索关注~~> 这些年来,人们投入了相当多的热情在机器学习(Machine Learning)领域中,毕竟它让电脑的表现在某 ...
- 常用激活函数--小白角度 TensorFlow 机器学习 神经网络 选取
常用激活函数--小白角度TensorFlow 机器学习 神经网络 选取 先简单介绍一下激活函数 常用激活函数review 1.阶跃函数 2.Sigmoid函数(logistic函数) 3.Hyperb ...
- 大数据----机器学习---神经网络
1.神经网络与深度学习的发展历程: 2.神经网络与大脑神经元 神经网络的起源.结构.个体间的信息交互方式是以我们大脑神经元为模板的,我们的大脑神经元如下所示: 3.神经网络源头--M-P神经元模型 M ...
最新文章
- 2021年大数据Spark(五十二):Structured Streaming 事件时间窗口分析
- 利用 FastCoding 将对象进行本地持久化
- 整理:warning LNK4098: 默认库“LIBCMT”与其他库的使用冲突;请使用 /NODEFAULTLIB:library
- php xml对象解析_php解析xml 的四种简单方法(附实例)
- redhat 6.4 安装ftp
- python中的数组是什么_Python中的数组
- windows下配置mysql主从复制_Windows下MySQL主从复制的配置方法
- mac下多个php版本切换(可操作版)
- 【RobotStudio学习笔记】(十)模块化程序
- 绝对路径中“./”、“../”、“../../”代表的含义,包你一看就会
- 遗传算法实例解析(python)
- c语言心算抢答系统,心算抢答系统2.doc
- SPI总线-物理层 协议层
- 打印收款单据(easypoi)Vue+springBoot+Mybatisplus
- postman使用之Tests使用
- 项目实训(十三)安装pun,pun的基础使用和概念
- 数据科学和人工智能技术笔记 二十、数据可视化
- JAVA 静态方法和成员方法、静态方法的调用
- 计算机ppt基础操作心得体会,word计算机实训心得体会.doc
- 如何运营一个微信公众号