神经网络推导-批量数据

输入批量数据到神经网络,进行前向传播和反向传播的推导

TestNet网络

TestNet是一个2层神经网络,结构如下:

  • 输入层有3个神经元
  • 隐藏层有4个神经元
  • 输出层有2个神经元

  • 激活函数为relu函数
  • 评分函数为softmax回归
  • 代价函数为交叉熵损失

网络符号定义

规范神经网络的计算符号

关于神经元和层数

  • L表示网络层数(不计入输入层)
    • L=2,其中输入层是第0层,隐藏层是第1层,输出层是第2
  • n(l)表示第l层的神经元个数(不包括偏置神经元)
    • n(0)=3,表示输入层神经元个数为3
    • n(1)=4,表示隐藏层神经元个数为4
    • n(2)=2,表示输出层神经元个数为2

关于权重矩阵和偏置值

  • W(l)表示第l1层到第l层的权重矩阵,矩阵行数为第l1层的神经元个数,列数为第l层神经元个数
    • W(1)表示输入层到隐藏层的权重矩阵,大小为R3×4
    • W(2)表示隐藏层到输出层的权重矩阵,大小为R4×2
  • Wi,j(l)表示第l1层第i个神经元到第lj个神经元的权值
    • i的取值范围是[1,n(l1)]
    • j的取值范围是[1,n(l)]
  • Wi(l)表示第l1层第i个神经元对应的权重向量,大小为n(l)
  • W,j(l)表示第l层第j个神经元对应的权重向量,大小为n(l1)
  • b(l)表示第l层的偏置向量
    • b(1)表示输入层到隐藏层的偏置向量,大小为R1×4
    • b(2)表示隐藏层到输出层的偏置向量,大小为R1×2
  • bi(l)表示第l层第i个神经元的偏置值
    • b2(1)表示第1层隐藏层第2个神经元的偏置值

关于神经元输入向量和输出向量

  • a(l)表示第l输出向量a(l)=[a1(l),a2(l),...,am(l)]T
    • a(0)表示输入层输出向量,大小为Rm×3
    • a(1)表示隐藏层输出向量,大小为Rm×4
    • a(2)表示输出层输出向量,大小为Rm×2
  • ai(l)表示第l层第i个单元的输出值,其是输入向量经过激活计算后的值
    • a3(1)表示隐含层第3个神经元的输入值,a3(1)=g(z3(1))
  • z(l)表示第l输入向量z(l)=[z1(l),z2(l),...,zm(l)]T
    • z(1)表示隐藏层的输入向量,大小为Rm×4
    • z(2)表示输出层的输入向量,大小为Rm×2
  • zi,j(l)表示第l层第j个单元的输入值,其是上一层输出向量第i个数据和该层第j个神经元权重向量的加权累加和
    • z1,2(1)表示隐藏层第2个神经元的输入值,z1,2(1)=b2(2)+a1,1(0)W1,2(1)+a1,2(0)W2,2(1)+a1,3(0)W3,2(1)

关于神经元激活函数

  • g()表示激活函数操作

关于评分函数和损失函数

  • h()表示评分函数操作
  • J()表示代价函数操作

神经元执行步骤

神经元操作分为2步计算:

  1. 输入向量z(l)=前一层神经元输出向量a(l1)与权重矩阵W(l)的加权累加和+偏置向量

zi,j(l)=ai(l1)W,j(l)+bj(l)z(l)=a(l1)W(l)+b(l)

  1. 输出向量a(l)=对输入向量z(l)进行激活函数操作

ai(l)=g(zi(l))a(l)=g(z(l))

网络结构

对输入层

a(0)=[a1(0)am(0)]=[a1,1(0)a1,2(0)a1,3(0)am,1(0)am,2(0)am,3(0)]Rm×3

对隐藏层

W(1)=[W1,1(1)W1,2(1)W1,3(1)W1,4(1)W2,1(1)W2,2(1)W2,3(1)W2,4(1)W3,1(1)W3,2(1)W3,3(1)W3,4(1)]R3×4

b(1)=[[b1(1),b2(1),b3(1),b4(1)]]R1×4

z(1)=[z1,1(0)z1,2(0)z1,3(0)z1,4(0)zm,1(0)zm,2(0)zm,3(0)zm,4(0)]Rm×4

a(1)=[a1,1(0)a1,2(0)a1,3(0)a1,4(0)am,1(0)am,2(0)am,3(0)am,4(0)]Rm×4

对输出层

W(2)=[W1,1(2)W1,2(2)W2,1(2)W2,2(2)W3,1(2)W3,2(2)W4,1(2)W4,2(2)]R4×2

b(2)=[[b1(2),b2(2)]]R1×2

z(2)=[z1,1(2)z1,2(0)zm,1(2)zm,2(0)]Rm×2

评分值

h(z(2))=[p(y1=1)p(y1=2)p(ym=1)p(ym=2)]Rm×2

损失值

J(z(2))=(1)i=1mj=121(ym,j=1)lnp(ym,j=1)R1

前向传播

输入层到隐藏层计算

zi,1(1)=ai(0)W,1(1)+b1(1)=ai,1(0)W1,1(1)+ai,2(0)W2,1(1)+ai,3(0)W3,1(1)+b1,1(1)

zi,2(1)=ai(0)W,2(1)+b2(1)=ai,1(0)W1,2(1)+ai,2(0)W2,2(1)+ai,3(0)W3,2(1)+b1,2(1)

zi,3(1)=ai(0)W,3(1)+b3(1)=ai,1(0)W1,3(1)+ai,2(0)W2,3(1)+ai,3(0)W3,3(1)+b1,3(1)

zi,4(1)=ai(0)W,4(1)+b4(1)=ai,1(0)W1,4(1)+ai,2(0)W2,4(1)+ai,3(0)W3,4(1)+b1,4(1)

zi(1)=[zi,1(1),zi,2(1),zi,3(1),zi,4(1)]=ai(0)W(1)+b(1)

z(1)=a(0)W(1)+b(1)

隐藏层输入向量到输出向量

ai,1(1)=relu(zi,1(1))ai,2(1)=relu(zi,2(1))ai,3(1)=relu(zi,3(1))ai,4(1)=relu(zi,4(1))

ai(1)=[ai,1(1),ai,2(1),ai,3(1),ai,4(1)]=relu(zi(1))

a(1)=relu(z(1))

隐藏层到输出层计算

zi,1(2)=ai(1)W,1(2)+b1,1(2)=ai,1(1)W1,1(2)+ai,2(1)W2,1(2)+ai,3(1)W3,1(2)+ai,4(1)W4,1(2)+b1,1(2)

zi,2(2)=ai(1)W,2(2)+b1,2(2)=ai,1(1)W1,2(2)+ai,2(1)W2,2(2)+ai,3(1)W3,2(2)+ai,4(1)W4,2(2)+b1,2(2)

zi(2)=[zi,1(2),zi,2(2)]=ai(1)W(2)+b(2)

z(2)=a(1)W(2)+b(2)

评分操作

p(yi=1)=exp(zi,1(2))exp(zi(2))p(yi=2)=exp(zi,2(2))exp(zi(2))

h(zi(2))=[p(yi=1),p(yi=2)]=[exp(zi,1(2))exp(zi(2)),exp(zi,2(2))exp(zi(2))]

h(z(2))=[p(y1=1)p(y1=2)p(ym=1)p(ym=2)]

损失值

J(z(2))=(1)i=1mj=121(ym,j=1)lnp(ym,j=1)

反向传播

计算输出层输入向量梯度

Jzi,1(2)=(1)1(yi=1)p(yi=1)p(yi=1)zi,1(2)+(1)1(yi=2)p(yi=2)p(yi=2)zi,1(2)

p(yi=1)zi,1(2)=exp(zi,1(2))exp(zi(2))exp(zi,1(2))exp(zi,1(2))(exp(zi(2)))2=exp(zi,1(2))exp(zi(2))(exp(zi,1(2))exp(zi(2)))2=p(yi=1)(p(yi=1))2

p(yi=2)zi,1(2)=exp(zi,2(2))exp(zi,1(2))(exp(zi(2)))2=(1)exp(zi,1(2))exp(zi(2))exp(zi,2(2))exp(zi(2))=(1)p(yi=1)p(yi=2)

Jzi,1(2)=(1)1(yi=1)p(yi=1)(p(yi=1)(p(yi=1))2)+(1)1(yi=2)p(yi=2)(1)p(yi=1)p(yi=2)=(1)1(yi=1)(1p(yi=1))+1(yi=2)p(yi=1)=p(yi=1)1(yi=1)

Jzi,2(2)=p(yi=2)1(yi=2)

Jzi(2)=[p(yi=1)1(yi=1),p(yi=2)1(yi=2)]

Jz(2)=[p(y1=1)1(y1=1)p(y1=2)1(y1=2)p(ym=1)1(ym=1)p(ym=2)1(ym=2)]

计算输出层权重向量梯度

JW1,1(2)=1mi=1mJzi,1(2)zi,1(2)W1,1(2)=1mi=1m((p(yi=1)1(yi=1))ai,1(1))

JW2,1(2)=1mi=1mJzi,1(2)zi,1(2)W2,1(2)=1mi=1m((p(yi=1)1(yi=1))ai,2(1))

JW3,1(2)=1mi=1mJzi,1(2)zi,1(2)W3,1(2)=1mi=1m((p(yi=1)1(yi=1))ai,3(1))

JW4,1(2)=1mi=1mJzi,1(2)zi,1(2)W4,1(2)=1mi=1m((p(yi=1)1(yi=1))ai,4(1))

JW1,2(2)=1mi=1mJzi,2(2)z2(2)W1,2(2)=1mi=1m((p(yi=2)1(yi=2))ai,1(1))

JW2,2(2)=1mi=1mJzi,2(2)z2(2)W2,2(2)=1mi=1m((p(yi=2)1(yi=2))ai,2(1))

JW3,2(2)=1mi=1mJzi,2(2)z2(2)W3,2(2)=1mi=1m((p(yi=2)1(yi=2))ai,3(1))

JW4,2(2)=1mi=1mJzi,2(2)z2(2)W4,2(2)=1mi=1m((p(yi=2)1(yi=2))ai,4(1))

JW(2)=[JW1,1(2)JW1,2(2)JW2,1(2)JW2,2(2)JW3,1(2)JW3,2(2)JW4,1(2)JW4,2(2)]

=[1mi=1m((p(yi=1)1(yi=1))ai,1(1))1mi=1m((p(yi=1)1(yi=1))ai,2(1))1mi=1m((p(yi=1)1(yi=1))ai,3(1))1mi=1m((p(yi=1)1(yi=1))ai,4(1))1mi=1m((p(yi=2)1(yi=2))ai,1(1))1mi=1m((p(yi=2)1(yi=2))ai,2(1))1mi=1m((p(yi=2)1(yi=2))ai,3(1))1mi=1m((p(yi=2)1(yi=2))ai,4(1))]

=1mi=1m[ai,1(1)ai,2(1)ai,3(1)ai,4(1)][p(yi=1)1(yi=1)p(yi=2)1(yi=2)]=1mi=1m((ai(1))TJzi(2))=1m(a(1))TJz(2)=1mi=1m(R4×mRm×2)=R4×2

计算隐藏层输出向量梯度

Jai,1(1)=Jzi,1(2)zi,1(2)ai,1(1)+Jzi,2(2)zi,2(2)ai,1(1)=(p(yi=1)1(yi=1))W1,1(2)+(p(yi=2)1(yi=2))W1,2(2)

Jai,2(1)=Jzi,1(2)zi,1(2)ai,2(1)+Jzi,2(2)zi,2(2)ai,2(1)=(p(yi=1)1(yi=1))W2,1(2)+(p(yi=2)1(yi=2))W2,2(2)

Jai,3(1)=Jzi,1(2)zi,1(2)ai,3(1)+Jzi,2(2)zi,2(2)ai,3(1)=(p(yi=1)1(yi=1))W3,1(2)+(p(yi=2)1(yi=2))W3,2(2)

Jai,4(1)=Jzi,1(2)zi,1(2)ai,4(1)+Jzi,2(2)zi,2(2)ai,4(1)=(p(yi=1)1(yi=1))W4,1(2)+(p(yi=2)1(yi=2))W4,2(2)

Jai(1)=[p(yi=1)1(yi=1)p(yi=2)1(yi=2)][W1,1(2)W2,1(2)W3,1(2)W4,1(2)W1,2(2)W2,2(2)W3,2(2)W4,2(2)]=Jzi(2)(W(2))T=R1×2R2×4=R1×4

Ja(1)=[p(y1=1)1(y1=1)p(y1=2)1(y1=2)p(ym=1)1(ym=1)p(ym=2)1(ym=2)][W1,1(2)W2,1(2)W3,1(2)W4,1(2)W1,2(2)W2,2(2)W3,2(2)W4,2(2)]=Jz(2)(W(2))T=Rm×2R2×4=Rm×4

计算隐藏层输入向量的梯度

Jzi,1(1)=Jai,1(1)ai,1(1)zi,1(1)=((p(yi=1)1(yi=1))W1,1(2)+(p(y=2)1(y=2))W1,2(2))1(zi,1(1)0)

Jzi,2(1)=Jai,2(1)ai,2(1)zi,2(1)=((p(yi=1)1(yi=1))W2,1(2)+(p(yi=2)1(yi=2))W2,2(2))1(zi,2(1)0)

Jzi,3(1)=Jai,3(1)ai,3(1)zi,3(1)=((p(yi=1)1(yi=1))W3,1(2)+(p(yi=2)1(yi=2))W3,2(2))1(zi,3(1)0)

Jzi,4(1)=Jai,4(1)ai,4(1)zi,4(1)=((p(yi=1)1(yi=1))W4,1(2)+(p(yi=2)1(yi=2))W4,2(2))1(zi,4(1)0)

Jzi(1)=([p(yi=1)1(yi=1)p(yi=2)1(yi=2)][W1,1(2)W2,1(2)W3,1(2)W4,1(2)W1,2(2)W2,2(2)W3,2(2)W4,2(2)])[ai,1(1)zi,1(1)ai,2(1)zi,2(1)ai,3(1)zi,3(1)ai,4(1)zi,4(1)]=(R1×2R2×4)R1×4=R1×4

Jzi(1)=([p(yi=1)1(yi=1)p(yi=2)1(yi=2)][W1,1(2)W2,1(2)W3,1(2)W4,1(2)W1,2(2)W2,2(2)W3,2(2)W4,2(2)])[1(zi,1(1)0)1(zi,2(1)0)1(zi,3(1)0)1(zi,4(1)0)]=(R1×2R2×4)R1×4=R1×4

Jz(1)=([p(y1=1)1(y1=1)p(y1=2)1(y1=2)p(ym=1)1(ym=1)p(ym=2)1(ym=2)][W1,1(2)W2,1(2)W3,1(2)W4,1(2)W1,2(2)W2,2(2)W3,2(2)W4,2(2)])[1(z1,1(1)0)1(z1,2(1)0)1(z1,3(1)0)1(z1,4(1)0)1(zm,1(1)0)1(zm,2(1)0)1(zm,3(1)0)1(zm,4(1)0)]=Ja(1)1(z(1)0)=(Rm×2R2×4)Rm×4=Rm×4

计算隐藏层权重向量的梯度

JW1,1(1)=1mi=1mJzi,1(1)zi,1(1)W1,1(1)=1mi=1m((p(yi=1)1(yi=1))W1,1(2)+(p(yi=2)1(yi=2))W1,2(2))1(zi,1(1)0)ai,1(0)

JW1,2(1)=1mi=1mJzi,2(1)zi,2(1)W1,2(1)=1mi=1m((p(yi=1)1(yi=1))W2,1(2)+(p(yi=2)1(yi=2))W2,2(2))1(zi,2(1)0)ai,1(0)

JWk,l(1)=1mi=1mJzi,l(1)zi,l(1)Wk,l(1)=1mi=1m((p(yi=1)1(yi=1))Wl,1(2)+(p(yi=2)1(yi=2))Wl,2(2))1(zi,l(1)0)ai,k(0)

JW(1)=[JW1,1(1)JW1,2(1)JW1,3(1)JW1,4(1)JW2,1(1)JW2,2(1)JW2,3(1)JW2,4(1)JW3,1(1)JW3,2(1)JW3,3(1)JW3,4(1)]=[1mi=1mJzi,1(1)zi,1(1)W1,1(1)1mi=1mJzi,2(1)zi,2(1)W1,2(1)1mi=1mJzi,3(1)zi,3(1)W1,3(1)1mi=1mJzi,4(1)zi,4(1)W1,4(1)1mi=1mJzi,1(1)zi,1(1)W2,1(1)1mi=1mJzi,2(1)zi,2(1)W2,2(1)1mi=1mJzi,3(1)zi,3(1)W2,3(1)1mi=1mJzi,4(1)zi,4(1)W2,4(1)1mi=1mJzi,1(1)zi,1(1)W3,1(1)1mi=1mJzi,2(1)zi,2(1)W3,2(1)1mi=1mJzi,3(1)zi,3(1)W3,3(1)1mi=1mJzi,4(1)zi,4(1)W3,4(1)]=1mi=1m[Jzi,1(1)zi,1(1)W1,1(1)Jzi,2(1)zi,2(1)W1,2(1)Jzi,3(1)zi,3(1)W1,3(1)Jzi,4(1)zi,4(1)W1,4(1)Jzi,1(1)zi,1(1)W2,1(1)Jzi,2(1)zi,2(1)W2,2(1)Jzi,3(1)zi,3(1)W2,3(1)Jzi,4(1)zi,4(1)W2,4(1)Jzi,1(1)zi,1(1)W3,1(1)Jzi,2(1)zi,2(1)W3,2(1)Jzi,3(1)zi,3(1)W3,3(1)Jzi,4(1)zi,4(1)W3,4(1)]=1mi=1m[Jzi,1(1)ai,1(0)Jzi,2(1)ai,1(0)Jzi,3(1)ai,1(0)Jzi,4(1)ai,1(0)Jzi,1(1)ai,2(0)Jzi,2(1)ai,2(0)Jzi,3(1)ai,2(0)Jzi,4(1)ai,2(0)Jzi,1(1)ai,3(0)Jzi,2(1)ai,3(0)Jzi,3(1)ai,3(0)Jzi,4(1)ai,3(0)]=1mi=1m[ai,1(0)ai,2(0)ai,3(0)][Jzi,1(1)Jzi,2(1)Jzi,3(1)Jzi,4(1)]=1mi=1m(ai(0))TJzi(1)=1m(a(0))TJz(1)=R3×mRm×4=R3×4

小结

TestNet网络的前向操作如下:

z(1)=a(0)W(1)+b(1)

a(1)=relu(z(1))

z(2)=a(1)W(2)+b(2)

h(z(2))=[p(y1=1)p(y1=2)p(ym=1)p(ym=2)]

J(z(2))=(1)i=1mj=121(ym,j=1)lnp(ym,j=1)

反向传播如下:

Jz(2)=[p(y1=1)1(y1=1)p(y1=2)1(y1=2)p(ym=1)1(ym=1)p(ym=2)1(ym=2)]

JW(2)=1m(a(1))TJz(2)

Jb(2)=1mi=1mJzi(2)

Ja(1)=Jz(2)(W(2))T

Jz(1)=Ja(1)1(z(1)0)

JW(1)=1m(a(0))TJz(1)

Jb(1)=1mi=1mJzi(1)

假设批量数据大小为m,数据维数为D,网络层数为L1,2,...,l,...,L),输出类别为C

参考反向传导算法神经网络反向传播的数学原理,设每层输入向量为残差δ(l)=J(W,b)z(l),用于表示该层对最终输出值的残差造成的影响;而最终输出值的残差δ(L)就是损失函数对输出层输入向量的梯度

前向传播执行步骤

  1. 层与层之间的操作就是输出向量和权值矩阵的加权求和以及对输入向量的函数激活(以relu为例

    z(l)=a(l1)W(l)+b(l)a(l)=relu(z(l))

  2. 输出层输出结果后,进行评分函数的计算,得到最终的计算结果(以softmax分类为例

    h(z(L))=[p(y1=1)p(y1=C)p(ym=1)p(ym=C)]=[exp(z1,1(2))exp(z1(2))exp(z1,C(2))exp(z1(2))exp(zm,1(2))exp(zm(2))exp(zm,C(2))exp(zm(2))]

  3. 损失函数根据计算结果判断最终损失值(以交叉熵损失为例

    J(z(L))=(1)i=1mj=121(ym,j=1)lnp(ym,j=1)

反向传播执行步骤

  1. 计算损失函数对于输出层输入向量的梯度(最终层残差)

    δ(L)=Jz(L)=[p(y1=1)1(y1=1)p(y1=C)1(y1=C)p(ym=1)1(ym=1)p(ym=C)1(ym=C)]

  2. 计算中间隐藏层的残差值(L1,L2,...1

    δ(l)=φJφz(l)=(φJφz(l+1)φz(l+1)φa(l))φa(l)φz(l)=(δ(l+1)(W(l+1))T)1(z(l)0)

  3. 完成所有的可学习参数(权值矩阵和偏置向量)的梯度计算

    W(l)J(W,b)=1m(a(l1))Tδ(l)b(l)J(W,b)=1mi=1mδi(l)

  4. 更新权值矩阵和偏置向量

    W(l)=W(l)α[W(l)+λW(l)]b(l)=b(l)αb(l)

相关阅读