入门神经网络-Python 实现(下)
Posted 宁鸣而死
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了入门神经网络-Python 实现(下)相关的知识,希望对你有一定的参考价值。
回顾
紧接着上篇, 整到了, MES的公式和代码的实现.
(MSE = frac {1}{n} sumlimits_{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 实现(下)的主要内容,如果未能解决你的问题,请参考以下文章
第3章 神经网络 《深度学习入门 基于Python的理论与实现》
人脸检测及识别python实现系列——卷积神经网络(CNN)入门
《深度学习入门基于Python的理论与实现》PDF代码学习指导
神经网络入门-用python实现一个两层神经网络并在CIFAR10数据集上调参
对比学习资料《深度学习入门:基于Python的理论与实现》+《深度学习原理与实践》+《深度学习理论与实战基础篇》电子资料