美文网首页神经网络
【第一周笔记】神经网络和深度学习

【第一周笔记】神经网络和深度学习

作者: 慎独墨写 | 来源:发表于2019-01-19 22:12 被阅读102次

    第一节 概论

    一、什么是神经网络

    由人脑的工作模式启发衍生的强力学习算法

    例 1 – 单神经网络

    给出有关房地产市场房屋大小的数据,拟合一个函数来预测其他房地产数据的价格。这是一个线性回归问题,因为作为大小函数的价格是连续输出。由于价格不可以为负数,因此我们建立了一个修正线性单元(ReLU),该函数从零开始。

    基于单变量的房价预测

    输入是房子面积x,输出是房价y

    “神经”构造了该ReLU函数。

    The input is the size of the house (x) The output is the price (y) The “neuron” implements the function ReLU (blue line)

    例 2 – 多神经网络

    房价由多种情况影响,如大小、卧室数量、邮编、街区富裕情况......神经网络在预测的时候会产生隐藏单元,我们并不会指定每个隐藏单元代表什么意思,只需要给出相应的输入x和输出y就好了。

    基于多变量的房价预测

    二、监督学习

    1.监督学习基本分为两大问题:
    输入和输出都是有参照的,根据参照,给定一个新的输入,预测新的输出。如房价:给定某地房子大小和房价的数据,根据这些数据,给定一个房子尺寸大小,预测该尺寸对应的房价。

    分类:

    • 线性回归类:预测连续输出值
    • 分类问题:预测离散输出值

    2.常用的神经网络

    image : CNN

    sequence data (audio,language...) RNN or complex RNNS

    Structured data : 每个特征有清晰的定义

    Unstructured data : Audio Image text

    第二节 神经网络基础

    一、logistic 回归

    1.二分分类问题

    二分分类问题的目标是训练出一个分类器以图片的特征向量x作为输入,预测输出的结果标签y是1还是0。

    其中X 是每个特征向量集合成的大矩阵,X\in \mathbb{R}^{n_{x\times m}}

    Y = [ y^{(1)},y^{(2)},\dots,y^{(m)} ] 因此 Y\in \mathbb{R}^{1\times (m)}

    2.Logistic Regression

    给出 X ,想要预估的 \hat y = P(y=1|x)

    参数 : w\in \mathbb{R}^{n_{x}},\ b\in \mathbb{R}

    输出 : \hat y = \sigma(w^{\top}x+b)

    其中sigmoid函数表示为:\sigma(z)=\frac{1}{1+e^{-z}}

    sigmoid函数

    在实际编程中会把w和b分开,b对应一个拦截器。

    3.logistic regression cost function

    所以在给定数据集\{ (x^{(1)},y^{(1)}),\dots,(x^{(m)},y^{(m)}) \},我们想要让对每个x^{(i)}的预测值{\hat y}^{(i)} \approx {y}^{(i)}

    \mathcal{L}(\hat y,y)= - (y \log {\hat y} + (1-y) \log (1-\hat y))

    if y=1: \mathcal{L}(\hat y,y) = - \log \hat y 想要损失函数小,我们需要\hat y

    if y=0: \mathcal{L}(\hat y,y) = - \log (1- \hat y) 想要损失函数小,我们需要\hat y

    loss function :基于单个训练样本

    cost function:基于参数的总样本

    cost function:

    J(w,b) = \frac{1}{m}\sum_{i=1}^m \mathcal L(\hat y^{(i)},y^{(i)}) = - \frac{1}{m} \sum_{i=1}^{m} y^{(i)} \log {\hat y^{(i)}} + (1-y^{(i)}) \log (1-\hat y^{(i)})

    最终目的是使代价函数J(w,b)尽可能小
    4.梯度下降

    J(w,b) = \frac{1}{m}\sum_{i=1}^m \mathcal L(\hat y^{(i)},y^{(i)}) = - \frac{1}{m} \sum_{i=1}^{m} y^{(i)} \log {\hat y^{(i)}} + (1-y^{(i)}) \log (1-\hat y^{(i)})

    为了将J减小,我们必须找到合适的w和b。

    梯度下降算法中,重复{

    w := w - \alpha \frac{\partial J(w,b)}{\partial w}

    b := b - \alpha \frac{\partial J(w,b)}{\partial b}

    }

    α被称作 学习率,决定了迭代步长

    对m个样本梯度下降

    算法:

    J=0;\mathbf{d}w1=0;\mathbf{d}w2=0;\mathbf{d}b=0;

    For i = 1 to m

    z^{(i)} = w^{\top}x^{(i)}+b

    a^{(i)} = \sigma(z^{(i)})

    J+= -y^{(i)} \log {\hat y^{(i)}} + (1-y^{(i)}) \log (1-\hat y^{(i)})

    \mathbf{d} z^{(i)} = a^{(i)}-y^{(i)}

    \mathbf{d}w_{1} += x_{1}^{(i)}\mathbf{d}z^{(i)}

    \mathbf{d}w_{2} += x_{2}^{(i)}\mathbf{d}z^{(i)}

    \mathbf{d}b+=\mathbf{d} z^{(i)}

    J /=m

    \mathbf{d}w_{1}/=m

    \mathbf{d}w_{2}/=m //如果多余2个特征值 w值延续到nx

    \mathbf{d}b/=m

    //在这时 \mathbf{d}w_{1} = \frac{\partial J}{w_{1}} 以此类推 其他的d值也都成为了J对该值的偏导数

    w_{1} = w_{1} - \alpha \mathbf{d}w_{1}

    w_{2} = w_{2} - \alpha \mathbf{d}w_{2}

    b = b - \alpha \mathbf{d}b

    该算法中会出现两次显性的for循环,这是非常低效的,为了解决这样的问题,使用向量化的方法。

    二、向量化

    GPU和CPU都有SIMD指令,即允许单指令多数据流,能够复制多个操作数,并把它们打包在大型寄存器的一组指令集。GPU更擅长SIMD指令操作。

    在实际编程中尽可能地避免显性for循环。

    在python编程中善用np.dot()函数

    e.g.将v= \begin{bmatrix} v_{1} \\ \vdots\\ v_{n} \end{bmatrix}转变为u= \begin{bmatrix} e^{v_{1}} \\ \vdots\\ e^{v_{n}} \end{bmatrix}

    u = np.zeros((n,1))
    for i in range(n):
        u[i] = math.exp(v[i])
    
    import numpy as np
    u = np.exp(v)
    np.log(v)
    np.abs(v)
    np.maximum(v,0)
    v**2
    1/v
    

    对logistic regression算法进行向量化
    ​定义一个大矩阵X = [x^{(1)},x^{(2)},\dots,x^{(m)}]

    算法:

    J=0;\mathbf{d}w1=0;\mathbf{d}w2=0;\mathbf{d}b=0;
    Z=w^{\top}X+b
    ​ = np.dot(w.T,X)+b
    A = \sigma(Z)
    \mathbf{d} z = A-Y
    \mathbf{d}w = \frac {1}{m}X\mathbf{d}z^{\top}
    \mathbf{d}b = \frac {1}{m} np.sum(\mathbf{d}z)
    w = w- \alpha \mathbf{d}w //反向更新w
    b = b - \alpha \mathbf{d}b //反向更新b

    关于正向传播和反向传播的理解,参考https://www.cnblogs.com/charlotte77/p/5629865.html,该作者用数字化的演示详细地阐述了back propagation的重要意义。直观地将,逐步更新权值项w和截距项b的过程就是BP的主要过程。

    第三节 浅层神经网络

    一、神经网络

    神经网络表示

    双层神经网络,一般不把输入层算入标准层,输入层也被称作第零层。隐藏层和最后的输出层是带有参数的,隐藏层带有两个相关的参数W和b。在本图中,​是一个4×3的矩阵。4来源于四个隐藏层,3来自于三个输入层。​是一个4×1的矩阵。​是一个1×4的矩阵,因为隐藏层有四个隐藏单元,只有1个对应的输出,​是一个1×1的矩阵。

    二、激活函数

    tanh(z) = \frac{e^z-e^{-z}}{e^z+e^{-z}}
    tanh函数的平均值接近0,因此有数据中心化的效果。在效果上比sigmoid函数要好。
    另外,tanh(z)求导的结果是tanh'(z) = 1 - (tanh(z))^2

    在做二元分类的时候可以使用sigmoid函数,因为需要输出结果在0到1之间。
    ReLU函数

    a=\max(0,z)

    带泄露的ReLU:

    a = \max(0.01z,z)

    如果所有隐藏单元都使用线性激活函数的话,那么在逻辑上是没有意义的。

    三、梯度下降

    对于神经网络的梯度下降


    神经网络的梯度下降

    权重的随机初始化也非常重要,如果在一开始的时候全都赋值为0的话,很有可能会造成所有隐藏神经元都在进行同一个函数的计算,这样的话该神经网络会发生“对称”。

    第四节 深层神经网络

    一、前向传播

    A^{[0]}=X

    z^{[l]}=w^{[l]}A^{[l-1]}+b^{[l]}

    A^{[l]}=g^{[l]}(Z^{[l]})

    深层神经前向传播的过程大致如此,l从1一直迭代到最深层。在这一步可能需要一个显性的for循环。

    总结起来w^{[l]}的维度必须是(n^{[l]},n^{[l-1]}),b^{[l]}的维度是(n^{[l]},1)

    二、参数和超参数

    参数:w^{[1]},b^{[1]}\dots

    超参数:某种程度上决定了最终的W和b

    • 学习率 α
    • 梯度下降法的循环数量
    • 隐藏层数L
    • 隐藏单元数:n^{[1]}
    • 激活函数

    ······

    相关文章

      网友评论

        本文标题:【第一周笔记】神经网络和深度学习

        本文链接:https://www.haomeiwen.com/subject/axctjqtx.html