入门神经网络-Python 实现(下)
回顾
紧接着上篇, 整到了, MES的公式和代码的实现.
\(MSE = \frac {1}{n} \sum\limits_{i=1}^n (y_i - \hat y_i)^2\)
n 表示样本数, 这里为 4
y 表示要预测的变量, 这里是 性别
训练的约束, 就是使得 MSE 的值尽可能小. -> 求解参数
MSE 的工作机制, 举个栗子, 假设网络的纵输出是 0, 也就是预测所有的 小伙伴都是 妹子.
| 姓名 | \(y_i\) (真实值) | \(\hat y_i\) (预测值) | \((y_i - \hat y_i)\) |
|---|---|---|---|
| youge | 1 | 0 | 1 |
| share | 1 | 0 | 1 |
| naive | 0 | 0 | 0 |
| beyes | 0 | 0 | 0 |
\(MSE = \frac {1}{4} (1 + 1 + 0 + 1) = 0.5\)
BP算法本质 - 求导链式法则
现在继续...
始终要明确我们的目标: 最小化神经网络的损失 这个损失呢, 本质也就是一个关于 权重和偏置 的函数
如图所示:
则本例的损失函数可以这样参数化表示为:
\(L(w_1, w_2, w_3, w_4, w_5, w_6, b1, b_2, b_3)\)
现在来考虑对 w 进行优化, 假设要优化 \(w_1\) (即当 \(w_1\) 变化时, L 会如何变化), 也就是: \(\frac {\partial L}{\partial w_1}\)
为了简化一波问题, 假设数据集中就只有一个兄弟.
| 姓名 | \(y_1\) | \(\hat y_1\) | (\(y_1 -\hat y_1\)) |
|---|---|---|---|
| youge | 1 | 0 | 1 |
则此时的 MSE = \((y_1 -\hat y_1)^2 = (1- \hat y_1)^2\)
要计算 \(\frac {\partial L}{\partial w_1}\) 根据网络的 反向 方向 (输出 -> 输入), 对应选取相应的中间变量, 这样能求出来呀. 根据求导链式法则:
\(\frac {\partial L}{\partial w_1} = \frac {\partial L}{\partial \hat y_1} * \frac {\partial \hat y_1}{\partial w_1}\)
由本例数据, 已知 \(L = (1- \hat y_1)^2\) , 上面公式的第一部分就可以求出来了:
\(\frac {\partial L} {\partial y_1} = \frac {\partial (1- \hat y_1)^2} {\partial y_1} = -2(1- \hat y_1)\)
然后是 第二部分 \(\frac {\partial \hat y_1}{\partial w_1}\) 观察图中的相关变量, 可看到 \(h_1, h_2, o_1\) 分别表示该神经元的输出, 即:
\(\hat y_1 = o_1 = f(w_5 h_1 + w_6 h_2 + b_3)\)
继续向后传播....
而我们关心的是 \(w_1\) , 看图中的线路就可知, w1 跟 h2 是没有关系的, 只跟 h1有关, 于是, 再来一波 求导链式法则
$\frac {\partial \hat y_1}{\partial w_1} = \frac {\partial \hat y_1} {\partial h_1} * \frac {\partial h_1}{\partial w_1} $
同样套路, 第一部分
\(\frac {\partial \hat y_1} {\partial h_1} = \frac {f(w_5h_1 + w_6h2 + b_3)} {\partial h_1} = w_5 * [f'(w_5h_1 + w_6h2+b_3)]\)
\(f'(w_5h_1 + w_6h2+b_3)\) 这个其实就 看作 f(x), 里面不论多少项, 都是该 函数的自变量取值而已呀.
对 第二部分 也是一样滴处理
$\frac {\partial h_1}{\partial w_1} = \frac {f(w_1 x_1 + w_2 x_2 + b_1)} {\partial w_1} = w_1 * [f'(w_1x_1 +w_2 x_2 + b_1)] $
终于走到输入值啦, 本例这里的 x_1 是身高, x_2 是体重. 这里的 f(x) 就是咱的 激活函数 (映射实值到0-1)
\(f(x) = \frac {1}{1+e^{-x}}\)
之前推导 逻辑回归的时候, 也是用的这个函数哦, 当时有个技巧点是, 其求导为: \(f(x)' = f(x)(1-f(x))\)
利用 分式 求导法则:
\(f(x)' = \frac {0 - (-e^{-x)}}{(1+e^{-x})^2}\)
\(= \frac {1}{1+e^{-x}} * \frac {e^{-x}}{1+e^{-x}}\)
\(=f(x)(1-f(x))\)
这个结果在推导逻辑回归的时候, 非常重要的哦, 求一阶导和二阶导都要用到
小结上边的一波操作, 其实就是一个 求导的链式法则:
\(\frac {\partial L}{\partial w_1} = \frac {\partial L}{\partial \hat y_1} * \frac {\partial \hat y_1}{\partial h_1} * \frac {\partial h_1}{\partial w_1}\)
从网络的方向上来看呢, 是从 output -> input 这样的 反向 误差传递, 这其实就是咱平时说的 BP算法, 而核心就是求导的链式法则而已呀.
所以嘛, 神经网络很多名词, 就是为了唬人, 当你扒开一看, 哦哦, 原来都只是用到一些 基础的数学知识而已
case1: 计算偏导数(Link Rule)
输入(已中心化):
| 姓名 | 体重 | 身高 | 性别 (y) |
|---|---|---|---|
| youge | -2 | 5 | 1 |
输出比较
| 姓名 | \(y_i\) | \(\hat y_1\) | (\(y_1 -\hat y_1\)) |
|---|---|---|---|
| youge | 1 | 0 | 1 |
同样, 为计算更加方便, 假设所有的 权重 为1, 所有的偏置为 0
图
\(h_1 = f(w_1 x_1 + w_2 x_2 + b_1)\)
\(= f(-2 + 5 + 0)\)
\(=f(3) = 0.952\)
继续,
\(h_2 = f(w_3x_1 + w_4 x_2 + b_2)\)
\(= f(-2 + 5 + 0) = h_1 = 0.952\)
继续,
\(o_1 = f(w_5h_1 + w_6h_2 + b3)\)
\(=f(0.952 + 0.952 + 0) = 0.721\)
停一波, 代码先缓一缓, 先检查下有没有bug.
入门神经网络-Python 实现(下)的更多相关文章
- Python 入门之 Python三大器 之 装饰器
Python 入门之 Python三大器 之 装饰器 1.开放封闭原则: (1)代码扩展进行开放 任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改.所以我们必须允许代 ...
- Python 入门之 Python三大器 之 生成器
Python 入门之 Python三大器 之 生成器 1.生成器 (1)什么是生成器? 核心:生成器的本质就是一个迭代器 迭代器是Python自带的 生成器程序员自己写的一种迭代器 def func( ...
- Python 入门之Python基础数据类型及其方法
Python 入门之Python基础数据类型 1. 整型:int 用于计算,用于比较 (在赋值的时候先执行等号右边的内容) 1.1 整数的加 a = 10 b = 20 print(a + b) 结果 ...
- Python 入门之Python基础知识
Python 入门之Python基础知识 1.变量 (1)变量就是把程序运行的中间结果临时存在内存中,以便后续代码使用 (2)变量的作用: 昵称,就是代指内存中某个地址中的内容 a = 123 变量名 ...
- windows下多Python环境指定pip安装模块到对应Python环境下
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿在windows下装了2套Python,一套是直接安装的Pytho ...
- Python环境下NIPIR(ICTCLAS2014)中文分词系统使用攻略
一.安装 官方链接:http://pynlpir.readthedocs.org/en/latest/installation.html 官方网页中介绍了几种安装方法,大家根据个人需要,自行参考!我采 ...
- Python多线程下的_strptime问题
Python多线程下的_strptime问题 由于Python的datetime和time中的_strptime方法不支持多线程,运行时会报错: import datetimeimport threa ...
- Python的下划线_
1.单下划线(_) 通常情况下,单下划线(_)会在以下3种场景中使用: 1.1 在解释器中: 在这种情况下,"_"代表交互式解释器会话中上一条执行的语句的结果.这种用法首先被标准C ...
- python环境下实现OrangePi Zero寄存器访问及GPIO控制
最近入手OrangePi Zero一块,程序上需要使用板子上自带的LED灯,在网上一查,不得不说OPi的支持跟树莓派无法相比.自己摸索了一下,实现简单的GPIO控制方法,作者的Zero安装的是Armb ...
- 20170310 - Python 3 下 SQLAlchemy 的 MySQL 数据库 URI 配置
MySQL-Python 只用于 Python 2,URI配置为 mysql://username:password@server/db Python 3 下要使用另一个 PyMySQL 包,相应的U ...
随机推荐
- QT5笔记: 31. 文件目录操作
开发的时候,QtCreator F1 查看相关类的信息
- autMan奥特曼机器人-对插件权限的管理
为了避免某些插件在用户不知情的情况下读取使用用户隐私数据,受" 安卓手机上安装的应用需申请电话.位置.通讯录等权限 "的启发,autMan增加了数据桶读取权限设置页面. 当前受限制 ...
- Typecho的Joe主题开启文章导航目录树
引言 发现从typora复制过来的markdown代码中的目录导航[toc]语句没生效, 没有像typora或其他markdown编辑器生成导航目录树, 网上搜了下, 发现个解决方法, 在主题设置里插 ...
- VsCode安装Copilot详细教程
安装GitHub Copilot插件前,您需要安装以下软件: 安装Visual Studio Code:前往https://code.visualstudio.com下载并安装最新版的Visual S ...
- Flink - [08] 状态一致性
题记部分 一.什么是状态一致性 有状态的流处理,内部每个算子任务都可以有自己的状态.对于流处理器内部来说,所谓的状态一致性,其实就是我们所说的计算结果要保证准确.一条数据也不应该丢失,也不应该重复 ...
- 在Vue 3中创建和使用FormData对象
在Vue 3中创建和使用FormData对象的具体步骤如下: 创建FormData对象:在Vue组件中,首先需要创建一个新的FormData对象.FormData是一个内置的JavaScript ...
- Vue3路由进阶实战:深度解析参数传递与导航守卫核心技术
一.路由参数传递的进阶应用技巧 1.1 路由配置与参数验证 // router/index.js { path: '/user/:userId(\\d+)', // 使用正则表达式限制只匹配数字 na ...
- 【MIPS】经典指令块集锦
Directives声明变量值存储 容易将数据段地址和地址上的内容搞混 .data fibs: .space 48 # allocate 12 * 4 = 48 Byte memory, store ...
- ModuleNotFoundError: No module named '_lzma' when building python
前言 运行 python 报错:ModuleNotFoundError: No module named '_lzma' when building python 解决 sudo apt-get in ...
- kubernetes安装配置使用vGPU
前言 AI 落地时,在某些场景下 AI 模型在训练或者是推理时,其算力要求不需要占用整卡的 GPU,比如只需要0.5卡 GPU 即可满足需求. 在这种情况下,可以使用 GPU 虚拟化技术来解决这个问题 ...