神经网络和BP算法推导

我的原文:https://www.hijerry.cn/p/53364.html

感知机

感知机(perceptron)于1957年由Rosenblatt提出,是一种二分类线性模型。感知机以样本特征向量作为输入,输出为预测类别,取正、负两类。感知机最终学习到的是将输入空间(特征空间)划分为正、负两类的分离超平面,属于判别模型。为此,使用误分类作为损失函数,利用梯度下降优化该函数,可求得感知机模型。感知机是神经网络与支持向量机的基础。

单层感知机

单层感知机图片

i {i} i 个样本的预测值 y i ^ = f ( w ⃗ ⋅ x i ⃗ + b ) \hat{y_i} = f(\vec{w} \cdot \vec{x_i} + b) yi^=f(w xi +b) ,其中 f ( ⋅ ) f(\cdot) f() 称为激活函数,$ f(\cdot) \in {-1, 1}$ ,损失为 L i = 1 2 ( y i ^ − y i ) 2 L_i=\frac{1}{2}(\hat{y_i}-y_i)^2 Li=21(yi^yi)2 。单层感知机的目的就是习得合适的 w ⃗ \vec{w} w b b b ,使得所有样本的损失之和 ∑ x i ∈ X L i \sum_{x_i \in X} L_i xiXLi 最小。

如果我们令 z = w ⃗ ⋅ x i ⃗ + b z = \vec{w} \cdot \vec{x_i} + b z=w xi +b 即感知机的输入。那么当 z &lt; 0 z &lt; 0 z<0 时, f ( z ) = − 1 f(z) = -1 f(z)=1;当$ z > 0$ 时, f ( z ) = 1 f(z)=1 f(z)=1 。因为 z z z x x x 线性组合,所以最终得到的是一个超平面 w ⃗ ⋅ x ⃗ + b = 0 \vec{w} \cdot \vec{x}+b=0 w x +b=0 ,超平面将输入样本分为了 y i = 1 y_i=1 yi=1 y i = y_i= yi= -1两类。

当输入 x = ( x 1 , x 2 ) x=(x_1, x_2) x=(x1,x2) 是二维向量时,用红点表示 + 1 +1 +1 的数据,黑点表示 − 1 -1 1 的数据,最终习得的是一条直线,将两个数据分离开,如下图所示。

决策超平面

因为单层感知机最终习得是超平面,所以只能用于解决线性可分问题。对于下面这样的数据,单层感知机无能为力。

非线性可分

多层感知机

多层感知机也叫MLP,可以看做是一个有向图。MLP由多层节点组成,每一层全连接到下一层,除输入节点外,每个节点都是一个带有非线性激活函数的神经元(unit)。多层感知机可用于解决线性不可分问题。

因为神经网络的和多层感知器是一个意思,所以下面直接对单层前馈神经网络进行详细说明。

决策线

单层前馈神经网络

下图是一个输入层节点数为3,隐藏层节点数为2,输出层节点数为2的前馈神经网络,该网络可用于解决二分类问题。

3×2×2前馈神经网络结构图

单层前馈神经网络本质上是一个多层感知机,有以下几个特点:

  1. 全连接。每一层的节点都与右边层的所有节点通过权重连接。
  2. 隐藏层只有一层。所以称之为单层
  3. 数据单向流动。每一层节点只作用于其之后的层,所以叫作前馈
  4. 本质是数学函数。神经网络可以明确的用数学语言表达。

神经元

我们拿出隐藏层的一个神经元(unit)放大来看:

单节点详解

神经元的任务就是接受输入,产生输出

z 表示神经元的输入,a 是神经元的输出。

输入怎么得来?就是上一层的神经元输出与权重 的乘积之和再加上偏置

输出怎么得来?把输入值带入激活函数 得到。

写成数学表达式就是:

$ z^{(2)}_1 = w{(1)}_{11}a{(1)}_1+w{(1)}_{21}a{(1)}_2+w{(1)}_{31}a{(1)}_3+b^{(1)}_1$

a 1 ( 2 ) = f ( z 1 ( 2 ) ) a^{(2)}_1=f(z^{(2)}_1) a1(2)=f(z1(2))

f ( ⋅ ) f(\cdot) f() 是激活函数,常见的有sigmoid、tanh、ReLU。

Sigmoid函数

Sigmoid的表达式为 S ( x ) = 1 1 + e − x S(x)=\frac{1}{1+e^{-x}} S(x)=1+ex1,定义域为 R R R ,值域为 ( 0 , 1 ) (0, 1) (0,1)

x = 0 x=0 x=0 处,函数值为 1 2 \frac{1}{2} 21,其函数图像如下:

sigmoid函数图像

sigmoid函数有许多优美的性质,如:

  1. e x e^x ex 的复合函数, e e e 又名自然常数

  2. 1阶导函数 S ′ ( x ) = S ( x ) ( 1 − S ( x ) ) S&#x27;(x)=S(x)(1-S(x)) S(x)=S(x)(1S(x)) 。即函数在某一点的导数可由函数在这一点的函数值求得

  3. 曲线光滑,定义域内处处可导,且可以无限次求导

  4. 可以把任意输入压缩到 ( 0 , 1 ) (0, 1) (0,1) 范围内

在反向传播算法(BP算法)中,性质2、3起到了极大的作用,性质4起到了防溢出的作用。

前向传播原理

现考虑一个样本$ (x, y)$ ,其中 x ∈ R 3 x \in R^3 xR3 是输入数据, y ∈ { [ 0 , 1 ] , [ 1 , 0 ] } y \in \{[0,1],[1,0]\} y{[0,1],[1,0]}是实际值。我们现在来手动计算 x x x 预测值 y ^ \hat{y} y^。预测值 y ^ \hat{y} y^ 的计算过程是从输入层开始从左往右计算的,所以这个过程也叫作前向传播。

下图表示,为了得到 a 1 ( 3 ) a^{(3)}_1 a1(3) ,有哪些神经元被激活了。

前向传播

为了方便表述,用 w i j ( l ) w^{(l)}_{ij} wij(l) 表示第 l l l 层的第 i i i 个神经元与第 l + 1 l+1 l+1 层的第 j j j 个神经元相连的权重,用 b j ( l ) b^{(l)}_j bj(l) 表示第 l + 1 l+1 l+1 层第 j j j 个神经元的偏置值。

输入层

注意。输入层没有激活函数,所以:

[ a 1 ( 1 ) , a 2 ( 1 ) , a 3 ( 1 ) ] = x [a^{(1)}_1, a^{(1)}_2,a^{(1)}_3]=x [a1(1),a2(1),a3(1)]=x

隐藏层

$ z^{(2)}_1 = w{(1)}_{11}a{(1)}_1+w{(1)}_{21}a{(1)}_2+w{(1)}_{31}a{(1)}_3+b^{(1)}_1$

$ z^{(2)}_2 = w{(1)}_{12}a{(1)}_1+w{(1)}_{22}a{(1)}_2+w{(1)}_{32}a{(1)}_3+b^{(1)}_2$

a 1 ( 2 ) = s i g m o i d ( z 1 ( 2 ) ) a^{(2)}_1=sigmoid(z^{(2)}_1) a1(2)=sigmoid(z1(2))

a 2 ( 2 ) = s i g m o i d ( z 2 ( 2 ) ) a^{(2)}_2=sigmoid(z^{(2)}_2) a2(2)=sigmoid(z2(2))

输出层

如果我们把 a 1 ( 3 ) a^{(3)}_1 a1(3) 作为类别为 0 0 0 的概率,将 a 2 ( 3 ) a^{(3)}_2 a2(3) 作为类别为1的概率,则样本 x i x_i xi 的预测值可以写成 y i ^ = max ⁡ { a 1 ( 3 ) , a 2 ( 3 ) } \hat{y_i}=\max \{a^{(3)}_1, a^{(3)}_2\} yi^=max{a1(3),a2(3)} ,所以为了让 a 1 ( 3 ) + a 2 ( 3 ) = 1 a^{(3)}_1 + a^{(3)}_2 = 1 a1(3)+a2(3)=1 ,选用 s o f t m a x softmax softmax 作为输出层的激活函数。

z 1 ( 3 ) = w 11 ( 2 ) a 1 ( 2 ) + w 21 ( 2 ) a 2 ( 2 ) + b 1 ( 2 ) z^{(3)}_1=w^{(2)}_{11}a^{(2)}_1+w^{(2)}_{21}a^{(2)}_2+b^{(2)}_1 z1(3)=w11(2)a1(2)+w21(2)a2(2)+b1(2)

z 2 ( 3 ) = w 12 ( 2 ) a 1 ( 2 ) + w 22 ( 2 ) a 2 ( 2 ) + b 2 ( 2 ) z^{(3)}_2=w^{(2)}_{12}a^{(2)}_1+w^{(2)}_{22}a^{(2)}_2+b^{(2)}_2 z2(3)=w12(2)a1(2)+w22(2)a2(2)+b2(2)

g ( z ( k ) ) = ∑ e x p ( z i ( k ) ) g(z^{(k)})=\sum exp({z^{(k)}_i}) g(z(k))=exp(zi(k)) e x p ( x ) = e x exp(x)=e^x exp(x)=ex

a 1 ( 3 ) = s o f t m a x ( z 1 ( 3 ) , z ( 3 ) ) = e x p ( z 1 ( 3 ) ) g ( z ( 3 ) ) a^{(3)}_1=softmax(z^{(3)}_1,z^{(3)})=\frac{exp({z^{(3)}_1)}}{g(z^{(3)})} a1(3)=softmax(z1(3),z(3))=g(z(3))exp(z1(3))

a 2 ( 3 ) = s o f t m a x ( z 2 ( 3 ) , z ( 3 ) ) = e x p ( z 2 ( 3 ) ) g ( z ( 3 ) ) a^{(3)}_2=softmax(z^{(3)}_2,z^{(3)})=\frac{exp({z^{(3)}_2})}{g(z^{(3)})} a2(3)=softmax(z2(3),z(3))=g(z(3))exp(z2(3))

我们令 y ^ 1 = a 1 ( 3 ) \hat{y}_1=a^{(3)}_1 y^1=a1(3) y ^ 2 = a 2 ( 3 ) \hat{y}_2=a^{(3)}_2 y^2=a2(3),那么 y ^ = [ y ^ 1 , y ^ 2 ] \hat{y}=[\hat{y}_1, \hat{y}_2] y^=[y^1,y^2],同理设 y = [ y 1 , y 2 ] y=[y_1, y_2] y=[y1,y2]

神经网络可以明确的用数学语言表达,它的函数表达式,可以明确的写出来

如果真的将这个数学表达式写出来,那么这个数学函数 n e t w o r k ( ⋅ ) network(\cdot) network() 是一个包含 ( 3 + 1 ) × 2 + ( 2 + 1 ) × 2 = 14 (3+1) \times 2 + (2+1) \times 2=14 (3+1)×2+(2+1)×2=14 个参数的函数,函数输入 x x x 可得到预测值 y ^ \hat{y} y^ ,这个表达式会非常长。

反向传播原理

我们现在来优化网络中这10个权重参数和4个偏置参数。

定义输出层的节点 i i i 的误差,可用的损失函数有:

  1. 均方误差: E = ∑ j = 1 2 1 2 ( y ^ j − y j ) 2 E = \sum_{j=1}^2\frac{1}{2} (\hat{y}_j-y_j)^2 E=j=1221(y^jyj)2
  2. 交叉熵损失: C E = C E ( y ^ , y ) = − ∑ j = 1 2 y j l n y ^ j CE=CE(\hat{y},y)=-\sum_{j=1}^{2}y_{j}ln\hat{y}_j CE=CE(y^,y)=j=12yjlny^j

使用梯度下降算法来优化损失函数,则需要求出损失函数对所有参数的导数,这个过程在计算上是从输出层开始从右往左计算的,因为与计算预测值 y i ^ \hat{y_i} yi^ 的过程恰巧相反,所以也叫作反向传播。

权重的导数

以计算权重 w 21 ( 2 ) w^{(2)}_{21} w21(2) 的偏导数为例,根据链式法则不难得到:

∂ C E ∂ w 21 ( 2 ) = ∂ C E ∂ y 1 ^ ∂ y ^ 1 ∂ z 1 ( 3 ) ∂ z 1 ( 3 ) ∂ w 21 ( 2 ) \frac{\partial CE}{\partial w^{(2)}_{21}} = \frac{\partial CE}{\partial \hat{y_1}} \frac{\partial \hat{y}_1}{\partial z^{(3)}_1} \frac{\partial z^{(3)}_1}{\partial w^{(2)}_{21}} w21(2)CE=y1^CEz1(3)y^1w21(2)z1(3)

C E = − ∑ j = 1 2 y j l n y ^ j = − ( y 1 l n y ^ 1 + y 2 l n y ^ 2 ) CE=-\sum_{j=1}^{2}y_jln\hat{y}_j=-(y_1ln\hat{y}_1+y_2ln\hat{y}_2) CE=j=12yjlny^j=(y1lny^1+y2lny^2) ,又 y 1 + y 2 = 1 y_1+y_2=1 y1+y2=1 y ^ 1 + y ^ 2 = 1 \hat{y}_1+\hat{y}_2=1 y^1+y^2=1

C E = − ( y 1 l n y ^ 1 + ( 1 − y 1 ) l n ( 1 − y ^ 1 ) ) CE =-(y_1ln\hat{y}_1+(1-y_1)ln(1-\hat{y}_1)) CE=(y1lny^1+(1y1)ln(1y^1)) (注:这是二分类问题特有的交叉熵表示方式)

∂ C E ∂ y ^ 1 = − ( y 1 y ^ 1 − 1 − y 1 1 − y 1 ^ ) = y ^ 1 − y 1 y ^ 1 ( 1 − y ^ 1 ) \frac{\partial CE}{\partial \hat{y}_1}=-(\frac{y_1}{\hat{y}_1} - \frac{1-y_1}{1-\hat{y_1}})=\frac{\hat{y}_1-y_1}{\hat{y}_1(1-\hat{y}_1)} y^1CE=(y^1y11y1^1y1)=y^1(1y^1)y^1y1

∂ y ^ 1 ∂ z 1 ( 3 ) = e x p ( z 1 ( 3 ) ) e x p ( z 2 ( 3 ) ) ( e x p ( z 1 ( 3 ) ) + e x p ( z 2 ( 3 ) ) ) 2 = y ^ 1 y ^ 2 = y 1 ^ ( 1 − y ^ 1 ) \frac{\partial \hat{y}_1}{\partial z^{(3)}_1}=\frac{exp(z^{(3)}_1)exp(z^{(3)}_2)}{(exp(z^{(3)}_1)+exp(z^{(3)}_2))^2}=\hat{y}_1\hat{y}_2=\hat{y_1}(1-\hat{y}_1) z1(3)y^1=(exp(z1(3))+exp(z2(3)))2exp(z1(3))exp(z2(3))=y^1y^2=y1^(1y^1)

∂ z 1 ( 3 ) ∂ w 21 ( 2 ) = a 2 ( 2 ) \frac{\partial z^{(3)}_1}{\partial w^{(2)}_{21}}=a^{(2)}_2 w21(2)z1(3)=a2(2)

故原偏导数可写成:

∂ C E ∂ w 11 ( 2 ) = y ^ 1 − y 1 y ^ 1 ( 1 − y ^ 1 ) ⋅ y 1 ^ ( 1 − y ^ 1 ) ⋅ a 1 ( 2 ) = ( y ^ 1 − y 1 ) ⋅ a 2 ( 2 ) \frac{\partial CE}{\partial w^{(2)}_{11}}=\frac{\hat{y}_1-y_1}{\hat{y}_1(1-\hat{y}_1)} \cdot \hat{y_1}(1-\hat{y}_1) \cdot a^{(2)}_1=(\hat{y}_1-y_1) \cdot a^{(2)}_2 w11(2)CE=y^1(1y^1)y^1y1y1^(1y^1)a1(2)=(y^1y1)a2(2)

更通用化的表达,如何计算 w i j ( 2 ) w^{(2)}_{ij} wij(2) ?依葫芦画瓢得:

∂ C E ∂ w i j ( 2 ) = ∂ C E ∂ y i ^ ∂ y ^ i ∂ z i ( 3 ) ∂ z i ( 3 ) ∂ w i j ( 2 ) = ( y ^ j − y j ) ⋅ a i ( 2 ) \frac{\partial CE}{\partial w^{(2)}_{ij}} = \frac{\partial CE}{\partial \hat{y_i}} \frac{\partial \hat{y}_i}{\partial z^{(3)}_i} \frac{\partial z^{(3)}_i}{\partial w^{(2)}_{ij}}=(\hat{y}_j-y_j) \cdot a^{(2)}_i wij(2)CE=yi^CEzi(3)y^iwij(2)zi(3)=(y^jyj)ai(2)

δ j ( 3 ) = y ^ j − y j \delta^{(3)}_j=\hat{y}_j-y_j δj(3)=y^jyj 表示输出层节点 j j j 的误差值

则上式可写成:

∂ C E ∂ w i j ( 2 ) = δ j ( 3 ) ⋅ a i ( 2 ) \frac{\partial CE}{\partial w^{(2)}_{ij}} =\delta^{(3)}_j \cdot a^{(2)}_i wij(2)CE=δj(3)ai(2)

如何理解?用 i i i 表示为隐藏层节点的位置, j j j 表示为输出层节点的位置,那么权重 w i j ( 2 ) w^{(2)}_{ij} wij(2) 的导数为该权重前一层第i个节点的激活值与后一层第j个节点的误差值的乘积

下图是反向传播的示意图,损失函数产生的误差顺着红线一直往左边传,每经过一条红线就求一次导数,直到要求的权重也覆盖在红线为止。下图有三条红线,也就是损失函数 C E CE CE w 21 ( 2 ) w^{(2)}_{21} w21(2) 的导数需要用三个偏导数乘积形成的链式求导才能得到,且最后一个偏导数值为 a i ( 2 ) a^{(2)}_i ai(2)

w221导数

如何计算 w i j ( 1 ) ​ w^{(1)}_{ij}​ wij(1) 呢?继续使用链式法则 + 依葫芦画瓢可得:

∂ C E ∂ w i j ( 1 ) = ∑ k = 1 2 ( ( y ^ k − y k ) w j k ( 2 ) ) ⋅ a j ( 2 ) ( 1 − a j ( 2 ) ) ⋅ a i ( 1 ) \frac{\partial CE}{\partial w^{(1)}_{ij}} =\sum_{k=1}^2((\hat{y}_k-y_k)w^{(2)}_{jk}) \cdot a^{(2)}_j(1-a^{(2)}_j) \cdot a^{(1)}_i wij(1)CE=k=12((y^kyk)wjk(2))aj(2)(1aj(2))ai(1)

令 $\delta^{(2)}j = \sum{k=1}2(\hat{y}_k-y_k)w{(2)}_{jk} \cdot a{(2)}_j(1-a{(2)}_j) $ 为 a j ( 2 ) a^{(2)}_j aj(2)误差值 ,那么上式可以写成:

∂ C E ∂ w i j ( 1 ) = δ j ( 2 ) ⋅ a i ( 1 ) \frac{\partial CE}{\partial w^{(1)}_{ij}} =\delta^{(2)}_j \cdot a^{(1)}_i wij(1)CE=δj(2)ai(1)

观察可以发现:

δ j ( 2 ) = ∑ k = 1 2 ( δ j ( 3 ) w j k ( 2 ) ) ⋅ a j ( 2 ) ( 1 − a j ( 2 ) ) \delta^{(2)}_j=\sum_{k=1}^2(\delta^{(3)}_jw^{(2)}_{jk}) \cdot a^{(2)}_j(1-a^{(2)}_j) δj(2)=k=12(δj(3)wjk(2))aj(2)(1aj(2))

如何理解?如果用 i i i 表示输入层节点位置, j j j 表示隐藏层节点位置,那么权重 w i j ( 1 ) w^{(1)}_{ij} wij(1) 的导数为 该权重前一层第i个节点的激活值与后一层第j个节点的误差值的乘积每个节点的误差值 等于 连接权重 与 权重另一端所连节点的误差值 的乘积之和 与 本节点激活值的导数 的乘积

详细的推导过程读者可以自己琢磨一下,这里有个关键点需要注意:

  • 因为 y 1 + y 2 = 1 ​ y_1+y_2=1​ y1+y2=1 y ^ 1 + y ^ 2 = 1 ​ \hat{y}_1+\hat{y}_2=1​ y^1+y^2=1 ,所以 C E = − ( y 2 l n y ^ 2 + ( 1 − y 2 ) l n ( 1 − y ^ 2 ) ) ​ CE =-(y_2ln\hat{y}_2+(1-y_2)ln(1-\hat{y}_2))​ CE=(y2lny^2+(1y2)ln(1y^2))

偏置的导数

如何求 b j ( 2 ) b^{(2)}_j bj(2) 的导数?根据之前的逻辑推导即可:

∂ C E ∂ b j ( 2 ) = ∂ C E ∂ y i ^ ∂ y ^ i ∂ z i ( 3 ) ∂ z i ( 3 ) ∂ b j ( 2 ) = ( y ^ j − y j ) ⋅ 1 \frac{\partial CE}{\partial b^{(2)}_j} = \frac{\partial CE}{\partial \hat{y_i}} \frac{\partial \hat{y}_i}{\partial z^{(3)}_i} \frac{\partial z^{(3)}_i}{\partial b^{(2)}_j}=(\hat{y}_j-y_j) \cdot 1 bj(2)CE=yi^CEzi(3)y^ibj(2)zi(3)=(y^jyj)1

如何求 b j ( 1 ) b^{(1)}_j bj(1) 的导数?链条太长,这里直接给出答案:

∂ C E ∂ b j ( 1 ) = ∑ k = 1 2 ( ( y ^ k − y k ) w j k ( 2 ) ) ⋅ a j ( 2 ) ( 1 − a j ( 2 ) ) ⋅ 1 \frac{\partial CE}{\partial b^{(1)}_j}=\sum_{k=1}^2((\hat{y}_k-y_k)w^{(2)}_{jk}) \cdot a^{(2)}_j(1-a^{(2)}_j) \cdot 1 bj(1)CE=k=12((y^kyk)wjk(2))aj(2)(1aj(2))1

与权重导数不同的地方就是,在求导过程中的最后一项 ∂ z i ( l + 1 ) ∂ b j ( l ) = 1 \frac{\partial z^{(l + 1)}_i}{\partial b^{(l)}_j} =1 bj(l)zi(l+1)=1

如果加入偏置单元,也可以理解为偏置单元 a 0 ( l ) a^{(l)}_0 a0(l) 的值为1,如下图所示:

加入偏置单元

正则化项

正则化(regularation)是防止机器学习过拟合的一种手段。一种常见的手段是通过将权重的平方之和加入到损失函数来实现。那么损失函数变为:

C E = − ∑ j = 1 2 y j l n y ^ j + λ 2 ∑ l ∑ i ∑ j ( w i j ( l ) ) 2 CE=-\sum_{j=1}^{2}y_jln\hat{y}_j+\frac{\lambda}{2}\sum_l\sum_i\sum_j(w^{(l)}_{ij})^2 CE=j=12yjlny^j+2λlij(wij(l))2

所有权重、偏置之和称为 正则项 λ \lambda λ正则项系数,也叫 惩罚系数

加入正则化项后, w w w 的导数要多算一个平方项的导数,以 w i j ( 2 ) w^{(2)}_{ij} wij(2) 为例

g r a d ( w i j ( 2 ) ) = ( y ^ j − y j ) ⋅ a i ( 2 ) + λ w i j ( 2 ) grad(w^{(2)}_{ij})=(\hat{y}_j-y_j) \cdot a^{(2)}_i+\lambda w^{(2)}_{ij} grad(wij(2))=(y^jyj)ai(2)+λwij(2)

向量化

我们假设输入值 x x x 、 实际值 y y y 都是列向量。

观察 $ z^{(2)}_1$ 、 $ z^{(2)}_2$ 的表达式,进而发现可以用矩阵形式书写为:

$ \left[\begin{matrix} w^{(1)}{11} & w^{(1)}{12} \ w^{(1)}{21} & w^{(1)}{22} \ w^{(1)}{31} & w^{(1)}{32} \end{matrix} \right]^T \left[ \begin{matrix} a^{(1)}_1 \ a^{(1)}_2 \ a^{(1)}_3 \end{matrix} \right] + \left[\begin{matrix} b^{(1)}_1 \ b^{(1)}_2 \end{matrix} \right]= \left[\begin{matrix} z^{(2)}_1 \ z^{(2)}_2 \end{matrix} \right] $

不失一般性,设第 l l l 层的前向传播: z ( l + 1 ) = ( w ( l ) ) T a ( l ) + b ( l ) z^{(l+1)}=(w^{(l)})^Ta^{(l)}+b^{(l)} z(l+1)=(w(l))Ta(l)+b(l),其中 a ( l ) a^{(l)} a(l) z ( l + 1 ) z^{(l+1)} z(l+1) b ( l ) b^{(l)} b(l) 均为列向量, W ( l ) W^{(l)} W(l) 为矩阵

激活值 a ( l ) = s i g m o i d ( z ( l ) ) a^{(l)}=sigmoid(z^{(l)}) a(l)=sigmoid(z(l)),所以激活值也是列向量。

损失函数向量化为:

C E = − [ y 1 y 2 ] T l n [ y ^ 1 y ^ 2 ] + λ ( ∑ l ∑ i ∑ j w i j ( l ) + ∑ l ∑ i b i ( l ) ) CE=-\left[\begin{matrix} y_1 \\ y_2 \end{matrix} \right]^T ln\left[\begin{matrix} \hat{y}_1 \\ \hat{y}_2 \end{matrix} \right] + \lambda(\sum_l\sum_i\sum_jw^{(l)}_{ij}+\sum_l\sum_ib^{(l)}_i) CE=[y1y2]Tln[y^1y^2]+λ(lijwij(l)+libi(l))

= − y T l n y ^ + λ 2 ∑ l = 1 2 s u m ( w ( l ) ∗ w ( l ) ) =-y^Tln\hat{y}+\frac{\lambda}{2}\sum_{l=1}^2 sum(w^{(l)}*w^{(l)}) =yTlny^+2λl=12sum(w(l)w(l))

s u m ( ⋅ ) sum(\cdot) sum() 表示把矩阵 ⋅ \cdot 的所有元素之和

* 表示求哈达马积,即两个矩阵对应位置的元素的乘积所形成的一个新矩阵

输出层误差值向量化:

$ \delta^{(3)}= \left[\begin{matrix} \delta^{(3)}_1 \ \delta^{(3)}_2 \end{matrix} \right]=\left[\begin{matrix} \hat{y}_1-y_1 \ \hat{y}_2-y_2\end{matrix} \right] =\hat{y}-y$

隐藏层误差向量化:

$ \delta^{(2)}= \left[\begin{matrix} (\hat{y}1-y_1)w^{(2)}{11}+ (\hat{y}2-y_2)w^{(2)}{12} \ (\hat{y}1-y_1)w^{(2)}{21}+ (\hat{y}2-y_2)w^{(2)}{22} \end{matrix} \right] * a{(2)}_j(1-a{(2)}_j)$

$=\left[\begin{matrix} w^{(2)}{11} & w^{(2)}{12} \ w^{(2)}{21} & w^{(2)}{22} \end{matrix} \right] \left[\begin{matrix} \hat{y}_1-y_1 \ \hat{y}_2-y_2\end{matrix} \right] * a{(2)}_j(1-a{(2)}_j) $

$=w^{(2)}(\hat{y}-y) * a{(2)}_j(1-a{(2)}_j) $

参数 w ( 2 ) w^{(2)} w(2) 导数向量化:

$ grad(w^{(2)})= grad(\left[\begin{matrix} w^{(2)}{11} & w^{(2)}{12} \ w^{(2)}{21} & w^{(2)}{22} \end{matrix} \right]) = \left[\begin{matrix} \delta{(3)}_1a{(2)}_1 & \delta{(3)}_2a{(2)}_1 \ \delta{(3)}_1a{(2)}_2 & \delta{(3)}_2a{(2)}_2 \end{matrix} \right] $

$=\left[\begin{matrix} a^{(2)}_1 \ a^{(2)}_2 \end{matrix} \right] \left[\begin{matrix} \delta^{(3)}_1 \ \delta^{(3)}_2 \end{matrix} \right]^T =a{(2)}(\delta{(3)})^T $

不失一般性,有: g r a d ( w ( l ) ) = a ( l ) ( δ ( l + 1 ) ) T grad(w^{(l)})=a^{(l)}(\delta^{(l+1)})^T grad(w(l))=a(l)(δ(l+1))T

小批量梯度下降

上述所有过程都是假设只有一个样本。

当参与计算的样本数量大于1时:

  • 单个损失函数 => 所有样本损失值求平均
  • 单个样本的输出层误差 => 所有样本输出层误差求平均

你不用写一个for循环来计算上述值,使用矩阵乘法会更为方便,这里留给读者思考。

实现

github:https://github.com/JerryCheese/machine-learning/tree/master/NN

ann.py 是面向过程版本实现,且隐藏层数只能为1。

NN.py 是面向对象版本实现,支持多层隐藏层。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值