zoukankan      html  css  js  c++  java
  • neural network

    some example

    当x为binary时

    structure

    以四层的multi-class classification为例(以01向量列表示分类预测。第i个最接近1则预测为第i个)

    ( heta^{(l)}_{ji})表示第(l)层第(i)个神经元到下一层第(j)个神经元的转移的系数
    (S_l)为第(l)层除了bias unit之外的unit个数
    ( heta^{(l)})大小为(S_{l+1} imes(S_l + 1))
    (a^{(l+1)}=sigmoid( heta^{(l)} a^{(l)})) (别漏了sigmoid)
    存储时每层一个列向量这样比较好

    cost function

    对于multiclass-classification
    (h_{ heta})是指从input到output

    [J( heta) = -frac 1 msum_{k=1}^K sum_{i=1}^m left[ y^{(i)}_kln(h_{ heta}(x^{(i)}))_k+(1-y^{(i)}_k)ln(1-h_{ heta}(x^{(i)}))_k ight] + frac{lambda}{2m} sum_{l=1}^{L-1} sum_{i=1}^{S_l} sum_{j=1}^{S_{l+1}} ( heta^{l}_{ji})^2 ]

    注意(i)不从0开始
    这个J是non-convex,有local minimum

    FP & BP原理

    记输入层为X, 各层向量为 ( heta_1 cdots heta_l)

    (F(X, heta_1, cdots, heta_l) = loss(f_n(f_{n-1}(cdots f_2( f_1(X, heta_1), heta_2)cdots, heta_{n-1}), heta_n)))

    期中(f_1cdots f_n) 为向量值函数, (F, loss) 为单值函数

    我们要 求各 ( heta) 的偏导,步骤都是偏导拆括号,偏没有theta那边,然后直到theta是自己的theta了,然后偏theta那边

    前面疯狂拆括号的步骤的类似的,且可叠加

    所以有了反向传播算法

    gradient (FP & BP)

    P = propagation
    F = forward
    B = backward
    先忽略掉regularization的部分
    相当于求(-frac 1 msum_{k=1}^K sum_{i=1}^m y_k^{(i)} ln(a^{(L)}_k) + (1-y_k^{(i)}) ln(1 - a^{(L)}_k))

    根据之前在classification中的推导,我们记得配合sigmoid函数可以把这个复杂的函数求导后变得很简单

    因为转移为(z^{(L)}_j = a^{(L-1)}_i heta^{(L-1)}_{ji}), (a^{(L)}_j = g(z^{(L)}_j)), 换一下

    (f(z) =-frac 1 m sum_{k=1}^K sum_{i=1}^m y_k^{(i)} ln(g(z)) + (1-y_k^{(i)}) ln(1 - g(z)))

    求导得(frac{df}{dz} =-frac 1 m sum_{k=1}^K sum_{i=1}^m y_k^{(i)} frac{g'(z)}{g(z)} + (1-y_k^{(i)}) frac{-g'(z)}{1-g(z)})

    利用sigmoid函数性质, 推得(frac {df}{dz} = g(z)_k - y_k^{(i)} = a^{(L)}_k - y_k^{(i)})

    现在我们要求所有( heta^{(l)}_{ji})的偏导,即(frac{partial f}{partial heta} = frac{df}{dz} frac{partial z}{partial heta})
    举个简单得例子,考虑神经网络得得正向路径a->b->c->d
    (z^{(L)}_d = heta^{(L-1)}_{dc} a^{(L-1)}_c = heta^{(L-1)}_{dc} g( heta^{(L-2)}_{cb} a^{(L-2)}_b)= heta^{(L-1)}_{dc} g[ heta^{(L-2)}_{cb} g( heta^{(L-3)}_{ba} a^{(L-3)}_a)])
    (frac{partial z}{partial heta^{(L-3)}_{ba}} = heta^{(L-1)}_{dc} g'(z^{(L-1)}_c) heta^{(L-2)}_{cb} g'(z^{(L-2)}_b) a^{(L-3)}_a) (注意g里面是z别和a搞混了)
    前面系数两两一组,每组第一个是从后一层转移,第二个是乘当前层系数
    最后单独剩一个系数
    考虑线性性,所有像例子中这样的路径叠加就是结果

    首先我们对于每组数据((x^{(i)}, y^{(i)})),进行FP,得到每一层的激活值。
    然后我们进行BP,得到每个theta在这组数据下的J的偏导

    先考虑两两一组的系数,我们记(delta^{(l)}_i)记录第(l)层第(i)个非bias unit的后续系数和

    那么$delta^{(L)}_k = a^{(L)}_k -y_k^{(i)} $

    转移:(delta^{(l)} = ( heta^{(l)})^T delta^{(l+1)})

    乘当前层:(delta^{(l)}) .* (g'(z^{(l)})) ,其中由sigmoid性质得 (g'(z^{(l)}) = a^{(l)}) .* ((1 - a^{(l)}))

    剩下的单独那个系数就好办了。
    (Delta^{(l)}_{ji} = delta^{(l+1)}_j a^{(l)}_i)。这居然也可以矩阵化: (Delta^{(l)} = delta^{(l+1)} (a^{(l)})^T) (竖的乘横的)
    最后补上regularization那项就好了,注意(i=0)(Delta)不用补


    可以用对每个单独theta进行类似(frac{J(x+epsilon)-J(x-epsilon)}{2epsilon})的操作近似求偏导,来进行debug确保上述复杂求导过程的正确性

    initial theta

    不能全部theta设为同一个相同的值
    否则得到的每层内部的a都一样(除了input层),BP时得到每层内部的(delta)都一样(除了output层)
    进而(Delta)都一样(除了input层),进而导致梯度下降后得到的图每两层之间的所有边权重相同(除了一二层间)
    一二层间同一起点连出的边权重相同
    这样第二次梯度下降又是类似的,打破不了“对称性”

    所以要随机设theta为([-epsilon,epsilon])

    实现问题

    传参:没有三维矩阵这种东东
    V = [theta1(:);theta2(:)] 配合 theta2=reshape(V(l, r), a, b)。 其中l,r为vector化后所在区间,a,b为目标的原来theta2的长和宽

  • 相关阅读:
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    《EffectiveJava中文第二版》 高清PDF下载
    《MoreEffectiveC++中文版》 pdf 下载
    《啊哈c语言》 高清 PDF 下载
  • 原文地址:https://www.cnblogs.com/acha/p/11040972.html
Copyright © 2011-2022 走看看