文章目录

  • 矩阵展开与复原
    • 展开
    • 复原
  • 梯度检验
  • 随机初始化

矩阵展开与复原

展开

当我们不想自己手写梯度下降或者别的什么算法,而是想直接调用已有函数的话,都要考虑兼容性问题。比如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. 机器学习算法应用中常用技巧-1

    参考:Udacity ML纳米学位 1. 取样 数据量很大的时候,想要先选取少量数据来观察一下细节. indices = [100,200,300]# 把sample原来的序号去掉重新分配 sampl ...

  2. 转载 干货 | 1400篇机器学习的文章中,这10篇是最棒的!

    [导读]在过去的一个月中, 作者从近 1400 篇有关机器学习的文章中挑选了最有可能帮助职业生涯发展的 10 篇推荐给大家(入选比率为0.7%). (此前发布过多篇收藏党喜欢的文章,也是来自Mybri ...

  3. 机器学习在分子模拟中的应用

    文章目录 一.背景 二.分子动力学模拟介绍 简史 基本步骤 应用 发展方向 三.AlphaFold **前言** **Alphafold2做了什么改进** **Alphafold2会议具体细节:** ...

  4. sklearn 神经网络_sklearn中的数据预处理和特征工程

    小伙伴们大家好~o( ̄▽ ̄)ブ,今天我们看一下Sklearn中的数据预处理和特征工程,老规矩还是先强调一下,我的开发环境是Jupyter lab,所用的库和版本大家参考: Python 3.7.1(你 ...

  5. pandas用众数填充缺失值_【机器学习】scikit-learn中的数据预处理小结(归一化、缺失值填充、离散特征编码、连续值分箱)...

    一.概述 1. 数据预处理 数据预处理是从数据中检测,修改或删除不准确或不适用于模型的记录的过程 可能面对的问题有:数据类型不同,比如有的是文字,有的是数字,有的含时间序列,有的连续,有的间断. 也可 ...

  6. 收藏 | 神经网络debug 6大技巧!

    点上方计算机视觉联盟获取更多干货 仅作学术分享,不代表本公众号立场,侵权联系删除 转载于:机器之心 AI博士笔记系列推荐 周志华<机器学习>手推笔记正式开源!可打印版本附pdf下载链接 神 ...

  7. 神经网络训练中的Tricks之高效BP(反向传播算法)

    神经网络训练中的Tricks之高效BP(反向传播算法) zouxy09@qq.com http://blog.csdn.net/zouxy09 Tricks!这是一个让人听了充满神秘和好奇的词.对于我 ...

  8. 长文解读|Progress in Neurobiology:监督式机器学习在神经科学中的应用

    ​<本文同步发布于"脑之说"微信公众号,欢迎搜索关注~~> 这些年来,人们投入了相当多的热情在机器学习(Machine Learning)领域中,毕竟它让电脑的表现在某 ...

  9. 常用激活函数--小白角度 TensorFlow 机器学习 神经网络 选取

    常用激活函数--小白角度TensorFlow 机器学习 神经网络 选取 先简单介绍一下激活函数 常用激活函数review 1.阶跃函数 2.Sigmoid函数(logistic函数) 3.Hyperb ...

  10. 大数据----机器学习---神经网络

    1.神经网络与深度学习的发展历程: 2.神经网络与大脑神经元 神经网络的起源.结构.个体间的信息交互方式是以我们大脑神经元为模板的,我们的大脑神经元如下所示: 3.神经网络源头--M-P神经元模型 M ...

最新文章

  1. 2021年大数据Spark(五十二):Structured Streaming 事件时间窗口分析
  2. 利用 FastCoding 将对象进行本地持久化
  3. 整理:warning LNK4098: 默认库“LIBCMT”与其他库的使用冲突;请使用 /NODEFAULTLIB:library
  4. php xml对象解析_php解析xml 的四种简单方法(附实例)
  5. redhat 6.4 安装ftp
  6. python中的数组是什么_Python中的数组
  7. windows下配置mysql主从复制_Windows下MySQL主从复制的配置方法
  8. mac下多个php版本切换(可操作版)
  9. 【RobotStudio学习笔记】(十)模块化程序
  10. 绝对路径中“./”、“../”、“../../”代表的含义,包你一看就会
  11. 遗传算法实例解析(python)
  12. c语言心算抢答系统,心算抢答系统2.doc
  13. SPI总线-物理层 协议层
  14. 打印收款单据(easypoi)Vue+springBoot+Mybatisplus
  15. postman使用之Tests使用
  16. 项目实训(十三)安装pun,pun的基础使用和概念
  17. 数据科学和人工智能技术笔记 二十、数据可视化
  18. JAVA 静态方法和成员方法、静态方法的调用
  19. 计算机ppt基础操作心得体会,word计算机实训心得体会.doc
  20. 如何运营一个微信公众号

热门文章

  1. 如何控制写入文件大小java_写入文本文件时如何更改字体大小 - java
  2. CamRaptor:针对DVR摄像头的漏洞利用工具
  3. win8文件共享服务器搭建,Win8系统开启公用文件夹共享的方法【图文】
  4. mysql数据库升幂_斯特林数
  5. Web jsp开发学习——Servlet提交表单时用法
  6. 小功能大用处 ---- 一键检测各服务器是否存活
  7. Flume NG 配置详解(转)
  8. NYOJ71-独木舟上的旅行
  9. 最新BIOS设置中英文对照表
  10. 破B操作系统:(1)显示桌面图标