入门神经网络-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 ...
随机推荐
- FANUC发那科机器人维护保养与故障处理分析
发那科机器人维护保养与故障处理分析 掌握知识:掌握发那科机器人维护保养与故障处理分析 每台机器人都需要预防性保养,这样可以保证它们在生产线上保持最佳性能和实现一致性,当机器人没有进行定期的预防性保养检 ...
- 【COM3D2Mod 制作教程(7)】实战!制作衣服部分(上)
[COM3D2Mod 制作教程(7)]实战!制作衣服部分(上) 教程介绍 隔了 N 个月终于迎来了第二期的 Mod 教程部分,这一期我们将开始制作人物的衣服部分. 因为体型适配的原因,衣服部分要比身体 ...
- APEX实战第1篇:本地部署拥有AI能力的APEX
学会部署APEX是为了更好构建企业级AI应用打基础,比如企业级的知识平台.智能报表等. 先前在<手把手教你喂养 DeepSeek 本地模型>,使用AnythingLLM方式,虽然操作上已经 ...
- 面试官:你是如何进行SQL调优的?
SQL调优是我们后端开发人员面试中的高频考点,也是实际工作中提升数据库性能的关键技能.面对"你是如何进行SQL调优的?"这个问题,你是否能条理清晰地分析问题并提供解决方案? 1. ...
- Typecho头像被墙的解决方法
首先下载最新开发版本的TYPECHO,然后,在config.inc.php自定义如下: /** 自定义gravatar url前缀 */ define('__TYPECHO_GRAVATAR_PREF ...
- 用Logseq记日报和管理文献
优缺点浅评 Logseq是一款双链笔记软件,其优点结合使用场景概括来说包括 开箱即用的极简界面,非常适合用来写日报 灵活的双链,强大的PDF标注,适合构建文献库 使用markdown格式来本地存储笔记 ...
- Ansible - [06] Playbook
Playbook 概述 Ansible ad-hoc 可以通过命令行形式远程管理其他主机 适合执行一些临时性简单任务 Ansible playbook 中文名称叫 剧本 将经常需要执行的任务写入一个文 ...
- 腾讯地图web端请求报错113.该功能未授权
问题描述: 请求地址:https://apis.map.qq.com/jsapi?qt=geoc&addr=%2C%2C%2C&key=你的key&output=jsonp&a ...
- linux 删除文件提示 opration not permitted 处理方法(宝塔删除文件提示无法删除)
问题描述:linux系统中使用rm -rf强制删除文件,提示 opration not permitted,无法删除成功(宝塔删除文件提示无法删除),该问题确定为已关闭所有安全软件及防止恶意篡改的软件 ...
- 【Ryan】: linux下安装ftp
在 Linux 系统下安装 FTP 服务器可以使用多种软件,其中最常见的是 vsftpd(Very Secure FTP Daemon)和 ProFTPD(Professional FTP Daemo ...