神经网络入门篇:详解向量化实现的解释(Justification for vectorized implementation)
向量化实现的解释
先对几个样本计算一下前向传播,看看有什么规律:
公式1.16:
\(z^{[1](1)} = W^{[1]}x^{(1)} + b^{[1]}\)
\(z^{[1](2)} = W^{[1]}x^{(2)} + b^{[1]}\)
\(z^{[1](3)} = W^{[1]}x^{(3)} + b^{[1]}\)
这里,为了描述的简便,先忽略掉 \(b^{[1]}\)后面将会看到利用Python 的广播机制,可以很容易的将\(b^{[1]}\) 加进来。
现在 \(W^{[1]}\) 是一个矩阵,\(x^{(1)},x^{(2)},x^{(3)}\)都是列向量,矩阵乘以列向量得到列向量,下面将它们用图形直观的表示出来:
公式1.17:
\left[
\begin{array}{ccc}
\cdots \\
\cdots \\
\cdots \\
\end{array}
\right]
\left[
\begin{array}{c}
\vdots &\vdots & \vdots & \vdots \\
x^{(1)} & x^{(2)} & x^{(3)} & \vdots\\
\vdots &\vdots & \vdots & \vdots \\
\end{array}
\right]
=
\left[
\begin{array}{c}
\vdots &\vdots & \vdots & \vdots \\
w^{(1)}x^{(1)} & w^{(1)}x^{(2)} & w^{(1)}x^{(3)} & \vdots\\
\vdots &\vdots & \vdots & \vdots \\
\end{array}
\right]
=\\
\left[
\begin{array}{c}
\vdots &\vdots & \vdots & \vdots \\
z^{[1](1)} & z^{[1](2)} & z^{[1](3)} & \vdots\\
\vdots &\vdots & \vdots & \vdots \\
\end{array}
\right]
=
Z^{[1]}
\]
当加入更多样本时,只需向矩阵\(X\)中加入更多列。
所以从这里也可以了解到,为什么之前对单个样本的计算要写成
\(z^{[1](i)} = W^{[1]}x^{(i)} + b^{[1]}\)
这种形式,因为当有不同的训练样本时,将它们堆到矩阵\(X\)的各列中,那么它们的输出也就会相应的堆叠到矩阵 \(Z^{[1]}\) 的各列中。现在就可以直接计算矩阵 \(Z^{[1]}\) 加上\(b^{[1]}\),因为列向量 \(b^{[1]}\) 和矩阵 \(Z^{[1]}\)的列向量有着相同的尺寸,而Python的广播机制对于这种矩阵与向量直接相加的处理方式是,将向量与矩阵的每一列相加。
所以这一篇只是说明了为什么公式 \(Z^{[1]} =W^{[1]}X + \ b^{[1]}\)是前向传播的第一步计算的正确向量化实现,但事实证明,类似的分析可以发现,前向传播的其它步也可以使用非常相似的逻辑,即如果将输入按列向量横向堆叠进矩阵,那么通过公式计算之后,也能得到成列堆叠的输出。
最后,对近期两篇博客的内容做一个总结(另一篇博客地址:https://www.cnblogs.com/oten/p/17828716.html):
由公式1.12、公式1.13、公式1.14、公式1.15可以看出,使用向量化的方法,可以不需要显示循环,而直接通过矩阵运算从\(X\)就可以计算出 \(A^{[1]}\),实际上\(X\)可以记为 \(A^{[0]}\),使用同样的方法就可以由神经网络中的每一层的输入 \(A^{[i-1]}\) 计算输出 \(A^{[i]}\)。其实这些方程有一定对称性,其中第一个方程也可以写成\(Z^{[1]} = W^{[1]}A^{[0]} + b^{[1]}\),看这对方程,还有这对方程形式其实很类似,只不过这里所有指标加了1。所以这样就显示出神经网络的不同层次,知道大概每一步做的都是一样的,或者只不过同样的计算不断重复而已。这里有一个双层神经网络,随着网络的深度变大,基本上也还是重复这两步运算,只不过是比这里看到的重复次数更多。在更深层次的神经网络中,随着层数的加深,基本上也还是重复同样的运算。
以上就是对神经网络向量化实现的正确性的解释,到目前为止,仅使用sigmoid函数作为激活函数,但事实上这并非最好的选择,在下一篇博客中,将会继续深入的讲解如何使用更多不同种类的激活函数。
神经网络入门篇:详解向量化实现的解释(Justification for vectorized implementation)的更多相关文章
- PHP函数篇详解十进制、二进制、八进制和十六进制转换函数说明
PHP函数篇详解十进制.二进制.八进制和十六进制转换函数说明 作者: 字体:[增加 减小] 类型:转载 中文字符编码研究系列第一期,PHP函数篇详解十进制.二进制.八进制和十六进制互相转换函数说明 ...
- 走向DBA[MSSQL篇] 详解游标
原文:走向DBA[MSSQL篇] 详解游标 前篇回顾:上一篇虫子介绍了一些不常用的数据过滤方式,本篇详细介绍下游标. 概念 简单点说游标的作用就是存储一个结果集,并根据语法将这个结果集的数据逐条处理. ...
- java 日志体系(三)log4j从入门到详解
java 日志体系(三)log4j从入门到详解 一.Log4j 简介 在应用程序中添加日志记录总的来说基于三个目的: 监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析工作: 跟踪代 ...
- Scala进阶之路-Scala函数篇详解
Scala进阶之路-Scala函数篇详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.传值调用和传名调用 /* @author :yinzhengjie Blog:http: ...
- (十八)整合Nacos组件,环境搭建和入门案例详解
整合Nacos组件,环境搭建和入门案例详解 1.Nacos基础简介 1.1 关键特性 1.2 专业术语解释 1.3 Nacos生态圈 2.SpringBoot整合Nacos 2.1 新建配置 2.2 ...
- es6入门4--promise详解
可以说每个前端开发者都无法避免解决异步问题,尤其是当处理了某个异步调用A后,又要紧接着处理其它逻辑,而最直观的做法就是通过回调函数(当然事件派发也可以)处理,比如: 请求A(function (请求响 ...
- Django入门基础详解
本次使用django版本2.1.2 安装django 安装最新版本 pip install django 安装指定版本 pip install django==1.10.1 查看本机django版本 ...
- 日志处理(一) log4j 入门和详解(转)
log4j 入门. 详解 转自雪飘寒的文章 1. Log4j 简介 在应用程序中添加日志记录总的来说基于三 个目的: 监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析工作 ...
- JPA入门案例详解(附源码)
1.新建JavaEE Persistence项目
- 从零开始入门 K8s| 详解 Pod 及容器设计模式
作者|张磊 阿里云容器平台高级技术专家,CNCF 官方大使 一.为什么需要 Pod 容器的基本概念 我们知道 Pod 是 Kubernetes 项目里面一个非常重要的概念,也是非常重要的一个原子调度单 ...
随机推荐
- python 打包模块:nuitka
该模块可以将python编译成C++级的可执行文件,是解决python图形化界面启动慢的神器. 1.环境配置 配置c/c++编译器:MinGW64 ,最低使用8.1版本,该资源自行下载. 百度网盘链接 ...
- 注意!JAVA中的值传递
前言:今天在解决一个问题时,程序总是不能输出正确值,分析逻辑思路没问题后,发现原来是由于函数传递导致了这个情况. LeetCode 113 问题:给你二叉树的根节点root和一个整数目标和target ...
- [linux]常见内核TCP参数描述与配置
前言 所有的TCP/IP参数都位于/proc/sys/net目录下(请注意,对/proc/sys/net目录下内容的修改都是临时的,任何修改在系统重启后都会丢失),如果需要固化设置,则需要修改/etc ...
- 关于 LLM 和图数据库、知识图谱的那些事
本文整理自 NebulaGraph 布道师 wey 在「夜谈 LLM」主题分享上的演讲,主要包括以下内容: 背景 LLM RAG Graph 知识抽取 Text2Cypher Graph RAG 未来 ...
- .NET Core基础到实战案例零碎学习笔记
前言:前段时间根据 [老张的哲学] 大佬讲解的视频做的笔记,讲的很不错.此文主要记录JWT/DI依赖注入/AOP面向切面编程/DTO/解决跨域等相关知识,还包含一些.NET Core项目实战的一些案例 ...
- 解决git出现fatal: detected dubious ownership in repository at XXXXX的错误
在window环境下,使用git命令时报错fatal: detected dubious ownership in repository at XXXXXX,图片如下 解决方法如下 添加一行代码 gi ...
- 《SQL与数据库基础》04. SQL-DQL
目录 DQL 基础查询 条件查询 分组聚合 聚合函数 分组查询 结果排序 分页限制 总结 本文以 MySQL 为例 DQL 语法结构: SELECT 字段列表 FROM 表名列表 WHERE 条件列表 ...
- MySQL实战实战系列 02 日志系统:一条SQL更新语句是如何执行的?
前面我们系统了解了一个查询语句的执行流程,并介绍了执行过程中涉及的处理模块.相信你还记得,一条查询语句的执行过程一般是经过连接器.分析器.优化器.执行器等功能模块,最后到达存储引擎. 那么,一条更新语 ...
- 研发效能|DevOps 是运维还是开发?
DevOps 到底是 Dev还是Ops?答:属于研发工程师序列,偏向研发域,而不是运维域. DevOps是研发工程师 DevOps 主要服务的对象就是所有产研团队的人员,与产研团队打交道比较多,相互配 ...
- python3利用smtplib发送、抄送邮件并附带附件
python3利用smtplib发送.抄送邮件并附带附件 1. 导包 import smtplib from email.mime.text import MIMEText from email.mi ...