bp算法完整推导2.0(上)

chenjieyouge chenjieyouge     2023-04-24     164

关键词:

前面的笔记已经把 BP算法给推导了, 那4大公式, 核心就是 求偏导数的链式法则, 这篇, 再来跟着大佬来推一波, 目的是为了加深印象. 关于记忆这个话题, 心理学家,其实早已经给出了答案, 最好的记忆方式, 就是重复, 写了这么多的笔记, 其实大多内容都是重复的, 交叉的, 反复了, 但不同是, 每次反复, 其实都是一个认知理解上升的过程, 觉得还是很有必要的.

BP算法-变量声明

回顾历史

还是跟之前一样的, 先做一个简单的介绍, 然后对变量进行声明, 力求跟写代码的逻辑一样, 严谨, 规范, 有注释, 逻辑清晰, 模块化和面向对象

先是来简单介绍一波BP算法.

最早在1970年代就已经有人提出了, 直到1986年, 深度学习的大佬们才在论文中阐述其重要性.

在80年代中期, 这些大佬分别独立发现了 误差反向传播算法 (Error Back Propagation Training) 简称BP, 解决了, 多层神经网络, 隐含层连接权值学习问题.

BP 用来干嘛: 根据训练的误差, 来 动态 更新节点之间的 权值 .

分别独立发现: 好比牛顿和莱布尼兹 分别从各自领域创建了微积分.

不由感慨, 成功的大佬, 都是类似的, 我等凡人失败的借口, 总是各有各的说辞, 真的好扎心, 而又无可奈何呀.

BP算法相对于其他的神经网络学习算法会快很多, 这样就扩展了神经网络的解决问题的能力和领域. 直到目前, BP算法依然是深度学习的主要基石.

BP算法的核心是 求解误差函数 Loss 相对于权重 weights 和偏置 bias 的偏导, 来揭示 一旦改变 w, b 如何影响网络的整体行为.

而求解过程呢, 从数学上来说, 就是 多元变量求偏导的链式法则. 大一的微积分基础呀, 没错, 其实一点都不复杂的.

变量声明

重点是理解 反向 即从 从右到左 的方向哦;

技术图片

  • (w^l_jk) 第 l 层, 第 j 个节点, 到 第 ((l-1)) 层的 第 k 个节点的 权值 (weight) ( 反向, 反向, 方向, 反向, 说了4遍)
  • (w^l) 第 l 层, 的 权值矩阵, 第 j 行, 第 k 列 为 (w^l_jk)
  • (b_j^l) 第 l 层, 第 j 个节点 的 bias (偏置)
  • (b^l) 第 l 层, 的 bias 向量
  • (a^l_j) 第 l 层, 第 j 个节点的 激励 (activation)
  • (a^l) 第 l 层, 的 激励 向量

假设激活函数(sigma) , 根据网络 层次间的 映射(加权求和) 的关系, (每个神经元的模型):

单个神经元: (a^l_j = sigma(sumlimits _k w^l_jk a^l-1_k + b^l_j))

该层的神经元: (a^l = sigma (w^l a^l-1 + b^l))

如不能理解每个变量代表的意义, 就看图, 非常直观的呀

(z^l = w^l a^l-1 + b^l)

(z^l) The weighted input to the neurons in layer l.

再定义一个中间变量 (z^l) 即 第 l 层神经元的 加权求输入向量, 其分量, (z^l_j) 为第 l 层, 第 j 个神经元的 加权求和输入.

(z^l_j =sum limits_k w_jk a_k ^l-1 + b^l_j)

于是呢, 对于每个节点的输出, 就可以简单表示为 (向量形式哈) :

(a^l = sigma(z^l))

然后来看定义 损失函数, 采用咱最熟悉的 平方损失 的形式:

  • (y = y(x)) 样本 x 的标签向量 (期望输出)

  • (a^L = a^L(x)) 样本 x 的网络输出激励向量
  • n : 表示样本数量; L 表示网络层数

样本 x 表示向量, 每个分量也是一个向量(多特征), 对应于数据的每一行. 因此, x 写出来就是 nxp的矩阵

(C = frac 12n sum limits_x ||y(x) - a^L(x)||^2)

这个 0.5 都懂哈, , 没啥特定意义. 就是求导的时候, 式子的2范数, 要把2拿下来 再 乘0.5, 就为1 , 形式上美观而已.

代价函数2大假设

假设一:

上面的, 具体到每个值(样本) , 代价函数可以表示为, 每个训练样本 x (是个向量哈) 的代价函数 (C_x) 的平均值

(C_x = frac 12 ||y - a^L||^2)

(C = frac 1n sumlimits_x C_x)

假设二:

代价函数可以表示为, 神经网络 输出层的 函数

(C = frac12 ||y-a^L||^2 = frac 12 sumlimits_j (y_j - a_j^L)^2)

这里的 (y_j 是标签值, 表示一个常量, a^L_j 表示输出层向量 a^L 的第 j 个分量, 也是一个常量; C 是输出层向量 a的函数)

矩阵的 哈达玛积 (Hadamard Product)

定义为, 两个 同维度 的矩阵 / 向量, 对应位置的元素的乘积, 组成的一个新的矩阵/ 向量, 记为 (A odot B)

case:

假设 (alpha, eta) 是两个同维度的向量, 其 哈达玛积 为, 向量各位置的分量 的逐元素相乘.

((alpha odot eta)_j = alpha_j * eta_j)

([1, 2] odot [3, 4] = [1*3, 2*4] = [3, 8])

BP算法 - 四大公式

理解 梯度的反方向

首先就是看看, 网络中, 一个神经元节点的 权值 变化的话, 对整个网络的 代价会产生什么样而影响.

假设, 给第 l 层的 第 j 个神经元的节点值 (z^l_j) 加上一个增量, 则对应的 激励输出变化为

(sigma(z^l_j) ightarrow sigma(z^l_j + Delta z^l_j))

经过网络传播呢, 代价函数的 变化量 为: (frac partial C partial z^l_j Delta z^l_j)

变化量, 这个式子就是, 微分和导数的关系, (df(x) = f'(x) dx) 嗯, 或者理解为, 泰勒级数一阶近似也可以.

假设该 梯度 (偏导数值) (frac partial C partial z^l_j) 非常大 (可正, 可负)

始终牢记咱的目标是使得代价函数 C 的值越小越好, 也就是要找到 某一个点, 使得在该点导数值 == 0

  • (frac partial C partial z^l_j) 非常大, 则表示 (z^l_j) 对于整个网络的损失函数影响很大, 然后我们会选择与梯度符号相反的增量. (目的是让 "df" 接近 0, 接近函数 极值 的位置)
  • (frac partial C partial z^l_j) 非常小, 则表示扰动的增量, 不论取何值, 对代价函数的影响很小, 则该神经元对于代价函数倾向于最优 , 也是是到达了函数的 局部极值点.

梯度方向

梯度: 多元函数的偏导数做组成的向量, 本质是一个向量函数.

方向导数: 与偏导数更广的概念, 偏导是沿着固定的轴方向, 是方向导数的特定情景

方向: 是针对向量来说的, 向量具有大小和方向

  • 方向导数最大的方向, 为梯度方向, 其导数值就是梯度的模.
  • 方向导数最小的放俩, 为梯度反方向, 其导数方向是梯度的摸

在 ML 中我们绝大多数场景是要 寻找梯度的最小, 最好是零向量, 这样就是函数的 "极值" 所在的位置.

因此我们总是尝试沿着 梯度的负方向去求值最小的导数值, 因而求解函数的 极值.

这些就是很基础的, 高等数学的概念呀, 真的越接近本质, 越发现世界就是有基本的元素0, 1构成的, 也许. "道生一, 一生二, 二生三, 三生万物" 这是多么朴素的真理呀, 现在想想.

即想说明的是, 因为是要顾及整个网络结构嘛, 绝对不允许, 特别牛逼的节点存在 对损失函数影响很大的那种, 嗯, 这种思想和 集成学习是一样的, 都是平凡普通, 才能构成伟大, 不允许突出的兄弟.

梯度大则说训练得不够好, 因为在这个节点方向, 只要一稍微扰动该神经元, 就会对代价造成很大的影响;

反之, 梯度小则说明训练的比较好, 都是同一水平的兄弟, 然后不论这个普通的兄弟发生了什么事情, 都不会对整个代价造成特别大的影响.

这点就特像一些大公司里的螺丝钉, 多你一个不多, 少你一个也不太影响, 整个结构来时还是相对均衡和稳固的呀.

根据梯度的这种特性, 于是, 我们可以定义, 第 l 层, 第 j 个神经元 的误差为:

(delta ^l_j = frac partial Cpartial z^l_j)

tips: 算是第一遇见, 将导数值, 作为误差, 来训练, 这个脑洞, 真滴是可以的哦.

于是呢, BP算法就通过, 先求出各层神经元的偏导数,作为误差, 即相当于对代价C 求关于 权重和偏置 梯度

(frac partial C partial w^l_jk) , 以及 (frac partial Cpartial b_j^l)

技术图片

上篇就先到这吧, 一次不适合写太长, 信息太多会吸收不了的, 主要是理解BP到底在干嘛, 误差如何定义等这些概念的理解, 下篇就具体的公式推导和代码, 只有充分理解了上篇, 才能搞明白下篇的公式是是在做什么, 才能实现后面的手撸BP的呀.

bp算法基本原理推导----《机器学习》笔记

前言多层网络的训练需要一种强大的学习算法,其中BP(errorBackPropagation)算法就是成功的代表,它是迄今最成功的神经网络学习算法。今天就来探讨下BP算法的原理以及公式推导吧。神经网络先来简单介绍一下神经网络,引入基... 查看详情

深度学习bp算法的推导(附加rnn,lstm的推导说明)

...equenceLabelling withRecurrentNeuralNetworks》详细介绍其关于BP算法的推导过程。     2)论文没有提到过偏差的处理,不过如果能耐心推导出论文给出的公式,那么这将十分简单。   &nbs 查看详情

bp神经网络算法推导

一、BP神经网络BP神经网络是一种按照误差逆向传播算法训练的多层前馈神经网络,是应用最广泛也是最简单的神经网络模型之一。1.1BP神经网络的结构神经网络结构如下其中x1,x2x_1,x_2x1​,x2​为输入,φ\\varphiφ为激活函数... 查看详情

bp算法的原理解释和推导

BP算法的原理解释和推导已知的神经网络结构:且已知的条件:a(j)=f(z(j))\\mathbfa^\\left(\\mathbfj\\right)=\\mathbff\\left(\\mathbfz^\\left(\\mathbfj\\right)\\right)a(j)=f(z(j))z(j)=W(j)a 查看详情

bp算法的原理解释和推导

BP算法的原理解释和推导已知的神经网络结构:且已知的条件:a(j)=f(z(j))\\mathbfa^\\left(\\mathbfj\\right)=\\mathbff\\left(\\mathbfz^\\left(\\mathbfj\\right)\\right)a(j)=f(z(j))z(j)=W(j)a(j−1)+b(j) 查看详情

神经网络——bp算法

参考技术A对于初学者来说,了解了一个算法的重要意义,往往会引起他对算法本身的重视。BP(BackPropagation,后向传播)算法,具有非凡的历史意义和重大的现实意义。1969年,作为人工神经网络创始人的明斯基(MarrinMinsky)和佩珀特(Se... 查看详情

一文彻底搞懂bp算法:原理推导+数据演示+项目实战(上篇)

参考技术A反向传播算法(BackpropagationAlgorithm,简称BP算法)是深度学习的重要思想基础,对于初学者来说也是必须要掌握的基础知识!本文希望以一个清晰的脉络和详细的说明,来让读者彻底明白BP算法的原理和计算过程。全文... 查看详情

bp算法公式推导

首先来了解基本的定义,如,其中,N表示训练样本的数量,向量x(n)表示第n个样本在输入层输入数据,向量d(n)表示在输出层对应的期望的输出。设神经元j位于网络的输出层,那么由该神经元输出产生的误差定义为:其中,表示期... 查看详情

神经网络——bp学习算法推导

...总和为,输出为综上各变量之间的关系为 式1BP学习算法是通过反向学习过程使误差最小,其目 查看详情

神经网络——bp学习算法推导

...总和为,输出为综上各变量之间的关系为 式1BP学习算法是通过反向学习过程使误差最小,其目 查看详情

神经网络和bp算法推导(代码片段)

我的原文:https://www.hijerry.cn/p/53364.html感知机感知机(perceptron)于1957年由Rosenblatt提出,是一种二分类线性模型。感知机以样本特征向量作为输入,输出为预测类别,取正、负两类。感知机最终学习到的是... 查看详情

误差逆传播(errorbackpropagation,bp)算法推导及向量化表示

...材NotesonConvolutionalNeuralNetworks,结果刚看到第2章教材对BP算法的回顾就犯难了,不同于之前我学习的对每一个权值分别进行 查看详情

bp神经网络算法推导

一、BP神经网络BP神经网络是一种按照误差逆向传播算法训练的多层前馈神经网络,是应用最广泛也是最简单的神经网络模型之一。1.1BP神经网络的结构神经网络结构如下其中x1,x2x_1,x_2x1​,x2​为输入,φ\\varphiφ为激活函数... 查看详情

bp神经网络算法推导

一、BP神经网络BP神经网络是一种按照误差逆向传播算法训练的多层前馈神经网络,是应用最广泛也是最简单的神经网络模型之一。1.1BP神经网络的结构神经网络结构如下其中x1,x2x_1,x_2x1​,x2​为输入,φ\\varphiφ为激活函数... 查看详情

bp算法推导过程(代码片段)

BP算法推导过程一.FP过程(前向-计算预测值)定义sigmoid激活函数importnumpyasnpdefsigmoid(z):return1.0/(1+np.exp(-z))输入层值和标签结果l=[5.0,10.0]y=[0.01,0.99]alpha=0.5初始化w,b的值w=[0.1,0.15,0.2,0.25,0.3,0.35,0.4,0.45,0.5,0.55,0.6,0.65]b=[0.35,0.65]计算隐层的... 查看详情

backpropagation算法的推导与直观图解

...出一个简单的神经网络模型和Backpropagation(以下简称BP)算法的具体流程。第二部分以分别计算第一层和第二层中的第一个参数(parameters,在神经网络中也称之为weights)的梯度为例来解释BP算法流程,并给出了具体的推导过程。 查看详情

手推机器学习吴恩达神经网络bp反向传播矩阵推导(上篇)

前言在吴恩达斯坦福机器学习中关于BP算法(BackpropagationAlgorithm)只给出了最后的BP矩阵的推导结果,略去了中间的推导过程,初学者理解起来相当困难。本文给出了BP推导常遇到两种推导形式,并给出了详细... 查看详情

bp神经网络公式推导及实现mnist(代码片段)

...经网络的基本思想:BP神经网络的学习采用误差反向传播算法,BP算法是一种有监督的学习方法,其主要思想是把整个学习过程分为正向传播、反向(逆向)传播和记忆训练三个部分。正向传播时,输入样本从输入层输入,经各隐含... 查看详情