zoukankan      html  css  js  c++  java
  • 机器学习(2)- 神经网络

    根据Andrew Ng在斯坦福的《机器学习》视频做笔记,已经通过李航《统计学习方法》获得的知识不赘述,仅列出提纲。

    1 神经网络学习

    1.1 非线性假设

    (n)很大时,用逻辑回归建立非线性假设并不是一个好做法

    1.2 模型展示

    模仿了大脑中的神经元(计算单元):树突(input)、轴突(output)

    偏置单元(bias unit):(x_0=1)

    权重(weights/parameters):( heta)

    激活函数(activation function):(g(z))

    神经网络就是一组神经元连接在一起的集合。

    第一层:输入层(input layer)

    中间层:隐藏层(hidden layer)

    最后一层:输出层(output layer)

    (a_i^{(j)}):第(j)层的第(i)个激活项(神经元);

    ( heta^{(i)})代表从第(j)层映射到第(j+1)层时的权重的矩阵。

    向量化

    (a_1^{(2)}=g( heta_{10}^{(1)}x_0+ heta_{11}^{(1)}x_1+ heta_{12}^{(1)}x_2+ heta_{13}^{(1)}x_3)

    (a_2^{(2)}=g( heta_{20}^{(1)}x_0+ heta_{21}^{(1)}x_1+ heta_{22}^{(1)}x_2+ heta_{23}^{(1)}x_3)

    (a_3^{(2)}=g( heta_{30}^{(1)}x_0+ heta_{31}^{(1)}x_1+ heta_{32}^{(1)}x_2+ heta_{33}^{(1)}x_3)

    (z^{(2)}=Theta^{(1)}x= heta^{(1)}a^{(1)}),则(a^{(2)}=g(z^{(2)}))

    添加(a_0^{(2)}=1)

    (z^{(3)}=Theta^{(2)}a^{(2)},h_ heta(x)=a^{(3)}=g(z^{(3)}))

    其中(x=egin{bmatrix}x_0 \ x_1 \ x_2 \ x_3 \ end{bmatrix}quad)(z^{(2)}=egin{bmatrix}z_1^{(2)} \ z_2^{(2)} \ z_3^{(2)} \ end{bmatrix}quad)

    可以知道:每一个(a)都是由上一层所有的(x)和每一个(x)所对应的( heta)决定的。

    把这样从左到右的算法称为前向传播算法( FORWARD PROPAGATION )

    例子

    利用神经元来组合成更为复杂的神经网络以实现更复杂的运算。

    ( ext{XNOR}=( ext{x}_1\, ext{AND}\, ext{x}_2 )\, ext{OR} left( left( ext{NOT}\, ext{x}_1 ight) ext{AND} left( ext{NOT}\, ext{x}_2 ight) ight))

    1.3 利用神经网络解决多元分类问题

    如果我们要训练一个神经网络算法来识别路人、汽车、摩托车和卡车,在输出层我们应该有4个值。

    输出层4个神经元分别用来表示4类,也就是每一个数据在输出层都会出现([a b c d]^T),且(a,b,c,d)中仅有一个为1,表示当前类。

    2 神经网络参数的反向传播算法

    2.1 代价函数

    (L):网络中总层数

    (s_l):第(l)层的单元数(不包含偏差单元)

    (K):输出类别个数(≥3)

    [J( heta)=-frac{1}{m}[sum_{i=1}^{m}sum_{k=1}^{K}{{{y}_k^{(i)}}log({h_Theta}({{x}^{(i)}}))_k+( 1-{{y}_k^{(i)}})log(1-{h_Theta}({{x}^{(i)}}))_k]}+frac{lambda}{2m}sum_{l=1}^{L-1}sum_{i=1}^{s_l}sum_{j=1}^{s_{l+1}}( heta_{jl}^{(l)})^2 ]

    2.2 最小化

    反向传播算法

    参考https://blog.csdn.net/qq_29762941/article/details/80343185

    (delta_j^{(l)}=a_j^{(l)}-y_j):第(l)层的第(j)节点的误差,实际上是(cost(i))关于(z_j^{(l)})的偏导

    (delta^{(3)}=(Theta^{(3)})^Tdelta^{(4)}.*g'(z^{(3)})),其中(g'(z^{(3)})=a^{(3)}.*(1-a^{(3)}))

    (delta^{(2)}=(Theta^{(2)})^Tdelta^{(3)}.*g'(z^{(2)})),其中(g'(z^{(2)})=a^{(2)}.*(1-a^{(2)}))

    (frac{partial}{partial {{ heta }_{ij}^{l}}}J({Theta})=a_j^{(l)}delta_i^{(l+1)})(忽略(lambda),即不做任何正则化处理时)

    实现

    首先用正向传播方法计算出每一层的激活单元,利用训练集的结果与神经网络预测的结果求出最后一层的误差,然后利用该误差运用反向传播法计算出直至第二层的所有误差。

    ???

    (for i=1 to m \ set a^{(i)}=x^{(i)} \ perform forward propagation to compute a^{(l)} for l=2,3,cdots,L \ using y^{(i)},compute delta^{(L)}=a^{(L)}-y^{(i)} \ compute delta^{(L-1)},delta^{(L-2)},cdots,delta^{(2)} \ Delta_{ij}^{(l)}:=Delta_{ij}^{(l)}+a_j^{(l)}delta_i^{l+1} \ D_{ij}^{(l)}:=frac{1}{m}Delta_{ij}^{(l)}+lambdaTheta_{ij}^{(l)} (if y e0)\ D_{ij}^{(l)}:=frac{1}{m}Delta_{ij}^{(l)} (if j=0))

    最终,(frac{partial }{partial {{ heta }_{ij}^{l}}}J({Theta})=D_{ij}^{(l)})

    梯度检验

    双侧差分:(计算量大,不适合用于计算,而是用来检验)

    ( heta)为实数时,(frac{d}{d_ heta}J( heta)≈frac{J( heta+epsilon)-J( heta-epsilon)}{2epsilon})

    ( heta)(n)维向量时,(frac{partial}{partial heta_1}J( heta)≈frac{J( heta_1+epsilon, heta_2, heta_3,cdots, heta_n)-J( heta_1-epsilon, heta_2, heta_3,cdots, heta_n)}{2epsilon})

    检验上述算出的导数与反向传播算法算出的(D)是否相似。

    2.3 随机初始化

    全0初始化:隐藏单元都在计算相同的特征(高度冗余)

    ↓(解决对称权重问题)

    随机初始化:在([-epsilon,epsilon])上取随机值

    3 总结

    神经网络结构的选择

    输入单元的数量:特征维度的数量

    输出单元的数量:类的数量

    隐藏层的数量:单个,多个(每个隐藏层有相同的单元数)

    隐藏单元数量:越多越好(但是计算量会变大)

    训练步骤

    1. 构建一个神经网络,随机初始化权重
    2. 执行前向传播算法,计算(h_ heta(x))
    3. 编写计算代价函数的代码
    4. 执行反向传播算法,计算偏导数项
    5. 使用梯度检验进行比较,然后停用
    6. 将最优化算法和反向传播算法结合,来最小化代价函数
  • 相关阅读:
    JavaEE 第四周
    JavaEE 第三周
    JavaEE 第二周
    JavaEE 第一周
    js字符串方法
    javaee项目库存管理系统总结
    javaee期末团队项目库存管理系统概要信息
    JAVAEE第十一周
    JSON
    Facelets
  • 原文地址:https://www.cnblogs.com/angelica-duhurica/p/10928012.html
Copyright © 2011-2022 走看看